<?php /** * SimpleLDAP * * An abstraction layer for LDAP server communication using PHP * * @author Klaus Silveira <contact@klaussilveira.com> * @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); } }
|