Thomas
2013-10-21 4af76d20cafcd456bf3ce0fcb17b25a888c45160
program/lib/Roundcube/rcube_ldap.php
@@ -871,6 +871,8 @@
        // add required (non empty) fields filter
        $req_filter = '';
        foreach ((array)$required as $field) {
            if (in_array($field, (array)$fields))  // required field is already in search filter
                continue;
            if ($attrs = $this->_map_field($field)) {
                if (count($attrs) > 1)
                    $req_filter .= '(|';
@@ -1403,13 +1405,15 @@
        foreach ((array)$this->prop['autovalues'] as $lf => $templ) {
            if (empty($attrs[$lf])) {
                // replace {attr} placeholders with concrete attribute values
                $templ = preg_replace('/\{\w+\}/', '', strtr($templ, $attrvals));
                if (strpos($templ, '(') !== false)
                    $attrs[$lf] = eval("return ($templ);");
                else
                    $attrs[$lf] = $templ;
                if (strpos($templ, '(') !== false) {
                    // replace {attr} placeholders with (escaped!) attribute values to be safely eval'd
                    $code = preg_replace('/\{\w+\}/', '', strtr($templ, array_map('addslashes', $attrvals)));
                    $attrs[$lf] = eval("return ($code);");
                }
                else {
                    // replace {attr} placeholders with concrete attribute values
                    $attrs[$lf] = preg_replace('/\{\w+\}/', '', strtr($templ, $attrvals));
                }
            }
        }
    }
@@ -1715,9 +1719,14 @@
     * List all active contact groups of this source
     *
     * @param string  Optional search string to match group name
     * @param int     Matching mode:
     *                0 - partial (*abc*),
     *                1 - strict (=),
     *                2 - prefix (abc*)
     *
     * @return array  Indexed list of contact groups, each a hash array
     */
    function list_groups($search = null)
    function list_groups($search = null, $mode = 0)
    {
        if (!$this->groups)
            return array();
@@ -1729,10 +1738,10 @@
        $groups = array();
        if ($search) {
            $search = mb_strtolower($search);
            foreach ($group_cache as $group) {
                if (strpos(mb_strtolower($group['name']), $search) !== false)
                if ($this->compare_search_value('name', $group['name'], $search, $mode)) {
                    $groups[] = $group;
                }
            }
        }
        else
@@ -1921,9 +1930,10 @@
    /**
     * Add the given contact records the a certain group
     *
     * @param string  Group identifier
     * @param array   List of contact identifiers to be added
     * @return int    Number of contacts added
     * @param string       Group identifier
     * @param array|string List of contact identifiers to be added
     *
     * @return int Number of contacts added
     */
    function add_to_group($group_id, $contact_ids)
    {
@@ -1937,8 +1947,8 @@
        $group_name  = $group_cache[$group_id]['name'];
        $member_attr = $group_cache[$group_id]['member_attr'];
        $group_dn    = "cn=$group_name,$base_dn";
        $new_attrs   = array();
        $new_attrs = array();
        foreach ($contact_ids as $id)
            $new_attrs[$member_attr][] = self::dn_decode($id);
@@ -1949,28 +1959,32 @@
        $this->cache->remove('groups');
        return count($new_attrs['member']);
        return count($new_attrs[$member_attr]);
    }
    /**
     * Remove the given contact records from a certain group
     *
     * @param string  Group identifier
     * @param array   List of contact identifiers to be removed
     * @return int    Number of deleted group members
     * @param string       Group identifier
     * @param array|string List of contact identifiers to be removed
     *
     * @return int Number of deleted group members
     */
    function remove_from_group($group_id, $contact_ids)
    {
        if (($group_cache = $this->cache->get('groups')) === null)
            $group_cache = $this->_fetch_groups();
        if (!is_array($contact_ids))
            $contact_ids = explode(',', $contact_ids);
        $base_dn     = $this->groups_base_dn;
        $group_name  = $group_cache[$group_id]['name'];
        $member_attr = $group_cache[$group_id]['member_attr'];
        $group_dn    = "cn=$group_name,$base_dn";
        $del_attrs   = array();
        $del_attrs = array();
        foreach (explode(",", $contact_ids) as $id)
        foreach ($contact_ids as $id)
            $del_attrs[$member_attr][] = self::dn_decode($id);
        if (!$this->ldap_mod_del($group_dn, $del_attrs)) {
@@ -1980,7 +1994,7 @@
        $this->cache->remove('groups');
        return count($del_attrs['member']);
        return count($del_attrs[$member_attr]);
    }
    /**