diff --git a/ecrire/inc_auth_spip.php3 b/ecrire/inc_auth_spip.php3
index 6e49cb14028076bd973b486f47f4d2a12316a836..7f50d53711e74b52bd341e08a840360af44c033d 100644
--- a/ecrire/inc_auth_spip.php3
+++ b/ecrire/inc_auth_spip.php3
@@ -12,8 +12,12 @@ class Auth_spip {
 		return true;
 	}
 
+	// Verification du mot passe crypte (javascript)
 	function verifier_challenge_md5($login, $mdpass_actuel, $mdpass_futur) {
-		$query = "SELECT * FROM spip_auteurs WHERE login='".addslashes($login)."' AND pass='".addslashes($mdpass_actuel)."' AND statut<>'5poubelle' AND source='spip'";
+		// Interdire mot de passe vide
+		if ($mdpass_actuel == '') return false;
+
+		$query = "SELECT * FROM spip_auteurs WHERE login='".addslashes($login)."' AND pass='".addslashes($mdpass_actuel)."' AND statut<>'5poubelle'";
 		$result = spip_query($query);
 
 		if ($row = spip_fetch_array($result)) {
@@ -28,7 +32,18 @@ class Auth_spip {
 		return false;
 	}
 
+	// Verification du mot passe en clair (sans javascript)
 	function verifier($login, $pass) {
+		// Interdire mot de passe vide
+		if ($pass == '') return false;
+
+		$query = "SELECT alea_actuel, alea_futur FROM spip_auteurs WHERE login='".addslashes($login)."'";
+		$result = spip_query($query);
+		if ($row = spip_fetch_array($result)) {
+			$md5pass = md5($row['alea_actuel'] . $session_password);
+			$md5next = md5($row['alea_futur'] . $session_password);
+			return verifier_challenge_md5($login, $md5pass, $md5next);
+		}
 		return false;
 	}
 
diff --git a/inc-login.php3 b/inc-login.php3
index 93152d733e7c8be7a6cac4d7acd419952d5597d1..7fae32a447fce979331c31d2e218d45d43a2d9bd 100644
--- a/inc-login.php3
+++ b/inc-login.php3
@@ -108,21 +108,36 @@ function login($cible = '', $prive = 'prive', $message_login='') {
 
 	$flag_autres_sources = $GLOBALS['ldap_present'];
 
-	// quels sont les aleas a passer ?
 	if ($login) {
+		$statut_login = 0; // statut inconnu
 		$login = addslashes($login);
-		$query = "SELECT * FROM spip_auteurs WHERE login='$login' AND statut!='5poubelle'";
+		$query = "SELECT * FROM spip_auteurs WHERE login='$login'";
 		$result = spip_query($query);
 		if ($row = spip_fetch_array($result)) {
-			$id_auteur = $row['id_auteur'];
-			$source_auteur = $row['source'];
-			$alea_actuel = $row['alea_actuel'];
-			$alea_futur = $row['alea_futur'];
-			if ($row['prefs']) {
-				$prefs = unserialize($row['prefs']);
-				$rester_checked = ($prefs['cnx'] == 'perma' ? ' checked':'');
+			if ($row['statut'] == '5poubelle' OR $row['pass'] == '') {
+				$statut_login = -1; // refus
+			} else {
+
+				$statut_login = 1; // login connu
+
+				// Quels sont les aleas a passer pour le javascript ?
+				if ($row['source'] == 'spip') {
+					$id_auteur = $row['id_auteur'];
+					$source_auteur = $row['source'];
+					$alea_actuel = $row['alea_actuel'];
+					$alea_futur = $row['alea_futur'];
+				}
+
+				// Bouton duree de connexion
+				if ($row['prefs']) {
+					$prefs = unserialize($row['prefs']);
+					$rester_checked = ($prefs['cnx'] == 'perma' ? ' checked':'');
+				}
 			}
-		} else if (!$flag_autres_sources) {
+		}
+
+		// login inconnu (sauf LDAP) ou refuse
+		if ($statut_login == -1 OR ($statut_login == 0 AND !$flag_autres_sources)) {
 			$erreur = _T('login_identifiant_inconnu', array('login' => htmlspecialchars($login)));
 			$login = '';
 			@spip_setcookie("spip_admin", "", time() - 3600);
diff --git a/spip_cookie.php3 b/spip_cookie.php3
index 78f9fa5af17fad6def94a4f6e689095708051315..ee06baab87e09a3e98482ac07d17b9def8661cd3 100644
--- a/spip_cookie.php3
+++ b/spip_cookie.php3
@@ -92,20 +92,6 @@ if ($essai_login == "oui") {
 	$login = $session_login;
 	$pass = $session_password;
 
-	// Recuperer le mot de passe en champ hidden
-	if ($session_password_md5) { // mot passe en md5
-		$md5pass = $session_password_md5;
-		$md5next = $next_session_password_md5;
-	}
-	else if ($session_password) { // mot passe en clair
-		$query = "SELECT alea_actuel, alea_futur FROM spip_auteurs WHERE login='".addslashes($login)."' AND statut!='5poubelle'";
-		$result = spip_query($query);
-		if ($row = spip_fetch_array($result)) {
-			$md5pass = md5($row['alea_actuel'] . $session_password);
-			$md5next = md5($row['alea_futur'] . $session_password);
-		}
-	}
-
 	// Essayer differentes methodes d'authentification
 	$auths = array('spip');
 	if ($ldap_present) $auths[] = 'ldap';
@@ -117,7 +103,9 @@ if ($essai_login == "oui") {
 		$classe_auth = "Auth_".$nom_auth;
 		$auth = new $classe_auth;
 		if ($auth->init()) {
-			$ok = $auth->verifier_challenge_md5($login, $md5pass, $md5next);
+			// 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) break;
diff --git a/spip_pass.php3 b/spip_pass.php3
index 7f17fc6fb318db73e51ef73e6bac9831e8e233df..5f0b6ad1462f0db96ccac4abafe948dd917d6107 100644
--- a/spip_pass.php3
+++ b/spip_pass.php3
@@ -55,7 +55,7 @@ if ($email_oubli) {
 		$email = addslashes($email_oubli);
 		$res = spip_query("SELECT * FROM spip_auteurs WHERE email ='$email'");
 		if ($row = spip_fetch_array($res)) {
-			if ($row['statut'] == '5poubelle')
+			if ($row['statut'] == '5poubelle' OR $row['pass'] == '')
 				$erreur = _T('pass_erreur_acces_refuse');
 			else {
 				$cookie = creer_uniqid();