function spip_connect_ldap($serveur = '') { include_spip('auth/ldap'); return auth_ldap_connect($serveur); }
/** * Fonction de modification du mot de passe * * On se bind au LDAP cette fois sous l'identite de l'utilisateur, car le * compte generique defini dans config/ldap.php n'a generalement pas (et * ne devrait pas avoir) les droits suffisants pour faire la modification. * @param $login * @param $new_pass * @param $id_auteur * @param string $serveur * @return bool * informe du succes ou de l'echec du changement du mot de passe */ function auth_ldap_modifier_pass($login, $new_pass, $id_auteur, $serveur = '') { if (is_null($new_pass) or auth_ldap_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') { return false; } if (!($ldap = auth_ldap_connect($serveur))) { return ''; } $link = $ldap['link']; include_spip("inc/session"); $dn = session_get('ldap_dn'); if ('' == $dn) { return false; } if (!ldap_bind($link, $dn, session_get('ldap_password'))) { return false; } $encoded_pass = "******" . base64_encode(pack("H*", md5($new_pass))); $success = ldap_mod_replace($link, $dn, array('userPassword' => $encoded_pass)); return $success; }
/** * Retrouver un login, et verifier son pass si demande par $checkpass * * @param string $login * @param sring $pass * @param bool $checkpass * @return string * le login trouve ou chaine vide si non trouve */ function auth_ldap_search($login, $pass, $checkpass=true, $serveur=''){ // Securite anti-injection et contre un serveur LDAP laxiste $login_search = preg_replace("/[^-@._\s\d\w]/", "", $login); if (!strlen($login_search) OR ($checkpass AND !strlen($pass)) ) return ''; // verifier la connexion if (!$ldap = auth_ldap_connect($serveur)) return ''; $ldap_link = $ldap['link']; $ldap_base = $ldap['base']; $desc = $ldap['attributes'] ? $ldap['attributes'] : $GLOBALS['ldap_attributes'] ; $logins = is_array($desc['login']) ? $desc['login'] : array($desc['login']); // Tenter une recherche pour essayer de retrouver le DN foreach($logins as $att) { $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 (!$checkpass) return $dn; if (@ldap_bind($ldap_link, $dn, $pass)) return $dn; } } if ($checkpass AND !isset($dn)) { // Si echec, essayer de deviner le DN foreach($logins as $att) { $dn = "$att=$login_search, $ldap_base"; if (@ldap_bind($ldap_link, $dn, $pass)) return "$att=$login_search, $ldap_base"; } } return ''; }