From 4eac3e803408428b3b232e6968ff2a872edc33de Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sat, 6 May 2006 08:22:11 +0000
Subject: [PATCH] =?UTF-8?q?S=C3=A9paration=20des=20statuts=20redacteurs/vi?=
 =?UTF-8?q?siteurs.=20R=C3=A9alise=20la=20t=C3=A2che=20#259?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/balise/formulaire_inscription.php | 12 +--
 ecrire/inc/auth.php                      | 94 ++++++++++++++----------
 ecrire/inc/auth_spip.php                 | 15 ++--
 ecrire/inc/indexation.php                |  3 +-
 4 files changed, 71 insertions(+), 53 deletions(-)

diff --git a/ecrire/balise/formulaire_inscription.php b/ecrire/balise/formulaire_inscription.php
index 1d33173647..84e19063da 100644
--- a/ecrire/balise/formulaire_inscription.php
+++ b/ecrire/balise/formulaire_inscription.php
@@ -75,7 +75,8 @@ function balise_FORMULAIRE_INSCRIPTION_dyn($mode, $focus, $id_rubrique=0) {
 // et donner des infos supplémentaires
 // Std: controler que le nom (qui sert a calculer le login) est assez long
 // et que l'adresse est valide (et on la normalise)
-// Retour: une chaine message d'erreur ou un tableau email/nom au minimum
+// Retour: une chaine message d'erreur 
+// ou un tableau avec au minimum email, nom, mode (redac / forum)
 
 function test_inscription_dist($mode, $mail, $nom, $id_rubrique=0) {
 
@@ -84,14 +85,11 @@ function test_inscription_dist($mode, $mail, $nom, $id_rubrique=0) {
 	if (!$nom || strlen($nom) > 64)
 	    return _T('ecrire:info_login_trop_court');
 	if (!$r = email_valide($mail)) return _T('info_email_invalide');
-	return array('email' => $r, 'nom' => ($nom));
+	return array('email' => $r, 'nom' => $nom, 'bio' => $mode);
 }
 
 // cree un nouvel utilisateur et renvoie un message d'impossibilite ou la
 // ligne SQL le decrivant.
-// On enregistre le demandeur comme 'nouveau' 
-// et on lui envoie ses codes par email ; lors de
-// sa premiere connexion il obtiendra son statut final (auth->activer())
 
 function message_inscription($mail, $nom, $mode, $id_rubrique=0) {
 
@@ -123,6 +121,10 @@ function message_inscription($mail, $nom, $mode, $id_rubrique=0) {
 	return $row;
 }
 
+// On enregistre le demandeur comme 'nouveau', en memorisant le statut final
+// provisoirement dans le champ Bio, afin de ne pas visualiser les inactifs
+// A sa premiere connexion il obtiendra son statut final (auth->activer())
+
 function inscription_nouveau($declaration)
 {
 	if (!isset($declaration['login']))
diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php
index 5d742e96b2..d2df00aa4a 100644
--- a/ecrire/inc/auth.php
+++ b/ecrire/inc/auth.php
@@ -32,6 +32,22 @@ function acces_restreint_rubrique($id_rubrique) {
 }
 
 
+// Un nouvel inscrit prend son statut definitif a la 1ere connexion
+// Le statut a ete memorise dans bio (cf formulaire_inscription)
+// Si vide se rabattre sur le mode d'inscription 
+// (compatibilite vieille version ou redac/forum etait mutuellement exclusif)
+
+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");
+	}
+	return $statut;
+}
+
+
 function inc_auth_dist() {
 	global $_GET, $_COOKIE, $_SERVER;
 	global $auth_can_disconnect, $ignore_auth_http, $ignore_remote_user;
@@ -90,32 +106,28 @@ function inc_auth_dist() {
 		$auth_htaccess = true;
 	}
 
+	// pas authentifie par cookie ni rien: demander login / mdp
 
-	// pas authentifie,
-	// demander login / mdp et nettoyer en cas de login en echec
 	if (!$auth_login) {
-		if ($_GET['bonjour'] == 'oui') {
-			$erreurcookie = '&var_echec_cookie=true';
-		}
-
-		return (generer_url_public('login',
-			"url=".rawurlencode(str_replace('/./', '/',
-			(_DIR_RESTREINT ? "" : _DIR_RESTREINT_ABS)
-			. str_replace('&amp;', '&', self()))),true).$erreurcookie);
+		return auth_arefaire();
 	}
-
 	//
 	// Chercher le login dans la table auteurs
 	//
 
-	$auth_login = addslashes($auth_login);
-	$result = @spip_query("SELECT * FROM spip_auteurs WHERE login='$auth_login' AND statut!='5poubelle' AND statut!='6forum'");
+	$result = @spip_query("SELECT * FROM spip_auteurs WHERE login='" . addslashes($auth_login) . "' AND statut!='5poubelle'");
 
-	if ($row = spip_fetch_array($result)) {
+	if (!$row = spip_fetch_array($result)) {
+	  auth_areconnecter($auth_login);
+		exit;
+	}
+	elseif ($row['statut']=='6forum') 
+		return auth_arefaire();
+	else {
 		$connect_id_auteur = $row['id_auteur'];
 		$connect_login = $row['login'];
 		$connect_pass = $row['pass'];
-		$connect_statut = $row['statut'];
+		$connect_statut = acces_statut($connect_id_auteur, $row['statut'], $row['bio']);
 
 		// Special : si dans la fiche auteur on modifie les valeurs
 		// de messagerie, utiliser ces valeurs plutot que celle de la base.
@@ -165,37 +177,41 @@ function inc_auth_dist() {
 			$connect_toutes_rubriques = false;
 			$connect_id_rubrique = array();
 		}
-	} else {
+	}
 
-	  // l'auteur a ete identifie mais on n'a pas d'info sur lui
-	  // C'est soit parce que le serveur MySQL ne repond pas,
-	  // soit parce que la table des auteurs a changee (restauration etc)
-	  // Pas la peine d'insister.  Envoyer un message clair au client.
+	if (!$auth_pass_ok)
+		return	generer_url_public('login', 'var_erreur=pass', true);
 
-		include_spip('inc/minipres');
-		if (!$GLOBALS['db_ok']) {
-			spip_log("Erreur base de donnees");
+	return "";
+}
 
-			install_debut_html(_T('info_travaux_titre')); echo _T('titre_probleme_technique'), "<p><tt>".spip_sql_errno()." ".spip_sql_error()."</tt></p>";install_fin_html();
-		} else {
 
-			install_debut_html(_T('avis_erreur_connexion')); echo "<br><br><p>", _T('texte_inc_auth_1', array('auth_login' => $auth_login)), " <a href='",  generer_url_public('spip_cookie',"logout=$auth_login"), "'>", _T('texte_inc_auth_2'), "</A>",_T('texte_inc_auth_3');install_fin_html();
-		}
-		exit;
-	}
+// Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
+// C'est soit parce que le serveur MySQL ne repond pas,
+// soit parce que la table des auteurs a changee (restauration etc)
+// Pas la peine d'insister.  Envoyer un message clair au client.
 
-	if (!$auth_pass_ok)
-		return	generer_url_public('login', 'var_erreur=pass', true);
+function auth_areconnecter($auth_login)
+{
+	include_spip('inc/minipres');
+	if (!$GLOBALS['db_ok']) {
+		spip_log("Erreur base de donnees");
 
-	// un nouvel inscrit prend son statut definitif
-	// (en supposant que le mode d'inscription est toujours le meme!)
+		install_debut_html(_T('info_travaux_titre')); echo _T('titre_probleme_technique'), "<p><tt>".spip_sql_errno()." ".spip_sql_error()."</tt></p>";install_fin_html();
+	} else {
 
-	if ($connect_statut == 'nouveau') {
-		$connect_statut =
-		($GLOBALS['meta']['accepter_inscriptions'] == 'oui') ? '1comite' : '6forum';
-		spip_query("UPDATE spip_auteurs SET statut='$connect_statut'	WHERE id_auteur=$connect_id_auteur");
+		install_debut_html(_T('avis_erreur_connexion')); echo "<br><br><p>", _T('texte_inc_auth_1', array('auth_login' => $auth_login)), " <a href='",  generer_url_public('spip_cookie',"logout=$auth_login"), "'>", _T('texte_inc_auth_2'), "</A>",_T('texte_inc_auth_3');install_fin_html();
 	}
-
-	return "";
 }
+
+// redemande login, avec nettoyage
+
+function auth_arefaire()
+{
+	$url = rawurlencode(str_replace('/./', '/',
+			(_DIR_RESTREINT ? "" : _DIR_RESTREINT_ABS) . str_replace('&amp;', '&', self()))); 
+	return generer_url_public('login', "url=$url" . ($_GET['bonjour'] == 'oui' ? '&var_echec_cookie=true' : ''),true);
+	  }
+
+
 ?>
diff --git a/ecrire/inc/auth_spip.php b/ecrire/inc/auth_spip.php
index dd2253e15a..0928b7136e 100644
--- a/ecrire/inc/auth_spip.php
+++ b/ecrire/inc/auth_spip.php
@@ -13,7 +13,7 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 class Auth_spip {
-	var $nom, $login, $email, $md5pass, $md5next, $alea_futur, $statut;
+	var $id_auteur, $nom, $login, $email, $md5pass, $md5next, $alea_futur, $statut, $bio;
 
 	function init() {
 		return true;
@@ -27,10 +27,12 @@ class Auth_spip {
 		$result = spip_query("SELECT * FROM spip_auteurs WHERE login='".addslashes($login)."' AND pass='".addslashes($mdpass_actuel)."' AND statut<>'5poubelle'");
 
 		if ($row = spip_fetch_array($result)) {
+			$this->id_auteur = $row['id_auteur'];
 			$this->nom = $row['nom'];
 			$this->login = $row['login'];
 			$this->email = $row['email'];
 			$this->statut = $row['statut'];
+			$this->bio = $row['bio'];
 			$this->md5pass = $mdpass_actuel;
 			$this->md5next = $mdpass_futur;
 			return true;
@@ -58,19 +60,16 @@ class Auth_spip {
 	}
 
 	function activer() {
-		if ($this->statut == 'nouveau') { // nouvel inscrit
-			$connect_statut =
-			($GLOBALS['meta']['accepter_inscriptions'] == 'oui') ?
-				'1comite' : '6forum';
-			spip_query("UPDATE spip_auteurs SET statut='$connect_statut' WHERE login='".addslashes($this->login)."'");
-		}
+		include_spip('inc/auth');
+		$this->statut = acces_statut($this->id_auteur, $this->statut, $this->bio);
 		if ($this->md5next) {
 			include_spip('inc/session');
 			// fait tourner le codage du pass dans la base
 			$nouvel_alea_futur = creer_uniqid();
-			@spip_query("UPDATE spip_auteurs SET alea_actuel = alea_futur, pass = '".addslashes($this->md5next)."', alea_futur = '$nouvel_alea_futur' WHERE login='".$this->login."'");
+			@spip_query("UPDATE spip_auteurs SET alea_actuel = alea_futur, pass = '".addslashes($this->md5next)."', alea_futur = '$nouvel_alea_futur' WHERE id_auteur=" . $this->id_auteur);
 
 		}
 	}
 }
+
 ?>
diff --git a/ecrire/inc/indexation.php b/ecrire/inc/indexation.php
index f7b27239fc..22d38827c4 100644
--- a/ecrire/inc/indexation.php
+++ b/ecrire/inc/indexation.php
@@ -704,7 +704,8 @@ function requete_hash ($rech) {
 
 	// Attention en MySQL 3.x il faut passer par HEX(hash)
 	// alors qu'en MySQL 4.1 c'est interdit !
-	$vers = spip_fetch_array(spip_query("SELECT VERSION() AS v"));
+	$vers = spip_query("SELECT VERSION() AS v");
+	$vers = spip_fetch_array($vers);
 	if (substr($vers['v'], 0, 1) >= 4
 	AND substr($vers['v'], 2, 1) >= 1 ) {
 		$hex_fmt = '';
-- 
GitLab