Skip to content

Commit e383337

Browse files
committed
feat: hide signature_flow pref from users not in authorized groups
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
1 parent ed927d3 commit e383337

2 files changed

Lines changed: 38 additions & 1 deletion

File tree

lib/Service/Policy/Provider/Signature/SignatureFlowPolicy.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,20 @@
1111
use OCA\Libresign\Enum\SignatureFlow;
1212
use OCA\Libresign\Service\Policy\Contract\IPolicyDefinition;
1313
use OCA\Libresign\Service\Policy\Contract\IPolicyDefinitionProvider;
14+
use OCA\Libresign\Service\Policy\Model\PolicyContext;
1415
use OCA\Libresign\Service\Policy\Model\PolicySpec;
16+
use OCA\Libresign\Service\Policy\Provider\RequestSignGroups\RequestSignGroupsPolicyValue;
17+
use OCP\AppFramework\Services\IAppConfig;
1518

1619
final class SignatureFlowPolicy implements IPolicyDefinitionProvider {
1720
public const KEY = 'signature_flow';
1821
public const SYSTEM_APP_CONFIG_KEY = 'policy.signature_flow.system';
1922

23+
public function __construct(
24+
private IAppConfig $appConfig,
25+
) {
26+
}
27+
2028
#[\Override]
2129
public function keys(): array {
2230
return [
@@ -44,6 +52,7 @@ public function get(string|\BackedEnum $policyKey): IPolicyDefinition {
4452
},
4553
appConfigKey: self::SYSTEM_APP_CONFIG_KEY,
4654
resolutionMode: PolicySpec::RESOLUTION_MODE_VALUE_CHOICE,
55+
eligibilityChecker: fn (PolicyContext $context): bool => $this->isUserInAuthorizedGroup($context),
4756
),
4857
default => throw new \InvalidArgumentException('Unknown policy key: ' . $this->normalizePolicyKey($policyKey)),
4958
};
@@ -56,4 +65,25 @@ private function normalizePolicyKey(string|\BackedEnum $policyKey): string {
5665

5766
return $policyKey;
5867
}
68+
69+
private function isUserInAuthorizedGroup(PolicyContext $context): bool {
70+
$authorizedGroupsJson = $this->appConfig->getAppValueString(
71+
'policy.groups_request_sign',
72+
RequestSignGroupsPolicyValue::encode(RequestSignGroupsPolicyValue::DEFAULT_GROUPS),
73+
);
74+
$authorizedGroups = RequestSignGroupsPolicyValue::decode($authorizedGroupsJson);
75+
76+
$userGroups = $context->getGroups();
77+
if ($userGroups === []) {
78+
return false;
79+
}
80+
81+
foreach ($userGroups as $userGroup) {
82+
if (in_array($userGroup, $authorizedGroups, true)) {
83+
return true;
84+
}
85+
}
86+
87+
return false;
88+
}
5989
}

tests/php/Unit/Service/Policy/Provider/Signature/SignatureFlowPolicyTest.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,19 @@
99
namespace OCA\Libresign\Tests\Unit\Service\Policy\Provider\Signature;
1010

1111
use OCA\Libresign\Service\Policy\Model\PolicyContext;
12+
use OCA\Libresign\Service\Policy\Provider\RequestSignGroups\RequestSignGroupsPolicyValue;
1213
use OCA\Libresign\Service\Policy\Provider\Signature\SignatureFlowPolicy;
14+
use OCP\AppFramework\Services\IAppConfig;
1315
use PHPUnit\Framework\TestCase;
1416

1517
final class SignatureFlowPolicyTest extends TestCase {
1618
public function testProviderBuildsSignatureFlowDefinition(): void {
17-
$provider = new SignatureFlowPolicy();
19+
$appConfig = $this->createMock(IAppConfig::class);
20+
$appConfig->method('getAppValueString')->willReturn(
21+
RequestSignGroupsPolicyValue::encode(RequestSignGroupsPolicyValue::DEFAULT_GROUPS)
22+
);
23+
24+
$provider = new SignatureFlowPolicy($appConfig);
1825
$this->assertSame([SignatureFlowPolicy::KEY], $provider->keys());
1926
$definition = $provider->get(SignatureFlowPolicy::KEY);
2027

0 commit comments

Comments
 (0)