diff options
Diffstat (limited to 'program/lib')
-rw-r--r-- | program/lib/Roundcube/rcube_ldap.php | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/program/lib/Roundcube/rcube_ldap.php b/program/lib/Roundcube/rcube_ldap.php index a2dd163e9..80b85d45b 100644 --- a/program/lib/Roundcube/rcube_ldap.php +++ b/program/lib/Roundcube/rcube_ldap.php @@ -657,6 +657,21 @@ class rcube_ldap extends rcube_addressbook if (empty($entry[$attr])) return $group_members; + // add group record to cache if it isn't yet there + $group_id = self::dn_encode($dn); + $group_cache = $this->cache->get('groups'); + if (!$group_cache[$group_id]) { + $name_attr = $this->prop['groups']['name_attr']; + $group_name = is_array($ldap_data[$i][$name_attr]) ? $ldap_data[$i][$name_attr][0] : $ldap_data[$i][$name_attr]; + + $group_cache[$group_id]['ID'] = $group_id; + $group_cache[$group_id]['dn'] = $dn; + $group_cache[$group_id]['name'] = $group_name; + $group_cache[$group_id]['member_attr'] = $this->get_group_member_attr($entry[$i]['objectclass']); + + $this->cache->set('groups', $group_cache); + } + // read these attributes for all members $attrib = $count ? array('dn') : array_values($this->fieldmap); $attrib[] = 'objectClass'; @@ -664,12 +679,14 @@ class rcube_ldap extends rcube_addressbook $attrib[] = 'uniqueMember'; $attrib[] = 'memberURL'; + $filter = $this->prop['groups']['member_filter'] ? $this->prop['groups']['member_filter'] : '(objectclass=*)'; + for ($i=0; $i < $entry[$attr]['count']; $i++) { if (empty($entry[$attr][$i])) continue; - $result = @ldap_read($this->conn, $entry[$attr][$i], '(objectclass=*)', + $result = @ldap_read($this->conn, $entry[$attr][$i], $filter, $attrib, 0, (int)$this->prop['sizelimit'], (int)$this->prop['timelimit']); $members = @ldap_get_entries($this->conn, $result); @@ -1522,11 +1539,20 @@ class rcube_ldap extends rcube_addressbook */ private function _ldap2result($rec) { - $out = array(); + $out = array('_type' => 'person'); if ($rec['dn']) $out[$this->primary_key] = self::dn_encode($rec['dn']); + // determine record type + if (array_intersect(array('groupofuniquenames','kolabgroupofuniquenames'), (array)$rec['objectclass'])) { + $out['_type'] = 'group'; + $out['readonly'] = true; + if ($this->fieldmap['groupname']) { + $this->fieldmap['name'] = $this->fieldmap['groupname']; + } + } + foreach ($this->fieldmap as $rf => $lf) { for ($i=0; $i < $rec[$lf]['count']; $i++) { @@ -1780,7 +1806,7 @@ class rcube_ldap extends rcube_addressbook for ($i=0; $i < $group_count; $i++) { $group_name = is_array($ldap_data[$i][$name_attr]) ? $ldap_data[$i][$name_attr][0] : $ldap_data[$i][$name_attr]; - $group_id = self::dn_encode($group_name); + $group_id = self::dn_encode($ldap_data[$i]['dn']); $groups[$group_id]['ID'] = $group_id; $groups[$group_id]['dn'] = $ldap_data[$i]['dn']; $groups[$group_id]['name'] = $group_name; |