]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix caching of objectsid searches 28950/head
authorArthur Schiwon <blizzz@arthur-schiwon.de>
Tue, 21 Sep 2021 09:47:00 +0000 (11:47 +0200)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Fri, 24 Sep 2021 15:09:16 +0000 (15:09 +0000)
- store result when no name could be retrieved, too
- cached value is not an array, was treated wrongly

Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
apps/user_ldap/lib/Group_LDAP.php
apps/user_ldap/tests/Group_LDAPTest.php

index f816279fec396ea941fd1e3fed1f783f336cbc82..9c2e3ebb713c15304f4fba4631d5dcab36cb0897 100644 (file)
@@ -410,6 +410,7 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I
        private function getNameOfGroup(string $filter, string $cacheKey) {
                $result = $this->access->searchGroups($filter, ['dn'], 1);
                if (empty($result)) {
+                       $this->access->connection->writeToCache($cacheKey, false);
                        return null;
                }
                $dn = $result[0]['dn'][0];
@@ -534,10 +535,10 @@ class Group_LDAP extends BackendUtility implements GroupInterface, IGroupLDAP, I
         * @throws ServerNotAvailableException
         */
        public function primaryGroupID2Name(string $gid, string $dn) {
-               $cacheKey = 'primaryGroupIDtoName';
-               $groupNames = $this->access->connection->getFromCache($cacheKey);
-               if (!is_null($groupNames) && isset($groupNames[$gid])) {
-                       return $groupNames[$gid];
+               $cacheKey = 'primaryGroupIDtoName_' . $gid;
+               $groupName = $this->access->connection->getFromCache($cacheKey);
+               if (!is_null($groupName)) {
+                       return $groupName;
                }
 
                $domainObjectSid = $this->access->getSID($dn);
index 4011d964a4045353f4e8dc5e819114ad5b503d41..aad69ebf43d4d6b061cbf6ddc5fb454df7cf351a 100644 (file)
@@ -321,6 +321,38 @@ class Group_LDAPTest extends TestCase {
                $this->assertSame(false, $gid);
        }
 
+       public function testPrimaryGroupID2NameSuccessCache() {
+               $access = $this->getAccessMock();
+               $pluginManager = $this->getPluginManagerMock();
+
+               $this->enableGroups($access);
+
+               $userDN = 'cn=alice,cn=foo,dc=barfoo,dc=bar';
+               $gid = '3117';
+               $groupDN = 'cn=foo,dc=barfoo,dc=bar';
+
+               /** @var MockObject $connection */
+               $connection = $access->connection;
+               $connection->expects($this->once())
+                       ->method('getFromCache')
+                       ->with('primaryGroupIDtoName_' . $gid)
+                       ->willReturn('MyGroup');
+
+               $access->expects($this->never())
+                       ->method('getSID');
+
+               $access->expects($this->never())
+                       ->method('searchGroups');
+
+               $access->expects($this->never())
+                       ->method('dn2groupname');
+
+               $groupBackend = new GroupLDAP($access, $pluginManager);
+               $group = $groupBackend->primaryGroupID2Name($gid, $userDN);
+
+               $this->assertSame('MyGroup', $group);
+       }
+
        public function testPrimaryGroupID2NameSuccess() {
                $access = $this->getAccessMock();
                $pluginManager = $this->getPluginManagerMock();