4 commits - lib/api lib/Auth lib/Auth.php

Jeroen van Meeuwen vanmeeuwen at kolabsys.com
Thu Apr 5 22:21:46 CEST 2012


 lib/Auth.php                             |    4 -
 lib/Auth/LDAP.php                        |   96 ++++++++++++++++---------------
 lib/api/kolab_api_service_form_value.php |   11 +++
 lib/api/kolab_api_service_group.php      |    6 +
 4 files changed, 70 insertions(+), 47 deletions(-)

New commits:
commit 7c57a8b7011c580c33e004dac7b8f7c14dd9e524
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Apr 5 22:21:17 2012 +0200

    Allow a parameter $recurse to be passed along to group member listing

diff --git a/lib/Auth.php b/lib/Auth.php
index 544b066..fd34e97 100644
--- a/lib/Auth.php
+++ b/lib/Auth.php
@@ -245,9 +245,9 @@ class Auth {
         return $this->_auth[$_SESSION['user']->get_domain()]->group_info($groupdata);
     }
 
-    public function group_members_list($groupdata)
+    public function group_members_list($groupdata, $recurse = true)
     {
-        return $this->_auth[$_SESSION['user']->get_domain()]->group_members_list($groupdata);
+        return $this->_auth[$_SESSION['user']->get_domain()]->group_members_list($groupdata, $recurse);
     }
 
     public function list_domains()


commit 9053dffb56c93ed9c1556b465913b142953886f2
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Apr 5 22:20:18 2012 +0200

    Do not attempt to recursively resolve group members for API service method group.members_list

diff --git a/lib/api/kolab_api_service_group.php b/lib/api/kolab_api_service_group.php
index f7c973f..f5e87ed 100644
--- a/lib/api/kolab_api_service_group.php
+++ b/lib/api/kolab_api_service_group.php
@@ -116,6 +116,8 @@ class kolab_api_service_group extends kolab_api_service
 
     public function group_edit($getdata, $postdata)
     {
+        //console("group_edit \$postdata", $postdata);
+
         $group_attributes = $this->parse_input_attributes('group', $postdata);
         $group            = $postdata['id'];
 
@@ -150,6 +152,8 @@ class kolab_api_service_group extends kolab_api_service
         // normalize result
         $result = $this->parse_result_attributes('group', $result);
 
+        //console("group_info() \$result", $result);
+
         if ($result) {
             return $result;
         }
@@ -173,7 +177,7 @@ class kolab_api_service_group extends kolab_api_service
             //error_log("Empty \$getdata['group']");
             return FALSE;
         }
-        $result = $auth->group_members_list($getdata['group']);
+        $result = $auth->group_members_list($getdata['group'], false);
 
         return array(
             'list'  => $result,


commit 8a4a7225cc1f33dfee326f8baa217976157d4ddf
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Apr 5 22:19:34 2012 +0200

    List groups as options for uniquemember values too

diff --git a/lib/api/kolab_api_service_form_value.php b/lib/api/kolab_api_service_form_value.php
index 33850e3..b5371da 100644
--- a/lib/api/kolab_api_service_form_value.php
+++ b/lib/api/kolab_api_service_form_value.php
@@ -617,9 +617,20 @@ class kolab_api_service_form_value extends kolab_api_service
         $result = $service->users_list(null, $data);
         $list   = $result['list'];
 
+        $service = $this->controller->get_service('groups');
+        $data['attributes'] = array('cn', 'mail');
+
+        $result = $service->groups_list(null, $data);
+        $list = array_merge($list, $result['list']);
+
         // convert to key=>value array
         foreach ($list as $idx => $value) {
             $list[$idx] = $value['displayname'];
+
+            if (empty($list[$idx])) {
+                $list[$idx] = $value['cn'];
+            }
+
             if (!empty($value['mail'])) {
                 $list[$idx] .= ' <' . $value['mail'] . '>';
             }


commit f809f703545c4d928ba0352762ea5443a3c1f925
Author: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen at kolabsys.com>
Date:   Thu Apr 5 22:19:20 2012 +0200

    Clean up listing group members

diff --git a/lib/Auth/LDAP.php b/lib/Auth/LDAP.php
index b4ccbb7..d8958df 100644
--- a/lib/Auth/LDAP.php
+++ b/lib/Auth/LDAP.php
@@ -660,7 +660,7 @@ class LDAP
         return self::normalize_result($this->_search($group_dn, '(objectclass=*)', $attributes));
     }
 
-    public function group_members_list($group)
+    public function group_members_list($group, $recurse = true)
     {
         $group_dn = $this->entry_dn($group);
 
@@ -668,7 +668,7 @@ class LDAP
             return false;
         }
 
-        return $this->_list_group_members($group_dn);
+        return $this->_list_group_members($group_dn, null, $recurse);
     }
 
     public function group_find_by_attribute($attribute)
@@ -1682,7 +1682,7 @@ class LDAP
     }
 
 
-    private function _list_group_members($dn, $entry = null)
+    private function _list_group_members($dn, $entry = null, $recurse = true)
     {
         $group_members = array();
 
@@ -1695,26 +1695,24 @@ class LDAP
             }
         }
 
-        $entries = self::normalize_result($this->_search($dn));
+        $entry = self::normalize_result($this->_search($dn));
 
         //console("ENTRIES for \$dn $dn", $entries);
 
-        foreach ($entries as $entry_dn => $entry) {
-            if (!isset($entry['objectclass'])) {
-                continue;
-            }
-
-            foreach ($entry['objectclass'] as $objectclass) {
-                switch (strtolower($objectclass)) {
-                    case "groupofnames":
-                        $group_members = array_merge($group_members, $this->_list_group_member($entry_dn, $entry));
-                        break;
-                    case "groupofuniquenames":
-                        $group_members = array_merge($group_members, $this->_list_group_uniquemember($entry_dn, $entry));
-                        break;
-                    case "groupofurls":
-                        $group_members = array_merge($group_members, $this->_list_group_memberurl($entry_dn, $entry));
-                        break;
+        foreach ($entry[$dn] as $attribute => $value) {
+            if ($attribute == "objectclass") {
+                foreach ($value as $objectclass) {
+                    switch (strtolower($objectclass)) {
+                        case "groupofnames":
+                            $group_members = array_merge($group_members, $this->_list_group_member($dn, $entry[$dn]['member'], $recurse));
+                            break;
+                        case "groupofuniquenames":
+                            $group_members = array_merge($group_members, $this->_list_group_uniquemember($dn, $entry[$dn]['uniquemember'], $recurse));
+                            break;
+                        case "groupofurls":
+                            $group_members = array_merge($group_members, $this->_list_group_memberurl($dn, $entry[$dn]['memberurl'], $recurse));
+                            break;
+                    }
                 }
             }
         }
@@ -1722,18 +1720,18 @@ class LDAP
         return array_filter($group_members);
     }
 
-    private function _list_group_member($dn, $entry)
+    private function _list_group_member($dn, $members, $recurse = true)
     {
         error_log("Called _list_group_member(" . $dn . ")");
 
         $group_members = array();
-        if (empty($entry['member'])) {
+        if (empty($members)) {
             return $group_members;
         }
 
         // Use the member attributes to return an array of member ldap objects
         // NOTE that the member attribute is supposed to contain a DN
-        foreach ($entry['member'] as $member) {
+        foreach ($members as $member) {
             $result = @ldap_read($this->conn, $member, '(objectclass=*)');
 
             if (!$result) {
@@ -1741,35 +1739,38 @@ class LDAP
             }
 
             $member_entry = self::normalize_result(@ldap_get_entries($this->conn, $result));
+
             $group_members[$member] = array_pop($member_entry);
 
-            // Nested groups
-//            $group_group_members = $this->_list_group_members($member, $member_entry);
-//            if ($group_group_members) {
-//                $group_members = array_merge($group_group_members, $group_members);
-//            }
+            if ($recurse) {
+                // Nested groups
+                $group_group_members = $this->_list_group_members($member, $member_entry);
+                if ($group_group_members) {
+                    $group_members = array_merge($group_group_members, $group_members);
+                }
+            }
         }
 
         return array_filter($group_members);
     }
 
-    private function _list_group_uniquemember($dn, $entry)
+    private function _list_group_uniquemember($dn, $uniquemembers, $recurse = true)
     {
         //console("Called _list_group_uniquemember(" . $dn . ")", $entry);
 
         // Use the member attributes to return an array of member ldap objects
         // NOTE that the member attribute is supposed to contain a DN
         $group_members = array();
-        if (empty($entry['uniquemember'])) {
+        if (empty($uniquemembers)) {
             return $group_members;
         }
 
-        if (is_string($entry['uniquemember'])) {
+        if (is_string($uniquemembers)) {
             //console("uniquemember for entry is not an array");
-            $entry['uniquemember'] = Array( $entry['uniquemember'] );
+            $uniquemembers = (array)($uniquemembers);
         }
 
-        foreach ($entry['uniquemember'] as $member) {
+        foreach ($uniquemembers as $member) {
             $result = @ldap_read($this->conn, $member, '(objectclass=*)');
 
             if (!$result) {
@@ -1779,17 +1780,19 @@ class LDAP
             $member_entry = self::normalize_result(@ldap_get_entries($this->conn, $result));
             $group_members[$member] = array_pop($member_entry);
 
-            // Nested groups
-            $group_group_members = $this->_list_group_members($member, $member_entry);
-            if ($group_group_members) {
-                $group_members = array_merge($group_group_members, $group_members);
+            if ($recurse) {
+                // Nested groups
+                $group_group_members = $this->_list_group_members($member, $member_entry);
+                if ($group_group_members) {
+                    $group_members = array_merge($group_group_members, $group_members);
+                }
             }
         }
 
         return array_filter($group_members);
     }
 
-    private function _list_group_memberurl($dn, $entry)
+    private function _list_group_memberurl($dn, $memberurls, $recurse = true)
     {
         error_log("Called _list_group_memberurl(" . $dn . ")");
 
@@ -1798,17 +1801,22 @@ class LDAP
 
         $group_members = array();
 
-        foreach ((array)$entry['memberurl'] as $url) {
+        foreach ((array)$memberurls as $url) {
             $ldap_uri_components = $this->_parse_memberurl($url);
+
             $entries = self::normalize_result($this->_search($ldap_uri_components[3], $ldap_uri_components[6]));
+
             foreach ($entries as $entry_dn => $_entry) {
                 $group_members[$entry_dn] = $_entry;
                 error_log("Found " . $entry_dn);
-                // Nested group
-//                $group_group_members = $this->_list_group_members($entry_dn, $_entry);
-//                if ($group_group_members) {
-//                    $group_members = array_merge($group_members, $group_group_members);
-//                }
+
+                if ($recurse) {
+                    // Nested group
+                    $group_group_members = $this->_list_group_members($entry_dn, $_entry);
+                    if ($group_group_members) {
+                        $group_members = array_merge($group_members, $group_group_members);
+                    }
+                }
             }
         }
 





More information about the commits mailing list