diff options
Diffstat (limited to 'program/include/rcube_ldap.inc')
-rw-r--r-- | program/include/rcube_ldap.inc | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/program/include/rcube_ldap.inc b/program/include/rcube_ldap.inc new file mode 100644 index 000000000..7cb9dee53 --- /dev/null +++ b/program/include/rcube_ldap.inc @@ -0,0 +1,259 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | program/include/rcube_ldap.inc | + | | + | This file is part of the RoundCube Webmail client | + | Copyright (C) 2005, RoundCube Dev. - Switzerland | + | Licensed under the GNU GPL | + | | + | PURPOSE: | + | Manage an LDAP connection | + | | + +-----------------------------------------------------------------------+ + | Author: Jeremy Jongsma <jeremy@jongsma.org> | + +-----------------------------------------------------------------------+ + + $Id$ + +*/ + +require_once("bugs.inc"); + +class rcube_ldap + { + var $conn; + var $host; + var $port; + var $protocol; + var $base_dn; + var $bind_dn; + var $bind_pass; + + // PHP 5 constructor + function __construct() + { + } + + // PHP 4 constructor + function rcube_ldap() + { + $this->__construct(); + } + + function connect($hosts, $port=389, $protocol=3) + { + if (!function_exists('ldap_connect')) + raise_error(array("type" => "ldap", + "message" => "No ldap support in this installation of php."), + TRUE); + + if (is_resource($this->conn)) + return TRUE; + + if (!is_array($hosts)) + $hosts = array($hosts); + + foreach ($hosts as $host) + { + if ($lc = @ldap_connect($host, $port)) + { + @ldap_set_option($lc, LDAP_OPT_PROTOCOL_VERSION, $protocol); + $this->host = $host; + $this->port = $port; + $this->protocol = $protocol; + $this->conn = $lc; + return TRUE; + } + } + + if (!is_resource($this->conn)) + raise_error(array("type" => "ldap", + "message" => "Could not connect to any LDAP server, tried $host:$port last"), + TRUE); + } + + function close() + { + if ($this->conn) + { + if (@ldap_unbind($this->conn)) + return TRUE; + else + raise_error(array("code" => ldap_errno($this->conn), + "type" => "ldap", + "message" => "Could not close connection to LDAP server: ".ldap_error($this->conn)), + TRUE); + } + return FALSE; + } + + // Merge with connect()? + function bind($dn=null, $pass=null) + { + if ($this->conn) + { + if ($dn) + if (@ldap_bind($this->conn, $dn, $pass)) + return TRUE; + else + raise_error(array("code" => ldap_errno($this->conn), + "type" => "ldap", + "message" => "Bind failed for dn=$dn: ".ldap_error($this->conn)), + TRUE); + else + if (@ldap_bind($this->conn)) + return TRUE; + else + raise_error(array("code" => ldap_errno($this->conn), + "type" => "ldap", + "message" => "Anonymous bind failed: ".ldap_error($this->conn)), + TRUE); + } + else + raise_error(array("type" => "ldap", + "message" => "Attempted bind on nonexistent connection"), TRUE); + return FALSE; + } + + function count($base, $filter=null, $attributes=null, $scope="sub") + { + if ($this->conn) + { + if ($scope === 'sub') + $sr = @ldap_search($this->conn, $base, $filter, $attributes, 0, $limit); + else if ($scope === 'one') + $sr = @ldap_list($this->conn, $base, $filter, $attributes, 0, $limit); + else if ($scope === 'base') + $sr = @ldap_read($this->conn, $base, $filter, $attributes, 0, $limit); + if ($sr) + return @ldap_count_entries($this->conn, $sr); + } + else + raise_error(array("type" => "ldap", + "message" => "Attempted count search on nonexistent connection"), TRUE); + return FALSE; + } + + function search($base, $filter=null, $attributes=null, $scope='sub', $sort=null, $limit=0) + { + if ($this->conn) + { + if ($scope === 'sub') + $sr = @ldap_search($this->conn, $base, $filter, $attributes, 0, $limit); + else if ($scope === 'one') + $sr = @ldap_list($this->conn, $base, $filter, $attributes, 0, $limit); + else if ($scope === 'base') + $sr = @ldap_read($this->conn, $base, $filter, $attributes, 0, $limit); + if ($sr) + { + if ($sort && $scope !== "base") + { + if (is_array($sort)) + { + // Start from the end so first sort field has highest priority + $sortfields = array_reverse($sort); + foreach ($sortfields as $sortfield) + @ldap_sort($this->conn, $sr, $sortfield); + } + else + @ldap_sort($this->conn, $sr, $sort); + } + return @ldap_get_entries($this->conn, $sr); + } + } + else + raise_error(array("type" => "ldap", + "message" => "Attempted search on nonexistent connection"), TRUE); + return FALSE; + } + + function add($dn, $object) + { + if ($this->conn) + { + if (@ldap_add($this->conn, $dn, $object)) + return TRUE; + else + raise_error(array("code" => ldap_errno($this->conn), + "type" => "ldap", + "message" => "Add object failed: ".ldap_error($this->conn)), + TRUE); + } + else + raise_error(array("type" => "ldap", + "message" => "Add object faile: no connection"), + TRUE); + return FALSE; + } + + function modify($dn, $object) + { + if ($this->conn) + { + if (@ldap_modify($this->conn, $dn, $object)) + return TRUE; + else + raise_error(array("code" => ldap_errno($this->conn), + "type" => "ldap", + "message" => "Modify object failed: ".ldap_error($this->conn)), + TRUE); + } + else + raise_error(array("type" => "ldap", + "message" => "Modify object failed: no connection"), + TRUE); + return FALSE; + } + + function rename($dn, $newrdn, $parentdn) + { + if ($this->protocol < 3) + { + raise_error(array("type" => "ldap", + "message" => "rename() support requires LDAPv3 or above "), + TRUE); + return FALSE; + } + + if ($this->conn) + { + if (@ldap_rename($this->conn, $dn, $newrdn, $parentdn, TRUE)) + return TRUE; + else + raise_error(array("code" => ldap_errno($this->conn), + "type" => "ldap", + "message" => "Rename object failed: ".ldap_error($this->conn)), + TRUE); + } + else + raise_error(array("type" => "ldap", + "message" => "Rename object failed: no connection"), + TRUE); + return FALSE; + } + + function delete($dn) + { + if ($this->conn) + { + if (@ldap_delete($this->conn, $dn)) + return TRUE; + else + raise_error(array("code" => ldap_errno($this->conn), + "type" => "ldap", + "message" => "Delete object failed: ".ldap_error($this->conn)), + TRUE); + } + else + raise_error(array("type" => "ldap", + "message" => "Delete object failed: no connection"), + TRUE); + return FALSE; + } + + } + +// vi: et ts=2 sw=2 +?> |