From aeecefb6784c18dbf01d2b06c0368a9656dd87ec Mon Sep 17 00:00:00 2001 From: Git'Fellow <12234510+solracsf@users.noreply.github.com> Date: Wed, 8 Jul 2026 11:30:50 +0200 Subject: [PATCH 1/2] fix(files_sharing): preserve unmasked permissions as scan_permissions Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com> --- apps/files_sharing/lib/Cache.php | 3 ++ apps/files_sharing/tests/CacheTest.php | 49 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/apps/files_sharing/lib/Cache.php b/apps/files_sharing/lib/Cache.php index beba9b5724500..ee486e8db7f3d 100644 --- a/apps/files_sharing/lib/Cache.php +++ b/apps/files_sharing/lib/Cache.php @@ -135,6 +135,9 @@ protected function formatCacheEntry($entry, $path = null) { try { if (isset($entry['permissions'])) { + // keep the unmasked permissions so a future scan or cross-storage + // copy doesn't persist the share-masked permissions in the cache + $entry['scan_permissions'] ??= $entry['permissions']; $entry['permissions'] &= $this->share->getPermissions(); } else { $entry['permissions'] = $this->storage->getPermissions($entry['path']); diff --git a/apps/files_sharing/tests/CacheTest.php b/apps/files_sharing/tests/CacheTest.php index 0f0f5b21ddbad..ec67a354015c7 100644 --- a/apps/files_sharing/tests/CacheTest.php +++ b/apps/files_sharing/tests/CacheTest.php @@ -558,6 +558,55 @@ public function testSearchShareJailedStorage(): void { $this->assertCount(1, $results); } + public function testSingleFileShareKeepsUnmaskedPermissionsAsScanPermissions(): void { + $sourceEntry = $this->ownerCache->get('files/container/shared single file.txt'); + + /** @var SharedStorage $sharedStorage */ + [$sharedStorage] = $this->user2View->resolvePath('shared single file.txt'); + $entry = $sharedStorage->getCache()->get(''); + + $mask = Constants::PERMISSION_ALL & ~(Constants::PERMISSION_CREATE | Constants::PERMISSION_DELETE); + $this->assertEquals($sourceEntry->getPermissions() & $mask, $entry->getPermissions()); + $this->assertEquals($sourceEntry->getPermissions(), $entry['scan_permissions']); + } + + public function testFolderShareKeepsUnmaskedPermissionsAsScanPermissions(): void { + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + + $rootFolder = \OC::$server->getUserFolder(self::TEST_FILES_SHARING_API_USER1); + $node = $rootFolder->get('container'); + $share = $this->shareManager->newShare(); + $share->setNode($node) + ->setShareType(IShare::TYPE_USER) + ->setSharedWith(self::TEST_FILES_SHARING_API_USER2) + ->setSharedBy(self::TEST_FILES_SHARING_API_USER1) + ->setPermissions(Constants::PERMISSION_READ | Constants::PERMISSION_SHARE); + $share = $this->shareManager->createShare($share); + $share->setStatus(IShare::STATUS_ACCEPTED); + $this->shareManager->updateShare($share); + Server::get(ISetupManager::class)->tearDown(); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + + /** @var SharedStorage $sharedStorage */ + [$sharedStorage] = $this->user2View->resolvePath('container'); + $sharedCache = $sharedStorage->getCache(); + $mask = Constants::PERMISSION_READ | Constants::PERMISSION_SHARE; + + $entry = $sharedCache->get('shareddir/bar.txt'); + $sourceEntry = $this->ownerCache->get('files/container/shareddir/bar.txt'); + $this->assertEquals($sourceEntry->getPermissions() & $mask, $entry->getPermissions()); + $this->assertEquals($sourceEntry->getPermissions(), $entry['scan_permissions']); + + $children = $sharedCache->getFolderContents('shareddir'); + $this->assertNotEmpty($children); + foreach ($children as $child) { + $sourceChild = $this->ownerCache->get('files/container/shareddir/' . $child->getName()); + $this->assertEquals($sourceChild->getPermissions() & $mask, $child->getPermissions()); + $this->assertEquals($sourceChild->getPermissions(), $child['scan_permissions']); + } + } + public function testWatcherRootChange(): void { $sourceStorage = new Temporary(); $sourceStorage->mkdir('shared'); From a8708d923c9371a7f0774908f88af9bd261ab2e5 Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Thu, 16 Jul 2026 10:33:51 +0200 Subject: [PATCH 2/2] fix: adapt code to stable33 branch Signed-off-by: Carl Schwan --- apps/files_sharing/tests/CacheTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files_sharing/tests/CacheTest.php b/apps/files_sharing/tests/CacheTest.php index ec67a354015c7..fdae67bb8229b 100644 --- a/apps/files_sharing/tests/CacheTest.php +++ b/apps/files_sharing/tests/CacheTest.php @@ -584,7 +584,7 @@ public function testFolderShareKeepsUnmaskedPermissionsAsScanPermissions(): void $share = $this->shareManager->createShare($share); $share->setStatus(IShare::STATUS_ACCEPTED); $this->shareManager->updateShare($share); - Server::get(ISetupManager::class)->tearDown(); + Server::get(SetupManager::class)->tearDown(); self::loginHelper(self::TEST_FILES_SHARING_API_USER2);