You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
260 lines
7.7 KiB
PHP
260 lines
7.7 KiB
PHP
<?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
|
|
?>
|