Skip to content

Commit 392367f

Browse files
committed
fix(policy): propagate actor capabilities in context factory
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
1 parent 8f3540f commit 392367f

1 file changed

Lines changed: 27 additions & 5 deletions

File tree

lib/Service/Policy/Runtime/PolicyContextFactory.php

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
namespace OCA\Libresign\Service\Policy\Runtime;
1010

1111
use OCA\Libresign\Service\Policy\Model\PolicyContext;
12+
use OCP\Group\ISubAdmin;
1213
use OCP\IGroupManager;
1314
use OCP\IUser;
1415
use OCP\IUserManager;
@@ -18,13 +19,15 @@ final class PolicyContextFactory {
1819
public function __construct(
1920
private IUserManager $userManager,
2021
private IGroupManager $groupManager,
22+
private ISubAdmin $subAdmin,
2123
private IUserSession $userSession,
2224
) {
2325
}
2426

2527
/** @param array<string, mixed> $requestOverrides */
2628
public function forCurrentUser(array $requestOverrides = [], ?array $activeContext = null): PolicyContext {
27-
return $this->forUser($this->userSession->getUser(), $requestOverrides, $activeContext);
29+
$user = $this->userSession->getUser();
30+
return $this->build($user?->getUID(), $user, $requestOverrides, $activeContext, $user);
2831
}
2932

3033
public function isCurrentActorSystemAdmin(): bool {
@@ -38,7 +41,7 @@ public function isCurrentActorSystemAdmin(): bool {
3841

3942
/** @param array<string, mixed> $requestOverrides */
4043
public function forUser(?IUser $user, array $requestOverrides = [], ?array $activeContext = null): PolicyContext {
41-
return $this->build($user?->getUID(), $user, $requestOverrides, $activeContext);
44+
return $this->build($user?->getUID(), $user, $requestOverrides, $activeContext, $this->userSession->getUser());
4245
}
4346

4447
/** @param array<string, mixed> $requestOverrides */
@@ -51,14 +54,15 @@ public function forUserId(?string $userId, array $requestOverrides = [], ?array
5154
}
5255
}
5356

54-
return $this->build($userId, $user, $requestOverrides, $activeContext);
57+
return $this->build($userId, $user, $requestOverrides, $activeContext, $this->userSession->getUser());
5558
}
5659

5760
/** @param array<string, mixed> $requestOverrides */
58-
private function build(?string $userId, ?IUser $user, array $requestOverrides = [], ?array $activeContext = null): PolicyContext {
61+
private function build(?string $userId, ?IUser $user, array $requestOverrides = [], ?array $activeContext = null, ?IUser $currentActor = null): PolicyContext {
5962
$context = (new PolicyContext())
6063
->setRequestOverrides($requestOverrides)
61-
->setActiveContext($activeContext);
64+
->setActiveContext($activeContext)
65+
->setActorCapabilities($this->resolveActorCapabilities($currentActor));
6266

6367
if ($userId !== null && $userId !== '') {
6468
$context->setUserId($userId);
@@ -69,4 +73,22 @@ private function build(?string $userId, ?IUser $user, array $requestOverrides =
6973

7074
return $context;
7175
}
76+
77+
/** @return array<string, bool> */
78+
private function resolveActorCapabilities(?IUser $currentActor): array {
79+
if (!$currentActor instanceof IUser) {
80+
return [
81+
'canManageSystemPolicies' => false,
82+
'canManageGroupPolicies' => false,
83+
];
84+
}
85+
86+
$userId = $currentActor->getUID();
87+
$canManageSystemPolicies = $this->groupManager->isAdmin($userId) === true;
88+
89+
return [
90+
'canManageSystemPolicies' => $canManageSystemPolicies,
91+
'canManageGroupPolicies' => $canManageSystemPolicies || $this->subAdmin->isSubAdmin($currentActor) === true,
92+
];
93+
}
7294
}

0 commit comments

Comments
 (0)