diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php index 423eb5c423dfb..3b62741f66ba3 100644 --- a/lib/private/Files/Config/UserMountCache.php +++ b/lib/private/Files/Config/UserMountCache.php @@ -194,11 +194,33 @@ private function removeFromCache(ICachedMountInfo $mount) { private function dbRowToMountInfo(array $row) { $user = $this->userManager->get($row['user_id']); if (is_null($user)) { + // user does not exist any more, delete all mounts of that user directly + $builder = $this->connection->getQueryBuilder(); + $query = $builder->delete('mounts') + ->where($builder->expr()->eq('user_id', $builder->createNamedParameter($row['user_id']))); + $query->execute(); return null; } return new CachedMountInfo($user, (int)$row['storage_id'], (int)$row['root_id'], $row['mount_point'], $row['mount_id'], isset($row['path'])? $row['path']:''); } + /** + * Convert DB rows to CachedMountInfo + * + * @param array $rows DB rows + * @return CachedMountInfo[] + */ + private function convertRows($rows) { + $mountInfos = []; + foreach ($rows as $row) { + $mountInfo = $this->dbRowToMountInfo($row); + if (!is_null($mountInfo)) { + $mountInfos[] = $mountInfo; + } + } + return $mountInfos; + } + /** * @param IUser $user * @return ICachedMountInfo[] @@ -213,7 +235,7 @@ public function getMountsForUser(IUser $user) { $rows = $query->execute()->fetchAll(); - $this->mountsForUsers[$user->getUID()] = array_filter(array_map([$this, 'dbRowToMountInfo'], $rows)); + $this->mountsForUsers[$user->getUID()] = $this->convertRows($rows); } return $this->mountsForUsers[$user->getUID()]; } @@ -231,7 +253,7 @@ public function getMountsForStorageId($numericStorageId) { $rows = $query->execute()->fetchAll(); - return array_filter(array_map([$this, 'dbRowToMountInfo'], $rows)); + return $this->convertRows($rows); } /** @@ -247,7 +269,7 @@ public function getMountsForRootId($rootFileId) { $rows = $query->execute()->fetchAll(); - return array_filter(array_map([$this, 'dbRowToMountInfo'], $rows)); + return $this->convertRows($rows); } /** diff --git a/tests/lib/Files/Config/UserMountCacheTest.php b/tests/lib/Files/Config/UserMountCacheTest.php index 376f0a0276cd8..816037956b8de 100644 --- a/tests/lib/Files/Config/UserMountCacheTest.php +++ b/tests/lib/Files/Config/UserMountCacheTest.php @@ -47,6 +47,7 @@ public function setUp() { $userBackend = new Dummy(); $userBackend->createUser('u1', ''); $userBackend->createUser('u2', ''); + $userBackend->createUser('u3', ''); $this->userManager->registerBackend($userBackend); $this->cache = new \OC\Files\Config\UserMountCache($this->connection, $this->userManager, $this->createMock(Log::class)); } @@ -211,6 +212,7 @@ public function testChangeMountId() { public function testGetMountsForUser() { $user1 = $this->userManager->get('u1'); $user2 = $this->userManager->get('u2'); + $user3 = $this->userManager->get('u3'); list($storage1, $id1) = $this->getStorage(1); list($storage2, $id2) = $this->getStorage(2); @@ -219,9 +221,12 @@ public function testGetMountsForUser() { $this->cache->registerMounts($user1, [$mount1, $mount2]); $this->cache->registerMounts($user2, [$mount2]); + $this->cache->registerMounts($user3, [$mount2]); $this->clearCache(); + $user3->delete(); + $cachedMounts = $this->cache->getMountsForUser($user1); $this->assertCount(2, $cachedMounts); @@ -234,6 +239,9 @@ public function testGetMountsForUser() { $this->assertEquals($user1, $cachedMounts[1]->getUser()); $this->assertEquals($id2, $cachedMounts[1]->getRootId()); $this->assertEquals(2, $cachedMounts[1]->getStorageId()); + + $cachedMounts = $this->cache->getMountsForUser($user3); + $this->assertEmpty($cachedMounts); } public function testGetMountsByStorageId() { @@ -431,4 +439,22 @@ public function testGetMountsForFileIdSubFolderMountOutside() { $this->assertCount(0, $cachedMounts); } + + public function testGetMountsForFileIdDeletedUser() { + $user1 = $this->userManager->get('u1'); + + $rootId = $this->createCacheEntry('', 2); + + $mount1 = new MountPoint($this->getStorage(2, $rootId), '/foo/'); + + $this->cache->registerMounts($user1, [$mount1]); + + $user1->delete(); + + $this->clearCache(); + + $cachedMounts = $this->cache->getMountsForFileId($rootId); + + $this->assertEmpty($cachedMounts); + } }