From 60d7c8d9f7e03a4a64852a8ede48a704101fad00 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 2 Feb 2024 16:14:48 +0100 Subject: [PATCH 1/2] Revert "don't apply acls when scanning" Signed-off-by: Robin Appelman --- lib/Mount/GroupFolderStorage.php | 31 +++---------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/lib/Mount/GroupFolderStorage.php b/lib/Mount/GroupFolderStorage.php index c6718bb14..abad797a2 100644 --- a/lib/Mount/GroupFolderStorage.php +++ b/lib/Mount/GroupFolderStorage.php @@ -24,10 +24,7 @@ use OC\Files\Cache\Scanner; use OC\Files\ObjectStore\NoopScanner; use OC\Files\ObjectStore\ObjectStoreStorage; -use OC\Files\Storage\Wrapper\Jail; use OC\Files\Storage\Wrapper\Quota; -use OC\Files\Storage\Wrapper\Wrapper; -use OCA\GroupFolders\ACL\ACLStorageWrapper; use OCP\Files\Cache\ICacheEntry; use OCP\Files\Storage\IDisableEncryptionStorage; use OCP\IUser; @@ -74,32 +71,10 @@ public function getCache($path = '', $storage = null) { } public function getScanner($path = '', $storage = null) { - // note that we explicitly don't used the passed in storage - // as we want to perform the scan on the underlying filesystem - // without any of the group folder permissions applied - - /** @var Wrapper $storage */ - $storage = $this->storage; - - // we want to scan without ACLs applied - if ($storage->instanceOfStorage(ACLStorageWrapper::class)) { - // sanity check in case the code setting up the wrapper hierarchy is changed without updating this - if (!$this->storage instanceof Jail) { - throw new \Exception("groupfolder storage layout changed unexpectedly"); - } - - $jailRoot = $this->storage->getUnjailedPath(''); - $aclStorage = $this->storage->getUnjailedStorage(); - - if (!$aclStorage instanceof ACLStorageWrapper) { - throw new \Exception("groupfolder storage layout changed unexpectedly"); - } - $storage = new Jail([ - 'storage' => $aclStorage->getWrapperStorage(), - 'root' => $jailRoot, - ]); + /** @var \OC\Files\Storage\Wrapper\Wrapper $storage */ + if (!$storage) { + $storage = $this; } - if ($storage->instanceOfStorage(ObjectStoreStorage::class)) { $storage->scanner = new NoopScanner($storage); } elseif (!isset($storage->scanner)) { From 3a78d612c635e7f543b690a34956023fd8577e79 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 2 Feb 2024 16:11:17 +0100 Subject: [PATCH 2/2] add test for scanning with acl Signed-off-by: Robin Appelman --- tests/ACL/ACLScannerTest.php | 60 ++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 tests/ACL/ACLScannerTest.php diff --git a/tests/ACL/ACLScannerTest.php b/tests/ACL/ACLScannerTest.php new file mode 100644 index 000000000..06bf9a244 --- /dev/null +++ b/tests/ACL/ACLScannerTest.php @@ -0,0 +1,60 @@ +getMockBuilder(ACLManager::class) + ->disableOriginalConstructor() + ->getMock(); + $manager->method('getACLPermissionsForPath') + ->willReturnCallback(function ($path) use ($rules) { + return $rules[$path] ?? Constants::PERMISSION_ALL; + }); + return $manager; + } + + public function testScanAclStorage() { + $baseStorage = new Temporary([]); + $baseStorage->mkdir('foo'); + $baseStorage->mkdir('foo/bar'); + $baseStorage->mkdir('foo/bar/asd'); + $cache = $baseStorage->getCache(); + $baseStorage->getScanner()->scan(''); + + $cache->update($cache->getId('foo/bar/asd'), ['size' => -1]); + $cache->calculateFolderSize('foo/bar'); + $cache->calculateFolderSize('foo'); + + $this->assertEquals(-1, $cache->get('foo/bar')->getSize()); + + $acls = $this->getAclManager([ + 'foo/bar' => 0, + 'foo/bar/asd' => 0, + ]); + + $aclStorage = new ACLStorageWrapper([ + 'storage' => $baseStorage, + 'acl_manager' => $acls, + 'in_share' => false, + ]); + + $scanner = $aclStorage->getScanner(); + $aclCache = $aclStorage->getCache(); + $scanner->scan(''); + + $this->assertEquals(0, $cache->get('foo/bar')->getSize()); + + $this->assertEquals(31, $cache->get('foo/bar')->getPermissions()); + $this->assertEquals(false, $aclCache->get('foo/bar')); + } +}