<?php 
/** 
 * SimpleLDAP 
 * 
 * An abstraction layer for LDAP server communication using PHP 
 * 
 * @author Klaus Silveira <[email protected]> 
 * @package simpleldap 
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License 
 * @version 0.1 
 * @link http://github.com/klaussilveira/SimpleLDAP 
 */ 
class SimpleLDAP { 
     
    /** 
     * Holds the LDAP server connection 
     * 
     * @var resource 
     * @access private 
     */ 
    private $ldap; 
     
    /** 
     * Holds the default Distinguished Name. Ex.: ou=users,dc=demo,dc=com 
     * 
     * @var string 
     * @access public 
     */ 
    public $dn; 
     
    /** 
     * Holds the administrator-priviledge Distinguished Name and user. Ex.: cn=admin,dc=demo,dc=com 
     * 
     * @var string 
     * @access public 
     */ 
    public $adn; 
     
    /** 
     * Holds the administrator-priviledge user password. Ex.: 123456 
     * 
     * @var string 
     * @access public 
     */ 
    public $apass; 
     
    /** 
     * LDAP server connection 
     * 
     * In the constructor we initiate a connection with the specified LDAP server  
     * and optionally allow the setup of LDAP protocol version 
     * 
     * @access public 
     * @param string $hostname Hostname of your LDAP server 
     * @param int $port Port of your LDAP server 
     * @param int $protocol (optional) Protocol version of your LDAP server 
     */ 
    public function __construct($hostname, $port, $protocol = null) { 
        $this->ldap = ldap_connect($hostname, $port); 
         
        if($protocol != null) { 
            ldap_set_option($this->ldap, LDAP_OPT_PROTOCOL_VERSION, $protocol); 
        } 
    } 
     
    /** 
     * Bind as an administrator in the LDAP server 
     * 
     * Bind as an administrator in order to execute admin-only tasks, 
     * such as add, modify and delete users from the directory. 
     * 
     * @access private 
     * @return bool Returns if the bind was successful or not 
     */ 
    private function adminBind() { 
        $bind = ldap_bind($this->ldap, $this->adn, $this->apass); 
        return $bind; 
    } 
     
    /** 
     * Authenticate an user and return it's information 
     * 
     * In this method we authenticate an user in the LDAP server with the specified username and password 
     * If successful, we return the user information. Otherwise, we'll return false and throw exceptions with error information 
     * 
     * @access public 
     * @param string $user Username to be authenticated 
     * @param string $password Password to be authenticated 
     * @return mixed User information, as an array, on successful authentication, false on error 
     */ 
    public function auth($user, $password) { 
        /** 
         * We bind using the provided information in order to check if the user exists 
         * in the directory and his credentials are valid 
         */ 
        $bind = ldap_bind($this->ldap, "uid=$user," . $this->dn, $password); 
         
        if($bind) { 
         
            /** 
             * If the user is logged in, we bind as an administrator and search the directory 
             * for the user information. If successful, we'll return that information as an array 
             */ 
            if($this->adminBind()) { 
                $search = ldap_search($this->ldap, "uid=$user," . $this->dn, "(uid=$user)"); 
                 
                if(!$search) { 
                    $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
                    throw new Exception($error); 
                } 
                 
                $data = ldap_get_entries($this->ldap, $search); 
                 
                if(!$data) { 
                    $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
                    throw new Exception($error); 
                } 
                 
                return $data; 
            } else { 
                $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
                throw new Exception($error); 
                return false; 
            } 
        } else { 
            $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
            throw new Exception($error); 
            return false; 
        } 
    } 
     
    /** 
     * Get users based on a query 
     * 
     * Returns information from users within the directory that match a certain query 
     * 
     * @access public 
     * @param string $filter The search filter used to query the directory. For more info, see: http://www.mozilla.org/directory/csdk-docs/filter.htm 
     * @param array $attributes (optional) An array containing all the attributes you want to request 
     * @return mixed Returns the information if successful or false on error 
     */ 
    public function getUsers($filter, $attributes = null) { 
        if($this->adminBind()) { 
            if($attributes !== null) { 
                $search = ldap_search($this->ldap, $this->dn, $filter, $attributes); 
                if(!$search) { 
                    $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
                    throw new Exception($error); 
                    return false; 
                } 
                $data = ldap_get_entries($this->ldap, $search); 
                return $data; 
            } else { 
                $search = ldap_search($this->ldap, $this->dn, $filter); 
                if(!$search) { 
                    $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
                    throw new Exception($error); 
                    return false; 
                } 
                $data = ldap_get_entries($this->ldap, $search); 
                return $data; 
            } 
        } else { 
            $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
            throw new Exception($error); 
            return false; 
        } 
    } 
     
    /** 
     * Inserts a new user in LDAP 
     * 
     * This method will take an array of information and create a new entry in the  
     * LDAP directory using that information. 
     * 
     * @access public 
     * @param string $uid Username that will be created 
     * @param array $data Array of user information to be inserted 
     * @return bool Returns true on success and false on error 
     */ 
    public function addUser($user, $data) { 
        if($this->adminBind()) { 
            $add = ldap_add($this->ldap, "uid=$user," . $this->dn, $data); 
            if(!$add) { 
                $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
                throw new Exception($error); 
                return false; 
            } else { 
                return true; 
            } 
        } else { 
            $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
            throw new Exception($error); 
            return false; 
        } 
    } 
     
    /** 
     * Removes an existing user in LDAP 
     * 
     * This method will remove an existing user from the LDAP directory 
     * 
     * @access public 
     * @param string $uid Username that will be removed 
     * @return bool Returns true on success and false on error 
     */ 
    public function removeUser($user) { 
        if($this->adminBind()) { 
            $delete = ldap_delete($this->ldap, "uid=$user," . $this->dn); 
            if(!$delete) { 
                $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
                throw new Exception($error); 
                return false; 
            } else { 
                return true; 
            } 
        } else { 
            $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
            throw new Exception($error); 
            return false; 
        } 
    } 
     
    /** 
     * Modifies an existing user in LDAP 
     * 
     * This method will take an array of information and modify an existing entry  
     * in the LDAP directory using that information. 
     * 
     * @access public 
     * @param string $uid Username that will be modified 
     * @param array $data Array of user information to be modified 
     * @return bool Returns true on success and false on error 
     */ 
    public function modifyUser($user, $data) { 
        if($this->adminBind()) { 
            $modify = ldap_modify($this->ldap, "uid=$user," . $this->dn, $data); 
            if(!$modify) { 
                $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
                throw new Exception($error); 
                return false; 
            } else { 
                return true; 
            } 
        } else { 
            $error = ldap_errno($this->ldap) . ": " . ldap_error($this->ldap); 
            throw new Exception($error); 
            return false; 
        } 
    } 
     
    /** 
     * Close the LDAP connection 
     * 
     * @access public 
     */ 
    public function close() { 
        ldap_close($this->ldap); 
    } 
} 
 
 |