99namespace OCA \Libresign \Service \Policy \Runtime ;
1010
1111use OCA \Libresign \Service \Policy \Model \PolicyContext ;
12+ use OCP \Group \ISubAdmin ;
1213use OCP \IGroupManager ;
1314use OCP \IUser ;
1415use 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