Skip to content

Commit a41609b

Browse files
authored
[Fix]: Add root node permissions (#279)
* fix: add missing root node permissions * Apply php-cs-fixer changes * fix: STAN * try to specify server version * try to specify server version * try to specify server version * try to specify server version * fix: codeception * fix: tests --------- Co-authored-by: lukmzig <[email protected]>
1 parent 6eb6e76 commit a41609b

File tree

5 files changed

+44
-19
lines changed

5 files changed

+44
-19
lines changed

.github/workflows/elastic-search-codeception.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
strategy:
3131
matrix:
3232
include:
33-
- { php-version: "8.3", dependencies: "highest", pimcore_version: "11.x-dev as 11.99.9", experimental: true, search_engine: "elasticsearch"}
33+
- { php-version: "8.3", dependencies: "highest", pimcore_version: "^11.5", experimental: true, search_engine: "elasticsearch"}
3434

3535
services:
3636
mariadb:

.github/workflows/open-search-codeception.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
include:
3333
- { php-version: "8.2", dependencies: "lowest", pimcore_version: "", experimental: false, search_engine: "openSearch" }
3434
- { php-version: "8.3", dependencies: "highest", pimcore_version: "", experimental: false, search_engine: "openSearch"}
35-
- { php-version: "8.3", dependencies: "highest", pimcore_version: "11.x-dev as 11.99.9", experimental: true, search_engine: "openSearch"}
35+
- { php-version: "8.3", dependencies: "highest", pimcore_version: "^11.5", experimental: true, search_engine: "openSearch"}
3636

3737
services:
3838
mariadb:

.github/workflows/static-analysis.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
include:
2727
- { php-version: "8.2", dependencies: "lowest", experimental: false }
2828
- { php-version: "8.3", dependencies: "highest", experimental: false }
29-
- { php-version: "8.3", dependencies: "highest", pimcore_version: "11.x-dev as 11.99.9", experimental: true }
29+
- { php-version: "8.3", dependencies: "highest", pimcore_version: "^11.5", experimental: true }
3030
steps:
3131
- name: "Checkout code"
3232
uses: "actions/checkout@v2"

src/Service/Permission/PermissionService.php

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,11 @@ public function getAssetPermissions(
5050
/** @var AssetPermissions $permissions */
5151
$permissions = $this->getPermissions(
5252
elementPath: $asset->getFullPath(),
53+
parentId: $asset->getParentId(),
5354
permissionsType: AssetWorkspace::WORKSPACE_TYPE,
5455
defaultPermissions: $permissions,
5556
user: $user
56-
) ?? $permissions;
57+
);
5758

5859
return $this->eventService->dispatchAssetSearchEvent($asset, $permissions)->getPermissions();
5960
}
@@ -66,10 +67,11 @@ public function getDocumentPermissions(
6667
/** @var DocumentPermissions $permissions */
6768
$permissions = $this->getPermissions(
6869
elementPath: $document->getFullPath(),
70+
parentId: $document->getParentId(),
6971
permissionsType: DocumentWorkspace::WORKSPACE_TYPE,
7072
defaultPermissions: $permissions,
7173
user: $user
72-
) ?? $permissions;
74+
);
7375

7476
return $this->eventService->dispatchDocumentSearchEvent($document, $permissions)->getPermissions();
7577
}
@@ -82,10 +84,11 @@ public function getDataObjectPermissions(
8284
/** @var DataObjectPermissions $permissions */
8385
$permissions = $this->getPermissions(
8486
elementPath: $object->getFullPath(),
87+
parentId: $object->getParentId(),
8588
permissionsType: DataObjectWorkspace::WORKSPACE_TYPE,
8689
defaultPermissions: $permissions,
8790
user: $user,
88-
) ?? $permissions;
91+
);
8992

9093
return $this->eventService->dispatchDataObjectSearchEvent($object, $permissions)->getPermissions();
9194
}
@@ -111,17 +114,18 @@ public function getPermissionValue(BasePermissions $permissions, string $permiss
111114

112115
private function getPermissions(
113116
string $elementPath,
117+
int $parentId,
114118
string $permissionsType,
115119
BasePermissions $defaultPermissions,
116120
?User $user
117-
): ?BasePermissions {
121+
): BasePermissions {
118122
$adminPermissions = $this->getAdminUserPermissions(
119123
$user,
120124
$defaultPermissions
121125
);
122126

123127
if ($adminPermissions) {
124-
return $adminPermissions;
128+
return $this->addRootNodePermissions($elementPath, $parentId, $adminPermissions);
125129
}
126130

127131
$userWorkspaces = $this->workspaceService->getRelevantWorkspaces(
@@ -136,8 +140,9 @@ private function getPermissions(
136140
$elementPath
137141
);
138142
}
143+
$permissions = $this->getPermissionsFromWorkspaces($userWorkspaces, $userRoleWorkspaces) ?? $defaultPermissions;
139144

140-
return $this->getPermissionsFromWorkspaces($userWorkspaces, $userRoleWorkspaces);
145+
return $this->addRootNodePermissions($elementPath, $parentId, $permissions);
141146
}
142147

143148
private function getAdminUserPermissions(
@@ -206,4 +211,20 @@ private function addRelevantRolePermissions(
206211

207212
return $workspacePermissions;
208213
}
214+
215+
private function addRootNodePermissions(
216+
string $fullPath,
217+
int $parentId,
218+
BasePermissions $permissions
219+
): BasePermissions {
220+
if ($fullPath === '/' && $parentId === 0) {
221+
$permissions->setDelete(false);
222+
$permissions->setRename(false);
223+
if (method_exists($permissions, 'setUnpublish')) {
224+
$permissions->setUnpublish(false);
225+
}
226+
}
227+
228+
return $permissions;
229+
}
209230
}

tests/Unit/Service/Permission/PermissionServiceTest.php

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ final class PermissionServiceTest extends Unit
5454
public function _before(): void
5555
{
5656
$this->user = new User();
57-
$this->assetSearchResult = new AssetSearchResultItem();
58-
$this->dataObjectSearchResult = new DataObjectSearchResultItem();
59-
$this->documentSearchResultItem = new DocumentSearchResultItem();
57+
$this->assetSearchResult = (new AssetSearchResultItem())->setParentId(1);
58+
$this->dataObjectSearchResult = (new DataObjectSearchResultItem())->setParentId(1);
59+
$this->documentSearchResultItem = (new DocumentSearchResultItem())->setParentId(1);
6060
}
6161

6262
public function testAssetPermissionWithUserOnRoot(): void
@@ -67,13 +67,14 @@ public function testAssetPermissionWithUserOnRoot(): void
6767
type: AssetWorkspace::WORKSPACE_TYPE
6868
)]);
6969
$assetPermission = $this->getPermissionServiceWithUser()->getAssetPermissions(
70-
$this->assetSearchResult->setFullPath('/'),
70+
$this->assetSearchResult->setParentId(0)->setFullPath('/'),
7171
$this->user
7272
);
7373

7474
$this->assertTrue($assetPermission->isView());
7575
$this->assertTrue($assetPermission->isList());
7676
$this->assertFalse($assetPermission->isDelete());
77+
$this->assertFalse($assetPermission->isRename());
7778
}
7879

7980
public function testAssetPermissionWithUserOnCustomPath(): void
@@ -160,12 +161,13 @@ public function testAssetPermissionWithoutUserOnRoot(): void
160161
{
161162
$permissionService = $this->getPermissionServiceWithoutUser();
162163
$assetPermission = $permissionService->getAssetPermissions(
163-
$this->assetSearchResult->setFullPath('/'),
164+
$this->assetSearchResult->setParentId(0)->setFullPath('/'),
164165
null
165166
);
166167
$this->assertSame(self::DEFAULT_VALUE, $assetPermission->isList());
167168
$this->assertSame(self::DEFAULT_VALUE, $assetPermission->isView());
168169
$this->assertSame(self::DEFAULT_VALUE, $assetPermission->isRename());
170+
$this->assertSame(self::DEFAULT_VALUE, $assetPermission->isDelete());
169171
}
170172

171173
public function testObjectPermissionWithUserOnRoot(): void
@@ -176,15 +178,16 @@ public function testObjectPermissionWithUserOnRoot(): void
176178
type: DataObjectWorkspace::WORKSPACE_TYPE
177179
)]);
178180
$permission = $this->getPermissionServiceWithUser()->getDataObjectPermissions(
179-
$this->dataObjectSearchResult->setFullPath('/'),
181+
$this->dataObjectSearchResult->setParentId(0)->setFullPath('/'),
180182
$this->user
181183
);
182184

183185
$this->assertTrue($permission->isView());
184186
$this->assertTrue($permission->isList());
185187
$this->assertTrue($permission->isPublish());
186-
$this->assertTrue($permission->isUnpublish());
187188
$this->assertFalse($permission->isDelete());
189+
$this->assertFalse($permission->isUnpublish());
190+
$this->assertFalse($permission->isRename());
188191
}
189192

190193
public function testObjectPermissionWithUserOnCustomPath(): void
@@ -272,7 +275,7 @@ public function testObjectPermissionWithoutUserOnRoot(): void
272275
{
273276
$permissionService = $this->getPermissionServiceWithoutUser();
274277
$permission = $permissionService->getDataObjectPermissions(
275-
$this->dataObjectSearchResult->setFullPath('/'),
278+
$this->dataObjectSearchResult->setParentId(0)->setFullPath('/'),
276279
null
277280
);
278281

@@ -290,15 +293,16 @@ public function testDocumentPermissionWithUserOnRoot(): void
290293
type: DocumentWorkspace::WORKSPACE_TYPE
291294
)]);
292295
$permission = $this->getPermissionServiceWithUser()->getDocumentPermissions(
293-
$this->documentSearchResultItem->setFullPath('/'),
296+
$this->documentSearchResultItem->setParentId(0)->setFullPath('/'),
294297
$this->user
295298
);
296299

297300
$this->assertTrue($permission->isView());
298301
$this->assertTrue($permission->isSave());
299302
$this->assertTrue($permission->isPublish());
300-
$this->assertTrue($permission->isUnpublish());
303+
$this->assertFalse($permission->isUnpublish());
301304
$this->assertFalse($permission->isList());
305+
$this->assertFalse($permission->isDelete());
302306
}
303307

304308
public function testDocumentPermissionWithUserOnCustomPath(): void

0 commit comments

Comments
 (0)