alecpl
2011-05-20 3253b296c21c54df228de39ff3e4775974df81d5
program/include/rcube_ldap.php
@@ -49,6 +49,8 @@
    protected $mail_domain = '';
    protected $debug = false;
    private $base_dn = '';
    private $groups_base_dn = '';
    private $group_cache = array();
    private $group_members = array();
@@ -66,7 +68,7 @@
        $this->prop = $p;
        // check if groups are configured
        if (is_array($p['groups']))
        if (is_array($p['groups']) and count($p['groups']))
            $this->groups = true;
        // fieldmap property is given
@@ -125,8 +127,9 @@
        if (!function_exists('ldap_connect'))
            raise_error(array('code' => 100, 'type' => 'ldap',
            'file' => __FILE__, 'line' => __LINE__,
            'message' => "No ldap support in this installation of PHP"), true);
                'file' => __FILE__, 'line' => __LINE__,
                'message' => "No ldap support in this installation of PHP"),
                true, true);
        if (is_resource($this->conn))
            return true;
@@ -165,7 +168,7 @@
            $bind_pass = $this->prop['bind_pass'];
            $bind_user = $this->prop['bind_user'];
            $bind_dn   = $this->prop['bind_dn'];
            $base_dn   = $this->prop['base_dn'];
            $this->base_dn   = $this->prop['base_dn'];
            // User specific access, generate the proper values to use.
            if ($this->prop['user_specific']) {
@@ -202,7 +205,7 @@
                }
                // Replace the bind_dn and base_dn variables.
                $bind_dn   = strtr($bind_dn, $replaces);
                $base_dn   = strtr($base_dn, $replaces);
                $this->base_dn   = strtr($this->base_dn, $replaces);
                if (empty($bind_user)) {
                    $bind_user = $u;
@@ -249,11 +252,10 @@
        }
        if (!function_exists('ldap_sasl_bind')) {
            raise_error(array(
                'code' => 100, 'type' => 'ldap',
            raise_error(array('code' => 100, 'type' => 'ldap',
                'file' => __FILE__, 'line' => __LINE__,
                'message' => "Unable to bind: ldap_sasl_bind() not exists"),
            true, true);
                true, true);
        }
        if (!empty($authz)) {
@@ -308,11 +310,11 @@
        $this->_debug("S: ".ldap_error($this->conn));
        $error =  array(
                'code' => ldap_errno($this->conn), 'type' => 'ldap',
                'file' => __FILE__, 'line' => __LINE__,
                'message' => "Bind failed for dn=$dn: ".ldap_error($this->conn));
        raise_error($error,true);
        raise_error(array(
            'code' => ldap_errno($this->conn), 'type' => 'ldap',
            'file' => __FILE__, 'line' => __LINE__,
            'message' => "Bind failed for dn=$dn: ".ldap_error($this->conn)),
            true);
        return false;
    }
@@ -608,6 +610,26 @@
    /**
     * Check the given data before saving.
     * If input not valid, the message to display can be fetched using get_error()
     *
     * @param array Assoziative array with data to save
     * @return boolean True if input is valid, False if not.
     */
    public function validate($save_data)
    {
        // check for name input
        if (empty($save_data['name'])) {
            $this->set_error('warning', 'nonamewarning');
            return false;
        }
        // validate e-mail addresses
        return parent::validate($save_data);
    }
    /**
    * Create a new contact record
    *
    * @param array    Hash array with save data
@@ -644,7 +666,7 @@
        }
        // Build the new entries DN.
        $dn = $this->prop['LDAP_rdn'].'='.$this->_quote_string($newentry[$this->prop['LDAP_rdn']], true).','.$this->prop['base_dn'];
        $dn = $this->prop['LDAP_rdn'].'='.$this->_quote_string($newentry[$this->prop['LDAP_rdn']], true).','.$this->base_dn;
        $this->_debug("C: Add [dn: $dn]: ".print_r($newentry, true));
@@ -728,7 +750,7 @@
            if ($replacedata[$this->prop['LDAP_rdn']]) {
                $newdn = $this->prop['LDAP_rdn'].'='
                    .$this->_quote_string($replacedata[$this->prop['LDAP_rdn']], true)
                    .','.$this->prop['base_dn'];
                    .','.$this->base_dn;
                if ($dn != $newdn) {
                    $newrdn = $this->prop['LDAP_rdn'].'='
                    .$this->_quote_string($replacedata[$this->prop['LDAP_rdn']], true);
@@ -837,7 +859,7 @@
            $this->_debug("C: Search [".$filter."]");
            if ($this->ldap_result = @$function($this->conn, $this->prop['base_dn'], $filter,
            if ($this->ldap_result = @$function($this->conn, $this->base_dn, $filter,
                array_values($this->fieldmap), 0, (int) $this->prop['sizelimit'], (int) $this->prop['timelimit']))
            {
                $this->_debug("S: ".ldap_count_entries($this->conn, $this->ldap_result)." record(s)");
@@ -972,11 +994,27 @@
     */
    function list_groups($search = null)
    {
        global $RCMAIL;
        if (!$this->groups)
            return array();
        $base_dn = $this->prop['groups']['base_dn'];
        $filter = '(objectClass=groupOfNames)';
        $this->groups_base_dn = ($this->prop['groups']['base_dn']) ?
                $this->prop['groups']['base_dn'] : $this->base_dn;
        // replace user specific dn
        if ($this->prop['user_specific'])
        {
            $fu = $RCMAIL->user->get_username();
            list($u, $d) = explode('@', $fu);
            $dc = 'dc='.strtr($d, array('.' => ',dc='));
            $replaces = array('%dc' => $dc, '%d' => $d, '%fu' => $fu, '%u' => $u);
            $this->groups_base_dn = strtr($this->groups_base_dn, $replaces);;
        }
        $base_dn = $this->groups_base_dn;
        $filter = $this->prop['groups']['filter'];
        $res = ldap_search($this->conn, $base_dn, $filter, array('cn','member'));
        if ($res === false)
@@ -1015,12 +1053,12 @@
        if (!$this->group_cache)
            $this->list_groups();
        $base_dn = $this->prop['groups']['base_dn'];
        $base_dn = $this->groups_base_dn;
        $new_dn = "cn=$group_name,$base_dn";
        $new_gid = base64_encode($group_name);
        $new_entry = array(
            'objectClass' => array('top', 'groupOfNames'),
            'objectClass' => $this->prop['groups']['object_classes'],
            'cn' => $group_name,
            'member' => '',
        );
@@ -1046,7 +1084,7 @@
        if (!$this->group_cache)
            $this->list_groups();
        $base_dn = $this->prop['groups']['base_dn'];
        $base_dn = $this->groups_base_dn;
        $group_name = $this->group_cache[$group_id]['name'];
        $del_dn = "cn=$group_name,$base_dn";
@@ -1068,16 +1106,16 @@
     * @param string New group identifier (if changed, otherwise don't set)
     * @return boolean New name on success, false if no data was changed
     */
    function rename_group($group_id, $new_name, &$new_id)
    function rename_group($group_id, $new_name, &$new_gid)
    {
        if (!$this->group_cache)
            $this->list_groups();
        $base_dn = $this->prop['groups']['base_dn'];
        $base_dn = $this->groups_base_dn;
        $group_name = $this->group_cache[$group_id]['name'];
        $old_dn = "cn=$group_name,$base_dn";
        $new_rdn = "cn=$new_name";
        $new_id = base64_encode($new_rdn . ",$base_dn");
        $new_gid = base64_encode($new_name);
        $res = ldap_rename($this->conn, $old_dn, $new_rdn, NULL, TRUE);
        if ($res === false)
@@ -1101,7 +1139,7 @@
        if (!$this->group_cache)
            $this->list_groups();
        $base_dn = $this->prop['groups']['base_dn'];
        $base_dn = $this->groups_base_dn;
        $group_name = $this->group_cache[$group_id]['name'];
        $group_dn = "cn=$group_name,$base_dn";
@@ -1131,7 +1169,7 @@
        if (!$this->group_cache)
            $this->list_groups();
        $base_dn = $this->prop['groups']['base_dn'];
        $base_dn = $this->groups_base_dn;
        $group_name = $this->group_cache[$group_id]['name'];
        $group_dn = "cn=$group_name,$base_dn";
@@ -1162,7 +1200,7 @@
        if (!$this->groups)
            return array();
        $base_dn = $this->prop['groups']['base_dn'];
        $base_dn = $this->groups_base_dn;
        $contact_dn = base64_decode($contact_id);
        $filter = "(member=$contact_dn)";