Skip to content

Commit d108667

Browse files
authored
Introduce ClaimSetEntityFactory (#258)
Co-authored-by: Marko Ivančić <[email protected]>
1 parent 2d94f74 commit d108667

File tree

8 files changed

+121
-25
lines changed

8 files changed

+121
-25
lines changed

src/Factories/ClaimTranslatorExtractorFactory.php

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
namespace SimpleSAML\Module\oidc\Factories;
1818

19-
use SimpleSAML\Module\oidc\Entities\ClaimSetEntity;
19+
use SimpleSAML\Module\oidc\Factories\Entities\ClaimSetEntityFactory;
2020
use SimpleSAML\Module\oidc\ModuleConfig;
2121
use SimpleSAML\Module\oidc\Utils\ClaimTranslatorExtractor;
2222

@@ -26,8 +26,10 @@ class ClaimTranslatorExtractorFactory
2626

2727
protected const CONFIG_KEY_MULTIPLE_CLAIM_VALUES_ALLOWED = 'are_multiple_claim_values_allowed';
2828

29-
public function __construct(private readonly ModuleConfig $moduleConfig)
30-
{
29+
public function __construct(
30+
private readonly ModuleConfig $moduleConfig,
31+
private readonly ClaimSetEntityFactory $claimSetEntityFactory,
32+
) {
3133
}
3234

3335
/**
@@ -57,7 +59,7 @@ public function build(): ClaimTranslatorExtractor
5759
$claims = $this->applyPrefixToClaimNames($claims, $prefix);
5860
}
5961

60-
$claimSet[] = new ClaimSetEntity($scopeName, $claims);
62+
$claimSet[] = $this->claimSetEntityFactory->build($scopeName, $claims);
6163

6264
if ($this->doesScopeAllowMultipleClaimValues($scopeConfig)) {
6365
$allowedMultipleValueClaims = array_merge($allowedMultipleValueClaims, $claims);
@@ -66,7 +68,13 @@ public function build(): ClaimTranslatorExtractor
6668

6769
$userIdAttr = $this->moduleConfig->getUserIdentifierAttribute();
6870

69-
return new ClaimTranslatorExtractor($userIdAttr, $claimSet, $translatorTable, $allowedMultipleValueClaims);
71+
return new ClaimTranslatorExtractor(
72+
$userIdAttr,
73+
$this->claimSetEntityFactory,
74+
$claimSet,
75+
$translatorTable,
76+
$allowedMultipleValueClaims,
77+
);
7078
}
7179

7280
/**
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SimpleSAML\Module\oidc\Factories\Entities;
6+
7+
use SimpleSAML\Module\oidc\Entities\ClaimSetEntity;
8+
9+
class ClaimSetEntityFactory
10+
{
11+
public function build(string $scope, array $claims): ClaimSetEntity
12+
{
13+
return new ClaimSetEntity($scope, $claims);
14+
}
15+
}

src/Services/Container.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
use SimpleSAML\Module\oidc\Factories\CryptKeyFactory;
4141
use SimpleSAML\Module\oidc\Factories\Entities\AccessTokenEntityFactory;
4242
use SimpleSAML\Module\oidc\Factories\Entities\AuthCodeEntityFactory;
43+
use SimpleSAML\Module\oidc\Factories\Entities\ClaimSetEntityFactory;
4344
use SimpleSAML\Module\oidc\Factories\Entities\ClientEntityFactory;
4445
use SimpleSAML\Module\oidc\Factories\FederationFactory;
4546
use SimpleSAML\Module\oidc\Factories\FormFactory;
@@ -153,8 +154,12 @@ public function __construct()
153154
$metadataStorageHandler = MetaDataStorageHandler::getMetadataHandler();
154155
$this->services[MetaDataStorageHandler::class] = $metadataStorageHandler;
155156

157+
$claimSetEntityFactory = new ClaimSetEntityFactory();
158+
$this->services[ClaimSetEntityFactory::class] = $claimSetEntityFactory;
159+
156160
$claimTranslatorExtractor = (new ClaimTranslatorExtractorFactory(
157161
$moduleConfig,
162+
$claimSetEntityFactory,
158163
))->build();
159164
$this->services[ClaimTranslatorExtractor::class] = $claimTranslatorExtractor;
160165

src/Utils/ClaimTranslatorExtractor.php

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
use Lcobucci\JWT\Token\RegisteredClaims;
2626
use League\OAuth2\Server\Entities\ScopeEntityInterface;
2727
use RuntimeException;
28-
use SimpleSAML\Module\oidc\Entities\ClaimSetEntity;
2928
use SimpleSAML\Module\oidc\Entities\Interfaces\ClaimSetEntityInterface;
29+
use SimpleSAML\Module\oidc\Factories\Entities\ClaimSetEntityFactory;
3030
use SimpleSAML\Module\oidc\Server\Exceptions\OidcServerException;
3131

3232
class ClaimTranslatorExtractor
@@ -128,11 +128,12 @@ class ClaimTranslatorExtractor
128128
/**
129129
* ClaimTranslatorExtractor constructor.
130130
*
131-
* @param ClaimSetEntity[] $claimSets
131+
* @param \SimpleSAML\Module\oidc\Entities\Interfaces\ClaimSetEntityInterface[] $claimSets
132132
* @throws \SimpleSAML\Module\oidc\Server\Exceptions\OidcServerException
133133
*/
134134
public function __construct(
135135
string $userIdAttr,
136+
protected readonly ClaimSetEntityFactory $claimSetEntityFactory,
136137
array $claimSets = [],
137138
array $translationTable = [],
138139
protected array $allowedMultiValueClaims = [],
@@ -143,14 +144,14 @@ public function __construct(
143144

144145
$this->translationTable = array_merge($this->translationTable, $translationTable);
145146

146-
$this->addClaimSet(new ClaimSetEntity('openid', [
147+
$this->addClaimSet($this->claimSetEntityFactory->build('openid', [
147148
'sub',
148149
]));
149150

150151
// Add Default OpenID Connect Claims
151152
// @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims
152153
$this->addClaimSet(
153-
new ClaimSetEntity('profile', [
154+
$this->claimSetEntityFactory->build('profile', [
154155
'name',
155156
'family_name',
156157
'given_name',
@@ -168,18 +169,18 @@ public function __construct(
168169
]),
169170
);
170171
$this->addClaimSet(
171-
new ClaimSetEntity('email', [
172+
$this->claimSetEntityFactory->build('email', [
172173
'email',
173174
'email_verified',
174175
]),
175176
);
176177
$this->addClaimSet(
177-
new ClaimSetEntity('address', [
178+
$this->claimSetEntityFactory->build('address', [
178179
'address',
179180
]),
180181
);
181182
$this->addClaimSet(
182-
new ClaimSetEntity('phone', [
183+
$this->claimSetEntityFactory->build('phone', [
183184
'phone_number',
184185
'phone_number_verified',
185186
]),

tests/unit/src/Factories/ClaimTranslatorExtractorFactoryTest.php

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
namespace SimpleSAML\Test\Module\oidc\unit\Factories;
66

77
use PHPUnit\Framework\MockObject\MockObject;
8+
use PHPUnit\Framework\MockObject\Stub;
89
use PHPUnit\Framework\TestCase;
910
use SimpleSAML\Configuration;
11+
use SimpleSAML\Module\oidc\Entities\ClaimSetEntity;
1012
use SimpleSAML\Module\oidc\Factories\ClaimTranslatorExtractorFactory;
13+
use SimpleSAML\Module\oidc\Factories\Entities\ClaimSetEntityFactory;
1114
use SimpleSAML\Module\oidc\ModuleConfig;
1215
use SimpleSAML\Module\oidc\Utils\ClaimTranslatorExtractor;
1316

@@ -17,6 +20,7 @@
1720
class ClaimTranslatorExtractorFactoryTest extends TestCase
1821
{
1922
protected MockObject $moduleConfigMock;
23+
protected MockObject $claimSetEntityFactory;
2024

2125
/**
2226
* @throws \Exception
@@ -62,18 +66,23 @@ protected function setUp(): void
6266
],
6367
],
6468
);
69+
70+
$this->claimSetEntityFactory = $this->createMock(ClaimSetEntityFactory::class);
6571
}
6672

67-
protected function prepareMockedInstance(): ClaimTranslatorExtractorFactory
73+
protected function mock(): ClaimTranslatorExtractorFactory
6874
{
69-
return new ClaimTranslatorExtractorFactory($this->moduleConfigMock);
75+
return new ClaimTranslatorExtractorFactory(
76+
$this->moduleConfigMock,
77+
$this->claimSetEntityFactory,
78+
);
7079
}
7180

7281
public function testCanCreateInstance(): void
7382
{
7483
$this->assertInstanceOf(
7584
ClaimTranslatorExtractorFactory::class,
76-
$this->prepareMockedInstance(),
85+
$this->mock(),
7786
);
7887
}
7988

@@ -84,7 +93,7 @@ public function testCanBuildClaimTranslatorExtractor(): void
8493
{
8594
$this->assertInstanceOf(
8695
ClaimTranslatorExtractor::class,
87-
$this->prepareMockedInstance()->build(),
96+
$this->mock()->build(),
8897
);
8998
}
9099

@@ -93,7 +102,18 @@ public function testCanBuildClaimTranslatorExtractor(): void
93102
*/
94103
public function testExtractor(): void
95104
{
96-
$claimTranslatorExtractor = $this->prepareMockedInstance()->build();
105+
$this->claimSetEntityFactory->expects($this->atLeastOnce())
106+
->method('build')
107+
->willReturnCallback(
108+
function (string $scope, array $claims): Stub {
109+
$claimSetStub = $this->createStub(ClaimSetEntity::class);
110+
$claimSetStub->method('getScope')->willReturn($scope);
111+
$claimSetStub->method('getClaims')->willReturn($claims);
112+
return $claimSetStub;
113+
},
114+
);
115+
116+
$claimTranslatorExtractor = $this->mock()->build();
97117

98118
$this->assertSame(
99119
$claimTranslatorExtractor->getClaimSet('customScope2')->getClaims(),

tests/unit/src/Server/RequestRules/Rules/RequestedClaimsRuleTest.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
use PHPUnit\Framework\MockObject\Stub;
88
use PHPUnit\Framework\TestCase;
99
use Psr\Http\Message\ServerRequestInterface;
10+
use SimpleSAML\Module\oidc\Entities\ClaimSetEntity;
1011
use SimpleSAML\Module\oidc\Entities\Interfaces\ClientEntityInterface;
12+
use SimpleSAML\Module\oidc\Factories\Entities\ClaimSetEntityFactory;
1113
use SimpleSAML\Module\oidc\Server\RequestRules\Result;
1214
use SimpleSAML\Module\oidc\Server\RequestRules\ResultBag;
1315
use SimpleSAML\Module\oidc\Server\RequestRules\Rules\ClientIdRule;
@@ -28,6 +30,7 @@ class RequestedClaimsRuleTest extends TestCase
2830
protected Stub $loggerServiceStub;
2931
protected static string $userIdAttr = 'uid';
3032
protected Stub $requestParamsResolverStub;
33+
protected Stub $claimSetEntityFactoryStub;
3134

3235

3336
/**
@@ -42,13 +45,21 @@ protected function setUp(): void
4245
$this->resultBag->add(new Result(ClientIdRule::class, $this->clientStub));
4346
$this->loggerServiceStub = $this->createStub(LoggerService::class);
4447
$this->requestParamsResolverStub = $this->createStub(RequestParamsResolver::class);
48+
$this->claimSetEntityFactoryStub = $this->createStub(ClaimSetEntityFactory::class);
49+
$this->claimSetEntityFactoryStub->method('build')
50+
->willReturnCallback(function (string $scope, array $claims) {
51+
$claimSetEntityStub = $this->createStub(ClaimSetEntity::class);
52+
$claimSetEntityStub->method('getScope')->willReturn($scope);
53+
$claimSetEntityStub->method('getClaims')->willReturn($claims);
54+
return $claimSetEntityStub;
55+
});
4556
}
4657

4758
protected function mock(): RequestedClaimsRule
4859
{
4960
return new RequestedClaimsRule(
5061
$this->requestParamsResolverStub,
51-
new ClaimTranslatorExtractor(self::$userIdAttr),
62+
new ClaimTranslatorExtractor(self::$userIdAttr, $this->claimSetEntityFactoryStub),
5263
);
5364
}
5465

tests/unit/src/Server/ResponseTypes/IdTokenResponseTest.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
use Lcobucci\JWT\Validation\Validator;
2222
use League\OAuth2\Server\CryptKey;
2323
use PHPUnit\Framework\MockObject\MockObject;
24+
use PHPUnit\Framework\MockObject\Stub;
2425
use PHPUnit\Framework\TestCase;
2526
use SimpleSAML\Configuration;
2627
use SimpleSAML\Module\oidc\Entities\AccessTokenEntity;
2728
use SimpleSAML\Module\oidc\Entities\ClientEntity;
2829
use SimpleSAML\Module\oidc\Entities\ScopeEntity;
2930
use SimpleSAML\Module\oidc\Entities\UserEntity;
31+
use SimpleSAML\Module\oidc\Factories\Entities\ClaimSetEntityFactory;
3032
use SimpleSAML\Module\oidc\ModuleConfig;
3133
use SimpleSAML\Module\oidc\Repositories\Interfaces\IdentityProviderInterface;
3234
use SimpleSAML\Module\oidc\Server\ResponseTypes\IdTokenResponse;
@@ -56,6 +58,7 @@ class IdTokenResponseTest extends TestCase
5658
protected MockObject $sspConfigurationMock;
5759
protected CryptKey $privateKey;
5860
protected IdTokenBuilder $idTokenBuilder;
61+
protected Stub $claimSetEntityFactoryStub;
5962

6063
/**
6164
* @throws \PHPUnit\Framework\MockObject\Exception
@@ -107,9 +110,11 @@ protected function setUp(): void
107110

108111
$this->privateKey = new CryptKey($this->certFolder . '/oidc_module.key', null, false);
109112

113+
$this->claimSetEntityFactoryStub = $this->createStub(ClaimSetEntityFactory::class);
114+
110115
$this->idTokenBuilder = new IdTokenBuilder(
111116
new JsonWebTokenBuilderService($this->moduleConfigMock),
112-
new ClaimTranslatorExtractor(self::USER_ID_ATTR),
117+
new ClaimTranslatorExtractor(self::USER_ID_ATTR, $this->claimSetEntityFactoryStub),
113118
);
114119
}
115120

0 commit comments

Comments
 (0)