Skip to content

Commit 79ce637

Browse files
committed
Never cache metadata when protect.metadata is set to true
1 parent 4ee465b commit 79ce637

4 files changed

Lines changed: 28 additions & 4 deletions

File tree

modules/saml/src/Controller/Metadata.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ public function metadata(Request $request): Response
7373
}
7474

7575
// check if valid local session exists
76-
if ($this->config->getOptionalBoolean('admin.protectmetadata', false)) {
76+
$protectedMetadata = $this->config->getOptionalBoolean('admin.protectmetadata', false);
77+
if ($protectedMetadata) {
7778
$response = $this->authUtils->requireAdmin();
7879
if ($response instanceof Response) {
7980
return $response;
@@ -99,7 +100,12 @@ public function metadata(Request $request): Response
99100

100101
$response = new Response();
101102
$response->setEtag(hash('sha256', $metaxml));
102-
$response->setPublic();
103+
$response->setCache([
104+
'no_cache' => $protectedMetadata === true,
105+
'public' => $protectedMetadata === false,
106+
'private' => $protectedMetadata === true,
107+
]);
108+
103109
if ($response->isNotModified($request)) {
104110
return $response;
105111
}

modules/saml/src/Controller/ServiceProvider.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,8 @@ public function singleLogoutService(Request $request, string $sourceId): Respons
601601
*/
602602
public function metadata(Request $request, string $sourceId): Response
603603
{
604-
if ($this->config->getOptionalBoolean('admin.protectmetadata', false)) {
604+
$protectedMetadata = $this->config->getOptionalBoolean('admin.protectmetadata', false);
605+
if ($protectedMetadata) {
605606
$response = $this->authUtils->requireAdmin();
606607
if ($response instanceof Response) {
607608
return $response;
@@ -643,7 +644,12 @@ public function metadata(Request $request, string $sourceId): Response
643644

644645
$response = new Response();
645646
$response->setEtag(hash('sha256', $metaxml));
646-
$response->setPublic();
647+
$response->setCache([
648+
'no_cache' => $protectedMetadata === true,
649+
'public' => $protectedMetadata === false,
650+
'private' => $protectedMetadata === true,
651+
]);
652+
647653
if ($response->isNotModified($request)) {
648654
return $response;
649655
}

tests/modules/saml/src/Controller/MetadataTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,12 @@ public function testMetadataAccess(bool $authenticated, bool $protected): void
161161
$result = $c->metadata($request);
162162

163163
$this->assertInstanceOf(Response::class, $result);
164+
165+
if ($protected === true) {
166+
$this->assertEquals('no-cache, private', $result->headers->get('cache-control'));
167+
} else {
168+
$this->assertEquals('public', $result->headers->get('cache-control'));
169+
}
164170
}
165171

166172
public static function provideMetadataAccess(): array

tests/modules/saml/src/Controller/ServiceProviderTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,12 @@ public function testMetadataAccess(bool $authenticated, bool $protected): void
526526

527527
$result = $c->metadata($request, 'phpunit');
528528
$this->assertInstanceOf(Response::class, $result);
529+
530+
if ($protected === true) {
531+
$this->assertEquals('no-cache, private', $result->headers->get('cache-control'));
532+
} else {
533+
$this->assertEquals('public', $result->headers->get('cache-control'));
534+
}
529535
}
530536

531537
public static function provideMetadataAccess(): array

0 commit comments

Comments
 (0)