From 149a64de2362a0b4e07e47db08cd6f92dfbdf91e Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 15 Mar 2026 15:48:26 +0100 Subject: [PATCH 01/11] Fix to work with Symfony's http-client --- src/MetaLoader.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/MetaLoader.php b/src/MetaLoader.php index 77068fe..b4ed6ab 100644 --- a/src/MetaLoader.php +++ b/src/MetaLoader.php @@ -384,23 +384,25 @@ private function createContext(array $source): array $name = $config->getOptionalString('technicalcontact_name', null); $mail = $config->getOptionalString('technicalcontact_email', null); - $rawheader = "User-Agent: SimpleSAMLphp metarefresh, run by $name <$mail>\r\n"; + $headers = [ + 'User-Agent' => "SimpleSAMLphp metarefresh, run by $name <$mail>", + ]; if (isset($source['conditionalGET']) && $source['conditionalGET']) { if (array_key_exists($source['src'], $this->state)) { $sourceState = $this->state[$source['src']]; if (isset($sourceState['last-modified'])) { - $rawheader .= 'If-Modified-Since: ' . $sourceState['last-modified'] . "\r\n"; + $headers['If-Modified-Since'] = $sourceState['last-modified']; } if (isset($sourceState['etag'])) { - $rawheader .= 'If-None-Match: ' . $sourceState['etag'] . "\r\n"; + $headers['If-None-Match'] = $sourceState['etag']; } } } - return ['http' => ['header' => $rawheader]]; + return $headers; } From 06bfcbad405db4c5ce52ce97aba90c00b9c4aa57 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 15 Mar 2026 16:44:34 +0100 Subject: [PATCH 02/11] Fix --- src/MetaLoader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MetaLoader.php b/src/MetaLoader.php index b4ed6ab..8dac294 100644 --- a/src/MetaLoader.php +++ b/src/MetaLoader.php @@ -402,7 +402,7 @@ private function createContext(array $source): array } } - return $headers; + return ['headers' => $headers]; } From 70cc52689a51976c9af4065e84848b420c47fae7 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 15 Mar 2026 18:35:07 +0100 Subject: [PATCH 03/11] Fix handling response codes --- src/MetaLoader.php | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/MetaLoader.php b/src/MetaLoader.php index 8dac294..0c436d8 100644 --- a/src/MetaLoader.php +++ b/src/MetaLoader.php @@ -108,27 +108,26 @@ public function loadSource(array $source): void $httpUtils = new Utils\HTTP(); $data = null; + // GET! - try { - /** @var array $response We know this because we set the third parameter to `true` */ - $response = $httpUtils->fetch($source['src'], $context, true); - list($data, $responseHeaders) = $response; - } catch (Exception $e) { - Logger::warning('metarefresh: ' . $e->getMessage()); - } + $client = $httpUtils->createHttpClient($context); + $response = $client->request('GET', $source['src'], $context); + $statusCode = $response->getStatusCode(); + $responseHeaders = $response->getHeaders(); + $data = $response->getContent(); // We have response headers, so the request succeeded - if (!isset($responseHeaders)) { + if ($responseHeaders === []) { // No response headers, this means the request failed in some way, so re-use old data Logger::info('No response from ' . $source['src'] . ' - attempting to re-use cached metadata'); $this->addCachedMetadata($source); return; - } elseif (preg_match('@^HTTP/(2\.0|1\.[01])\s304\s@', $responseHeaders[0])) { + } elseif ($statusCode === 304) { // 304 response Logger::debug('Received HTTP 304 (Not Modified) - attempting to re-use cached metadata'); $this->addCachedMetadata($source); return; - } elseif (!preg_match('@^HTTP/(2\.0|1\.[01])\s200\s@', $responseHeaders[0])) { + } elseif ($statusCode !== 200) { // Other error Logger::info('Error from ' . $source['src'] . ' - attempting to re-use cached metadata'); $this->addCachedMetadata($source); From 536e6504f8be855cdd32e22ba0135d5be01136a1 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 15 Mar 2026 20:11:03 +0100 Subject: [PATCH 04/11] Repair test --- tests/src/Controller/MetaRefreshTest.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/src/Controller/MetaRefreshTest.php b/tests/src/Controller/MetaRefreshTest.php index 3e45b96..bd9418f 100644 --- a/tests/src/Controller/MetaRefreshTest.php +++ b/tests/src/Controller/MetaRefreshTest.php @@ -52,7 +52,7 @@ protected function setUp(): void 'cron' => ['hourly'], 'sources' => [ [ - 'src' => 'https://example.org/simplesaml/module.php/aggregator/?id=kalmarcentral&set=saml2&exclude=norway', + 'src' => 'https://nexus.microsoftonline-p.com/federationmetadata/saml20/federationmetadata.xml', ], ], 'outputFormat' => 'flatfile', @@ -104,6 +104,5 @@ public function testMetaRefresh(): void $contents = $response->getContents(); $this->assertStringContainsString('[metarefresh]: Executing set [example]', $contents); $this->assertStringContainsString('In set [example] loading source', $contents); - $this->assertStringContainsString('attempting to re-use cached metadata', $contents); } } From c3e4cfbeaae31177fd9645f238a691610e824bdb Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 15 Mar 2026 21:07:23 +0100 Subject: [PATCH 05/11] Fix path to autoloader --- bin/metarefresh.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/metarefresh.php b/bin/metarefresh.php index 4973c42..c90c212 100755 --- a/bin/metarefresh.php +++ b/bin/metarefresh.php @@ -12,7 +12,7 @@ $baseDir = dirname(__FILE__, 4); // Add library autoloader. -require_once($baseDir . '/lib/_autoload.php'); +require_once($baseDir . '/src/_autoload.php'); if (!\SimpleSAML\Module::isModuleEnabled('metarefresh')) { echo "You need to enable the metarefresh module before this script can be used.\n"; From dd80ee263bf6505bbae068966ab872a7bc5dd07c Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 15 Mar 2026 21:20:04 +0100 Subject: [PATCH 06/11] Suppress errors from the http-clients --- src/MetaLoader.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MetaLoader.php b/src/MetaLoader.php index 0c436d8..33bc13c 100644 --- a/src/MetaLoader.php +++ b/src/MetaLoader.php @@ -113,8 +113,8 @@ public function loadSource(array $source): void $client = $httpUtils->createHttpClient($context); $response = $client->request('GET', $source['src'], $context); $statusCode = $response->getStatusCode(); - $responseHeaders = $response->getHeaders(); - $data = $response->getContent(); + $responseHeaders = $response->getHeaders(false); + $data = $response->getContent(false); // We have response headers, so the request succeeded if ($responseHeaders === []) { From f775d1bb4117f777f15ba6ec419c53bef1410e70 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 16 Mar 2026 18:59:50 +0100 Subject: [PATCH 07/11] Properly deal with transport issues --- src/MetaLoader.php | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/MetaLoader.php b/src/MetaLoader.php index 33bc13c..045c789 100644 --- a/src/MetaLoader.php +++ b/src/MetaLoader.php @@ -10,6 +10,7 @@ use SimpleSAML\Metadata; use SimpleSAML\Utils; use SimpleSAML\XML\DOMDocumentFactory; +use Symfony\Component\HttpClient\Exception\TransportException; use Symfony\Component\VarExporter\VarExporter; /** @@ -112,17 +113,19 @@ public function loadSource(array $source): void // GET! $client = $httpUtils->createHttpClient($context); $response = $client->request('GET', $source['src'], $context); - $statusCode = $response->getStatusCode(); + try { + $statusCode = $response->getStatusCode(); + } catch (TransportException $e) { + Logger::info('No response from ' . $source['src'] . ' - attempting to re-use cached metadata'); + $this->addCachedMetadata($source); + return; + } + $responseHeaders = $response->getHeaders(false); $data = $response->getContent(false); // We have response headers, so the request succeeded - if ($responseHeaders === []) { - // No response headers, this means the request failed in some way, so re-use old data - Logger::info('No response from ' . $source['src'] . ' - attempting to re-use cached metadata'); - $this->addCachedMetadata($source); - return; - } elseif ($statusCode === 304) { + if ($statusCode === 304) { // 304 response Logger::debug('Received HTTP 304 (Not Modified) - attempting to re-use cached metadata'); $this->addCachedMetadata($source); @@ -136,7 +139,7 @@ public function loadSource(array $source): void } else { // Local file. $data = file_get_contents($source['src']); - $responseHeaders = null; + $responseHeaders = []; } // Everything OK. Proceed. @@ -428,13 +431,13 @@ private function addCachedMetadata(array $source): void * Store caching state data for a source * * @param array $source - * @param array|null $responseHeaders + * @param array $responseHeaders */ - private function saveState(array $source, ?array $responseHeaders): void + private function saveState(array $source, array $responseHeaders): void { if (isset($source['conditionalGET']) && $source['conditionalGET']) { // Headers section - if ($responseHeaders !== null) { + if ($responseHeaders !== []) { $candidates = ['last-modified', 'etag']; foreach ($candidates as $candidate) { From 92808c2139851740f914fa61336ef842c878d533 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 16 Mar 2026 22:08:59 +0100 Subject: [PATCH 08/11] Add warning --- src/MetaLoader.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MetaLoader.php b/src/MetaLoader.php index 045c789..cf9aae4 100644 --- a/src/MetaLoader.php +++ b/src/MetaLoader.php @@ -116,6 +116,7 @@ public function loadSource(array $source): void try { $statusCode = $response->getStatusCode(); } catch (TransportException $e) { + Logger::warning($e->getMessage()); Logger::info('No response from ' . $source['src'] . ' - attempting to re-use cached metadata'); $this->addCachedMetadata($source); return; From 0ce6c9a9f3fe9920ff429eef81144ee8dcf01e2d Mon Sep 17 00:00:00 2001 From: Ben Martin Date: Tue, 17 Mar 2026 09:16:52 +1000 Subject: [PATCH 09/11] add underlying error to the info message --- src/MetaLoader.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MetaLoader.php b/src/MetaLoader.php index cf9aae4..05a483d 100644 --- a/src/MetaLoader.php +++ b/src/MetaLoader.php @@ -116,8 +116,8 @@ public function loadSource(array $source): void try { $statusCode = $response->getStatusCode(); } catch (TransportException $e) { - Logger::warning($e->getMessage()); - Logger::info('No response from ' . $source['src'] . ' - attempting to re-use cached metadata'); + Logger::info('No response from ' . $source['src'] . ' - attempting to re-use cached metadata.' + . ' The error was: ' . $e->getMessage()); $this->addCachedMetadata($source); return; } From 7a38d208556287e03f86c81a1dc39f56ee0316b7 Mon Sep 17 00:00:00 2001 From: Ben Martin Date: Tue, 17 Mar 2026 09:19:53 +1000 Subject: [PATCH 10/11] If we are using TransportException then maybe include it here too --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 40bfe98..59d3e64 100644 --- a/composer.json +++ b/composer.json @@ -42,6 +42,7 @@ "simplesamlphp/simplesamlphp": "~2.5@dev", "simplesamlphp/xml-common": "~2.7", "symfony/http-foundation": "~7.4", + "symfony/http-client": "~7.4", "symfony/var-exporter": "~7.4" }, "require-dev": { From e68d25e981820bac8a2d89464f249072a4715bcd Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Wed, 18 Mar 2026 23:34:20 +1000 Subject: [PATCH 11/11] This appears to be the only place that is causing the entityid issue (#66) * Bump the all-actions group with 3 updates (#65) Bumps the all-actions group with 3 updates: [simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml](https://github.com/simplesamlphp/simplesamlphp-test-framework), [simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml](https://github.com/simplesamlphp/simplesamlphp-test-framework) and [geekyeggo/delete-artifact](https://github.com/geekyeggo/delete-artifact). Updates `simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml` from 1.11.1 to 1.11.3 - [Commits](https://github.com/simplesamlphp/simplesamlphp-test-framework/compare/v1.11.1...v1.11.3) Updates `simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml` from 1.11.1 to 1.11.3 - [Commits](https://github.com/simplesamlphp/simplesamlphp-test-framework/compare/v1.11.1...v1.11.3) Updates `geekyeggo/delete-artifact` from 5 to 6 - [Release notes](https://github.com/geekyeggo/delete-artifact/releases) - [Changelog](https://github.com/GeekyEggo/delete-artifact/blob/main/CHANGELOG.md) - [Commits](https://github.com/geekyeggo/delete-artifact/compare/v5...v6) --- updated-dependencies: - dependency-name: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml dependency-version: 1.11.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-actions - dependency-name: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml dependency-version: 1.11.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: all-actions - dependency-name: geekyeggo/delete-artifact dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major dependency-group: all-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * This appears to be the only place that is causing the entityid issue This was mentioned here https://github.com/simplesamlphp/simplesamlphp-module-metarefresh/pull/64 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/php.yml | 6 +++--- src/MetaLoader.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index befbfa0..efc5198 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -21,7 +21,7 @@ jobs: matrix: php-version: ['8.3', '8.4', '8.5'] - uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml@v1.11.1 + uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml@v1.11.3 with: php-version: ${{ matrix.php-version }} @@ -30,7 +30,7 @@ jobs: strategy: fail-fast: false - uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml@v1.11.1 + uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml@v1.11.3 with: enable_eslinter: false enable_jsonlinter: true @@ -276,6 +276,6 @@ jobs: (needs.unit-tests-linux.result == 'success' && needs.coverage.result == 'skipped') steps: - - uses: geekyeggo/delete-artifact@v5 + - uses: geekyeggo/delete-artifact@v6 with: name: coverage-data diff --git a/src/MetaLoader.php b/src/MetaLoader.php index 05a483d..fcb46b0 100644 --- a/src/MetaLoader.php +++ b/src/MetaLoader.php @@ -202,7 +202,7 @@ public function loadSource(array $source): void if (count($attributeAuthorities) && !empty($attributeAuthorities[0])) { $this->addMetadata( $source['src'], - $attributeAuthorities, + $attributeAuthorities[0], 'attributeauthority-remote', $template, );