| | |
| | | * Get all members of the given group |
| | | * |
| | | * @param string Group DN |
| | | * @param array Group entry (if called recursively) |
| | | * @param array Group entries (if called recursively) |
| | | * @return array Accumulated group members |
| | | */ |
| | | function list_group_members($dn, $entries = null) |
| | | function list_group_members($dn, $count = false, $entries = null) |
| | | { |
| | | $group_members = array(); |
| | | |
| | |
| | | if (empty($entry['objectclass'])) |
| | | continue; |
| | | |
| | | foreach ((array)$entry['objectclass'] as $num => $objectclass) |
| | | foreach ((array)$entry['objectclass'] as $objectclass) |
| | | { |
| | | switch (strtolower($objectclass)) { |
| | | case "groupofnames": |
| | | case "kolabgroupofnames": |
| | | $group_members = array_merge($group_members, $this->_list_group_members($dn, $entry, 'member')); |
| | | $group_members = array_merge($group_members, $this->_list_group_members($dn, $entry, 'member', $count)); |
| | | break; |
| | | case "groupofuniquenames": |
| | | case "kolabgroupofuniquenames": |
| | | $group_members = array_merge($group_members, $this->_list_group_members($dn, $entry, 'uniquemember')); |
| | | $group_members = array_merge($group_members, $this->_list_group_members($dn, $entry, 'uniquemember', $count)); |
| | | break; |
| | | case "groupofurls": |
| | | $group_members = array_merge($group_members, $this->_list_group_memberurl($dn, $entry)); |
| | | $group_members = array_merge($group_members, $this->_list_group_memberurl($dn, $entry, $count)); |
| | | break; |
| | | } |
| | | } |
| | |
| | | * @param string Member attribute to use |
| | | * @return array Accumulated group members |
| | | */ |
| | | private function _list_group_members($dn, $entry, $attr) |
| | | private function _list_group_members($dn, $entry, $attr, $count) |
| | | { |
| | | // Use the member attributes to return an array of member ldap objects |
| | | // NOTE that the member attribute is supposed to contain a DN |
| | |
| | | if (empty($entry[$attr])) |
| | | return $group_members; |
| | | |
| | | // read these attributes for all members |
| | | $attrib = $count ? array('dn') : array_values($this->fieldmap); |
| | | $attrib[] = 'objectClass'; |
| | | $attrib[] = 'member'; |
| | | $attrib[] = 'uniqueMember'; |
| | | $attrib[] = 'memberURL'; |
| | | |
| | | for ($i=0; $i < $entry[$attr]['count']; $i++) |
| | | { |
| | | $result = @ldap_read($this->conn, $entry[$attr][$i], '(objectclass=*)', |
| | | array_values($this->fieldmap), 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit']); |
| | | $attrib, 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit']); |
| | | |
| | | $members = @ldap_get_entries($this->conn, $result); |
| | | if ($members == false) |
| | |
| | | } |
| | | |
| | | // for nested groups, call recursively |
| | | $nested_group_members = $this->list_group_members($entry[$attr][$i], $members); |
| | | $nested_group_members = $this->list_group_members($entry[$attr][$i], $count, $members); |
| | | |
| | | unset($members['count']); |
| | | $group_members = array_merge($group_members, array_filter($members), $nested_group_members); |
| | |
| | | * |
| | | * @param string Group DN |
| | | * @param array Group entry |
| | | * @param boolean True if only used for counting |
| | | * @return array Accumulated group members |
| | | */ |
| | | private function _list_group_memberurl($dn, $entry) |
| | | private function _list_group_memberurl($dn, $entry, $count) |
| | | { |
| | | $group_members = array(); |
| | | |
| | |
| | | $filter = $this->filter ? '(&(' . $m[3] . ')(' . $this->filter . '))' : $m[3]; |
| | | $func = $m[2] == 'sub' ? 'ldap_search' : ($m[2] == 'base' ? 'ldap_read' : 'ldap_list'); |
| | | |
| | | $attrib = $count ? array('dn') : array_values($this->fieldmap); |
| | | if ($result = @$func($this->conn, $m[1], $filter, |
| | | array_values($this->fieldmap), 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit'])) |
| | | $attrib, 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit'])) |
| | | { |
| | | $this->_debug("S: ".ldap_count_entries($this->conn, $result)." record(s) for ".$m[1]); |
| | | if ($err = ldap_errno($this->conn)) |
| | |
| | | $entries = @ldap_get_entries($this->conn, $result); |
| | | for ($j = 0; $j < $entries['count']; $j++) |
| | | { |
| | | if ($nested_group_members = $this->list_group_members($entries[$j]['dn'])) |
| | | if ($nested_group_members = $this->list_group_members($entries[$j]['dn'], $count)) |
| | | $group_members = array_merge($group_members, $nested_group_members); |
| | | else |
| | | $group_members[] = $entries[$j]; |
| | |
| | | $count = $this->vlv_active ? $this->vlv_count : ldap_count_entries($this->conn, $this->ldap_result); |
| | | } |
| | | else if ($this->group_id && $this->group_data['dn']) { |
| | | $count = count($this->list_group_members($this->group_data['dn'])); |
| | | $count = count($this->list_group_members($this->group_data['dn'], true)); |
| | | } |
| | | else if ($this->conn) { |
| | | // We have a connection but no result set, attempt to get one. |