Skip to content

Commit dd3e477

Browse files
committed
Fix SF-Request to PSR-7 conversion
1 parent 8f082de commit dd3e477

File tree

3 files changed

+31
-9
lines changed

3 files changed

+31
-9
lines changed

composer.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@
3636
"require": {
3737
"php": "^8.1",
3838

39+
"nyholm/psr7": "~1.8.2",
3940
"simplesamlphp/saml2": "~5.0.2",
4041
"simplesamlphp/simplesamlphp": "~2.4.0",
41-
"symfony/http-foundation": "~6.4.0"
42+
"symfony/http-foundation": "~6.4.0",
43+
"symfony/psr-http-message-bridge": "~6.4.0"
4244
},
4345
"require-dev": {
4446
"simplesamlphp/simplesamlphp-test-framework": "~1.9.3",

src/Controller/AttributeServer.php

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace SimpleSAML\Module\exampleattributeserver\Controller;
66

77
use DateInterval;
8+
use Nyholm\Psr7\Factory\Psr17Factory;
89
use SimpleSAML\{Configuration, Error, Logger};
910
use SimpleSAML\HTTP\RunnableResponse;
1011
use SimpleSAML\Metadata\MetaDataStorageHandler;
@@ -29,6 +30,7 @@
2930
};
3031
use SimpleSAML\SAML2\XML\samlp\{AttributeQuery, Response};
3132
use SimpleSAML\XML\Utils\Random;
33+
use Symfony\Bridge\PsrHttpMessage\Factory\{HttpFoundationFactory, PsrHttpFactory};
3234
use Symfony\Component\HttpFoundation\Request;
3335

3436
/**
@@ -77,15 +79,19 @@ public function setMetadataStorageHandler(MetaDataStorageHandler $handler): void
7779
*/
7880
public function main(/** @scrutinizer ignore-unused */ Request $request): RunnableResponse
7981
{
80-
$binding = Binding::getCurrentBinding();
81-
$query = $binding->receive();
82-
if (!($query instanceof AttributeQuery)) {
82+
$psr17Factory = new Psr17Factory();
83+
$psrHttpFactory = new PsrHttpFactory($psr17Factory, $psr17Factory, $psr17Factory, $psr17Factory);
84+
$psrRequest = $psrHttpFactory->createRequest($request);
85+
86+
$binding = Binding::getCurrentBinding($psrRequest);
87+
$message = $binding->receive($psrRequest);
88+
if (!($message instanceof AttributeQuery)) {
8389
throw new Error\BadRequest('Invalid message received to AttributeQuery endpoint.');
8490
}
8591

8692
$idpEntityId = $this->metadataHandler->getMetaDataCurrentEntityID('saml20-idp-hosted');
8793

88-
$issuer = $query->getIssuer();
94+
$issuer = $message->getIssuer();
8995
if ($issuer === null) {
9096
throw new Error\BadRequest('Missing <saml:Issuer> in <samlp:AttributeQuery>.');
9197
} else {
@@ -130,7 +136,7 @@ public function main(/** @scrutinizer ignore-unused */ Request $request): Runnab
130136
Logger::debug('No attributes requested - return all attributes.');
131137
$returnAttributes = $attributes;
132138
} else {
133-
foreach ($query->getAttributes() as $reqAttr) {
139+
foreach ($message->getAttributes() as $reqAttr) {
134140
foreach ($attributes as $attr) {
135141
if ($attr->getName() === $reqAttr->getName() && $attr->getNameFormat() === $reqAttr->getNameFormat()) {
136142
// The requested attribute is available
@@ -159,14 +165,14 @@ public function main(/** @scrutinizer ignore-unused */ Request $request): Runnab
159165
issueInstant: $clock->now(),
160166
id: (new Random())->generateID(),
161167
subject: Subject(
162-
identifier: $query->getNameID(),
168+
identifier: $message->getNameID(),
163169
subjectConfirmation: [
164170
new SubjectConfirmation(
165171
method: C::CM_BEARER,
166172
subjectConfirmationData: new SubjectConfirmationData(
167173
notOnOrAfter: $clock->now()->add(new DateInterval('PT300S')),
168174
recipient: $endpoint,
169-
inResponseTo: $query->getId(),
175+
inResponseTo: $message->getId(),
170176
),
171177
),
172178
],
@@ -196,7 +202,7 @@ public function main(/** @scrutinizer ignore-unused */ Request $request): Runnab
196202
issuer: new Issuer($issuer),
197203
id: (new Random())->generateID(),
198204
version: '2.0',
199-
inResponseTo: $query->getId(),
205+
inResponseTo: $message->getId(),
200206
destination: $endpoint,
201207
assertions: [$assertion],
202208
);

tests/bootstrap.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
<?php
22

3+
<?php
4+
35
declare(strict_types=1);
46

7+
use Beste\Clock\LocalizedClock;
8+
use SimpleSAML\SAML2\Compat\ContainerSingleton;
9+
use SimpleSAML\SAML2\Compat\MockContainer;
10+
511
$projectRoot = dirname(__DIR__);
612
require_once($projectRoot . '/vendor/autoload.php');
713

@@ -11,3 +17,11 @@
1117
echo "Linking '$linkPath' to '$projectRoot'\n";
1218
symlink($projectRoot, $linkPath);
1319
}
20+
21+
// Load the system clock
22+
$systemClock = LocalizedClock::in(new DateTimeZone('Z'));
23+
24+
// And set the Mock container as the Container to use.
25+
$container = new MockContainer();
26+
$container->setClock($systemClock);
27+
ContainerSingleton::setContainer($container);

0 commit comments

Comments
 (0)