Changeset 5331 in subversion


Ignore:
Timestamp:
Oct 11, 2011 4:54:46 AM (21 months ago)
Author:
thomasb
Message:

Improve group member fetching

File:
1 edited

Legend:

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

    r5327 r5331  
    506506    * 
    507507    * @param string Group DN 
    508     * @param array  Group entry (if called recursively) 
     508    * @param array  Group entries (if called recursively) 
    509509    * @return array Accumulated group members 
    510510     */ 
    511     function list_group_members($dn, $entries = null) 
     511    function list_group_members($dn, $count = false, $entries = null) 
    512512    { 
    513513        $group_members = array(); 
     
    532532                continue; 
    533533 
    534             foreach ((array)$entry['objectclass'] as $num => $objectclass) 
     534            foreach ((array)$entry['objectclass'] as $objectclass) 
    535535            { 
    536536                switch (strtolower($objectclass)) { 
    537537                    case "groupofnames": 
    538538                    case "kolabgroupofnames": 
    539                         $group_members = array_merge($group_members, $this->_list_group_members($dn, $entry, 'member')); 
     539                        $group_members = array_merge($group_members, $this->_list_group_members($dn, $entry, 'member', $count)); 
    540540                        break; 
    541541                    case "groupofuniquenames": 
    542542                    case "kolabgroupofuniquenames": 
    543                         $group_members = array_merge($group_members, $this->_list_group_members($dn, $entry, 'uniquemember')); 
     543                        $group_members = array_merge($group_members, $this->_list_group_members($dn, $entry, 'uniquemember', $count)); 
    544544                        break; 
    545545                    case "groupofurls": 
    546                         $group_members = array_merge($group_members, $this->_list_group_memberurl($dn, $entry)); 
     546                        $group_members = array_merge($group_members, $this->_list_group_memberurl($dn, $entry, $count)); 
    547547                        break; 
    548548                } 
     
    561561     * @return array Accumulated group members 
    562562     */ 
    563     private function _list_group_members($dn, $entry, $attr) 
     563    private function _list_group_members($dn, $entry, $attr, $count) 
    564564    { 
    565565        // Use the member attributes to return an array of member ldap objects 
     
    569569            return $group_members; 
    570570 
     571        // read these attributes for all members 
     572        $attrib = $count ? array('dn') : array_values($this->fieldmap); 
     573        $attrib[] = 'objectClass'; 
     574        $attrib[] = 'member'; 
     575        $attrib[] = 'uniqueMember'; 
     576        $attrib[] = 'memberURL'; 
     577 
    571578        for ($i=0; $i < $entry[$attr]['count']; $i++) 
    572579        { 
    573580            $result = @ldap_read($this->conn, $entry[$attr][$i], '(objectclass=*)', 
    574                 array_values($this->fieldmap), 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit']); 
     581                $attrib, 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit']); 
    575582 
    576583            $members = @ldap_get_entries($this->conn, $result); 
     
    582589 
    583590            // for nested groups, call recursively 
    584             $nested_group_members = $this->list_group_members($entry[$attr][$i], $members); 
     591            $nested_group_members = $this->list_group_members($entry[$attr][$i], $count, $members); 
    585592 
    586593            unset($members['count']); 
     
    596603     * @param string Group DN 
    597604     * @param array  Group entry 
     605     * @param boolean True if only used for counting 
    598606     * @return array Accumulated group members 
    599607     */ 
    600     private function _list_group_memberurl($dn, $entry) 
     608    private function _list_group_memberurl($dn, $entry, $count) 
    601609    { 
    602610        $group_members = array(); 
     
    612620            $func = $m[2] == 'sub' ? 'ldap_search' : ($m[2] == 'base' ? 'ldap_read' : 'ldap_list'); 
    613621 
     622            $attrib = $count ? array('dn') : array_values($this->fieldmap); 
    614623            if ($result = @$func($this->conn, $m[1], $filter, 
    615                 array_values($this->fieldmap), 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit'])) 
     624                $attrib, 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit'])) 
    616625            { 
    617626                $this->_debug("S: ".ldap_count_entries($this->conn, $result)." record(s) for ".$m[1]); 
     
    628637            for ($j = 0; $j < $entries['count']; $j++) 
    629638            { 
    630                 if ($nested_group_members = $this->list_group_members($entries[$j]['dn'])) 
     639                if ($nested_group_members = $this->list_group_members($entries[$j]['dn'], $count)) 
    631640                    $group_members = array_merge($group_members, $nested_group_members); 
    632641                else 
     
    749758        } 
    750759        else if ($this->group_id && $this->group_data['dn']) { 
    751             $count = count($this->list_group_members($this->group_data['dn'])); 
     760            $count = count($this->list_group_members($this->group_data['dn'], true)); 
    752761        } 
    753762        else if ($this->conn) { 
Note: See TracChangeset for help on using the changeset viewer.