Changeset 5338 in subversion


Ignore:
Timestamp:
Oct 14, 2011 12:50:33 PM (20 months ago)
Author:
thomasb
Message:

Also allow groups list to be fetched using VLV

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/roundcubemail/program/include/rcube_ldap.php

    r5333 r5338  
    8787            if (empty($this->prop['groups']['name_attr'])) 
    8888                $this->prop['groups']['name_attr'] = 'cn'; 
     89            if (empty($this->prop['groups']['scope'])) 
     90                $this->prop['groups']['scope'] = 'sub'; 
    8991        } 
    9092 
     
    548550                } 
    549551            } 
     552             
     553            if ($this->prop['sizelimit'] && count($group_members) > $this->prop['sizelimit']) 
     554              break; 
    550555        } 
    551556 
     
    11121117        { 
    11131118            $filter = $this->filter ? $this->filter : '(objectclass=*)'; 
    1114  
    1115             switch ($this->prop['scope']) { 
    1116               case 'sub': 
    1117                 $function = $ns_function  = 'ldap_search'; 
    1118                 break; 
    1119               case 'base': 
    1120                 $function = $ns_function = 'ldap_read'; 
    1121                 break; 
    1122               default: 
    1123                 $function = 'ldap_list'; 
    1124                 $ns_function = 'ldap_read'; 
    1125                 break; 
    1126             } 
    1127  
    1128             $this->_debug("C: Search [$filter]"); 
     1119            $function = $this->_scope2func($this->prop['scope'], $ns_function); 
     1120 
     1121            $this->_debug("C: Search [$filter][dn: $this->base_dn]"); 
    11291122 
    11301123            // when using VLV, we get the total count by... 
     
    11401133                    $this->vlv_count = $this->_exec_search(true); 
    11411134 
    1142                 $this->vlv_active = $this->_vlv_set_controls(); 
     1135                $this->vlv_active = $this->_vlv_set_controls($this->prop, $this->list_page, $this->page_size); 
    11431136            } 
    11441137 
     
    11511144                if ($err = ldap_errno($this->conn)) 
    11521145                    $this->_debug("S: Error: " .ldap_err2str($err)); 
    1153                 return true; 
     1146                return $count ? ldap_count_entries($this->conn, $this->ldap_result) : true; 
    11541147            } 
    11551148            else 
     
    11631156 
    11641157    /** 
     1158     * Choose the right PHP function according to scope property 
     1159     */ 
     1160    private function _scope2func($scope, &$ns_function = null) 
     1161    { 
     1162        switch ($scope) { 
     1163          case 'sub': 
     1164            $function = $ns_function  = 'ldap_search'; 
     1165            break; 
     1166          case 'base': 
     1167            $function = $ns_function = 'ldap_read'; 
     1168            break; 
     1169          default: 
     1170            $function = 'ldap_list'; 
     1171            $ns_function = 'ldap_read'; 
     1172            break; 
     1173        } 
     1174         
     1175        return $function; 
     1176    } 
     1177 
     1178    /** 
    11651179     * Set server controls for Virtual List View (paginated listing) 
    11661180     */ 
    1167     private function _vlv_set_controls() 
    1168     { 
    1169         $sort_ctrl = array('oid' => "1.2.840.113556.1.4.473",  'value' => $this->_sort_ber_encode((array)$this->prop['sort'])); 
    1170         $vlv_ctrl  = array('oid' => "2.16.840.1.113730.3.4.9", 'value' => $this->_vlv_ber_encode(($offset = ($this->list_page-1) * $this->page_size + 1), $this->page_size), 'iscritical' => true); 
    1171  
    1172         $this->_debug("C: set controls sort=" . join(' ', unpack('H'.(strlen($sort_ctrl['value'])*2), $sort_ctrl['value'])) . " ({$this->sort_col});" 
    1173             . " vlv=" . join(' ', (unpack('H'.(strlen($vlv_ctrl['value'])*2), $vlv_ctrl['value']))) . " ($offset/$this->page_size)"); 
     1181    private function _vlv_set_controls($prop, $list_page, $page_size) 
     1182    { 
     1183        $sort_ctrl = array('oid' => "1.2.840.113556.1.4.473",  'value' => $this->_sort_ber_encode((array)$prop['sort'])); 
     1184        $vlv_ctrl  = array('oid' => "2.16.840.1.113730.3.4.9", 'value' => $this->_vlv_ber_encode(($offset = ($list_page-1) * $page_size + 1), $page_size), 'iscritical' => true); 
     1185 
     1186        $sort = (array)$prop['sort']; 
     1187        $this->_debug("C: set controls sort=" . join(' ', unpack('H'.(strlen($sort_ctrl['value'])*2), $sort_ctrl['value'])) . " ($sort[0]);" 
     1188            . " vlv=" . join(' ', (unpack('H'.(strlen($vlv_ctrl['value'])*2), $vlv_ctrl['value']))) . " ($offset/$page_size)"); 
    11741189 
    11751190        if (!ldap_set_option($this->conn, LDAP_OPT_SERVER_CONTROLS, array($sort_ctrl, $vlv_ctrl))) { 
     
    13531368     * Fetch groups from server 
    13541369     */ 
    1355     private function _fetch_groups() 
     1370    private function _fetch_groups($vlv_page = 0) 
    13561371    { 
    13571372        $base_dn = $this->groups_base_dn; 
     
    13591374        $name_attr = $this->prop['groups']['name_attr']; 
    13601375        $email_attr = $this->prop['groups']['email_attr'] ? $this->prop['groups']['email_attr'] : 'mail'; 
     1376        $sort_attrs = $this->prop['groups']['sort'] ? (array)$this->prop['groups']['sort'] : array($name_attr); 
     1377        $sort_attr = $sort_attrs[0]; 
    13611378 
    13621379        $this->_debug("C: Search [$filter][dn: $base_dn]"); 
    13631380 
    1364         $res = @ldap_search($this->conn, $base_dn, $filter, array('dn', $name_attr, 'objectClass', $email_attr)); 
     1381        // use vlv to list groups 
     1382        if ($this->prop['groups']['vlv']) { 
     1383            $page_size = 200; 
     1384            if (!$this->prop['groups']['sort']) 
     1385                $this->prop['groups']['sort'] = $sort_attrs; 
     1386            $vlv_active = $this->_vlv_set_controls($this->prop['groups'], $vlv_page+1, $page_size); 
     1387        } 
     1388 
     1389        $function = $this->_scope2func($this->prop['groups']['scope'], $ns_function); 
     1390        $res = @$function($this->conn, $base_dn, $filter, array_unique(array('dn', 'objectClass', $name_attr, $email_attr, $sort_attr))); 
    13651391        if ($res === false) 
    13661392        { 
     
    13741400        $groups = array(); 
    13751401        $group_sortnames = array(); 
    1376         for ($i=0; $i<$ldap_data["count"]; $i++) 
    1377         { 
    1378             $group_name = $ldap_data[$i][$name_attr][0]; 
     1402        $group_count = $ldap_data["count"]; 
     1403        for ($i=0; $i < $group_count; $i++) 
     1404        { 
     1405            $group_name = is_array($ldap_data[$i][$name_attr]) ? $ldap_data[$i][$name_attr][0] : $ldap_data[$i][$name_attr]; 
    13791406            $group_id = self::dn_encode($group_name); 
    13801407            $groups[$group_id]['ID'] = $group_id; 
     
    14041431            } 
    14051432 
    1406             $group_sortnames[] = strtolower($group_name); 
    1407         } 
    1408         array_multisort($group_sortnames, SORT_ASC, SORT_STRING, $groups); 
     1433            $group_sortnames[] = strtolower($ldap_data[$i][$sort_attr][0]); 
     1434        } 
     1435 
     1436        // recursive call can exit here 
     1437        if ($vlv_page > 0) 
     1438            return $groups; 
     1439 
     1440        // call recursively until we have fetched all groups 
     1441        while ($vlv_active && $group_count == $page_size) 
     1442        { 
     1443            $next_page = $this->_fetch_groups(++$vlv_page); 
     1444            $groups = array_merge($groups, $next_page); 
     1445            $group_count = count($next_page); 
     1446        } 
     1447 
     1448        // when using VLV the list of groups is already sorted 
     1449        if (!$this->prop['groups']['vlv']) 
     1450            array_multisort($group_sortnames, SORT_ASC, SORT_STRING, $groups); 
    14091451 
    14101452        // cache this 
Note: See TracChangeset for help on using the changeset viewer.