Skip to content
Extraits de code Groupes Projets
Valider f76b78e5 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

ajout des methodes retrouver_login et informer_login a l'api AUTH

lors de la verification, on ne verifie plus le login separement du mot de passe car certaines methodes ne peuvent retrouver que les deux ensemble
par ailleurs, cela renforce la securite en n'informant plus sur l'existence ou non d'un login (#1758)
de la meme facon, 
page=informer_auteur&var_login=xx
ne renvoie plus rien si le login n'existe pas (mais il faudrait encore ameliorer en envoyant un faux salt calcule selon le login)
parent fc99a576
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -42,8 +42,7 @@ function auth_ldap_dist ($login, $pass) {
}
// http://doc.spip.org/@auth_ldap_search
function auth_ldap_search($login, $pass)
{
function auth_ldap_search($login, $pass){
$ldap = spip_connect_ldap();
$ldap_link = $ldap['link'];
$ldap_base = $ldap['base'];
......@@ -124,4 +123,40 @@ function auth_ldap_inserer($dn, $statut, $login='', $desc='')
'bio' => $val['bio'],
'pass' => ''));
}
?>
/**
* Retrouver le login de quelqu'un qui cherche a se loger
*
* @param string $login
* @return string
*/
function auth_ldap_retrouver_login($login){
// Si l'utilisateur figure deja dans la base, y recuperer les infos
$result = sql_fetsel("*", "spip_auteurs", "login=" . sql_quote($login) . " AND source='ldap'");
$ldap = spip_connect_ldap();
$ldap_link = $ldap['link'];
$ldap_base = $ldap['base'];
// Attributs testes pour egalite avec le login
$atts = array('sAMAccountName', 'uid', 'login', 'userid', 'cn', 'sn');
$login_search = preg_replace("/[^-@._\s\d\w]/", "", $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'];
return $login;
}
}
// sans le mot de passe, on ne peut faire de devinettes
return '';
}
?>
\ No newline at end of file
......@@ -15,6 +15,9 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
// Authentifie et retourne la ligne SQL decrivant l'utilisateur si ok
function auth_spip_dist ($login, $pass, $md5pass="", $md5next="") {
// retrouver le login
$login = auth_spip_retrouver_login($login);
// si envoi non crypte, crypter maintenant
if (!$md5pass AND $pass) {
$row = sql_fetsel("alea_actuel, alea_futur", "spip_auteurs", "login=" . sql_quote($login));
......@@ -109,6 +112,31 @@ function auth_spip_modifier_login($new_login,$id_auteur){
return true;
}
/**
* Retrouver le login de quelqu'un qui cherche a se loger
* Reconnaitre aussi ceux qui donnent leur nom ou email au lieu du login
*
* @param string $login
* @return string
*/
function auth_spip_retrouver_login($login){
$l = sql_quote($login);
if ($r = sql_getfetsel('login', 'spip_auteurs',
"statut<>'5poubelle'" .
" AND (length(pass)>0)" .
" AND (login=$l)"))
return $r;
// Si pas d'auteur avec ce login
// regarder s'il a saisi son nom ou son mail.
// Ne pas fusionner avec la requete precedente
// car un nom peut etre homonyme d'un autre login
else return sql_getfetsel('login', 'spip_auteurs',
"statut<>'5poubelle'" .
" AND (length(pass)>0)" .
" AND (login<>'' AND (nom=$l OR email=$l))");
}
/**
* Informer du droit de modifier ou non le pass
* @return bool
......
......@@ -319,11 +319,76 @@ function auth_administrer($fonction,$args,$defaut=false){
* API Authentification, gestion des identites centralisees
*/
// Essayer les differentes sources d'authenfication dans l'ordre specifie.
// S'en souvenir dans visiteur_session['auth']
/**
* Retrouver le login interne lie a une info login saisie
* la saisie peut correspondre a un login delegue
* qui sera alors converti en login interne apres verification
*
* @param string $login
* @return string/bool
*/
function auth_retrouver_login($login){
if (!spip_connect()) {
include_spip('inc/minipres');
echo minipres(_T('info_travaux_titre'),
_T('titre_probleme_technique'));
exit;
}
foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
if ($auteur = auth_administrer('retrouver_login',array($methode,$login))) {
return $auteur;
}
}
return false;
}
/**
* informer sur un login
* Ce dernier transmet le tableau ci-dessous a la fonction JS informer_auteur
* Il est invoque par la fonction JS actualise_auteur via la globale JS
* page_auteur=#URL_PAGE{informer_auteur} dans le squelette login
* N'y aurait-il pas plus simple ?
*
* @param string $login
* @return array
*/
function auth_informer_login($login){
if (!$login
OR !$login = auth_retrouver_login($login)
OR !$row = sql_fetsel('id_auteur,login,alea_actuel,alea_futur,prefs,source,login','spip_auteurs','login='.sql_quote($login))
)
return array();
// desactiver le hash md5 si pas auteur spip ?
if ($row['source']!=='spip'){
$row['alea_actuel']= '';
$row['alea_futur']= '';
}
$prefs = unserialize($row['prefs']);
$row['cnx'] = ($prefs['cnx'] == 'perma') ? '1' : '0';
$row['logo'] = recuperer_fond('formulaires/inc-logo_auteur', $row);
unset($row['prefs']);
unset($row['source']);
verifier_visiteur();
return $row;
}
/**
* Essayer les differentes sources d'authenfication dans l'ordre specifie.
* S'en souvenir dans visiteur_session['auth']
*
* @param string $login
* @param string $password
* @param string $md5pass
* @param string $md5next
* @return mixed
*/
function auth_identifier_login($login, $password, $md5pass="", $md5next=""){
foreach ($GLOBALS['liste_des_authentifications'] as $methode) {
if ($auth = charger_fonction($methode, 'auth')
if ($auth = charger_fonction($methode, 'auth',true)
AND $auteur = $auth($login, $password, $md5pass, $md5next)) {
spip_log("connexion de $login par methode $methode");
$auteur['auth'] = $methode;
......
......@@ -28,9 +28,10 @@ function formulaires_login_charger_dist($cible="",$login="",$prive=null)
if (isset($_COOKIE['spip_admin'])
AND preg_match(",^@(.*)$,", $_COOKIE['spip_admin'], $regs))
$login = $regs[1];
}
}
$row = informer_login($login);
include_spip('inc/auth');
$row = auth_informer_login($login);
// Construire l'environnement du squelette
// Ne pas proposer de "rester connecte quelques jours"
......@@ -79,30 +80,6 @@ function formulaires_login_charger_dist($cible="",$login="",$prive=null)
return $valeurs;
}
// Cette fonction sert a 2 squelettes: login et informer_auteur
// Ce dernier transmet le tableau ci-dessous a la fonction JS informer_auteur
// Il est invoque par la fonction JS actualise_auteur via la globale JS
// page_auteur=#URL_PAGE{informer_auteur} dans le squelette login
// N'y aurait-il pas plus simple ?
// http://doc.spip.org/@informer_login
function informer_login($login){
if (!$login) return array();
$row = retrouver_login($login);
if (!$row) return array();
// desactiver le hash md5 si pas auteur spip ?
if ($row['source']!=='spip'){
$row['alea_actuel']= '';
$row['alea_futur']= '';
}
$prefs = unserialize($row['prefs']);
$row['cnx'] = ($prefs['cnx'] == 'perma') ? '1' : '0';
$row['logo'] = recuperer_fond('formulaires/inc-logo_auteur', $row);
unset($row['prefs']);
unset($row['source']);
verifier_visiteur();
return $row;
}
// Gerer le cas ou un utilisateur ne souhaite pas de cookie
// on propose alors un formulaire pour s'authentifier via http
......@@ -136,21 +113,12 @@ function formulaires_login_verifier_dist($cible="",$login="",$prive=null){
_T('login_identifiant_inconnu',
array('login' => htmlspecialchars($login))));
}
$row = retrouver_login($session_login);
if ($row)
$login = $row['login'];
elseif (spip_connect_ldap())
$login = $session_login; // laisser une chance
else {
include_spip('inc/cookie');
spip_setcookie("spip_admin", "", time() - 3600);
return array('message_erreur' =>
_T('login_identifiant_inconnu',
array('login' => htmlspecialchars($session_login))));
}
include_spip('inc/auth');
$auteur = auth_identifier_login($login, $session_password, $session_md5pass, $session_md5next);
$auteur = auth_identifier_login($session_login, $session_password, $session_md5pass, $session_md5next);
if (!$auteur) {
include_spip('inc/cookie');
spip_setcookie("spip_admin", "", time() - 3600);
if (strlen($session_password) OR strlen($session_md5pass))
return array('password' => _T('login_erreur_pass'));
// sinon c'est un login en deux passe old style (ou js en panne)
......@@ -229,32 +197,4 @@ function formulaires_login_traiter_dist($cible="",$login="",$prive=null){
return $res;
}
// Reconnaitre aussi ceux qui donnent leur nom ou email au lieu du login
function retrouver_login($login)
{
if (!spip_connect()) {
include_spip('inc/minipres');
echo minipres(_T('info_travaux_titre'),
_T('titre_probleme_technique'));
exit;
}
$l = sql_quote($login);
$sel = 'id_auteur,login,alea_actuel,alea_futur,prefs,source,login';
if ($r = sql_fetsel($sel, 'spip_auteurs',
"statut<>'5poubelle'" .
" AND (length(pass)>0 OR source<>'spip')" .
" AND (login=$l)"))
return $r;
// Si pas d'auteur avec ce login
// regarder s'il a saisi son nom ou son mail.
// Ne pas fusionner avec la requete precedente
// car un nom peut etre homonyme d'un autre login
else return sql_fetsel($sel, 'spip_auteurs',
"statut<>'5poubelle'" .
" AND (length(pass)>0 OR source<>'spip')" .
" AND (login<>'' AND (nom=$l OR email=$l))");
}
?>
\ No newline at end of file
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter