diff options
-rw-r--r-- | program/include/rcube_ldap.php | 62 |
1 files changed, 41 insertions, 21 deletions
diff --git a/program/include/rcube_ldap.php b/program/include/rcube_ldap.php index 9f8086bd9..f42abf1ed 100644 --- a/program/include/rcube_ldap.php +++ b/program/include/rcube_ldap.php @@ -1673,23 +1673,7 @@ class rcube_ldap extends rcube_addressbook $groups[$group_id]['ID'] = $group_id; $groups[$group_id]['dn'] = $ldap_data[$i]['dn']; $groups[$group_id]['name'] = $group_name; - $groups[$group_id]['member_attr'] = $this->prop['member_attr']; - - // check objectClass attributes of group and act accordingly - for ($j=0; $j < $ldap_data[$i]['objectclass']['count']; $j++) { - switch (strtolower($ldap_data[$i]['objectclass'][$j])) { - case 'group': - case 'groupofnames': - case 'kolabgroupofnames': - $groups[$group_id]['member_attr'] = 'member'; - break; - - case 'groupofuniquenames': - case 'kolabgroupofuniquenames': - $groups[$group_id]['member_attr'] = 'uniqueMember'; - break; - } - } + $groups[$group_id]['member_attr'] = $this->get_group_member_attr($ldap_data[$i]['objectclass']); // list email attributes of a group for ($j=0; $ldap_data[$i][$email_attr] && $j < $ldap_data[$i][$email_attr]['count']; $j++) { @@ -1750,8 +1734,8 @@ class rcube_ldap extends rcube_addressbook $base_dn = $this->groups_base_dn; $new_dn = "cn=$group_name,$base_dn"; $new_gid = self::dn_encode($group_name); - $member_attr = $this->prop['groups']['member_attr']; - $name_attr = $this->prop['groups']['name_attr']; + $member_attr = $this->get_group_member_attr(); + $name_attr = $this->prop['groups']['name_attr'] ? $this->prop['groups']['name_attr'] : 'cn'; $new_entry = array( 'objectClass' => $this->prop['groups']['object_classes'], @@ -1903,8 +1887,8 @@ class rcube_ldap extends rcube_addressbook $base_dn = $this->groups_base_dn; $contact_dn = self::dn_decode($contact_id); - $name_attr = $this->prop['groups']['name_attr']; - $member_attr = $this->prop['member_attr']; + $name_attr = $this->prop['groups']['name_attr'] ? $this->prop['groups']['name_attr'] : 'cn'; + $member_attr = $this->get_group_member_attr(); $add_filter = ''; if ($member_attr != 'member' && $member_attr != 'uniqueMember') $add_filter = "($member_attr=$contact_dn)"; @@ -1931,6 +1915,42 @@ class rcube_ldap extends rcube_addressbook return $groups; } + /** + * Detects group member attribute name + */ + private function get_group_member_attr($object_classes = array()) + { + if (empty($object_classes)) { + $object_classes = $this->prop['groups']['object_classes']; + } + if (!empty($object_classes)) { + foreach ((array)$object_classes as $oc) { + switch (strtolower($oc)) { + case 'group': + case 'groupofnames': + case 'kolabgroupofnames': + $member_attr = 'member'; + break; + + case 'groupofuniquenames': + case 'kolabgroupofuniquenames': + $member_attr = 'uniqueMember'; + break; + } + } + } + + if (!empty($member_attr)) { + return $member_attr; + } + + if (!empty($this->prop['groups']['member_attr'])) { + return $this->prop['groups']['member_attr']; + } + + return 'member'; + } + /** * Generate BER encoded string for Virtual List View option |