From ae7d390c1ceb28e7177e93c32171abda2adfc381 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Thu, 29 Oct 2009 16:38:13 +0000
Subject: [PATCH] =?UTF-8?q?Dans=20la=20derni=C3=A8re=20=C3=A9tape=20d'une?=
 =?UTF-8?q?=20installation=20avec=20LDAP,=20ajout=20d'un=20formulaire=20pe?=
 =?UTF-8?q?rmettant=20d'indiquer=20le=20nom=20du=20champ=20LDAP=20correspo?=
 =?UTF-8?q?ndant=20au=20nom=20du=20champ=20SPIP=20de=20la=20table=20des=20?=
 =?UTF-8?q?auteurs,=20en=20particulier=20le=20Login,=20ce=20qui=20permet?=
 =?UTF-8?q?=20d'=C3=A9viter=20les=20requ=C3=AAtes=20LDAP=20syst=C3=A9matiq?=
 =?UTF-8?q?uement=20vaines=20=C3=A0=20chaque=20connexion=20d'un=20auteur.?=
 =?UTF-8?q?=20Les=20champs=20demand=C3=A9s=20sont=20le=20Login,=20le=20Nom?=
 =?UTF-8?q?,=20le=20Mail=20et=20la=20Biographie.=20On=20peut=20surcharger?=
 =?UTF-8?q?=20la=20globale=20pour=20en=20demander=20plus=20ou=20moins.=20L?=
 =?UTF-8?q?'installateur=20peut=20ne=20rien=20mettre=20dans=20un=20champ?=
 =?UTF-8?q?=20pour=20l'ignorer,=20ou=20mettre=20une=20suite=20de=20nom=20d?=
 =?UTF-8?q?e=20champs=20si=20la=20correspondance=20n'est=20pas=20unique=20?=
 =?UTF-8?q?ou=20est=20inconnue.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Le tableau déduit est sauvé dans le fichier de connexion LDAP, alors que le statut est dans les meta: ça parait bizarre, mais la valeur de celui-ci est une constante indépendante du LDAP (tous visiteurs ou tous rédacteurs etc), tandis que les autres seront à repréciser en cas de déménagement du site. L'exception est moins dans l'emplacement que dans l'invariance du statut, contrairement aux autres champs. On pourrait imaginer de le déduire aussi du LDAP, mais ça sort largement du noyau de SPIP: là il s'agissait seulement de ne plus avoir de requêtes vaines à chaque connexion.
---
 ecrire/auth/ldap.php           |  2 ++
 ecrire/inc/install.php         | 26 ++++++++++++++---
 ecrire/install/etape_ldap3.php | 21 +++++---------
 ecrire/install/etape_ldap4.php | 53 +++++++++++++++++++---------------
 ecrire/install/etape_ldap5.php | 41 ++++++++++++++++++++++++++
 ecrire/lang/ecrire_fr.php      |  3 ++
 6 files changed, 104 insertions(+), 42 deletions(-)

diff --git a/ecrire/auth/ldap.php b/ecrire/auth/ldap.php
index ecb58fa76a..160ac72872 100644
--- a/ecrire/auth/ldap.php
+++ b/ecrire/auth/ldap.php
@@ -78,6 +78,8 @@ function auth_ldap_connect($serveur='') {
 				$connexion['ldap'] = array('link' => $GLOBALS['ldap_link'],
 					'base' => $GLOBALS['ldap_base']);
 			else spip_log("connection LDAP $serveur mal definie dans $f");
+			if (isset($GLOBALS['ldap_champs']))
+				$connexion['ldap']['attributes'] = $GLOBALS['ldap_champs'];
 		} else spip_log("connection LDAP $serveur inconnue");
 	}
 	return $connexions_ldap[$serveur]=$connexion['ldap'];
diff --git a/ecrire/inc/install.php b/ecrire/inc/install.php
index e51e703f42..2a3635fc65 100644
--- a/ecrire/inc/install.php
+++ b/ecrire/inc/install.php
@@ -207,9 +207,18 @@ function info_progression_etape($en_cours,$phase,$dir, $erreur = false){
 
 
 // http://doc.spip.org/@fieldset
-function fieldset($legend, $champs = array(), $horchamps='') {
-	$fieldset = "<fieldset>\n" .
-	($legend ? "<legend>".$legend."</legend>\n" : '');
+function fieldset($legend,  $champs = array(), $apres='', $avant='') {
+	return "<fieldset>\n" .
+	  $avant .
+	  ($legend ? "<legend>".$legend."</legend>\n" : '') .
+	  fieldset_champs($champs) .
+	  $apres .
+	  "</fieldset>\n";
+}
+
+function fieldset_champs($champs = array())
+  {
+	$fieldset = '';
 	foreach ($champs as $nom => $contenu) {
 		$type = isset($contenu['hidden']) ? 'hidden' : (preg_match(',^pass,', $nom) ? 'password' : 'text');
 		$class = isset($contenu['hidden']) ? '' : "class='formo' size='40' ";
@@ -230,7 +239,6 @@ function fieldset($legend, $champs = array(), $horchamps='') {
 							  .(preg_match(',^(pass|login),', $nom)?" autocomplete='off'":'') .	" />\n";
 		}
 	}
-	$fieldset .= "$horchamps</fieldset>\n";
 	return $fieldset;
 }
 
@@ -429,4 +437,14 @@ function install_etape_liste_bases($server_db, $disabled=array())
 
 	return array($checked, $bases);
 }
+
+function install_propager($hidden)
+{
+	$res = '';
+	foreach($hidden as $k) {
+		$v = htmlentities(_request($k));
+		$res .= "<input type='hidden' name='$k' value='$v' />";
+	}
+	return $res;
+}
 ?>
diff --git a/ecrire/install/etape_ldap3.php b/ecrire/install/etape_ldap3.php
index ecf43172b6..b2d4c10252 100644
--- a/ecrire/install/etape_ldap3.php
+++ b/ecrire/install/etape_ldap3.php
@@ -18,8 +18,6 @@ function install_etape_ldap3_dist()
 	$login_ldap = _request('login_ldap');
 	$pass_ldap = _request('pass_ldap');
 	$port_ldap = _request('port_ldap');
-	$tls_ldap = _request('tls_ldap');
-	$protocole_ldap = _request('protocole_ldap');
 
 	$base_ldap_text = defined('_INSTALL_BASE_LDAP')
 		? _INSTALL_BASE_LDAP
@@ -66,22 +64,17 @@ function install_etape_ldap3_dist()
 		$res .= " checked=\"checked\"";
 		$checked = true;
 	}
-	$res .= " />"
-	. "\n<label for='manuel'>"._T('entree_chemin_acces')."</label> ";
-
-	echo generer_form_ecrire('install', ($res
-	. "\n<input type='hidden' name='etape' value='ldap4' />"
-	. "\n<input type='hidden' name='adresse_ldap' value=\"$adresse_ldap\" />"
-	. "\n<input type='hidden' name='port_ldap' value=\"$port_ldap\" />"
-	. "\n<input type='hidden' name='login_ldap' value=\"$login_ldap\" />"
-	. "\n<input type='hidden' name='pass_ldap' value=\"$pass_ldap\" />"
-	. "\n<input type='hidden' name='protocole_ldap' value=\"$protocole_ldap\" />"
-	. "\n<input type='hidden' name='tls_ldap' value=\"$tls_ldap\" />"
 
+	$res .= " />"
+	. "\n<label for='manuel'>"._T('entree_chemin_acces')."</label> "
 	. "\n<fieldset>"
 	. "<input type='text' name='base_ldap_text' class='text' value=\"$base_ldap_text\" size='40' />"
 	. "\n</fieldset>"
-	. bouton_suivant()));
+	. "\n<input type='hidden' name='etape' value='ldap4' />"
+	. install_propager(array('adresse_ldap','port_ldap','login_ldap','pass_ldap','protocole_ldap','tls_ldap'))
+	. bouton_suivant();
+
+	echo generer_form_ecrire('install', $res);
 
 	echo install_fin_html();
 }
diff --git a/ecrire/install/etape_ldap4.php b/ecrire/install/etape_ldap4.php
index ee66647e5e..3d445f2679 100644
--- a/ecrire/install/etape_ldap4.php
+++ b/ecrire/install/etape_ldap4.php
@@ -10,6 +10,10 @@
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('auth/ldap');
+
 // http://doc.spip.org/@install_etape_ldap4_dist
 function install_etape_ldap4_dist()
 {
@@ -17,16 +21,13 @@ function install_etape_ldap4_dist()
 	$login_ldap = _request('login_ldap');
 	$pass_ldap = _request('pass_ldap');
 	$port_ldap = _request('port_ldap');
-	$tls_ldap = _request('tls_ldap');
-	$protocole_ldap = _request('protocole_ldap');
 	$base_ldap = _request('base_ldap');
 	$base_ldap_text = _request('base_ldap_text');
+	if (!$base_ldap) $base_ldap = $base_ldap_text;
 
 	echo install_debut_html();
 
-	if (!$base_ldap) $base_ldap = $base_ldap_text;
-
-	$ldap_link = @ldap_connect($adresse_ldap, $port_ldap);
+	$ldap_link = ldap_connect($adresse_ldap, $port_ldap);
 	@ldap_bind($ldap_link, $login_ldap, $pass_ldap);
 
 	// Essayer de verifier le chemin fourni
@@ -43,29 +44,15 @@ function install_etape_ldap4_dist()
 		info_etape(_T('info_reglage_ldap'));
 		echo info_progression_etape(4,'etape_ldap','install/');
 
-		lire_fichier(_FILE_CONNECT_TMP, $conn);
-		if ($p = strpos($conn, "'');")) {
-			ecrire_fichier(_FILE_CONNECT_TMP, 
-				       substr($conn, 0, $p+1) 
-				       . _FILE_LDAP
-				       . substr($conn, $p+1));
-		}
-		$conn = "\$GLOBALS['ldap_base'] = \"$base_ldap\";\n"
-		. "\$GLOBALS['ldap_link'] = @ldap_connect(\"$adresse_ldap\",\"$port_ldap\");\n"
-		. "@ldap_set_option(\$GLOBALS['ldap_link'],LDAP_OPT_PROTOCOL_VERSION,\"$protocole_ldap\");\n"
-		. (($tls_ldap != 'oui') ? '' :
-		   "@ldap_start_tls(\$GLOBALS['ldap_link']);\n")
-		. "@ldap_bind(\$GLOBALS['ldap_link'],\"$login_ldap\",\"$pass_ldap\");\n";
-
-		install_fichier_connexion(_DIR_CONNECT . _FILE_LDAP, $conn);
 		$statuts = liste_statuts_ldap();
 		$statut_ldap = defined('_INSTALL_STATUT_LDAP')
 		? _INSTALL_STATUT_LDAP
 		  : $GLOBALS['liste_des_statuts']['info_redacteurs'];
 
-		echo generer_form_ecrire('install', (
-		"<input type='hidden' name='etape' value='ldap5' />"
-		
+
+		$res = install_propager(array('adresse_ldap','port_ldap','login_ldap','pass_ldap','protocole_ldap','tls_ldap'))
+		. "<input type='hidden' name='etape' value='ldap5' />"
+		. "<input type='hidden' name='base_ldap' value='" . htmlentities($base_ldap) . "' />"
 		. fieldset(_T('info_statut_utilisateurs_1'),
 			array(
 				'statut_ldap' => array(
@@ -75,7 +62,10 @@ function install_etape_ldap4_dist()
 					)
 				)
 			   )
-		. bouton_suivant()));
+		. install_ldap_correspondances()
+		. bouton_suivant();
+
+		echo generer_form_ecrire('install', $res); 
 	}
 
 	echo install_fin_html();
@@ -93,4 +83,19 @@ function liste_statuts_ldap() {
 	}
 	return $res;
 }
+
+function install_ldap_correspondances()
+{
+	$champs = array();
+	foreach (is_array($GLOBALS['ldap_attributes']) ? $GLOBALS['ldap_attributes'] : array() as $champ => $v ) {
+			$nom = 'ldap_' . $champ;
+			$val = is_array($v) ? join(',', $v) : strval($v);
+			$champs[$nom]= array(
+				'label' => _T('ldap_correspondance', array('champ' => "<tt>$champ</tt>")).'<br />',
+				'valeur' => $val
+						  );
+	}
+
+	return !$champs ? '' : fieldset(_T('ldap_correspondance_1'), $champs, '', _T('ldap_correspondance_2') . '<br /><br />');
+}
 ?>
diff --git a/ecrire/install/etape_ldap5.php b/ecrire/install/etape_ldap5.php
index 3b0c61b6bc..bddad36da4 100644
--- a/ecrire/install/etape_ldap5.php
+++ b/ecrire/install/etape_ldap5.php
@@ -12,6 +12,7 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 include_spip('inc/headers');
+include_spip('auth/ldap');
 
 // http://doc.spip.org/@install_etape_ldap5_dist
 function install_etape_ldap5_dist()
@@ -21,6 +22,45 @@ function install_etape_ldap5_dist()
 
 	ecrire_meta('ldap_statut_import', _request('statut_ldap'));
 
+	lire_fichier(_FILE_CONNECT_TMP, $conn);
+
+	if ($p = strpos($conn, "'');")) {
+			ecrire_fichier(_FILE_CONNECT_TMP, 
+				       substr($conn, 0, $p+1) 
+				       . _FILE_LDAP
+				       . substr($conn, $p+1));
+	}
+
+	$adresse_ldap = _request('adresse_ldap');
+	$login_ldap = _request('login_ldap');
+	$pass_ldap = _request('pass_ldap');
+	$port_ldap = _request('port_ldap');
+	$tls_ldap = _request('tls_ldap');
+	$protocole_ldap = _request('protocole_ldap');
+	$base_ldap = _request('base_ldap');
+	$base_ldap_text = _request('base_ldap_text');
+
+	$conn = "\$GLOBALS['ldap_base'] = \"$base_ldap\";\n"
+		. "\$GLOBALS['ldap_link'] = @ldap_connect(\"$adresse_ldap\",\"$port_ldap\");\n"
+		. "@ldap_set_option(\$GLOBALS['ldap_link'],LDAP_OPT_PROTOCOL_VERSION,\"$protocole_ldap\");\n"
+		. (($tls_ldap != 'oui') ? '' :
+		   "@ldap_start_tls(\$GLOBALS['ldap_link']);\n")
+		. "@ldap_bind(\$GLOBALS['ldap_link'],\"$login_ldap\",\"$pass_ldap\");\n";
+
+	$champs = is_array($GLOBALS['ldap_attributes']) ? $GLOBALS['ldap_attributes'] : array();
+	$res = '';
+	foreach ($champs as $champ => $v ) {
+		$nom = 'ldap_' . $champ;
+		$val = trim(_request($nom));
+		if (preg_match('/^\w*$/', $val)) {
+			if ($val) $val = _q($val);
+		} else $val = "array(" . _q(preg_split('/\W+/', $val)) . ')';;
+		if ($val) $res .= "'$champ' => " . $val . ",";
+	}
+	$conn .= "\$GLOBALS['ldap_champs'] = array($res);\n";
+	  
+	install_fichier_connexion(_DIR_CONNECT . _FILE_LDAP, $conn);
+
 	echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"');
 
 	echo info_etape(_T('info_ldap_ok'), info_progression_etape(5,'etape_ldap','install/'), _T('info_terminer_installation'));
@@ -33,4 +73,5 @@ function install_etape_ldap5_dist()
 	echo install_fin_html();
 }
 
+
 ?>
diff --git a/ecrire/lang/ecrire_fr.php b/ecrire/lang/ecrire_fr.php
index b9057afbda..af6b9c3cea 100644
--- a/ecrire/lang/ecrire_fr.php
+++ b/ecrire/lang/ecrire_fr.php
@@ -801,6 +801,9 @@ dans une couleur qui indique leur &eacute;tat&nbsp;:',
 'label_taille_ecran' => 'Largeur de l\'ecran',
 'label_texte_et_icones_navigation' => 'Menu de navigation',
 'label_texte_et_icones_page' => 'Affichage dans la page',
+'ldap_correspondance' => 'h&eacute;ritage du champ @champ@',
+'ldap_correspondance_1' => 'H&eacute;ritage des champs LDAP',
+'ldap_correspondance_2' => 'Pour chacun des champs SPIP suivants, indiquer le nom du champ LDAP correspondant. Laisser vide pour ne pas le remplir, s&eacute;parer par des espaces ou des virgules pour essayer plusieurs champs LDAP.' ,
 'lien_ajout_destinataire' => 'Ajouter ce destinataire',
 'lien_ajouter_auteur' => 'Ajouter cet auteur',
 'lien_ajouter_participant' => 'Ajouter un participant',
-- 
GitLab