array('sAMAccountName', 'uid', 'login', 'userid', 'cn','sn'), 'nom' => "cn", 'email' => "mail", 'bio' => "description"); // http://doc.spip.org/@inc_auth_ldap_dist function auth_ldap_dist ($login, $pass, $serveur='') { #spip_log("ldap $login " . ($pass ? "mdp fourni" : "mdp absent")); // Utilisateur connu ? // si http auth, inutile de reauthentifier: cela // ne marchera pas avec auth http autre que basic. $checkpass = isset($_SERVER["REMOTE_USER"])?false:true; if (!($dn = auth_ldap_search($login, $pass, $checkpass, $serveur))) return array(); // Si l'utilisateur figure deja dans la base, y recuperer les infos $r = sql_fetsel("*", "spip_auteurs", "login=" . sql_quote($login) . " AND source='ldap'",'','','','',$serveur); if ($r) return $r; // sinon importer les infos depuis LDAP, if ($GLOBALS['meta']["ldap_statut_import"] AND $desc = auth_ldap_retrouver($dn, array(), $serveur)) { // rajouter le statut indique a l'install $desc['statut'] = $GLOBALS['meta']["ldap_statut_import"]; $desc['login'] = $login; $desc['source'] = 'ldap'; $desc['pass'] = ''; $r = sql_insertq('spip_auteurs', $desc,'',$serveur); } if ($r) return sql_fetsel("*", "spip_auteurs", "id_auteur=".intval($r),'','','','',$serveur); // sinon echec spip_log("Creation de l'auteur '$login' impossible"); return array(); } /** * Connexion a l'annuaire LDAP * Il faut passer par spip_connect() pour avoir les info * donc potentiellement indiquer un serveur * meme si dans les fait cet argument est toujours vide * * @param string $serveur * @return string */ function auth_ldap_connect($serveur='') { include_spip('base/connect_sql'); static $connexions_ldap = array(); if (isset($connexions_ldap[$serveur])) return $connexions_ldap[$serveur]; $connexion = spip_connect($serveur); if (!is_array($connexion['ldap'])) { if ($connexion['authentification']['ldap']) { $f = _DIR_CONNECT . $connexion['authentification']['ldap']; unset($GLOBALS['ldap_link']); if (is_readable($f)) include_once($f); if (isset($GLOBALS['ldap_link'])) $connexion['ldap'] = array('link' => $GLOBALS['ldap_link'], 'base' => $GLOBALS['ldap_base']); else spip_log("connection LDAP $serveur mal definie dans $f"); if (isset($GLOBALS['ldap_champs'])) $connexion['ldap']['attributes'] = $GLOBALS['ldap_champs']; } else spip_log("connection LDAP $serveur inconnue"); } return $connexions_ldap[$serveur]=$connexion['ldap']; } /** * 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 ''; } function auth_ldap_retrouver($dn, $desc=array(), $serveur='') { // Lire les infos sur l'utilisateur a partir de son DN depuis LDAP if (!$ldap = spip_connect_ldap($serveur)) { spip_log("ldap $serveur injoignable"); return array(); } $ldap_link = $ldap['link']; if (!$desc) { $desc = $ldap['attributes'] ? $ldap['attributes'] : $GLOBALS['ldap_attributes'] ; unset($desc['login']); } $result = @ldap_read($ldap_link, $dn, "objectClass=*", array_values($desc)); if (!$result) return array(); // Recuperer les donnees du premier (unique?) compte de l'auteur $val = @ldap_get_entries($ldap_link, $result); if (!is_array($val) OR !is_array($val[0])) return array(); $val = $val[0]; // Convertir depuis UTF-8 (jeu de caracteres par defaut) include_spip('inc/charsets'); foreach ($desc as $k => $v) $desc[$k] = importer_charset($val[strtolower($v)][0], 'utf-8'); return $desc; } /** * Retrouver le login de quelqu'un qui cherche a se loger * * @param string $login * @return string */ function auth_ldap_retrouver_login($login, $serveur='') { return auth_ldap_search($login, '', false, $serveur) ? $login : ''; } ?>