]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fixes returns of group memberships and counting if all members have the specific...
authorArthur Schiwon <blizzz@owncloud.com>
Tue, 14 Apr 2015 12:40:37 +0000 (14:40 +0200)
committerArthur Schiwon <blizzz@owncloud.com>
Tue, 14 Apr 2015 12:56:36 +0000 (14:56 +0200)
apps/user_ldap/group_ldap.php
apps/user_ldap/tests/group_ldap.php

index 94aa53b8506cfd51c54298ec58e5a0e2b6cdb182..10e8bfd9e6102afbe3985499b14852e040b921a1 100644 (file)
@@ -290,12 +290,13 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
        public function getUsersInPrimaryGroup($groupDN, $search = '', $limit = -1, $offset = 0) {
                try {
                        $filter = $this->prepareFilterForUsersInPrimaryGroup($groupDN, $search);
-                       return $this->access->fetchListOfUsers(
+                       $users = $this->access->fetchListOfUsers(
                                $filter,
                                array($this->access->connection->ldapUserDisplayName, 'dn'),
                                $limit,
                                $offset
                        );
+                       return $this->access->ownCloudUserNames($users);
                } catch (\Exception $e) {
                        return array();
                }
@@ -474,8 +475,9 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
                        return array();
                }
 
+               $primaryUsers = $this->getUsersInPrimaryGroup($groupDN, $search, $limit, $offset);
                $members = array_keys($this->_groupMembers($groupDN));
-               if(!$members) {
+               if(!$members && empty($primaryUsers)) {
                        //in case users could not be retrieved, return empty result set
                        $this->access->connection->writeToCache($cacheKey, array());
                        return array();
@@ -515,9 +517,6 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
                natsort($groupUsers);
                $this->access->connection->writeToCache('usersInGroup-'.$gid.'-'.$search, $groupUsers);
                $groupUsers = array_slice($groupUsers, $offset, $limit);
-
-               //and get users that have the group as primary
-               $primaryUsers = $this->getUsersInPrimaryGroup($groupDN, $search, $limit, $offset);
                $groupUsers = array_unique(array_merge($groupUsers, $primaryUsers));
 
                $this->access->connection->writeToCache($cacheKey, $groupUsers);
@@ -549,16 +548,15 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface {
                }
 
                $members = array_keys($this->_groupMembers($groupDN));
-               if(!$members) {
+               $primaryUserCount = $this->countUsersInPrimaryGroup($groupDN, '');
+               if(!$members && $primaryUserCount === 0) {
                        //in case users could not be retrieved, return empty result set
                        $this->access->connection->writeToCache($cacheKey, false);
                        return false;
                }
 
                if(empty($search)) {
-                       $primaryUsers = $this->countUsersInPrimaryGroup($groupDN, '');
-                       $groupUsers = count($members) + $primaryUsers;
-
+                       $groupUsers = count($members) + $primaryUserCount;
                        $this->access->connection->writeToCache($cacheKey, $groupUsers);
                        return $groupUsers;
                }
index b29449d286e8dde9366a40fe98ff543503a150f8..b18ebb50efab66158857419da7aca5e6318d3a7e 100644 (file)
@@ -313,4 +313,74 @@ class Test_Group_Ldap extends \PHPUnit_Framework_TestCase {
                $this->assertSame(2, count($groups));
        }
 
+       /**
+        * tests that a user listing is complete, if all it's members have the group
+        * as their primary.
+        */
+       public function  testUsersInGroupPrimaryMembersOnly() {
+               $access = $this->getAccessMock();
+               $this->enableGroups($access);
+
+               $access->connection->expects($this->any())
+                       ->method('getFromCache')
+                       ->will($this->returnValue(null));
+
+               $access->expects($this->any())
+                       ->method('readAttribute')
+                       ->will($this->returnCallback(function($dn, $attr) {
+                               if($attr === 'primaryGroupToken') {
+                                       return array(1337);
+                               }
+                               return array();
+                       }));
+
+               $access->expects($this->any())
+                       ->method('groupname2dn')
+                       ->will($this->returnValue('cn=foobar,dc=foo,dc=bar'));
+
+               $access->expects($this->once())
+                       ->method('ownCloudUserNames')
+                       ->will($this->returnValue(array('lisa', 'bart', 'kira', 'brad')));
+
+               $groupBackend = new GroupLDAP($access);
+               $users = $groupBackend->usersInGroup('foobar');
+
+               $this->assertSame(4, count($users));
+       }
+
+       /**
+        * tests that a user counting is complete, if all it's members have the group
+        * as their primary.
+        */
+       public function  testCountUsersInGroupPrimaryMembersOnly() {
+               $access = $this->getAccessMock();
+               $this->enableGroups($access);
+
+               $access->connection->expects($this->any())
+                       ->method('getFromCache')
+                       ->will($this->returnValue(null));
+
+               $access->expects($this->any())
+                       ->method('readAttribute')
+                       ->will($this->returnCallback(function($dn, $attr) {
+                               if($attr === 'primaryGroupToken') {
+                                       return array(1337);
+                               }
+                               return array();
+                       }));
+
+               $access->expects($this->any())
+                       ->method('groupname2dn')
+                       ->will($this->returnValue('cn=foobar,dc=foo,dc=bar'));
+
+               $access->expects($this->once())
+                       ->method('countUsers')
+                       ->will($this->returnValue(4));
+
+               $groupBackend = new GroupLDAP($access);
+               $users = $groupBackend->countUsersInGroup('foobar');
+
+               $this->assertSame(4, $users);
+       }
+
 }