Classe LDAP pour la plateforme

Cette classe PHP nous servira pour le différente opération à effectuer sur le serveur LDAP.



Constantes

⇒ Contient le nom du fichier de configuration

Méthodes

Privées

⇒ Retourne le fichier ldapConf en array

⇒ Établie la connexion au serveur LDAP et retour le flux stream

⇒ Détruit la connexion stream au serveur LDAP

Publiques

⇒ Hash le mot de passe passwd

⇒ Met à jour le mot de passe passwd d'un utilisateur user.

⇒ Authentifie l'utilisateur user avec son mot de passe passwd

⇒ Retourne Un tableau contenant les information concernant l'utilisateur user

Le fichier de configuration ldap.conf:

[ldap.conf]
host   = "ldap.mdl29"
port   = "389"
basedn = "ou=Users,dc=mdl29,dc=net"
binddn = "cn=admin,dc=mdl29,dc=net"
bindpw = "xxxxxxx"
userAttr = "uid"

La classe ldap.class.php:

<?php
require_once "Net/LDAP2.php";
class ldap{
 
    const ldapConf = "ldap.conf";
 
    private static function getConf(){
        //Retourne le contenue du fichier de configuration en arrray
        return parse_ini_file(self::ldapConf);
    }
 
    public static function passwdHash($passwd){
        //Retourne $passwd haché
        return "{SHA}".base64_encode(pack("H*",sha1($passwd)));
    }
 
    private static function connect(){
        //On se connecte, en prenant comme argument le contenu du fichier ldap.conf
        $stream = Net_LDAP2::connect(self::getConf());
        //On verifie qu'il n'y ai pas d'erreur
        if (PEAR::isError($stream)) {
            //Si oui, on le dit
            die("Impossible de se connecter au serveur LDAP: ".$ldap->getMessage());
            //On retourne une valeur négative
            return false;
            //On quitte la fonction
            exit;
        }else{
            //Si tout ce passe bien, on retourne la variable d'accès au LDAP
            return $stream;
        }
 
    }
 
    private static function unConnect($stream){
        //Se déconnecte du LDAP
        $stream->done();
        //Retourne une valeur positive
        return true;
    }
 
    public static function updatePasswd($user, $passwd){
        //On se connecte au LDAP
        $stream = self::connect();
        //On definie le dn de l'utilisateur
        $dn = $conf["userAttr"]."=".$user.",".$conf["basedn"];
        //On récupère juste le password de l'utilisateur
            $user =& $stream->getEntry($dn, array("userPassword"));  
        //On met a jour localement
        $user->replace(
            array(
                "userPassword" => self::passwdHash($passwd) //On hache le mot de passe
            )
        );
        //Puis on met a jour notre LDAP
        $user->update();
        //On verifie qu'il n'y ai pas d'erreur
        if(PEAR::isError($user)){
            //Si oui on se déconnecte
            self::unConnect($ldap);
            //On le dit
            die("Impossible de mettre le mot de passe ajour dans le serveur LDAP: ".$user->getMessage());
            //On retourne une valeur négative
            return false;
            //On quitte la fonction
            exit;
        }else{
            //Si tout c'est bien possé, on retourne une valeur possitive
            return true;
            //Enfin, on ferme la connexion
            self::unConnect($ldap);
        }
    }
 
    public static function userBind($user,$passwd){
        //On se connecte au LDAP
        $stream = self::connect();
        //On récupère la configuration
        $conf = self::getConf();
        //On definie le dn de l'utilisateur
        $dn = $conf["userAttr"]."=".$user.",".$conf["basedn"];
        //On voie si l'utilisateur existe
        if($stream->dnExists($dn)){
            //Si oui, on récupère son mot de passe dans le LDAP
            $user =& $stream->getEntry($dn, array("userPassword"));
            //On le compare avec celui envoyé en argument a la fonction
            if($user->getValue("userPassword","single") == self::passwdHash($passwd)){
                //Si c'est bon, on se déconnecte du LDAP
                self::unConnect($stream);
                //On, retourne une valeur positive
                return true;
            }else{
                //Sinon, on se deconnecte
                self::unConnect($stream);
                //On retourne une valeur négative
                return false;
            }
        }else{
            //Si l'utilisateur n'existe pas, on se déconnecte du LDAP
            self::unConnect($stream);
            //On retourne une valeur négative
            return false;
        }
    }
 
    public static function getUserInfo($user){
        //On se connecte au LDAP
        $stream = self::connect();
        //On récupère la configuration
        $conf = self::getConf();
        //On definie le dn de l'utilisateur
        $dn = $conf["userAttr"]."=".$user.",".$conf["basedn"];
        //On voie si l'utilisateur existe
        if($stream->dnExists($dn)){
            //Si oui, on récupère les informations le concernant dans le LDAP
            $user =& $stream->getEntry($dn, array("cn", "mail", "sn", "displayName", "givenName","initials"));
            //On retourne un tableau avec les infos
            return array(
                "cn" => $user->getValue("cn","single"),
                "mail" => $user->getValue("mail","single"),
                "sn" => $user->getValue("sn","single"),
                "displayName" => $user->getValue("displayName","single"),
                "givenName" => $user->getValue("givenName","single"),
                "initials" => $user->getValue("initials","single")
            );
            //On se deconnecte du serveur LDAP
            self::unConnect($stream);
        }else{
            //Si l'utilisateur n'existe pas, on se déconnecte du LDAP
            self::unConnect($stream);
            //On retourne une valeur négative
            return false;
        }
    }
}
?>