<?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);
}
}
|