diff --git a/ecrire/action/cookie.php b/ecrire/action/cookie.php
index df2de0b568d13ef9c662b4c0fc3febe6695184c2..a9db2a904226055ad52f7923606b2ddecbe1561e 100644
--- a/ecrire/action/cookie.php
+++ b/ecrire/action/cookie.php
@@ -49,7 +49,6 @@ function action_spip_cookie_dist()
     $essai_login,
     $id_auteur,
     $ignore_auth_http,
-    $ldap_present,
     $logout,
     $logout_public,
     $next_session_password_md5,
@@ -130,70 +129,46 @@ if ($test_echec_cookie == 'oui') {
 
 // Tentative de login
 unset ($cookie_session);
+
 $redirect = ($url ? $url : _DIR_RESTREINT_ABS);
 if ($essai_login == "oui") {
 	// Recuperer le login en champ hidden
 	if ($session_login_hidden AND !$session_login)
 		$session_login = $session_login_hidden;
 
-	$login = $session_login;
+	$row_auteur = array();
+	spip_connect();
 
-	// Essayer differentes methodes d'authentification
-	$auths = array('spip');
-	spip_connect(); // pour savoir si ldap est present 
-	if ($ldap_present) $auths[] = 'ldap';
-	$ok = false;
-	foreach ($auths as $nom_auth) {
-		include_spip('inc/auth_'.$nom_auth);
-		$classe_auth = "Auth_".$nom_auth;
-		$auth = new $classe_auth;
-		if ($auth->init()) {
-			// Essayer les mots de passe md5
-			$ok = $auth->verifier_challenge_md5($login, $session_password_md5, $next_session_password_md5);
-			// Sinon essayer avec le mot de passe en clair
-			if (!$ok && $session_password) $ok = $auth->verifier($login, $session_password);
-			if ($ok)  { $auth->lire(); break; }
-		}
+	// Essayer l'authentification par MySQL
+	$f = charger_fonction('auth_spip', 'inc', true);
+	if ($f) $row_auteur = $f($session_login, $session_password);		
+	// Marche pas: essayer l'authentification par LDAP si present
+	if (!$row_auteur AND $GLOBALS['ldap_present']) {
+		$f = charger_fonction('auth_ldap', 'inc', true);
+		if ($f) $row_auteur = $f($session_login, $session_password);
 	}
 
-	// Si la connexion a reussi
-	if ($ok) {
-		// Nouveau redacteur ou visiteur inscrit par mail :
-		// 'nouveau' -> '1comite' ou  '6forum'
-		// Si LDAP : importer l'utilisateur vers la base SPIP
-		$auth->activer();
-
-		if ($auth->login AND $auth->statut == '0minirezo') // force le cookie pour les admins
-			$cookie_admin = "@".$auth->login;
-
-		// On est connecte : recuperer les donnees auteurs
-		// poser le cookie session, puis le cas echeant
-		// verifier que le statut correspond au minimum requis,
-		$result = spip_query("SELECT * FROM spip_auteurs WHERE login=" . spip_abstract_quote($auth->login));
-
-		if ($row_auteur = spip_fetch_array($result)) {
-			$cookie_session = creer_cookie_session($row_auteur);
-		} else
-			$ok = false;
-
-		// Si on se connecte dans l'espace prive, ajouter "bonjour" (inutilise)
-		if ($ok AND ereg(_DIR_RESTREINT_ABS, $redirect)) {
-			$redirect .= ((false !== strpos($redirect, "?")) ? "&" : "?")
-			. 'bonjour=oui';
-		}
-	}
-
-	if (!$ok) {
+	// Marche pas, renvoyer le formulaire avec message d'erreur si 2e fois
+	if (!$row_auteur) {
 		if (ereg(_DIR_RESTREINT_ABS, $redirect))
 			$redirect = generer_url_public('login',
-				"var_login=$login", true);
+				"var_login=$session_login", true);
 		if ($session_password || $session_password_md5)
 			$redirect = parametre_url($redirect, 'var_erreur', 'pass', '&');
 		$redirect .= '&url=' . rawurlencode($url);
-		spip_log("echec login: $login");
+		spip_log("echec login: $session_login");
+	} else {
+		spip_log("login de $session_login vers $redirect");
+		// Si on se connecte dans l'espace prive, 
+		// ajouter "bonjour" (inutilise)
+		if (ereg(_DIR_RESTREINT_ABS, $redirect)) {
+			$redirect .= ((false !== strpos($redirect, "?")) ? "&" : "?")
+				. 'bonjour=oui';
+		}
+		if ($row_auteur['statut'] == '0minirezo')
+			$cookie_admin = "@".$session_login;
+		$cookie_session = creer_cookie_session($row_auteur);
 	}
-	else
-		spip_log("login: $login");
 }
 
 // cookie d'admin ?
diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php
index f72bef0186329cebc3043d58003b15326e53a32a..43ad35450dbad6eb2c56609f8a8570659ed30b81 100644
--- a/ecrire/inc/auth.php
+++ b/ecrire/inc/auth.php
@@ -118,16 +118,14 @@ function inc_auth_dist() {
 	$result = @spip_query("SELECT * FROM spip_auteurs WHERE login=" . spip_abstract_quote($auth_login) . " AND statut!='5poubelle'");
 
 	if (!$row = spip_fetch_array($result)) {
-	  auth_areconnecter($auth_login);
+		auth_areconnecter($auth_login);
 		exit;
-	}
-	elseif ($row['statut']=='6forum') 
-		return auth_arefaire();
-	else {
+	} else {
 		$connect_id_auteur = $row['id_auteur'];
 		$connect_login = $row['login'];
 		$connect_pass = $row['pass'];
 		$connect_statut = acces_statut($connect_id_auteur, $row['statut'], $row['bio']);
+		if ($row['statut']=='6forum') return auth_arefaire();
 
 		// Special : si dans la fiche auteur on modifie les valeurs
 		// de messagerie, utiliser ces valeurs plutot que celle de la base.
diff --git a/ecrire/inc/auth_ldap.php b/ecrire/inc/auth_ldap.php
index acc659a3a4b70a0cb4da82687c409c2ae362f3dd..f98f2ce4f3627224cc02813132dd7ef24ec552de 100644
--- a/ecrire/inc/auth_ldap.php
+++ b/ecrire/inc/auth_ldap.php
@@ -12,128 +12,101 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-class Auth_ldap {
-	var $user_dn;
-	var $nom, $login, $email, $pass, $statut, $bio;
-
-	function init() {
-		// Verifier la presence de LDAP
-		if (!$GLOBALS['ldap_present']) return false;
-		return spip_connect_ldap();
-	}
+// Authentifie via LDAP et retourne la ligne SQL decrivant l'utilisateur si ok
 
-	function verifier_challenge_md5($login, $mdpass_actuel, $mdpass_futur) {
-		return false;
-	}
+function inc_auth_ldap_dist ($login, $pass) {
 
-	function verifier($login, $pass) {
-		global $ldap_link, $ldap_base;
+	// Securite contre un serveur LDAP laxiste
+	if (!$login || !$pass) return array();
 
-		// Securite, au cas ou le serveur LDAP est tres laxiste
-		if (!$login || !$pass) return false;
+	// Serveur joignable ?
+	if (!@spip_connect_ldap()) return array();
 
-		// Attributs testes pour egalite avec le login
-		$atts = array('sAMAccountName', 'uid', 'login', 'userid', 'cn', 'sn');
-		$login_search = ereg_replace("[^-@._[:space:][:alnum:]]", "", $login); // securite
+	// Utilisateur connu ?
+	if (!($dn = auth_ldap_search($login, $pass))) return array();
 
-		// Tenter une recherche pour essayer de retrouver le DN
-		reset($atts);
-		while (list(, $att) = each($atts)) {
-			$filter = "$att=$login_search";
-			$result = @ldap_search($ldap_link, $ldap_base, $filter, array("dn"));
-			$info = @ldap_get_entries($ldap_link, $result);
+	// Si l'utilisateur figure deja dans la base, y recuperer les infos
+	$result = spip_query("SELECT * FROM spip_auteurs WHERE login=" . spip_abstract_quote($login) . " AND source='ldap'");
+
+	// sinon importer les infos depuis LDAP, 
+	// avec le statut par defaut a l'install
+	if (!spip_num_rows($result))
+		$result = auth_ldap_inserer($dn, $GLOBALS['meta']["ldap_statut_import"]);
+	return $result ? spip_fetch_array($result) : array(); 
+}
+
+function auth_ldap_search($login, $pass)
+{
+	global $ldap_link, $ldap_base;
+
+	// Attributs testes pour egalite avec le login
+	$atts = array('sAMAccountName', 'uid', 'login', 'userid', 'cn', 'sn');
+	$login_search = ereg_replace("[^-@._[:space:][:alnum:]]", "", $login); // securite
+
+	// Tenter une recherche pour essayer de retrouver le DN
+	reset($atts);
+	while (list(, $att) = each($atts)) {
+		$result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", array("dn"));
+		$info = @ldap_get_entries($ldap_link, $result);
 			// Ne pas accepter les resultats si plus d'une entree
 			// (on veut un attribut unique)
-			if (is_array($info) AND $info['count'] == 1) {
-				$dn = $info[0]['dn'];
-				if (@ldap_bind($ldap_link, $dn, $pass)) {
-					$this->user_dn = $dn;
-					$this->login = $login;
-					return true;
-				}
-			}
+		if (is_array($info) AND $info['count'] == 1) {
+			$dn = $info[0]['dn'];
+			if (@ldap_bind($ldap_link, $dn, $pass)) return $dn;
 		}
+	}
 
+	if (!isset($dn)) {
 		// Si echec, essayer de deviner le DN
 		reset($atts);
 		while (list(, $att) = each($atts)) {
-			$dn = "$att=$login_search, $ldap_base";
-			if (@ldap_bind($ldap_link, $dn, $pass)) {
-				$this->user_dn = $dn;
-				$this->login = $login;
-				return true;
-			}
+			if (@ldap_bind($ldap_link, $dn, $pass))
+				return "$att=$login_search, $ldap_base";
 		}
-		return false;
 	}
+	return '';
+}
 
-	function lire() {
-		global $ldap_link, $ldap_base;
-		$this->nom = $this->email = $this->pass = $this->statut = '';
-
-		if (!$this->login) return false;
-
-		// Si l'auteur existe dans la base, y recuperer les infos
-		$row = spip_fetch_array(spip_query("SELECT * FROM spip_auteurs WHERE login=" . spip_abstract_quote($this->login) . " AND source='ldap'"));
-
+function auth_ldap_inserer($dn, $statut)
+{
+	global $ldap_link, $ldap_base;
 
-		if ($row) {
-			$this->nom = $row['nom'];
-			$this->email = $row['email'];
-			$this->statut = $row['statut'];
-			$this->bio = $row['bio'];
-			return true;
-		}
+	// refuser d'importer n'importe qui 
+	if (!$statut) return false;
 
-		// Lire les infos sur l'auteur depuis LDAP
-		$result = @ldap_read($ldap_link, $this->user_dn, "objectClass=*", array("uid", "cn", "mail", "description"));
+	// Lire les infos sur l'utilisateur depuis LDAP
+	$result = @ldap_read($ldap_link, $dn, "objectClass=*", array("uid", "cn", "mail", "description"));
 		
-		// Si l'utilisateur ne peut lire ses infos, se reconnecter avec le compte principal
-		if (!$result) {
-			if (spip_connect_ldap())
-				$result = @ldap_read($ldap_link, $this->user_dn, "objectClass=*", array("uid", "cn", "mail", "description"));
-			else
-				return false;
-		}
-		if (!$result) return false;
-
-		// Recuperer les donnees de l'auteur
-		$info = @ldap_get_entries($ldap_link, $result);
-		if (!is_array($info)) return false;
-		for ($i = 0; $i < $info["count"]; $i++) {
-			$val = $info[$i];
-			if (is_array($val)) {
-				if (!$this->nom) $this->nom = $val['cn'][0];
-				if (!$this->email) $this->email = $val['mail'][0];
-				if (!$this->login) $this->login = $val['uid'][0];
-				if (!$this->bio) $this->bio = $val['description'][0];
-			}
+	// Si l'utilisateur ne peut lire ses infos, 
+	// se reconnecter avec le compte principal
+	if (!$result AND spip_connect_ldap())
+		$result = @ldap_read($ldap_link, $dn, "objectClass=*", array("uid", "cn", "mail", "description"));
+
+	if (!$result) return array();
+
+	    // Recuperer les donnees de l'auteur
+	$info = @ldap_get_entries($ldap_link, $result);
+	if (!is_array($info)) return array();
+	for ($i = 0; $i < $info["count"]; $i++) {
+		$val = $info[$i];
+		if (is_array($val)) {
+				if (!$nom) $nom = $val['cn'][0];
+				if (!$email) $email = $val['mail'][0];
+				if (!$login) $login = $val['uid'][0];
+				if (!$bio) $bio = $val['description'][0];
 		}
-
-		// Convertir depuis UTF-8 (jeu de caracteres par defaut)
-		include_spip('inc/charsets');
-		$this->nom = importer_charset($this->nom, 'utf-8');
-		$this->email = importer_charset($this->email, 'utf-8');
-		$this->login = importer_charset($this->login, 'utf-8');
-		$this->bio = importer_charset($this->bio, 'utf-8');
-
-		return true;
 	}
 
-	function activer() {
-		$login = strtolower(($this->login));
-		$statut = $GLOBALS['meta']["ldap_statut_import"];
-
-		if (!$statut) return false;
+	// Convertir depuis UTF-8 (jeu de caracteres par defaut)
+	include_spip('inc/charsets');
+	$nom = importer_charset($nom, 'utf-8');
+	$email = importer_charset($email, 'utf-8');
+	$bio = importer_charset($bio, 'utf-8');
+	$login = strtolower(importer_charset($login, 'utf-8'));
 
-		// Si l'auteur n'existe pas, l'inserer avec le statut par defaut (defini a l'install)
+	include_spip('base/abstract_sql');
+	$n = spip_abstract_insert('spip_auteurs', '(source, nom, login, email, bio, statut, pass)', "('ldap', " . spip_abstract_quote($nom) . ", " . spip_abstract_quote($login) . ", " . spip_abstract_quote($email) . ", " . spip_abstract_quote($bio) . ", " . spip_abstract_quote($statut) . ", '')");
 
-		$n = spip_num_rows(spip_query("SELECT id_auteur FROM spip_auteurs WHERE login=" . spip_abstract_quote($login)));
-		if ($n) return false;
-
-		$n = spip_query("INSERT IGNORE INTO spip_auteurs (source, nom, login, email, bio, statut, pass) VALUES ('ldap', " . spip_abstract_quote($this->nom) . ", " . spip_abstract_quote($login) . ", " . spip_abstract_quote($this->email) . ", " . spip_abstract_quote($this->bio) . ", '$statut', '')");
-		return $n;
-
-	}
+	return spip_query("SELECT * FROM spip_auteurs WHERE id_auteur=$n");
 }
 ?>
diff --git a/ecrire/inc/auth_spip.php b/ecrire/inc/auth_spip.php
index 42c7abc761a4a8121e846f697886fb9cb20c5cce..4deaf89ab81d9a0449b9c2e6c4fc5e2543908335 100644
--- a/ecrire/inc/auth_spip.php
+++ b/ecrire/inc/auth_spip.php
@@ -12,64 +12,44 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-class Auth_spip {
-	var $id_auteur, $nom, $login, $email, $md5pass, $md5next, $alea_futur, $statut, $bio;
+// Authentifie et retourne la ligne SQL decrivant l'utilisateur si ok
 
-	function init() {
-		return true;
-	}
+function inc_auth_spip_dist ($login, $pass) {
 
-	// Verification du mot passe crypte (javascript)
-	function verifier_challenge_md5($login, $mdpass_actuel, $mdpass_futur) {
-		// Interdire mot de passe vide
-		if ($mdpass_actuel == '') return false;
+  // recuperer le cryptage par JavaScript
+	$md5pass = $_POST['session_password_md5']; 
+	$md5next = $_POST['next_session_password_md5'];
 
-		$result = spip_query("SELECT * FROM spip_auteurs WHERE login=" . spip_abstract_quote($login) . " AND pass=" . spip_abstract_quote($mdpass_actuel) . " AND statut<>'5poubelle'");
+	  // si envoi non crypte, crypter maintenant
+	if (!$md5pass AND $pass) {
+			$result = spip_query("SELECT alea_actuel, alea_futur FROM spip_auteurs WHERE login=" . spip_abstract_quote($login));
 
-		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;
+			if ($row = spip_fetch_array($result)) {
+				$md5pass = md5($row['alea_actuel'] . $pass);
+				$md5next = md5($row['alea_futur'] . $pass);
+			}
 		}
-		return false;
-	}
+	// login inexistant ou mot de passe vide
+	if (!$md5pass) return array();
 
-	// Verification du mot passe en clair (sans javascript)
-	function verifier($login, $pass) {
-		// Interdire mot de passe vide
-		if ($pass == '') return false;
+	$result = spip_query("SELECT * FROM spip_auteurs WHERE login=" . spip_abstract_quote($login) . " AND pass=" . spip_abstract_quote($md5pass) . " AND statut<>'5poubelle'");
+	$row = spip_fetch_array($result);
 
-		$result = spip_query("SELECT alea_actuel, alea_futur FROM spip_auteurs WHERE login=" . spip_abstract_quote($login));
-
-		if ($row = spip_fetch_array($result)) {
-			$md5pass = md5($row['alea_actuel'] . $pass);
-			$md5next = md5($row['alea_futur'] . $pass);
-			return $this->verifier_challenge_md5($login, $md5pass, $md5next);
-		}
-		return false;
-	}
+	// login/mot de passe incorrect
+	if (!$row) return array(); 
 
-	function lire() {
-		return true;
+	if ($row['statut'] == 'nouveau') {
+		include_spip('inc/auth');
+		$row['statut'] = acces_statut($row['id_auteur'], $row['statut'], $row['bio']);
 	}
 
-	function activer() {
-		include_spip('inc/auth');
-		$this->statut = acces_statut($this->id_auteur, $this->statut, $this->bio);
-		if ($this->md5next) {
+	// fait tourner le codage du pass dans la base
+	if ($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 = " . spip_abstract_quote($this->md5next) . ", alea_futur = '$nouvel_alea_futur' WHERE id_auteur=" . $this->id_auteur);
+			@spip_query("UPDATE spip_auteurs SET alea_actuel = alea_futur, pass = " . spip_abstract_quote($md5next) . ", alea_futur = '" . creer_uniqid() ."' WHERE id_auteur=" . $row['id_auteur']);
 
-		}
 	}
+	return $row;
 }
 
 ?>