From 44490d3470f4e9ad7eaf71865f8a92389e4e44c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Thu, 23 Nov 2023 16:29:49 +0100 Subject: [PATCH 1/8] Fix ACL rules for trashed subfolders from groupfolders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- lib/ACL/ACLManager.php | 30 +++++++++++++++++++---------- lib/ACL/ACLManagerFactory.php | 11 +++++++---- lib/AppInfo/Application.php | 1 + lib/Trash/TrashBackend.php | 20 +++++++------------ lib/Trash/TrashManager.php | 8 ++++++++ tests/ACL/ACLManagerTest.php | 36 +++++++++++++++++++++++++++++++++-- 6 files changed, 77 insertions(+), 29 deletions(-) diff --git a/lib/ACL/ACLManager.php b/lib/ACL/ACLManager.php index 7c5115d03..f73f11705 100644 --- a/lib/ACL/ACLManager.php +++ b/lib/ACL/ACLManager.php @@ -24,24 +24,25 @@ namespace OCA\GroupFolders\ACL; use OC\Cache\CappedMemoryCache; +use OCA\GroupFolders\Trash\TrashManager; use OCP\Constants; use OCP\Files\IRootFolder; use OCP\IUser; class ACLManager { - private RuleManager $ruleManager; private CappedMemoryCache $ruleCache; - private IUser $user; - private ?int $rootStorageId; /** @var callable */ private $rootFolderProvider; - public function __construct(RuleManager $ruleManager, IUser $user, callable $rootFolderProvider, ?int $rootStorageId = null) { - $this->ruleManager = $ruleManager; + public function __construct( + private RuleManager $ruleManager, + private TrashManager $trashManager, + private IUser $user, + callable $rootFolderProvider, + private ?int $rootStorageId = null, + ) { $this->ruleCache = new CappedMemoryCache(); - $this->user = $user; $this->rootFolderProvider = $rootFolderProvider; - $this->rootStorageId = $rootStorageId; } private function getRootStorageId(): int { @@ -98,13 +99,22 @@ private function getRules(array $paths, bool $cache = true): array { * @return string[] */ private function getRelevantPaths(string $path): array { - $paths = [$path]; + $paths = []; + $fromTrashbin = str_starts_with($path, '__groupfolders/trash/'); + if ($fromTrashbin) { + $rootName = explode('/', $path, 5)[3]; + $rootName = substr($rootName, 0, strrpos($rootName, '.d')); + } while ($path !== '') { + $paths[] = $path; $path = dirname($path); - if ($path === '.' || $path === '/') { + if ($fromTrashbin && ($path === '__groupfolders/trash')) { + $trashItemRow = $this->trashManager->getTrashItemByFileName($rootName); + $path = dirname('__groupfolders/' . $trashItemRow['folder_id'] . '/' . $trashItemRow['original_location']); + $fromTrashbin = false; + } elseif ($path === '.' || $path === '/') { $path = ''; } - $paths[] = $path; } return $paths; diff --git a/lib/ACL/ACLManagerFactory.php b/lib/ACL/ACLManagerFactory.php index ac45dc1c9..805d78a3d 100644 --- a/lib/ACL/ACLManagerFactory.php +++ b/lib/ACL/ACLManagerFactory.php @@ -23,18 +23,21 @@ namespace OCA\GroupFolders\ACL; +use OCA\GroupFolders\Trash\TrashManager; use OCP\IUser; class ACLManagerFactory { - private $ruleManager; private $rootFolderProvider; - public function __construct(RuleManager $ruleManager, callable $rootFolderProvider) { - $this->ruleManager = $ruleManager; + public function __construct( + private RuleManager $ruleManager, + private TrashManager $trashManager, + callable $rootFolderProvider, + ) { $this->rootFolderProvider = $rootFolderProvider; } public function getACLManager(IUser $user, ?int $rootStorageId = null): ACLManager { - return new ACLManager($this->ruleManager, $user, $this->rootFolderProvider, $rootStorageId); + return new ACLManager($this->ruleManager, $this->trashManager, $user, $this->rootFolderProvider, $rootStorageId); } } diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index cb7e8b040..3b1d22f3a 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -219,6 +219,7 @@ public function register(IRegistrationContext $context): void { }; return new ACLManagerFactory( $c->get(RuleManager::class), + $c->get(TrashManager::class), $rootFolderProvider ); }); diff --git a/lib/Trash/TrashBackend.php b/lib/Trash/TrashBackend.php index 948fc9706..78abfe241 100644 --- a/lib/Trash/TrashBackend.php +++ b/lib/Trash/TrashBackend.php @@ -121,7 +121,7 @@ public function restoreItem(ITrashItem $item) { if ($node === null) { throw new NotFoundException(); } - if (!$this->userHasAccessToPath($item->getUser(), $folderId . '/' . $item->getOriginalLocation(), Constants::PERMISSION_UPDATE)) { + if (!$this->userHasAccessToPath($item->getUser(), $item->getPath(), Constants::PERMISSION_UPDATE)) { throw new NotPermittedException(); } $folderPermissions = $this->folderManager->getFolderPermissionsForUser($item->getUser(), (int)$folderId); @@ -191,7 +191,7 @@ public function removeItem(ITrashItem $item) { if ($node->getStorage()->unlink($node->getInternalPath()) === false) { throw new \Exception('Failed to remove item from trashbin'); } - if (!$this->userHasAccessToPath($item->getUser(), $folderId . '/' . $item->getOriginalLocation(), Constants::PERMISSION_DELETE)) { + if (!$this->userHasAccessToPath($item->getUser(), $item->getPath(), Constants::PERMISSION_DELETE)) { throw new NotPermittedException(); } @@ -253,7 +253,7 @@ private function userHasAccessToPath( int $permission = Constants::PERMISSION_READ ): bool { $activePermissions = $this->aclManagerFactory->getACLManager($user) - ->getACLPermissionsForPath('__groupfolders/' . ltrim($path, '/')); + ->getACLPermissionsForPath($path); return (bool)($activePermissions & $permission); } @@ -265,7 +265,7 @@ private function getNodeForTrashItem(IUser $user, ITrashItem $trashItem): ?Node $trashRoot = $this->getTrashFolder((int)$folderId); try { $node = $trashRoot->get($path); - if (!$this->userHasAccessToPath($user, $folderId . '/' . $trashItem->getOriginalLocation())) { + if (!$this->userHasAccessToPath($user, $trashItem->getPath())) { return null; } return $node; @@ -321,12 +321,12 @@ private function getTrashForFolders(IUser $user, array $folders): array { $timestamp = (int)substr($pathParts['extension'], 1); $name = $pathParts['filename']; $key = $folderId . '/' . $name . '/' . $timestamp; - $originalLocation = isset($indexedRows[$key]) ? $indexedRows[$key]['original_location'] : ''; - if (!$this->userHasAccessToPath($user, $folderId . '/' . $originalLocation)) { + if (!$this->userHasAccessToPath($user, $item->getPath())) { continue; } $info = $item->getFileInfo(); $info['name'] = $name; + $originalLocation = isset($indexedRows[$key]) ? $indexedRows[$key]['original_location'] : ''; $items[] = new GroupTrashItem( $this, $originalLocation, @@ -354,13 +354,7 @@ public function getTrashNodeById(IUser $user, int $fileId): ?Node { $relativePath = $trashFolder->getRelativePath($absolutePath); [, $folderId, $nameAndTime] = explode('/', $relativePath); - if (substr_count($relativePath, "/") > 2) { - // fileid is a file inside a deleted folder - $fileId = $trashFolder->get($folderId . "/" . $nameAndTime)->getId(); - } - $trashItem = $this->trashManager->getTrashItemByFileId($fileId); - $originalPath = $folderId . '/' . ($trashItem ? $trashItem['original_location'] : '/'); - if ($this->userHasAccessToFolder($user, (int)$folderId) && $this->userHasAccessToPath($user, $originalPath)) { + if ($this->userHasAccessToFolder($user, (int)$folderId) && $this->userHasAccessToPath($user, $absolutePath)) { return $trashFolder->get($relativePath); } else { return null; diff --git a/lib/Trash/TrashManager.php b/lib/Trash/TrashManager.php index 0f6ad1871..a61f2926d 100644 --- a/lib/Trash/TrashManager.php +++ b/lib/Trash/TrashManager.php @@ -65,6 +65,14 @@ public function getTrashItemByFileId(int $fileId): ?array { return $query->executeQuery()->fetch() ?: null; } + public function getTrashItemByFileName(string $name): ?array { + $query = $this->connection->getQueryBuilder(); + $query->select(['trash_id', 'name', 'deleted_time', 'original_location', 'folder_id']) + ->from('group_folders_trash') + ->where($query->expr()->eq('name', $query->createNamedParameter($name, IQueryBuilder::PARAM_STR))); + return $query->executeQuery()->fetch() ?: null; + } + public function removeItem(int $folderId, string $name, int $deletedTime): void { $query = $this->connection->getQueryBuilder(); $query->delete('group_folders_trash') diff --git a/tests/ACL/ACLManagerTest.php b/tests/ACL/ACLManagerTest.php index 5a97cdb1c..d774fb4f8 100644 --- a/tests/ACL/ACLManagerTest.php +++ b/tests/ACL/ACLManagerTest.php @@ -27,6 +27,7 @@ use OCA\GroupFolders\ACL\Rule; use OCA\GroupFolders\ACL\RuleManager; use OCA\GroupFolders\ACL\UserMapping\IUserMapping; +use OCA\GroupFolders\Trash\TrashManager; use OCP\Constants; use OCP\Files\IRootFolder; use OCP\Files\Mount\IMountPoint; @@ -34,8 +35,10 @@ use Test\TestCase; class ACLManagerTest extends TestCase { - /** @var RuleManager|\PHPUnit_Framework_MockObject_MockObject */ + /** @var RuleManager */ private $ruleManager; + /** @var TrashManager */ + private $trashManager; /** @var IUser */ private $user; /** @var ACLManager */ @@ -56,7 +59,8 @@ protected function setUp(): void { $rootFolder = $this->createMock(IRootFolder::class); $rootFolder->method('getMountPoint') ->willReturn($rootMountPoint); - $this->aclManager = new ACLManager($this->ruleManager, $this->user, function () use ($rootFolder) { + $this->trashManager = $this->createMock(TrashManager::class); + $this->aclManager = new ACLManager($this->ruleManager, $this->trashManager, $this->user, function () use ($rootFolder) { return $rootFolder; }); $this->dummyMapping = $this->createMock(IUserMapping::class); @@ -95,4 +99,32 @@ public function testGetACLPermissionsForPath() { $this->assertEquals(Constants::PERMISSION_ALL - Constants::PERMISSION_SHARE, $this->aclManager->getACLPermissionsForPath('foo/bar')); $this->assertEquals(Constants::PERMISSION_ALL, $this->aclManager->getACLPermissionsForPath('foo/bar/sub')); } + + public function testGetACLPermissionsForPathInTrashbin() { + $this->rules = [ + '__groupfolders/1' => [ + new Rule($this->dummyMapping, 10, Constants::PERMISSION_READ + Constants::PERMISSION_UPDATE, Constants::PERMISSION_READ), // read only + new Rule($this->dummyMapping, 10, Constants::PERMISSION_SHARE, 0) // deny share + ], + '__groupfolders/1/subfolder' => [ + new Rule($this->dummyMapping, 10, Constants::PERMISSION_UPDATE, Constants::PERMISSION_UPDATE) // add write + ], + '__groupfolders/trash/1/subfolder2.d1700748275' => [ + new Rule($this->dummyMapping, 10, Constants::PERMISSION_SHARE, Constants::PERMISSION_SHARE) // add share + ] + ]; + + $this->trashManager + ->expects($this->once()) + ->method('getTrashItemByFileName') + ->with('subfolder2') + ->willReturn([ + 'trash_id' => 3, + 'name' => 'subfolder2', + 'deleted_time' => '1700752274', + 'original_location' => 'subfolder/subfolder2', + 'folder_id' => '1', + ]); + $this->assertEquals(Constants::PERMISSION_ALL, $this->aclManager->getACLPermissionsForPath('__groupfolders/trash/1/subfolder2.d1700748275/coucou.md')); + } } From 1bab814faa143a49a582e57049d817d055d09846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Mon, 27 Nov 2023 11:47:10 +0100 Subject: [PATCH 2/8] Improve code readability and add comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- lib/ACL/ACLManager.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/ACL/ACLManager.php b/lib/ACL/ACLManager.php index f73f11705..414ce219b 100644 --- a/lib/ACL/ACLManager.php +++ b/lib/ACL/ACLManager.php @@ -102,17 +102,23 @@ private function getRelevantPaths(string $path): array { $paths = []; $fromTrashbin = str_starts_with($path, '__groupfolders/trash/'); if ($fromTrashbin) { - $rootName = explode('/', $path, 5)[3]; - $rootName = substr($rootName, 0, strrpos($rootName, '.d')); + /* Exploded path will look like ["__groupfolders", "trash", "1", "folderName.d2345678", "rest/of/the/path.txt"] */ + $rootTrashedItemName = explode('/', $path, 5)[3]; + /* Remove the date part */ + $rootTrashedItemName = substr($rootTrashedItemName, 0, strrpos($rootTrashedItemName, '.d')); } while ($path !== '') { $paths[] = $path; $path = dirname($path); if ($fromTrashbin && ($path === '__groupfolders/trash')) { - $trashItemRow = $this->trashManager->getTrashItemByFileName($rootName); + /* We are in trash and hit the root folder, continue looking for ACLs on parent folders in original location */ + $trashItemRow = $this->trashManager->getTrashItemByFileName($rootTrashedItemName); $path = dirname('__groupfolders/' . $trashItemRow['folder_id'] . '/' . $trashItemRow['original_location']); $fromTrashbin = false; - } elseif ($path === '.' || $path === '/') { + continue; + } + + if ($path === '.' || $path === '/') { $path = ''; } } From 2cf965eadeeb7760467c59e07e0226b0512b3852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Mon, 4 Dec 2023 16:21:22 +0100 Subject: [PATCH 3/8] Activate test for ACLs on deleted folders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- cypress/e2e/groupfolders.cy.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cypress/e2e/groupfolders.cy.ts b/cypress/e2e/groupfolders.cy.ts index 1fed11450..5cb464958 100644 --- a/cypress/e2e/groupfolders.cy.ts +++ b/cypress/e2e/groupfolders.cy.ts @@ -114,6 +114,7 @@ describe('Groupfolders ACLs and trashbin behavior', () => { fileOrFolderDoesNotExist('subfolder1') // Delete files + cy.log('Deleting the files') cy.login(managerUser) cy.visit('/apps/files') enterFolder(groupFolderName) @@ -135,6 +136,7 @@ describe('Groupfolders ACLs and trashbin behavior', () => { fileOrFolderDoesNotExistInTrashbin('subfolder2') // Restore files + cy.log('Restoring the files') cy.login(managerUser) cy.visit('/apps/files/trashbin') fileOrFolderExistsInTrashbin('file1.txt') @@ -159,7 +161,7 @@ describe('Groupfolders ACLs and trashbin behavior', () => { fileOrFolderDoesNotExist('subfolder1') }) - it.skip('ACL directly on deleted folder', () => { + it('ACL directly on deleted folder', () => { // Create a subfolders and a file as manager cy.login(managerUser) cy.mkdir(managerUser, `/${groupFolderName}/subfolder1`) From cc2684d3a1ba9c06c0299201b721ce2a1be9b79c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Tue, 5 Dec 2023 11:51:11 +0100 Subject: [PATCH 4/8] Add intercepts and waits to cypress functions to avoid timing failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- cypress/e2e/groupfoldersUtils.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cypress/e2e/groupfoldersUtils.ts b/cypress/e2e/groupfoldersUtils.ts index 42cf61295..38b6bfbca 100644 --- a/cypress/e2e/groupfoldersUtils.ts +++ b/cypress/e2e/groupfoldersUtils.ts @@ -95,17 +95,23 @@ export function fileOrFolderDoesNotExistInTrashbin(name: string) { } export function enterFolder(name: string) { + cy.intercept({ times: 1, method: 'PROPFIND', url: `**/dav/files/**/${name}` }).as('propFindFolder') cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${name}"]`).click() + cy.wait('@propFindFolder') } export function enterFolderInTrashbin(name: string) { + cy.intercept({ times: 1, method: 'PROPFIND', url: `**/dav/trashbin/**/${name}.d*` }).as('propFindFolder') cy.get(`[data-cy-files-list] [data-cy-files-list-row-name^="${name}.d"]`).click() + cy.wait('@propFindFolder') } export function deleteFile(name: string) { + cy.intercept({ times: 1, method: 'DELETE', url: `**/dav/files/**/${name}` }).as('delete') cy.get(`[data-cy-files-list] [data-cy-files-list-row-name="${name}"] [data-cy-files-list-row-actions]`).click() cy.get(`[data-cy-files-list] [data-cy-files-list-row-action="delete"]`).scrollIntoView() cy.get(`[data-cy-files-list] [data-cy-files-list-row-action="delete"]`).click() + cy.wait('@delete') } export function restoreFile(name: string) { From ad09da75d251fc3db03b50e9fba576f188e211a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Tue, 5 Dec 2023 15:41:09 +0100 Subject: [PATCH 5/8] Temporary fix to avoid error in cypress test, bug should be fixed and MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit this commit reverted later. Signed-off-by: Côme Chilliet --- cypress/e2e/groupfolders.cy.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cypress/e2e/groupfolders.cy.ts b/cypress/e2e/groupfolders.cy.ts index 5cb464958..c7219b381 100644 --- a/cypress/e2e/groupfolders.cy.ts +++ b/cypress/e2e/groupfolders.cy.ts @@ -120,6 +120,9 @@ describe('Groupfolders ACLs and trashbin behavior', () => { enterFolder(groupFolderName) enterFolder('subfolder1') deleteFile('file1.txt') + cy.visit('/apps/files') + enterFolder(groupFolderName) + enterFolder('subfolder1') deleteFile('subfolder2') // User1 sees it in trash From 72cf755e1b9189c90a99f3c6cf314398149d7a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Tue, 5 Dec 2023 16:21:32 +0100 Subject: [PATCH 6/8] Fix ACL on trashbin when several groupfolders contain files with the same name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- lib/ACL/ACLManager.php | 9 ++++++--- lib/Trash/TrashManager.php | 6 ++++-- tests/ACL/ACLManagerTest.php | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/ACL/ACLManager.php b/lib/ACL/ACLManager.php index 414ce219b..74c76a5ba 100644 --- a/lib/ACL/ACLManager.php +++ b/lib/ACL/ACLManager.php @@ -103,16 +103,19 @@ private function getRelevantPaths(string $path): array { $fromTrashbin = str_starts_with($path, '__groupfolders/trash/'); if ($fromTrashbin) { /* Exploded path will look like ["__groupfolders", "trash", "1", "folderName.d2345678", "rest/of/the/path.txt"] */ - $rootTrashedItemName = explode('/', $path, 5)[3]; + [,,$groupFolderId,$rootTrashedItemName] = explode('/', $path, 5); + $groupFolderId = (int)$groupFolderId; /* Remove the date part */ - $rootTrashedItemName = substr($rootTrashedItemName, 0, strrpos($rootTrashedItemName, '.d')); + $separatorPos = strrpos($rootTrashedItemName, '.d'); + $rootTrashedItemDate = (int)substr($rootTrashedItemName, $separatorPos + 2); + $rootTrashedItemName = substr($rootTrashedItemName, 0, $separatorPos); } while ($path !== '') { $paths[] = $path; $path = dirname($path); if ($fromTrashbin && ($path === '__groupfolders/trash')) { /* We are in trash and hit the root folder, continue looking for ACLs on parent folders in original location */ - $trashItemRow = $this->trashManager->getTrashItemByFileName($rootTrashedItemName); + $trashItemRow = $this->trashManager->getTrashItemByFileName($groupFolderId, $rootTrashedItemName, $rootTrashedItemDate); $path = dirname('__groupfolders/' . $trashItemRow['folder_id'] . '/' . $trashItemRow['original_location']); $fromTrashbin = false; continue; diff --git a/lib/Trash/TrashManager.php b/lib/Trash/TrashManager.php index a61f2926d..a769da298 100644 --- a/lib/Trash/TrashManager.php +++ b/lib/Trash/TrashManager.php @@ -65,11 +65,13 @@ public function getTrashItemByFileId(int $fileId): ?array { return $query->executeQuery()->fetch() ?: null; } - public function getTrashItemByFileName(string $name): ?array { + public function getTrashItemByFileName(int $folderId, string $name, int $deletedTime): ?array { $query = $this->connection->getQueryBuilder(); $query->select(['trash_id', 'name', 'deleted_time', 'original_location', 'folder_id']) ->from('group_folders_trash') - ->where($query->expr()->eq('name', $query->createNamedParameter($name, IQueryBuilder::PARAM_STR))); + ->where($query->expr()->eq('folder_id', $query->createNamedParameter($folderId, IQueryBuilder::PARAM_INT))) + ->andWhere($query->expr()->eq('name', $query->createNamedParameter($name))) + ->andWhere($query->expr()->eq('deleted_time', $query->createNamedParameter($deletedTime, IQueryBuilder::PARAM_INT))); return $query->executeQuery()->fetch() ?: null; } diff --git a/tests/ACL/ACLManagerTest.php b/tests/ACL/ACLManagerTest.php index d774fb4f8..b85b1ed5b 100644 --- a/tests/ACL/ACLManagerTest.php +++ b/tests/ACL/ACLManagerTest.php @@ -117,7 +117,7 @@ public function testGetACLPermissionsForPathInTrashbin() { $this->trashManager ->expects($this->once()) ->method('getTrashItemByFileName') - ->with('subfolder2') + ->with(1, 'subfolder2', 1700752274) ->willReturn([ 'trash_id' => 3, 'name' => 'subfolder2', From 57767905b6142d490acdfe2bebe1cc4b76003de8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Tue, 5 Dec 2023 17:19:54 +0100 Subject: [PATCH 7/8] Fix test by being consistent between filename and data timestamp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Côme Chilliet --- tests/ACL/ACLManagerTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ACL/ACLManagerTest.php b/tests/ACL/ACLManagerTest.php index b85b1ed5b..eacb23a8e 100644 --- a/tests/ACL/ACLManagerTest.php +++ b/tests/ACL/ACLManagerTest.php @@ -109,7 +109,7 @@ public function testGetACLPermissionsForPathInTrashbin() { '__groupfolders/1/subfolder' => [ new Rule($this->dummyMapping, 10, Constants::PERMISSION_UPDATE, Constants::PERMISSION_UPDATE) // add write ], - '__groupfolders/trash/1/subfolder2.d1700748275' => [ + '__groupfolders/trash/1/subfolder2.d1700752274' => [ new Rule($this->dummyMapping, 10, Constants::PERMISSION_SHARE, Constants::PERMISSION_SHARE) // add share ] ]; @@ -125,6 +125,6 @@ public function testGetACLPermissionsForPathInTrashbin() { 'original_location' => 'subfolder/subfolder2', 'folder_id' => '1', ]); - $this->assertEquals(Constants::PERMISSION_ALL, $this->aclManager->getACLPermissionsForPath('__groupfolders/trash/1/subfolder2.d1700748275/coucou.md')); + $this->assertEquals(Constants::PERMISSION_ALL, $this->aclManager->getACLPermissionsForPath('__groupfolders/trash/1/subfolder2.d1700752274/coucou.md')); } } From 555f6694675b708923ea6aa3b97862e6ce63a6ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= <91878298+come-nc@users.noreply.github.com> Date: Tue, 12 Dec 2023 17:28:58 +0100 Subject: [PATCH 8/8] Make it clearer that we search the original location in the same groupfolder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Louis Signed-off-by: Côme Chilliet <91878298+come-nc@users.noreply.github.com> --- lib/ACL/ACLManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ACL/ACLManager.php b/lib/ACL/ACLManager.php index 74c76a5ba..44dcd03f8 100644 --- a/lib/ACL/ACLManager.php +++ b/lib/ACL/ACLManager.php @@ -116,7 +116,7 @@ private function getRelevantPaths(string $path): array { if ($fromTrashbin && ($path === '__groupfolders/trash')) { /* We are in trash and hit the root folder, continue looking for ACLs on parent folders in original location */ $trashItemRow = $this->trashManager->getTrashItemByFileName($groupFolderId, $rootTrashedItemName, $rootTrashedItemDate); - $path = dirname('__groupfolders/' . $trashItemRow['folder_id'] . '/' . $trashItemRow['original_location']); + $path = dirname('__groupfolders/' . $groupFolderId . '/' . $trashItemRow['original_location']); $fromTrashbin = false; continue; }