summaryrefslogtreecommitdiff
path: root/program/lib/Roundcube
diff options
context:
space:
mode:
Diffstat (limited to 'program/lib/Roundcube')
-rw-r--r--program/lib/Roundcube/rcube_ldap.php32
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;