From d58fed35f886bf800d3da07b63a7781f336d4a2a Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 27 Nov 2023 17:36:57 +0100 Subject: [PATCH] don't apply acls when scanning Signed-off-by: Robin Appelman --- lib/Mount/GroupFolderStorage.php | 31 ++++++++++++++++++++++++++++--- tests/stub.phpstub | 1 + 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/Mount/GroupFolderStorage.php b/lib/Mount/GroupFolderStorage.php index 8236d7c76..5f3845bc9 100644 --- a/lib/Mount/GroupFolderStorage.php +++ b/lib/Mount/GroupFolderStorage.php @@ -24,7 +24,10 @@ use OC\Files\Cache\Scanner; use OC\Files\ObjectStore\ObjectStoreScanner; 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\IUser; use OCP\IUserSession; @@ -73,10 +76,32 @@ public function getCache($path = '', $storage = null) { } public function getScanner($path = '', $storage = null) { - /** @var \OC\Files\Storage\Wrapper\Wrapper $storage */ - if (!$storage) { - $storage = $this; + // 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, + ]); } + if ($storage->instanceOfStorage(ObjectStoreStorage::class)) { $storage->scanner = new ObjectStoreScanner($storage); } elseif (!isset($storage->scanner)) { diff --git a/tests/stub.phpstub b/tests/stub.phpstub index 53ee63855..688833009 100644 --- a/tests/stub.phpstub +++ b/tests/stub.phpstub @@ -1502,6 +1502,7 @@ namespace OC\Files\Storage\Wrapper{ class Jail extends Wrapper { public function getUnjailedPath(string $path): string {} + public function getUnjailedStorage(): IStorage {} } class Quota extends Wrapper {