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; } ?>