From e519b90812af334b2d06c2db470d9a41d3a8f7ff Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sat, 19 May 2007 09:15:20 +0000
Subject: [PATCH] =?UTF-8?q?D=C3=A9multiplication=20des=20statuts=20des=20v?=
 =?UTF-8?q?isiteurs.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Ce dépot installe une réécriture du noyau rationalisant la gestion des statuts, dans la mesure où la compatibilité avec les versions précédentes le permet. Le principe est que Spip connait les noms des statuts fondamentaux Admin (0minirezo) et Rédacteur (1comite), et des statuts transitoires Nouveau et Poubelle, et assimile toute autre valeur dans le champ statut comme étant un statut de visiteur (donc de droits minimums). La création de nouveaux auteurs accepte des statuts de libellé nouveaux, pour autant que SQL le permette (le test est que $statut == addslashes($statut)). En particulier, on peut utiliser des variantes du squelette formulaires/login_forum dans lequel le paramètre "mode" du script "inscription" a une valeur autre que "6forum", par exemple le numéro du forum si l'on souhaite structurer les groupes de visiteurs sur la base des forums qui les ont attiré sur le site.

Une fois qu'un statut a été introduit dans la table des auteurs, il est proposé dans le menu des statuts affectable à un auteur. Le mode de tri par statut est à présent actif sur la page des visiteurs pour tenir compte de cette nouvelle situation. Toutefois les icones seront les memes (à améliorer).

Les occurrences de "6forum" ont donc été évacuées du code de SPIP, hormis les cas nécessaires à la compatibilité (cette fonctionnalité n'amène aucun dysfonctionnement pour les sites qui ne l'utiliseront pas). Incidemment, le paramètre "statut" du script "auteurs" admet en argument non plus seulement un statut mais éventuellement une liste de statuts séparés par des virgules, et admet un "!" au début pour signifier une négation.

En outre, il existe à présent une fonction "avoir_visiteurs" regroupant tous les cas où cette information est nécessaire, ce qui auparavant était réalisé de manière pas toujours cohérente voire fausse (il y aura de ce fait des réponses légèrement différentes d'auparavant sur des cas limites).
---
 dist/formulaires/login_forum.html        |   2 +-
 ecrire/action/editer_auteur.php          |   4 +-
 ecrire/balise/formulaire_forum.php       |   6 +-
 ecrire/balise/formulaire_inscription.php |   9 +-
 ecrire/configuration/visiteurs.php       |  24 +++---
 ecrire/exec/auteurs.php                  |  49 ++++++-----
 ecrire/inc/auth.php                      |   6 +-
 ecrire/inc/autoriser.php                 |   4 +-
 ecrire/inc/boutons.php                   |   6 +-
 ecrire/inc/editer_auteurs.php            |   2 +-
 ecrire/inc/formater_auteur.php           |  13 +--
 ecrire/inc/instituer_auteur.php          | 100 ++++++++++-------------
 ecrire/inc/presentation.php              |  20 +++--
 ecrire/install/etape_ldap4.php           |  20 +++--
 14 files changed, 135 insertions(+), 130 deletions(-)

diff --git a/dist/formulaires/login_forum.html b/dist/formulaires/login_forum.html
index bd70cd4a32..360c53cc5c 100644
--- a/dist/formulaires/login_forum.html
+++ b/dist/formulaires/login_forum.html
@@ -11,7 +11,7 @@
 
 <p align="center">
 
-&#91;<a[ href="(#ENV{inscription})&amp;mode=forum[(&amp;id_rubrique=(#ENV{id_rubrique})]&amp;focus=nom_inscription"] target="spip_pass" onclick="javascript:window.open(this.href, 'spip_pass', 'scrollbars=yes, resizable=yes, width=480, height=500'); return false;"><:login_sinscrire:></a>&#93;
+&#91;<a[ href="(#ENV{inscription})&amp;mode=6forum[(&amp;id_rubrique=(#ENV{id_rubrique})]&amp;focus=nom_inscription"] target="spip_pass" onclick="javascript:window.open(this.href, 'spip_pass', 'scrollbars=yes, resizable=yes, width=480, height=500'); return false;"><:login_sinscrire:></a>&#93;
 
 &#91;<a[ href="(#ENV{oubli})"] target="spip_pass" onclick="javascript:window.open(this.href, 'spip_pass', 'scrollbars=yes, resizable=yes, width=480, height=280'); return false;"><:login_motpasseoublie:></a>&#93;
 
diff --git a/ecrire/action/editer_auteur.php b/ecrire/action/editer_auteur.php
index cdb1646ab7..fa5d6dc373 100644
--- a/ecrire/action/editer_auteur.php
+++ b/ecrire/action/editer_auteur.php
@@ -199,8 +199,8 @@ function action_legender_auteur_post($r) {
 	if ($statut = _request('statut')
 	AND autoriser('modifier', 'auteur', $id_auteur, $qui = null,
 	$opt = array('statut'=>$statut))) {
-		if (!in_array($statut,$GLOBALS['liste_des_statuts'])) {
-		  spip_log("action_instituer_auteur_dist: $statut incompris  pour $id_auteur");
+		  if ($statut != addslashes($statut)) {
+		  spip_log("action_editer_auteur_dist: $statut incompris  pour $id_auteur");
 		} else {
 			spip_query("UPDATE spip_auteurs SET statut="._q($statut) . " WHERE id_auteur=" . _q($id_auteur));
 		}
diff --git a/ecrire/balise/formulaire_forum.php b/ecrire/balise/formulaire_forum.php
index ba4606b251..badfe80ff0 100644
--- a/ecrire/balise/formulaire_forum.php
+++ b/ecrire/balise/formulaire_forum.php
@@ -93,10 +93,10 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 	if ($type == "abo") {
 		if (!$GLOBALS["auteur_session"]) {
 			return array('formulaires/login_forum', 0,
-				array('inscription' => generer_url_public('spip_inscription'),
-					'oubli' => generer_url_public('spip_pass')));
+					array('inscription' => generer_url_public('', 'action=inscription'),
+						'oubli' => generer_url_public('', 'action=pass')));
 		} else {
-		// forcer ces valeur
+		// forcer ces valeurs
 			$auteur = $GLOBALS['auteur_session']['nom'];
 			$email_auteur = $GLOBALS['auteur_session']['email'];
 		}
diff --git a/ecrire/balise/formulaire_inscription.php b/ecrire/balise/formulaire_inscription.php
index 7624aebb78..4b0a4aa6ee 100644
--- a/ecrire/balise/formulaire_inscription.php
+++ b/ecrire/balise/formulaire_inscription.php
@@ -22,7 +22,7 @@ function balise_FORMULAIRE_INSCRIPTION ($p) {
 	return calculer_balise_dynamique($p, 'FORMULAIRE_INSCRIPTION', array());
 }
 
-// args[0] peut valoir "redac" ou "forum" 
+// args[0] un statut d'auteur (1comite par defaut)
 // args[1] indique la rubrique eventuelle de proposition
 // args[2] indique le focus eventuel
 // [(#FORMULAIRE_INSCRIPTION{nom_inscription, #ID_RUBRIQUE})]
@@ -31,7 +31,7 @@ function balise_FORMULAIRE_INSCRIPTION ($p) {
 function balise_FORMULAIRE_INSCRIPTION_stat($args, $filtres) {
 	list($mode, $id, $focus) = $args;
 	//initialiser_mode_inscription
-	if(!$mode) $mode = $GLOBALS['meta']['accepter_inscriptions'] == 'oui' ? 'redac' : ''; 
+	if(!$mode) $mode = $GLOBALS['meta']['accepter_inscriptions'] == 'oui' ? '1comite' : ''; 
 	if (!test_mode_inscription($mode))
 		return '';
 	else return array($mode, $focus, $id);
@@ -84,8 +84,9 @@ function balise_FORMULAIRE_INSCRIPTION_dyn($mode, $focus, $id=0) {
 // http://doc.spip.org/@test_mode_inscription
 function test_mode_inscription($mode) {
 
-	return (($mode == 'redac' AND $GLOBALS['meta']['accepter_inscriptions'] == 'oui')
-		OR ($mode == 'forum'
+  return (($mode == '1comite'  OR ($mode == 'redac') // redac: compatibilite
+		AND $GLOBALS['meta']['accepter_inscriptions'] == 'oui')
+	  OR ($mode == addslashes($mode) // mode libre mais syntaxe propre
 		AND ($GLOBALS['meta']['accepter_visiteurs'] == 'oui'
 			OR $GLOBALS['meta']['forums_publics'] == 'abo')));
 }
diff --git a/ecrire/configuration/visiteurs.php b/ecrire/configuration/visiteurs.php
index 10c6c01bd8..19a6ecd16f 100644
--- a/ecrire/configuration/visiteurs.php
+++ b/ecrire/configuration/visiteurs.php
@@ -20,21 +20,17 @@ function configuration_visiteurs_dist()
 {
 	global $spip_lang_left ;
 
-	if ($n = ($forums_publics<>'abo')) {
-			$n = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM spip_articles WHERE accepter_forum='abo' LIMIT 1"));
-			$n = !$n['n'];
-	}
-	if ($n) {
-		$res = "<table border='0' cellspacing='1' cellpadding='3' width=\"100%\">";
-		$res .= "\n<tr><td class='verdana2'>";
-		$res .= _T('info_question_accepter_visiteurs');
-		$res .= "</td></tr>";
-		$res .= "\n<tr><td style='text-align: $spip_lang_left' class='verdana2'>";
-		$res .= afficher_choix('accepter_visiteurs', $GLOBALS['meta']['accepter_visiteurs'],
+	if (!avoir_visiteurs()) {
+		$res = "<table border='0' cellspacing='1' cellpadding='3' width=\"100%\">"
+		. "\n<tr><td class='verdana2'>"
+		. _T('info_question_accepter_visiteurs')
+		. "</td></tr>"
+		. "\n<tr><td style='text-align: $spip_lang_left' class='verdana2'>"
+		. afficher_choix('accepter_visiteurs', $GLOBALS['meta']['accepter_visiteurs'],
 				       array('oui' => _T('info_option_accepter_visiteurs'),
-					'non' => _T('info_option_ne_pas_accepter_visiteurs')));
-		$res .= "</td></tr>\n";
-		$res .= "</td></tr></table>\n";
+					'non' => _T('info_option_ne_pas_accepter_visiteurs')))
+		. "</td></tr>\n"
+		. "</td></tr></table>\n";
 
 		$res = ajax_action_post('configurer', 'visiteurs', 'config_contenu','',$res);
 	} else {
diff --git a/ecrire/exec/auteurs.php b/ecrire/exec/auteurs.php
index 68ae230bc2..79d106e4a2 100644
--- a/ecrire/exec/auteurs.php
+++ b/ecrire/exec/auteurs.php
@@ -19,7 +19,7 @@ function exec_auteurs_dist()
 {
 	$tri = preg_replace('/\W/', '', _request('tri'));
 	if (!$tri) $tri='nom'; 
-	$statut = preg_replace('/\W/', '', _request('statut'));
+	$statut =  _request('statut');
 
 	$result = requete_auteurs($tri, $statut);
 	$nombre_auteurs = spip_num_rows($result);
@@ -42,7 +42,7 @@ function exec_auteurs_dist()
 		echo $commencer_page(_T('info_auteurs_par_tri',
 					array('partri' => '')),
 				     "auteurs","redacteurs");
-		bandeau_auteurs($tri, $statut=='6forum');
+		bandeau_auteurs($tri, !statut_min_redac($statut));
 
 		echo "<div id='auteurs'>", $res, "</div>";
 		echo pipeline('affiche_milieu',array('args'=>array('exec'=>'auteurs'),'data'=>''));
@@ -50,6 +50,12 @@ function exec_auteurs_dist()
 	}
 }
 
+function statut_min_redac($statut)
+{
+  $x = !$statut OR strpos($statut, "0minirezo") OR strpos($statut, "1comite");
+  return $statut[0] =='!' ? !$x : $x;
+}
+
 // http://doc.spip.org/@lettres_d_auteurs
 function lettres_d_auteurs($query, $debut, $max_par_page, $tri)
 {
@@ -106,12 +112,11 @@ function bandeau_auteurs($tri, $visiteurs)
 
 		$res .= icone_horizontale(_T('icone_informations_personnelles'), generer_url_ecrire("auteur_infos","id_auteur=$connect_id_auteur"), "fiche-perso-24.gif","rien.gif", false);
 
-		$n = spip_num_rows(spip_query("SELECT id_auteur FROM spip_auteurs WHERE statut='6forum' LIMIT 1"));
-		if ($n) {
-			if ($visiteurs)
+		if (avoir_visiteurs()) {
+                        if ($visiteurs)
 				$res .= icone_horizontale (_T('icone_afficher_auteurs'), generer_url_ecrire("auteurs"), "auteur-24.gif", "", false);
 			else
-				$res .= icone_horizontale (_T('icone_afficher_visiteurs'), generer_url_ecrire("auteurs","statut=6forum"), "auteur-24.gif", "", false);
+				$res .= icone_horizontale (_T('icone_afficher_visiteurs'), generer_url_ecrire("auteurs","statut=!1comite,0minirezo,nouveau"), "auteur-24.gif", "", false);
 		}
 		echo bloc_des_raccourcis($res);
 	}
@@ -129,11 +134,11 @@ function auteurs_tranches($auteurs, $debut, $lettre, $tri, $statut, $max_par_pag
 {
 	global $spip_lang_right;
 
-	$arg = $statut ? "&statut=$statut" : '';
+	$arg = $statut ? ("&statut=" .urlencode($statut)) : '';
 	$res ="\n<tr class='toile_gris_moyen'>"
 	. "\n<td style='width: 20px'>";
 
-	if ($tri=='statut' OR $statut !='')
+	if ($tri=='statut')
   		$res .= http_img_pack('admin-12.gif','', " class='lang'");
 	else {
 	  $t =  _T('lien_trier_statut');
@@ -147,10 +152,10 @@ function auteurs_tranches($auteurs, $debut, $lettre, $tri, $statut, $max_par_pag
 	else
 		$res .= auteurs_href(_T('info_nom'), "tri=nom$arg", " title='"._T('lien_trier_nom'). "'");
 
-
 	$res .= "</td><td>";
 
-	$col = ($statut == '6forum') ? _T('message') : _T('info_articles');
+	$col = statut_min_redac($statut) ? _T('info_articles') : _T('message') ;
+
 	if ($tri=='nombre')
 		$res .= '<b>' . $col .'</b>';
 	else
@@ -167,9 +172,9 @@ function auteurs_tranches($auteurs, $debut, $lettre, $tri, $statut, $max_par_pag
 			if ($j == $debut)
 				$res .= "<b>$j</b>";
 			else if ($j > 0)
-				$res .= auteurs_href($j, "tri=$tri&statut=$statut&debut=$j");
+				$res .= auteurs_href($j, "tri=$tri$arg&debut=$j");
 			else
-				$res .= auteurs_href('0', "tri=$tri&statut=$statut");
+				$res .= auteurs_href('0', "tri=$tri$arg");
 			if ($debut > $j  AND $debut < $j+$max_par_page){
 				$res .= " | <b>$debut</b>";
 			}
@@ -182,7 +187,7 @@ function auteurs_tranches($auteurs, $debut, $lettre, $tri, $statut, $max_par_pag
 				if ($val == $debut)
 					$res .= "<b>$key</b>\n";
 				else
-					$res .= auteurs_href($key, "tri=$tri&statut=$statut&debut=$val") . "\n";
+					$res .= auteurs_href($key, "tri=$tri$arg&debut=$val") . "\n";
 			}
 			$res .= "</td></tr>\n";
 		}
@@ -196,11 +201,11 @@ function auteurs_tranches($auteurs, $debut, $lettre, $tri, $statut, $max_par_pag
 
 		if ($debut > 0) {
 			$debut_prec = max($debut - $max_par_page, 0);
-			$nav .= auteurs_href('&lt;&lt;&lt;',"tri=$tri&debut=$debut_prec&statut=$statut");
+			$nav .= auteurs_href('&lt;&lt;&lt;',"tri=$tri&debut=$debut_prec$arg");
 		}
 		$nav .= "</td><td style='text-align: $spip_lang_right'>";
 		if ($debut_suivant < $nombre_auteurs) {
-			$nav .= auteurs_href('&gt;&gt;&gt;',"tri=$tri&debut=$debut_suivant&statut=$statut");
+			$nav .= auteurs_href('&gt;&gt;&gt;',"tri=$tri&debut=$debut_suivant&$arg");
 		}
 		$nav .= "</td></tr></table>\n";
 	}
@@ -239,10 +244,14 @@ function requete_auteurs($tri, $statut)
 // sauf les admins, toujours visibles.
 // limiter les statuts affiches
 if ($connect_statut == '0minirezo') {
-	if ($statut) {
-		$sql_visible = "aut.statut IN ('$statut')";
-	} else {
+	if (!$statut) {
 		$sql_visible = "aut.statut IN ('0minirezo','1comite','5poubelle')";
+	} else {
+		if ($statut[0]="!") {
+		  $statut = substr($statut,1); $not = " NOT";
+		} else $not = '';
+		$statut = preg_replace('/\W+/',"','",$statut); 
+		$sql_visible = "aut.statut$not IN ('$statut')";
 	}
 } else {
 	$sql_visible = "(
@@ -270,12 +279,12 @@ default:
 	$sql_order = " multi";
 }
 
-
+ $visit = ($statut  AND ($statut!='1comite') AND ($statut != '0minirezo'));
 //
 // La requete de base est tres sympa
 // (pour les visiteurs, ca postule que les messages concernent des articles)
 
- $row = spip_query("SELECT							aut.id_auteur AS id_auteur,							aut.statut AS statut,								aut.nom AS nom,								UPPER(aut.nom) AS unom,							count(lien.id_article) as compteur							$sql_sel									FROM spip_auteurs as aut " . (($statut == '6forum') ? 			"LEFT JOIN spip_forum AS lien ON aut.id_auteur=lien.id_auteur " :		("LEFT JOIN spip_auteurs_articles AS lien ON aut.id_auteur=lien.id_auteur	 LEFT JOIN spip_articles AS art ON (lien.id_article = art.id_article)")) .	" WHERE $sql_visible GROUP BY aut.id_auteur ORDER BY $sql_order");
+ $row = spip_query("SELECT							aut.id_auteur AS id_auteur,							aut.statut AS statut,								aut.nom AS nom,								UPPER(aut.nom) AS unom,							count(lien.id_article) as compteur							$sql_sel									FROM spip_auteurs as aut " . ($visit ?		 			"LEFT JOIN spip_forum AS lien ON aut.id_auteur=lien.id_auteur " :		("LEFT JOIN spip_auteurs_articles AS lien ON aut.id_auteur=lien.id_auteur	 LEFT JOIN spip_articles AS art ON (lien.id_article = art.id_article)")) .	" WHERE $sql_visible GROUP BY aut.id_auteur ORDER BY $sql_order");
  return $row;
 }
 
diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php
index 88f76c281f..45daec3057 100644
--- a/ecrire/inc/auth.php
+++ b/ecrire/inc/auth.php
@@ -71,9 +71,9 @@ function auth_rubrique($id_auteur, $statut)
 function acces_statut($id_auteur, $statut, $bio)
 {
 	if ($statut == 'nouveau') {
-		$statut = ($bio ? ($bio == 'redac' ? '1comite' : '6forum'):
-			   (($GLOBALS['meta']['accepter_inscriptions'] == 'oui') ? '1comite' : '6forum'));
-		spip_query("UPDATE spip_auteurs SET bio='', statut='$statut'	WHERE id_auteur=$id_auteur");
+		$statut = $bio ? $bio :
+		  (($GLOBALS['meta']['accepter_inscriptions'] == 'oui') ? '1comite' : '6forum');
+		spip_query("UPDATE spip_auteurs SET bio='', statut=" . _q($statut) . " WHERE id_auteur=$id_auteur");
 	}
 	return $statut;
 }
diff --git a/ecrire/inc/autoriser.php b/ecrire/inc/autoriser.php
index 6d15b274f0..101d847cc0 100644
--- a/ecrire/inc/autoriser.php
+++ b/ecrire/inc/autoriser.php
@@ -159,8 +159,8 @@ function autoriser_rubrique_creersitedans_dist($faire, $type, $id, $qui, $opt) {
 		AND $GLOBALS['meta']['activer_sites'] != 'non'
 		AND (
 			$qui['statut']=='0minirezo'
-			OR ($qui['statut']=='1comite' AND $GLOBALS['meta']["proposer_sites"]>=1)
-			OR ($qui['statut']=='6forum' AND $GLOBALS['meta']["proposer_sites"]>=2) );
+			OR ($GLOBALS['meta']["proposer_sites"] >= 
+			    ($qui['statut']=='1comite' ? 1 : 2)));
 }
 
 // Autoriser a modifier un site
diff --git a/ecrire/inc/boutons.php b/ecrire/inc/boutons.php
index f36665209b..e75e5d3f05 100644
--- a/ecrire/inc/boutons.php
+++ b/ecrire/inc/boutons.php
@@ -152,11 +152,9 @@ function definir_barre_boutons() {
 
 	$sousmenu=array();
 
-	$n = spip_num_rows(spip_query("SELECT id_auteur FROM spip_auteurs WHERE statut='6forum' LIMIT 1"));
-
-	if ($n)
+	if (avoir_visiteurs())
 		$sousmenu['auteurs'] = 
-			new Bouton("fiche-perso.png", 'icone_afficher_visiteurs', null, "statut=6forum");
+			new Bouton("fiche-perso.png", 'icone_afficher_visiteurs', null, "statut=!1comite,0minirezo,nouveau");
 
 	$sousmenu['auteur_infos']=
 		new Bouton("auteur-24.gif", "icone_creer_nouvel_auteur", null, 'new=oui');
diff --git a/ecrire/inc/editer_auteurs.php b/ecrire/inc/editer_auteurs.php
index 80a469ed12..dd5be03a25 100644
--- a/ecrire/inc/editer_auteurs.php
+++ b/ecrire/inc/editer_auteurs.php
@@ -151,7 +151,7 @@ function determiner_non_auteurs($type, $id, $cond_les_auteurs, $order)
 	if (strlen($cond))
 		$cond = "id_auteur NOT IN (" . substr($cond,1) . ') AND ';
 
-	return spip_query("SELECT * FROM spip_auteurs WHERE $cond" . "statut!='5poubelle' AND statut!='6forum' AND statut!='nouveau' ORDER BY $order");
+	return spip_query("SELECT * FROM spip_auteurs WHERE $cond" . "statut='0minirezo' OR statut='1comite' ORDER BY $order");
 }
 
 // http://doc.spip.org/@rechercher_auteurs_objet
diff --git a/ecrire/inc/formater_auteur.php b/ecrire/inc/formater_auteur.php
index 48a82b1bca..074aabd9fd 100644
--- a/ecrire/inc/formater_auteur.php
+++ b/ecrire/inc/formater_auteur.php
@@ -12,7 +12,6 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-
 //
 // Construit un tableau des 5 informations principales sur un auteur,
 // avec des liens vers les scripts associes:
@@ -20,9 +19,12 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // 2. l'icone du mail avec un lien mailto ou a defaut la messagerie de Spip
 // 3. le nom, avec lien vers la page complete des informations
 // 4. le mot "site" avec le lien vers le site Web personnelle
-// 5. le nombre d'articles publies
+// 5. le nombre d'objets publies
 //
 
+// Un auteur sans autorisation de modification de soi  est un visiteur;
+// il n'a pas de messagerie interne, et n'a publie que des messages de forum
+
 // http://doc.spip.org/@inc_formater_auteur_dist
 function inc_formater_auteur_dist($id_auteur) {
 
@@ -54,7 +56,7 @@ function inc_formater_auteur_dist($id_auteur) {
 	if ($url_site_auteur = $row["url_site"]) $vals[] =  "<a href='$url_site_auteur'>"._T('info_site_min')."</a>";
 	else $vals[] =  "&nbsp;";
 
-	if ($row['statut'] != '6forum') {
+	if (autoriser('modifier', 'auteur', $id_auteur, $row)) {
 	  $cpt = spip_fetch_array(spip_query("SELECT COUNT(articles.id_article) AS n FROM spip_auteurs_articles AS lien, spip_articles AS articles WHERE lien.id_auteur=$id_auteur AND articles.id_article=lien.id_article AND articles.statut IN " . ($connect_statut == "0minirezo" ? "('prepa', 'prop', 'publie', 'refuse')" : "('prop', 'publie')") . " GROUP BY lien.id_auteur"), SPIP_NUM);
 	  $t = _T('info_article_2');
 	  $t1 = _T('info_1_article'); 
@@ -78,9 +80,8 @@ function formater_auteur_mail($row, $id_auteur)
 {
 	global $spip_lang_rtl;
 
-	$email = $row['email'];
-	if (($row['statut'] == '6forum') || ($row['statut'] == '5poubelle'))
-		$href= 'mailto:' . $email;
+	if (!autoriser('modifier', 'auteur', $id_auteur, $row))
+		$href= 'mailto:' . $row['email'];
 	else $href = generer_action_auteur("editer_message","normal/$id_auteur");
 	return "<a href='$href' title=\""
 	  .  _T('info_envoyer_message_prive')
diff --git a/ecrire/inc/instituer_auteur.php b/ecrire/inc/instituer_auteur.php
index 83e26d72f7..f81652e016 100644
--- a/ecrire/inc/instituer_auteur.php
+++ b/ecrire/inc/instituer_auteur.php
@@ -68,72 +68,56 @@ function choix_statut_auteur($statut, $id_auteur, $ancre) {
 	null, array('statut' => '?')))
 		return '';
 
-	// Calculer le menu
-	$menu = "<select name='statut' size='1' class='fondl'
-		onchange=\"(this.options[this.selectedIndex].value == '0minirezo')?jQuery('#$ancre').slideDown():jQuery('#$ancre:visible').slideUp();\">";
-
-	// A-t-on le droit de promouvoir cet auteur comme admin ?
-	if (autoriser('modifier', 'auteur', intval($id_auteur),
-	null, array('statut' => '0minirezo'))) {
-		$menu .= "\n<option" .
-			mySel("0minirezo",$statut) .
-			">" . _T('item_administrateur_2')
-			. '</option>';
-	}
-
-	// Ajouter le choix "comite"
-	$menu .=
-		"\n<option" .
-		mySel("1comite",$statut) .
-		">" .
-		_T('intem_redacteur') .
-		'</option>';
-
-	// Ajouter le choix "visiteur" si :
-	// - l'auteur est visiteur
-	// - OU, on accepte les visiteurs (ou forums sur abonnement)
-	// - OU il y a des visiteurs dans la base
-	$x = (($statut == '6forum')
-	      OR ($GLOBALS['meta']['accepter_visiteurs'] == 'oui')
-	      OR ($GLOBALS['meta']['forums_publics'] == 'abo'));
-	if (!$x) {
-	  $x = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM spip_auteurs WHERE statut='6forum' LIMIT 1"));
-	  $x = $x['n'];
+	$autres = "";
+	// Chercher tous les statuts non standards.
+	// Le count(*) ne sert pas, mais en son absence
+	// SQL (enfin, une version de SQL) renvoie un ensemble vide !
+	$q = spip_query($r ="SELECT statut, count(*) FROM spip_auteurs WHERE statut NOT IN ('" . join("','", $GLOBALS['liste_des_statuts']) . "') GROUP BY statut");
+	while ($r = spip_fetch_array($q, SPIP_NUM)) {
+		$nom = htmlentities($r[0]);
+		$autres .= mySel($nom, $statut, _T('info_statut_auteur_autre') . ' ' . $nom);
 	}
-	if ($x)
-		$menu .= "\n<option" .
-			mySel("6forum",$statut) .
-			">" .
-			_T('item_visiteur') .
-			'</option>';
 
-	// Ajouter l'option "nouveau" si l'auteur n'est pas confirme
-	if ($statut == 'nouveau')
-		$menu .= "\n<option" .
-			mySel('nouveau',$statut) .
-			">" .
-			_T('info_statut_auteur_a_confirmer') .
-			'</option>';
-
-	// Ajouter l'option "autre" si le statut est inconnu
-	elseif (!in_array($statut, $GLOBALS['liste_des_statuts']))
-		$menu .= "\n<option" .
-			mySel('autre','autre') .
-			">" .
-			_T('info_statut_auteur_autre').' '.htmlentities($statut).
-			'</option>';
-
-	$menu .= "\n<option" .
+	// Calculer le menu
+	return "<select name='statut' size='1' class='fondl'
+		onchange=\"(this.options[this.selectedIndex].value == '0minirezo')?jQuery('#$ancre').slideDown():jQuery('#$ancre:visible').slideUp();\">"
+	. liste_statuts_instituer($statut, $id_auteur) 
+	. $autres
+	. "\n<option" .
 		mySel("5poubelle",$statut) .
-		" style='background:url(" . _DIR_IMG_PACK . "rayures-sup.gif)'>&gt; "
+		" class='danger'>&gt; "
 		._T('texte_statut_poubelle') .
-		'</option>' .
-		"</select>\n";
+		'</option>'
+	. "</select>\n";
+}
+
+function liste_statuts_instituer($courant, $id_auteur) {
+	$recom = array("info_administrateurs" => _T('item_administrateur_2'),
+		       "info_redacteurs" =>  _T('intem_redacteur'),
+		       "info_visiteurs" => _T('item_visiteur'));
+	
+	// A-t-on le droit de promouvoir cet auteur comme admin 
+	// et y a-t-il des visiteurs ?
+
+	$droits = array("info_administrateurs" =>
+		       autoriser('modifier', 'auteur', $id_auteur,
+				 null, array('statut' => '0minirezo')),
+		       "info_redacteurs" => true,
+		       "info_visiteurs" => avoir_visiteurs());
+	
+	$menu = '';
+	foreach($GLOBALS['liste_des_statuts'] as $k => $v) {
+		if (isset($recom[$k]) AND $droits[$k])
+			$menu .=  mySel($v, $courant, $recom[$k]);
+
+	}
+	// Ajouter l'option "nouveau" si l'auteur n'est pas confirme
+	if ($courant == 'nouveau')
+		$menu .= mySel('nouveau',$courant,_T('info_statut_auteur_a_confirmer'));
 
 	return $menu;
 }
 
-
 // http://doc.spip.org/@choix_rubriques_admin_restreint
 function choix_rubriques_admin_restreint($auteur) {
 	global $connect_toutes_rubriques, $connect_id_auteur, $connect_statut, $spip_lang_right, $spip_lang;
diff --git a/ecrire/inc/presentation.php b/ecrire/inc/presentation.php
index 5b30ded895..7ebc66d1fc 100644
--- a/ecrire/inc/presentation.php
+++ b/ecrire/inc/presentation.php
@@ -694,6 +694,15 @@ function afficher_script_statut($id, $type, $n, $img, $statut, $titre, $act)
   return "<a href=\"$h\"\ntitle=\"$t\"$act><img src='$i' alt=' '/></a>";
 }
 
+function avoir_visiteurs() {
+
+	if ($GLOBALS['meta']["forums_publics"] == 'abo') return true;
+	if ($GLOBALS['meta']['accepter_visiteurs'] == 'oui') return true;
+	$n = spip_query("SELECT COUNT(*) AS n FROM spip_articles WHERE accepter_forum='abo' LIMIT 1");
+	$n = spip_fetch_array($n);
+	return $n['n'];
+}
+
 //
 // Afficher des auteurs sur requete SQL
 //
@@ -702,6 +711,9 @@ function bonhomme_statut($row) {
 	global $connect_statut;
 
 	switch($row['statut']) {
+		case "nouveau":
+			return '';
+			break;
 		case "0minirezo":
 			return http_img_pack("admin-12.gif", _T('titre_image_administrateur'), "",
 					_T('titre_image_administrateur'));
@@ -713,14 +725,10 @@ function bonhomme_statut($row) {
 			  return http_img_pack("redac-12.gif",_T('titre_image_redacteur'), "", _T('titre_image_redacteur_02'));
 			break;
 		case "5poubelle":
-		  return http_img_pack("poubelle.gif", _T('titre_image_auteur_supprime'), "",_T('titre_image_auteur_supprime'));
+			return http_img_pack("poubelle.gif", _T('titre_image_auteur_supprime'), "",_T('titre_image_auteur_supprime'));
 			break;
-		case "6forum":
-		  return http_img_pack("visit-12.gif", _T('titre_image_visiteur'), "",_T('titre_image_visiteur'));
-			break;
-		case "nouveau":
 		default:
-			return '';
+		  return http_img_pack("visit-12.gif", _T('titre_image_visiteur'), "",_T('titre_image_visiteur'));
 			break;
 	}
 }
diff --git a/ecrire/install/etape_ldap4.php b/ecrire/install/etape_ldap4.php
index e1bc4aa6a6..b8a5236eb3 100644
--- a/ecrire/install/etape_ldap4.php
+++ b/ecrire/install/etape_ldap4.php
@@ -62,18 +62,26 @@ function install_etape_ldap4_dist()
 				'statut_ldap' => array(
 					'label' => _T('info_statut_utilisateurs_2').'<br />',
 					'valeur' => '1comite',
-					'alternatives' => array(
-						'6forum' => "<b>"._T('info_visiteur_1')."</b> "._T('info_visiteur_2')."<br />",
-						'1comite' => "<b>"._T('info_redacteur_1')."</b> "._T('info_redacteur_2')."<br />",
-						'0minirezo' => "<b>"._T('info_administrateur_1')."</b> "._T('info_administrateur_2')."<br />"
+					'alternatives' => liste_statuts_ldap()
 					)
 				)
-			)
-		)
+			   )
 		. bouton_suivant()));
 	}
 
 	echo info_progression_etape(4,'etape_ldap','install/');
 	echo install_fin_html();
 }
+
+function liste_statuts_ldap() {
+	$recom = array("info_administrateurs" => ("<b>" ._T('info_administrateur_1')."</b> "._T('info_administrateur_2')."<br />"),
+		       "info_redacteurs" =>  ("<b>"._T('info_redacteur_1')."</b> "._T('info_redacteur_2')."<br />"),
+		       "info_visiteurs" => ("<b>"._T('info_visiteur_1')."</b> "._T('info_visiteur_2')."<br />"));
+	
+	$res = array();
+	foreach($GLOBALS['liste_des_statuts'] as $k => $v) {
+		if (isset($recom[$k])) $res[$v] = $recom[$k];
+	}
+	return $res;
+}
 ?>
-- 
GitLab