From eb94c91c2ec81dc3dd673ed924f0d153508ed775 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Fri, 16 Oct 2009 07:25:13 +0000
Subject: [PATCH] ecrire_acces() disparait, la generation du htpass pour la
 methode 'spip' etant du ressort de auth_spip_synchroniser_distant Cette
 derniere regenere tous les acces, mais il y aurait moyen de faire mieux en ne
 mettant a jour que l'acces modifie qui est passe en arg.

Legere modification de l'api auth_synchroniser_distant qui peut etre appelee sans argument pour forcer une resynchro de toutes les methodes et acces
apres une operation en base.
---
 ecrire/auth/spip.php         | 53 ++++++++++++++++++++++++++++++++++++
 ecrire/base/import_all.php   |  5 +++-
 ecrire/base/upgrade.php      |  4 +--
 ecrire/inc/acces.php         | 41 ----------------------------
 ecrire/inc/auth.php          | 17 ++++++++++--
 ecrire/inc/modifier.php      |  9 ------
 ecrire/install/etape_fin.php |  3 +-
 7 files changed, 75 insertions(+), 57 deletions(-)

diff --git a/ecrire/auth/spip.php b/ecrire/auth/spip.php
index 5cb50f9ed7..456e038ef4 100644
--- a/ecrire/auth/spip.php
+++ b/ecrire/auth/spip.php
@@ -194,4 +194,57 @@ function auth_spip_modifier_pass($login, $new_pass, $id_auteur){
 
 }
 
+/**
+ * Synchroniser les fichiers htpasswd
+ * 
+ * @param int $id_auteur
+ * @param array $champs
+ * @param array $options
+ *	all=>true permet de demander la regeneration complete des acces apres operation en base (import, upgrade)
+ * @return void 
+ */
+function auth_spip_synchroniser_distant($id_auteur, $champs, $options = array()){
+	// si un login, pass ou statut a ete modifie
+	// regenerer les fichier htpass
+	if (isset($champs['login'])
+		OR isset($champs['pass'])
+		OR isset($champs['statut'])
+		OR (isset($options['all']) AND $options['all'])
+	) {
+
+		$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
+		$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
+
+		// Cette variable de configuration peut etre posee par un plugin
+		// par exemple acces_restreint ;
+		// si .htaccess existe, outrepasser spip_meta
+		if (($GLOBALS['meta']['creer_htpasswd'] != 'oui')
+		AND !@file_exists($htaccess)) {
+			spip_unlink($htpasswd);
+			spip_unlink($htpasswd."-admin");
+			return;
+		}
+
+		# remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
+		# de devenir redacteur le cas echeant (auth http)... a nettoyer
+		// attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
+
+		$p1 = ''; // login:htpass pour tous
+		$p2 = ''; // login:htpass pour les admins
+		$s = sql_select("login, htpass, statut", "spip_auteurs", sql_in("statut",  array('1comite','0minirezo','nouveau')));
+		while ($t = sql_fetch($s)) {
+			if (strlen($t['login']) AND strlen($t['htpass'])) {
+				$p1 .= $t['login'].':'.$t['htpass']."\n";
+				if ($t['statut'] == '0minirezo')
+					$p2 .= $t['login'].':'.$t['htpass']."\n";
+			}
+		}
+		if ($p1) {
+			ecrire_fichier($htpasswd, $p1);
+			ecrire_fichier($htpasswd.'-admin', $p2);
+			spip_log("Ecriture de $htpasswd et $htpasswd-admin");
+		}
+	}
+}
+
 ?>
\ No newline at end of file
diff --git a/ecrire/base/import_all.php b/ecrire/base/import_all.php
index 1f1276a0c5..aa8360b2b9 100644
--- a/ecrire/base/import_all.php
+++ b/ecrire/base/import_all.php
@@ -82,7 +82,10 @@ function base_import_all_dist($titre='', $reprise=false)
 	import_all_fin($request);
 	include_spip('inc/rubriques');
 	calculer_rubriques();
-	if (!$res) ecrire_acces();	// Mise a jour du fichier htpasswd
+	if (!$res){
+		include_spip('inc/auth');
+		auth_synchroniser_distant(); // Mise a jour du fichier htpasswd
+	}
 	// revenir a l'accueil pour finir
 	affiche_progression_javascript('100 %', 0);
 }
diff --git a/ecrire/base/upgrade.php b/ecrire/base/upgrade.php
index c91e184466..bbeaad1b07 100644
--- a/ecrire/base/upgrade.php
+++ b/ecrire/base/upgrade.php
@@ -35,8 +35,8 @@ function base_upgrade_dist($titre='', $reprise='')
 	spip_unlink(_DIR_TMP.'charger_plugins_options.php');
 	spip_unlink(_DIR_TMP.'verifier_plugins.txt');
 
-	include_spip('inc/acces');
-	ecrire_acces();
+	include_spip('inc/auth');
+	auth_synchroniser_distant();
 	$config = charger_fonction('config', 'inc');
 	$config();
 }
diff --git a/ecrire/inc/acces.php b/ecrire/inc/acces.php
index d97d2bde2c..8f3f83113a 100644
--- a/ecrire/inc/acces.php
+++ b/ecrire/inc/acces.php
@@ -147,47 +147,6 @@ function initialiser_sel() {
 	else return "";
 }
 
-// Cette fonction ne sert qu'a la connexion en mode http_auth.non LDAP
-// Son role est de creer le fichier htpasswd
-// Voir le plugin "acces restreint"
-// http://doc.spip.org/@ecrire_acces
-function ecrire_acces() {
-	$htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME;
-	$htpasswd = _DIR_TMP . _AUTH_USER_FILE;
-
-	// Cette variable de configuration peut etre posee par un plugin
-	// par exemple acces_restreint ;
-	// si .htaccess existe, outrepasser spip_meta
-	if (($GLOBALS['meta']['creer_htpasswd'] != 'oui')
-	AND !@file_exists($htaccess)) {
-		spip_unlink($htpasswd);
-		spip_unlink($htpasswd."-admin");
-		return;
-	}
-
-	# remarque : ici on laisse passer les "nouveau" de maniere a leur permettre
-	# de devenir redacteur le cas echeant (auth http)... a nettoyer
-	// attention, il faut au prealable se connecter a la base (necessaire car utilise par install)
-
-	if (spip_connect_ldap()) return; // hum, il faudrait generaliser cela
-	$p1 = ''; // login:htpass pour tous
-	$p2 = ''; // login:htpass pour les admins
-	$s = sql_select("login, htpass, statut", "spip_auteurs", sql_in("statut",  array('1comite','0minirezo','nouveau')));
-	while ($t = sql_fetch($s)) {
-		if (strlen($t['login']) AND strlen($t['htpass'])) {
-			$p1 .= $t['login'].':'.$t['htpass']."\n";
-			if ($t['statut'] == '0minirezo')
-				$p2 .= $t['login'].':'.$t['htpass']."\n";
-		}
-	}
-	if ($p1) {
-	  ecrire_fichier($htpasswd, $p1);
-	  ecrire_fichier($htpasswd.'-admin', $p2);
-	  spip_log("Ecriture de $htpasswd et $htpasswd-admin");
-	}
-}
-
-
 // http://doc.spip.org/@generer_htpass
 function generer_htpass($pass) {
 	global $htsalt;
diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php
index a872b0ad4c..78db463a29 100644
--- a/ecrire/inc/auth.php
+++ b/ecrire/inc/auth.php
@@ -487,13 +487,24 @@ function auth_modifier_pass($auth_methode, $login, $new_pass, $id_auteur){
  * donnee lorsque des modifications sont faites dans la base auteur
  *
  * @param string $auth_methode
+ *   ici true permet de forcer la synchronisation de tous les acces pour toutes les methodes
  * @param int $id_auteur
  * @param array $champs
- * @return bool
+ * @param array $options
+ * @return void
  */
-function auth_synchroniser_distant($auth_methode, $id_auteur, $champs){
+function auth_synchroniser_distant($auth_methode=true, $id_auteur=0, $champs=array()){
 	$args = func_get_args();
-	return auth_administrer('synchroniser_distant',$args);
+	if ($auth_methode===true){
+		$args[] = array('all'=>true); // ajouter une option all=>true pour chaque auth
+		foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
+			array_shift($args);
+			array_unshift($args,$methode);
+			auth_administrer('synchroniser_distant',$args);
+		}
+	}
+	else
+		auth_administrer('synchroniser_distant',$args);
 }
 
 
diff --git a/ecrire/inc/modifier.php b/ecrire/inc/modifier.php
index 17b51c9996..36dcd5fb69 100644
--- a/ecrire/inc/modifier.php
+++ b/ecrire/inc/modifier.php
@@ -264,15 +264,6 @@ function revision_auteur($id_auteur, $c=false) {
 	$auth_methode = sql_getfetsel('source','spip_auteurs','id_auteur='.intval($id_auteur));
 	include_spip('inc/auth');
 	auth_synchroniser_distant($auth_methode, $id_auteur, $c);
-
-	// .. mettre a jour les fichiers .htpasswd et .htpasswd-admin
-	if (isset($c['login'])
-	OR isset($c['pass'])
-	OR isset($c['statut'])
-	) {
-		include_spip('inc/acces');
-		ecrire_acces();
-	}
 	
 	// Si on change login ou mot de passe, deconnecter cet auteur,
 	// sauf si c'est nous-meme !
diff --git a/ecrire/install/etape_fin.php b/ecrire/install/etape_fin.php
index 01881474a8..120e148e58 100644
--- a/ecrire/install/etape_fin.php
+++ b/ecrire/install/etape_fin.php
@@ -20,7 +20,8 @@ include_spip('inc/acces');
 // http://doc.spip.org/@install_etape_fin_dist
 function install_etape_fin_dist()
 {
-	ecrire_acces();
+	include_spip('inc/auth');
+	auth_synchroniser_distant();
 
 	$f = str_replace( _FILE_TMP_SUFFIX, '.php', _FILE_CHMOD_TMP);
 	if (file_exists(_FILE_CHMOD_TMP)) {
-- 
GitLab