From 097dbc68700c0c15e78d3643f1f478269f13f1ac Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Tue, 10 Apr 2012 04:39:36 -0400
Subject: [PATCH] - Improved member attribute detection with fallback in create_group()

---
 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 9f8086b..f42abf1 100644
--- a/program/include/rcube_ldap.php
+++ b/program/include/rcube_ldap.php
@@ -1673,23 +1673,7 @@
             $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 @@
         $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 @@
 
         $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 @@
         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

--
Gitblit v1.9.1