From 6210ad3b1ab9717072fada5232c1cf2b5d27b1e5 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 8 Mar 2024 12:37:36 +0100 Subject: [PATCH 001/532] Release v2.2.0 --- composer.json | 3 +- composer.lock | 517 +++++++++++++++---------------- docs/simplesamlphp-changelog.md | 59 +++- extra/simplesamlphp.spec | 2 +- src/SimpleSAML/Configuration.php | 2 +- 5 files changed, 313 insertions(+), 270 deletions(-) diff --git a/composer.json b/composer.json index 1e338b1285..90d7a42bd4 100644 --- a/composer.json +++ b/composer.json @@ -126,5 +126,6 @@ "scripts": { "translations:unused": "php bin/translations translations:unused", "translations:update:translatable": "php bin/translations translations:update:translatable" - } + }, + "version": "2.2.0" } diff --git a/composer.lock b/composer.lock index 3a5dd48bc8..4742974929 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c6b07fa01951c1bc1afb5b69059b11c3", + "content-hash": "d91367cd61fc07fdc982d7fb068d705b", "packages": [ { "name": "gettext/gettext", @@ -555,16 +555,16 @@ }, { "name": "simplesamlphp/assert", - "version": "v1.0.5", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/assert.git", - "reference": "014d722cd2fc316e458a982648f10e17ab498c92" + "reference": "abffdfef47d10a4345a4a8d79049b60a3f466440" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/014d722cd2fc316e458a982648f10e17ab498c92", - "reference": "014d722cd2fc316e458a982648f10e17ab498c92", + "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/abffdfef47d10a4345a4a8d79049b60a3f466440", + "reference": "abffdfef47d10a4345a4a8d79049b60a3f466440", "shasum": "" }, "require": { @@ -572,11 +572,11 @@ "ext-filter": "*", "ext-pcre": "*", "ext-spl": "*", - "php": "^8.0", + "php": "^8.1", "webmozart/assert": "^1.11" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "^1.5.1" + "simplesamlphp/simplesamlphp-test-framework": "^1.5.5" }, "type": "library", "extra": { @@ -606,9 +606,9 @@ "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments", "support": { "issues": "https://github.com/simplesamlphp/assert/issues", - "source": "https://github.com/simplesamlphp/assert/tree/v1.0.5" + "source": "https://github.com/simplesamlphp/assert/tree/v1.1.0" }, - "time": "2023-08-15T15:00:10+00:00" + "time": "2024-01-21T10:47:03+00:00" }, { "name": "simplesamlphp/composer-module-installer", @@ -655,16 +655,16 @@ }, { "name": "simplesamlphp/saml2", - "version": "v4.6.10", + "version": "v4.6.11", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "a6c46e8134df2686da9ad44bc9b8f85443c03440" + "reference": "1b5d48753c78d02e88667068e633531c233141fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/a6c46e8134df2686da9ad44bc9b8f85443c03440", - "reference": "a6c46e8134df2686da9ad44bc9b8f85443c03440", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/1b5d48753c78d02e88667068e633531c233141fb", + "reference": "1b5d48753c78d02e88667068e633531c233141fb", "shasum": "" }, "require": { @@ -707,22 +707,22 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v4.6.10" + "source": "https://github.com/simplesamlphp/saml2/tree/v4.6.11" }, - "time": "2023-05-31T16:03:51+00:00" + "time": "2024-01-25T19:39:46+00:00" }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.1.9", + "version": "v2.1.12", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "df9073ea42a6d9b64e1e35350910bf9f16cc0049" + "reference": "bde7ad38a534776a9fb2943d7d1a9880c738c925" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/df9073ea42a6d9b64e1e35350910bf9f16cc0049", - "reference": "df9073ea42a6d9b64e1e35350910bf9f16cc0049", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/bde7ad38a534776a9fb2943d7d1a9880c738c925", + "reference": "bde7ad38a534776a9fb2943d7d1a9880c738c925", "shasum": "" }, "require": { @@ -743,22 +743,22 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.1.9" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.1.12" }, - "time": "2024-01-16T23:19:02+00:00" + "time": "2024-02-19T15:32:24+00:00" }, { "name": "symfony/cache", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "14a75869bbb41cb35bc5d9d322473928c6f3f978" + "reference": "0ef36534694c572ff526d91c7181f3edede176e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/14a75869bbb41cb35bc5d9d322473928c6f3f978", - "reference": "14a75869bbb41cb35bc5d9d322473928c6f3f978", + "url": "https://api.github.com/repos/symfony/cache/zipball/0ef36534694c572ff526d91c7181f3edede176e7", + "reference": "0ef36534694c572ff526d91c7181f3edede176e7", "shasum": "" }, "require": { @@ -825,7 +825,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.2" + "source": "https://github.com/symfony/cache/tree/v6.4.4" }, "funding": [ { @@ -841,7 +841,7 @@ "type": "tidelift" } ], - "time": "2023-12-29T15:34:34+00:00" + "time": "2024-02-22T20:27:10+00:00" }, { "name": "symfony/cache-contracts", @@ -921,16 +921,16 @@ }, { "name": "symfony/config", - "version": "v6.4.0", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "5d33e0fb707d603330e0edfd4691803a1253572e" + "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/5d33e0fb707d603330e0edfd4691803a1253572e", - "reference": "5d33e0fb707d603330e0edfd4691803a1253572e", + "url": "https://api.github.com/repos/symfony/config/zipball/6ea4affc27f2086c9d16b92ab5429ce1e3c38047", + "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047", "shasum": "" }, "require": { @@ -976,7 +976,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.0" + "source": "https://github.com/symfony/config/tree/v6.4.4" }, "funding": [ { @@ -992,20 +992,20 @@ "type": "tidelift" } ], - "time": "2023-11-09T08:28:32+00:00" + "time": "2024-02-26T07:52:26+00:00" }, { "name": "symfony/console", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0254811a143e6bc6c8deea08b589a7e68a37f625" + "reference": "0d9e4eb5ad413075624378f474c4167ea202de78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0254811a143e6bc6c8deea08b589a7e68a37f625", - "reference": "0254811a143e6bc6c8deea08b589a7e68a37f625", + "url": "https://api.github.com/repos/symfony/console/zipball/0d9e4eb5ad413075624378f474c4167ea202de78", + "reference": "0d9e4eb5ad413075624378f474c4167ea202de78", "shasum": "" }, "require": { @@ -1070,7 +1070,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.2" + "source": "https://github.com/symfony/console/tree/v6.4.4" }, "funding": [ { @@ -1086,20 +1086,20 @@ "type": "tidelift" } ], - "time": "2023-12-10T16:15:48+00:00" + "time": "2024-02-22T20:27:10+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195" + "reference": "6236e5e843cb763e9d0f74245678b994afea5363" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/226ea431b1eda6f0d9f5a4b278757171960bb195", - "reference": "226ea431b1eda6f0d9f5a4b278757171960bb195", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6236e5e843cb763e9d0f74245678b994afea5363", + "reference": "6236e5e843cb763e9d0f74245678b994afea5363", "shasum": "" }, "require": { @@ -1151,7 +1151,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.2" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.4" }, "funding": [ { @@ -1167,7 +1167,7 @@ "type": "tidelift" } ], - "time": "2023-12-28T19:16:56+00:00" + "time": "2024-02-22T20:27:10+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1238,16 +1238,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.0", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788" + "reference": "c725219bdf2afc59423c32793d5019d2a904e13a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c873490a1c97b3a0a4838afc36ff36c112d02788", - "reference": "c873490a1c97b3a0a4838afc36ff36c112d02788", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c725219bdf2afc59423c32793d5019d2a904e13a", + "reference": "c725219bdf2afc59423c32793d5019d2a904e13a", "shasum": "" }, "require": { @@ -1293,7 +1293,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.0" + "source": "https://github.com/symfony/error-handler/tree/v6.4.4" }, "funding": [ { @@ -1309,20 +1309,20 @@ "type": "tidelift" } ], - "time": "2023-10-18T09:43:34+00:00" + "time": "2024-02-22T20:27:10+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.2", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "e95216850555cd55e71b857eb9d6c2674124603a" + "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e95216850555cd55e71b857eb9d6c2674124603a", - "reference": "e95216850555cd55e71b857eb9d6c2674124603a", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef", "shasum": "" }, "require": { @@ -1373,7 +1373,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.2" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.3" }, "funding": [ { @@ -1389,7 +1389,7 @@ "type": "tidelift" } ], - "time": "2023-12-27T22:16:42+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -1469,16 +1469,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59" + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/952a8cb588c3bc6ce76f6023000fb932f16a6e59", - "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", "shasum": "" }, "require": { @@ -1512,7 +1512,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.0" + "source": "https://github.com/symfony/filesystem/tree/v6.4.3" }, "funding": [ { @@ -1528,7 +1528,7 @@ "type": "tidelift" } ], - "time": "2023-07-26T17:27:13+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/finder", @@ -1596,16 +1596,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "c26a221e0462027d1f9d4a802ed63f8ab07a43d0" + "reference": "c76d3881596860ead95f5444a5ce4414447f0067" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c26a221e0462027d1f9d4a802ed63f8ab07a43d0", - "reference": "c26a221e0462027d1f9d4a802ed63f8ab07a43d0", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c76d3881596860ead95f5444a5ce4414447f0067", + "reference": "c76d3881596860ead95f5444a5ce4414447f0067", "shasum": "" }, "require": { @@ -1644,7 +1644,7 @@ "symfony/mime": "<6.4", "symfony/property-access": "<5.4", "symfony/property-info": "<5.4", - "symfony/scheduler": "<6.4", + "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", "symfony/security-core": "<5.4", "symfony/security-csrf": "<5.4", "symfony/serializer": "<6.4", @@ -1683,7 +1683,7 @@ "symfony/process": "^5.4|^6.0|^7.0", "symfony/property-info": "^5.4|^6.0|^7.0", "symfony/rate-limiter": "^5.4|^6.0|^7.0", - "symfony/scheduler": "^6.4|^7.0", + "symfony/scheduler": "^6.4.4|^7.0.4", "symfony/security-bundle": "^5.4|^6.0|^7.0", "symfony/semaphore": "^5.4|^6.0|^7.0", "symfony/serializer": "^6.4|^7.0", @@ -1696,7 +1696,7 @@ "symfony/web-link": "^5.4|^6.0|^7.0", "symfony/workflow": "^6.4|^7.0", "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/twig": "^2.10|^3.0" + "twig/twig": "^2.10|^3.0.4" }, "type": "symfony-bundle", "autoload": { @@ -1724,7 +1724,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.4.2" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.4" }, "funding": [ { @@ -1740,20 +1740,20 @@ "type": "tidelift" } ], - "time": "2023-12-29T15:34:34+00:00" + "time": "2024-02-22T22:50:59+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271" + "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/172d807f9ef3fc3fbed8377cc57c20d389269271", - "reference": "172d807f9ef3fc3fbed8377cc57c20d389269271", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ebc713bc6e6f4b53f46539fc158be85dfcd77304", + "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304", "shasum": "" }, "require": { @@ -1801,7 +1801,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.2" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.4" }, "funding": [ { @@ -1817,20 +1817,20 @@ "type": "tidelift" } ], - "time": "2023-12-27T22:16:42+00:00" + "time": "2024-02-08T15:01:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.2", + "version": "v6.4.5", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "13e8387320b5942d0dc408440c888e2d526efef4" + "reference": "f6947cb939d8efee137797382cb4db1af653ef75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/13e8387320b5942d0dc408440c888e2d526efef4", - "reference": "13e8387320b5942d0dc408440c888e2d526efef4", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f6947cb939d8efee137797382cb4db1af653ef75", + "reference": "f6947cb939d8efee137797382cb4db1af653ef75", "shasum": "" }, "require": { @@ -1879,7 +1879,7 @@ "symfony/process": "^5.4|^6.0|^7.0", "symfony/property-access": "^5.4.5|^6.0.5|^7.0", "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.3|^7.0", + "symfony/serializer": "^6.4.4|^7.0.4", "symfony/stopwatch": "^5.4|^6.0|^7.0", "symfony/translation": "^5.4|^6.0|^7.0", "symfony/translation-contracts": "^2.5|^3", @@ -1914,7 +1914,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.2" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.5" }, "funding": [ { @@ -1930,20 +1930,20 @@ "type": "tidelift" } ], - "time": "2023-12-30T15:31:44+00:00" + "time": "2024-03-04T21:00:47+00:00" }, { "name": "symfony/intl", - "version": "v6.4.2", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "4f45148f7eb984ef12b1f7e123205ab904828839" + "reference": "2628ded562ca132ed7cdea72f5ec6aaf65d94414" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/4f45148f7eb984ef12b1f7e123205ab904828839", - "reference": "4f45148f7eb984ef12b1f7e123205ab904828839", + "url": "https://api.github.com/repos/symfony/intl/zipball/2628ded562ca132ed7cdea72f5ec6aaf65d94414", + "reference": "2628ded562ca132ed7cdea72f5ec6aaf65d94414", "shasum": "" }, "require": { @@ -1996,7 +1996,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.4.2" + "source": "https://github.com/symfony/intl/tree/v6.4.3" }, "funding": [ { @@ -2012,20 +2012,20 @@ "type": "tidelift" } ], - "time": "2023-12-26T18:38:00+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "shasum": "" }, "require": { @@ -2039,9 +2039,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -2078,7 +2075,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" }, "funding": [ { @@ -2094,20 +2091,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", "shasum": "" }, "require": { @@ -2118,9 +2115,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -2159,7 +2153,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" }, "funding": [ { @@ -2175,20 +2169,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "e46b4da57951a16053cd751f63f4a24292788157" + "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e46b4da57951a16053cd751f63f4a24292788157", - "reference": "e46b4da57951a16053cd751f63f4a24292788157", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/07094a28851a49107f3ab4f9120ca2975a64b6e1", + "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1", "shasum": "" }, "require": { @@ -2199,9 +2193,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -2246,7 +2237,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.29.0" }, "funding": [ { @@ -2262,20 +2253,20 @@ "type": "tidelift" } ], - "time": "2023-03-21T17:27:24+00:00" + "time": "2024-01-29T20:12:16+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "shasum": "" }, "require": { @@ -2286,9 +2277,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -2330,7 +2318,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" }, "funding": [ { @@ -2346,20 +2334,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "shasum": "" }, "require": { @@ -2373,9 +2361,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -2413,7 +2398,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" }, "funding": [ { @@ -2429,20 +2414,20 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", "shasum": "" }, "require": { @@ -2450,9 +2435,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -2496,7 +2478,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" }, "funding": [ { @@ -2512,20 +2494,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", - "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", "shasum": "" }, "require": { @@ -2534,9 +2516,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -2576,7 +2555,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" }, "funding": [ { @@ -2592,20 +2571,20 @@ "type": "tidelift" } ], - "time": "2023-08-16T06:22:46+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/routing", - "version": "v6.4.2", + "version": "v6.4.5", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "98eab13a07fddc85766f1756129c69f207ffbc21" + "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/98eab13a07fddc85766f1756129c69f207ffbc21", - "reference": "98eab13a07fddc85766f1756129c69f207ffbc21", + "url": "https://api.github.com/repos/symfony/routing/zipball/7fe30068e207d9c31c0138501ab40358eb2d49a4", + "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4", "shasum": "" }, "require": { @@ -2659,7 +2638,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.2" + "source": "https://github.com/symfony/routing/tree/v6.4.5" }, "funding": [ { @@ -2675,7 +2654,7 @@ "type": "tidelift" } ], - "time": "2023-12-29T15:34:34+00:00" + "time": "2024-02-27T12:33:30+00:00" }, { "name": "symfony/service-contracts", @@ -2761,16 +2740,16 @@ }, { "name": "symfony/string", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc" + "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/7cb80bc10bfcdf6b5492741c0b9357dac66940bc", - "reference": "7cb80bc10bfcdf6b5492741c0b9357dac66940bc", + "url": "https://api.github.com/repos/symfony/string/zipball/4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", + "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", "shasum": "" }, "require": { @@ -2827,7 +2806,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.2" + "source": "https://github.com/symfony/string/tree/v6.4.4" }, "funding": [ { @@ -2843,7 +2822,7 @@ "type": "tidelift" } ], - "time": "2023-12-10T16:15:48+00:00" + "time": "2024-02-01T13:16:41+00:00" }, { "name": "symfony/translation-contracts", @@ -2925,16 +2904,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "97af829e4733125ee70e806694d56165c60b4ee1" + "reference": "256f330026d1c97187b61aa5c29e529499877f13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/97af829e4733125ee70e806694d56165c60b4ee1", - "reference": "97af829e4733125ee70e806694d56165c60b4ee1", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/256f330026d1c97187b61aa5c29e529499877f13", + "reference": "256f330026d1c97187b61aa5c29e529499877f13", "shasum": "" }, "require": { @@ -2978,7 +2957,7 @@ "symfony/security-core": "^5.4|^6.0|^7.0", "symfony/security-csrf": "^5.4|^6.0|^7.0", "symfony/security-http": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3", "symfony/stopwatch": "^5.4|^6.0|^7.0", "symfony/translation": "^6.1|^7.0", "symfony/web-link": "^5.4|^6.0|^7.0", @@ -3014,7 +2993,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.2" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.4" }, "funding": [ { @@ -3030,20 +3009,20 @@ "type": "tidelift" } ], - "time": "2023-12-15T12:36:48+00:00" + "time": "2024-02-15T11:26:02+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f" + "reference": "b439823f04c98b84d4366c79507e9da6230944b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", - "reference": "68d6573ec98715ddcae5a0a85bee3c1c27a4c33f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b439823f04c98b84d4366c79507e9da6230944b1", + "reference": "b439823f04c98b84d4366c79507e9da6230944b1", "shasum": "" }, "require": { @@ -3099,7 +3078,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.2" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.4" }, "funding": [ { @@ -3115,20 +3094,20 @@ "type": "tidelift" } ], - "time": "2023-12-28T19:16:56+00:00" + "time": "2024-02-15T11:23:52+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e" + "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/5fe9a0021b8d35e67d914716ec8de50716a68e7e", - "reference": "5fe9a0021b8d35e67d914716ec8de50716a68e7e", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0bd342e24aef49fc82a21bd4eedd3e665d177e5b", + "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b", "shasum": "" }, "require": { @@ -3174,7 +3153,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.2" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.4" }, "funding": [ { @@ -3190,20 +3169,20 @@ "type": "tidelift" } ], - "time": "2023-12-27T08:18:35+00:00" + "time": "2024-02-26T08:37:45+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.0", + "version": "v6.4.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587" + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587", - "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d75715985f0f94f978e3a8fa42533e10db921b90", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90", "shasum": "" }, "require": { @@ -3246,7 +3225,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.0" + "source": "https://github.com/symfony/yaml/tree/v6.4.3" }, "funding": [ { @@ -3262,7 +3241,7 @@ "type": "tidelift" } ], - "time": "2023-11-06T11:00:25+00:00" + "time": "2024-01-23T14:51:35+00:00" }, { "name": "twig/intl-extra", @@ -3765,20 +3744,21 @@ }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -3819,9 +3799,15 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -3876,16 +3862,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.25.0", + "version": "1.26.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240" + "reference": "231e3186624c03d7e7c890ec662b81e6b0405227" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bd84b629c8de41aa2ae82c067c955e06f1b00240", - "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/231e3186624c03d7e7c890ec662b81e6b0405227", + "reference": "231e3186624c03d7e7c890ec662b81e6b0405227", "shasum": "" }, "require": { @@ -3917,22 +3903,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.25.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.26.0" }, - "time": "2024-01-04T17:06:16+00:00" + "time": "2024-02-23T16:05:55+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.11", + "version": "10.1.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "78c3b7625965c2513ee96569a4dbb62601784145" + "reference": "842f72662d6b9edda84c4b6f13885fd9cd53dc63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", - "reference": "78c3b7625965c2513ee96569a4dbb62601784145", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/842f72662d6b9edda84c4b6f13885fd9cd53dc63", + "reference": "842f72662d6b9edda84c4b6f13885fd9cd53dc63", "shasum": "" }, "require": { @@ -3989,7 +3975,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.12" }, "funding": [ { @@ -3997,7 +3983,7 @@ "type": "github" } ], - "time": "2023-12-21T15:38:30+00:00" + "time": "2024-03-02T07:22:05+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4244,16 +4230,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.8", + "version": "10.5.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "08f4fa74d5fbfff1ef22abffee47aaedcaea227e" + "reference": "0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/08f4fa74d5fbfff1ef22abffee47aaedcaea227e", - "reference": "08f4fa74d5fbfff1ef22abffee47aaedcaea227e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4", + "reference": "0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4", "shasum": "" }, "require": { @@ -4325,7 +4311,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.8" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.11" }, "funding": [ { @@ -4341,7 +4327,7 @@ "type": "tidelift" } ], - "time": "2024-01-19T07:07:27+00:00" + "time": "2024-02-25T14:05:00+00:00" }, { "name": "predis/predis", @@ -4406,16 +4392,16 @@ }, { "name": "sebastian/cli-parser", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "shasum": "" }, "require": { @@ -4450,7 +4436,8 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" }, "funding": [ { @@ -4458,7 +4445,7 @@ "type": "github" } ], - "time": "2023-02-03T06:58:15+00:00" + "time": "2024-03-02T07:12:49+00:00" }, { "name": "sebastian/code-unit", @@ -4708,16 +4695,16 @@ }, { "name": "sebastian/diff", - "version": "5.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "shasum": "" }, "require": { @@ -4725,7 +4712,7 @@ }, "require-dev": { "phpunit/phpunit": "^10.0", - "symfony/process": "^4.2 || ^5" + "symfony/process": "^6.4" }, "type": "library", "extra": { @@ -4763,7 +4750,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" }, "funding": [ { @@ -4771,7 +4758,7 @@ "type": "github" } ], - "time": "2023-12-22T10:55:06+00:00" + "time": "2024-03-02T07:15:17+00:00" }, { "name": "sebastian/environment", @@ -4839,16 +4826,16 @@ }, { "name": "sebastian/exporter", - "version": "5.1.1", + "version": "5.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", - "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", "shasum": "" }, "require": { @@ -4905,7 +4892,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" }, "funding": [ { @@ -4913,20 +4900,20 @@ "type": "github" } ], - "time": "2023-09-24T13:22:09+00:00" + "time": "2024-03-02T07:17:12+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.1", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "shasum": "" }, "require": { @@ -4960,14 +4947,14 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" }, "funding": [ { @@ -4975,7 +4962,7 @@ "type": "github" } ], - "time": "2023-07-19T07:19:23+00:00" + "time": "2024-03-02T07:19:19+00:00" }, { "name": "sebastian/lines-of-code", @@ -5426,16 +5413,16 @@ }, { "name": "simplesamlphp/xml-common", - "version": "v1.14.2", + "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "ed99739e4e5b75587c6b3b0e80ce940825560a17" + "reference": "4f1257d1357644c413438985de13c92d498b5018" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/ed99739e4e5b75587c6b3b0e80ce940825560a17", - "reference": "ed99739e4e5b75587c6b3b0e80ce940825560a17", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/4f1257d1357644c413438985de13c92d498b5018", + "reference": "4f1257d1357644c413438985de13c92d498b5018", "shasum": "" }, "require": { @@ -5446,7 +5433,7 @@ "ext-spl": "*", "ext-xmlreader": "*", "php": "^8.1", - "simplesamlphp/assert": "^1.0" + "simplesamlphp/assert": "^1.1" }, "require-dev": { "simplesamlphp/simplesamlphp-test-framework": "^1.5" @@ -5481,7 +5468,7 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2023-12-26T16:13:56+00:00" + "time": "2024-01-22T20:54:45+00:00" }, { "name": "simplesamlphp/xml-security", @@ -5614,16 +5601,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.8.1", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "14f5fff1e64118595db5408e946f3a22c75807f7" + "reference": "d63cee4890a8afaf86a22e51ad4d97c91dd4579b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/14f5fff1e64118595db5408e946f3a22c75807f7", - "reference": "14f5fff1e64118595db5408e946f3a22c75807f7", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/d63cee4890a8afaf86a22e51ad4d97c91dd4579b", + "reference": "d63cee4890a8afaf86a22e51ad4d97c91dd4579b", "shasum": "" }, "require": { @@ -5690,20 +5677,20 @@ "type": "open_collective" } ], - "time": "2024-01-11T20:47:48+00:00" + "time": "2024-02-16T15:06:51+00:00" }, { "name": "symfony/translation", - "version": "v6.4.2", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "a2ab2ec1a462e53016de8e8d5e8912bfd62ea681" + "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/a2ab2ec1a462e53016de8e8d5e8912bfd62ea681", - "reference": "a2ab2ec1a462e53016de8e8d5e8912bfd62ea681", + "url": "https://api.github.com/repos/symfony/translation/zipball/bce6a5a78e94566641b2594d17e48b0da3184a8e", + "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e", "shasum": "" }, "require": { @@ -5726,7 +5713,7 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.13", + "nikic/php-parser": "^4.18|^5.0", "psr/log": "^1|^2|^3", "symfony/config": "^5.4|^6.0|^7.0", "symfony/console": "^5.4|^6.0|^7.0", @@ -5769,7 +5756,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.2" + "source": "https://github.com/symfony/translation/tree/v6.4.4" }, "funding": [ { @@ -5785,20 +5772,20 @@ "type": "tidelift" } ], - "time": "2023-12-18T09:25:29+00:00" + "time": "2024-02-20T13:16:58+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -5827,7 +5814,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -5835,7 +5822,7 @@ "type": "github" } ], - "time": "2023-11-20T00:12:19+00:00" + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index ab54cdefd0..8a3a552501 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -7,15 +7,70 @@ See the upgrade notes for specific information about upgrading. ## Version 2.2.0 -Released TBD +Released TBD 2024-03-08 * Make error codes easier to extend (#1870) * Updated eduPerson attributes in attribute maps (#1948) * Add regex support for attribute names in AttributeLimit authproc filter (#1971) +* Reverted the .mo files change introduced in 2.1.x + +## Version 2.1.4 + +Released 2024-02-29 + +* Fix static call for non-static method in bin/importPdoMetadata.php (#1969) +* Validate AuthState before processing it (#1706) +* Fix possible incompatible dependency-set (#1981) + +## Version 2.1.3 + +Released 2024-02-12 + +* Fix backwards compatibility for mandatory cachedir-setting introduced in 2.1.2 + +Deprecations: + +* The core:StatisticsWithAttribute authproc-filter has been deprecated. It is now available + in the 'statistics' module (v1.2+) as 'statistics:StatisticsWithAttribute', while only the + 'core:StatisticsWithAttribute' filter will be removed from SimpleSAMLphp in a future release. ## Version 2.1.2 -Released TBD +Released 2024-02-05 + +* Restore possibility to use HTTP-Artifact on AuthnRequests (regression from 2.0.4) +* Fixed undefined variable exception when using MS SQL store (#1917 + #1918) +* Fix legacy-endpoints to not send responses twice +* Fix exception when using iframe-logout (#1936) +* Look for the schema files in the right place (#1929) +* Fixed file logging handler to not fail on the first write after file-creation (#1877) +* Fixed a warning in the RequestedAuthnContextSelector + +`adfs` + +* Fixed incorrect use of StreamedResponse (v2.1.3) + +`core` + +* Fixed a broken template for the WarnShortSSOInterval authproc-filter (#1920) +* Fixed the order of the routes so that the least specific error-controller is hit last (#1923) + +`ldap` + +* Restored 1.x functionality to be able to fetch operational attributes (v2.3.0) +* Fixed undesirable side-effect introduced in v2.3.0 (v2.3.1) +* Restore the ability to read attributes using a privileged account (v2.3.2) + +`saml` + +* Disable caching for metadata-endpoint when protect.metadata is true (#1926) + +`saml2 library` + +* Fix serialization for the NameID element +* Fix inheritance - There is no relation between BaseID and NameID + +NOTE: Clear your session store after updating, because old serialized sessions can no longer be unserialized ## Version 2.1.1 diff --git a/extra/simplesamlphp.spec b/extra/simplesamlphp.spec index 809108d15d..861a55a0b8 100644 --- a/extra/simplesamlphp.spec +++ b/extra/simplesamlphp.spec @@ -1,6 +1,6 @@ %define name simplesamlphp %define summary SAML IDP/SP written in PHP -%define version 2.1.0-rc1 +%define version 2.2.0 %define release 1 %define license LGPL 2.1 %define group Networking/WWW diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index 276deac6ef..bdb98f69ec 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -40,7 +40,7 @@ class Configuration implements Utils\ClearableState /** * The release version of this package */ - public const VERSION = '2.1.0-rc1'; + public const VERSION = '2.2.0'; /** * A default value which means that the given option is required. From a61328242431eba403609d3b733110b90214b1ed Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 8 Mar 2024 12:40:03 +0100 Subject: [PATCH 002/532] Prepare future release=branch --- composer.json | 4 ++-- docs/simplesamlphp-changelog.md | 6 +++++- docs/simplesamlphp-upgrade-notes-2.3.md | 4 ++++ extra/simplesamlphp.spec | 2 +- src/SimpleSAML/Configuration.php | 2 +- 5 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 docs/simplesamlphp-upgrade-notes-2.3.md diff --git a/composer.json b/composer.json index 90d7a42bd4..32a6efa525 100644 --- a/composer.json +++ b/composer.json @@ -120,12 +120,12 @@ }, "extra": { "branch-alias": { - "dev-master": "2.2.x-dev" + "dev-master": "3.0.x-dev" } }, "scripts": { "translations:unused": "php bin/translations translations:unused", "translations:update:translatable": "php bin/translations translations:update:translatable" }, - "version": "2.2.0" + "version": "2.3.0" } diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 8a3a552501..f4ddcafa56 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -5,9 +5,13 @@ This document lists the changes between versions of SimpleSAMLphp. See the upgrade notes for specific information about upgrading. +## Version 2.3.0 + +Released TBD + ## Version 2.2.0 -Released TBD 2024-03-08 +Released 2024-03-08 * Make error codes easier to extend (#1870) * Updated eduPerson attributes in attribute maps (#1948) diff --git a/docs/simplesamlphp-upgrade-notes-2.3.md b/docs/simplesamlphp-upgrade-notes-2.3.md new file mode 100644 index 0000000000..ac96ddd087 --- /dev/null +++ b/docs/simplesamlphp-upgrade-notes-2.3.md @@ -0,0 +1,4 @@ +# Upgrade notes for SimpleSAMLphp 2.3 + +SimpleSAMLphp 2.3 is a minor new release which introduces a few new features. +The following changes are relevant for installers and/or developers. diff --git a/extra/simplesamlphp.spec b/extra/simplesamlphp.spec index 861a55a0b8..2eea97ef29 100644 --- a/extra/simplesamlphp.spec +++ b/extra/simplesamlphp.spec @@ -1,6 +1,6 @@ %define name simplesamlphp %define summary SAML IDP/SP written in PHP -%define version 2.2.0 +%define version 2.3.0 %define release 1 %define license LGPL 2.1 %define group Networking/WWW diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index bdb98f69ec..9508e94923 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -40,7 +40,7 @@ class Configuration implements Utils\ClearableState /** * The release version of this package */ - public const VERSION = '2.2.0'; + public const VERSION = '2.3.0'; /** * A default value which means that the given option is required. From c1f80c3c2c1d7e3e764bc85e4f4e9cb0d3aba0ae Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 8 Mar 2024 15:49:05 +0100 Subject: [PATCH 003/532] Fix incorrect use of redirectTrustedURL-util --- public/admin/index.php | 2 +- public/index.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/admin/index.php b/public/admin/index.php index ad32844e48..f84b8167a2 100644 --- a/public/admin/index.php +++ b/public/admin/index.php @@ -11,7 +11,7 @@ $headers = $config->getOptionalArray('headers.security', Configuration::DEFAULT_SECURITY_HEADERS); $redirect = Module::getModuleURL('admin/'); -$response = $httpUtils->redirectTrustedURL($redirect); +$response = new HTTP\RunnableResponse([$httpUtils, 'redirectTrustedURL'], [$redirect]); foreach ($headers as $header => $value) { // Some pages may have specific requirements that we must follow. Don't touch them. if (!$response->headers->has($header)) { diff --git a/public/index.php b/public/index.php index 10e1699a96..5234b5e748 100644 --- a/public/index.php +++ b/public/index.php @@ -11,7 +11,7 @@ $headers = $config->getOptionalArray('headers.security', Configuration::DEFAULT_SECURITY_HEADERS); $redirect = $config->getOptionalString('frontpage.redirect', Module::getModuleURL('core/welcome')); -$response = $httpUtils->redirectTrustedURL($redirect); +$response = new HTTP\RunnableResponse([$httpUtils, 'redirectTrustedURL'], [$redirect]); foreach ($headers as $header => $value) { // Some pages may have specific requirements that we must follow. Don't touch them. if (!$response->headers->has($header)) { From 9ba04fdfd8f25e3af5867de0e3113dd52739d116 Mon Sep 17 00:00:00 2001 From: 9oOzv Date: Wed, 13 Mar 2024 13:19:43 +0200 Subject: [PATCH 004/532] Fix URL in error page redirection in ExpectedAuthContextClassRef authproc --- modules/saml/src/Auth/Process/ExpectedAuthnContextClassRef.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/saml/src/Auth/Process/ExpectedAuthnContextClassRef.php b/modules/saml/src/Auth/Process/ExpectedAuthnContextClassRef.php index 103d618e7a..c318fa177a 100644 --- a/modules/saml/src/Auth/Process/ExpectedAuthnContextClassRef.php +++ b/modules/saml/src/Auth/Process/ExpectedAuthnContextClassRef.php @@ -104,7 +104,7 @@ protected function unauthorized(array &$state): void $id = Auth\State::saveState($state, 'saml:ExpectedAuthnContextClassRef:unauthorized'); $url = Module::getModuleURL( - 'saml/sp/wrong_authncontextclassref.php' + 'saml/sp/wrongAuthnContextClassRef' ); $httpUtils = new Utils\HTTP(); From 06bc5f7d1db2aadee11fe451c48124acc9cc09ba Mon Sep 17 00:00:00 2001 From: Nathan Robertson Date: Wed, 13 Mar 2024 15:58:44 +1100 Subject: [PATCH 005/532] Have exampleauth:UserPass have credentials stored under "users" key, instead of at top level of authsource config --- config/authsources.php.dist | 16 +++++++++------- docs/simplesamlphp-idp.md | 16 +++++++++------- modules/exampleauth/src/Auth/Source/UserPass.php | 14 +++++++++++++- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/config/authsources.php.dist b/config/authsources.php.dist index fe896f4067..cdde34d65b 100644 --- a/config/authsources.php.dist +++ b/config/authsources.php.dist @@ -97,13 +97,15 @@ $config = [ //'remember.username.enabled' => false, //'remember.username.checked' => false, - 'student:studentpass' => [ - 'uid' => ['test'], - 'eduPersonAffiliation' => ['member', 'student'], - ], - 'employee:employeepass' => [ - 'uid' => ['employee'], - 'eduPersonAffiliation' => ['member', 'employee'], + 'users' => [ + 'student:studentpass' => [ + 'uid' => ['test'], + 'eduPersonAffiliation' => ['member', 'student'], + ], + 'employee:employeepass' => [ + 'uid' => ['employee'], + 'eduPersonAffiliation' => ['member', 'employee'], + ], ], ], */ diff --git a/docs/simplesamlphp-idp.md b/docs/simplesamlphp-idp.md index 52b9ccb20f..681598c4cd 100644 --- a/docs/simplesamlphp-idp.md +++ b/docs/simplesamlphp-idp.md @@ -83,13 +83,15 @@ In this setup, this file should contain a single entry: $config = [ 'example-userpass' => [ 'exampleauth:UserPass', - 'student:studentpass' => [ - 'uid' => ['student'], - 'eduPersonAffiliation' => ['member', 'student'], - ], - 'employee:employeepass' => [ - 'uid' => ['employee'], - 'eduPersonAffiliation' => ['member', 'employee'], + 'users' => [ + 'student:studentpass' => [ + 'uid' => ['student'], + 'eduPersonAffiliation' => ['member', 'student'], + ], + 'employee:employeepass' => [ + 'uid' => ['employee'], + 'eduPersonAffiliation' => ['member', 'employee'], + ], ], ], ]; diff --git a/modules/exampleauth/src/Auth/Source/UserPass.php b/modules/exampleauth/src/Auth/Source/UserPass.php index 951e151e14..345939c45e 100644 --- a/modules/exampleauth/src/Auth/Source/UserPass.php +++ b/modules/exampleauth/src/Auth/Source/UserPass.php @@ -6,6 +6,7 @@ use Exception; use SimpleSAML\Error; +use SimpleSAML\Logger; use SimpleSAML\Module\core\Auth\UserPassBase; use SimpleSAML\Utils; @@ -42,8 +43,19 @@ public function __construct(array $info, array $config) $this->users = []; + // Old version of SimpleSAMLphp had the username:password just be a list in the top level + // configuration. We now have them under the "users" key, so that exampleauth can be used + // for testing things like core:loginpage_links, etc. that require top level configuration. + if (array_key_exists('users', $config)) { + $config_users = $config['users']; + } else { + Logger::warning("Module exampleauth:UserPass configured in legacy mode. Please put your " . + "username:password entries under the \"users\" key in your authsource."); + $config_users = $config; + } + // Validate and parse our configuration - foreach ($config as $userpass => $attributes) { + foreach ($config_users as $userpass => $attributes) { if (!is_string($userpass)) { throw new Exception( 'Invalid : for authentication source ' . $this->authId . ': ' . $userpass From 69a44f723d0f3478d20b30de339f0f9ca38c81a0 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 23:36:34 +0000 Subject: [PATCH 006/532] [skip ci] Auto-rebuild translations --- modules/admin/locales/af/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/ar/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/cs/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/da/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/de/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/el/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/en/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/es/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/et/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/eu/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/fi/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/fr/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/he/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/hr/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/hu/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/id/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/it/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/ja/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/lb/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/lt/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/lv/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/nb/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/nl/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/nn/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/no/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/pl/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/pt-br/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/pt/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/ro/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/ru/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/sk/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/sl/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/sr/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/st/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/sv/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/tr/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/xh/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/zh-tw/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/zh/LC_MESSAGES/admin.po | 6 +++--- modules/admin/locales/zu/LC_MESSAGES/admin.po | 6 +++--- 40 files changed, 120 insertions(+), 120 deletions(-) diff --git a/modules/admin/locales/af/LC_MESSAGES/admin.po b/modules/admin/locales/af/LC_MESSAGES/admin.po index 63a28ed939..15ffe2bace 100644 --- a/modules/admin/locales/af/LC_MESSAGES/admin.po +++ b/modules/admin/locales/af/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/ar/LC_MESSAGES/admin.po b/modules/admin/locales/ar/LC_MESSAGES/admin.po index 9ce0168e89..9f7edf752e 100644 --- a/modules/admin/locales/ar/LC_MESSAGES/admin.po +++ b/modules/admin/locales/ar/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/cs/LC_MESSAGES/admin.po b/modules/admin/locales/cs/LC_MESSAGES/admin.po index f974668425..23525a0c8e 100644 --- a/modules/admin/locales/cs/LC_MESSAGES/admin.po +++ b/modules/admin/locales/cs/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/da/LC_MESSAGES/admin.po b/modules/admin/locales/da/LC_MESSAGES/admin.po index 4cd9ac7e54..8334f0f5d4 100644 --- a/modules/admin/locales/da/LC_MESSAGES/admin.po +++ b/modules/admin/locales/da/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/de/LC_MESSAGES/admin.po b/modules/admin/locales/de/LC_MESSAGES/admin.po index 3287995142..9df0ea7b2b 100644 --- a/modules/admin/locales/de/LC_MESSAGES/admin.po +++ b/modules/admin/locales/de/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/el/LC_MESSAGES/admin.po b/modules/admin/locales/el/LC_MESSAGES/admin.po index d11a44bcc8..c512817cc8 100644 --- a/modules/admin/locales/el/LC_MESSAGES/admin.po +++ b/modules/admin/locales/el/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/en/LC_MESSAGES/admin.po b/modules/admin/locales/en/LC_MESSAGES/admin.po index afa3523f56..c14d3f7e36 100644 --- a/modules/admin/locales/en/LC_MESSAGES/admin.po +++ b/modules/admin/locales/en/LC_MESSAGES/admin.po @@ -109,11 +109,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/es/LC_MESSAGES/admin.po b/modules/admin/locales/es/LC_MESSAGES/admin.po index 0b47006e6b..e746f1abf0 100644 --- a/modules/admin/locales/es/LC_MESSAGES/admin.po +++ b/modules/admin/locales/es/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/et/LC_MESSAGES/admin.po b/modules/admin/locales/et/LC_MESSAGES/admin.po index e902088b2f..8f70e31031 100644 --- a/modules/admin/locales/et/LC_MESSAGES/admin.po +++ b/modules/admin/locales/et/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/eu/LC_MESSAGES/admin.po b/modules/admin/locales/eu/LC_MESSAGES/admin.po index fb52bb40c0..ad6051c719 100644 --- a/modules/admin/locales/eu/LC_MESSAGES/admin.po +++ b/modules/admin/locales/eu/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/fi/LC_MESSAGES/admin.po b/modules/admin/locales/fi/LC_MESSAGES/admin.po index f23e51853f..e417a7a0b8 100644 --- a/modules/admin/locales/fi/LC_MESSAGES/admin.po +++ b/modules/admin/locales/fi/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/fr/LC_MESSAGES/admin.po b/modules/admin/locales/fr/LC_MESSAGES/admin.po index 78e40d7e73..d458b2f729 100644 --- a/modules/admin/locales/fr/LC_MESSAGES/admin.po +++ b/modules/admin/locales/fr/LC_MESSAGES/admin.po @@ -105,11 +105,11 @@ msgstr "Extension LDAP" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "Extension LDAP (nécessaire si un backend LDAP est utilisé)" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "Déconnexion" diff --git a/modules/admin/locales/he/LC_MESSAGES/admin.po b/modules/admin/locales/he/LC_MESSAGES/admin.po index 3d7167d399..c08745aa3c 100644 --- a/modules/admin/locales/he/LC_MESSAGES/admin.po +++ b/modules/admin/locales/he/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/hr/LC_MESSAGES/admin.po b/modules/admin/locales/hr/LC_MESSAGES/admin.po index 142164ad72..bdbc575f2a 100644 --- a/modules/admin/locales/hr/LC_MESSAGES/admin.po +++ b/modules/admin/locales/hr/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/hu/LC_MESSAGES/admin.po b/modules/admin/locales/hu/LC_MESSAGES/admin.po index 502e2656a9..0bccd1ac5b 100644 --- a/modules/admin/locales/hu/LC_MESSAGES/admin.po +++ b/modules/admin/locales/hu/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/id/LC_MESSAGES/admin.po b/modules/admin/locales/id/LC_MESSAGES/admin.po index 1068194d82..d3111656c6 100644 --- a/modules/admin/locales/id/LC_MESSAGES/admin.po +++ b/modules/admin/locales/id/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/it/LC_MESSAGES/admin.po b/modules/admin/locales/it/LC_MESSAGES/admin.po index 09f7085d8f..97ff7a2923 100644 --- a/modules/admin/locales/it/LC_MESSAGES/admin.po +++ b/modules/admin/locales/it/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/ja/LC_MESSAGES/admin.po b/modules/admin/locales/ja/LC_MESSAGES/admin.po index 2dabd970e1..7b40a9bcde 100644 --- a/modules/admin/locales/ja/LC_MESSAGES/admin.po +++ b/modules/admin/locales/ja/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/lb/LC_MESSAGES/admin.po b/modules/admin/locales/lb/LC_MESSAGES/admin.po index 9d4f8b8d47..4c15093de1 100644 --- a/modules/admin/locales/lb/LC_MESSAGES/admin.po +++ b/modules/admin/locales/lb/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/lt/LC_MESSAGES/admin.po b/modules/admin/locales/lt/LC_MESSAGES/admin.po index d5d7167dc6..a073803430 100644 --- a/modules/admin/locales/lt/LC_MESSAGES/admin.po +++ b/modules/admin/locales/lt/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/lv/LC_MESSAGES/admin.po b/modules/admin/locales/lv/LC_MESSAGES/admin.po index 9bb295813d..5295386b54 100644 --- a/modules/admin/locales/lv/LC_MESSAGES/admin.po +++ b/modules/admin/locales/lv/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/nb/LC_MESSAGES/admin.po b/modules/admin/locales/nb/LC_MESSAGES/admin.po index 9dba1fb2a2..5003960532 100644 --- a/modules/admin/locales/nb/LC_MESSAGES/admin.po +++ b/modules/admin/locales/nb/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/nl/LC_MESSAGES/admin.po b/modules/admin/locales/nl/LC_MESSAGES/admin.po index 5459a5d1ae..53f2b624f5 100644 --- a/modules/admin/locales/nl/LC_MESSAGES/admin.po +++ b/modules/admin/locales/nl/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "LDAP-extensie" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "LDAP-extensie (vereist als een LDAP-backend wordt gebruikt)" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "Log uit" diff --git a/modules/admin/locales/nn/LC_MESSAGES/admin.po b/modules/admin/locales/nn/LC_MESSAGES/admin.po index a8738df592..50bd6b6b28 100644 --- a/modules/admin/locales/nn/LC_MESSAGES/admin.po +++ b/modules/admin/locales/nn/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/no/LC_MESSAGES/admin.po b/modules/admin/locales/no/LC_MESSAGES/admin.po index 9dba1fb2a2..5003960532 100644 --- a/modules/admin/locales/no/LC_MESSAGES/admin.po +++ b/modules/admin/locales/no/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/pl/LC_MESSAGES/admin.po b/modules/admin/locales/pl/LC_MESSAGES/admin.po index 3bafb8428e..08a2c68abd 100644 --- a/modules/admin/locales/pl/LC_MESSAGES/admin.po +++ b/modules/admin/locales/pl/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/pt-br/LC_MESSAGES/admin.po b/modules/admin/locales/pt-br/LC_MESSAGES/admin.po index d94b6128bd..ac16715930 100644 --- a/modules/admin/locales/pt-br/LC_MESSAGES/admin.po +++ b/modules/admin/locales/pt-br/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/pt/LC_MESSAGES/admin.po b/modules/admin/locales/pt/LC_MESSAGES/admin.po index eed8dd931c..28528a0741 100644 --- a/modules/admin/locales/pt/LC_MESSAGES/admin.po +++ b/modules/admin/locales/pt/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/ro/LC_MESSAGES/admin.po b/modules/admin/locales/ro/LC_MESSAGES/admin.po index a2f2eec33c..50ac593299 100644 --- a/modules/admin/locales/ro/LC_MESSAGES/admin.po +++ b/modules/admin/locales/ro/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/ru/LC_MESSAGES/admin.po b/modules/admin/locales/ru/LC_MESSAGES/admin.po index eda016fc67..af21d732b9 100644 --- a/modules/admin/locales/ru/LC_MESSAGES/admin.po +++ b/modules/admin/locales/ru/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/sk/LC_MESSAGES/admin.po b/modules/admin/locales/sk/LC_MESSAGES/admin.po index 1d5e811178..040c537507 100644 --- a/modules/admin/locales/sk/LC_MESSAGES/admin.po +++ b/modules/admin/locales/sk/LC_MESSAGES/admin.po @@ -109,11 +109,11 @@ msgstr "rozšírenie LDAP" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "rozšírenie LDAP (vyžadované, ak je využívaný LDAP backend)" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "Odhlásiť sa" diff --git a/modules/admin/locales/sl/LC_MESSAGES/admin.po b/modules/admin/locales/sl/LC_MESSAGES/admin.po index 6aac6df5b2..cf35150f94 100644 --- a/modules/admin/locales/sl/LC_MESSAGES/admin.po +++ b/modules/admin/locales/sl/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/sr/LC_MESSAGES/admin.po b/modules/admin/locales/sr/LC_MESSAGES/admin.po index 9d9d5faf35..2712534916 100644 --- a/modules/admin/locales/sr/LC_MESSAGES/admin.po +++ b/modules/admin/locales/sr/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/st/LC_MESSAGES/admin.po b/modules/admin/locales/st/LC_MESSAGES/admin.po index e825d617b2..17f1a5f405 100644 --- a/modules/admin/locales/st/LC_MESSAGES/admin.po +++ b/modules/admin/locales/st/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/sv/LC_MESSAGES/admin.po b/modules/admin/locales/sv/LC_MESSAGES/admin.po index 6416048110..2391edb114 100644 --- a/modules/admin/locales/sv/LC_MESSAGES/admin.po +++ b/modules/admin/locales/sv/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/tr/LC_MESSAGES/admin.po b/modules/admin/locales/tr/LC_MESSAGES/admin.po index 429772b77e..54cc11c9ed 100644 --- a/modules/admin/locales/tr/LC_MESSAGES/admin.po +++ b/modules/admin/locales/tr/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/xh/LC_MESSAGES/admin.po b/modules/admin/locales/xh/LC_MESSAGES/admin.po index 63a28ed939..15ffe2bace 100644 --- a/modules/admin/locales/xh/LC_MESSAGES/admin.po +++ b/modules/admin/locales/xh/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/zh-tw/LC_MESSAGES/admin.po b/modules/admin/locales/zh-tw/LC_MESSAGES/admin.po index 302721211c..b8eeadf21c 100644 --- a/modules/admin/locales/zh-tw/LC_MESSAGES/admin.po +++ b/modules/admin/locales/zh-tw/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/zh/LC_MESSAGES/admin.po b/modules/admin/locales/zh/LC_MESSAGES/admin.po index e5eb15a96e..be47b23fe4 100644 --- a/modules/admin/locales/zh/LC_MESSAGES/admin.po +++ b/modules/admin/locales/zh/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" diff --git a/modules/admin/locales/zu/LC_MESSAGES/admin.po b/modules/admin/locales/zu/LC_MESSAGES/admin.po index b93d374a9d..aa7068ee87 100644 --- a/modules/admin/locales/zu/LC_MESSAGES/admin.po +++ b/modules/admin/locales/zu/LC_MESSAGES/admin.po @@ -103,11 +103,11 @@ msgstr "" msgid "LDAP extension (required if an LDAP backend is used)" msgstr "" -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:174 #: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Federation.php:473 -#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Test.php:153 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:106 +#: /home/runner/work/simplesamlphp/simplesamlphp/modules/admin/src/Controller/Config.php:146 msgid "Log out" msgstr "" From a9625317a1f02abb49879aa0c0882bdde7f1bd12 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 14 Mar 2024 22:52:28 +0100 Subject: [PATCH 007/532] Bump sqlauth --- .github/build/full.json | 2 +- docs/simplesamlphp-changelog.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/build/full.json b/.github/build/full.json index 3449c9cb9d..4e5fa03e11 100644 --- a/.github/build/full.json +++ b/.github/build/full.json @@ -34,7 +34,7 @@ }, "sqlauth": { "repository": "simplesamlphp/simplesamlphp-module-sqlauth", - "version": "^1.0" + "version": "^1.2" } } } diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index f4ddcafa56..920594b7bc 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -9,6 +9,10 @@ See the upgrade notes for specific information about upgrading. Released TBD +`sqlauth` + +* Add multi-query support (simplesamlphp/simplesamlphp-module-sqlauth#9) (v1.2.0) + ## Version 2.2.0 Released 2024-03-08 From 69c4ff63f6bedd2feca656b3525a7e329eb70e9b Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 14 Mar 2024 22:57:31 +0100 Subject: [PATCH 008/532] Fix regression (#1892) --- bin/initMDSPdo.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/initMDSPdo.php b/bin/initMDSPdo.php index dec7e53326..e68dfadf39 100755 --- a/bin/initMDSPdo.php +++ b/bin/initMDSPdo.php @@ -8,7 +8,11 @@ // Add library autoloader and configuration require_once $baseDir . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . '_autoload.php'; -require_once \SimpleSAML\Utils\Config::getConfigDir() . DIRECTORY_SEPARATOR . 'config.php'; + +// This is the config dir of the SimpleSAMLphp installation +$configDir = (new \SimpleSAML\Utils\Config())->getConfigDir(); + +require_once $configDir . DIRECTORY_SEPARATOR . 'config.php'; echo "Initializing Metadata Database..." . PHP_EOL; From 49746df72d6c343b99985fb88ff8a326ceae3a7b Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Thu, 14 Mar 2024 11:19:59 +1000 Subject: [PATCH 009/532] Merge pull request #2002 from nathanjrobertson/remove_StatisticsWithAttribute Document and remove configuration for StatisticsWithAttribute module --- config/config.php.dist | 6 ------ docs/simplesamlphp-changelog.md | 7 +++++++ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/config/config.php.dist b/config/config.php.dist index f47d0eb9b9..c0bfdd4f25 100644 --- a/config/config.php.dist +++ b/config/config.php.dist @@ -993,12 +993,6 @@ $config = [ // Adopts language from attribute to use in UI 30 => 'core:LanguageAdaptor', - 45 => [ - 'class' => 'core:StatisticsWithAttribute', - 'attributename' => 'realm', - 'type' => 'saml20-idp-SSO', - ], - /* When called without parameters, it will fallback to filter attributes 'the old way' * by checking the 'attributes' parameter in metadata on IdP hosted and SP remote. */ diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 920594b7bc..1c0be96b5a 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -21,6 +21,13 @@ Released 2024-03-08 * Updated eduPerson attributes in attribute maps (#1948) * Add regex support for attribute names in AttributeLimit authproc filter (#1971) * Reverted the .mo files change introduced in 2.1.x +* NOTE: 'core:StatisticsWithAttribute' filter was removed from SimpleSAMLphp, but is still + available from the [statistics](https://github.com/simplesamlphp/simplesamlphp-module-statistics)-module. + It was previously enabled in the default configuration file (config/config.php.dist), so + many lightly configured installations will have it enabled by default. Please check your + config/config.php (and anywhere else you have authprocs configured) that you've either + disabled "core:StatisticsWithAttribute" or migrated to "statistics:StatisticsWithAttribute" + before upgrading to SimpleSAMLphp 2.2.0. ## Version 2.1.4 From 47a2d8a8851f28397ed6849cd584a5f2c12dfd70 Mon Sep 17 00:00:00 2001 From: Ben Martin Date: Sat, 16 Mar 2024 21:18:58 +1000 Subject: [PATCH 010/532] i18n: when loading from po file the domain from the file has to be wiped --- src/SimpleSAML/Locale/Localization.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SimpleSAML/Locale/Localization.php b/src/SimpleSAML/Locale/Localization.php index f08cdd0b70..4c686099f7 100644 --- a/src/SimpleSAML/Locale/Localization.php +++ b/src/SimpleSAML/Locale/Localization.php @@ -244,6 +244,7 @@ private function loadGettextGettextFromPO( $file = new File($langPath . $domain . '.po', false); if ($file->getRealPath() !== false && $file->isReadable()) { $translations = (new PoLoader())->loadFile($file->getRealPath()); + $translations->setDomain(''); $arrayGenerator = new ArrayGenerator(); $this->translator->addTranslations( $arrayGenerator->generateArray($translations) From 83b1d9a15e304bf9fdbdbf3369b4c28bd294ad5e Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 16 Mar 2024 23:56:33 +0100 Subject: [PATCH 011/532] Fix lock-file --- composer.lock | 80 +++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/composer.lock b/composer.lock index 4742974929..1732e8840a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d91367cd61fc07fdc982d7fb068d705b", + "content-hash": "9312ab772cf9aeff4f05ad1959b1c0b5", "packages": [ { "name": "gettext/gettext", @@ -3688,21 +3688,21 @@ }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v4.19.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "32cdab9a034239a8f57ae0e9a15bada4bd9747bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/32cdab9a034239a8f57ae0e9a15bada4bd9747bf", + "reference": "32cdab9a034239a8f57ae0e9a15bada4bd9747bf", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.1" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", @@ -3738,9 +3738,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.0" }, - "time": "2023-12-10T21:03:43+00:00" + "time": "2024-03-16T14:49:31+00:00" }, { "name": "phar-io/manifest", @@ -3909,16 +3909,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.12", + "version": "10.1.14", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "842f72662d6b9edda84c4b6f13885fd9cd53dc63" + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/842f72662d6b9edda84c4b6f13885fd9cd53dc63", - "reference": "842f72662d6b9edda84c4b6f13885fd9cd53dc63", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", "shasum": "" }, "require": { @@ -3975,7 +3975,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.12" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" }, "funding": [ { @@ -3983,7 +3983,7 @@ "type": "github" } ], - "time": "2024-03-02T07:22:05+00:00" + "time": "2024-03-12T15:33:41+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4230,16 +4230,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.11", + "version": "10.5.13", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4" + "reference": "20a63fc1c6db29b15da3bd02d4b6cf59900088a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4", - "reference": "0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/20a63fc1c6db29b15da3bd02d4b6cf59900088a7", + "reference": "20a63fc1c6db29b15da3bd02d4b6cf59900088a7", "shasum": "" }, "require": { @@ -4311,7 +4311,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.11" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.13" }, "funding": [ { @@ -4327,7 +4327,7 @@ "type": "tidelift" } ], - "time": "2024-02-25T14:05:00+00:00" + "time": "2024-03-12T15:37:41+00:00" }, { "name": "predis/predis", @@ -5364,26 +5364,26 @@ }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.5.10", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "58a0dc88216b7f7bb51da62a7174d646ba526129" + "reference": "41a3544811a9cce9dacfc3b485ebdfcf0eb433fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/58a0dc88216b7f7bb51da62a7174d646ba526129", - "reference": "58a0dc88216b7f7bb51da62a7174d646ba526129", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/41a3544811a9cce9dacfc3b485ebdfcf0eb433fe", + "reference": "41a3544811a9cce9dacfc3b485ebdfcf0eb433fe", "shasum": "" }, "require": { - "phpunit/phpunit": "^9.6 || ^10.0", - "slevomat/coding-standard": "^8.14" + "phpunit/phpunit": "^9.6 || ^10.0 || ^11.0", + "slevomat/coding-standard": "^8.15" }, "require-dev": { "ext-curl": "*", - "php": "^8.0", - "simplesamlphp/simplesamlphp": "^2.0.0" + "php": "^8.1", + "simplesamlphp/simplesamlphp": "^2.2.0" }, "type": "project", "autoload": { @@ -5409,7 +5409,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2024-01-11T18:12:00+00:00" + "time": "2024-03-13T23:59:07+00:00" }, { "name": "simplesamlphp/xml-common", @@ -5536,32 +5536,32 @@ }, { "name": "slevomat/coding-standard", - "version": "8.14.1", + "version": "8.15.0", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "fea1fd6f137cc84f9cba0ae30d549615dbc6a926" + "reference": "7d1d957421618a3803b593ec31ace470177d7817" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/fea1fd6f137cc84f9cba0ae30d549615dbc6a926", - "reference": "fea1fd6f137cc84f9cba0ae30d549615dbc6a926", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/7d1d957421618a3803b593ec31ace470177d7817", + "reference": "7d1d957421618a3803b593ec31ace470177d7817", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", "php": "^7.2 || ^8.0", "phpstan/phpdoc-parser": "^1.23.1", - "squizlabs/php_codesniffer": "^3.7.1" + "squizlabs/php_codesniffer": "^3.9.0" }, "require-dev": { "phing/phing": "2.17.4", "php-parallel-lint/php-parallel-lint": "1.3.2", - "phpstan/phpstan": "1.10.37", + "phpstan/phpstan": "1.10.60", "phpstan/phpstan-deprecation-rules": "1.1.4", - "phpstan/phpstan-phpunit": "1.3.14", - "phpstan/phpstan-strict-rules": "1.5.1", - "phpunit/phpunit": "8.5.21|9.6.8|10.3.5" + "phpstan/phpstan-phpunit": "1.3.16", + "phpstan/phpstan-strict-rules": "1.5.2", + "phpunit/phpunit": "8.5.21|9.6.8|10.5.11" }, "type": "phpcodesniffer-standard", "extra": { @@ -5585,7 +5585,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.14.1" + "source": "https://github.com/slevomat/coding-standard/tree/8.15.0" }, "funding": [ { @@ -5597,7 +5597,7 @@ "type": "tidelift" } ], - "time": "2023-10-08T07:28:08+00:00" + "time": "2024-03-09T15:20:58+00:00" }, { "name": "squizlabs/php_codesniffer", From 6b9aad93233436308847e19f4118586f1ed9c2bb Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 17 Mar 2024 00:12:24 +0100 Subject: [PATCH 012/532] Do not build translations on tag --- .github/workflows/translations.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml index c38204f4a1..f82301eed7 100644 --- a/.github/workflows/translations.yml +++ b/.github/workflows/translations.yml @@ -3,6 +3,8 @@ name: Build translations on: # yamllint disable-line rule:truthy push: + tags-ignore: + - '**' paths: - '**.po' - '**.php' From 6f0f1af59712f62320f7b40eb7c1fa8f214d9c5e Mon Sep 17 00:00:00 2001 From: Tom Kunze Date: Sun, 17 Mar 2024 01:17:40 +0100 Subject: [PATCH 013/532] multiauth: Fix typo --- modules/multiauth/locales/af/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/ar/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/cs/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/da/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/de/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/el/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/en/LC_MESSAGES/multiauth.po | 3 --- modules/multiauth/locales/es/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/et/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/eu/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/fi/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/fr/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/he/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/hr/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/hu/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/id/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/it/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/ja/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/lt/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/lv/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/nb/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/nl/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/nn/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/pl/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/pt/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/ro/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/ru/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/sl/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/sr/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/sv/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/xh/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/zh-tw/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/zh/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/locales/zu/LC_MESSAGES/multiauth.po | 2 +- modules/multiauth/templates/selectsource.twig | 2 +- 35 files changed, 34 insertions(+), 37 deletions(-) diff --git a/modules/multiauth/locales/af/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/af/LC_MESSAGES/multiauth.po index 1215fa21c3..335744a69b 100644 --- a/modules/multiauth/locales/af/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/af/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Kies 'n verifikasie bron" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Die gekose verifikasie bron sal gebruik word om jou te identifiseer en 'n geldige sessie te skep." diff --git a/modules/multiauth/locales/ar/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/ar/LC_MESSAGES/multiauth.po index 6673123cc3..5bd103828c 100644 --- a/modules/multiauth/locales/ar/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/ar/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "اختار مصدر توثيق" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "مصدرتوثيقك المختار سيستخدم لتصديق دخولك " diff --git a/modules/multiauth/locales/cs/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/cs/LC_MESSAGES/multiauth.po index 3e38e5a73d..dfcc4faaf6 100644 --- a/modules/multiauth/locales/cs/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/cs/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Zvolte autentizační zdroj" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Zvolený autentizační zdroj bude použit pro vaše ověření a vytvoření platného sezení." diff --git a/modules/multiauth/locales/da/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/da/LC_MESSAGES/multiauth.po index 825ef1528a..53dc6b7035 100644 --- a/modules/multiauth/locales/da/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/da/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Vælg en authentifiseringskilde" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Den valgte authentifiseringskilde vil blive brugt til at authentifisere dig og give dig en gyldig session." diff --git a/modules/multiauth/locales/de/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/de/LC_MESSAGES/multiauth.po index b5abd43253..aa7f59da41 100644 --- a/modules/multiauth/locales/de/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/de/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Wählen Sie eine Authentifizierungsquelle" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Die gewählte Authentifizierungsquelle wird verwenden werden, um Sie zu authentifizieren und eine gültige Sitzung zu erzeugen." diff --git a/modules/multiauth/locales/el/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/el/LC_MESSAGES/multiauth.po index 414c2039b1..22d9beb2cc 100644 --- a/modules/multiauth/locales/el/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/el/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Επιλογή πηγής ταυτοποίησης" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Η επιλεγμένη πηγή ταυτοποίησης θα χρησιμοποιηθεί για την πιστοποίηση της ταυτότητά σας και τη δημιουργία έγκυρης συνεδρίας (session)." diff --git a/modules/multiauth/locales/en/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/en/LC_MESSAGES/multiauth.po index 73454322f5..d56a18dc72 100644 --- a/modules/multiauth/locales/en/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/en/LC_MESSAGES/multiauth.po @@ -5,8 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Select an authentication source" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." -msgstr "" - msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "The selected authentication source will be used to authenticate you and to create a valid session." diff --git a/modules/multiauth/locales/es/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/es/LC_MESSAGES/multiauth.po index d741350d20..2c44f866d6 100644 --- a/modules/multiauth/locales/es/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/es/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Seleccione una fuente para autenticarse" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "La fuente para autenticarse seleccionada será utilizada para autenticarlo y crear una sesión válida" diff --git a/modules/multiauth/locales/et/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/et/LC_MESSAGES/multiauth.po index cd5d1b7107..f61a8a2a70 100644 --- a/modules/multiauth/locales/et/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/et/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Vali autentimisallikas" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Valitud autentimisallikat kasutatakse sinu autentimiseks ja kasutussessiooni loomiseks." diff --git a/modules/multiauth/locales/eu/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/eu/LC_MESSAGES/multiauth.po index 2fc19b49a7..7766d723d9 100644 --- a/modules/multiauth/locales/eu/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/eu/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Hauta ezazu iturburu bat kautotzeko" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Kautotzeko hautatu duzun iturburua, kautotu eta baliozko saio bat sortzeko erabiliko da." diff --git a/modules/multiauth/locales/fi/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/fi/LC_MESSAGES/multiauth.po index f977acee70..421e062420 100644 --- a/modules/multiauth/locales/fi/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/fi/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Valitse todentamislähde" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Valittua todentamislähdettä käytetään tunnistamiseen ja uuden istunnon luomiseen." diff --git a/modules/multiauth/locales/fr/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/fr/LC_MESSAGES/multiauth.po index 38e2d6524d..9e62f706f9 100644 --- a/modules/multiauth/locales/fr/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/fr/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Sélectionnez une source d'authentification" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "La source d'authentification sélectionnée sera utilisée pour vous authentifier et créer une session." diff --git a/modules/multiauth/locales/he/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/he/LC_MESSAGES/multiauth.po index 14bcb57f9c..fb13cd1450 100644 --- a/modules/multiauth/locales/he/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/he/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "בחר מקור אימות" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "מקור האימות הנבחר ישמש כדי לאמת את זהותך וליצור את סביבת ההתחברות. " diff --git a/modules/multiauth/locales/hr/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/hr/LC_MESSAGES/multiauth.po index 57981c8052..23958399c3 100644 --- a/modules/multiauth/locales/hr/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/hr/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Odaberite servis preko kojeg se želite autentificirati" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Odabrani autentifikacijski servis bit će iskorišten za vašu autentifikaciju i kreiranje valjane sjednice." diff --git a/modules/multiauth/locales/hu/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/hu/LC_MESSAGES/multiauth.po index db93d687b7..8a5cad3b9f 100644 --- a/modules/multiauth/locales/hu/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/hu/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Válasszon azonosítási metódust" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "A kiválasztott azonosítási metódust kiválasztva azonosítani fogjuk, és kiállítunk erről egy hiteles igazolást." diff --git a/modules/multiauth/locales/id/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/id/LC_MESSAGES/multiauth.po index 0f25320fba..9d5fdc60d4 100644 --- a/modules/multiauth/locales/id/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/id/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Pilih sumber autentifikasi" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Sumber autentifikasi terpilih akan digunakan untuk mengautentifikasi Anda dan membuat sebuah session yang valid." diff --git a/modules/multiauth/locales/it/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/it/LC_MESSAGES/multiauth.po index b4dd2418f7..01d474601c 100644 --- a/modules/multiauth/locales/it/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/it/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Selezionare una fonte di autenticazione" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "La fonte di autenticazione selezionata verrà usata per autenticarti e creare una sessione valida." diff --git a/modules/multiauth/locales/ja/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/ja/LC_MESSAGES/multiauth.po index 214509a4e8..8d8e8e7320 100644 --- a/modules/multiauth/locales/ja/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/ja/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "認証元を選択してください。" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "選択された認証元は認証に使用され、正当なセッションを生成します。" diff --git a/modules/multiauth/locales/lt/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/lt/LC_MESSAGES/multiauth.po index 2ad477b7b2..98a2233667 100644 --- a/modules/multiauth/locales/lt/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/lt/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Pasirinkite autentiškumo patvirtinimo šaltinį" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Pasirinktas autentiškumo patvirtinimo šaltinis bus naudojamas nustatyti Jūsų autentiškumą ir sukurti galiojančią sesiją." diff --git a/modules/multiauth/locales/lv/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/lv/LC_MESSAGES/multiauth.po index bcb9687204..3eef388fb5 100644 --- a/modules/multiauth/locales/lv/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/lv/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Izvēlieties autentifikācijas avotu" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Izvēlētais autentifikācijas avots tiks izmantots Jūsu autentificēšanai un derīgas sesijas izveidošanai." diff --git a/modules/multiauth/locales/nb/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/nb/LC_MESSAGES/multiauth.po index 0844bda6fd..6ac82277a7 100644 --- a/modules/multiauth/locales/nb/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/nb/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Velg en autentiseringskilde" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Den valgte autentiseringskilden vil bli brukt til å autentisere brukeren og deretter etablere en gyldig sesjon." diff --git a/modules/multiauth/locales/nl/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/nl/LC_MESSAGES/multiauth.po index 8b2c87cabd..b73868ef54 100644 --- a/modules/multiauth/locales/nl/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/nl/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Selecteer een authenticatiebron" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "De geselecteerde authenticatiebron zal gebruikt worden om u te authenticeren en een geldige sessie op te zetten." diff --git a/modules/multiauth/locales/nn/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/nn/LC_MESSAGES/multiauth.po index c536329ba5..467b72994c 100644 --- a/modules/multiauth/locales/nn/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/nn/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Vel ei innloggingskjelde" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Innloggingskjelda du har vald blir brukt til å logga inn og laga ein gyldig sesjon." diff --git a/modules/multiauth/locales/pl/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/pl/LC_MESSAGES/multiauth.po index bb57bfb956..bb89ab9c8a 100644 --- a/modules/multiauth/locales/pl/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/pl/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Wybierz źródło autentykacji" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Wybrane źródło zostanie użyte do autentykacji i stworzenia sesji" diff --git a/modules/multiauth/locales/pt/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/pt/LC_MESSAGES/multiauth.po index d0ce2655e6..8116c1de6f 100644 --- a/modules/multiauth/locales/pt/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/pt/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Escolha uma fonte de autenticação" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "A fonte de autenticação escolhida será usada para o autenticar e criar uma sessão válida." diff --git a/modules/multiauth/locales/ro/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/ro/LC_MESSAGES/multiauth.po index 3d7f63d609..d9151ce478 100644 --- a/modules/multiauth/locales/ro/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/ro/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Vă rugăm să alegeți o sursă pentru autentificare" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Sursa de autentificare selectată va fi folosită pentru a vă autentifica și pentru a crea o sesiune validă." diff --git a/modules/multiauth/locales/ru/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/ru/LC_MESSAGES/multiauth.po index a2005b8fe5..c470668e1e 100644 --- a/modules/multiauth/locales/ru/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/ru/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Выберите источник аутентификации" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Выбранный источник аутентификации будет использоваться для вашей аутентификации и для создания надёжной сессии." diff --git a/modules/multiauth/locales/sl/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/sl/LC_MESSAGES/multiauth.po index 4587601c8b..b35dcbb89e 100644 --- a/modules/multiauth/locales/sl/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/sl/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Izberite avtentikacijski vir" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Izbrani avtentikacijski vir bo uporabljen pri vaši prijavi" diff --git a/modules/multiauth/locales/sr/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/sr/LC_MESSAGES/multiauth.po index e05fe22863..d483c6984b 100644 --- a/modules/multiauth/locales/sr/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/sr/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Odaberite izvor preko koga se želite autentifikovati" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Izabrani autentifikacioni izvor će biti upotrebljen za vašu autentifikaciju i kreiranje validne sesije." diff --git a/modules/multiauth/locales/sv/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/sv/LC_MESSAGES/multiauth.po index f5fc0b2537..ee3f611f1d 100644 --- a/modules/multiauth/locales/sv/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/sv/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Välj inloggningskälla" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Den valda inloggningskällan kommer att användas för din inloggning och för att skapa giltig inloggningssession." diff --git a/modules/multiauth/locales/xh/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/xh/LC_MESSAGES/multiauth.po index dcbaf555c9..3a08ea97b0 100644 --- a/modules/multiauth/locales/xh/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/xh/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Khetha umthombo wongqinisiso" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Umthombo wongqinisiso okhethiweyo uza kusetyenziswa ukukungqinisisa nokuyila iseshoni esebenzayo." diff --git a/modules/multiauth/locales/zh-tw/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/zh-tw/LC_MESSAGES/multiauth.po index 5b8b898fbc..15bd9f638a 100644 --- a/modules/multiauth/locales/zh-tw/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/zh-tw/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "選擇一個認證來源" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "系統將會使用您選擇之認證來源進行驗證並建立一個有效連線。" diff --git a/modules/multiauth/locales/zh/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/zh/LC_MESSAGES/multiauth.po index 9414eac60a..21b9d8a5f0 100644 --- a/modules/multiauth/locales/zh/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/zh/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "选择一个认证源" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "选定的认证源将会用于认证你的身份和给你一个有效的会话" diff --git a/modules/multiauth/locales/zu/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/zu/LC_MESSAGES/multiauth.po index 2dfb903f6e..2f224839a9 100644 --- a/modules/multiauth/locales/zu/LC_MESSAGES/multiauth.po +++ b/modules/multiauth/locales/zu/LC_MESSAGES/multiauth.po @@ -5,5 +5,5 @@ msgstr "" msgid "Select an authentication source" msgstr "Khetha umthombo wokuqinisekisa" -msgid "The selected authentication source will be used to authenticate you and and to create a valid session." +msgid "The selected authentication source will be used to authenticate you and to create a valid session." msgstr "Umthombo wokuqinisekisa okhethiwe uzosetshenziswa ukuze uqinisekiswe futhi kwakhiwe iseshini esebenzayo." diff --git a/modules/multiauth/templates/selectsource.twig b/modules/multiauth/templates/selectsource.twig index 5b0af31ad6..87bda546e8 100644 --- a/modules/multiauth/templates/selectsource.twig +++ b/modules/multiauth/templates/selectsource.twig @@ -3,7 +3,7 @@ {% block content %}

{{ 'Select an authentication source'|trans }}

-

{{ 'The selected authentication source will be used to authenticate you and and to create a valid session.'|trans }}

+

{{ 'The selected authentication source will be used to authenticate you and to create a valid session.'|trans }}

From a396a4b6d4897f15622ca1f97a925a5e8d637ca3 Mon Sep 17 00:00:00 2001 From: Thijs Kinkhorst Date: Fri, 12 Jan 2024 15:34:53 +0000 Subject: [PATCH 014/532] Fix endpoint string replacement losing the path component --- src/SimpleSAML/Metadata/MetaDataStorageHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SimpleSAML/Metadata/MetaDataStorageHandler.php b/src/SimpleSAML/Metadata/MetaDataStorageHandler.php index ec78615807..8a7acbc342 100644 --- a/src/SimpleSAML/Metadata/MetaDataStorageHandler.php +++ b/src/SimpleSAML/Metadata/MetaDataStorageHandler.php @@ -103,7 +103,7 @@ public function getGenerated(string $property, string $set, string $overrideHost $httpUtils = new Utils\HTTP(); $baseurl = $httpUtils->getSelfURLHost() . $config->getBasePath(); if ($overrideHost !== null) { - $baseurl = str_replace('://' . $httpUtils->getSelfHostWithPath() . '/', '://' . $overrideHost . '/', $baseurl); + $baseurl = str_replace('://' . $httpUtils->getSelfHost() . '/', '://' . $overrideHost . '/', $baseurl); } if ($set == 'saml20-sp-hosted') { From 26bcc1460d0425785509c731cad6eaad9b8f7c36 Mon Sep 17 00:00:00 2001 From: Ben Martin Date: Thu, 21 Mar 2024 09:39:42 +1000 Subject: [PATCH 015/532] update of pull/1984 against 2.3 --- docs/simplesamlphp-maintenance.md | 11 +- .../MetaDataStorageHandlerDirectory.php | 180 ++++++++++++++++++ .../MetaDataStorageHandlerFlatFile.php | 15 ++ .../Metadata/MetaDataStorageSource.php | 2 + 4 files changed, 207 insertions(+), 1 deletion(-) create mode 100644 src/SimpleSAML/Metadata/MetaDataStorageHandlerDirectory.php diff --git a/docs/simplesamlphp-maintenance.md b/docs/simplesamlphp-maintenance.md index 5e77c49684..bc08148ab7 100644 --- a/docs/simplesamlphp-maintenance.md +++ b/docs/simplesamlphp-maintenance.md @@ -198,7 +198,7 @@ Configure your master group by setting `store.redis.mastergroup` (`mymaster` by ## Metadata storage -Several metadata storage backends are available by default, including `flatfile`, `serialize`, `mdq` and +Several metadata storage backends are available by default, including `flatfile`, `directory`, `serialize`, `mdq` and [`pdo`](https://simplesamlphp.org/docs/stable/simplesamlphp-metadata-pdostoragehandler). Here you have an example configuration of different metadata sources in use at the same time: @@ -207,9 +207,18 @@ example configuration of different metadata sources in use at the same time: ['type' => 'flatfile'], ['type' => 'flatfile', 'directory' => 'metadata/metarefresh-kalmar'], ['type' => 'serialize', 'directory' => 'metadata/metarefresh-ukaccess'], + ['type' => 'directory'], + ['type' => 'directory', 'directory' => 'metadata/somewhere-else'], ], ``` +The directory type storage backend will look in subdirectories such as +saml20-idp-hosted.d and saml20-sp-remote.d in the given directory (or +the 'metadatadir' configuration option in 'config.php' by default). +All xml and php files found in those subdirectories will be loaded. It is +currently an error to have subdirectories inside the +saml20-sp-remote.d directories. + You may also implement your own metadata storage handler, in a very similar way to how you would implement your own session handler. Your class **must** extend the `\SimpleSAML\Metadata\MetaDataStorageSource` class and override the methods needed to change the backend used. This class **must** also be located in the diff --git a/src/SimpleSAML/Metadata/MetaDataStorageHandlerDirectory.php b/src/SimpleSAML/Metadata/MetaDataStorageHandlerDirectory.php new file mode 100644 index 0000000000..22c7c40a5c --- /dev/null +++ b/src/SimpleSAML/Metadata/MetaDataStorageHandlerDirectory.php @@ -0,0 +1,180 @@ +directory = $config['directory'] ?: 'metadata/'; + } else { + $this->directory = $globalConfig->getOptionalString('metadatadir', 'metadata/'); + } + + /* Resolve this directory relative to the SimpleSAMLphp directory (unless it is + * an absolute path). + */ + + /** @var string $base */ + $base = $globalConfig->resolvePath($this->directory); + $this->directory = $base . '/'; + } + + + /** + * This function loads the given set of metadata files in the metadata directory. + * This function returns null if it is unable to locate the given set in the metadata directory. + * + * @param string $set The set of metadata we are loading. + * + * @return array|null An associative array with the metadata, + * or null if we are unable to load metadata from the given file. + * @throws \Exception If the metadata set cannot be loaded. + */ + private function load(string $set): ?array + { + $metadatasetdir = $this->directory . $set . '.d'; + + if (!$this->fileSystem->exists($metadatasetdir)) { + return null; + } + + /** @psalm-var mixed $metadata We cannot be sure what the include below will do with this var */ + $metadata = []; + + $dh = @opendir($metadatasetdir); + if ($dh === false) { + Logger::warning( + 'Directory metadata handler: Unable to open directory: ' . var_export($metadatasetdir, true) + ); + return $metadata; + } + + while (($entry = readdir($dh)) !== false) { + if ($entry[0] === '.') { + // skip '..', '.' and hidden files + continue; + } + + $path = $metadatasetdir . DIRECTORY_SEPARATOR . $entry; + if (is_dir($path)) { + Logger::warning( + 'Directory metadata handler: Metadata directory contained a directory where only files should ' . + 'exist: ' . var_export($path, true) + ); + continue; + } + + if (str_ends_with($path, '.php') || str_ends_with($path, '.xml')) { + $type = 'flatfile'; + if (str_ends_with($path, '.xml')) { + $type = 'xml'; + } + Logger::info("loading set $set metadata file at $path"); + + $config = [ 'type' => $type, 'file' => $path ]; + $source = MetaDataStorageSource::getSource($config); + $md = $source->getMetadataSet($set); + $metadata = array_merge($metadata, $md); + } + } + + + + + if (!is_array($metadata)) { + throw new Exception('Could not load metadata set [' . $set . '] from file: ' . $metadatasetfile); + } + return $metadata; + } + + + /** + * This function retrieves the given set of metadata. It will return an empty array if it is + * unable to locate it. + * + * @param string $set The set of metadata we are retrieving. + * + * @return array An associative array with the metadata. Each element in the array is an entity, and the + * key is the entity id. + */ + public function getMetadataSet(string $set): array + { + if (array_key_exists($set, $this->cachedMetadata)) { + return $this->cachedMetadata[$set]; + } + + $metadataSet = $this->load($set); + if ($metadataSet === null) { + $metadataSet = []; + } + + // add the entity id of an entry to each entry in the metadata + foreach ($metadataSet as $entityId => &$entry) { + $entry['entityid'] = $entityId; + // check we're not seeing the entityID from the metadata-template + if ($set === 'saml20-idp-hosted') { + Assert::notEq( + $entityId, + 'urn:x-simplesamlphp:example-idp', + 'Please set a valid and unique entityID', + ); + } + } + + $this->cachedMetadata[$set] = $metadataSet; + return $metadataSet; + } +} diff --git a/src/SimpleSAML/Metadata/MetaDataStorageHandlerFlatFile.php b/src/SimpleSAML/Metadata/MetaDataStorageHandlerFlatFile.php index 5fa2c09c70..0743373552 100644 --- a/src/SimpleSAML/Metadata/MetaDataStorageHandlerFlatFile.php +++ b/src/SimpleSAML/Metadata/MetaDataStorageHandlerFlatFile.php @@ -30,6 +30,13 @@ class MetaDataStorageHandlerFlatFile extends MetaDataStorageSource private string $directory = '/'; + /** + * Optional explicit file path to load metadata from + * + * @var string + */ + private ?string $file = null; + /** * This is an associative array which stores the different metadata sets we have loaded. * @@ -44,6 +51,7 @@ class MetaDataStorageHandlerFlatFile extends MetaDataStorageSource * possible elements: * - 'directory': The directory we should load metadata from. The default directory is * set in the 'metadatadir' configuration option in 'config.php'. + * - 'file': full path to load metadata from. This is used by the MetaDataStorageHandlerDirectory class. * * @param array $config An associative array with the configuration for this handler. */ @@ -61,6 +69,10 @@ protected function __construct(array $config) $this->directory = $globalConfig->getOptionalString('metadatadir', 'metadata/'); } + if (array_key_exists('file', $config)) { + $this->file = $globalConfig->resolvePath($config['file']); + } + /* Resolve this directory relative to the SimpleSAMLphp directory (unless it is * an absolute path). */ @@ -84,6 +96,9 @@ protected function __construct(array $config) private function load(string $set): ?array { $metadatasetfile = $this->directory . $set . '.php'; + if ($this->file) { + $metadatasetfile = $this->file; + } if (!$this->fileSystem->exists($metadatasetfile)) { return null; diff --git a/src/SimpleSAML/Metadata/MetaDataStorageSource.php b/src/SimpleSAML/Metadata/MetaDataStorageSource.php index fe33c87b71..9a810c3d3d 100644 --- a/src/SimpleSAML/Metadata/MetaDataStorageSource.php +++ b/src/SimpleSAML/Metadata/MetaDataStorageSource.php @@ -95,6 +95,8 @@ public static function getSource(array $sourceConfig): MetaDataStorageSource return new Sources\MDQ($sourceConfig); case 'pdo': return new MetaDataStorageHandlerPdo($sourceConfig); + case 'directory': + return new MetaDataStorageHandlerDirectory($sourceConfig); default: // metadata store from module try { From 912d1d75d22c868c57698e620225ac41df2babf3 Mon Sep 17 00:00:00 2001 From: Alexis Birkill Date: Sun, 24 Mar 2024 02:20:22 -0700 Subject: [PATCH 016/532] Fixes to the custom username/password auth docs (#2019) This fixes some errors that are encountered when following the example with the latest release version of SimpleSAMLphp (2.2.1). --- docs/simplesamlphp-customauth.md | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/docs/simplesamlphp-customauth.md b/docs/simplesamlphp-customauth.md index 3a8a78d89c..9c08c9d3c4 100644 --- a/docs/simplesamlphp-customauth.md +++ b/docs/simplesamlphp-customauth.md @@ -21,7 +21,6 @@ cd modules mkdir mymodule ``` -Since this is a custom module, it should always be enabled in the configuration. Now that we have our own module, we can move on to creating an authentication source. Creating a basic authentication source @@ -41,7 +40,7 @@ namespace SimpleSAML\Module\mymodule\Auth\Source; class MyAuth extends \SimpleSAML\Module\core\Auth\UserPassBase { - protected function login($username, $password) + protected function login(string $username, string $password): array { if ($username !== 'theusername' || $password !== 'thepassword') { throw new \SimpleSAML\Error\Error(\SimpleSAML\Error\ErrorCodes::WRONGUSERPASS); @@ -76,7 +75,7 @@ Configuring our authentication source ------------------------------------- Before we can test our authentication source, we must add an entry for it in `config/authsources.php`. -`config/authsources.php` contains an list of enabled authentication sources. +`config/authsources.php` contains a list of enabled authentication sources. The entry looks like this: @@ -106,6 +105,18 @@ The instance name is used to refer to this authentication source in other config The first element of the configuration of the authentication source must be `'mymodule:MyAuth'`. This tells SimpleSAMLphp to look for the `\SimpleSAML\Module\mymodule\Auth\Source\MyAuth` class. +We also need to enable our new module in `config/config.php`. +`config/config.php` contains a list of enabled modules. + +We want to add our new module to the list of other enabled modules. We can add it to the beginning of the list, so the enabled modules section looks something like this: + +```php +'module.enable' => [ + 'mymodule' => true, + /* Other enabled modules follow. */ +], +``` + Testing our authentication source --------------------------------- @@ -203,7 +214,7 @@ class MyAuth extends \SimpleSAML\Module\core\Auth\UserPassBase $this->password = $config['password']; } - protected function login($username, $password) + protected function login(string $username, string $password): array { if ($username !== $this->username || $password !== $this->password) { throw new \SimpleSAML\Error\Error(\SimpleSAML\Error\ErrorCodes::WRONGUSERPASS); @@ -332,7 +343,7 @@ class MyAuth extends \SimpleSAML\Module\core\Auth\UserPassBase return $digest === $checkDigest; } - protected function login($username, $password) + protected function login(string $username, string $password): array { /* Connect to the database. */ $db = new PDO($this->dsn, $this->username, $this->password, $this->options); @@ -380,7 +391,7 @@ class MyAuth extends \SimpleSAML\Module\core\Auth\UserPassBase } ``` -And configured in `config/authsources.php`: +Configured in `config/authsources.php`: ```php 'myauthinstance' => [ @@ -390,3 +401,12 @@ And configured in `config/authsources.php`: 'password' => 'secret_db_password', ], ``` + +And enabled in `config/config.php`: + +```php +'module.enable' => [ + 'mymodule' => true, + /* Other enabled modules follow. */ +], +``` From 5424912d561216fd9377e357e698d8fae52f8e14 Mon Sep 17 00:00:00 2001 From: Ben Martin Date: Mon, 25 Mar 2024 11:43:42 +1000 Subject: [PATCH 017/532] cherry pick dev docs from https://github.com/simplesamlphp/simplesamlphp/pull/1970 --- docs/index.md | 1 + docs/simplesamlphp-developer-information.md | 140 ++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 docs/simplesamlphp-developer-information.md diff --git a/docs/index.md b/docs/index.md index b0d65634d6..b1ce371d7a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -28,6 +28,7 @@ * [Authentication Processing Filters](simplesamlphp-authproc) - attribute filtering, attribute mapping, consent, group generation etc. * [State Information Lost](simplesamlphp-nostate) - more about this common error message * [Advanced features](simplesamlphp-advancedfeatures) - covers bridging protocols, attribute filtering, etc. + * [Developer documentation](simplesamlphp-developer-information) - code overview and other docs for new and returning developers * SimpleSAMLphp Modules * [Documentation for specific modules](/docs/contributed_modules.html) * [Theming SimpleSAMLphp](simplesamlphp-theming) diff --git a/docs/simplesamlphp-developer-information.md b/docs/simplesamlphp-developer-information.md new file mode 100644 index 0000000000..8ca9885bf6 --- /dev/null +++ b/docs/simplesamlphp-developer-information.md @@ -0,0 +1,140 @@ +# SimpleSAMLphp developer information + + + +[TOC] + +This document is intended to provide an overview of the code for developers. +It should be readable to new developers and developers who contribute as +time allows and may have forgotten some details over time. + +## Overview + +This is a living document and various sections and additions are being made +as my knowledge of the SSP code and environment expands. Hopefully this can help +others find their way around the code a bit quicker. + +The `master` branch is where active development of the next release is +taking place. If you would like to contribute an update to and +existing release please checkout the branch for that release, for +example to make a contribution to the v2.1.1 release you would +checkout the [simplesamlphp-2.1 +branch](https://github.com/simplesamlphp/simplesamlphp/tree/simplesamlphp-2.1). + +## Libraries that SimpleSAMLphp uses and planned changes + +Many dependencies are listed in the require clause of the composer.json such as Symfony, Twig, and simplesamlphp/saml2. + +As at early 2024 there is a plan to move from using robrichards/xmlseclibs to using the newly written [xml-security +library](https://github.com/simplesamlphp/xml-security). The integration of xml-security started in the v5 of the saml2 library. +The saml2 library is already a dependency of SimpleSAMLphp and is brought in with composer as a [dependency here.](https://github.com/simplesamlphp/simplesamlphp/blob/15019f97eb1b4041859582b8b6f39fe432b603af/composer.json#L66C21-L66C29). + +## Build process + +There are two main release targets for each release: slim and full. +This is done by the +[build-release.yml](https://github.com/simplesamlphp/simplesamlphp/blob/master/.github/workflows/build-release.yml) +script. The full version also contains some [simplesamlphp +modules](https://github.com/simplesamlphp/simplesamlphp/blob/master/.github/build/full.json). +The build will also include some files in the vendor directory in the +full build that are not in the slim build. + +If the SimpleSAMLphp code relies on other repositories on the [simplesamlphp](https://github.com/simplesamlphp) site then +they are brought in using composer as shown for example for the [saml2 library](https://github.com/simplesamlphp/simplesamlphp/blob/435ce92874a789101495504cd6c4da600fb01334/composer.json#L73). + +## Code checks + +The github actions perform some linting and checks on the php code. +The linting is done with super-linter and the php checks with phpcs. +You can run the phpcs checks locally by executing `phpcs` in the root +of the git repository. If you would like your simpler issues to be +solved for you execute `phpcbf` which will update the code to remedy +as many issues as it can. + +## Following a simple login + +The `SimpleSAML\Auth\Simple` class takes the authentication_source +name and can be used to find a login URL with `getLoginURL()`. The +getLoginURL method takes the return URL as it's only parameter. The +URL returned from `getLoginURL()` will be a request to module.php and +include the return URL information. + +The module.php code `Module::process`. The `process` method uses +Symfony to dispatch the request. This may result in a call to +modules/core/src/Controller/Login.php in `Login::loginuserpass()`. The +code flows through `handleLogin()` which may call +`UserPassBase::handleLogin(authstateid, username, password)`. The +`handleLogin` method looks up the `$as = Auth\Source` and passes the +login credentials to the `$as->login( username, password )` method. + +For an SQL based login this would be in +modules/sqlauth/src/Auth/Source/SQL.php and the `SQL::login` method. +This `login` method either returns the user attributes on success or +throws an exception on login failure. + +## Documentation + +The core of the simplesamlphp.org website is taken from +[simplesamlphp.github.io](https://github.com/simplesamlphp/simplesamlphp.github.io). +The [docs subdirectory](https://simplesamlphp.org/docs/) is built from +the [docs +subdirectory](https://github.com/simplesamlphp/simplesamlphp/tree/master/docs) +of the main repository on github. + +### Documentation updates + +There are two main repositories for documentation. The website itself +comes from one place and everything that is under the "Documentation" +menu uses another process +. + +The website lives in + +That only has a "release" branch to commit to, which is the website as +it is shown. There you'd commit to change the pages on the website, +e.g. to the page /contrib/ + +The "docs" repo (as described in the readme of the repo) only contains +the scripts that generate the docs website. In order to improve the +content of the documentation themselves, you commit using the same branches used +for code contributions at +. + +You can address documentation updates to master +. +Though it makes sense to backport them to supported releases, so each +version under will show the +change. In other words, if a documentation change relates to 2.1.3 you +might like to make the pull request against the simplesamlphp-2.1 +branch and leave it to the team to also apply it to master and other +branches in the same way that code updates work. + +### Documentation linting + +The CI system has some linting for markdown files in place. This uses +`github-action-markdown-cli` to perform the work which itself uses +`markdownlint-cli`. You can install the latter with npm install and +then setup the rc file from github-action-markdown-cli from + +to run the linter locally. + +For example, with the markdownlintrc from above in a local file you +could use the following if you have not globally installed +markdownlint. The `--fix` option will have markdownlint fix simpler +issues for you so you can concentrate on the document and not the fine +details of the syntax formatting. + +```bash +npm install markdownlint-cli +cd ./node_modules/.bin +# copy the markdown lint file to markdownlintrc +./markdownlint -c markdownlintrc /tmp/simplesamlphp-developer-information.md +./markdownlint -c markdownlintrc --fix /tmp/simplesamlphp-developer-information.md +``` + +You will probably want to make a script or alias to the above command +and apply it before pushing documentation changes to github. From a967e743d843c4bf95d9d5eeccc685b02e6068ce Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 26 Mar 2024 16:19:53 +0100 Subject: [PATCH 018/532] Update docs --- docs/simplesamlphp-install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/simplesamlphp-install.md b/docs/simplesamlphp-install.md index 3d7622098c..3e2915cebd 100644 --- a/docs/simplesamlphp-install.md +++ b/docs/simplesamlphp-install.md @@ -14,7 +14,7 @@ repository](simplesamlphp-install-repo). ## Prerequisites * A web server capable of executing PHP scripts. -* PHP version >= 8.0.0. +* PHP version >= 8.1.0. * Support for the following PHP extensions: * Always required: `date`, `dom`, `fileinfo`, `filter`, `hash`, `json`, `libxml`, `mbstring`, `openssl`, `pcre`, `session`, `simplexml`, `sodium`, `SPL` and `zlib` From 72ced54d4acc6ca138bdab8f0b23b19eccf03bd5 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 26 Mar 2024 21:36:31 +0100 Subject: [PATCH 019/532] Bump dependencies --- composer.lock | 186 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 134 insertions(+), 52 deletions(-) diff --git a/composer.lock b/composer.lock index 1732e8840a..477651467a 100644 --- a/composer.lock +++ b/composer.lock @@ -555,16 +555,16 @@ }, { "name": "simplesamlphp/assert", - "version": "v1.1.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/assert.git", - "reference": "abffdfef47d10a4345a4a8d79049b60a3f466440" + "reference": "8598fb2005f4eed689e30ebffd4e8e85ed7ce9aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/abffdfef47d10a4345a4a8d79049b60a3f466440", - "reference": "abffdfef47d10a4345a4a8d79049b60a3f466440", + "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/8598fb2005f4eed689e30ebffd4e8e85ed7ce9aa", + "reference": "8598fb2005f4eed689e30ebffd4e8e85ed7ce9aa", "shasum": "" }, "require": { @@ -606,9 +606,9 @@ "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments", "support": { "issues": "https://github.com/simplesamlphp/assert/issues", - "source": "https://github.com/simplesamlphp/assert/tree/v1.1.0" + "source": "https://github.com/simplesamlphp/assert/tree/v1.1.1" }, - "time": "2024-01-21T10:47:03+00:00" + "time": "2024-03-19T21:09:48+00:00" }, { "name": "simplesamlphp/composer-module-installer", @@ -3688,16 +3688,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.19.0", + "version": "v4.19.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "32cdab9a034239a8f57ae0e9a15bada4bd9747bf" + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/32cdab9a034239a8f57ae0e9a15bada4bd9747bf", - "reference": "32cdab9a034239a8f57ae0e9a15bada4bd9747bf", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", "shasum": "" }, "require": { @@ -3738,9 +3738,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" }, - "time": "2024-03-16T14:49:31+00:00" + "time": "2024-03-17T08:10:35+00:00" }, { "name": "phar-io/manifest", @@ -3862,16 +3862,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.26.0", + "version": "1.27.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "231e3186624c03d7e7c890ec662b81e6b0405227" + "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/231e3186624c03d7e7c890ec662b81e6b0405227", - "reference": "231e3186624c03d7e7c890ec662b81e6b0405227", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/86e4d5a4b036f8f0be1464522f4c6b584c452757", + "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757", "shasum": "" }, "require": { @@ -3903,9 +3903,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.26.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.27.0" }, - "time": "2024-02-23T16:05:55+00:00" + "time": "2024-03-21T13:14:53+00:00" }, { "name": "phpunit/php-code-coverage", @@ -4230,16 +4230,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.13", + "version": "10.5.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "20a63fc1c6db29b15da3bd02d4b6cf59900088a7" + "reference": "86376e05e8745ed81d88232ff92fee868247b07b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/20a63fc1c6db29b15da3bd02d4b6cf59900088a7", - "reference": "20a63fc1c6db29b15da3bd02d4b6cf59900088a7", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86376e05e8745ed81d88232ff92fee868247b07b", + "reference": "86376e05e8745ed81d88232ff92fee868247b07b", "shasum": "" }, "require": { @@ -4311,7 +4311,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.13" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.15" }, "funding": [ { @@ -4327,7 +4327,7 @@ "type": "tidelift" } ], - "time": "2024-03-12T15:37:41+00:00" + "time": "2024-03-22T04:17:47+00:00" }, { "name": "predis/predis", @@ -4762,16 +4762,16 @@ }, { "name": "sebastian/environment", - "version": "6.0.1", + "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", - "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "shasum": "" }, "require": { @@ -4786,7 +4786,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "6.1-dev" } }, "autoload": { @@ -4814,7 +4814,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" }, "funding": [ { @@ -4822,7 +4822,7 @@ "type": "github" } ], - "time": "2023-04-11T05:39:26+00:00" + "time": "2024-03-23T08:47:14+00:00" }, { "name": "sebastian/exporter", @@ -5364,21 +5364,22 @@ }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.6.0", + "version": "v1.6.2", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "41a3544811a9cce9dacfc3b485ebdfcf0eb433fe" + "reference": "3c0fbc0fc5395e00e40a5708e330ec1ef3cc7fa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/41a3544811a9cce9dacfc3b485ebdfcf0eb433fe", - "reference": "41a3544811a9cce9dacfc3b485ebdfcf0eb433fe", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/3c0fbc0fc5395e00e40a5708e330ec1ef3cc7fa8", + "reference": "3c0fbc0fc5395e00e40a5708e330ec1ef3cc7fa8", "shasum": "" }, "require": { - "phpunit/phpunit": "^9.6 || ^10.0 || ^11.0", - "slevomat/coding-standard": "^8.15" + "phpunit/phpunit": "^10.0 || ^11.0", + "slevomat/coding-standard": "^8.15", + "symfony/phpunit-bridge": "^6.4 || ^7.0" }, "require-dev": { "ext-curl": "*", @@ -5409,20 +5410,20 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2024-03-13T23:59:07+00:00" + "time": "2024-03-19T19:45:16+00:00" }, { "name": "simplesamlphp/xml-common", - "version": "v1.16.0", + "version": "v1.16.1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "4f1257d1357644c413438985de13c92d498b5018" + "reference": "a3c4c548ebd9783c3833c13ea7c01b010b0a1239" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/4f1257d1357644c413438985de13c92d498b5018", - "reference": "4f1257d1357644c413438985de13c92d498b5018", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/a3c4c548ebd9783c3833c13ea7c01b010b0a1239", + "reference": "a3c4c548ebd9783c3833c13ea7c01b010b0a1239", "shasum": "" }, "require": { @@ -5436,7 +5437,7 @@ "simplesamlphp/assert": "^1.1" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "^1.5" + "simplesamlphp/simplesamlphp-test-framework": "^1.6" }, "type": "project", "autoload": { @@ -5468,20 +5469,20 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2024-01-22T20:54:45+00:00" + "time": "2024-03-19T22:04:20+00:00" }, { "name": "simplesamlphp/xml-security", - "version": "v1.7.0", + "version": "v1.7.1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-security.git", - "reference": "5a07d07128a897c89fab2ec4213cd538e0763a91" + "reference": "1983558c181563246ce2062881545e2973f847e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/5a07d07128a897c89fab2ec4213cd538e0763a91", - "reference": "5a07d07128a897c89fab2ec4213cd538e0763a91", + "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/1983558c181563246ce2062881545e2973f847e6", + "reference": "1983558c181563246ce2062881545e2973f847e6", "shasum": "" }, "require": { @@ -5492,8 +5493,8 @@ "ext-pcre": "*", "ext-spl": "*", "php": "^8.1", - "simplesamlphp/assert": "^1.0", - "simplesamlphp/xml-common": "^1.13" + "simplesamlphp/assert": "^1.1", + "simplesamlphp/xml-common": "^1.15" }, "require-dev": { "simplesamlphp/simplesamlphp-test-framework": "^1.5" @@ -5530,9 +5531,9 @@ ], "support": { "issues": "https://github.com/simplesamlphp/xml-security/issues", - "source": "https://github.com/simplesamlphp/xml-security/tree/v1.7.0" + "source": "https://github.com/simplesamlphp/xml-security/tree/v1.7.1" }, - "time": "2023-12-14T20:25:08+00:00" + "time": "2024-03-19T23:13:39+00:00" }, { "name": "slevomat/coding-standard", @@ -5679,6 +5680,87 @@ ], "time": "2024-02-16T15:06:51+00:00" }, + { + "name": "symfony/phpunit-bridge", + "version": "v7.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "54ca13ec990a40411ad978e08d994fca6cdd865f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/54ca13ec990a40411ad978e08d994fca6cdd865f", + "reference": "54ca13ec990a40411ad978e08d994fca6cdd865f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "conflict": { + "phpunit/phpunit": "<7.5|9.1.2" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/error-handler": "^5.4|^6.4|^7.0", + "symfony/polyfill-php81": "^1.27" + }, + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", + "extra": { + "thanks": { + "name": "phpunit/phpunit", + "url": "https://github.com/sebastianbergmann/phpunit" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Bridge\\PhpUnit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides utilities for PHPUnit, especially user deprecation notices management", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.0.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-02-08T19:22:56+00:00" + }, { "name": "symfony/translation", "version": "v6.4.4", From 808f9a81ba6c2c95aeab3cf1dc74dd3268078bd2 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 3 Apr 2024 10:04:38 +0200 Subject: [PATCH 020/532] Update docs --- docs/simplesamlphp-reference-idp-hosted.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/simplesamlphp-reference-idp-hosted.md b/docs/simplesamlphp-reference-idp-hosted.md index 47487d8058..cfe494cfc5 100644 --- a/docs/simplesamlphp-reference-idp-hosted.md +++ b/docs/simplesamlphp-reference-idp-hosted.md @@ -290,7 +290,7 @@ The following SAML 2.0 options are available: `SingleSignOnService` : Override the default URL for the SingleSignOnService for this IdP. This is an absolute URL. The default value is - `/saml2/idp/SSOService.php` + `/module.php/saml/idp/singleSignOnService` : Note that this only changes the values in the generated metadata and in the messages sent to others. You must also @@ -311,7 +311,7 @@ The following SAML 2.0 options are available: `SingleLogoutService` : Override the default URL for the SingleLogoutService for this IdP. This is an absolute URL. The default value is - `/saml2/idp/SingleLogoutService.php` + `/module.php/saml/idp/singleLogout` : Note that this only changes the values in the generated metadata and in the messages sent to others. You must also From 19c0cc75f0a54b60873975a695bc4b0e0a40c12d Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 4 Apr 2024 10:43:50 +0200 Subject: [PATCH 021/532] Make strings translatable --- modules/core/templates/welcome.twig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/templates/welcome.twig b/modules/core/templates/welcome.twig index 562a11646a..aabd4e9f70 100644 --- a/modules/core/templates/welcome.twig +++ b/modules/core/templates/welcome.twig @@ -5,8 +5,8 @@ {% block content %}

{{ 'Welcome'|trans }}

-

{{ 'This is the front page of the SimpleSAMLphp authentication software. There\'s not much to see here.' }}

+

{{ 'This is the front page of the SimpleSAMLphp authentication software. There\'s not much to see here.'|trans }}

-

{{ 'If you are the administrator of this installation, please refer to the SimpleSAMLphp documentation for how to configure and interact with the software.' }}

+

{{ 'If you are the administrator of this installation, please refer to the SimpleSAMLphp documentation for how to configure and interact with the software.'|trans }}

{% endblock %} From cf8b5c741f14eb3d14cb09dec70eca87314eb019 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 4 Apr 2024 14:03:24 +0200 Subject: [PATCH 022/532] Fix posting the form to the incorrect endpoint when using an authsource based on UserPassOrgBase (#2022) --- modules/core/src/Controller/Login.php | 3 ++- modules/core/templates/loginuserpass.twig | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/core/src/Controller/Login.php b/modules/core/src/Controller/Login.php index a3e325278e..46cb9dedd1 100644 --- a/modules/core/src/Controller/Login.php +++ b/modules/core/src/Controller/Login.php @@ -232,7 +232,6 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou } $t = new Template($this->config, 'core:loginuserpass.twig'); - $t->data['AuthState'] = $authStateId; if ($source instanceof UserPassOrgBase) { $t->data['username'] = $username; @@ -262,6 +261,7 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou } if ($source instanceof UserPassOrgBase) { + $t->data['formURL'] = Module::getModuleURL('core/loginuserpassorg', ['AuthState' => $authStateId]); if ($request->request->has($source->getAuthId() . '-username')) { $t->data['rememberUsernameChecked'] = true; } @@ -278,6 +278,7 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou $t->data['organizations'] = $organizations; } } else { + $t->data['formURL'] = Module::getModuleURL('core/loginuserpass', ['AuthState' => $authStateId]); $t->data['loginpage_links'] = $source->getLoginLinks(); } diff --git a/modules/core/templates/loginuserpass.twig b/modules/core/templates/loginuserpass.twig index 7df58fb576..64424e02c6 100644 --- a/modules/core/templates/loginuserpass.twig +++ b/modules/core/templates/loginuserpass.twig @@ -37,8 +37,7 @@

{{ 'A service has requested you to authenticate yourself. Please enter your username and password in the form below.'|trans }}

{% if not hideLanguageBar %} From 21d09f5d5777c5c9e95d8688b69036eaeb9a02ec Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 8 Jul 2024 13:58:00 +0200 Subject: [PATCH 129/532] Make Chrome stop complaining about missing autocomplete --- modules/core/templates/loginuserpass.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/templates/loginuserpass.twig b/modules/core/templates/loginuserpass.twig index 64424e02c6..f3304a4e16 100644 --- a/modules/core/templates/loginuserpass.twig +++ b/modules/core/templates/loginuserpass.twig @@ -40,7 +40,7 @@
- {% if rememberUsernameEnabled and not forceUsername -%} From f469bd27adebff59c11dc00f4bde2c46d42d9498 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 11 Jul 2024 13:16:04 +0200 Subject: [PATCH 130/532] Restore trusted urls set to null --- src/SimpleSAML/Utils/HTTP.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SimpleSAML/Utils/HTTP.php b/src/SimpleSAML/Utils/HTTP.php index 6aa91effdb..82ff4ea8d3 100644 --- a/src/SimpleSAML/Utils/HTTP.php +++ b/src/SimpleSAML/Utils/HTTP.php @@ -379,7 +379,7 @@ public function checkURLAllowed(string $url, array $trustedSites = null): string // get the white list of domains if ($trustedSites === null) { - $trustedSites = Configuration::getInstance()->getOptionalArray('trusted.url.domains', []); + $trustedSites = Configuration::getInstance()->getOptionalArray('trusted.url.domains', null); } // validates the URL's host is among those allowed From 7cb00541c9ed925bbfe4b86fef48334ef60c7b00 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Sat, 13 Jul 2024 09:36:08 +1000 Subject: [PATCH 131/532] i18n: allow a theme and module to work together (#2172) * i18n: allow a theme and module to work together * style --- src/SimpleSAML/Locale/Localization.php | 2 ++ src/SimpleSAML/Locale/Translate.php | 23 ++++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/SimpleSAML/Locale/Localization.php b/src/SimpleSAML/Locale/Localization.php index c99b40737d..037a301db8 100644 --- a/src/SimpleSAML/Locale/Localization.php +++ b/src/SimpleSAML/Locale/Localization.php @@ -17,6 +17,7 @@ use Gettext\{Translations, Translator, TranslatorFunctions}; use SimpleSAML\{Configuration, Logger}; use Symfony\Component\HttpFoundation\File\File; +use SimpleSAML\Locale\Translate; class Localization { @@ -137,6 +138,7 @@ public function addModuleDomain(string $module, string $localeDir = null, string public function defaultDomain(string $domain): self { $this->translator->defaultDomain($domain); + Translate::addDefaultDomain($domain); return $this; } diff --git a/src/SimpleSAML/Locale/Translate.php b/src/SimpleSAML/Locale/Translate.php index 1dd5c0bbbe..36716ba75a 100644 --- a/src/SimpleSAML/Locale/Translate.php +++ b/src/SimpleSAML/Locale/Translate.php @@ -11,7 +11,7 @@ namespace SimpleSAML\Locale; use Gettext\TranslatorFunctions; -use SimpleSAML\Configuration; +use SimpleSAML\{Configuration, Logger}; class Translate { @@ -22,6 +22,10 @@ class Translate */ private Language $language; + /** + * A theme and module may exist together as dual default translation domains + */ + private static array $defaultDomains = []; /** * Constructor @@ -58,6 +62,10 @@ public static function noop(string $tag): string return $tag; } + public static function addDefaultDomain(string $domain): void + { + array_push(self::$defaultDomains, $domain); + } /** * Translate a singular text. @@ -76,9 +84,18 @@ public static function translateSingularGettext(?string $original): string $text = TranslatorFunctions::getTranslator()->dgettext("core", $original); if ($text === $original) { $text = TranslatorFunctions::getTranslator()->dgettext("messages", $original); - // try attributes.po if ($text === $original) { - $text = TranslatorFunctions::getTranslator()->dgettext("", $original); + foreach (self::$defaultDomains as $d) { + $text = TranslatorFunctions::getTranslator()->dgettext($d, $original); + if ($text != $original) { + return $text; + } + } + + // try attributes.po + if ($text === $original) { + $text = TranslatorFunctions::getTranslator()->dgettext("", $original); + } } } } From e2d123d9ee75f9b6acc938eaaae0da49d126dd16 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Thu, 25 Jul 2024 17:20:31 +1000 Subject: [PATCH 132/532] allow phpstan/extension-installer (#2184) --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 3ce3986d4c..e02ffe1034 100644 --- a/composer.json +++ b/composer.json @@ -116,7 +116,8 @@ "composer/package-versions-deprecated": true, "simplesamlphp/composer-module-installer": true, "muglug/package-versions-56": true, - "dealerdirect/phpcodesniffer-composer-installer": true + "dealerdirect/phpcodesniffer-composer-installer": true, + "phpstan/extension-installer": true } }, "extra": { From ab1dafdbe9cb58daf838a5cb5c2cf5b69e8c2dc5 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 25 Jul 2024 20:21:15 +0200 Subject: [PATCH 133/532] Allow phpstan extension installer --- composer.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index e02ffe1034..3d2b2b214d 100644 --- a/composer.json +++ b/composer.json @@ -114,10 +114,10 @@ "config": { "allow-plugins": { "composer/package-versions-deprecated": true, - "simplesamlphp/composer-module-installer": true, - "muglug/package-versions-56": true, "dealerdirect/phpcodesniffer-composer-installer": true, - "phpstan/extension-installer": true + "muglug/package-versions-56": true, + "phpstan/extension-installer": true, + "simplesamlphp/composer-module-installer": true } }, "extra": { From 03cd86070c9ae513f3ece8e64e1f523e4bcd2b60 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Mon, 29 Jul 2024 09:24:14 +1000 Subject: [PATCH 134/532] In Module::resolveClass throw a different error for class not found (#2185) * In Module::resolveClass throw a different error for class not found This might help to debug when a class is renamed or moved to a new module. * move the class-exists check up a level * move that up a level for general use * less diff * phpcbf and accept the diff --- src/SimpleSAML/Module.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/SimpleSAML/Module.php b/src/SimpleSAML/Module.php index 9c9936b511..b92d60833b 100644 --- a/src/SimpleSAML/Module.php +++ b/src/SimpleSAML/Module.php @@ -455,6 +455,17 @@ public static function resolveClass(string $id, string $type, ?string $subclass $className = 'SimpleSAML\\Module\\' . $tmp[0] . $type . $tmp[1]; } + // Check if the class exists to give a more informative error + // for cases where modules might have been moved or renamed. + // Otherwise a not subclass of error would be thrown for a class + // that does not exist. + if (!class_exists($className, true)) { + throw new Exception( + 'Could not resolve \'' . $id . '\': The class \'' . $className + . '\' does not exist.', + ); + } + if ($subclass !== null && !is_subclass_of($className, $subclass)) { throw new Exception( 'Could not resolve \'' . $id . '\': The class \'' . $className From cd2e12f1b64d7f08a3b81803317068bea5ef1888 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Thu, 1 Aug 2024 10:47:26 +1000 Subject: [PATCH 135/532] Allow custom ErrorCodes subclasses through Login::handleLogin no test suite version (#2192) * Allow custom ErrorCodes subclasses through Login::handleLogin nt This is a version of https://github.com/simplesamlphp/simplesamlphp/pull/2181 without the test suite update. I found a few side issues while trying to get the test suite update going so thought I would split out the code code here for consideration. The goal is to allow a custom ErrorCodes subclasses to be used and have Login keep that association and be able to present information from those custom error codes on the web page. This is an update to https://github.com/simplesamlphp/simplesamlphp/pull/2181 This relates to and should resolve issue https://github.com/simplesamlphp/simplesamlphp/issues/2133 The ErrorCodes subclass name needs to be saved in the state information in order to set data['errorcodes'] to the custom error code class later in the login method. To restrict which classes can be used this way Login::registerErrorCodeClass() explicitly tracks each errorcodes subclass. This is automatic in the constructor of ErrorCodes but it does mean that any subclass will need to be instantiated at least once before use or an explicit call to Login::registerErrorCodeClass made. Although it is not strictly Module related I have put the resolveNonModuleClass() method in the module class for now to compliment the resolveClass() method. One needs the have the NonModule version to allow inline classes and the like to resolve as they contain the class name followed by a colon and number/offset information. That colon will make the resolveClass() assume we are dealing with a module:class specification. * update that access too * unroll resolveNonModuleClass into the single current call site * move some FQDNs to using use * try with the older 6.7.0 of linter. Make updaing that another PR --- .github/workflows/php.yml | 2 +- modules/core/src/Controller/Login.php | 54 +++++++++++++++++++++++- src/SimpleSAML/Error/Error.php | 5 ++- src/SimpleSAML/Error/ErrorCodes.php | 8 ++++ src/SimpleSAML/Module.php | 22 ++++++++++ tests/src/SimpleSAML/Error/ErrorTest.php | 2 +- 6 files changed, 89 insertions(+), 4 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index c5bf246974..62120b3322 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -23,7 +23,7 @@ jobs: fetch-depth: 0 - name: Lint Code Base - uses: super-linter/super-linter/slim@v6 + uses: super-linter/super-linter/slim@v6.7.0 env: # To report GitHub Actions status checks GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/modules/core/src/Controller/Login.php b/modules/core/src/Controller/Login.php index 0ecf8b1874..32a4f1be51 100644 --- a/modules/core/src/Controller/Login.php +++ b/modules/core/src/Controller/Login.php @@ -11,6 +11,7 @@ use Symfony\Component\HttpFoundation\Cookie; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use SimpleSAML\Error\ErrorCodes; use function array_key_exists; use function substr; @@ -38,6 +39,12 @@ class Login */ protected $authState = Auth\State::class; + /** + * These are all the subclass instances of ErrorCodes which have been created + */ + protected static array $registeredErrorCodeClasses = []; + + /** * Controller constructor. @@ -115,6 +122,21 @@ public function loginuserpass(Request $request): Response } + /** + * Called by the constructor in ErrorCode to register subclasses with us + * so we can track which subclasses are valid names in order to limit + * which classes we might recreate + * + * @para object ecc an instance of an ErrorCode or subclass + */ + public static function registerErrorCodeClass(ErrorCodes $ecc): void + { + if (is_subclass_of($ecc, ErrorCodes::class, false)) { + $className = get_class($ecc); + self::$registeredErrorCodeClasses[] = $className; + } + } + /** * This method handles the generic part for both loginuserpass and loginuserpassorg * @@ -138,10 +160,12 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou $errorCode = null; $errorParams = null; + $codeClass = ''; if (isset($state['error'])) { $errorCode = $state['error']['code']; $errorParams = $state['error']['params']; + $codeClass = $state['error']['codeclass']; } $cookies = []; @@ -218,9 +242,12 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou // Login failed. Extract error code and parameters, to display the error $errorCode = $e->getErrorCode(); $errorParams = $e->getParameters(); + $codeClass = get_class($e->getErrorCodes()); + $state['error'] = [ 'code' => $errorCode, 'params' => $errorParams, + 'codeclass' => $codeClass, ]; $authStateId = Auth\State::saveState($state, $source::STAGEID); } @@ -283,9 +310,34 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou } $t->data['errorcode'] = $errorCode; - $t->data['errorcodes'] = Error\ErrorCodes::getAllErrorCodeMessages(); + $t->data['errorcodes'] = ErrorCodes::getAllErrorCodeMessages(); $t->data['errorparams'] = $errorParams; + $className = $codeClass; + if ($className) { + if (in_array($className, self::$registeredErrorCodeClasses)) { + if (!class_exists($className)) { + throw new Exception("Could not resolve error class. no class named '$className'."); + } + + if (!is_subclass_of($className, ErrorCodes::class)) { + throw new Exception( + 'Could not resolve error class: The class \'' . $className + . '\' isn\'t a subclass of \'' . ErrorCodes::class . '\'.', + ); + } + + $obj = Module::createObject($className, ErrorCodes::class); + $t->data['errorcodes'] = $obj->getAllErrorCodeMessages(); + } else { + if ($className != ErrorCodes::class) { + throw new BuiltinException( + 'The desired error code class is not found or of the wrong type ' . $className, + ); + } + } + } + if (isset($state['SPMetadata'])) { $t->data['SPMetadata'] = $state['SPMetadata']; } else { diff --git a/src/SimpleSAML/Error/Error.php b/src/SimpleSAML/Error/Error.php index 71ca4eefdb..37f68d82e2 100644 --- a/src/SimpleSAML/Error/Error.php +++ b/src/SimpleSAML/Error/Error.php @@ -125,9 +125,12 @@ public function __construct( * * Extend this to use custom ErrorCodes instance (with custom error codes and their title / description tags). * + * This has to be public to allow Login to get an object + * containing custom error codes if they in use. + * * @return ErrorCodes */ - protected function getErrorCodes(): ErrorCodes + public function getErrorCodes(): ErrorCodes { return new ErrorCodes(); } diff --git a/src/SimpleSAML/Error/ErrorCodes.php b/src/SimpleSAML/Error/ErrorCodes.php index 4594b00721..c3bd92b6bb 100644 --- a/src/SimpleSAML/Error/ErrorCodes.php +++ b/src/SimpleSAML/Error/ErrorCodes.php @@ -5,6 +5,7 @@ namespace SimpleSAML\Error; use SimpleSAML\Locale\Translate; +use SimpleSAML\Module\core\Controller\Login; use function array_merge; @@ -15,6 +16,13 @@ */ class ErrorCodes { + public function __construct() + { + // Automatically register instances of subclasses with Login to allow + // custom ErrorCodes to work in a redirect environment + Login::registerErrorCodeClass($this); + } + // TODO PHPv8.1 - Consider moving to final consts for these default error codes to prevent overrides. public const ACSPARAMS = 'ACSPARAMS'; public const ARSPARAMS = 'ARSPARAMS'; diff --git a/src/SimpleSAML/Module.php b/src/SimpleSAML/Module.php index b92d60833b..4e2e5a3408 100644 --- a/src/SimpleSAML/Module.php +++ b/src/SimpleSAML/Module.php @@ -477,6 +477,28 @@ public static function resolveClass(string $id, string $type, ?string $subclass } + /** + * Create an object of a class returned by resolveNonModuleClass() or resolveClass(). + * + * @param string The classname. + * @param string|null $subclass The class should be a subclass of this class. Optional. + * + * @return the new object + */ + public static function createObject(string $className, ?string $subclass = null): object + { + $obj = new $className(); + if ($subclass) { + if (!is_subclass_of($obj, $subclass, false)) { + throw new Exception( + 'Could not instantiate \'' . $className . '\': The class \'' . $className + . '\' isn\'t a subclass of \'' . $subclass . '\'.', + ); + } + } + return $obj; + } + /** * Get absolute URL to a specified module resource. * diff --git a/tests/src/SimpleSAML/Error/ErrorTest.php b/tests/src/SimpleSAML/Error/ErrorTest.php index e0fa2b4ddc..a73dd77e19 100644 --- a/tests/src/SimpleSAML/Error/ErrorTest.php +++ b/tests/src/SimpleSAML/Error/ErrorTest.php @@ -112,7 +112,7 @@ public function testCanExtendWithCustomErrorCodes(): void $customError = new class ($customErrorCode) extends Error { - protected function getErrorCodes(): ErrorCodes + public function getErrorCodes(): ErrorCodes { return new class extends ErrorCodes { From 293792f23bfe519b3a470fa0551c790ecb129539 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 1 Aug 2024 08:32:01 +0200 Subject: [PATCH 136/532] Fix for super-linter --- .github/workflows/php.yml | 2 +- tools/linters/.eslintrc.js | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 62120b3322..c5bf246974 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -23,7 +23,7 @@ jobs: fetch-depth: 0 - name: Lint Code Base - uses: super-linter/super-linter/slim@v6.7.0 + uses: super-linter/super-linter/slim@v6 env: # To report GitHub Actions status checks GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/tools/linters/.eslintrc.js b/tools/linters/.eslintrc.js index e287e6294f..eeca409acb 100644 --- a/tools/linters/.eslintrc.js +++ b/tools/linters/.eslintrc.js @@ -1,8 +1,14 @@ module.exports = { - extends: ["json:recommended"], ignorePatterns: ["!/tools/linters/.eslintrc.yml", "!/tools/linters/.stylelintrc.json"], parserOptions: { ecmaVersion: 2015, sourceType: "module" - } + }, + overrides: [ + { + files: ["*.json"], + extends: ["plugin:jsonc/recommended-with-json"], + parser: "jsonc-eslint-parser", + } + ] }; From fda12f7cb0b1a813b44267099a385fa9248204ae Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 1 Aug 2024 20:39:22 +0200 Subject: [PATCH 137/532] Bump authorize module --- .github/build/full.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/build/full.json b/.github/build/full.json index 30b823742a..f17b3f47ea 100644 --- a/.github/build/full.json +++ b/.github/build/full.json @@ -2,7 +2,7 @@ "modules": { "authorize": { "repository": "simplesamlphp/simplesamlphp-module-authorize", - "version": "~1.4.0" + "version": "~1.4.1" }, "consent": { "repository": "simplesamlphp/simplesamlphp-module-consent", From b5914b79b21cbbcf4a52fbfeb51643f27ef0746f Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Mon, 5 Aug 2024 12:32:02 +1000 Subject: [PATCH 138/532] Updated CI items to allow codecoverage and CI to complete fully. (#2193) * NOMERGE: testing ci system with useless code change * disable the ClearDiscoChoicesReturnToDisallowedUrlRejected to see if coverage is generated * add some info about coverage in comments * Update config in LogoutTest to allow CI to complete again After disabling the disco test, more of the suite could complete and this test was found to be failing. A poke around commits found the test started failing on commit cf below. This update to the configuration for that test allows it to function again. 147592cf - fail 532d9fba - ok * and style again naturally * strip comments, lint nightmare * revert that initial useless change made only to trigger CI --- tests/modules/core/src/Controller/LoginTest.php | 2 +- tests/modules/core/src/Controller/LogoutTest.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/modules/core/src/Controller/LoginTest.php b/tests/modules/core/src/Controller/LoginTest.php index 26eb7a4b84..d1698acfd7 100644 --- a/tests/modules/core/src/Controller/LoginTest.php +++ b/tests/modules/core/src/Controller/LoginTest.php @@ -67,7 +67,7 @@ public function testWelcome(): void /** */ - public function testClearDiscoChoicesReturnToDisallowedUrlRejected(): void + public function disabledTestClearDiscoChoicesReturnToDisallowedUrlRejected(): void { $request = Request::create( '/cleardiscochoices', diff --git a/tests/modules/core/src/Controller/LogoutTest.php b/tests/modules/core/src/Controller/LogoutTest.php index 0e97f73334..c1657486f2 100644 --- a/tests/modules/core/src/Controller/LogoutTest.php +++ b/tests/modules/core/src/Controller/LogoutTest.php @@ -40,6 +40,7 @@ protected function setUp(): void 'baseurlpath' => 'https://example.org/simplesaml', 'module.enable' => ['exampleauth' => true], 'enable.saml20-idp' => true, + 'trusted.url.domains' => [], ], '[ARRAY]', 'simplesaml', From 8672af8407d734c2e8a3dbe04d269b710199bb70 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 5 Aug 2024 14:22:10 +0200 Subject: [PATCH 139/532] Restore ClearDiscoChoicesReturnToDisallowedUrlRejected test --- tests/modules/core/src/Controller/LoginTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/modules/core/src/Controller/LoginTest.php b/tests/modules/core/src/Controller/LoginTest.php index d1698acfd7..56f6dde1f4 100644 --- a/tests/modules/core/src/Controller/LoginTest.php +++ b/tests/modules/core/src/Controller/LoginTest.php @@ -41,6 +41,7 @@ protected function setUp(): void [ 'baseurlpath' => 'https://example.org/simplesaml', 'module.enable' => ['exampleauth' => true], + 'trusted.url.domains' => [], ], '[ARRAY]', 'simplesaml', @@ -67,7 +68,7 @@ public function testWelcome(): void /** */ - public function disabledTestClearDiscoChoicesReturnToDisallowedUrlRejected(): void + public function testClearDiscoChoicesReturnToDisallowedUrlRejected(): void { $request = Request::create( '/cleardiscochoices', From 3d2867a564a64079c134665be573d1f61ddbac3d Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 6 Aug 2024 00:34:57 +0200 Subject: [PATCH 140/532] Bump authorize module --- .github/build/full.json | 2 +- docs/simplesamlphp-changelog.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/build/full.json b/.github/build/full.json index f17b3f47ea..642612812b 100644 --- a/.github/build/full.json +++ b/.github/build/full.json @@ -2,7 +2,7 @@ "modules": { "authorize": { "repository": "simplesamlphp/simplesamlphp-module-authorize", - "version": "~1.4.1" + "version": "~1.5.0" }, "consent": { "repository": "simplesamlphp/simplesamlphp-module-consent", diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index cb16116b49..56b56b8cd8 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -16,6 +16,10 @@ Released TBD * Session ID's are now hashed when stored in a database (#2106) * Improved HTML 5 compatibility (#2162) +`authorize` + +* Add feature to allow a user to reauthenticate with a different account (simplesamlphp/simplesamlphp-module-authorize#17) (v1.5.0) + `consent` * Update Luxembourgish translations (v1.4.0) From 093421df32ce6b07abc6204cf4b444f78ec55c0b Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 7 Aug 2024 14:46:31 +0200 Subject: [PATCH 141/532] Bump authorize-module --- .github/build/full.json | 2 +- docs/simplesamlphp-changelog.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/build/full.json b/.github/build/full.json index 642612812b..01e660dbc2 100644 --- a/.github/build/full.json +++ b/.github/build/full.json @@ -2,7 +2,7 @@ "modules": { "authorize": { "repository": "simplesamlphp/simplesamlphp-module-authorize", - "version": "~1.5.0" + "version": "~1.6.0" }, "consent": { "repository": "simplesamlphp/simplesamlphp-module-consent", diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 56b56b8cd8..ff6cb300d0 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -18,7 +18,8 @@ Released TBD `authorize` -* Add feature to allow a user to reauthenticate with a different account (simplesamlphp/simplesamlphp-module-authorize#17) (v1.5.0) +* Feature: allow a user to reauthenticate with a different account (simplesamlphp/simplesamlphp-module-authorize#17) (v1.5.0) +* Feature: show user what account he's using when authorization fails (simplesamlphp/simplesamlphp-module-authorize#20) (v1.6.0) `consent` From 0a9183650f6826bbf9d3516701130fdb9b980d7b Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 10 Aug 2024 09:45:19 +0200 Subject: [PATCH 142/532] Bump dependencies --- composer.json | 2 +- composer.lock | 1145 ++++++++++++++++++++++++++++++++++--------------- 2 files changed, 794 insertions(+), 353 deletions(-) diff --git a/composer.json b/composer.json index 3d2b2b214d..23287cb62e 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ "simplesamlphp/assert": "^1.1", "simplesamlphp/composer-module-installer": "^1.3", "simplesamlphp/saml2": "^4.6", - "simplesamlphp/simplesamlphp-assets-base": "~2.1.5", + "simplesamlphp/simplesamlphp-assets-base": "~2.2.6", "simplesamlphp/xml-security": "^1.7", "symfony/cache": "^6.4", "symfony/config": "^6.4", diff --git a/composer.lock b/composer.lock index f9fa99a427..8cf7cc3432 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8952ca20dc3522c35373953f9571f295", + "content-hash": "e2b6aa3f3b241785f12fc5903c3716c4", "packages": [ { "name": "gettext/gettext", - "version": "v5.7.0", + "version": "v5.7.1", "source": { "type": "git", "url": "https://github.com/php-gettext/Gettext.git", - "reference": "8657e580747bb3baacccdcebe69cac094661e404" + "reference": "a9f89e0cc9d9a67b422632b594b5f1afb16eccfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/8657e580747bb3baacccdcebe69cac094661e404", - "reference": "8657e580747bb3baacccdcebe69cac094661e404", + "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/a9f89e0cc9d9a67b422632b594b5f1afb16eccfc", + "reference": "a9f89e0cc9d9a67b422632b594b5f1afb16eccfc", "shasum": "" }, "require": { @@ -62,7 +62,7 @@ "support": { "email": "oom@oscarotero.com", "issues": "https://github.com/php-gettext/Gettext/issues", - "source": "https://github.com/php-gettext/Gettext/tree/v5.7.0" + "source": "https://github.com/php-gettext/Gettext/tree/v5.7.1" }, "funding": [ { @@ -78,7 +78,7 @@ "type": "patreon" } ], - "time": "2022-07-27T19:54:55+00:00" + "time": "2024-07-24T22:05:18+00:00" }, { "name": "gettext/languages", @@ -228,6 +228,90 @@ ], "time": "2023-11-06T15:42:03+00:00" }, + { + "name": "league/uri-interfaces", + "version": "7.4.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "8d43ef5c841032c87e2de015972c06f3865ef718" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/8d43ef5c841032c87e2de015972c06f3865ef718", + "reference": "8d43ef5c841032c87e2de015972c06f3865ef718", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-factory": "^1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common interfaces and classes for URI representation and interaction", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.4.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2024-03-23T07:42:40+00:00" + }, { "name": "phpmailer/phpmailer", "version": "v6.9.1", @@ -461,6 +545,114 @@ }, "time": "2019-01-08T18:20:26+00:00" }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, { "name": "psr/log", "version": "3.0.0", @@ -555,16 +747,16 @@ }, { "name": "simplesamlphp/assert", - "version": "v1.1.7", + "version": "v1.2.1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/assert.git", - "reference": "c03e67bacb298aae58de4535491b4aec9246611e" + "reference": "bc80f10858179af2516b48643f3ec43ae7a36937" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/c03e67bacb298aae58de4535491b4aec9246611e", - "reference": "c03e67bacb298aae58de4535491b4aec9246611e", + "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/bc80f10858179af2516b48643f3ec43ae7a36937", + "reference": "bc80f10858179af2516b48643f3ec43ae7a36937", "shasum": "" }, "require": { @@ -572,11 +764,12 @@ "ext-filter": "*", "ext-pcre": "*", "ext-spl": "*", + "league/uri-interfaces": "^7.4", "php": "^8.1", "webmozart/assert": "^1.11" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "^1.5.5" + "simplesamlphp/simplesamlphp-test-framework": "^1.7" }, "type": "library", "extra": { @@ -606,9 +799,9 @@ "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments", "support": { "issues": "https://github.com/simplesamlphp/assert/issues", - "source": "https://github.com/simplesamlphp/assert/tree/v1.1.7" + "source": "https://github.com/simplesamlphp/assert/tree/v1.2.1" }, - "time": "2024-05-09T16:03:57+00:00" + "time": "2024-07-23T14:28:59+00:00" }, { "name": "simplesamlphp/composer-module-installer", @@ -655,16 +848,16 @@ }, { "name": "simplesamlphp/saml2", - "version": "v4.6.11", + "version": "v4.6.12", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "1b5d48753c78d02e88667068e633531c233141fb" + "reference": "9545abd0d9d48388f2fa00469c5c1e0294f0303e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/1b5d48753c78d02e88667068e633531c233141fb", - "reference": "1b5d48753c78d02e88667068e633531c233141fb", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/9545abd0d9d48388f2fa00469c5c1e0294f0303e", + "reference": "9545abd0d9d48388f2fa00469c5c1e0294f0303e", "shasum": "" }, "require": { @@ -707,27 +900,27 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v4.6.11" + "source": "https://github.com/simplesamlphp/saml2/tree/v4.6.12" }, - "time": "2024-01-25T19:39:46+00:00" + "time": "2024-04-25T14:10:08+00:00" }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.1.12", + "version": "v2.2.6", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "bde7ad38a534776a9fb2943d7d1a9880c738c925" + "reference": "6364ca58d3b36dee02f99ca22f467924837bf33f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/bde7ad38a534776a9fb2943d7d1a9880c738c925", - "reference": "bde7ad38a534776a9fb2943d7d1a9880c738c925", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/6364ca58d3b36dee02f99ca22f467924837bf33f", + "reference": "6364ca58d3b36dee02f99ca22f467924837bf33f", "shasum": "" }, "require": { - "php": ">=7.4 || ^8.0", - "simplesamlphp/composer-module-installer": "^1.3.2" + "php": "^8.1", + "simplesamlphp/composer-module-installer": "^1.3.4" }, "type": "simplesamlphp-module", "notification-url": "https://packagist.org/downloads/", @@ -743,22 +936,22 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.1.12" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.2.6" }, - "time": "2024-02-19T15:32:24+00:00" + "time": "2024-07-28T01:07:13+00:00" }, { "name": "simplesamlphp/xml-common", - "version": "v1.16.1", + "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "a3c4c548ebd9783c3833c13ea7c01b010b0a1239" + "reference": "d06e0c6b4f42048181aec575211ff0ac171b0ec1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/a3c4c548ebd9783c3833c13ea7c01b010b0a1239", - "reference": "a3c4c548ebd9783c3833c13ea7c01b010b0a1239", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/d06e0c6b4f42048181aec575211ff0ac171b0ec1", + "reference": "d06e0c6b4f42048181aec575211ff0ac171b0ec1", "shasum": "" }, "require": { @@ -769,10 +962,10 @@ "ext-spl": "*", "ext-xmlreader": "*", "php": "^8.1", - "simplesamlphp/assert": "^1.1" + "simplesamlphp/assert": "^1.2" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "^1.6" + "simplesamlphp/simplesamlphp-test-framework": "^1.7" }, "type": "project", "autoload": { @@ -804,20 +997,20 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2024-03-19T22:04:20+00:00" + "time": "2024-07-25T08:25:58+00:00" }, { "name": "simplesamlphp/xml-security", - "version": "v1.7.3", + "version": "v1.8.5", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-security.git", - "reference": "a4ac02019379ea41925bcf690f3d2a6b6e0c14a1" + "reference": "a2ac09c77c68833b3530c3c49ff0e248f0f5b077" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/a4ac02019379ea41925bcf690f3d2a6b6e0c14a1", - "reference": "a4ac02019379ea41925bcf690f3d2a6b6e0c14a1", + "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/a2ac09c77c68833b3530c3c49ff0e248f0f5b077", + "reference": "a2ac09c77c68833b3530c3c49ff0e248f0f5b077", "shasum": "" }, "require": { @@ -866,22 +1059,22 @@ ], "support": { "issues": "https://github.com/simplesamlphp/xml-security/issues", - "source": "https://github.com/simplesamlphp/xml-security/tree/v1.7.3" + "source": "https://github.com/simplesamlphp/xml-security/tree/v1.8.5" }, - "time": "2024-05-10T10:02:40+00:00" + "time": "2024-07-30T09:38:52+00:00" }, { "name": "symfony/cache", - "version": "v6.4.4", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "0ef36534694c572ff526d91c7181f3edede176e7" + "reference": "6702d2d777260e6ff3451fee2d7d78ab5f715cdc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/0ef36534694c572ff526d91c7181f3edede176e7", - "reference": "0ef36534694c572ff526d91c7181f3edede176e7", + "url": "https://api.github.com/repos/symfony/cache/zipball/6702d2d777260e6ff3451fee2d7d78ab5f715cdc", + "reference": "6702d2d777260e6ff3451fee2d7d78ab5f715cdc", "shasum": "" }, "require": { @@ -948,7 +1141,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.4" + "source": "https://github.com/symfony/cache/tree/v6.4.10" }, "funding": [ { @@ -964,20 +1157,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-07-17T06:05:49+00:00" }, { "name": "symfony/cache-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "1d74b127da04ffa87aa940abe15446fa89653778" + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1d74b127da04ffa87aa940abe15446fa89653778", - "reference": "1d74b127da04ffa87aa940abe15446fa89653778", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", "shasum": "" }, "require": { @@ -987,7 +1180,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -1024,7 +1217,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.0" }, "funding": [ { @@ -1040,20 +1233,20 @@ "type": "tidelift" } ], - "time": "2023-09-25T12:52:38+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/config", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047" + "reference": "12e7e52515ce37191b193cf3365903c4f3951e35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/6ea4affc27f2086c9d16b92ab5429ce1e3c38047", - "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047", + "url": "https://api.github.com/repos/symfony/config/zipball/12e7e52515ce37191b193cf3365903c4f3951e35", + "reference": "12e7e52515ce37191b193cf3365903c4f3951e35", "shasum": "" }, "require": { @@ -1099,7 +1292,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.4" + "source": "https://github.com/symfony/config/tree/v6.4.8" }, "funding": [ { @@ -1115,20 +1308,20 @@ "type": "tidelift" } ], - "time": "2024-02-26T07:52:26+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/console", - "version": "v6.4.4", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0d9e4eb5ad413075624378f474c4167ea202de78" + "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0d9e4eb5ad413075624378f474c4167ea202de78", - "reference": "0d9e4eb5ad413075624378f474c4167ea202de78", + "url": "https://api.github.com/repos/symfony/console/zipball/504974cbe43d05f83b201d6498c206f16fc0cdbc", + "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc", "shasum": "" }, "require": { @@ -1193,7 +1386,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.4" + "source": "https://github.com/symfony/console/tree/v6.4.10" }, "funding": [ { @@ -1209,20 +1402,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-07-26T12:30:32+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.4", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "6236e5e843cb763e9d0f74245678b994afea5363" + "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6236e5e843cb763e9d0f74245678b994afea5363", - "reference": "6236e5e843cb763e9d0f74245678b994afea5363", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5caf9c5f6085f13b27d70a236b776c07e4a1c3eb", + "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb", "shasum": "" }, "require": { @@ -1274,7 +1467,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.4" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.10" }, "funding": [ { @@ -1290,20 +1483,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-07-26T07:32:07+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { @@ -1312,7 +1505,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -1341,7 +1534,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -1357,26 +1550,26 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.4", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c725219bdf2afc59423c32793d5019d2a904e13a" + "reference": "432bb369952795c61ca1def65e078c4a80dad13c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c725219bdf2afc59423c32793d5019d2a904e13a", - "reference": "c725219bdf2afc59423c32793d5019d2a904e13a", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/432bb369952795c61ca1def65e078c4a80dad13c", + "reference": "432bb369952795c61ca1def65e078c4a80dad13c", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/var-dumper": "^6.4|^7.0" }, "conflict": { "symfony/deprecation-contracts": "<2.5", @@ -1385,7 +1578,7 @@ "require-dev": { "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^5.4|^6.0|^7.0" + "symfony/serializer": "^6.4|^7.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -1416,7 +1609,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.4" + "source": "https://github.com/symfony/error-handler/tree/v7.1.3" }, "funding": [ { @@ -1432,28 +1625,28 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-07-26T13:02:51+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.3", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef" + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae9d3a6f3003a6caf56acd7466d8d52378d44fef", - "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4", + "symfony/dependency-injection": "<6.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -1462,13 +1655,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/stopwatch": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -1496,7 +1689,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" }, "funding": [ { @@ -1512,20 +1705,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "shasum": "" }, "require": { @@ -1535,7 +1728,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -1572,7 +1765,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" }, "funding": [ { @@ -1588,20 +1781,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/filesystem", - "version": "v6.4.3", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" + "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", + "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", "shasum": "" }, "require": { @@ -1609,6 +1802,9 @@ "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, + "require-dev": { + "symfony/process": "^5.4|^6.4|^7.0" + }, "type": "library", "autoload": { "psr-4": { @@ -1635,7 +1831,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.3" + "source": "https://github.com/symfony/filesystem/tree/v6.4.9" }, "funding": [ { @@ -1651,20 +1847,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-06-28T09:49:33+00:00" }, { "name": "symfony/finder", - "version": "v6.4.0", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + "reference": "af29198d87112bebdd397bd7735fbd115997824c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "url": "https://api.github.com/repos/symfony/finder/zipball/af29198d87112bebdd397bd7735fbd115997824c", + "reference": "af29198d87112bebdd397bd7735fbd115997824c", "shasum": "" }, "require": { @@ -1699,7 +1895,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.0" + "source": "https://github.com/symfony/finder/tree/v6.4.10" }, "funding": [ { @@ -1715,20 +1911,20 @@ "type": "tidelift" } ], - "time": "2023-10-31T17:30:12+00:00" + "time": "2024-07-24T07:06:38+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.4.4", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "c76d3881596860ead95f5444a5ce4414447f0067" + "reference": "6cbdb0cc3ddbb63499262cd3036882b08ee2690b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c76d3881596860ead95f5444a5ce4414447f0067", - "reference": "c76d3881596860ead95f5444a5ce4414447f0067", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/6cbdb0cc3ddbb63499262cd3036882b08ee2690b", + "reference": "6cbdb0cc3ddbb63499262cd3036882b08ee2690b", "shasum": "" }, "require": { @@ -1847,7 +2043,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.4.4" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.10" }, "funding": [ { @@ -1863,20 +2059,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T22:50:59+00:00" + "time": "2024-07-26T13:24:20+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.4", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304" + "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ebc713bc6e6f4b53f46539fc158be85dfcd77304", - "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/117f1f20a7ade7bcea28b861fb79160a21a1e37b", + "reference": "117f1f20a7ade7bcea28b861fb79160a21a1e37b", "shasum": "" }, "require": { @@ -1924,7 +2120,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.4" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.10" }, "funding": [ { @@ -1940,20 +2136,20 @@ "type": "tidelift" } ], - "time": "2024-02-08T15:01:18+00:00" + "time": "2024-07-26T12:36:27+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.5", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f6947cb939d8efee137797382cb4db1af653ef75" + "reference": "147e0daf618d7575b5007055340d09aece5cf068" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f6947cb939d8efee137797382cb4db1af653ef75", - "reference": "f6947cb939d8efee137797382cb4db1af653ef75", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/147e0daf618d7575b5007055340d09aece5cf068", + "reference": "147e0daf618d7575b5007055340d09aece5cf068", "shasum": "" }, "require": { @@ -2008,6 +2204,7 @@ "symfony/translation-contracts": "^2.5|^3", "symfony/uid": "^5.4|^6.0|^7.0", "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.4|^7.0", "symfony/var-exporter": "^6.2|^7.0", "twig/twig": "^2.13|^3.0.4" }, @@ -2037,7 +2234,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.5" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.10" }, "funding": [ { @@ -2053,20 +2250,20 @@ "type": "tidelift" } ], - "time": "2024-03-04T21:00:47+00:00" + "time": "2024-07-26T14:52:04+00:00" }, { "name": "symfony/intl", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "2628ded562ca132ed7cdea72f5ec6aaf65d94414" + "reference": "50265cdcf5a44bec3fcf487b5d0015aece91d1eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/2628ded562ca132ed7cdea72f5ec6aaf65d94414", - "reference": "2628ded562ca132ed7cdea72f5ec6aaf65d94414", + "url": "https://api.github.com/repos/symfony/intl/zipball/50265cdcf5a44bec3fcf487b5d0015aece91d1eb", + "reference": "50265cdcf5a44bec3fcf487b5d0015aece91d1eb", "shasum": "" }, "require": { @@ -2083,7 +2280,8 @@ "Symfony\\Component\\Intl\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/Resources/data/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2119,7 +2317,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.4.3" + "source": "https://github.com/symfony/intl/tree/v6.4.8" }, "funding": [ { @@ -2135,20 +2333,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/password-hasher", - "version": "v6.4.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "73afaed1d87f6127dcd71bc88e9a16fd9325cf1c" + "reference": "90ebbe946e5d64a5fad9ac9427e335045cf2bd31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/73afaed1d87f6127dcd71bc88e9a16fd9325cf1c", - "reference": "73afaed1d87f6127dcd71bc88e9a16fd9325cf1c", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/90ebbe946e5d64a5fad9ac9427e335045cf2bd31", + "reference": "90ebbe946e5d64a5fad9ac9427e335045cf2bd31", "shasum": "" }, "require": { @@ -2191,7 +2389,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v6.4.7" + "source": "https://github.com/symfony/password-hasher/tree/v6.4.8" }, "funding": [ { @@ -2207,20 +2405,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", "shasum": "" }, "require": { @@ -2270,7 +2468,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" }, "funding": [ { @@ -2286,20 +2484,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", "shasum": "" }, "require": { @@ -2348,7 +2546,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" }, "funding": [ { @@ -2364,20 +2562,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1" + "reference": "e76343c631b453088e2260ac41dfebe21954de81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/07094a28851a49107f3ab4f9120ca2975a64b6e1", - "reference": "07094a28851a49107f3ab4f9120ca2975a64b6e1", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e76343c631b453088e2260ac41dfebe21954de81", + "reference": "e76343c631b453088e2260ac41dfebe21954de81", "shasum": "" }, "require": { @@ -2432,7 +2630,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.30.0" }, "funding": [ { @@ -2448,20 +2646,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:12:16+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", "shasum": "" }, "require": { @@ -2513,7 +2711,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" }, "funding": [ { @@ -2529,20 +2727,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "shasum": "" }, "require": { @@ -2593,7 +2791,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" }, "funding": [ { @@ -2609,20 +2807,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", "shasum": "" }, "require": { @@ -2673,7 +2871,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" }, "funding": [ { @@ -2689,25 +2887,100 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", + "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-php80": "^1.14" + "php": ">=7.1" }, "type": "library", "extra": { @@ -2750,7 +3023,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" }, "funding": [ { @@ -2766,20 +3039,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:35:24+00:00" }, { "name": "symfony/routing", - "version": "v6.4.5", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4" + "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/7fe30068e207d9c31c0138501ab40358eb2d49a4", - "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4", + "url": "https://api.github.com/repos/symfony/routing/zipball/aad19fe10753ba842f0d653a8db819c4b3affa87", + "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87", "shasum": "" }, "require": { @@ -2833,7 +3106,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.5" + "source": "https://github.com/symfony/routing/tree/v6.4.10" }, "funding": [ { @@ -2849,25 +3122,26 @@ "type": "tidelift" } ], - "time": "2024-02-27T12:33:30+00:00" + "time": "2024-07-15T09:26:24+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.4.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -2875,7 +3149,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -2915,7 +3189,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -2931,24 +3205,24 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/string", - "version": "v6.4.4", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9" + "reference": "ea272a882be7f20cad58d5d78c215001617b7f07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", - "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", + "url": "https://api.github.com/repos/symfony/string/zipball/ea272a882be7f20cad58d5d78c215001617b7f07", + "reference": "ea272a882be7f20cad58d5d78c215001617b7f07", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", @@ -2958,11 +3232,12 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "symfony/var-exporter": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -3001,7 +3276,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.4" + "source": "https://github.com/symfony/string/tree/v7.1.3" }, "funding": [ { @@ -3017,20 +3292,20 @@ "type": "tidelift" } ], - "time": "2024-02-01T13:16:41+00:00" + "time": "2024-07-22T10:25:37+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.4.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "06450585bf65e978026bda220cdebca3f867fde7" + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/06450585bf65e978026bda220cdebca3f867fde7", - "reference": "06450585bf65e978026bda220cdebca3f867fde7", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "shasum": "" }, "require": { @@ -3039,7 +3314,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -3079,7 +3354,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -3095,20 +3370,20 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/twig-bridge", - "version": "v6.4.4", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "256f330026d1c97187b61aa5c29e529499877f13" + "reference": "9bcb26445b9d4ef1087c389234bf33fb00e10ea6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/256f330026d1c97187b61aa5c29e529499877f13", - "reference": "256f330026d1c97187b61aa5c29e529499877f13", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/9bcb26445b9d4ef1087c389234bf33fb00e10ea6", + "reference": "9bcb26445b9d4ef1087c389234bf33fb00e10ea6", "shasum": "" }, "require": { @@ -3188,7 +3463,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.4" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.9" }, "funding": [ { @@ -3204,38 +3479,36 @@ "type": "tidelift" } ], - "time": "2024-02-15T11:26:02+00:00" + "time": "2024-06-21T16:04:15+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.4", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "b439823f04c98b84d4366c79507e9da6230944b1" + "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b439823f04c98b84d4366c79507e9da6230944b1", - "reference": "b439823f04c98b84d4366c79507e9da6230944b1", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/86af4617cca75a6e28598f49ae0690f3b9d4591f", + "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.0.4" }, "bin": [ "Resources/bin/var-dump-server" @@ -3273,7 +3546,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.4" + "source": "https://github.com/symfony/var-dumper/tree/v7.1.3" }, "funding": [ { @@ -3289,20 +3562,20 @@ "type": "tidelift" } ], - "time": "2024-02-15T11:23:52+00:00" + "time": "2024-07-26T12:41:01+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.4", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b" + "reference": "f9a060622e0d93777b7f8687ec4860191e16802e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0bd342e24aef49fc82a21bd4eedd3e665d177e5b", - "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9a060622e0d93777b7f8687ec4860191e16802e", + "reference": "f9a060622e0d93777b7f8687ec4860191e16802e", "shasum": "" }, "require": { @@ -3310,6 +3583,8 @@ "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "type": "library", @@ -3348,7 +3623,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.4" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.9" }, "funding": [ { @@ -3364,20 +3639,20 @@ "type": "tidelift" } ], - "time": "2024-02-26T08:37:45+00:00" + "time": "2024-06-24T15:53:56+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "d75715985f0f94f978e3a8fa42533e10db921b90" + "reference": "52903de178d542850f6f341ba92995d3d63e60c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/d75715985f0f94f978e3a8fa42533e10db921b90", - "reference": "d75715985f0f94f978e3a8fa42533e10db921b90", + "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", + "reference": "52903de178d542850f6f341ba92995d3d63e60c9", "shasum": "" }, "require": { @@ -3420,7 +3695,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.3" + "source": "https://github.com/symfony/yaml/tree/v6.4.8" }, "funding": [ { @@ -3436,26 +3711,26 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "twig/intl-extra", - "version": "v3.8.0", + "version": "v3.11.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "7b3db67c700735f473a265a97e1adaeba3e6ca0c" + "reference": "e9cadd61342e71e45b2f4f0558122433fd7e4566" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/7b3db67c700735f473a265a97e1adaeba3e6ca0c", - "reference": "7b3db67c700735f473a265a97e1adaeba3e6ca0c", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/e9cadd61342e71e45b2f4f0558122433fd7e4566", + "reference": "e9cadd61342e71e45b2f4f0558122433fd7e4566", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/intl": "^5.4|^6.0|^7.0", - "twig/twig": "^3.0" + "symfony/intl": "^5.4|^6.4|^7.0", + "twig/twig": "^3.10" }, "require-dev": { "symfony/phpunit-bridge": "^6.4|^7.0" @@ -3488,7 +3763,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.8.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.11.0" }, "funding": [ { @@ -3500,34 +3775,42 @@ "type": "tidelift" } ], - "time": "2023-11-21T17:27:48+00:00" + "time": "2024-06-21T06:25:01+00:00" }, { "name": "twig/twig", - "version": "v3.8.0", + "version": "v3.11.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" + "reference": "e80fb8ebba85c7341a97a9ebf825d7fd4b77708d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/e80fb8ebba85c7341a97a9ebf825d7fd4b77708d", + "reference": "e80fb8ebba85c7341a97a9ebf825d7fd4b77708d", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php80": "^1.22" + "symfony/polyfill-php80": "^1.22", + "symfony/polyfill-php81": "^1.29" }, "require-dev": { "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, "type": "library", "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], "psr-4": { "Twig\\": "src/" } @@ -3560,7 +3843,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.8.0" + "source": "https://github.com/twigphp/Twig/tree/v3.11.0" }, "funding": [ { @@ -3572,7 +3855,7 @@ "type": "tidelift" } ], - "time": "2023-11-21T18:54:41+00:00" + "time": "2024-08-08T16:15:16+00:00" }, { "name": "webmozart/assert", @@ -3824,16 +4107,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "shasum": "" }, "require": { @@ -3841,11 +4124,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -3871,7 +4155,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" }, "funding": [ { @@ -3879,7 +4163,7 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-06-12T14:39:25+00:00" }, { "name": "nikic/php-parser", @@ -4055,18 +4339,62 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "phpstan/extension-installer", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "f6b87faf9fc7978eab2f7919a8760bc9f58f9203" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f6b87faf9fc7978eab2f7919a8760bc9f58f9203", + "reference": "f6b87faf9fc7978eab2f7919a8760bc9f58f9203", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.4.1" + }, + "time": "2024-06-10T08:20:49+00:00" + }, { "name": "phpstan/phpdoc-parser", - "version": "1.27.0", + "version": "1.29.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757" + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/86e4d5a4b036f8f0be1464522f4c6b584c452757", - "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", "shasum": "" }, "require": { @@ -4098,22 +4426,130 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.27.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" }, - "time": "2024-03-21T13:14:53+00:00" + "time": "2024-05-31T08:52:43+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.11.10", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "640410b32995914bde3eed26fa89552f9c2c082f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/640410b32995914bde3eed26fa89552f9c2c082f", + "reference": "640410b32995914bde3eed26fa89552f9c2c082f", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2024-08-08T09:02:50+00:00" + }, + { + "name": "phpstan/phpstan-mockery", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-mockery.git", + "reference": "88ae85931768efd3aaf3cce4cb9cb54c4d157d03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-mockery/zipball/88ae85931768efd3aaf3cce4cb9cb54c4d157d03", + "reference": "88ae85931768efd3aaf3cce4cb9cb54c4d157d03", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.10" + }, + "require-dev": { + "mockery/mockery": "^1.2.4", + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan Mockery extension", + "support": { + "issues": "https://github.com/phpstan/phpstan-mockery/issues", + "source": "https://github.com/phpstan/phpstan-mockery/tree/1.1.2" + }, + "time": "2024-01-10T13:50:05+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.14", + "version": "10.1.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", - "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", "shasum": "" }, "require": { @@ -4170,7 +4606,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" }, "funding": [ { @@ -4178,7 +4614,7 @@ "type": "github" } ], - "time": "2024-03-12T15:33:41+00:00" + "time": "2024-06-29T08:25:15+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4425,16 +4861,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.15", + "version": "10.5.29", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "86376e05e8745ed81d88232ff92fee868247b07b" + "reference": "8e9e80872b4e8064401788ee8a32d40b4455318f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86376e05e8745ed81d88232ff92fee868247b07b", - "reference": "86376e05e8745ed81d88232ff92fee868247b07b", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8e9e80872b4e8064401788ee8a32d40b4455318f", + "reference": "8e9e80872b4e8064401788ee8a32d40b4455318f", "shasum": "" }, "require": { @@ -4444,26 +4880,26 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.5", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-invoker": "^4.0", - "phpunit/php-text-template": "^3.0", - "phpunit/php-timer": "^6.0", - "sebastian/cli-parser": "^2.0", - "sebastian/code-unit": "^2.0", - "sebastian/comparator": "^5.0", - "sebastian/diff": "^5.0", - "sebastian/environment": "^6.0", - "sebastian/exporter": "^5.1", - "sebastian/global-state": "^6.0.1", - "sebastian/object-enumerator": "^5.0", - "sebastian/recursion-context": "^5.0", - "sebastian/type": "^4.0", - "sebastian/version": "^4.0" + "phpunit/php-code-coverage": "^10.1.15", + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-invoker": "^4.0.0", + "phpunit/php-text-template": "^3.0.1", + "phpunit/php-timer": "^6.0.0", + "sebastian/cli-parser": "^2.0.1", + "sebastian/code-unit": "^2.0.0", + "sebastian/comparator": "^5.0.1", + "sebastian/diff": "^5.1.1", + "sebastian/environment": "^6.1.0", + "sebastian/exporter": "^5.1.2", + "sebastian/global-state": "^6.0.2", + "sebastian/object-enumerator": "^5.0.0", + "sebastian/recursion-context": "^5.0.0", + "sebastian/type": "^4.0.0", + "sebastian/version": "^4.0.1" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files" @@ -4506,7 +4942,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.15" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.29" }, "funding": [ { @@ -4522,7 +4958,7 @@ "type": "tidelift" } ], - "time": "2024-03-22T04:17:47+00:00" + "time": "2024-07-30T11:08:00+00:00" }, { "name": "predis/predis", @@ -5503,16 +5939,16 @@ }, { "name": "simplesamlphp/simplesamlphp-module-adfs", - "version": "v2.1.3", + "version": "v2.1.5", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-module-adfs.git", - "reference": "59368e58fc5548e8b6bb75c102c5a3242722e22b" + "reference": "f2202b9d8d4c14f09690f4781988e435f7dfd405" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-adfs/zipball/59368e58fc5548e8b6bb75c102c5a3242722e22b", - "reference": "59368e58fc5548e8b6bb75c102c5a3242722e22b", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-adfs/zipball/f2202b9d8d4c14f09690f4781988e435f7dfd405", + "reference": "f2202b9d8d4c14f09690f4781988e435f7dfd405", "shasum": "" }, "require": { @@ -5555,31 +5991,35 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-module-adfs/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-module-adfs" }, - "time": "2023-11-26T09:54:31+00:00" + "time": "2024-05-27T12:30:45+00:00" }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.6.2", + "version": "v1.7.9", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "3c0fbc0fc5395e00e40a5708e330ec1ef3cc7fa8" + "reference": "e558ba55eefbbcca1bf13c7cfe19c7af5a62fe1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/3c0fbc0fc5395e00e40a5708e330ec1ef3cc7fa8", - "reference": "3c0fbc0fc5395e00e40a5708e330ec1ef3cc7fa8", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/e558ba55eefbbcca1bf13c7cfe19c7af5a62fe1c", + "reference": "e558ba55eefbbcca1bf13c7cfe19c7af5a62fe1c", "shasum": "" }, "require": { + "ext-curl": "*", + "php": "^8.1", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-mockery": "^1.1", "phpunit/phpunit": "^10.0 || ^11.0", + "psr/log": "^2.0 || ^3.0", "slevomat/coding-standard": "^8.15", "symfony/phpunit-bridge": "^6.4 || ^7.0" }, "require-dev": { - "ext-curl": "*", - "php": "^8.1", - "simplesamlphp/simplesamlphp": "^2.2.0" + "simplesamlphp/simplesamlphp": "^2" }, "type": "project", "autoload": { @@ -5605,7 +6045,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2024-03-19T19:45:16+00:00" + "time": "2024-07-22T19:15:29+00:00" }, { "name": "slevomat/coding-standard", @@ -5674,16 +6114,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.9.0", + "version": "3.10.2", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "d63cee4890a8afaf86a22e51ad4d97c91dd4579b" + "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/d63cee4890a8afaf86a22e51ad4d97c91dd4579b", - "reference": "d63cee4890a8afaf86a22e51ad4d97c91dd4579b", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/86e5f5dd9a840c46810ebe5ff1885581c42a3017", + "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017", "shasum": "" }, "require": { @@ -5750,20 +6190,20 @@ "type": "open_collective" } ], - "time": "2024-02-16T15:06:51+00:00" + "time": "2024-07-21T23:26:44+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v7.0.4", + "version": "v7.1.3", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "54ca13ec990a40411ad978e08d994fca6cdd865f" + "reference": "e823122d31935eb711e2767c31f3d71cb0b87fb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/54ca13ec990a40411ad978e08d994fca6cdd865f", - "reference": "54ca13ec990a40411ad978e08d994fca6cdd865f", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e823122d31935eb711e2767c31f3d71cb0b87fb1", + "reference": "e823122d31935eb711e2767c31f3d71cb0b87fb1", "shasum": "" }, "require": { @@ -5795,7 +6235,8 @@ "Symfony\\Bridge\\PhpUnit\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "/Tests/", + "/bin/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -5815,7 +6256,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.0.4" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.3" }, "funding": [ { @@ -5831,20 +6272,20 @@ "type": "tidelift" } ], - "time": "2024-02-08T19:22:56+00:00" + "time": "2024-07-26T12:41:01+00:00" }, { "name": "symfony/translation", - "version": "v6.4.4", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e" + "reference": "94041203f8ac200ae9e7c6a18fa6137814ccecc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/bce6a5a78e94566641b2594d17e48b0da3184a8e", - "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e", + "url": "https://api.github.com/repos/symfony/translation/zipball/94041203f8ac200ae9e7c6a18fa6137814ccecc9", + "reference": "94041203f8ac200ae9e7c6a18fa6137814ccecc9", "shasum": "" }, "require": { @@ -5910,7 +6351,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.4" + "source": "https://github.com/symfony/translation/tree/v6.4.10" }, "funding": [ { @@ -5926,7 +6367,7 @@ "type": "tidelift" } ], - "time": "2024-02-20T13:16:58+00:00" + "time": "2024-07-26T12:30:32+00:00" }, { "name": "theseer/tokenizer", From d0991dc788e96231d6041a05e33e13c97a154546 Mon Sep 17 00:00:00 2001 From: Alan Nelson Date: Mon, 12 Aug 2024 18:48:42 -0500 Subject: [PATCH 143/532] Fix MDQ cache file bugs (#2200) * Ensure MDQ JSON cache is decoded properly * Ensure MDQ JSON cache is overwritten not appended to * Update MDQ cache file extension --------- Co-authored-by: Alan Nelson --- src/SimpleSAML/Metadata/Sources/MDQ.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/SimpleSAML/Metadata/Sources/MDQ.php b/src/SimpleSAML/Metadata/Sources/MDQ.php index e2e889dd36..722d10d4c3 100644 --- a/src/SimpleSAML/Metadata/Sources/MDQ.php +++ b/src/SimpleSAML/Metadata/Sources/MDQ.php @@ -133,7 +133,7 @@ private function getCacheFilename(string $set, string $entityId): string } $cachekey = sha1($entityId); - return $this->cacheDir . '/' . $set . '-' . $cachekey . '.cached.xml'; + return $this->cacheDir . '/' . $set . '-' . $cachekey . '.cached.json'; } @@ -186,7 +186,8 @@ private function getFromCache(string $set, string $entityId): ?array )); } - $data = json_decode($rawData); + // ensure json is decoded as an associative array not an object + $data = json_decode($rawData, true); if ($data === false) { throw new Exception( sprintf('%s: error unserializing cached data from file "%s".', __CLASS__, strval($file)), @@ -220,8 +221,8 @@ private function writeToCache(string $set, string $entityId, array $data): void Logger::debug(sprintf('%s: Writing cache [%s] => [%s]', __CLASS__, $entityId, $cacheFileName)); - /** @psalm-suppress TooManyArguments */ - $this->fileSystem->appendToFile($cacheFileName, json_encode($data), true); + // using dumpFile instead of appendToFile here to replace any existing cache data + $this->fileSystem->dumpFile($cacheFileName, json_encode($data)); } From 4443dacf95eaaa5c275fba5466fef85f926225c5 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Tue, 13 Aug 2024 10:07:12 +1000 Subject: [PATCH 144/532] An update to the MDQ PR #2200 (#2203) --- src/SimpleSAML/Metadata/Sources/MDQ.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/SimpleSAML/Metadata/Sources/MDQ.php b/src/SimpleSAML/Metadata/Sources/MDQ.php index 722d10d4c3..23ab985859 100644 --- a/src/SimpleSAML/Metadata/Sources/MDQ.php +++ b/src/SimpleSAML/Metadata/Sources/MDQ.php @@ -187,7 +187,7 @@ private function getFromCache(string $set, string $entityId): ?array } // ensure json is decoded as an associative array not an object - $data = json_decode($rawData, true); + $data = json_decode($rawData, true, 512, JSON_THROW_ON_ERROR); if ($data === false) { throw new Exception( sprintf('%s: error unserializing cached data from file "%s".', __CLASS__, strval($file)), @@ -221,8 +221,7 @@ private function writeToCache(string $set, string $entityId, array $data): void Logger::debug(sprintf('%s: Writing cache [%s] => [%s]', __CLASS__, $entityId, $cacheFileName)); - // using dumpFile instead of appendToFile here to replace any existing cache data - $this->fileSystem->dumpFile($cacheFileName, json_encode($data)); + $this->fileSystem->dumpFile($cacheFileName, json_encode($data, JSON_THROW_ON_ERROR)); } From 7647b5b811bf39789d067e45ff1b04eb4b65cd80 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 15 Aug 2024 11:42:09 +0200 Subject: [PATCH 145/532] Update Configuration.php Add missing space --- src/SimpleSAML/Configuration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index 7140d80762..dca0449732 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -63,7 +63,7 @@ class Configuration implements Utils\ClearableState "style-src 'self'; " . "font-src 'self'; " . "connect-src 'self'; " . - "media-src data:;" . + "media-src data:; " . "img-src 'self' data:; " . "base-uri 'none'", 'X-Frame-Options' => 'SAMEORIGIN', From 991b08f545dd30cb7e3f0ce2c88899410ce28c36 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 19 Aug 2024 20:00:26 +0200 Subject: [PATCH 146/532] Add mime-type so browsers can detect if preloading makes sense for them --- templates/base.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/base.twig b/templates/base.twig index 468537e59f..bd6e984b14 100644 --- a/templates/base.twig +++ b/templates/base.twig @@ -6,7 +6,7 @@ {{ pagetitle }} - + From c71d7ded0371b7bf5ea1d5fd4d3a61e183ccd4a1 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 20 Aug 2024 20:35:04 +0200 Subject: [PATCH 147/532] Bugfix/preloaded resource not used (#2207) * Add possibility to remove the tag from assets * Preloaded files cannot have request parameters; remove tag * Change order: preloading must be done after referencing the resource (in the stylesheet in this case) --- docs/simplesamlphp-changelog.md | 1 + src/SimpleSAML/XHTML/Template.php | 9 ++++++++- templates/base.twig | 3 ++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index ff6cb300d0..fdee58c431 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -15,6 +15,7 @@ Released TBD * Add microsecond support to the FileLoggingHandler (#2084) * Session ID's are now hashed when stored in a database (#2106) * Improved HTML 5 compatibility (#2162) +* Fix: preloaded resource not used (#2207) `authorize` diff --git a/src/SimpleSAML/XHTML/Template.php b/src/SimpleSAML/XHTML/Template.php index f7e3cce4dd..6581f9493f 100644 --- a/src/SimpleSAML/XHTML/Template.php +++ b/src/SimpleSAML/XHTML/Template.php @@ -177,9 +177,10 @@ class_exists($controller) * the original file. * @param string $asset * @param string|null $module + * @param bool $tag * @return string */ - public function asset(string $asset, string $module = null): string + public function asset(string $asset, string $module = null, bool $tag = true): string { $baseDir = $this->configuration->getBaseDir(); $basePath = $this->configuration->getBasePath(); @@ -198,6 +199,12 @@ public function asset(string $asset, string $module = null): string // don't be too harsh if an asset is missing, just pretend it's there... return $path; } + + if ($tag === false) { + // The asset is requested without a tag + return $path; + } + $file = new File($file); $tag = $this->configuration->getVersion(); diff --git a/templates/base.twig b/templates/base.twig index bd6e984b14..a3a5dd5d08 100644 --- a/templates/base.twig +++ b/templates/base.twig @@ -6,9 +6,10 @@ {{ pagetitle }} - + {# Preloading must be done after referencing the resource #} + {{ include('_head.twig', ignore_missing = true) }} {% block preload %}{% endblock %} From 8151f974d7e028d78b50afbdf9b3fa7f36f2cbd8 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 24 Jun 2024 14:02:51 +0200 Subject: [PATCH 148/532] Fix missing trailing comma --- modules/admin/src/Controller/Federation.php | 2 +- modules/core/src/Controller/Logout.php | 2 +- modules/saml/src/Auth/Source/SP.php | 10 ++-- modules/saml/src/IdP/SQLNameID.php | 2 +- src/SimpleSAML/Database.php | 6 +-- src/SimpleSAML/Metadata/SAMLBuilder.php | 12 ++--- src/SimpleSAML/Metadata/SAMLParser.php | 2 +- src/SimpleSAML/Utils/Config/Metadata.php | 4 +- src/SimpleSAML/Utils/Crypto.php | 6 +-- .../src/Controller/ExampleAuthTest.php | 2 +- .../src/Controller/DiscoControllerTest.php | 2 +- tests/modules/saml/src/Auth/Source/SPTest.php | 16 +++--- .../saml/src/Controller/MetadataTest.php | 2 +- .../src/Controller/ServiceProviderTest.php | 54 +++++++++---------- tests/modules/saml/src/IdP/SAML2Test.php | 4 +- tests/src/SimpleSAML/Error/ErrorCodesTest.php | 42 +++++++-------- .../SimpleSAML/Utils/Config/MetadataTest.php | 26 ++++----- 17 files changed, 97 insertions(+), 97 deletions(-) diff --git a/modules/admin/src/Controller/Federation.php b/modules/admin/src/Controller/Federation.php index 0c2f6a5af8..e693aedbce 100644 --- a/modules/admin/src/Controller/Federation.php +++ b/modules/admin/src/Controller/Federation.php @@ -314,7 +314,7 @@ private function getHostedIdP(): array 'set' => $entity['metadata-set'], 'entity' => $entity['metadata-index'], 'prefix' => $key['prefix'], - ] + ], ); $key['name'] = 'idp'; unset($entity['metadata_array']['keys'][$kidx]['prefix']); diff --git a/modules/core/src/Controller/Logout.php b/modules/core/src/Controller/Logout.php index 336c8ebba7..a31b26d136 100644 --- a/modules/core/src/Controller/Logout.php +++ b/modules/core/src/Controller/Logout.php @@ -79,7 +79,7 @@ public function logout(Request $request, string $as): RunnableResponse $returnTo = $this->getReturnPath($request); return new RunnableResponse( [$auth, 'logout'], - [$returnTo] + [$returnTo], ); } diff --git a/modules/saml/src/Auth/Source/SP.php b/modules/saml/src/Auth/Source/SP.php index 480e2db175..a512321114 100644 --- a/modules/saml/src/Auth/Source/SP.php +++ b/modules/saml/src/Auth/Source/SP.php @@ -251,8 +251,8 @@ public function getHostedMetadata(): array [ 'set' => 'saml20-sp-hosted', 'source' => $this->getAuthId(), - 'prefix' => 'new_' - ] + 'prefix' => 'new_', + ], ), 'name' => $certInfo['name'] ?? null, ]; @@ -271,8 +271,8 @@ public function getHostedMetadata(): array [ 'set' => 'saml20-sp-hosted', 'source' => $this->getAuthId(), - 'prefix' => '' - ] + 'prefix' => '', + ], ), 'name' => $certInfo['name'] ?? null, ]; @@ -521,7 +521,7 @@ private function startSSO2(Configuration $idpMetadata, array $state): void // RequestedAuthnContext has been set by an SP behind the proxy so pass it to the upper IdP $ar->setRequestedAuthnContext([ 'AuthnContextClassRef' => $state['saml:RequestedAuthnContext']['AuthnContextClassRef'], - 'Comparison' => $state['saml:RequestedAuthnContext']['Comparison'] + 'Comparison' => $state['saml:RequestedAuthnContext']['Comparison'], ]); } } diff --git a/modules/saml/src/IdP/SQLNameID.php b/modules/saml/src/IdP/SQLNameID.php index 7155c13150..afbcf8d8d9 100644 --- a/modules/saml/src/IdP/SQLNameID.php +++ b/modules/saml/src/IdP/SQLNameID.php @@ -166,7 +166,7 @@ private static function getStore(): Store\SQLStore $store, Store\SQLStore::class, 'SQL NameID store requires SimpleSAMLphp to be configured with a SQL datastore.', - Error\Exception::class + Error\Exception::class, ); return $store; diff --git a/src/SimpleSAML/Database.php b/src/SimpleSAML/Database.php index 094ff03670..4f51170d63 100644 --- a/src/SimpleSAML/Database.php +++ b/src/SimpleSAML/Database.php @@ -101,13 +101,13 @@ private function __construct(Configuration $config) if ($config->getOptionalArray('database.slaves', null) !== null) { Logger::warning( 'The "database.slaves" config option is deprecated. ' . - 'Please update your configuration to use "database.secondaries".' + 'Please update your configuration to use "database.secondaries".', ); } // connect to any configured secondaries, preserving legacy config option $secondaries = $config->getOptionalArray( 'database.secondaries', - $config->getOptionalArray('database.slaves', []) + $config->getOptionalArray('database.slaves', []), ); foreach ($secondaries as $secondary) { array_push( @@ -145,7 +145,7 @@ private static function generateInstanceId(Configuration $config): string // TODO: deprecated: the "database.slave" terminology is preserved here for backwards compatibility. 'secondaries' => $config->getOptionalArray( 'database.secondaries', - $config->getOptionalArray('database.slaves', []) + $config->getOptionalArray('database.slaves', []), ), ]; diff --git a/src/SimpleSAML/Metadata/SAMLBuilder.php b/src/SimpleSAML/Metadata/SAMLBuilder.php index 3c984d2318..7e88b1978f 100644 --- a/src/SimpleSAML/Metadata/SAMLBuilder.php +++ b/src/SimpleSAML/Metadata/SAMLBuilder.php @@ -195,13 +195,13 @@ private function addExtensions(Configuration $metadata, RoleDescriptor $e): void $ea->addChildren($a); } $this->entityDescriptor->setExtensions( - array_merge($this->entityDescriptor->getExtensions(), [$ea]) + array_merge($this->entityDescriptor->getExtensions(), [$ea]), ); } if ($metadata->hasValue('saml:Extensions')) { $this->entityDescriptor->setExtensions( - array_merge($this->entityDescriptor->getExtensions(), $metadata->getArray('saml:Extensions')) + array_merge($this->entityDescriptor->getExtensions(), $metadata->getArray('saml:Extensions')), ); } @@ -221,7 +221,7 @@ private function addExtensions(Configuration $metadata, RoleDescriptor $e): void } } $this->entityDescriptor->setExtensions( - array_merge($this->entityDescriptor->getExtensions(), [$ri]) + array_merge($this->entityDescriptor->getExtensions(), [$ri]), ); } @@ -377,7 +377,7 @@ private static function createEndpoints(array $endpoints, bool $indexed): array $t->setAttributeNS( Constants::NS_HOK, 'hoksso:ProtocolBinding', - Constants::BINDING_HTTP_REDIRECT + Constants::BINDING_HTTP_REDIRECT, ); } @@ -559,7 +559,7 @@ public function addMetadataIdP20(array $metadata): void if ($metadata->hasValue('ArtifactResolutionService')) { $e->setArtifactResolutionService(self::createEndpoints( $metadata->getEndpoints('ArtifactResolutionService'), - true + true, )); } @@ -601,7 +601,7 @@ public function addAttributeAuthority(array $metadata): void $e->setAttributeService(self::createEndpoints($metadata->getEndpoints('AttributeService'), false)); $e->setAssertionIDRequestService(self::createEndpoints( $metadata->getEndpoints('AssertionIDRequestService'), - false + false, )); $e->setNameIDFormat($metadata->getOptionalArrayizeString('NameIDFormat', [])); diff --git a/src/SimpleSAML/Metadata/SAMLParser.php b/src/SimpleSAML/Metadata/SAMLParser.php index 546c5af1b5..9cccfcda1b 100644 --- a/src/SimpleSAML/Metadata/SAMLParser.php +++ b/src/SimpleSAML/Metadata/SAMLParser.php @@ -908,7 +908,7 @@ private static function processExtensions(mixed $element, array $parentExtension Logger::warning( 'Invalid attempt to override registrationAuthority \'' . $ret['RegistrationInfo']['authority'] - . "' with '{$e->getRegistrationAuthority()}'" + . "' with '{$e->getRegistrationAuthority()}'", ); } else { $ret['RegistrationInfo']['authority'] = $e->getRegistrationAuthority(); diff --git a/src/SimpleSAML/Utils/Config/Metadata.php b/src/SimpleSAML/Utils/Config/Metadata.php index 185d05eec9..2dd4074996 100644 --- a/src/SimpleSAML/Utils/Config/Metadata.php +++ b/src/SimpleSAML/Utils/Config/Metadata.php @@ -90,7 +90,7 @@ public static function getContact(?array $contact): array function ($t) { return '"' . $t . '"'; }, - ContactPerson::CONTACT_TYPES + ContactPerson::CONTACT_TYPES, )); throw new \InvalidArgumentException('"contactType" is mandatory and must be one of ' . $types . "."); } @@ -154,7 +154,7 @@ function ($t) { || !(is_string($contact['telephoneNumber']) || is_array($contact['telephoneNumber'])) ) { throw new \InvalidArgumentException( - '"telephoneNumber" must be a string or an array and cannot be empty.' + '"telephoneNumber" must be a string or an array and cannot be empty.', ); } if (is_array($contact['telephoneNumber'])) { diff --git a/src/SimpleSAML/Utils/Crypto.php b/src/SimpleSAML/Utils/Crypto.php index 011818e0c4..715f81625b 100644 --- a/src/SimpleSAML/Utils/Crypto.php +++ b/src/SimpleSAML/Utils/Crypto.php @@ -40,7 +40,7 @@ private function aesDecryptInternal(string $ciphertext, string $secret): string $len = mb_strlen($ciphertext, '8bit'); if ($len < 48) { throw new InvalidArgumentException( - 'Input parameter "$ciphertext" must be a string with more than 48 characters.' + 'Input parameter "$ciphertext" must be a string with more than 48 characters.', ); } @@ -58,7 +58,7 @@ private function aesDecryptInternal(string $ciphertext, string $secret): string 'AES-256-CBC', substr($key, 0, 64), defined('OPENSSL_RAW_DATA') ? OPENSSL_RAW_DATA : 1, - $iv + $iv, ); if ($plaintext !== false) { @@ -124,7 +124,7 @@ private function aesEncryptInternal(string $data, string $secret): string 'AES-256-CBC', substr($key, 0, 64), defined('OPENSSL_RAW_DATA') ? OPENSSL_RAW_DATA : 1, - $iv + $iv, ); if ($ciphertext === false) { diff --git a/tests/modules/exampleauth/src/Controller/ExampleAuthTest.php b/tests/modules/exampleauth/src/Controller/ExampleAuthTest.php index 56bc0d3056..1ef6275e68 100644 --- a/tests/modules/exampleauth/src/Controller/ExampleAuthTest.php +++ b/tests/modules/exampleauth/src/Controller/ExampleAuthTest.php @@ -207,7 +207,7 @@ public function testRedirect(): void $request = Request::create( '/redirecttest', 'GET', - ['StateId' => 'someState'] + ['StateId' => 'someState'], ); $c = new Controller\ExampleAuth($this->config, $this->session); diff --git a/tests/modules/multiauth/src/Controller/DiscoControllerTest.php b/tests/modules/multiauth/src/Controller/DiscoControllerTest.php index 89892d0ff2..4ae08f790f 100644 --- a/tests/modules/multiauth/src/Controller/DiscoControllerTest.php +++ b/tests/modules/multiauth/src/Controller/DiscoControllerTest.php @@ -102,7 +102,7 @@ public function testDiscoveryFallthru(): void $request = Request::create( '/discovery', 'GET', - ['AuthState' => 'someState'] + ['AuthState' => 'someState'], ); $c = new Controller\DiscoController($this->config, $this->session); diff --git a/tests/modules/saml/src/Auth/Source/SPTest.php b/tests/modules/saml/src/Auth/Source/SPTest.php index 208a744cf1..cea9cd825b 100644 --- a/tests/modules/saml/src/Auth/Source/SPTest.php +++ b/tests/modules/saml/src/Auth/Source/SPTest.php @@ -240,7 +240,7 @@ public function testAuthnContextClassRef(): void $a = $ar->getRequestedAuthnContext(); $this->assertEquals( $state['saml:AuthnContextClassRef'], - $a['AuthnContextClassRef'][0] + $a['AuthnContextClassRef'][0], ); $xml = $ar->toSignedXML(); @@ -476,12 +476,12 @@ public function testMetadataHostedBasicConfig(): void public function testSPIdpListScoping(): void { $ar = $this->createAuthnRequest([ - 'IDPList' => ['https://scope.example.com'] + 'IDPList' => ['https://scope.example.com'], ]); $this->assertContains( 'https://scope.example.com', - $ar->getIDPList() + $ar->getIDPList(), ); } @@ -496,7 +496,7 @@ public function testIdpMetadataScoping(): void $this->assertContains( 'https://scope.example.com', - $ar->getIDPList() + $ar->getIDPList(), ); } @@ -521,7 +521,7 @@ public function testRemoteMetadataScoping(): void ['ar' => $ar] = $e->getTestResult(); $this->assertContains( 'https://scope.example.com', - $ar->getIDPList() + $ar->getIDPList(), ); } } @@ -565,7 +565,7 @@ public function testSPIdpListScopingOrder( $this->assertContains( $expectedScope, - $ar->getIDPList() + $ar->getIDPList(), ); } } @@ -583,7 +583,7 @@ public static function getScopingOrders(): array 'stateIdpList' => null, 'idpConfigArray' => ['https//scope2.example.com'], 'remoteMetadata' => ['https//scope3.example.com'], - 'expectedScope' => 'https//scope3.example.com' + 'expectedScope' => 'https//scope3.example.com', ], [ 'stateIdpList' => null, @@ -668,7 +668,7 @@ public function testMetadataHostedContacts(): void $this->assertIsArray($contact['attributes']); $attrs = [ 'xmlns:remd' => 'http://refeds.org/metadata', - 'remd:contactType' => 'http://refeds.org/metadata/contactType/security' + 'remd:contactType' => 'http://refeds.org/metadata/contactType/security', ]; $this->assertEquals($attrs, $contact['attributes']); diff --git a/tests/modules/saml/src/Controller/MetadataTest.php b/tests/modules/saml/src/Controller/MetadataTest.php index eaa2a42283..e94b73d984 100644 --- a/tests/modules/saml/src/Controller/MetadataTest.php +++ b/tests/modules/saml/src/Controller/MetadataTest.php @@ -102,7 +102,7 @@ public function getMetaDataCurrentEntityID(string $set, string $type = 'entityid 'admin.protectmetadata' => false, ], '[ARRAY]', - 'simplesaml' + 'simplesaml', ); Configuration::setPreLoadedConfig($this->config, 'config.php'); diff --git a/tests/modules/saml/src/Controller/ServiceProviderTest.php b/tests/modules/saml/src/Controller/ServiceProviderTest.php index 3972b565a8..3cd561b99c 100644 --- a/tests/modules/saml/src/Controller/ServiceProviderTest.php +++ b/tests/modules/saml/src/Controller/ServiceProviderTest.php @@ -219,8 +219,8 @@ public static function loginNotAuthenticatedDataProvider(): array 'no query params' => [ [], // If no query params are provided, it should default to the RelayState [ - 'ReturnTo' => self::RELAY_STATE - ] + 'ReturnTo' => self::RELAY_STATE, + ], ], 'entityID=example.edu' => [ [ @@ -228,21 +228,21 @@ public static function loginNotAuthenticatedDataProvider(): array ], [ 'ReturnTo' => self::RELAY_STATE, - 'saml:idp' => 'example.edu' - ] + 'saml:idp' => 'example.edu', + ], ], 'entityID=example.edu&forceAuthn=false&isPassive=false' => [ [ 'entityID' => 'example.edu', 'forceAuthn' => 'false', - 'isPassive' => 'false' + 'isPassive' => 'false', ], [ 'ReturnTo' => self::RELAY_STATE, 'saml:idp' => 'example.edu', 'ForceAuthn' => false, - 'isPassive' => false - ] + 'isPassive' => false, + ], ], 'entityID=other.edu' => [ [ @@ -250,27 +250,27 @@ public static function loginNotAuthenticatedDataProvider(): array ], [ 'ReturnTo' => self::RELAY_STATE, - 'saml:idp' => 'other.edu' - ] + 'saml:idp' => 'other.edu', + ], ], 'forceAuthn=true&target=/some/url' => [ [ 'target' => '/some/url', - 'forceAuthn' => 'true' + 'forceAuthn' => 'true', ], [ 'ReturnTo' => 'http://localhost/some/url', - 'ForceAuthn' => true + 'ForceAuthn' => true, ], - false + false, ], 'target=https://evil.com' => [ [ - 'target' => 'https://evil.com' + 'target' => 'https://evil.com', ], [], - true - ] + true, + ], ]; } @@ -338,7 +338,7 @@ public static function loginAuthenticatedDataProvider(): array [ 'ReturnTo' => self::RELAY_STATE, ], - false + false, ], 'entityID=example.edu' => [ [ @@ -347,18 +347,18 @@ public static function loginAuthenticatedDataProvider(): array [ 'ReturnTo' => self::RELAY_STATE, ], - false + false, ], 'entityID=example.edu&forceAuthn=false&isPassive=false' => [ [ 'entityID' => 'example.edu', 'forceAuthn' => 'false', - 'isPassive' => 'false' + 'isPassive' => 'false', ], [ 'ReturnTo' => self::RELAY_STATE, ], - false + false, ], 'entityID=other.edu' => [ [ @@ -366,29 +366,29 @@ public static function loginAuthenticatedDataProvider(): array ], [ 'ReturnTo' => self::RELAY_STATE, - 'saml:idp' => 'other.edu' + 'saml:idp' => 'other.edu', ], - true + true, ], 'forceAuthn=true&target=/some/url' => [ [ 'target' => '/some/url', - 'forceAuthn' => 'true' + 'forceAuthn' => 'true', ], [ 'ReturnTo' => 'http://localhost/some/url', - 'ForceAuthn' => true + 'ForceAuthn' => true, ], - true + true, ], 'target=https://evil.com' => [ [ - 'target' => 'https://evil.com' + 'target' => 'https://evil.com', ], [], false, - true - ] + true, + ], ]; } diff --git a/tests/modules/saml/src/IdP/SAML2Test.php b/tests/modules/saml/src/IdP/SAML2Test.php index 93b52b40f1..ffcbf59d97 100644 --- a/tests/modules/saml/src/IdP/SAML2Test.php +++ b/tests/modules/saml/src/IdP/SAML2Test.php @@ -47,7 +47,7 @@ class SAML2Test extends ClearStateTestCase 'saml:NameIDFormat' => null, 'saml:AllowCreate' => true, 'saml:Extensions' => null, - 'saml:RequestedAuthnContext' => null + 'saml:RequestedAuthnContext' => null, ]; @@ -709,7 +709,7 @@ public function testMetadataHostedContacts(): void $this->assertIsArray($contact['attributes']); $attrs = [ 'xmlns:remd' => 'http://refeds.org/metadata', - 'remd:contactType' => 'http://refeds.org/metadata/contactType/security' + 'remd:contactType' => 'http://refeds.org/metadata/contactType/security', ]; $this->assertEquals($attrs, $contact['attributes']); diff --git a/tests/src/SimpleSAML/Error/ErrorCodesTest.php b/tests/src/SimpleSAML/Error/ErrorCodesTest.php index ee04244704..0743a79507 100644 --- a/tests/src/SimpleSAML/Error/ErrorCodesTest.php +++ b/tests/src/SimpleSAML/Error/ErrorCodesTest.php @@ -43,7 +43,7 @@ public function testCanStaticallyGetDefaultErrorCodes(): void $this->assertSameSize( ErrorCodes::defaultGetAllErrorCodeTitles(), ErrorCodes::defaultGetAllErrorCodeDescriptions(), - 'Not all error codes have their title / description pair.' + 'Not all error codes have their title / description pair.', ); $this->assertArrayHasKey(ErrorCodes::WRONGUSERPASS, ErrorCodes::defaultGetAllErrorCodeTitles()); @@ -53,29 +53,29 @@ public function testCanStaticallyGetDefaultErrorCodes(): void $this->assertSame( ErrorCodes::defaultGetAllErrorCodeTitles()[ErrorCodes::WRONGUSERPASS], - ErrorCodes::getErrorCodeTitle(ErrorCodes::WRONGUSERPASS) + ErrorCodes::getErrorCodeTitle(ErrorCodes::WRONGUSERPASS), ); $this->assertSame( ErrorCodes::defaultGetAllErrorCodeDescriptions()[ErrorCodes::WRONGUSERPASS], - ErrorCodes::getErrorCodeDescription(ErrorCodes::WRONGUSERPASS) + ErrorCodes::getErrorCodeDescription(ErrorCodes::WRONGUSERPASS), ); $this->assertSame( ErrorCodes::getAllErrorCodeTitles(), - ErrorCodes::getAllErrorCodeMessages()[ErrorCodes::KEY_TITLE] + ErrorCodes::getAllErrorCodeMessages()[ErrorCodes::KEY_TITLE], ); $this->assertSame( ErrorCodes::getAllErrorCodeDescriptions(), - ErrorCodes::getAllErrorCodeMessages()[ErrorCodes::KEY_DESCRIPTION] + ErrorCodes::getAllErrorCodeMessages()[ErrorCodes::KEY_DESCRIPTION], ); $this->assertSame( ErrorCodes::getErrorCodeTitle(ErrorCodes::WRONGUSERPASS), - ErrorCodes::getErrorCodeMessage(ErrorCodes::WRONGUSERPASS)[ErrorCodes::KEY_TITLE] + ErrorCodes::getErrorCodeMessage(ErrorCodes::WRONGUSERPASS)[ErrorCodes::KEY_TITLE], ); $this->assertSame( ErrorCodes::getErrorCodeDescription(ErrorCodes::WRONGUSERPASS), - ErrorCodes::getErrorCodeMessage(ErrorCodes::WRONGUSERPASS)[ErrorCodes::KEY_DESCRIPTION] + ErrorCodes::getErrorCodeMessage(ErrorCodes::WRONGUSERPASS)[ErrorCodes::KEY_DESCRIPTION], ); } @@ -145,7 +145,7 @@ public static function getCustomErrorCodeDescriptions(): array $this->assertSameSize( $customErrorCodes::getCustomErrorCodeTitles(), $customErrorCodes::getCustomErrorCodeDescriptions(), - 'Not all custom error codes have their title / description pair.' + 'Not all custom error codes have their title / description pair.', ); $this->assertArrayHasKey($customErrorCodes::CUSTOMCODE, $customErrorCodes::getCustomErrorCodeTitles()); @@ -155,29 +155,29 @@ public static function getCustomErrorCodeDescriptions(): array $this->assertSame( $customErrorCodes::getCustomErrorCodeTitles()[$customErrorCodes::CUSTOMCODE], - $customErrorCodes::getErrorCodeTitle($customErrorCodes::CUSTOMCODE) + $customErrorCodes::getErrorCodeTitle($customErrorCodes::CUSTOMCODE), ); $this->assertSame( $customErrorCodes::getCustomErrorCodeDescriptions()[$customErrorCodes::CUSTOMCODE], - $customErrorCodes::getErrorCodeDescription($customErrorCodes::CUSTOMCODE) + $customErrorCodes::getErrorCodeDescription($customErrorCodes::CUSTOMCODE), ); $this->assertSame( $customErrorCodes::getAllErrorCodeTitles(), - $customErrorCodes::getAllErrorCodeMessages()[ErrorCodes::KEY_TITLE] + $customErrorCodes::getAllErrorCodeMessages()[ErrorCodes::KEY_TITLE], ); $this->assertSame( $customErrorCodes::getAllErrorCodeDescriptions(), - $customErrorCodes::getAllErrorCodeMessages()[ErrorCodes::KEY_DESCRIPTION] + $customErrorCodes::getAllErrorCodeMessages()[ErrorCodes::KEY_DESCRIPTION], ); $this->assertSame( $customErrorCodes::getErrorCodeTitle($customErrorCodes::CUSTOMCODE), - $customErrorCodes::getErrorCodeMessage($customErrorCodes::CUSTOMCODE)[ErrorCodes::KEY_TITLE] + $customErrorCodes::getErrorCodeMessage($customErrorCodes::CUSTOMCODE)[ErrorCodes::KEY_TITLE], ); $this->assertSame( $customErrorCodes::getErrorCodeDescription($customErrorCodes::CUSTOMCODE), - $customErrorCodes::getErrorCodeMessage($customErrorCodes::CUSTOMCODE)[ErrorCodes::KEY_DESCRIPTION] + $customErrorCodes::getErrorCodeMessage($customErrorCodes::CUSTOMCODE)[ErrorCodes::KEY_DESCRIPTION], ); } @@ -206,7 +206,7 @@ public function getCustomDescriptions(): array $this->assertSameSize( $customErrorCodes->getCustomTitles(), $customErrorCodes->getCustomDescriptions(), - 'Not all custom error codes have their title / description pair.' + 'Not all custom error codes have their title / description pair.', ); $this->assertArrayHasKey($customErrorCodes::CUSTOMCODE, $customErrorCodes->getCustomTitles()); @@ -216,29 +216,29 @@ public function getCustomDescriptions(): array $this->assertSame( $customErrorCodes->getCustomTitles()[$customErrorCodes::CUSTOMCODE], - $customErrorCodes->getTitle($customErrorCodes::CUSTOMCODE) + $customErrorCodes->getTitle($customErrorCodes::CUSTOMCODE), ); $this->assertSame( $customErrorCodes->getCustomDescriptions()[$customErrorCodes::CUSTOMCODE], - $customErrorCodes->getDescription($customErrorCodes::CUSTOMCODE) + $customErrorCodes->getDescription($customErrorCodes::CUSTOMCODE), ); $this->assertSame( $customErrorCodes->getAllTitles(), - $customErrorCodes->getAllMessages()[ErrorCodes::KEY_TITLE] + $customErrorCodes->getAllMessages()[ErrorCodes::KEY_TITLE], ); $this->assertSame( $customErrorCodes->getAllDescriptions(), - $customErrorCodes->getAllMessages()[ErrorCodes::KEY_DESCRIPTION] + $customErrorCodes->getAllMessages()[ErrorCodes::KEY_DESCRIPTION], ); $this->assertSame( $customErrorCodes->getTitle($customErrorCodes::CUSTOMCODE), - $customErrorCodes->getMessage($customErrorCodes::CUSTOMCODE)[ErrorCodes::KEY_TITLE] + $customErrorCodes->getMessage($customErrorCodes::CUSTOMCODE)[ErrorCodes::KEY_TITLE], ); $this->assertSame( $customErrorCodes->getDescription($customErrorCodes::CUSTOMCODE), - $customErrorCodes->getMessage($customErrorCodes::CUSTOMCODE)[ErrorCodes::KEY_DESCRIPTION] + $customErrorCodes->getMessage($customErrorCodes::CUSTOMCODE)[ErrorCodes::KEY_DESCRIPTION], ); } } diff --git a/tests/src/SimpleSAML/Utils/Config/MetadataTest.php b/tests/src/SimpleSAML/Utils/Config/MetadataTest.php index 761e5e9c7b..48967ff7ed 100644 --- a/tests/src/SimpleSAML/Utils/Config/MetadataTest.php +++ b/tests/src/SimpleSAML/Utils/Config/MetadataTest.php @@ -25,7 +25,7 @@ public function testGetContact(): void { // test missing type $contact = [ - 'name' => 'John Doe' + 'name' => 'John Doe', ]; try { Metadata::getContact($contact); @@ -35,7 +35,7 @@ public function testGetContact(): void // test invalid type $contact = [ - 'contactType' => 'invalid' + 'contactType' => 'invalid', ]; try { Metadata::getContact($contact); @@ -46,7 +46,7 @@ public function testGetContact(): void // test all valid contact types foreach (ContactPerson::CONTACT_TYPES as $type) { $contact = [ - 'contactType' => $type + 'contactType' => $type, ]; $parsed = Metadata::getContact($contact); $this->assertArrayHasKey('contactType', $parsed); @@ -108,7 +108,7 @@ public function testGetContact(): void } catch (InvalidArgumentException $e) { $this->assertEquals( '"emailAddress" must be a string or an array and cannot be empty.', - $e->getMessage() + $e->getMessage(), ); } } @@ -120,7 +120,7 @@ public function testGetContact(): void } catch (InvalidArgumentException $e) { $this->assertEquals( 'Email addresses must be a string and cannot be empty.', - $e->getMessage() + $e->getMessage(), ); } } @@ -143,7 +143,7 @@ public function testGetContact(): void } catch (InvalidArgumentException $e) { $this->assertEquals( '"telephoneNumber" must be a string or an array and cannot be empty.', - $e->getMessage() + $e->getMessage(), ); } } @@ -227,11 +227,11 @@ public function testParseNameIdPolicy(): void { $nameIdPolicy = [ 'Format' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:persistent', - 'AllowCreate' => false + 'AllowCreate' => false, ]; $this->assertEquals([ 'Format' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:persistent', - 'AllowCreate' => false + 'AllowCreate' => false, ], Metadata::parseNameIdPolicy($nameIdPolicy)); $nameIdPolicy = [ @@ -242,7 +242,7 @@ public function testParseNameIdPolicy(): void $this->assertEquals([ 'Format' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:persistent', 'AllowCreate' => false, - 'SPNameQualifier' => 'TEST' + 'SPNameQualifier' => 'TEST', ], Metadata::parseNameIdPolicy($nameIdPolicy)); } @@ -256,7 +256,7 @@ public function testParseNameIdPolicyDefaults(): void $nameIdPolicy = null; $this->assertEquals([ 'Format' => Constants::NAMEID_TRANSIENT, - 'AllowCreate' => true + 'AllowCreate' => true, ], Metadata::parseNameIdPolicy($nameIdPolicy)); $nameIdPolicy = [ @@ -264,7 +264,7 @@ public function testParseNameIdPolicyDefaults(): void ]; $this->assertEquals([ 'Format' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:persistent', - 'AllowCreate' => true + 'AllowCreate' => true, ], Metadata::parseNameIdPolicy($nameIdPolicy)); $nameIdPolicy = [ @@ -272,7 +272,7 @@ public function testParseNameIdPolicyDefaults(): void ]; $this->assertEquals([ 'Format' => Constants::NAMEID_TRANSIENT, - 'AllowCreate' => false + 'AllowCreate' => false, ], Metadata::parseNameIdPolicy($nameIdPolicy)); } @@ -285,7 +285,7 @@ public function testParseNameIdPolicyEmpty(): void $nameIdPolicy = []; $this->assertEquals( [], - Metadata::parseNameIdPolicy($nameIdPolicy) + Metadata::parseNameIdPolicy($nameIdPolicy), ); } } From 74c4130659d1574f44aa2606090a8d87ffc95ebb Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 20 Aug 2024 21:56:47 +0200 Subject: [PATCH 149/532] Release v2.3.0 --- composer.json | 4 +- composer.lock | 159 ++++++++++++++++---------------- docs/simplesamlphp-changelog.md | 90 +++++++++++++++++- 3 files changed, 169 insertions(+), 84 deletions(-) diff --git a/composer.json b/composer.json index 23287cb62e..4f766a691a 100644 --- a/composer.json +++ b/composer.json @@ -122,12 +122,12 @@ }, "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "2.4.0.x-dev" } }, "scripts": { "translations:unused": "php bin/translations translations:unused", "translations:update:translatable": "php bin/translations translations:update:translatable" }, - "version": "2.3.0" + "version": "v2.3.0" } diff --git a/composer.lock b/composer.lock index 8cf7cc3432..964cf3f8a8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e2b6aa3f3b241785f12fc5903c3716c4", + "content-hash": "d7fd451e223bbeefa23ea28e2b09064c", "packages": [ { "name": "gettext/gettext", @@ -906,16 +906,16 @@ }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.2.6", + "version": "v2.2.7", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "6364ca58d3b36dee02f99ca22f467924837bf33f" + "reference": "06da64ae4c7d3fae044d076d6523acff4561d11f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/6364ca58d3b36dee02f99ca22f467924837bf33f", - "reference": "6364ca58d3b36dee02f99ca22f467924837bf33f", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/06da64ae4c7d3fae044d076d6523acff4561d11f", + "reference": "06da64ae4c7d3fae044d076d6523acff4561d11f", "shasum": "" }, "require": { @@ -936,9 +936,9 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.2.6" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.2.7" }, - "time": "2024-07-28T01:07:13+00:00" + "time": "2024-08-19T18:08:18+00:00" }, { "name": "simplesamlphp/xml-common", @@ -1554,22 +1554,22 @@ }, { "name": "symfony/error-handler", - "version": "v7.1.3", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "432bb369952795c61ca1def65e078c4a80dad13c" + "reference": "231f1b2ee80f72daa1972f7340297d67439224f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/432bb369952795c61ca1def65e078c4a80dad13c", - "reference": "432bb369952795c61ca1def65e078c4a80dad13c", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/231f1b2ee80f72daa1972f7340297d67439224f0", + "reference": "231f1b2ee80f72daa1972f7340297d67439224f0", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/var-dumper": "^5.4|^6.0|^7.0" }, "conflict": { "symfony/deprecation-contracts": "<2.5", @@ -1578,7 +1578,7 @@ "require-dev": { "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "symfony/serializer": "^5.4|^6.0|^7.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -1609,7 +1609,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.1.3" + "source": "https://github.com/symfony/error-handler/tree/v6.4.10" }, "funding": [ { @@ -1625,28 +1625,28 @@ "type": "tidelift" } ], - "time": "2024-07-26T13:02:51+00:00" + "time": "2024-07-26T12:30:32+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.1.1", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b", + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<6.4", + "symfony/dependency-injection": "<5.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -1655,13 +1655,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/error-handler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^6.4|^7.0" + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -1689,7 +1689,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.8" }, "funding": [ { @@ -1705,7 +1705,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3209,20 +3209,20 @@ }, { "name": "symfony/string", - "version": "v7.1.3", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ea272a882be7f20cad58d5d78c215001617b7f07" + "reference": "ccf9b30251719567bfd46494138327522b9a9446" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ea272a882be7f20cad58d5d78c215001617b7f07", - "reference": "ea272a882be7f20cad58d5d78c215001617b7f07", + "url": "https://api.github.com/repos/symfony/string/zipball/ccf9b30251719567bfd46494138327522b9a9446", + "reference": "ccf9b30251719567bfd46494138327522b9a9446", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", @@ -3232,12 +3232,11 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/var-exporter": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -3276,7 +3275,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.3" + "source": "https://github.com/symfony/string/tree/v6.4.10" }, "funding": [ { @@ -3292,7 +3291,7 @@ "type": "tidelift" } ], - "time": "2024-07-22T10:25:37+00:00" + "time": "2024-07-22T10:21:14+00:00" }, { "name": "symfony/translation-contracts", @@ -3483,32 +3482,34 @@ }, { "name": "symfony/var-dumper", - "version": "v7.1.3", + "version": "v6.4.10", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f" + "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/86af4617cca75a6e28598f49ae0690f3b9d4591f", - "reference": "86af4617cca75a6e28598f49ae0690f3b9d4591f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a71cc3374f5fb9759da1961d28c452373b343dd4", + "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" }, "bin": [ "Resources/bin/var-dump-server" @@ -3546,7 +3547,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.3" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.10" }, "funding": [ { @@ -3562,7 +3563,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-07-26T12:30:32+00:00" }, { "name": "symfony/var-exporter", @@ -4432,16 +4433,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.11.10", + "version": "1.11.11", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "640410b32995914bde3eed26fa89552f9c2c082f" + "reference": "707c2aed5d8d0075666e673a5e71440c1d01a5a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/640410b32995914bde3eed26fa89552f9c2c082f", - "reference": "640410b32995914bde3eed26fa89552f9c2c082f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/707c2aed5d8d0075666e673a5e71440c1d01a5a3", + "reference": "707c2aed5d8d0075666e673a5e71440c1d01a5a3", "shasum": "" }, "require": { @@ -4486,7 +4487,7 @@ "type": "github" } ], - "time": "2024-08-08T09:02:50+00:00" + "time": "2024-08-19T14:37:29+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -4861,16 +4862,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.29", + "version": "10.5.30", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "8e9e80872b4e8064401788ee8a32d40b4455318f" + "reference": "b15524febac0153876b4ba9aab3326c2ee94c897" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8e9e80872b4e8064401788ee8a32d40b4455318f", - "reference": "8e9e80872b4e8064401788ee8a32d40b4455318f", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b15524febac0153876b4ba9aab3326c2ee94c897", + "reference": "b15524febac0153876b4ba9aab3326c2ee94c897", "shasum": "" }, "require": { @@ -4891,7 +4892,7 @@ "phpunit/php-timer": "^6.0.0", "sebastian/cli-parser": "^2.0.1", "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.1", + "sebastian/comparator": "^5.0.2", "sebastian/diff": "^5.1.1", "sebastian/environment": "^6.1.0", "sebastian/exporter": "^5.1.2", @@ -4942,7 +4943,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.29" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.30" }, "funding": [ { @@ -4958,7 +4959,7 @@ "type": "tidelift" } ], - "time": "2024-07-30T11:08:00+00:00" + "time": "2024-08-13T06:09:37+00:00" }, { "name": "predis/predis", @@ -5191,16 +5192,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.1", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", + "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53", "shasum": "" }, "require": { @@ -5211,7 +5212,7 @@ "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.3" + "phpunit/phpunit": "^10.4" }, "type": "library", "extra": { @@ -5256,7 +5257,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.2" }, "funding": [ { @@ -5264,7 +5265,7 @@ "type": "github" } ], - "time": "2023-08-14T13:18:12+00:00" + "time": "2024-08-12T06:03:08+00:00" }, { "name": "sebastian/complexity", @@ -5995,16 +5996,16 @@ }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.7.9", + "version": "v1.7.10", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "e558ba55eefbbcca1bf13c7cfe19c7af5a62fe1c" + "reference": "157dbad53f1fc10610b23e9457eec20d0e4ad5aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/e558ba55eefbbcca1bf13c7cfe19c7af5a62fe1c", - "reference": "e558ba55eefbbcca1bf13c7cfe19c7af5a62fe1c", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/157dbad53f1fc10610b23e9457eec20d0e4ad5aa", + "reference": "157dbad53f1fc10610b23e9457eec20d0e4ad5aa", "shasum": "" }, "require": { @@ -6045,7 +6046,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2024-07-22T19:15:29+00:00" + "time": "2024-08-19T08:33:29+00:00" }, { "name": "slevomat/coding-standard", diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index fdee58c431..ad04139862 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -7,7 +7,7 @@ See the [upgrade notes](https://simplesamlphp.org/docs/stable/simplesamlphp-upgr ## Version 2.3.0 -Released TBD +Released 2024-08-20 * The SubjectID authproc-filter now has a new option `hashed`, which if set to true will automatically hash the unique part of the ID. This will also automatically @@ -15,12 +15,13 @@ Released TBD * Add microsecond support to the FileLoggingHandler (#2084) * Session ID's are now hashed when stored in a database (#2106) * Improved HTML 5 compatibility (#2162) -* Fix: preloaded resource not used (#2207) +* Fix: preloaded resource not used (#2207) `authorize` * Feature: allow a user to reauthenticate with a different account (simplesamlphp/simplesamlphp-module-authorize#17) (v1.5.0) * Feature: show user what account he's using when authorization fails (simplesamlphp/simplesamlphp-module-authorize#20) (v1.6.0) +* Fix: fix faulty translation (v1.6.1) `consent` @@ -32,10 +33,93 @@ Released TBD `sqlauth` -* Add multi-query support (simplesamlphp/simplesamlphp-module-sqlauth#9) (v1.2.0) * Add username_regex option - run regular expression over username before querying the database (simplesamlphp/simplesamlphp-module-sqlauth#11) (v1.3.0) +## Version 2.2.3 + +Released 2024-08-20 + +* Added a missing use-statement that would cause a 'class not found' exception. +* Improved Luxembourgish (LB) translations (#2129, #2140) +* Fix regression introduced in v2.2.2 regarding autofilling usernames. +* Restore the possibility to set `trusted.url.domains` to null +* Improved documentation on cachedir-setting (#2153) +* Fix bug in post.twig (#2161) +* Fix MDQ cache file bugs (#2200) + +`adfs` + +* Fixed metadata download to become a proper xml-file +* Prevent metadata-download from ever being cached + +`authorize` + +* Fixed logout button (simplesamlphp/simplesamlphp-module-authorize#16) (v1.4.1) + +`ldap` + +* Fixed a bug that would throw an unhandled exception to the user if they would enter + a non-existing organization and `username_organization_method` is set to `allow` or `force` (v2.3.6). + +`metarefresh` + +* Fixed incorrect parsing of configuration (v1.2.2) + +`radius` + +* Fixed security bug known as Blast-Radius (CVE-2024-3596) (simplesamlphp/simplesamlphp-module-radius#10) (v2.0.2) + +## Version 2.2.2 + +:warning: IMPORTANT NOTE :warning: + +Due to a mistake, this bugfix-release can turn out to become a backwards-incompatibility for those who override the loginuserpass.twig in their custom theme. +Please update your theme to reflect the changes in [this commit](https://github.com/simplesamlphp/simplesamlphp/pull/2022/commits/691199e9b963a2861d731e6583555c7a8df39992) before updating. + +Released 2024-04-30 + +* Fix regression when setting the host-variable in `saml20-idp-hosted` (was #1922) +* Fix posting the form to the incorrect endpoint when using an authsource based on UserPassOrgBase (#2022) +* Fix RequestedAuthnContextSelector for case with multiple RACs in request +* Add xml opening-tag to SP-metadata for consistency with IdP-metadata (#2048) +* Fixed a PHP 8.3 compliance issue in the logout handler (#2047) +* Improve parsing of base64-encoded strings +* Autofill username when Entra ID hints it in the HTTP parameters + +`admin` + +* Set custom security header to properly display phpinfo-page +* Hide file-upload button for metadata-converter if uploads are disabled at PHP-level + +`exampleauth` + +* Fix controller for External-authsource + +`ldap` + +* Fix exception being thrown when password is empty + +`saml2 library` + +Fixed a bug where base64 encoded strings were not decoded using the `strict` flag, leading +to an incorrect error message. + +`sqlauth` + +* Add username_regex option (simplesamlphp/simplesamlphp-module-sqlauth#11) (v1.3.0) + +## Version 2.2.1 + +Released 2014-03-17 + +* Fix regression in bin/initMDSPdo.php (was #1892) +* Fix regression in translations, causing a fallback to English (#2009 + #2010) + +`sqlauth` + +* Add multi-query support (simplesamlphp/simplesamlphp-module-sqlauth#9) (v1.2.0) + ## Version 2.2.0 Released 2024-03-08 From 644dfb46edf58e03d249d351e22bcac23aafc3aa Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 21 Aug 2024 22:00:46 +0200 Subject: [PATCH 150/532] Prepare 2.4-branch --- composer.json | 4 +-- composer.lock | 46 ++++++++++++++++---------------- docs/simplesamlphp-changelog.md | 4 +++ extra/simplesamlphp.spec | 2 +- src/SimpleSAML/Configuration.php | 2 +- 5 files changed, 31 insertions(+), 27 deletions(-) diff --git a/composer.json b/composer.json index 4f766a691a..9028ee773c 100644 --- a/composer.json +++ b/composer.json @@ -122,12 +122,12 @@ }, "extra": { "branch-alias": { - "dev-master": "2.4.0.x-dev" + "dev-master": "2.5.0.x-dev" } }, "scripts": { "translations:unused": "php bin/translations translations:unused", "translations:update:translatable": "php bin/translations translations:update:translatable" }, - "version": "v2.3.0" + "version": "v2.4.0" } diff --git a/composer.lock b/composer.lock index 964cf3f8a8..038b0a5b04 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d7fd451e223bbeefa23ea28e2b09064c", + "content-hash": "7da0efae46772d1ad15a50857f3dc769", "packages": [ { "name": "gettext/gettext", @@ -655,16 +655,16 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "79dff0b268932c640297f5208d6298f71855c03e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/79dff0b268932c640297f5208d6298f71855c03e", + "reference": "79dff0b268932c640297f5208d6298f71855c03e", "shasum": "" }, "require": { @@ -699,9 +699,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.1" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-08-21T13:31:24+00:00" }, { "name": "robrichards/xmlseclibs", @@ -4541,32 +4541,32 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.15", + "version": "10.1.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-text-template": "^3.0", - "sebastian/code-unit-reverse-lookup": "^3.0", - "sebastian/complexity": "^3.0", - "sebastian/environment": "^6.0", - "sebastian/lines-of-code": "^2.0", - "sebastian/version": "^4.0", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { "phpunit/phpunit": "^10.1" @@ -4578,7 +4578,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "10.1.x-dev" } }, "autoload": { @@ -4607,7 +4607,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" }, "funding": [ { @@ -4615,7 +4615,7 @@ "type": "github" } ], - "time": "2024-06-29T08:25:15+00:00" + "time": "2024-08-22T04:31:57+00:00" }, { "name": "phpunit/php-file-iterator", diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index ad04139862..e0cd1d183c 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -5,6 +5,10 @@ This document lists the changes between versions of SimpleSAMLphp. See the [upgrade notes](https://simplesamlphp.org/docs/stable/simplesamlphp-upgrade-notes.html) for specific information about upgrading. +## Version 2.4.0 + +Released TBD + ## Version 2.3.0 Released 2024-08-20 diff --git a/extra/simplesamlphp.spec b/extra/simplesamlphp.spec index 2eea97ef29..039686da62 100644 --- a/extra/simplesamlphp.spec +++ b/extra/simplesamlphp.spec @@ -1,6 +1,6 @@ %define name simplesamlphp %define summary SAML IDP/SP written in PHP -%define version 2.3.0 +%define version 2.4.0 %define release 1 %define license LGPL 2.1 %define group Networking/WWW diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index dca0449732..0690ae6bd1 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -42,7 +42,7 @@ class Configuration implements Utils\ClearableState /** * The release version of this package */ - public const VERSION = '2.3.0'; + public const VERSION = '2.4.0'; /** * A default value which means that the given option is required. From acfa7e96496198ff3f4854b6578ff350cef965ae Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 22 Aug 2024 20:33:36 +0200 Subject: [PATCH 151/532] Add link to 2.3 upgrade notes --- docs/simplesamlphp-upgrade-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/simplesamlphp-upgrade-notes.md b/docs/simplesamlphp-upgrade-notes.md index 40bc5a1b65..c524835f90 100644 --- a/docs/simplesamlphp-upgrade-notes.md +++ b/docs/simplesamlphp-upgrade-notes.md @@ -3,6 +3,7 @@ See the following pages for important information for users upgrading from older versions of SimpleSAMLphp: +* [Upgrade notes for version 2.3](simplesamlphp-upgrade-notes-2.3) * [Upgrade notes for version 2.2](simplesamlphp-upgrade-notes-2.2) * [Upgrade notes for version 2.1](simplesamlphp-upgrade-notes-2.1) * [Upgrade notes for version 2.0](simplesamlphp-upgrade-notes-2.0) From 99c5458da11a205af0a390d323d51c4f92367a3c Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 22 Aug 2024 20:57:36 +0200 Subject: [PATCH 152/532] Upgrade changelog, upgrade notes & docs --- docs/simplesamlphp-changelog.md | 1 + docs/simplesamlphp-install.md | 6 ++---- docs/simplesamlphp-upgrade-notes-2.3.md | 5 +++++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index ad04139862..b4acb16f11 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -16,6 +16,7 @@ Released 2024-08-20 * Session ID's are now hashed when stored in a database (#2106) * Improved HTML 5 compatibility (#2162) * Fix: preloaded resource not used (#2207) +* BC-break (unintentional): plain-text admin-password are no longer allowed (#2113) `authorize` diff --git a/docs/simplesamlphp-install.md b/docs/simplesamlphp-install.md index b9e72ceadd..8d1530e615 100644 --- a/docs/simplesamlphp-install.md +++ b/docs/simplesamlphp-install.md @@ -221,10 +221,8 @@ There are a few steps that you should complete in the main configuration file, ` **ignores** the `X-Forwarded-*` set of headers that your proxy might be setting, so **do not rely on those**. * Set an administrator password. This is needed to access some of the pages in your SimpleSAMLphp installation web - interface. - - Hashed passwords can also be used here. See the [`authcrypt`](./authcrypt:authcrypt) documentation - for more information. + interface. Plain-text passwords are not allowed, but you can generate a safe password-hash using the `bin/pwgen.php` + script. ```php 'auth.adminpassword' => 'setnewpasswordhere', diff --git a/docs/simplesamlphp-upgrade-notes-2.3.md b/docs/simplesamlphp-upgrade-notes-2.3.md index 596bbdf11a..7d9e374651 100644 --- a/docs/simplesamlphp-upgrade-notes-2.3.md +++ b/docs/simplesamlphp-upgrade-notes-2.3.md @@ -29,3 +29,8 @@ The following methods were marked `deprecated` and will be removed in a next maj The following properties were marked `deprecated` and will be removed in a next major release. - SimpleSAML\Locale\Language::$language_names - Use \Symfony\Component\Intl\Languages::getNames() instead + +## BC break + +Plain-text admin-passwords are no longer allowed. +Please use the `bin/pwgen.php` script to generate a secure password hash. From e73f4e9a8e47eddb75e855d233b94777a8ed6c63 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 23 Aug 2024 10:30:27 +0200 Subject: [PATCH 153/532] Add the possibility to continue if no encryption cert is available (#2208) --- docs/simplesamlphp-changelog.md | 3 +++ docs/simplesamlphp-reference-idp-hosted.md | 9 ++++++++- modules/saml/src/IdP/SAML2.php | 4 +++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index e0cd1d183c..d0e3bd7a33 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -9,6 +9,9 @@ See the [upgrade notes](https://simplesamlphp.org/docs/stable/simplesamlphp-upgr Released TBD +* Added a new feature flag `encryption.optional` to allow unencrypted assertions if the SP does + not provide an encryption certificate (#2208) + ## Version 2.3.0 Released 2024-08-20 diff --git a/docs/simplesamlphp-reference-idp-hosted.md b/docs/simplesamlphp-reference-idp-hosted.md index cfe494cfc5..4871780ced 100644 --- a/docs/simplesamlphp-reference-idp-hosted.md +++ b/docs/simplesamlphp-reference-idp-hosted.md @@ -138,10 +138,13 @@ The following SAML 2.0 options are available: `assertion.encryption` : Whether assertions sent from this IdP should be encrypted. The default - value is `FALSE`. + value is `FALSE`. When set to `TRUE` encryption will be enforced for all + remote SP's and an exception is thrown if encryption fails. : Note that this option can be set for each SP in the SP-remote metadata. +: Note that enforcement can be disabled by setting `encryption.optional` to `TRUE`. + `attributeencodings` : What encoding should be used for the different attributes. This is an array which maps attribute names to attribute encodings. There @@ -186,6 +189,10 @@ The following SAML 2.0 options are available: any value in the SP-remote metadata overrides the one configured in the IdP metadata. +`encryption.optional` +: Whether or not we may continue to send an unencrypted assertion if the SP has no encryption certificate. + The default value is `FALSE`. + `encryption.blacklisted-algorithms` : Blacklisted encryption algorithms. This is an array containing the algorithm identifiers. diff --git a/modules/saml/src/IdP/SAML2.php b/modules/saml/src/IdP/SAML2.php index 9fc88c8d38..6f0c0e2935 100644 --- a/modules/saml/src/IdP/SAML2.php +++ b/modules/saml/src/IdP/SAML2.php @@ -1342,7 +1342,7 @@ private static function encryptAssertion( Configuration $idpMetadata, Configuration $spMetadata, Assertion $assertion, - ) { + ): Assertion|EncryptedAssertion { $encryptAssertion = $spMetadata->getOptionalBoolean('assertion.encryption', null); if ($encryptAssertion === null) { $encryptAssertion = $idpMetadata->getOptionalBoolean('assertion.encryption', false); @@ -1380,6 +1380,8 @@ private static function encryptAssertion( // extract the public key from the certificate for encryption $key = new XMLSecurityKey(XMLSecurityKey::RSA_OAEP_MGF1P, ['type' => 'public']); $key->loadKey($pemKey); + } elseif ($idpMetadata->getOptionalBoolean('encryption.optional', false) === true) { + return $assertion; } else { throw new Error\ConfigurationError( 'Missing encryption key for entity `' . $spMetadata->getString('entityid') . '`', From c78a595cb7c12f9a0c6682ed9e0535495aefc681 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 24 Aug 2024 00:37:55 +0200 Subject: [PATCH 154/532] Bugfix: Fix regression in language codes (#2215) * Use Locales instead of Languages * Rename locales to match ISO-standard * Add upgrade note --- config/config.php.dist | 2 +- docs/simplesamlphp-upgrade-notes-2.3.md | 8 ++++++++ src/SimpleSAML/Locale/Language.php | 14 ++++++-------- src/SimpleSAML/Locale/Localization.php | 2 +- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/config/config.php.dist b/config/config.php.dist index e7fbcc75aa..b7f9ef4e21 100644 --- a/config/config.php.dist +++ b/config/config.php.dist @@ -821,7 +821,7 @@ $config = [ */ 'language.available' => [ 'en', 'no', 'nn', 'se', 'da', 'de', 'sv', 'fi', 'es', 'ca', 'fr', 'it', 'nl', 'lb', - 'cs', 'sk', 'sl', 'lt', 'hr', 'hu', 'pl', 'pt', 'pt-br', 'tr', 'ja', 'zh', 'zh-tw', + 'cs', 'sk', 'sl', 'lt', 'hr', 'hu', 'pl', 'pt', 'pt_BR', 'tr', 'ja', 'zh', 'zh_TW', 'ru', 'et', 'he', 'id', 'sr', 'lv', 'ro', 'eu', 'el', 'af', 'zu', 'xh', 'st', ], 'language.rtl' => ['ar', 'dv', 'fa', 'ur', 'he'], diff --git a/docs/simplesamlphp-upgrade-notes-2.3.md b/docs/simplesamlphp-upgrade-notes-2.3.md index 596bbdf11a..3768056b1c 100644 --- a/docs/simplesamlphp-upgrade-notes-2.3.md +++ b/docs/simplesamlphp-upgrade-notes-2.3.md @@ -29,3 +29,11 @@ The following methods were marked `deprecated` and will be removed in a next maj The following properties were marked `deprecated` and will be removed in a next major release. - SimpleSAML\Locale\Language::$language_names - Use \Symfony\Component\Intl\Languages::getNames() instead + +## BC break + +- Plain-text admin-passwords are no longer allowed. + Please use the `bin/pwgen.php` script to generate a secure password hash. + +- The language codes `pt-br` and `zh-tw` have been renamed to `pt_BR` and `zh_TW`. + Please update your configuration to match the new names. diff --git a/src/SimpleSAML/Locale/Language.php b/src/SimpleSAML/Locale/Language.php index 11e33d25bd..6b0ef347c5 100644 --- a/src/SimpleSAML/Locale/Language.php +++ b/src/SimpleSAML/Locale/Language.php @@ -10,10 +10,8 @@ namespace SimpleSAML\Locale; -use SimpleSAML\Configuration; -use SimpleSAML\Logger; -use SimpleSAML\Utils; -use Symfony\Component\Intl\Languages; +use SimpleSAML\{Configuration, Logger, Utils}; +use Symfony\Component\Intl\Locales; class Language { @@ -164,7 +162,7 @@ public function __construct( /** * Filter configured (available) languages against installed languages. * - * @return string[] The set of languages both in 'language.available' and Languages::getNames(). + * @return string[] The set of languages both in 'language.available' and Locales::getNames(). */ private function getInstalledLanguages(): array { @@ -174,7 +172,7 @@ private function getInstalledLanguages(): array ); $availableLanguages = []; foreach ($configuredAvailableLanguages as $code) { - if (Languages::exists($code)) { + if (Locales::exists($code)) { $availableLanguages[] = $code; } else { Logger::error("Language \"$code\" not installed. Check config."); @@ -269,8 +267,8 @@ public function getLanguage(): string */ public function getLanguageLocalizedName(string $code): ?string { - if (Languages::exists($code)) { - return Languages::getName($code); + if (Locales::exists($code)) { + return Locales::getName($code); } Logger::error("Name for language \"$code\" not found. Check config."); return null; diff --git a/src/SimpleSAML/Locale/Localization.php b/src/SimpleSAML/Locale/Localization.php index 037a301db8..ff020381d6 100644 --- a/src/SimpleSAML/Locale/Localization.php +++ b/src/SimpleSAML/Locale/Localization.php @@ -16,8 +16,8 @@ use Gettext\Loader\PoLoader; use Gettext\{Translations, Translator, TranslatorFunctions}; use SimpleSAML\{Configuration, Logger}; -use Symfony\Component\HttpFoundation\File\File; use SimpleSAML\Locale\Translate; +use Symfony\Component\HttpFoundation\File\File; class Localization { From 924e2cef2fcb16727bb9e26d7a4b478859ccac25 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 24 Aug 2024 00:37:55 +0200 Subject: [PATCH 155/532] Bugfix: Fix regression in language codes (#2215) * Use Locales instead of Languages * Rename locales to match ISO-standard * Add upgrade note --- config/config.php.dist | 2 +- docs/simplesamlphp-upgrade-notes-2.3.md | 7 +++++-- src/SimpleSAML/Locale/Language.php | 14 ++++++-------- src/SimpleSAML/Locale/Localization.php | 2 +- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/config/config.php.dist b/config/config.php.dist index e7fbcc75aa..b7f9ef4e21 100644 --- a/config/config.php.dist +++ b/config/config.php.dist @@ -821,7 +821,7 @@ $config = [ */ 'language.available' => [ 'en', 'no', 'nn', 'se', 'da', 'de', 'sv', 'fi', 'es', 'ca', 'fr', 'it', 'nl', 'lb', - 'cs', 'sk', 'sl', 'lt', 'hr', 'hu', 'pl', 'pt', 'pt-br', 'tr', 'ja', 'zh', 'zh-tw', + 'cs', 'sk', 'sl', 'lt', 'hr', 'hu', 'pl', 'pt', 'pt_BR', 'tr', 'ja', 'zh', 'zh_TW', 'ru', 'et', 'he', 'id', 'sr', 'lv', 'ro', 'eu', 'el', 'af', 'zu', 'xh', 'st', ], 'language.rtl' => ['ar', 'dv', 'fa', 'ur', 'he'], diff --git a/docs/simplesamlphp-upgrade-notes-2.3.md b/docs/simplesamlphp-upgrade-notes-2.3.md index 7d9e374651..3768056b1c 100644 --- a/docs/simplesamlphp-upgrade-notes-2.3.md +++ b/docs/simplesamlphp-upgrade-notes-2.3.md @@ -32,5 +32,8 @@ The following properties were marked `deprecated` and will be removed in a next ## BC break -Plain-text admin-passwords are no longer allowed. -Please use the `bin/pwgen.php` script to generate a secure password hash. +- Plain-text admin-passwords are no longer allowed. + Please use the `bin/pwgen.php` script to generate a secure password hash. + +- The language codes `pt-br` and `zh-tw` have been renamed to `pt_BR` and `zh_TW`. + Please update your configuration to match the new names. diff --git a/src/SimpleSAML/Locale/Language.php b/src/SimpleSAML/Locale/Language.php index 11e33d25bd..6b0ef347c5 100644 --- a/src/SimpleSAML/Locale/Language.php +++ b/src/SimpleSAML/Locale/Language.php @@ -10,10 +10,8 @@ namespace SimpleSAML\Locale; -use SimpleSAML\Configuration; -use SimpleSAML\Logger; -use SimpleSAML\Utils; -use Symfony\Component\Intl\Languages; +use SimpleSAML\{Configuration, Logger, Utils}; +use Symfony\Component\Intl\Locales; class Language { @@ -164,7 +162,7 @@ public function __construct( /** * Filter configured (available) languages against installed languages. * - * @return string[] The set of languages both in 'language.available' and Languages::getNames(). + * @return string[] The set of languages both in 'language.available' and Locales::getNames(). */ private function getInstalledLanguages(): array { @@ -174,7 +172,7 @@ private function getInstalledLanguages(): array ); $availableLanguages = []; foreach ($configuredAvailableLanguages as $code) { - if (Languages::exists($code)) { + if (Locales::exists($code)) { $availableLanguages[] = $code; } else { Logger::error("Language \"$code\" not installed. Check config."); @@ -269,8 +267,8 @@ public function getLanguage(): string */ public function getLanguageLocalizedName(string $code): ?string { - if (Languages::exists($code)) { - return Languages::getName($code); + if (Locales::exists($code)) { + return Locales::getName($code); } Logger::error("Name for language \"$code\" not found. Check config."); return null; diff --git a/src/SimpleSAML/Locale/Localization.php b/src/SimpleSAML/Locale/Localization.php index 037a301db8..ff020381d6 100644 --- a/src/SimpleSAML/Locale/Localization.php +++ b/src/SimpleSAML/Locale/Localization.php @@ -16,8 +16,8 @@ use Gettext\Loader\PoLoader; use Gettext\{Translations, Translator, TranslatorFunctions}; use SimpleSAML\{Configuration, Logger}; -use Symfony\Component\HttpFoundation\File\File; use SimpleSAML\Locale\Translate; +use Symfony\Component\HttpFoundation\File\File; class Localization { From c2a334dad64faa1e8208e19642920f48db49e7c1 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 24 Aug 2024 15:31:13 +0200 Subject: [PATCH 156/532] Remove strtolower: Symfony handles locales codes case-sensitive --- src/SimpleSAML/XHTML/Template.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/SimpleSAML/XHTML/Template.php b/src/SimpleSAML/XHTML/Template.php index 6581f9493f..9316d33be6 100644 --- a/src/SimpleSAML/XHTML/Template.php +++ b/src/SimpleSAML/XHTML/Template.php @@ -42,7 +42,6 @@ use function key; use function ksort; use function strripos; -use function strtolower; use function strval; use function substr; @@ -472,7 +471,6 @@ private function generateLanguageBar(): ?array $parameterName = $this->getTranslator()->getLanguage()->getLanguageParameterName(); $langmap = []; foreach ($languages as $lang => $current) { - $lang = strtolower($lang); $langname = $this->translator->getLanguage()->getLanguageLocalizedName($lang); $url = false; if (!$current) { From ec8fb2d8aa2bbd1c63a720d00711d023515174cd Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 24 Aug 2024 15:31:35 +0200 Subject: [PATCH 157/532] Remove strtolower: Symfony handles locales codes case-sensitive --- src/SimpleSAML/XHTML/Template.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/SimpleSAML/XHTML/Template.php b/src/SimpleSAML/XHTML/Template.php index 6581f9493f..9316d33be6 100644 --- a/src/SimpleSAML/XHTML/Template.php +++ b/src/SimpleSAML/XHTML/Template.php @@ -42,7 +42,6 @@ use function key; use function ksort; use function strripos; -use function strtolower; use function strval; use function substr; @@ -472,7 +471,6 @@ private function generateLanguageBar(): ?array $parameterName = $this->getTranslator()->getLanguage()->getLanguageParameterName(); $langmap = []; foreach ($languages as $lang => $current) { - $lang = strtolower($lang); $langname = $this->translator->getLanguage()->getLanguageLocalizedName($lang); $url = false; if (!$current) { From 64d097314d0335f4fec0bc38bcbe7102aa9e87e3 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 24 Aug 2024 15:32:50 +0200 Subject: [PATCH 158/532] Retain backwards compatibility --- src/SimpleSAML/Locale/Language.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/SimpleSAML/Locale/Language.php b/src/SimpleSAML/Locale/Language.php index 6b0ef347c5..9350171dea 100644 --- a/src/SimpleSAML/Locale/Language.php +++ b/src/SimpleSAML/Locale/Language.php @@ -170,6 +170,23 @@ private function getInstalledLanguages(): array 'language.available', [self::FALLBACKLANGUAGE], ); + + // @deprecated - remove entire if-block in a new major release + if (array_intersect(['pt-br', 'zh-tw'], $configuredAvailableLanguages)) { + Logger::warning( + "Deprecated locales found in `language.available`. " + . "Please replace 'pt-br' with 'pt_BR' and 'zh-tw' with 'zh_TW'.", + ); + + if (($i = array_search('pt-br', $configuredAvailableLanguages)) !== false) { + $configuredAvailableLanguages[$i] = 'pt_BR'; + } + + if (($i = array_search('zh-tw', $configuredAvailableLanguages)) !== false) { + $configuredAvailableLanguages[$i] = 'zh_TW'; + } + } + $availableLanguages = []; foreach ($configuredAvailableLanguages as $code) { if (Locales::exists($code)) { From d86989636ad687d8861dd46e5ecce2a84043e832 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 24 Aug 2024 15:32:50 +0200 Subject: [PATCH 159/532] Retain backwards compatibility --- src/SimpleSAML/Locale/Language.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/SimpleSAML/Locale/Language.php b/src/SimpleSAML/Locale/Language.php index 6b0ef347c5..9350171dea 100644 --- a/src/SimpleSAML/Locale/Language.php +++ b/src/SimpleSAML/Locale/Language.php @@ -170,6 +170,23 @@ private function getInstalledLanguages(): array 'language.available', [self::FALLBACKLANGUAGE], ); + + // @deprecated - remove entire if-block in a new major release + if (array_intersect(['pt-br', 'zh-tw'], $configuredAvailableLanguages)) { + Logger::warning( + "Deprecated locales found in `language.available`. " + . "Please replace 'pt-br' with 'pt_BR' and 'zh-tw' with 'zh_TW'.", + ); + + if (($i = array_search('pt-br', $configuredAvailableLanguages)) !== false) { + $configuredAvailableLanguages[$i] = 'pt_BR'; + } + + if (($i = array_search('zh-tw', $configuredAvailableLanguages)) !== false) { + $configuredAvailableLanguages[$i] = 'zh_TW'; + } + } + $availableLanguages = []; foreach ($configuredAvailableLanguages as $code) { if (Locales::exists($code)) { From aebdc194a33b6e9dd9928627987cc001c902f587 Mon Sep 17 00:00:00 2001 From: Ioannis Igoumenos <3846025+ioigoume@users.noreply.github.com> Date: Mon, 26 Aug 2024 21:30:49 +0300 Subject: [PATCH 160/532] ob_end_clean() on configuration file parsing error (#2219) --- src/SimpleSAML/Configuration.php | 22 ++++++++---------- tests/src/SimpleSAML/ConfigurationTest.php | 27 ++++++++++++++++++++++ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index dca0449732..319d3cad69 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -18,7 +18,6 @@ use function array_keys; use function dirname; use function file_exists; -use function interface_exists; use function is_array; use function is_int; use function is_null; @@ -154,21 +153,18 @@ private static function loadFromFile(string $filename, bool $required): Configur $config = 'UNINITIALIZED'; // the file initializes a variable named '$config' - ob_start(); - if (interface_exists('Throwable', false)) { - try { - $returnedConfig = require($filename); - } catch (ParseError $e) { - self::$loadedConfigs[$filename] = self::loadFromArray([], '[ARRAY]', 'simplesaml'); - throw new Error\ConfigurationError($e->getMessage(), $filename, []); - } - } else { + try { + ob_start(); $returnedConfig = require($filename); + var_export($returnedConfig, true); + $spurious_output = ob_get_length() > 0; + } catch (ParseError $e) { + self::$loadedConfigs[$filename] = self::loadFromArray([], '[ARRAY]', 'simplesaml'); + throw new Error\ConfigurationError($e->getMessage(), $filename, []); + } finally { + ob_end_clean(); } - $spurious_output = ob_get_length() > 0; - ob_end_clean(); - // Check if the config file actually returned an array instead of defining $config variable. if (is_array($returnedConfig)) { $config = $returnedConfig; diff --git a/tests/src/SimpleSAML/ConfigurationTest.php b/tests/src/SimpleSAML/ConfigurationTest.php index 424f28a9c1..f0ee645693 100644 --- a/tests/src/SimpleSAML/ConfigurationTest.php +++ b/tests/src/SimpleSAML/ConfigurationTest.php @@ -1067,6 +1067,10 @@ public function testGetConfigNonexistentFilePreload(): void } + /** + * @return void + * @throws Exception + */ public function testCanLoadDefinedConfigFromFile(): void { $testConfigDir = dirname(__FILE__, 3) . DIRECTORY_SEPARATOR . 'config'; @@ -1077,6 +1081,10 @@ public function testCanLoadDefinedConfigFromFile(): void } + /** + * @return void + * @throws Exception + */ public function testCanLoadReturnedConfigFromFile(): void { $testConfigDir = dirname(__FILE__, 3) . DIRECTORY_SEPARATOR . 'config'; @@ -1086,6 +1094,25 @@ public function testCanLoadReturnedConfigFromFile(): void $this->assertArrayHasKey('returned', $config->toArray()); } + /** + * @return void + * @throws Exception + */ + public function testLoadFromFileConfigurationError(): void + { + $virtualFile = 'nonexistent-preload.php'; + $tmpfname = tempnam('/tmp', $virtualFile); + + $handle = fopen($tmpfname, 'wb'); + fwrite($handle, 'writing to tempfile'); + fclose($handle); + + $this->expectException(Error\ConfigurationError::class); + Configuration::getConfig($tmpfname); + + unlink($tmpfname); + } + /** * Test that Configuration objects can be initialized from an array. From c49ced231cd19273dd0b2a498dd3b6a5ae96d99e Mon Sep 17 00:00:00 2001 From: Ioannis Igoumenos <3846025+ioigoume@users.noreply.github.com> Date: Mon, 26 Aug 2024 21:30:49 +0300 Subject: [PATCH 161/532] ob_end_clean() on configuration file parsing error (#2219) --- src/SimpleSAML/Configuration.php | 22 ++++++++---------- tests/src/SimpleSAML/ConfigurationTest.php | 27 ++++++++++++++++++++++ 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index 0690ae6bd1..deae111b53 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -18,7 +18,6 @@ use function array_keys; use function dirname; use function file_exists; -use function interface_exists; use function is_array; use function is_int; use function is_null; @@ -154,21 +153,18 @@ private static function loadFromFile(string $filename, bool $required): Configur $config = 'UNINITIALIZED'; // the file initializes a variable named '$config' - ob_start(); - if (interface_exists('Throwable', false)) { - try { - $returnedConfig = require($filename); - } catch (ParseError $e) { - self::$loadedConfigs[$filename] = self::loadFromArray([], '[ARRAY]', 'simplesaml'); - throw new Error\ConfigurationError($e->getMessage(), $filename, []); - } - } else { + try { + ob_start(); $returnedConfig = require($filename); + var_export($returnedConfig, true); + $spurious_output = ob_get_length() > 0; + } catch (ParseError $e) { + self::$loadedConfigs[$filename] = self::loadFromArray([], '[ARRAY]', 'simplesaml'); + throw new Error\ConfigurationError($e->getMessage(), $filename, []); + } finally { + ob_end_clean(); } - $spurious_output = ob_get_length() > 0; - ob_end_clean(); - // Check if the config file actually returned an array instead of defining $config variable. if (is_array($returnedConfig)) { $config = $returnedConfig; diff --git a/tests/src/SimpleSAML/ConfigurationTest.php b/tests/src/SimpleSAML/ConfigurationTest.php index 424f28a9c1..f0ee645693 100644 --- a/tests/src/SimpleSAML/ConfigurationTest.php +++ b/tests/src/SimpleSAML/ConfigurationTest.php @@ -1067,6 +1067,10 @@ public function testGetConfigNonexistentFilePreload(): void } + /** + * @return void + * @throws Exception + */ public function testCanLoadDefinedConfigFromFile(): void { $testConfigDir = dirname(__FILE__, 3) . DIRECTORY_SEPARATOR . 'config'; @@ -1077,6 +1081,10 @@ public function testCanLoadDefinedConfigFromFile(): void } + /** + * @return void + * @throws Exception + */ public function testCanLoadReturnedConfigFromFile(): void { $testConfigDir = dirname(__FILE__, 3) . DIRECTORY_SEPARATOR . 'config'; @@ -1086,6 +1094,25 @@ public function testCanLoadReturnedConfigFromFile(): void $this->assertArrayHasKey('returned', $config->toArray()); } + /** + * @return void + * @throws Exception + */ + public function testLoadFromFileConfigurationError(): void + { + $virtualFile = 'nonexistent-preload.php'; + $tmpfname = tempnam('/tmp', $virtualFile); + + $handle = fopen($tmpfname, 'wb'); + fwrite($handle, 'writing to tempfile'); + fclose($handle); + + $this->expectException(Error\ConfigurationError::class); + Configuration::getConfig($tmpfname); + + unlink($tmpfname); + } + /** * Test that Configuration objects can be initialized from an array. From 023688b50470076e04217726a3618f93e0e82797 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 26 Aug 2024 20:41:15 +0200 Subject: [PATCH 162/532] Update changelog --- docs/simplesamlphp-changelog.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index b4acb16f11..37323da413 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -5,6 +5,14 @@ This document lists the changes between versions of SimpleSAMLphp. See the [upgrade notes](https://simplesamlphp.org/docs/stable/simplesamlphp-upgrade-notes.html) for specific information about upgrading. +## Version 2.3.1 + +Released TBD + +* Fixed accidental backwards incompatibility for plain-text admin passwords (#2212) +* Fixed accidental backwards incompatibility concerning the `pt-br` and `zh-tw` locales (#2216) +* Run ob_end_clean() on configuration file parsing error (#2219) + ## Version 2.3.0 Released 2024-08-20 From 02436e79602ee71c818f33b7fc09cc2d85962577 Mon Sep 17 00:00:00 2001 From: Ioannis Igoumenos <3846025+ioigoume@users.noreply.github.com> Date: Tue, 27 Aug 2024 09:54:13 +0300 Subject: [PATCH 163/532] Remove debug comment (#2220) --- src/SimpleSAML/Configuration.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index 319d3cad69..8a4320a844 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -156,7 +156,6 @@ private static function loadFromFile(string $filename, bool $required): Configur try { ob_start(); $returnedConfig = require($filename); - var_export($returnedConfig, true); $spurious_output = ob_get_length() > 0; } catch (ParseError $e) { self::$loadedConfigs[$filename] = self::loadFromArray([], '[ARRAY]', 'simplesaml'); From 6cca4d78789061ca0f81604e599b1ea00b01e9d8 Mon Sep 17 00:00:00 2001 From: Ioannis Igoumenos <3846025+ioigoume@users.noreply.github.com> Date: Tue, 27 Aug 2024 09:54:13 +0300 Subject: [PATCH 164/532] Remove debug comment (#2220) --- src/SimpleSAML/Configuration.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index deae111b53..17be9a4995 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -156,7 +156,6 @@ private static function loadFromFile(string $filename, bool $required): Configur try { ob_start(); $returnedConfig = require($filename); - var_export($returnedConfig, true); $spurious_output = ob_get_length() > 0; } catch (ParseError $e) { self::$loadedConfigs[$filename] = self::loadFromArray([], '[ARRAY]', 'simplesaml'); From b9e38b9e34a06cf772b19f4573ba0b0cdcbbb5ab Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Tue, 27 Aug 2024 17:31:48 +1000 Subject: [PATCH 165/532] i18n in 2.3 allow Brazilian to be selected again (#2216) * i18n in 2.3 allow Brazilian to be selected again * This is a more special case * break the CI again but with simpler code * Allow CI to complete with no implicit lower case on lang * One more case of strtolower --------- Co-authored-by: Tim van Dijen --- src/SimpleSAML/Locale/Language.php | 3 +-- tests/src/SimpleSAML/Locale/LanguageTest.php | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/SimpleSAML/Locale/Language.php b/src/SimpleSAML/Locale/Language.php index 9350171dea..24718d9b63 100644 --- a/src/SimpleSAML/Locale/Language.php +++ b/src/SimpleSAML/Locale/Language.php @@ -224,7 +224,6 @@ public function getPosixLanguage(string $language): string */ public function setLanguage(string $language, bool $setLanguageCookie = true): void { - $language = strtolower($language); if (in_array($language, $this->availableLanguages, true)) { $this->language = $language; if ($setLanguageCookie === true) { @@ -421,7 +420,7 @@ public static function getLanguageCookie(): ?string $name = $config->getOptionalString('language.cookie.name', 'language'); if (isset($_COOKIE[$name])) { - $language = strtolower($_COOKIE[$name]); + $language = $_COOKIE[$name]; if (in_array($language, $availableLanguages, true)) { return $language; } diff --git a/tests/src/SimpleSAML/Locale/LanguageTest.php b/tests/src/SimpleSAML/Locale/LanguageTest.php index c556fc5d9a..5306f27dce 100644 --- a/tests/src/SimpleSAML/Locale/LanguageTest.php +++ b/tests/src/SimpleSAML/Locale/LanguageTest.php @@ -164,7 +164,7 @@ public function testSetLanguage(): void 'language.parameter.name' => 'xyz', 'language.parameter.setcookie' => false, ], '', 'simplesaml'); - $_GET['xyz'] = 'Es'; // test also that lang code is transformed to lower caps + $_GET['xyz'] = 'es'; $l = new Language($c); $this->assertEquals('es', $l->getLanguage()); From 1918f1652f1bc8f4bbe15ff1600de4f1a6e7846e Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 27 Aug 2024 17:58:49 +0200 Subject: [PATCH 166/532] Fix exception --- modules/core/src/Controller/Login.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/core/src/Controller/Login.php b/modules/core/src/Controller/Login.php index 32a4f1be51..8d9811f43a 100644 --- a/modules/core/src/Controller/Login.php +++ b/modules/core/src/Controller/Login.php @@ -4,7 +4,6 @@ namespace SimpleSAML\Module\core\Controller; -use Exception as BuiltinException; use SimpleSAML\{Auth, Configuration, Error, Module, Utils}; use SimpleSAML\Module\core\Auth\{UserPassBase, UserPassOrgBase}; use SimpleSAML\XHTML\Template; @@ -113,7 +112,7 @@ public function loginuserpass(Request $request): Response /** @var \SimpleSAML\Module\core\Auth\UserPassBase|null $source */ $source = $this->authSource::getById($state[UserPassBase::AUTHID]); if ($source === null) { - throw new BuiltinException( + throw new Error\Exception( 'Could not find authentication source with id ' . $state[UserPassBase::AUTHID], ); } @@ -317,11 +316,11 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou if ($className) { if (in_array($className, self::$registeredErrorCodeClasses)) { if (!class_exists($className)) { - throw new Exception("Could not resolve error class. no class named '$className'."); + throw new Error\Exception("Could not resolve error class. no class named '$className'."); } if (!is_subclass_of($className, ErrorCodes::class)) { - throw new Exception( + throw new Error\Exception( 'Could not resolve error class: The class \'' . $className . '\' isn\'t a subclass of \'' . ErrorCodes::class . '\'.', ); @@ -331,7 +330,7 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou $t->data['errorcodes'] = $obj->getAllErrorCodeMessages(); } else { if ($className != ErrorCodes::class) { - throw new BuiltinException( + throw new Error\Exception( 'The desired error code class is not found or of the wrong type ' . $className, ); } @@ -373,7 +372,7 @@ public function loginuserpassorg(Request $request): Response /** @var \SimpleSAML\Module\core\Auth\UserPassOrgBase $source */ $source = $this->authSource::getById($state[UserPassOrgBase::AUTHID]); if ($source === null) { - throw new BuiltinException( + throw new Error\Exception( 'Could not find authentication source with id ' . $state[UserPassOrgBase::AUTHID], ); } From b9b16b860f797a774c3694dd1ced8f182c1b3ba3 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 27 Aug 2024 17:58:49 +0200 Subject: [PATCH 167/532] Fix exception --- modules/core/src/Controller/Login.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/core/src/Controller/Login.php b/modules/core/src/Controller/Login.php index 32a4f1be51..8d9811f43a 100644 --- a/modules/core/src/Controller/Login.php +++ b/modules/core/src/Controller/Login.php @@ -4,7 +4,6 @@ namespace SimpleSAML\Module\core\Controller; -use Exception as BuiltinException; use SimpleSAML\{Auth, Configuration, Error, Module, Utils}; use SimpleSAML\Module\core\Auth\{UserPassBase, UserPassOrgBase}; use SimpleSAML\XHTML\Template; @@ -113,7 +112,7 @@ public function loginuserpass(Request $request): Response /** @var \SimpleSAML\Module\core\Auth\UserPassBase|null $source */ $source = $this->authSource::getById($state[UserPassBase::AUTHID]); if ($source === null) { - throw new BuiltinException( + throw new Error\Exception( 'Could not find authentication source with id ' . $state[UserPassBase::AUTHID], ); } @@ -317,11 +316,11 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou if ($className) { if (in_array($className, self::$registeredErrorCodeClasses)) { if (!class_exists($className)) { - throw new Exception("Could not resolve error class. no class named '$className'."); + throw new Error\Exception("Could not resolve error class. no class named '$className'."); } if (!is_subclass_of($className, ErrorCodes::class)) { - throw new Exception( + throw new Error\Exception( 'Could not resolve error class: The class \'' . $className . '\' isn\'t a subclass of \'' . ErrorCodes::class . '\'.', ); @@ -331,7 +330,7 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou $t->data['errorcodes'] = $obj->getAllErrorCodeMessages(); } else { if ($className != ErrorCodes::class) { - throw new BuiltinException( + throw new Error\Exception( 'The desired error code class is not found or of the wrong type ' . $className, ); } @@ -373,7 +372,7 @@ public function loginuserpassorg(Request $request): Response /** @var \SimpleSAML\Module\core\Auth\UserPassOrgBase $source */ $source = $this->authSource::getById($state[UserPassOrgBase::AUTHID]); if ($source === null) { - throw new BuiltinException( + throw new Error\Exception( 'Could not find authentication source with id ' . $state[UserPassOrgBase::AUTHID], ); } From b46c8da6f7f69b7fcc7354339e9e4b38617245f6 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 27 Aug 2024 18:39:29 +0200 Subject: [PATCH 168/532] Fix unit test --- tests/src/SimpleSAML/Locale/LanguageTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/SimpleSAML/Locale/LanguageTest.php b/tests/src/SimpleSAML/Locale/LanguageTest.php index 5306f27dce..5a28695597 100644 --- a/tests/src/SimpleSAML/Locale/LanguageTest.php +++ b/tests/src/SimpleSAML/Locale/LanguageTest.php @@ -53,7 +53,7 @@ public function testGetLanguageCookie(): void 'language.available' => ['en', 'es', 'nn'], 'language.cookie.name' => 'xyz', ], '', 'simplesaml'); - $_COOKIE['xyz'] = 'Es'; // test values are converted to lowercase too + $_COOKIE['xyz'] = 'es'; $this->assertEquals('es', Language::getLanguageCookie()); } From 5930652aed7c8a178bee6f25bd75c28f8887811b Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Thu, 29 Aug 2024 08:21:28 +1000 Subject: [PATCH 169/532] v23: allow admin password to be stored in config.php without hashing again (#2222) --- modules/core/src/Auth/Source/AdminPassword.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/core/src/Auth/Source/AdminPassword.php b/modules/core/src/Auth/Source/AdminPassword.php index 652dec5383..996a4cc868 100644 --- a/modules/core/src/Auth/Source/AdminPassword.php +++ b/modules/core/src/Auth/Source/AdminPassword.php @@ -61,6 +61,12 @@ protected function login(string $username, string $password): array $pwinfo = password_get_info($adminPassword); if ($pwinfo['algo'] === null) { + // @deprecated: remove this in the future. + // Continue to allow admin login when the config contains + // a password that is not hashed + if ($adminPassword === $password) { + return ['user' => ['admin']]; + } throw new Error\Error(Error\ErrorCodes::ADMINNOTHASHED); } From c29efa98236deb6ec01c1822f8477d13e12d3c09 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Thu, 29 Aug 2024 08:21:28 +1000 Subject: [PATCH 170/532] v23: allow admin password to be stored in config.php without hashing again (#2222) --- modules/core/src/Auth/Source/AdminPassword.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/core/src/Auth/Source/AdminPassword.php b/modules/core/src/Auth/Source/AdminPassword.php index 652dec5383..996a4cc868 100644 --- a/modules/core/src/Auth/Source/AdminPassword.php +++ b/modules/core/src/Auth/Source/AdminPassword.php @@ -61,6 +61,12 @@ protected function login(string $username, string $password): array $pwinfo = password_get_info($adminPassword); if ($pwinfo['algo'] === null) { + // @deprecated: remove this in the future. + // Continue to allow admin login when the config contains + // a password that is not hashed + if ($adminPassword === $password) { + return ['user' => ['admin']]; + } throw new Error\Error(Error\ErrorCodes::ADMINNOTHASHED); } From a70e7876973924582896ed825e5b1e05e153731d Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 29 Aug 2024 15:40:36 +0200 Subject: [PATCH 171/532] Replace double arrow with assignment --- modules/admin/templates/show_metadata.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/admin/templates/show_metadata.twig b/modules/admin/templates/show_metadata.twig index 24fdc3ea92..a28b0c90b7 100644 --- a/modules/admin/templates/show_metadata.twig +++ b/modules/admin/templates/show_metadata.twig @@ -9,7 +9,7 @@ title="{% trans %}Copy to clipboard{% endtrans %}">
- {#- #}$metadata["{{ entityid }}"] => {{ metadata|escape }};{# -#} + {#- #}$metadata["{{ entityid }}"] = {{ metadata|escape }};{# -#}
From caf9b917342ef1656e5749219a43d126b42a836f Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 29 Aug 2024 15:40:36 +0200 Subject: [PATCH 172/532] Replace double arrow with assignment --- docs/simplesamlphp-changelog.md | 4 ++++ modules/admin/templates/show_metadata.twig | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 37323da413..a28d558d87 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -13,6 +13,10 @@ Released TBD * Fixed accidental backwards incompatibility concerning the `pt-br` and `zh-tw` locales (#2216) * Run ob_end_clean() on configuration file parsing error (#2219) +`admin` + +* Fix metadata-viewer to output a valid PHP array + ## Version 2.3.0 Released 2024-08-20 diff --git a/modules/admin/templates/show_metadata.twig b/modules/admin/templates/show_metadata.twig index 24fdc3ea92..a28b0c90b7 100644 --- a/modules/admin/templates/show_metadata.twig +++ b/modules/admin/templates/show_metadata.twig @@ -9,7 +9,7 @@ title="{% trans %}Copy to clipboard{% endtrans %}">
- {#- #}$metadata["{{ entityid }}"] => {{ metadata|escape }};{# -#} + {#- #}$metadata["{{ entityid }}"] = {{ metadata|escape }};{# -#}
From b7819fe3d746459ec1b580ce900558e4fa281fba Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Sat, 31 Aug 2024 08:53:54 +1000 Subject: [PATCH 173/532] plain text admin password follow-up (#2223) --- docs/simplesamlphp-upgrade-notes-2.3.md | 8 ++++++-- modules/core/src/Auth/Source/AdminPassword.php | 4 ++++ src/SimpleSAML/Logger.php | 9 +++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/simplesamlphp-upgrade-notes-2.3.md b/docs/simplesamlphp-upgrade-notes-2.3.md index 3768056b1c..e4ed8606cc 100644 --- a/docs/simplesamlphp-upgrade-notes-2.3.md +++ b/docs/simplesamlphp-upgrade-notes-2.3.md @@ -32,8 +32,12 @@ The following properties were marked `deprecated` and will be removed in a next ## BC break -- Plain-text admin-passwords are no longer allowed. - Please use the `bin/pwgen.php` script to generate a secure password hash. +- As of 2.3.1+ Plain-text admin-passwords are allowed again. + No change is needed to auth.adminpassword to upgrade from 2.2 to 2.3.1+. + In 2.3.0 only Plain-text admin-passwords were not allowed. + + In either case you might like to use the `bin/pwgen.php` script to + generate a secure password hash for auth.adminpassword. - The language codes `pt-br` and `zh-tw` have been renamed to `pt_BR` and `zh_TW`. Please update your configuration to match the new names. diff --git a/modules/core/src/Auth/Source/AdminPassword.php b/modules/core/src/Auth/Source/AdminPassword.php index 996a4cc868..3ac852979c 100644 --- a/modules/core/src/Auth/Source/AdminPassword.php +++ b/modules/core/src/Auth/Source/AdminPassword.php @@ -6,6 +6,7 @@ use SimpleSAML\Configuration; use SimpleSAML\Error; +use SimpleSAML\Logger; use SimpleSAML\Module\core\Auth\UserPassBase; use Symfony\Component\PasswordHasher\Hasher\NativePasswordHasher; @@ -65,6 +66,9 @@ protected function login(string $username, string $password): array // Continue to allow admin login when the config contains // a password that is not hashed if ($adminPassword === $password) { + Logger::deprecated('Please consider hashing the admin password stored in auth.adminpassword' + . ' in config.php. Using a plain text password in that config setting' + . ' will be removed in the future.'); return ['user' => ['admin']]; } throw new Error\Error(Error\ErrorCodes::ADMINNOTHASHED); diff --git a/src/SimpleSAML/Logger.php b/src/SimpleSAML/Logger.php index ab8b1d66b6..7458374bd3 100644 --- a/src/SimpleSAML/Logger.php +++ b/src/SimpleSAML/Logger.php @@ -207,6 +207,15 @@ public static function warning(string $string): void self::log(self::WARNING, $string); } + /** + * Log a warning about deprecated code. + * + * @param string $string The message to log. + */ + public static function deprecated(string $string): void + { + self::log(self::WARNING, 'DEPRECATION WARNING: ' . $string); + } /** * We reserve the notice level for statistics, so do not use this level for other kind of log messages. From 6d72259fa32d0738b35c55e984d789acbb1cac9d Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Sat, 31 Aug 2024 08:53:54 +1000 Subject: [PATCH 174/532] plain text admin password follow-up (#2223) --- docs/simplesamlphp-upgrade-notes-2.3.md | 8 ++++++-- modules/core/src/Auth/Source/AdminPassword.php | 4 ++++ src/SimpleSAML/Logger.php | 9 +++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/simplesamlphp-upgrade-notes-2.3.md b/docs/simplesamlphp-upgrade-notes-2.3.md index 3768056b1c..e4ed8606cc 100644 --- a/docs/simplesamlphp-upgrade-notes-2.3.md +++ b/docs/simplesamlphp-upgrade-notes-2.3.md @@ -32,8 +32,12 @@ The following properties were marked `deprecated` and will be removed in a next ## BC break -- Plain-text admin-passwords are no longer allowed. - Please use the `bin/pwgen.php` script to generate a secure password hash. +- As of 2.3.1+ Plain-text admin-passwords are allowed again. + No change is needed to auth.adminpassword to upgrade from 2.2 to 2.3.1+. + In 2.3.0 only Plain-text admin-passwords were not allowed. + + In either case you might like to use the `bin/pwgen.php` script to + generate a secure password hash for auth.adminpassword. - The language codes `pt-br` and `zh-tw` have been renamed to `pt_BR` and `zh_TW`. Please update your configuration to match the new names. diff --git a/modules/core/src/Auth/Source/AdminPassword.php b/modules/core/src/Auth/Source/AdminPassword.php index 996a4cc868..3ac852979c 100644 --- a/modules/core/src/Auth/Source/AdminPassword.php +++ b/modules/core/src/Auth/Source/AdminPassword.php @@ -6,6 +6,7 @@ use SimpleSAML\Configuration; use SimpleSAML\Error; +use SimpleSAML\Logger; use SimpleSAML\Module\core\Auth\UserPassBase; use Symfony\Component\PasswordHasher\Hasher\NativePasswordHasher; @@ -65,6 +66,9 @@ protected function login(string $username, string $password): array // Continue to allow admin login when the config contains // a password that is not hashed if ($adminPassword === $password) { + Logger::deprecated('Please consider hashing the admin password stored in auth.adminpassword' + . ' in config.php. Using a plain text password in that config setting' + . ' will be removed in the future.'); return ['user' => ['admin']]; } throw new Error\Error(Error\ErrorCodes::ADMINNOTHASHED); diff --git a/src/SimpleSAML/Logger.php b/src/SimpleSAML/Logger.php index ab8b1d66b6..7458374bd3 100644 --- a/src/SimpleSAML/Logger.php +++ b/src/SimpleSAML/Logger.php @@ -207,6 +207,15 @@ public static function warning(string $string): void self::log(self::WARNING, $string); } + /** + * Log a warning about deprecated code. + * + * @param string $string The message to log. + */ + public static function deprecated(string $string): void + { + self::log(self::WARNING, 'DEPRECATION WARNING: ' . $string); + } /** * We reserve the notice level for statistics, so do not use this level for other kind of log messages. From 78e79457c731a3650bf499cd2c5b0731700abad6 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 31 Aug 2024 21:13:08 +0200 Subject: [PATCH 175/532] Restore support for dialects --- src/SimpleSAML/Locale/Language.php | 1 - src/SimpleSAML/Locale/Localization.php | 9 ++++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/SimpleSAML/Locale/Language.php b/src/SimpleSAML/Locale/Language.php index 24718d9b63..14326b990e 100644 --- a/src/SimpleSAML/Locale/Language.php +++ b/src/SimpleSAML/Locale/Language.php @@ -437,7 +437,6 @@ public static function getLanguageCookie(): ?string */ public static function setLanguageCookie(string $language): void { - $language = strtolower($language); $config = Configuration::getInstance(); $availableLanguages = $config->getOptionalArray('language.available', [self::FALLBACKLANGUAGE]); diff --git a/src/SimpleSAML/Locale/Localization.php b/src/SimpleSAML/Locale/Localization.php index ff020381d6..4e1d62845a 100644 --- a/src/SimpleSAML/Locale/Localization.php +++ b/src/SimpleSAML/Locale/Localization.php @@ -168,9 +168,16 @@ public function addDomain(string $localeDir, string $domain): void */ public function getLangPath(string $domain = self::DEFAULT_DOMAIN): string { + $localeDir = $this->localeDomainMap[$domain]; + $langcode = $this->langcode; + $langPath = $localeDir . '/' . $langcode . '/LC_MESSAGES/'; + Logger::debug("Trying langpath for '$langcode' as '$langPath'"); + if (is_dir($langPath) && is_readable($langPath)) { + return $langPath; + } + $langcode = explode('_', $this->langcode); $langcode = $langcode[0]; - $localeDir = $this->localeDomainMap[$domain]; $langPath = $localeDir . '/' . $langcode . '/LC_MESSAGES/'; Logger::debug("Trying langpath for '$langcode' as '$langPath'"); if (is_dir($langPath) && is_readable($langPath)) { From 39e8655c3d2873424776c28b9c5d27950abb8a2b Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 31 Aug 2024 21:20:28 +0200 Subject: [PATCH 176/532] Rename dialect-directories --- locales/{pt-br => pt_BR}/LC_MESSAGES/attributes.po | 0 locales/{pt-br => pt_BR}/LC_MESSAGES/messages.po | 0 locales/{zh-tw => zh_TW}/LC_MESSAGES/attributes.po | 0 locales/{zh-tw => zh_TW}/LC_MESSAGES/messages.po | 0 modules/admin/locales/{pt-br => pt_BR}/LC_MESSAGES/admin.po | 0 modules/admin/locales/{zh-tw => zh_TW}/LC_MESSAGES/admin.po | 0 modules/core/locales/{pt-br => pt_BR}/LC_MESSAGES/core.po | 0 modules/core/locales/{zh-tw => zh_TW}/LC_MESSAGES/core.po | 0 modules/cron/locales/{pt-br => pt_BR}/LC_MESSAGES/cron.po | 0 modules/cron/locales/{zh-tw => zh_TW}/LC_MESSAGES/cron.po | 0 .../multiauth/locales/{zh-tw => zh_TW}/LC_MESSAGES/multiauth.po | 0 modules/saml/locales/{zh-tw => zh_TW}/LC_MESSAGES/saml.po | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename locales/{pt-br => pt_BR}/LC_MESSAGES/attributes.po (100%) rename locales/{pt-br => pt_BR}/LC_MESSAGES/messages.po (100%) rename locales/{zh-tw => zh_TW}/LC_MESSAGES/attributes.po (100%) rename locales/{zh-tw => zh_TW}/LC_MESSAGES/messages.po (100%) rename modules/admin/locales/{pt-br => pt_BR}/LC_MESSAGES/admin.po (100%) rename modules/admin/locales/{zh-tw => zh_TW}/LC_MESSAGES/admin.po (100%) rename modules/core/locales/{pt-br => pt_BR}/LC_MESSAGES/core.po (100%) rename modules/core/locales/{zh-tw => zh_TW}/LC_MESSAGES/core.po (100%) rename modules/cron/locales/{pt-br => pt_BR}/LC_MESSAGES/cron.po (100%) rename modules/cron/locales/{zh-tw => zh_TW}/LC_MESSAGES/cron.po (100%) rename modules/multiauth/locales/{zh-tw => zh_TW}/LC_MESSAGES/multiauth.po (100%) rename modules/saml/locales/{zh-tw => zh_TW}/LC_MESSAGES/saml.po (100%) diff --git a/locales/pt-br/LC_MESSAGES/attributes.po b/locales/pt_BR/LC_MESSAGES/attributes.po similarity index 100% rename from locales/pt-br/LC_MESSAGES/attributes.po rename to locales/pt_BR/LC_MESSAGES/attributes.po diff --git a/locales/pt-br/LC_MESSAGES/messages.po b/locales/pt_BR/LC_MESSAGES/messages.po similarity index 100% rename from locales/pt-br/LC_MESSAGES/messages.po rename to locales/pt_BR/LC_MESSAGES/messages.po diff --git a/locales/zh-tw/LC_MESSAGES/attributes.po b/locales/zh_TW/LC_MESSAGES/attributes.po similarity index 100% rename from locales/zh-tw/LC_MESSAGES/attributes.po rename to locales/zh_TW/LC_MESSAGES/attributes.po diff --git a/locales/zh-tw/LC_MESSAGES/messages.po b/locales/zh_TW/LC_MESSAGES/messages.po similarity index 100% rename from locales/zh-tw/LC_MESSAGES/messages.po rename to locales/zh_TW/LC_MESSAGES/messages.po diff --git a/modules/admin/locales/pt-br/LC_MESSAGES/admin.po b/modules/admin/locales/pt_BR/LC_MESSAGES/admin.po similarity index 100% rename from modules/admin/locales/pt-br/LC_MESSAGES/admin.po rename to modules/admin/locales/pt_BR/LC_MESSAGES/admin.po diff --git a/modules/admin/locales/zh-tw/LC_MESSAGES/admin.po b/modules/admin/locales/zh_TW/LC_MESSAGES/admin.po similarity index 100% rename from modules/admin/locales/zh-tw/LC_MESSAGES/admin.po rename to modules/admin/locales/zh_TW/LC_MESSAGES/admin.po diff --git a/modules/core/locales/pt-br/LC_MESSAGES/core.po b/modules/core/locales/pt_BR/LC_MESSAGES/core.po similarity index 100% rename from modules/core/locales/pt-br/LC_MESSAGES/core.po rename to modules/core/locales/pt_BR/LC_MESSAGES/core.po diff --git a/modules/core/locales/zh-tw/LC_MESSAGES/core.po b/modules/core/locales/zh_TW/LC_MESSAGES/core.po similarity index 100% rename from modules/core/locales/zh-tw/LC_MESSAGES/core.po rename to modules/core/locales/zh_TW/LC_MESSAGES/core.po diff --git a/modules/cron/locales/pt-br/LC_MESSAGES/cron.po b/modules/cron/locales/pt_BR/LC_MESSAGES/cron.po similarity index 100% rename from modules/cron/locales/pt-br/LC_MESSAGES/cron.po rename to modules/cron/locales/pt_BR/LC_MESSAGES/cron.po diff --git a/modules/cron/locales/zh-tw/LC_MESSAGES/cron.po b/modules/cron/locales/zh_TW/LC_MESSAGES/cron.po similarity index 100% rename from modules/cron/locales/zh-tw/LC_MESSAGES/cron.po rename to modules/cron/locales/zh_TW/LC_MESSAGES/cron.po diff --git a/modules/multiauth/locales/zh-tw/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/zh_TW/LC_MESSAGES/multiauth.po similarity index 100% rename from modules/multiauth/locales/zh-tw/LC_MESSAGES/multiauth.po rename to modules/multiauth/locales/zh_TW/LC_MESSAGES/multiauth.po diff --git a/modules/saml/locales/zh-tw/LC_MESSAGES/saml.po b/modules/saml/locales/zh_TW/LC_MESSAGES/saml.po similarity index 100% rename from modules/saml/locales/zh-tw/LC_MESSAGES/saml.po rename to modules/saml/locales/zh_TW/LC_MESSAGES/saml.po From 48f87031ab80134edb5f766aaab352c59f3c8774 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 31 Aug 2024 21:13:08 +0200 Subject: [PATCH 177/532] Restore support for dialects --- src/SimpleSAML/Locale/Language.php | 1 - src/SimpleSAML/Locale/Localization.php | 9 ++++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/SimpleSAML/Locale/Language.php b/src/SimpleSAML/Locale/Language.php index 9350171dea..a305f4c552 100644 --- a/src/SimpleSAML/Locale/Language.php +++ b/src/SimpleSAML/Locale/Language.php @@ -438,7 +438,6 @@ public static function getLanguageCookie(): ?string */ public static function setLanguageCookie(string $language): void { - $language = strtolower($language); $config = Configuration::getInstance(); $availableLanguages = $config->getOptionalArray('language.available', [self::FALLBACKLANGUAGE]); diff --git a/src/SimpleSAML/Locale/Localization.php b/src/SimpleSAML/Locale/Localization.php index ff020381d6..4e1d62845a 100644 --- a/src/SimpleSAML/Locale/Localization.php +++ b/src/SimpleSAML/Locale/Localization.php @@ -168,9 +168,16 @@ public function addDomain(string $localeDir, string $domain): void */ public function getLangPath(string $domain = self::DEFAULT_DOMAIN): string { + $localeDir = $this->localeDomainMap[$domain]; + $langcode = $this->langcode; + $langPath = $localeDir . '/' . $langcode . '/LC_MESSAGES/'; + Logger::debug("Trying langpath for '$langcode' as '$langPath'"); + if (is_dir($langPath) && is_readable($langPath)) { + return $langPath; + } + $langcode = explode('_', $this->langcode); $langcode = $langcode[0]; - $localeDir = $this->localeDomainMap[$domain]; $langPath = $localeDir . '/' . $langcode . '/LC_MESSAGES/'; Logger::debug("Trying langpath for '$langcode' as '$langPath'"); if (is_dir($langPath) && is_readable($langPath)) { From fdcae6807d1ef974fa00ab2ab1895fa714925310 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 31 Aug 2024 21:20:28 +0200 Subject: [PATCH 178/532] Rename dialect-directories --- locales/{pt-br => pt_BR}/LC_MESSAGES/attributes.po | 0 locales/{pt-br => pt_BR}/LC_MESSAGES/messages.po | 0 locales/{zh-tw => zh_TW}/LC_MESSAGES/attributes.po | 0 locales/{zh-tw => zh_TW}/LC_MESSAGES/messages.po | 0 modules/admin/locales/{pt-br => pt_BR}/LC_MESSAGES/admin.po | 0 modules/admin/locales/{zh-tw => zh_TW}/LC_MESSAGES/admin.po | 0 modules/core/locales/{pt-br => pt_BR}/LC_MESSAGES/core.po | 0 modules/core/locales/{zh-tw => zh_TW}/LC_MESSAGES/core.po | 0 modules/cron/locales/{pt-br => pt_BR}/LC_MESSAGES/cron.po | 0 modules/cron/locales/{zh-tw => zh_TW}/LC_MESSAGES/cron.po | 0 .../multiauth/locales/{zh-tw => zh_TW}/LC_MESSAGES/multiauth.po | 0 modules/saml/locales/{zh-tw => zh_TW}/LC_MESSAGES/saml.po | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename locales/{pt-br => pt_BR}/LC_MESSAGES/attributes.po (100%) rename locales/{pt-br => pt_BR}/LC_MESSAGES/messages.po (100%) rename locales/{zh-tw => zh_TW}/LC_MESSAGES/attributes.po (100%) rename locales/{zh-tw => zh_TW}/LC_MESSAGES/messages.po (100%) rename modules/admin/locales/{pt-br => pt_BR}/LC_MESSAGES/admin.po (100%) rename modules/admin/locales/{zh-tw => zh_TW}/LC_MESSAGES/admin.po (100%) rename modules/core/locales/{pt-br => pt_BR}/LC_MESSAGES/core.po (100%) rename modules/core/locales/{zh-tw => zh_TW}/LC_MESSAGES/core.po (100%) rename modules/cron/locales/{pt-br => pt_BR}/LC_MESSAGES/cron.po (100%) rename modules/cron/locales/{zh-tw => zh_TW}/LC_MESSAGES/cron.po (100%) rename modules/multiauth/locales/{zh-tw => zh_TW}/LC_MESSAGES/multiauth.po (100%) rename modules/saml/locales/{zh-tw => zh_TW}/LC_MESSAGES/saml.po (100%) diff --git a/locales/pt-br/LC_MESSAGES/attributes.po b/locales/pt_BR/LC_MESSAGES/attributes.po similarity index 100% rename from locales/pt-br/LC_MESSAGES/attributes.po rename to locales/pt_BR/LC_MESSAGES/attributes.po diff --git a/locales/pt-br/LC_MESSAGES/messages.po b/locales/pt_BR/LC_MESSAGES/messages.po similarity index 100% rename from locales/pt-br/LC_MESSAGES/messages.po rename to locales/pt_BR/LC_MESSAGES/messages.po diff --git a/locales/zh-tw/LC_MESSAGES/attributes.po b/locales/zh_TW/LC_MESSAGES/attributes.po similarity index 100% rename from locales/zh-tw/LC_MESSAGES/attributes.po rename to locales/zh_TW/LC_MESSAGES/attributes.po diff --git a/locales/zh-tw/LC_MESSAGES/messages.po b/locales/zh_TW/LC_MESSAGES/messages.po similarity index 100% rename from locales/zh-tw/LC_MESSAGES/messages.po rename to locales/zh_TW/LC_MESSAGES/messages.po diff --git a/modules/admin/locales/pt-br/LC_MESSAGES/admin.po b/modules/admin/locales/pt_BR/LC_MESSAGES/admin.po similarity index 100% rename from modules/admin/locales/pt-br/LC_MESSAGES/admin.po rename to modules/admin/locales/pt_BR/LC_MESSAGES/admin.po diff --git a/modules/admin/locales/zh-tw/LC_MESSAGES/admin.po b/modules/admin/locales/zh_TW/LC_MESSAGES/admin.po similarity index 100% rename from modules/admin/locales/zh-tw/LC_MESSAGES/admin.po rename to modules/admin/locales/zh_TW/LC_MESSAGES/admin.po diff --git a/modules/core/locales/pt-br/LC_MESSAGES/core.po b/modules/core/locales/pt_BR/LC_MESSAGES/core.po similarity index 100% rename from modules/core/locales/pt-br/LC_MESSAGES/core.po rename to modules/core/locales/pt_BR/LC_MESSAGES/core.po diff --git a/modules/core/locales/zh-tw/LC_MESSAGES/core.po b/modules/core/locales/zh_TW/LC_MESSAGES/core.po similarity index 100% rename from modules/core/locales/zh-tw/LC_MESSAGES/core.po rename to modules/core/locales/zh_TW/LC_MESSAGES/core.po diff --git a/modules/cron/locales/pt-br/LC_MESSAGES/cron.po b/modules/cron/locales/pt_BR/LC_MESSAGES/cron.po similarity index 100% rename from modules/cron/locales/pt-br/LC_MESSAGES/cron.po rename to modules/cron/locales/pt_BR/LC_MESSAGES/cron.po diff --git a/modules/cron/locales/zh-tw/LC_MESSAGES/cron.po b/modules/cron/locales/zh_TW/LC_MESSAGES/cron.po similarity index 100% rename from modules/cron/locales/zh-tw/LC_MESSAGES/cron.po rename to modules/cron/locales/zh_TW/LC_MESSAGES/cron.po diff --git a/modules/multiauth/locales/zh-tw/LC_MESSAGES/multiauth.po b/modules/multiauth/locales/zh_TW/LC_MESSAGES/multiauth.po similarity index 100% rename from modules/multiauth/locales/zh-tw/LC_MESSAGES/multiauth.po rename to modules/multiauth/locales/zh_TW/LC_MESSAGES/multiauth.po diff --git a/modules/saml/locales/zh-tw/LC_MESSAGES/saml.po b/modules/saml/locales/zh_TW/LC_MESSAGES/saml.po similarity index 100% rename from modules/saml/locales/zh-tw/LC_MESSAGES/saml.po rename to modules/saml/locales/zh_TW/LC_MESSAGES/saml.po From b631f154089885d6ef517f01c53b626f010f2aa0 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 31 Aug 2024 21:23:30 +0200 Subject: [PATCH 179/532] Fix upgrade notes --- docs/simplesamlphp-upgrade-notes-2.3.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/docs/simplesamlphp-upgrade-notes-2.3.md b/docs/simplesamlphp-upgrade-notes-2.3.md index e4ed8606cc..fc5e7d7800 100644 --- a/docs/simplesamlphp-upgrade-notes-2.3.md +++ b/docs/simplesamlphp-upgrade-notes-2.3.md @@ -30,14 +30,9 @@ The following properties were marked `deprecated` and will be removed in a next - SimpleSAML\Locale\Language::$language_names - Use \Symfony\Component\Intl\Languages::getNames() instead -## BC break - -- As of 2.3.1+ Plain-text admin-passwords are allowed again. - No change is needed to auth.adminpassword to upgrade from 2.2 to 2.3.1+. - In 2.3.0 only Plain-text admin-passwords were not allowed. +The use of plain-text admin-passwords has been deprecated. Generate a secure hash using the `bin/pwgen.php` script instead. - In either case you might like to use the `bin/pwgen.php` script to - generate a secure password hash for auth.adminpassword. +## BC break - The language codes `pt-br` and `zh-tw` have been renamed to `pt_BR` and `zh_TW`. Please update your configuration to match the new names. From e5a90695ac1576854356b852f745c6888a357b90 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 31 Aug 2024 21:23:30 +0200 Subject: [PATCH 180/532] Fix upgrade notes --- docs/simplesamlphp-upgrade-notes-2.3.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/docs/simplesamlphp-upgrade-notes-2.3.md b/docs/simplesamlphp-upgrade-notes-2.3.md index e4ed8606cc..fc5e7d7800 100644 --- a/docs/simplesamlphp-upgrade-notes-2.3.md +++ b/docs/simplesamlphp-upgrade-notes-2.3.md @@ -30,14 +30,9 @@ The following properties were marked `deprecated` and will be removed in a next - SimpleSAML\Locale\Language::$language_names - Use \Symfony\Component\Intl\Languages::getNames() instead -## BC break - -- As of 2.3.1+ Plain-text admin-passwords are allowed again. - No change is needed to auth.adminpassword to upgrade from 2.2 to 2.3.1+. - In 2.3.0 only Plain-text admin-passwords were not allowed. +The use of plain-text admin-passwords has been deprecated. Generate a secure hash using the `bin/pwgen.php` script instead. - In either case you might like to use the `bin/pwgen.php` script to - generate a secure password hash for auth.adminpassword. +## BC break - The language codes `pt-br` and `zh-tw` have been renamed to `pt_BR` and `zh_TW`. Please update your configuration to match the new names. From ec71c466a4f9a9bfe48f20b386a08da027360106 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 31 Aug 2024 21:25:22 +0200 Subject: [PATCH 181/532] Update changelog --- docs/simplesamlphp-changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index a28d558d87..37d648cc22 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -10,7 +10,7 @@ See the [upgrade notes](https://simplesamlphp.org/docs/stable/simplesamlphp-upgr Released TBD * Fixed accidental backwards incompatibility for plain-text admin passwords (#2212) -* Fixed accidental backwards incompatibility concerning the `pt-br` and `zh-tw` locales (#2216) +* Fixed support for `pt-br` and `zh-tw` dialects (#2216) * Run ob_end_clean() on configuration file parsing error (#2219) `admin` From 6fa3af6c25fc3f138de868f18399044aba4f9939 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 2 Sep 2024 11:19:38 +0200 Subject: [PATCH 182/532] Fix deprecation of Twig spaceless-filter (#2229) * Remove deprecated spaceless-filter * Fix whitespace-issue in converted metadata block * Add update-note --- docs/simplesamlphp-changelog.md | 5 +++++ modules/admin/templates/metadata_converter.twig | 7 ++----- templates/_table.twig | 17 ++++++++--------- templates/base.twig | 2 -- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 37d648cc22..af15d0bacd 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -16,6 +16,11 @@ Released TBD `admin` * Fix metadata-viewer to output a valid PHP array +* Fix text-overflow of the metadata-converter output-box + +Chores: + +* Solved deprecation notices in CI regarding the use of the Twig spaceless-filter (#2229) ## Version 2.3.0 diff --git a/modules/admin/templates/metadata_converter.twig b/modules/admin/templates/metadata_converter.twig index 9881e4272f..9423807280 100644 --- a/modules/admin/templates/metadata_converter.twig +++ b/modules/admin/templates/metadata_converter.twig @@ -33,8 +33,6 @@

{{ 'Converted metadata'|trans }}

{% for type, text in output -%} {%- if text -%} -{# spaceless is to work around a clipboard.js bug that would add extra whitespace #} -{% apply spaceless %}

{{ type }}

@@ -42,11 +40,10 @@
-
-
{{ text|escape }}
+
+ {{- text|escape -}}
-{% endapply %}

{%- set i=i+1 %} {%- endif -%} diff --git a/templates/_table.twig b/templates/_table.twig index 2ada6a8a1c..df05e0d43e 100644 --- a/templates/_table.twig +++ b/templates/_table.twig @@ -7,17 +7,16 @@ {{ name }} {%- endblock %} - {% apply spaceless %} - {% for value in values %} - {% if loop.length>1 and loop.first %}
    {% endif %} - {% if loop.length>1 %}
  • {% endif -%} + + {% for value in values %} + {% if loop.length>1 and loop.first %}
      {% endif -%} + {%- if loop.length>1 %}
    • {% endif -%} - {% block value %}{% endblock %} + {%- block value %}{% endblock -%} - {% if loop.length>1 %}
    • {% endif %} - {% if loop.length>1 and loop.last %}
    {% endif %} - {% endfor %} - {% endapply -%} + {%- if loop.length>1 %}
  • {% endif -%} + {%- if loop.length>1 and loop.last %}
{% endif %} + {% endfor %} {% endfor %} diff --git a/templates/base.twig b/templates/base.twig index a3a5dd5d08..d3256a3b1d 100644 --- a/templates/base.twig +++ b/templates/base.twig @@ -1,4 +1,3 @@ -{% apply spaceless %} @@ -33,4 +32,3 @@ {% block postload %}{% endblock %} -{% endapply %} From 4f616ea46b28db19e80d4be911b09e3a97434b8a Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 2 Sep 2024 11:19:38 +0200 Subject: [PATCH 183/532] Fix deprecation of Twig spaceless-filter (#2229) * Remove deprecated spaceless-filter * Fix whitespace-issue in converted metadata block * Add update-note --- modules/admin/templates/metadata_converter.twig | 7 ++----- templates/_table.twig | 17 ++++++++--------- templates/base.twig | 2 -- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/modules/admin/templates/metadata_converter.twig b/modules/admin/templates/metadata_converter.twig index 9881e4272f..9423807280 100644 --- a/modules/admin/templates/metadata_converter.twig +++ b/modules/admin/templates/metadata_converter.twig @@ -33,8 +33,6 @@

{{ 'Converted metadata'|trans }}

{% for type, text in output -%} {%- if text -%} -{# spaceless is to work around a clipboard.js bug that would add extra whitespace #} -{% apply spaceless %}

{{ type }}

@@ -42,11 +40,10 @@
-
-
{{ text|escape }}
+
+ {{- text|escape -}}
-{% endapply %}

{%- set i=i+1 %} {%- endif -%} diff --git a/templates/_table.twig b/templates/_table.twig index 2ada6a8a1c..df05e0d43e 100644 --- a/templates/_table.twig +++ b/templates/_table.twig @@ -7,17 +7,16 @@ {{ name }} {%- endblock %} - {% apply spaceless %} - {% for value in values %} - {% if loop.length>1 and loop.first %}
    {% endif %} - {% if loop.length>1 %}
  • {% endif -%} + + {% for value in values %} + {% if loop.length>1 and loop.first %}
      {% endif -%} + {%- if loop.length>1 %}
    • {% endif -%} - {% block value %}{% endblock %} + {%- block value %}{% endblock -%} - {% if loop.length>1 %}
    • {% endif %} - {% if loop.length>1 and loop.last %}
    {% endif %} - {% endfor %} - {% endapply -%} + {%- if loop.length>1 %}
  • {% endif -%} + {%- if loop.length>1 and loop.last %}
{% endif %} + {% endfor %} {% endfor %} diff --git a/templates/base.twig b/templates/base.twig index a3a5dd5d08..d3256a3b1d 100644 --- a/templates/base.twig +++ b/templates/base.twig @@ -1,4 +1,3 @@ -{% apply spaceless %} @@ -33,4 +32,3 @@ {% block postload %}{% endblock %} -{% endapply %} From b1efacbd7f7730f821cf7d40d79d931e6f575209 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Tue, 3 Sep 2024 18:38:22 +1000 Subject: [PATCH 184/532] docs: add some dev info about ssp-assets-base to help new developers find things (#2235) * docs: add some dev info about ssp-assets-base to help new developers find things * docs: cleaning --- docs/simplesamlphp-developer-information.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/simplesamlphp-developer-information.md b/docs/simplesamlphp-developer-information.md index 8ca9885bf6..1d4cd82724 100644 --- a/docs/simplesamlphp-developer-information.md +++ b/docs/simplesamlphp-developer-information.md @@ -55,6 +55,17 @@ of the git repository. If you would like your simpler issues to be solved for you execute `phpcbf` which will update the code to remedy as many issues as it can. +## CSS and common asset setup + +The common assets such as CSS in SimpleSAMLphp, for example, that +stored in public/assets/base/css/stylesheet.css comes from the +[simplesamlphp-assets-base](https://github.com/simplesamlphp/simplesamlphp-assets-base) +package. + +The dependencies are updated using github actions in +simplesamlphp-assets-base. Select a recent branch such as release-2.2 +and dig into the .github directory for details. + ## Following a simple login The `SimpleSAML\Auth\Simple` class takes the authentication_source From 0f35de648885c7800ef07a00c79193acf3b9e3d5 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Tue, 3 Sep 2024 18:38:22 +1000 Subject: [PATCH 185/532] docs: add some dev info about ssp-assets-base to help new developers find things (#2235) * docs: add some dev info about ssp-assets-base to help new developers find things * docs: cleaning --- docs/simplesamlphp-developer-information.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/simplesamlphp-developer-information.md b/docs/simplesamlphp-developer-information.md index 8ca9885bf6..1d4cd82724 100644 --- a/docs/simplesamlphp-developer-information.md +++ b/docs/simplesamlphp-developer-information.md @@ -55,6 +55,17 @@ of the git repository. If you would like your simpler issues to be solved for you execute `phpcbf` which will update the code to remedy as many issues as it can. +## CSS and common asset setup + +The common assets such as CSS in SimpleSAMLphp, for example, that +stored in public/assets/base/css/stylesheet.css comes from the +[simplesamlphp-assets-base](https://github.com/simplesamlphp/simplesamlphp-assets-base) +package. + +The dependencies are updated using github actions in +simplesamlphp-assets-base. Select a recent branch such as release-2.2 +and dig into the .github directory for details. + ## Following a simple login The `SimpleSAML\Auth\Simple` class takes the authentication_source From 2f3acc1d0cc8521c60af253e123f1bb7ddaadcc9 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 3 Sep 2024 14:47:54 +0200 Subject: [PATCH 186/532] Fix incorrect error-message --- src/SimpleSAML/Configuration.php | 4 +--- tests/src/SimpleSAML/ConfigurationTest.php | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index 17be9a4995..36acd922cd 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -1209,9 +1209,7 @@ public function getEndpoints(string $endpointType): array $eps = $this->configuration[$endpointType]; - if (!is_array($eps)) { - throw new Exception($loc . ': Expected array or string.'); - } + Assert::isArray($eps, Error\CriticalConfigurationError::class); $eps_count = count($eps); diff --git a/tests/src/SimpleSAML/ConfigurationTest.php b/tests/src/SimpleSAML/ConfigurationTest.php index f0ee645693..64986f52c4 100644 --- a/tests/src/SimpleSAML/ConfigurationTest.php +++ b/tests/src/SimpleSAML/ConfigurationTest.php @@ -960,7 +960,7 @@ public function testGetEndpoints(): void // define a set of exception messages to expect $msgs = [ - 'Expected array or string.', + 'The configuration is invalid: Expected an array. Got: integer', 'Expected a string or an array.', 'Missing Location.', 'Location must be a string.', From 7470c4c8bd28163acb9dc36fc6206b7256812233 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 3 Sep 2024 14:47:54 +0200 Subject: [PATCH 187/532] Fix incorrect error-message --- docs/simplesamlphp-changelog.md | 1 + src/SimpleSAML/Configuration.php | 4 +--- tests/src/SimpleSAML/ConfigurationTest.php | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index af15d0bacd..0a94b8a280 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -12,6 +12,7 @@ Released TBD * Fixed accidental backwards incompatibility for plain-text admin passwords (#2212) * Fixed support for `pt-br` and `zh-tw` dialects (#2216) * Run ob_end_clean() on configuration file parsing error (#2219) +* Fixed an incorrect exception message when string-style endpoints are used. `admin` diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index 8a4320a844..df5bf03234 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -1209,9 +1209,7 @@ public function getEndpoints(string $endpointType): array $eps = $this->configuration[$endpointType]; - if (!is_array($eps)) { - throw new Exception($loc . ': Expected array or string.'); - } + Assert::isArray($eps, Error\CriticalConfigurationError::class); $eps_count = count($eps); diff --git a/tests/src/SimpleSAML/ConfigurationTest.php b/tests/src/SimpleSAML/ConfigurationTest.php index f0ee645693..64986f52c4 100644 --- a/tests/src/SimpleSAML/ConfigurationTest.php +++ b/tests/src/SimpleSAML/ConfigurationTest.php @@ -960,7 +960,7 @@ public function testGetEndpoints(): void // define a set of exception messages to expect $msgs = [ - 'Expected array or string.', + 'The configuration is invalid: Expected an array. Got: integer', 'Expected a string or an array.', 'Missing Location.', 'Location must be a string.', From d2f2be182bdb88fe25b9b61810b806a4b45cf3f8 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 5 Sep 2024 18:22:48 +0200 Subject: [PATCH 188/532] Throw user-friendly exception with the proper HTTP statuscode (#2234) * Throw user-friendly exception with the proper HTTP statuscode for 'method not found' * Suppress traceback for MethodNotAllowed error, unless debug-logging is set * Be able to suppress error reporting for specific types of errors --- modules/core/locales/af/LC_MESSAGES/core.po | 2 +- modules/core/locales/ar/LC_MESSAGES/core.po | 2 +- modules/core/locales/cs/LC_MESSAGES/core.po | 2 +- modules/core/locales/da/LC_MESSAGES/core.po | 2 +- modules/core/locales/de/LC_MESSAGES/core.po | 2 +- modules/core/locales/el/LC_MESSAGES/core.po | 2 +- modules/core/locales/en/LC_MESSAGES/core.po | 4 +-- modules/core/locales/es/LC_MESSAGES/core.po | 2 +- modules/core/locales/et/LC_MESSAGES/core.po | 2 +- modules/core/locales/eu/LC_MESSAGES/core.po | 2 +- modules/core/locales/fr/LC_MESSAGES/core.po | 2 +- modules/core/locales/he/LC_MESSAGES/core.po | 2 +- modules/core/locales/hr/LC_MESSAGES/core.po | 2 +- modules/core/locales/hu/LC_MESSAGES/core.po | 2 +- modules/core/locales/id/LC_MESSAGES/core.po | 2 +- modules/core/locales/it/LC_MESSAGES/core.po | 2 +- modules/core/locales/ja/LC_MESSAGES/core.po | 2 +- modules/core/locales/lt/LC_MESSAGES/core.po | 2 +- modules/core/locales/lv/LC_MESSAGES/core.po | 2 +- modules/core/locales/nb/LC_MESSAGES/core.po | 2 +- modules/core/locales/nl/LC_MESSAGES/core.po | 2 +- modules/core/locales/nn/LC_MESSAGES/core.po | 2 +- .../core/locales/pt_BR/LC_MESSAGES/core.po | 2 +- modules/core/locales/ro/LC_MESSAGES/core.po | 2 +- modules/core/locales/ru/LC_MESSAGES/core.po | 2 +- modules/core/locales/sk/LC_MESSAGES/core.po | 2 +- modules/core/locales/sl/LC_MESSAGES/core.po | 2 +- modules/core/locales/sr/LC_MESSAGES/core.po | 2 +- modules/core/locales/st/LC_MESSAGES/core.po | 2 +- modules/core/locales/sv/LC_MESSAGES/core.po | 2 +- modules/core/locales/zh/LC_MESSAGES/core.po | 2 +- .../core/locales/zh_TW/LC_MESSAGES/core.po | 2 +- .../core/templates/method_not_allowed.twig | 6 ++++ modules/core/templates/no_metadata.twig | 2 +- src/SimpleSAML/Error/Error.php | 20 +++++------ src/SimpleSAML/Error/ErrorCodes.php | 3 ++ src/SimpleSAML/Error/ExceptionHandler.php | 8 +++-- src/SimpleSAML/Error/MethodNotAllowed.php | 33 +++++++++++++++++++ 38 files changed, 92 insertions(+), 46 deletions(-) create mode 100644 modules/core/templates/method_not_allowed.twig create mode 100644 src/SimpleSAML/Error/MethodNotAllowed.php diff --git a/modules/core/locales/af/LC_MESSAGES/core.po b/modules/core/locales/af/LC_MESSAGES/core.po index e8b466b1b0..bd3ce54fc5 100644 --- a/modules/core/locales/af/LC_MESSAGES/core.po +++ b/modules/core/locales/af/LC_MESSAGES/core.po @@ -5,7 +5,7 @@ msgstr "" msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "As jy 'n programmeerder is wat die 'single sign-on' oplossing implementeer, het jy 'n probleem met die metadata opset. Bevestig dat die metadata korrek ingestel is op beide die identiteit verskaffer en diensverskaffer." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "As jy 'n gebruiker is wat na aanleiding van 'n skakel op 'n webwerf hierdie fout ontvang het, moet jy hierdie fout aan die eienaar van die webwerf aan stuur." msgid "Missing cookie" diff --git a/modules/core/locales/ar/LC_MESSAGES/core.po b/modules/core/locales/ar/LC_MESSAGES/core.po index b782d73a63..61da113d20 100644 --- a/modules/core/locales/ar/LC_MESSAGES/core.po +++ b/modules/core/locales/ar/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "اذا استمرت هذه المشكلة بالحدوث، رجاءا ب msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr " و كانت (Single Sign-On) ان كنت مبرمجاً تعمل علي توفير حل لتوثيق دخول لمرة واحدة لديك مشكلة بادخال البيانات الوصفية, تأكد من أن أدخال البيانات الوصفية صحيح بكل من محدد الهوية و المخدم " -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "ان تعرضت لهذا الاشكال بعيد اتباعك لرابط بموقع ما, ينبغي عليك الابلاغ عن هذا الاشكال لمالك الموقع المعني" msgid "Metadata" diff --git a/modules/core/locales/cs/LC_MESSAGES/core.po b/modules/core/locales/cs/LC_MESSAGES/core.po index 3c3ef85e38..7645ec6a28 100644 --- a/modules/core/locales/cs/LC_MESSAGES/core.po +++ b/modules/core/locales/cs/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Pokud problém přetrvává, můžete ho nahlásit správci." msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Pokud jste vývojář nasazující řešení jednotného přihlašování, máte problém s konfigurací metadat. Ověřte, zda jsou metadata nakonfigurována správně jak u poskytovatele identity tak u poskytovatele služby." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Pokud jste uživatel, který obdržel chybu po následování odkazu na webové stránce, měli byste o této chybě informovat vlastníka této stránky. " msgid "Missing cookie" diff --git a/modules/core/locales/da/LC_MESSAGES/core.po b/modules/core/locales/da/LC_MESSAGES/core.po index 6a7ec1495d..09f2929999 100644 --- a/modules/core/locales/da/LC_MESSAGES/core.po +++ b/modules/core/locales/da/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Hvis dette problem fortsætter, kan du rapportere det til systemadminist msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Hvis du er udvikler, så har du et metadata-konfigurationsproblem. Tjek at metadata er konfigurerede korrekt både på service-siden og identitetsudbyder-siden." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Hvis du har modtaget denne fejlbesked efter at have klikket på et lilnk, skal du rappoterer fejlen til ejeren af siden. " msgid "Missing cookie" diff --git a/modules/core/locales/de/LC_MESSAGES/core.po b/modules/core/locales/de/LC_MESSAGES/core.po index 21ef993960..a1c8cc0503 100644 --- a/modules/core/locales/de/LC_MESSAGES/core.po +++ b/modules/core/locales/de/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Wenn das Problem weiter besteht, kannst du diesen Fehler den Systemadmin msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Arbeiten Sie selbst an einem Web Single Sign-On System, stimmt mit den benutzten Metadaten etwas nicht. Überprüfen Sie die Metadaten des Identity Providers und des Service Providers." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Sind Sie lediglich einem Verweis einer anderen Website hierher gefolgt, sollten Sie diesen Fehler den Betreibern der Website melden." msgid "Missing cookie" diff --git a/modules/core/locales/el/LC_MESSAGES/core.po b/modules/core/locales/el/LC_MESSAGES/core.po index 368d7d78f9..c3a4a27d79 100644 --- a/modules/core/locales/el/LC_MESSAGES/core.po +++ b/modules/core/locales/el/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Αν το πρόβλημα εξακολουθεί να υφίστατα msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Εάν είστε διαχειριστής της υπηρεσίας ταυτοποίησης και εξουσιοδότησης, τότε αντιμετωπίζετε κάποιο πρόβλημα με τη διαμόρφωση των μεταδεδομένων. Βεβαιωθείτε ότι τα μεταδεδομένα έχουν ρυθμιστεί σωστά τόσο στον πάροχο ταυτότητας όσο και στον πάροχο υπηρεσιών." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Αν λάβατε αυτό το σφάλμα ακολουθώντας έναν σύνδεσμο σε κάποιον ιστότοπο, θα πρέπει να το αναφέρετε στον ιδιοκτήτη του εν λόγω ιστότοπου." msgid "Missing cookie" diff --git a/modules/core/locales/en/LC_MESSAGES/core.po b/modules/core/locales/en/LC_MESSAGES/core.po index 1fbe42f3d2..15bb5d49bd 100644 --- a/modules/core/locales/en/LC_MESSAGES/core.po +++ b/modules/core/locales/en/LC_MESSAGES/core.po @@ -44,8 +44,8 @@ msgstr "If this problem persists, you can report it to the system administrators msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." -msgstr "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." +msgstr "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgid "If you report this error, please also report this tracking number which makes it possible to locate your session in the logs available to the system administrator:" msgstr "" diff --git a/modules/core/locales/es/LC_MESSAGES/core.po b/modules/core/locales/es/LC_MESSAGES/core.po index ab88a26dc6..b15ce650fb 100644 --- a/modules/core/locales/es/LC_MESSAGES/core.po +++ b/modules/core/locales/es/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Si el problema persiste, puede reportarlo a los administradores del sist msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Si usted es un desarrollador que está desplegando una solución de inicio único, tiene un problema con la configuración de sus metadatos. Verifique que los metadatos están configurados correctamente en el proveedor de identidad y en el proveedor de servicios" -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Si usted es un usuario que recibe este error luego de seguir un vínculo en un sitio, debe reportar el error al dueño del sitio." msgid "Missing cookie" diff --git a/modules/core/locales/et/LC_MESSAGES/core.po b/modules/core/locales/et/LC_MESSAGES/core.po index 4cf8b4679c..448db91305 100644 --- a/modules/core/locales/et/LC_MESSAGES/core.po +++ b/modules/core/locales/et/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Kui probleem ei kao, siis teavita sellest süsteemi administraatoreid." msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Kui sa oled arendaja, kes juurutab ühekordse sisselogimise lahendust, siis on probleemi põhjuseks metaandmete seadistused. Kontrolli, et metaandmed oleks seadistatud korrektselt nii identiteedipakkuja kui teenusepakkuja poolel." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Kui sa oled kasutaja, kes sai selle veateate veebilehel linki klõpsates, siis peaksid sellest tõrkest veebilehe omanikku teavitama." msgid "Missing cookie" diff --git a/modules/core/locales/eu/LC_MESSAGES/core.po b/modules/core/locales/eu/LC_MESSAGES/core.po index a9080ec018..27bd10e845 100644 --- a/modules/core/locales/eu/LC_MESSAGES/core.po +++ b/modules/core/locales/eu/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Arazoak bere horretan badirau, sistemaren administratzaileei berri eman msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Hasiera-bakarreko sistema bat zabaltzen ari zaren garatzaile bat bazara, arazo bat duzu zure metadatuen kongigurazioarekin. Egiazta ezazu metadatuak zuzen konfiguratuak daudela identitate hornitzailean eta zerbitzu hornitzailean." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Gune bateko lotura bat jarraituz errore hau jasotzen duen erabiltzaile bat bazara, guneko jabeari eman behar diozu errorearen berri." msgid "Missing cookie" diff --git a/modules/core/locales/fr/LC_MESSAGES/core.po b/modules/core/locales/fr/LC_MESSAGES/core.po index 6723467564..206a868ff6 100644 --- a/modules/core/locales/fr/LC_MESSAGES/core.po +++ b/modules/core/locales/fr/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Si ce problème persiste, vous pouvez le remonter vers l'administrateur msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Si vous êtes un développeur qui déploie une solution de single sign-on, vous avez un problème avec la configuration des métadonnées. Vérifiez que ces métadonnées sont correctement configurées sur le fournisseur d'identité et le fournisseur de service " -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Si vous êtes un usager qui reçoit cette erreur après avoir suivi un lien sur un site, vous devriez remonter cette erreur au propriétaire de ce site." msgid "Missing cookie" diff --git a/modules/core/locales/he/LC_MESSAGES/core.po b/modules/core/locales/he/LC_MESSAGES/core.po index 43d25e0b96..c91f12f370 100644 --- a/modules/core/locales/he/LC_MESSAGES/core.po +++ b/modules/core/locales/he/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "אם הבעייה ממשיכה, אתה יכול לדווח עליה למ msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "אם אתה מפתח שפורש פיתרון התחברות יחידה, יש לך בעייה עם הגדרות המטא-מידע. בדוק שהמטא-מידע מוגדר נכון בספקי הזהות והשרות." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "אם אתה משתמש שקיבל שגיאה זו לאחר לחיצה על קישור באתר, כדי שתדווח על השגיאה לבעלי האתר." msgid "Missing cookie" diff --git a/modules/core/locales/hr/LC_MESSAGES/core.po b/modules/core/locales/hr/LC_MESSAGES/core.po index 24006607ea..fd98d63082 100644 --- a/modules/core/locales/hr/LC_MESSAGES/core.po +++ b/modules/core/locales/hr/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Ako se ova greška bude i dalje pojavljivala, možete ju prijaviti admin msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Ako ste programer koji postavlja sustav jedinstvene autentifikacije (Single Sign-On sustav), tada imate problema s konfiguracijom metapodataka. Provjerite jesu li metapodaci ispravno uneseni i na strani davatelja usluge i u konfiguraciji autentifikacijskog servisa." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Ako se ova greška pojavila nakon što ste slijedili poveznicu na nekoj web stranici, onda biste grešku trebali prijaviti vlasniku navedene stranice." msgid "Missing cookie" diff --git a/modules/core/locales/hu/LC_MESSAGES/core.po b/modules/core/locales/hu/LC_MESSAGES/core.po index cd08cb4728..9cddfd22e7 100644 --- a/modules/core/locales/hu/LC_MESSAGES/core.po +++ b/modules/core/locales/hu/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Ha a probléma állandónak tűnik, kérjük, jelezze ezt az oldal admin msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Ha ön az oldal üzemeltetője, úgy javasoljuk, ellenőrizze a metaadat beállításokat mint IdP-, mind SP oldalon." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Amennyiben ön, mint felhasználó keveredett erre az oldalra, úgy kérjük, a hibával keresse az oldal adminisztrátorát." msgid "Missing cookie" diff --git a/modules/core/locales/id/LC_MESSAGES/core.po b/modules/core/locales/id/LC_MESSAGES/core.po index fd6a9b957e..619ccab2a1 100644 --- a/modules/core/locales/id/LC_MESSAGES/core.po +++ b/modules/core/locales/id/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Jika masalah ini tetap terjadi, anda dapat melaporkannnya ke system admi msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Jika anda adalah pengembang yang mendeploy solusi sing-on, anda memiliki masalah dengan konfigurasi metadata. Periksalah kalau metadata telah dikonfigurasi dengan benar baik pada sisi identity provider dan pada sisi service provider." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Jika adalah user yang menerika error ini setelah mengklik link pada sebuah situs, anda harus melaporkan error ini kepada pemilik situs tersebut" msgid "Missing cookie" diff --git a/modules/core/locales/it/LC_MESSAGES/core.po b/modules/core/locales/it/LC_MESSAGES/core.po index fbaa4e895a..1d85408b21 100644 --- a/modules/core/locales/it/LC_MESSAGES/core.po +++ b/modules/core/locales/it/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Se questo problema persiste, è possibile segnalarlo agli amministratori msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Se sei uno sviluppatore che sta sviluppando una soluzione di single sign-on, hai un problema con la configurazione dei metadati. Verifica che siano correttamente configurati sia sull'identity provider che sul service provider." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Se sei un utente che ha ricevuto questo errore dopo aver cliccato un link su un sito, dovresti riportare questo errore al gestore di quel sito." msgid "Missing cookie" diff --git a/modules/core/locales/ja/LC_MESSAGES/core.po b/modules/core/locales/ja/LC_MESSAGES/core.po index 791effdd65..28d39bb3e7 100644 --- a/modules/core/locales/ja/LC_MESSAGES/core.po +++ b/modules/core/locales/ja/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "この問題が継続して起こる場合、システム管理者に報 msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "もしあなたが開発者でシングルサインオンシステムの構築者である場合、メタデータの設定に問題があります。アイデンティティプロバイダとサービスプロバイダの両方にメタデータが正しく設定されているか確認してください。" -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "もしあなたがユーザーで以下のリンクのサイトでこのエラーを受け取ったのであれば、このエラーをサイトの管理者に報告してください。" msgid "Missing cookie" diff --git a/modules/core/locales/lt/LC_MESSAGES/core.po b/modules/core/locales/lt/LC_MESSAGES/core.po index 35cae44a45..d1d804658b 100644 --- a/modules/core/locales/lt/LC_MESSAGES/core.po +++ b/modules/core/locales/lt/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Jei ši problema išliks, galite pranešti apie tai sistemos administrat msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Jei Jūs esate kūrėjas, kuris diegiate SSO sprendimą, Jums iškilo problema susijusi su metaduomenų konfigūracija. Patikrinkite, ar metaduomenys teisingai sukonfigūruoti tiek tapatybių teikėjo, tiek paslaugos teikėjo pusėse." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Jei Jūs esate naudotojas, kuris gavote šią klaidą spragtelėjęs nuorodą tinklapyje, Jūs turėtumėte informuoti tinklapio administratorių apie šią klaidą." msgid "Missing cookie" diff --git a/modules/core/locales/lv/LC_MESSAGES/core.po b/modules/core/locales/lv/LC_MESSAGES/core.po index 6d2c56c27b..e5f9ecd701 100644 --- a/modules/core/locales/lv/LC_MESSAGES/core.po +++ b/modules/core/locales/lv/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Ja problēma atkārtojas, varat ziņot sistēmas administratoriem." msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Ja Jūs esat vienotas pieslēgšanās risinājuma izstrādātājs, Jūsu metadatu konfigurācijā ir kļūda. Pārbaudiet tos gan pie identitātes piegādātāja, gan pie servisa piegādātāja." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Ja Jūs esat lietotājs un saņemat šo kļūdu, sekojot saitei kādā interneta lapā, Jums jāziņo par šo kļūdu lapas īpašniekam." msgid "Missing cookie" diff --git a/modules/core/locales/nb/LC_MESSAGES/core.po b/modules/core/locales/nb/LC_MESSAGES/core.po index df5b520a0a..07692e0e6d 100644 --- a/modules/core/locales/nb/LC_MESSAGES/core.po +++ b/modules/core/locales/nb/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Hvis problemet vedvarer, kan du rapportere det til systemadministratoren msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Hvis du er en utvikler som setter opp en \"single sign-on\" løsning, så har du et problem med metadataoppsettet. Kontroller at metadata er riktig konfigurert hos både identitetsleverandøren og tjenesteleverandøren." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Hvis du er en bruker som fikk denne feilen etter at du fulgte en link på en nettside, så bør du rapportere denne feilen til eieren av den nettsiden." msgid "Missing cookie" diff --git a/modules/core/locales/nl/LC_MESSAGES/core.po b/modules/core/locales/nl/LC_MESSAGES/core.po index eb80dfcfe2..781f840590 100644 --- a/modules/core/locales/nl/LC_MESSAGES/core.po +++ b/modules/core/locales/nl/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "If dit probleem behoud, dan kun je het melden aan de systeem beheerders. msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Als u een ontwikkelaar bent die een single sign-on oplossing aan het implementeren is, heeft u een probleem met de metadataconfiguratie. Controleer of de metadata correct is geconfigureerd zowel bij de identiteitsverstrekker als bij de service provider." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Als u een eindgebruiker bent die deze foutmelding kreeg na het volgen van een link op een site, dan kunt u deze fout melden bij de eigenaar van die site." msgid "Missing cookie" diff --git a/modules/core/locales/nn/LC_MESSAGES/core.po b/modules/core/locales/nn/LC_MESSAGES/core.po index 1b3f9737c1..3d9f9ac2ca 100644 --- a/modules/core/locales/nn/LC_MESSAGES/core.po +++ b/modules/core/locales/nn/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Om problemet vedvarar, kan du rapportere det til systemadministratorane. msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Om du er ein utviklar som set opp ei \"single sign-on\" løysing, så har du eit problem med metadataoppsettet. Kontroller at metadata er rett satt opp hjå både identitetsleverandøren og tenesteleverandøren." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Om du er ein brukar som mottok denne feilen etter at du følgde ei lenke på ei nettside, så bør du melde denne feilen til eigaren av den nettsida." msgid "Missing cookie" diff --git a/modules/core/locales/pt_BR/LC_MESSAGES/core.po b/modules/core/locales/pt_BR/LC_MESSAGES/core.po index 42d6e701aa..28608e5abe 100644 --- a/modules/core/locales/pt_BR/LC_MESSAGES/core.po +++ b/modules/core/locales/pt_BR/LC_MESSAGES/core.po @@ -11,7 +11,7 @@ msgstr "Hospedado Shibboleth 1.3 Service Provider Metadata (gerado automaticamen msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Se você é um desenvolvedor que está implantando uma solução SSO, você tem um problema com a configuração de metadados. Verifique se os metadados estão configurados corretamente no provedor de identidade e no provedor de serviços." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Se você é um usuário que recebeu esse erro depois de seguir um link em um site, você deve relatar esse erro para o proprietário do site." msgid "Shibboleth 1.3 SP example - test logging in through your Shib IdP" diff --git a/modules/core/locales/ro/LC_MESSAGES/core.po b/modules/core/locales/ro/LC_MESSAGES/core.po index 04aeef0232..d38f98dbe9 100644 --- a/modules/core/locales/ro/LC_MESSAGES/core.po +++ b/modules/core/locales/ro/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Dacă problema persistă, anunțați administratorii de sistem." msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Dacă sunteți dezvoltator care implementează o soluție single sign-on, aveți o problemă la configurarea metadatelor. Vă rugăm să verificați configurarea corectă a metadatelor, atât la furnizorul de identitate cât și la furnizorul de servicii." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Dacă sunteți un utilizator care a primit acest mesaj de eroare în urma utilizării unui link din alt sit, vă rugăm să anunțați această eroare deținătorului sitului respectiv." msgid "Missing cookie" diff --git a/modules/core/locales/ru/LC_MESSAGES/core.po b/modules/core/locales/ru/LC_MESSAGES/core.po index 73999cf94a..b369877b35 100644 --- a/modules/core/locales/ru/LC_MESSAGES/core.po +++ b/modules/core/locales/ru/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Если проблема остается, сообщить об это msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Если вы разработчик внедряющий Технологию единого вход (SSO), у вас есть проблемы с метаданными конфигурации. Убедитесь, что метаданные настроены правильно на Провайдере подлинности и Поставщике услуг." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Если, перейдя по ссылке на сайт, вы увидели эту ошибку, вы должны сообщить об этом владелецу этого сайта." msgid "Missing cookie" diff --git a/modules/core/locales/sk/LC_MESSAGES/core.po b/modules/core/locales/sk/LC_MESSAGES/core.po index 5e716056f5..3b9cee1438 100644 --- a/modules/core/locales/sk/LC_MESSAGES/core.po +++ b/modules/core/locales/sk/LC_MESSAGES/core.po @@ -44,7 +44,7 @@ msgstr "Ak tento problém pretrváva, môžete odoslať hlásenie systémovým a msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Ak ste vývojár a nastavujete systém jednotného prihlásenia, máte problém s konfiguráciou metadát. Skontrolujte, či sú metadáta nakonfigurované správne na oboch stranách - poskytovateľa služby a poskytovateľa identity" -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Ak ste dostali túto chybu po kliknutí na odkaz na nejakej stránky, mali by ste túto chybu nahlásiť vlastníkovi tejto stránky." msgid "If you report this error, please also report this tracking number which makes it possible to locate your session in the logs available to the system administrator:" diff --git a/modules/core/locales/sl/LC_MESSAGES/core.po b/modules/core/locales/sl/LC_MESSAGES/core.po index 4f5470809a..4cac02ff50 100644 --- a/modules/core/locales/sl/LC_MESSAGES/core.po +++ b/modules/core/locales/sl/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Če se ta napaka ponavlja, jo lahko prijavite za skrbniku sistema." msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Če ste razvijalec, ki razvija SSO rešitev preverite, ali so nastavitve metapodatkov ustrezne, tako na stani ponudnika identitete (IdP), kot na strani ponudnika storitve (SP)." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Če ste na to težavo naleteli po kliku povezave te spletne strani, prijavite težavo skrbniku te spletne strani." msgid "Missing cookie" diff --git a/modules/core/locales/sr/LC_MESSAGES/core.po b/modules/core/locales/sr/LC_MESSAGES/core.po index 74080e7dc0..e4cc14a9a8 100644 --- a/modules/core/locales/sr/LC_MESSAGES/core.po +++ b/modules/core/locales/sr/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Ako se ova greška bude i dalje pojavljivala, možete je prijaviti admin msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Postoji greška sa podešavanjima metapodataka. Ukoliko ste administrator sistema, proverite da li metapodaci ispravno uneseni na strani davaoca servisa i davaoca identiteta." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Ukoliko se ova greška pojavila nakon što ste sledili link na nekoj web stranici, onda biste grešku trebali prijaviti vlasniku navedene stranice." msgid "Missing cookie" diff --git a/modules/core/locales/st/LC_MESSAGES/core.po b/modules/core/locales/st/LC_MESSAGES/core.po index ac7de9a565..89033304dc 100644 --- a/modules/core/locales/st/LC_MESSAGES/core.po +++ b/modules/core/locales/st/LC_MESSAGES/core.po @@ -17,7 +17,7 @@ msgstr "Haeba bothata bona bo phehella, o ka bo tlaleha ho batsamaisi ba sistimi msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Haeba o mohlahisi ya sebedisang tharollo ya ho saena hang, o na le bothata ka phetolo ya metadata. Netefatsa hore metadata e hlophiswe ka ho nepahala ho bobedi mofani wa boitsebiso le mofani wa tshebeletso." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Haeba o le mosebedisi ya fumaneng phoso ena kamora ho latela lehokela le setsing, o tlameha ho tlaleha phoso ena ho monga setsi." msgid "Incorrect Attributes" diff --git a/modules/core/locales/sv/LC_MESSAGES/core.po b/modules/core/locales/sv/LC_MESSAGES/core.po index c4bd09412c..6915278b13 100644 --- a/modules/core/locales/sv/LC_MESSAGES/core.po +++ b/modules/core/locales/sv/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Om problemet kvarstår kan du rapportera det till systemadministratörer msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Om du är en utvecklare som driftsätter en lösning med single-on har du problem med metadatakonfigurationen. Kontrollera att metadata är korrekt konfigurerade både i identitetsutgivare och tjänsteleverantören." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Om du är en användare och fick detta fel när du klickade på en länk bör du rapportera felet till den som hanterar webbplatsen med länken." msgid "Missing cookie" diff --git a/modules/core/locales/zh/LC_MESSAGES/core.po b/modules/core/locales/zh/LC_MESSAGES/core.po index 7258481b4b..cd47a0fcc2 100644 --- a/modules/core/locales/zh/LC_MESSAGES/core.po +++ b/modules/core/locales/zh/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "如果这个错误再次出现,你可以向你的系统管理员报告 msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "如果你是部署这个单点登录系统的开发人员,那么你的配置文件存在问题,验证服务提供者和身份提供者是否配置正确" -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "如果你是点击一个网站上的链接后收到该错误的用户,你应该报告这个错误给站点所有人" msgid "Missing cookie" diff --git a/modules/core/locales/zh_TW/LC_MESSAGES/core.po b/modules/core/locales/zh_TW/LC_MESSAGES/core.po index e0920b716d..6c98953842 100644 --- a/modules/core/locales/zh_TW/LC_MESSAGES/core.po +++ b/modules/core/locales/zh_TW/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "如果這個錯誤持續存在,您可以將它回報系統管理者。 msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "若您是單一簽入程式開發人員,您的詮釋資料設定可能有問題。請確認服務提供者或驗證提供者之詮釋資料設定檔是否正確。" -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "若您是個使用者,而您於此網站收到下列連結,請反映此錯誤給此站管理員。" msgid "Missing cookie" diff --git a/modules/core/templates/method_not_allowed.twig b/modules/core/templates/method_not_allowed.twig new file mode 100644 index 0000000000..4ae99ae124 --- /dev/null +++ b/modules/core/templates/method_not_allowed.twig @@ -0,0 +1,6 @@ +

{{ 'This is most likely a configuration problem on either the service provider or identity provider.'|trans }}

+ +
    +
  • {{ 'If you are a user who received this error after following a link on a site, you should report this error to the owner of that site.'|trans }}
  • +
  • {{ 'If you are a developer who is deploying a single sign-on solution, you have are trying to reach an endpoint using the wrong HTTP-method.'|trans }}
  • +
diff --git a/modules/core/templates/no_metadata.twig b/modules/core/templates/no_metadata.twig index 218358fb0c..42184165c2 100644 --- a/modules/core/templates/no_metadata.twig +++ b/modules/core/templates/no_metadata.twig @@ -1,7 +1,7 @@

{{ 'This is most likely a configuration problem on either the service provider or identity provider.'|trans }}

    -
  • {{ 'If you are an user who received this error after following a link on a site, you should report this error to the owner of that site.'|trans }}
  • +
  • {{ 'If you are a user who received this error after following a link on a site, you should report this error to the owner of that site.'|trans }}
  • {{ 'If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider.'|trans }}
diff --git a/src/SimpleSAML/Error/Error.php b/src/SimpleSAML/Error/Error.php index 37f68d82e2..f10477cdf1 100644 --- a/src/SimpleSAML/Error/Error.php +++ b/src/SimpleSAML/Error/Error.php @@ -5,11 +5,7 @@ namespace SimpleSAML\Error; use SimpleSAML\Assert\Assert; -use SimpleSAML\Configuration; -use SimpleSAML\Logger; -use SimpleSAML\Module; -use SimpleSAML\Session; -use SimpleSAML\Utils; +use SimpleSAML\{Configuration, Logger, Module, Session, Utils}; use SimpleSAML\XHTML\Template; use Throwable; @@ -203,7 +199,6 @@ protected function saveError(): array $etrace = implode("\n", $data); $reportId = bin2hex(openssl_random_pseudo_bytes(4)); - Logger::error('Error report with id ' . $reportId . ' generated.'); $config = Configuration::getInstance(); $session = Session::getSessionFromRequest(); @@ -238,13 +233,16 @@ protected function saveError(): array * Display this error. * * This method displays a standard SimpleSAMLphp error page and exits. + * + * @param int $logLevel The log-level for this exception + * @param bool $suppressReport Whether or not sending an error report is an option */ - public function show(): void + public function show(int $logLevel = Logger::ERR, bool $suppressReport = false): void { // log the error message - $this->logError(); - + $this->log($logLevel); $errorData = $this->saveError(); + $config = Configuration::getInstance(); $data = []; @@ -260,12 +258,14 @@ public function show(): void // check if there is a valid technical contact email address if ( - $config->getOptionalBoolean('errorreporting', true) + $suppressReport === false + && $config->getOptionalBoolean('errorreporting', true) && $config->getOptionalString('technicalcontact_email', 'na@example.org') !== 'na@example.org' ) { // enable error reporting $httpUtils = new Utils\HTTP(); $data['errorReportAddress'] = Module::getModuleURL('core/errorReport'); + Logger::error('Error report with id ' . $errorData['reportId'] . ' generated.'); } $data['email'] = ''; diff --git a/src/SimpleSAML/Error/ErrorCodes.php b/src/SimpleSAML/Error/ErrorCodes.php index c3bd92b6bb..c343b6dda2 100644 --- a/src/SimpleSAML/Error/ErrorCodes.php +++ b/src/SimpleSAML/Error/ErrorCodes.php @@ -40,6 +40,7 @@ public function __construct() public const MEMCACHEDOWN = 'MEMCACHEDOWN'; public const METADATA = 'METADATA'; public const METADATANOTFOUND = 'METADATANOTFOUND'; + public const METHODNOTALLOWED = 'METHODNOTALLOWED'; public const NOACCESS = 'NOACCESS'; public const NOCERT = 'NOCERT'; public const NORELAYSTATE = 'NORELAYSTATE'; @@ -91,6 +92,7 @@ final public static function defaultGetAllErrorCodeTitles(): array self::MEMCACHEDOWN => Translate::noop('Cannot retrieve session data'), self::METADATA => Translate::noop('Error loading metadata'), self::METADATANOTFOUND => Translate::noop('Metadata not found'), + self::METHODNOTALLOWED => Translate::noop('Method not allowed'), self::NOACCESS => Translate::noop('No access'), self::NOCERT => Translate::noop('No certificate'), self::NORELAYSTATE => Translate::noop('No RelayState'), @@ -233,6 +235,7 @@ final public static function defaultGetAllErrorCodeDescriptions(): array " are the administrator of this service, you should make sure your " . "metadata configuration is correctly setup."), self::METADATANOTFOUND => Translate::noop('Unable to locate metadata for %ENTITYID%'), + self::METHODNOTALLOWED => Translate::noop('%MESSAGE%'), self::NOACCESS => Translate::noop("" . "This endpoint is not enabled. Check the enable options in your " . "configuration of SimpleSAMLphp."), diff --git a/src/SimpleSAML/Error/ExceptionHandler.php b/src/SimpleSAML/Error/ExceptionHandler.php index 3041784988..e73302ea27 100644 --- a/src/SimpleSAML/Error/ExceptionHandler.php +++ b/src/SimpleSAML/Error/ExceptionHandler.php @@ -6,7 +6,8 @@ use Error as BuiltinError; use Exception as BuiltinException; -use SimpleSAML\Module; +use SimpleSAML\{Logger, Module}; +use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; use Throwable; use function class_exists; @@ -26,7 +27,10 @@ public function customExceptionHandler(Throwable $exception): void { Module::callHooks('exception_handler', $exception); - if ($exception instanceof Error) { + if ($exception instanceof MethodNotAllowedHttpException) { + $e = new MethodNotAllowed($exception); + $e->show(Logger::DEBUG, true); + } elseif ($exception instanceof Error) { $exception->show(); } elseif ($exception instanceof BuiltinException) { $e = new Error(ErrorCodes::UNHANDLEDEXCEPTION, $exception); diff --git a/src/SimpleSAML/Error/MethodNotAllowed.php b/src/SimpleSAML/Error/MethodNotAllowed.php new file mode 100644 index 0000000000..dff300db5d --- /dev/null +++ b/src/SimpleSAML/Error/MethodNotAllowed.php @@ -0,0 +1,33 @@ +includeTemplate = 'core:method_not_allowed.twig'; + parent::__construct( + [ + ErrorCodes::METHODNOTALLOWED, + '%MESSAGE%' => $cause->getMessage(), + ], + $cause, + 405, + ); + } +} From cf072f737abe8d8ad3d9afc5cefdf3d563a1ed4a Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 5 Sep 2024 18:22:48 +0200 Subject: [PATCH 189/532] Throw user-friendly exception with the proper HTTP statuscode (#2234) * Throw user-friendly exception with the proper HTTP statuscode for 'method not found' * Suppress traceback for MethodNotAllowed error, unless debug-logging is set * Be able to suppress error reporting for specific types of errors --- modules/core/locales/af/LC_MESSAGES/core.po | 2 +- modules/core/locales/ar/LC_MESSAGES/core.po | 2 +- modules/core/locales/cs/LC_MESSAGES/core.po | 2 +- modules/core/locales/da/LC_MESSAGES/core.po | 2 +- modules/core/locales/de/LC_MESSAGES/core.po | 2 +- modules/core/locales/el/LC_MESSAGES/core.po | 2 +- modules/core/locales/en/LC_MESSAGES/core.po | 4 +-- modules/core/locales/es/LC_MESSAGES/core.po | 2 +- modules/core/locales/et/LC_MESSAGES/core.po | 2 +- modules/core/locales/eu/LC_MESSAGES/core.po | 2 +- modules/core/locales/fr/LC_MESSAGES/core.po | 2 +- modules/core/locales/he/LC_MESSAGES/core.po | 2 +- modules/core/locales/hr/LC_MESSAGES/core.po | 2 +- modules/core/locales/hu/LC_MESSAGES/core.po | 2 +- modules/core/locales/id/LC_MESSAGES/core.po | 2 +- modules/core/locales/it/LC_MESSAGES/core.po | 2 +- modules/core/locales/ja/LC_MESSAGES/core.po | 2 +- modules/core/locales/lt/LC_MESSAGES/core.po | 2 +- modules/core/locales/lv/LC_MESSAGES/core.po | 2 +- modules/core/locales/nb/LC_MESSAGES/core.po | 2 +- modules/core/locales/nl/LC_MESSAGES/core.po | 2 +- modules/core/locales/nn/LC_MESSAGES/core.po | 2 +- .../core/locales/pt_BR/LC_MESSAGES/core.po | 2 +- modules/core/locales/ro/LC_MESSAGES/core.po | 2 +- modules/core/locales/ru/LC_MESSAGES/core.po | 2 +- modules/core/locales/sk/LC_MESSAGES/core.po | 2 +- modules/core/locales/sl/LC_MESSAGES/core.po | 2 +- modules/core/locales/sr/LC_MESSAGES/core.po | 2 +- modules/core/locales/st/LC_MESSAGES/core.po | 2 +- modules/core/locales/sv/LC_MESSAGES/core.po | 2 +- modules/core/locales/zh/LC_MESSAGES/core.po | 2 +- .../core/locales/zh_TW/LC_MESSAGES/core.po | 2 +- .../core/templates/method_not_allowed.twig | 6 ++++ modules/core/templates/no_metadata.twig | 2 +- src/SimpleSAML/Error/Error.php | 20 +++++------ src/SimpleSAML/Error/ErrorCodes.php | 3 ++ src/SimpleSAML/Error/ExceptionHandler.php | 8 +++-- src/SimpleSAML/Error/MethodNotAllowed.php | 33 +++++++++++++++++++ 38 files changed, 92 insertions(+), 46 deletions(-) create mode 100644 modules/core/templates/method_not_allowed.twig create mode 100644 src/SimpleSAML/Error/MethodNotAllowed.php diff --git a/modules/core/locales/af/LC_MESSAGES/core.po b/modules/core/locales/af/LC_MESSAGES/core.po index e8b466b1b0..bd3ce54fc5 100644 --- a/modules/core/locales/af/LC_MESSAGES/core.po +++ b/modules/core/locales/af/LC_MESSAGES/core.po @@ -5,7 +5,7 @@ msgstr "" msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "As jy 'n programmeerder is wat die 'single sign-on' oplossing implementeer, het jy 'n probleem met die metadata opset. Bevestig dat die metadata korrek ingestel is op beide die identiteit verskaffer en diensverskaffer." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "As jy 'n gebruiker is wat na aanleiding van 'n skakel op 'n webwerf hierdie fout ontvang het, moet jy hierdie fout aan die eienaar van die webwerf aan stuur." msgid "Missing cookie" diff --git a/modules/core/locales/ar/LC_MESSAGES/core.po b/modules/core/locales/ar/LC_MESSAGES/core.po index b782d73a63..61da113d20 100644 --- a/modules/core/locales/ar/LC_MESSAGES/core.po +++ b/modules/core/locales/ar/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "اذا استمرت هذه المشكلة بالحدوث، رجاءا ب msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr " و كانت (Single Sign-On) ان كنت مبرمجاً تعمل علي توفير حل لتوثيق دخول لمرة واحدة لديك مشكلة بادخال البيانات الوصفية, تأكد من أن أدخال البيانات الوصفية صحيح بكل من محدد الهوية و المخدم " -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "ان تعرضت لهذا الاشكال بعيد اتباعك لرابط بموقع ما, ينبغي عليك الابلاغ عن هذا الاشكال لمالك الموقع المعني" msgid "Metadata" diff --git a/modules/core/locales/cs/LC_MESSAGES/core.po b/modules/core/locales/cs/LC_MESSAGES/core.po index 3c3ef85e38..7645ec6a28 100644 --- a/modules/core/locales/cs/LC_MESSAGES/core.po +++ b/modules/core/locales/cs/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Pokud problém přetrvává, můžete ho nahlásit správci." msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Pokud jste vývojář nasazující řešení jednotného přihlašování, máte problém s konfigurací metadat. Ověřte, zda jsou metadata nakonfigurována správně jak u poskytovatele identity tak u poskytovatele služby." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Pokud jste uživatel, který obdržel chybu po následování odkazu na webové stránce, měli byste o této chybě informovat vlastníka této stránky. " msgid "Missing cookie" diff --git a/modules/core/locales/da/LC_MESSAGES/core.po b/modules/core/locales/da/LC_MESSAGES/core.po index 6a7ec1495d..09f2929999 100644 --- a/modules/core/locales/da/LC_MESSAGES/core.po +++ b/modules/core/locales/da/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Hvis dette problem fortsætter, kan du rapportere det til systemadminist msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Hvis du er udvikler, så har du et metadata-konfigurationsproblem. Tjek at metadata er konfigurerede korrekt både på service-siden og identitetsudbyder-siden." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Hvis du har modtaget denne fejlbesked efter at have klikket på et lilnk, skal du rappoterer fejlen til ejeren af siden. " msgid "Missing cookie" diff --git a/modules/core/locales/de/LC_MESSAGES/core.po b/modules/core/locales/de/LC_MESSAGES/core.po index 21ef993960..a1c8cc0503 100644 --- a/modules/core/locales/de/LC_MESSAGES/core.po +++ b/modules/core/locales/de/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Wenn das Problem weiter besteht, kannst du diesen Fehler den Systemadmin msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Arbeiten Sie selbst an einem Web Single Sign-On System, stimmt mit den benutzten Metadaten etwas nicht. Überprüfen Sie die Metadaten des Identity Providers und des Service Providers." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Sind Sie lediglich einem Verweis einer anderen Website hierher gefolgt, sollten Sie diesen Fehler den Betreibern der Website melden." msgid "Missing cookie" diff --git a/modules/core/locales/el/LC_MESSAGES/core.po b/modules/core/locales/el/LC_MESSAGES/core.po index 368d7d78f9..c3a4a27d79 100644 --- a/modules/core/locales/el/LC_MESSAGES/core.po +++ b/modules/core/locales/el/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Αν το πρόβλημα εξακολουθεί να υφίστατα msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Εάν είστε διαχειριστής της υπηρεσίας ταυτοποίησης και εξουσιοδότησης, τότε αντιμετωπίζετε κάποιο πρόβλημα με τη διαμόρφωση των μεταδεδομένων. Βεβαιωθείτε ότι τα μεταδεδομένα έχουν ρυθμιστεί σωστά τόσο στον πάροχο ταυτότητας όσο και στον πάροχο υπηρεσιών." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Αν λάβατε αυτό το σφάλμα ακολουθώντας έναν σύνδεσμο σε κάποιον ιστότοπο, θα πρέπει να το αναφέρετε στον ιδιοκτήτη του εν λόγω ιστότοπου." msgid "Missing cookie" diff --git a/modules/core/locales/en/LC_MESSAGES/core.po b/modules/core/locales/en/LC_MESSAGES/core.po index 1fbe42f3d2..15bb5d49bd 100644 --- a/modules/core/locales/en/LC_MESSAGES/core.po +++ b/modules/core/locales/en/LC_MESSAGES/core.po @@ -44,8 +44,8 @@ msgstr "If this problem persists, you can report it to the system administrators msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." -msgstr "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." +msgstr "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgid "If you report this error, please also report this tracking number which makes it possible to locate your session in the logs available to the system administrator:" msgstr "" diff --git a/modules/core/locales/es/LC_MESSAGES/core.po b/modules/core/locales/es/LC_MESSAGES/core.po index ab88a26dc6..b15ce650fb 100644 --- a/modules/core/locales/es/LC_MESSAGES/core.po +++ b/modules/core/locales/es/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Si el problema persiste, puede reportarlo a los administradores del sist msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Si usted es un desarrollador que está desplegando una solución de inicio único, tiene un problema con la configuración de sus metadatos. Verifique que los metadatos están configurados correctamente en el proveedor de identidad y en el proveedor de servicios" -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Si usted es un usuario que recibe este error luego de seguir un vínculo en un sitio, debe reportar el error al dueño del sitio." msgid "Missing cookie" diff --git a/modules/core/locales/et/LC_MESSAGES/core.po b/modules/core/locales/et/LC_MESSAGES/core.po index 4cf8b4679c..448db91305 100644 --- a/modules/core/locales/et/LC_MESSAGES/core.po +++ b/modules/core/locales/et/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Kui probleem ei kao, siis teavita sellest süsteemi administraatoreid." msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Kui sa oled arendaja, kes juurutab ühekordse sisselogimise lahendust, siis on probleemi põhjuseks metaandmete seadistused. Kontrolli, et metaandmed oleks seadistatud korrektselt nii identiteedipakkuja kui teenusepakkuja poolel." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Kui sa oled kasutaja, kes sai selle veateate veebilehel linki klõpsates, siis peaksid sellest tõrkest veebilehe omanikku teavitama." msgid "Missing cookie" diff --git a/modules/core/locales/eu/LC_MESSAGES/core.po b/modules/core/locales/eu/LC_MESSAGES/core.po index a9080ec018..27bd10e845 100644 --- a/modules/core/locales/eu/LC_MESSAGES/core.po +++ b/modules/core/locales/eu/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Arazoak bere horretan badirau, sistemaren administratzaileei berri eman msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Hasiera-bakarreko sistema bat zabaltzen ari zaren garatzaile bat bazara, arazo bat duzu zure metadatuen kongigurazioarekin. Egiazta ezazu metadatuak zuzen konfiguratuak daudela identitate hornitzailean eta zerbitzu hornitzailean." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Gune bateko lotura bat jarraituz errore hau jasotzen duen erabiltzaile bat bazara, guneko jabeari eman behar diozu errorearen berri." msgid "Missing cookie" diff --git a/modules/core/locales/fr/LC_MESSAGES/core.po b/modules/core/locales/fr/LC_MESSAGES/core.po index 6723467564..206a868ff6 100644 --- a/modules/core/locales/fr/LC_MESSAGES/core.po +++ b/modules/core/locales/fr/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Si ce problème persiste, vous pouvez le remonter vers l'administrateur msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Si vous êtes un développeur qui déploie une solution de single sign-on, vous avez un problème avec la configuration des métadonnées. Vérifiez que ces métadonnées sont correctement configurées sur le fournisseur d'identité et le fournisseur de service " -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Si vous êtes un usager qui reçoit cette erreur après avoir suivi un lien sur un site, vous devriez remonter cette erreur au propriétaire de ce site." msgid "Missing cookie" diff --git a/modules/core/locales/he/LC_MESSAGES/core.po b/modules/core/locales/he/LC_MESSAGES/core.po index 43d25e0b96..c91f12f370 100644 --- a/modules/core/locales/he/LC_MESSAGES/core.po +++ b/modules/core/locales/he/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "אם הבעייה ממשיכה, אתה יכול לדווח עליה למ msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "אם אתה מפתח שפורש פיתרון התחברות יחידה, יש לך בעייה עם הגדרות המטא-מידע. בדוק שהמטא-מידע מוגדר נכון בספקי הזהות והשרות." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "אם אתה משתמש שקיבל שגיאה זו לאחר לחיצה על קישור באתר, כדי שתדווח על השגיאה לבעלי האתר." msgid "Missing cookie" diff --git a/modules/core/locales/hr/LC_MESSAGES/core.po b/modules/core/locales/hr/LC_MESSAGES/core.po index 24006607ea..fd98d63082 100644 --- a/modules/core/locales/hr/LC_MESSAGES/core.po +++ b/modules/core/locales/hr/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Ako se ova greška bude i dalje pojavljivala, možete ju prijaviti admin msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Ako ste programer koji postavlja sustav jedinstvene autentifikacije (Single Sign-On sustav), tada imate problema s konfiguracijom metapodataka. Provjerite jesu li metapodaci ispravno uneseni i na strani davatelja usluge i u konfiguraciji autentifikacijskog servisa." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Ako se ova greška pojavila nakon što ste slijedili poveznicu na nekoj web stranici, onda biste grešku trebali prijaviti vlasniku navedene stranice." msgid "Missing cookie" diff --git a/modules/core/locales/hu/LC_MESSAGES/core.po b/modules/core/locales/hu/LC_MESSAGES/core.po index cd08cb4728..9cddfd22e7 100644 --- a/modules/core/locales/hu/LC_MESSAGES/core.po +++ b/modules/core/locales/hu/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Ha a probléma állandónak tűnik, kérjük, jelezze ezt az oldal admin msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Ha ön az oldal üzemeltetője, úgy javasoljuk, ellenőrizze a metaadat beállításokat mint IdP-, mind SP oldalon." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Amennyiben ön, mint felhasználó keveredett erre az oldalra, úgy kérjük, a hibával keresse az oldal adminisztrátorát." msgid "Missing cookie" diff --git a/modules/core/locales/id/LC_MESSAGES/core.po b/modules/core/locales/id/LC_MESSAGES/core.po index fd6a9b957e..619ccab2a1 100644 --- a/modules/core/locales/id/LC_MESSAGES/core.po +++ b/modules/core/locales/id/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Jika masalah ini tetap terjadi, anda dapat melaporkannnya ke system admi msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Jika anda adalah pengembang yang mendeploy solusi sing-on, anda memiliki masalah dengan konfigurasi metadata. Periksalah kalau metadata telah dikonfigurasi dengan benar baik pada sisi identity provider dan pada sisi service provider." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Jika adalah user yang menerika error ini setelah mengklik link pada sebuah situs, anda harus melaporkan error ini kepada pemilik situs tersebut" msgid "Missing cookie" diff --git a/modules/core/locales/it/LC_MESSAGES/core.po b/modules/core/locales/it/LC_MESSAGES/core.po index fbaa4e895a..1d85408b21 100644 --- a/modules/core/locales/it/LC_MESSAGES/core.po +++ b/modules/core/locales/it/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Se questo problema persiste, è possibile segnalarlo agli amministratori msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Se sei uno sviluppatore che sta sviluppando una soluzione di single sign-on, hai un problema con la configurazione dei metadati. Verifica che siano correttamente configurati sia sull'identity provider che sul service provider." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Se sei un utente che ha ricevuto questo errore dopo aver cliccato un link su un sito, dovresti riportare questo errore al gestore di quel sito." msgid "Missing cookie" diff --git a/modules/core/locales/ja/LC_MESSAGES/core.po b/modules/core/locales/ja/LC_MESSAGES/core.po index 791effdd65..28d39bb3e7 100644 --- a/modules/core/locales/ja/LC_MESSAGES/core.po +++ b/modules/core/locales/ja/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "この問題が継続して起こる場合、システム管理者に報 msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "もしあなたが開発者でシングルサインオンシステムの構築者である場合、メタデータの設定に問題があります。アイデンティティプロバイダとサービスプロバイダの両方にメタデータが正しく設定されているか確認してください。" -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "もしあなたがユーザーで以下のリンクのサイトでこのエラーを受け取ったのであれば、このエラーをサイトの管理者に報告してください。" msgid "Missing cookie" diff --git a/modules/core/locales/lt/LC_MESSAGES/core.po b/modules/core/locales/lt/LC_MESSAGES/core.po index 35cae44a45..d1d804658b 100644 --- a/modules/core/locales/lt/LC_MESSAGES/core.po +++ b/modules/core/locales/lt/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Jei ši problema išliks, galite pranešti apie tai sistemos administrat msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Jei Jūs esate kūrėjas, kuris diegiate SSO sprendimą, Jums iškilo problema susijusi su metaduomenų konfigūracija. Patikrinkite, ar metaduomenys teisingai sukonfigūruoti tiek tapatybių teikėjo, tiek paslaugos teikėjo pusėse." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Jei Jūs esate naudotojas, kuris gavote šią klaidą spragtelėjęs nuorodą tinklapyje, Jūs turėtumėte informuoti tinklapio administratorių apie šią klaidą." msgid "Missing cookie" diff --git a/modules/core/locales/lv/LC_MESSAGES/core.po b/modules/core/locales/lv/LC_MESSAGES/core.po index 6d2c56c27b..e5f9ecd701 100644 --- a/modules/core/locales/lv/LC_MESSAGES/core.po +++ b/modules/core/locales/lv/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Ja problēma atkārtojas, varat ziņot sistēmas administratoriem." msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Ja Jūs esat vienotas pieslēgšanās risinājuma izstrādātājs, Jūsu metadatu konfigurācijā ir kļūda. Pārbaudiet tos gan pie identitātes piegādātāja, gan pie servisa piegādātāja." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Ja Jūs esat lietotājs un saņemat šo kļūdu, sekojot saitei kādā interneta lapā, Jums jāziņo par šo kļūdu lapas īpašniekam." msgid "Missing cookie" diff --git a/modules/core/locales/nb/LC_MESSAGES/core.po b/modules/core/locales/nb/LC_MESSAGES/core.po index df5b520a0a..07692e0e6d 100644 --- a/modules/core/locales/nb/LC_MESSAGES/core.po +++ b/modules/core/locales/nb/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Hvis problemet vedvarer, kan du rapportere det til systemadministratoren msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Hvis du er en utvikler som setter opp en \"single sign-on\" løsning, så har du et problem med metadataoppsettet. Kontroller at metadata er riktig konfigurert hos både identitetsleverandøren og tjenesteleverandøren." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Hvis du er en bruker som fikk denne feilen etter at du fulgte en link på en nettside, så bør du rapportere denne feilen til eieren av den nettsiden." msgid "Missing cookie" diff --git a/modules/core/locales/nl/LC_MESSAGES/core.po b/modules/core/locales/nl/LC_MESSAGES/core.po index eb80dfcfe2..781f840590 100644 --- a/modules/core/locales/nl/LC_MESSAGES/core.po +++ b/modules/core/locales/nl/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "If dit probleem behoud, dan kun je het melden aan de systeem beheerders. msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Als u een ontwikkelaar bent die een single sign-on oplossing aan het implementeren is, heeft u een probleem met de metadataconfiguratie. Controleer of de metadata correct is geconfigureerd zowel bij de identiteitsverstrekker als bij de service provider." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Als u een eindgebruiker bent die deze foutmelding kreeg na het volgen van een link op een site, dan kunt u deze fout melden bij de eigenaar van die site." msgid "Missing cookie" diff --git a/modules/core/locales/nn/LC_MESSAGES/core.po b/modules/core/locales/nn/LC_MESSAGES/core.po index 1b3f9737c1..3d9f9ac2ca 100644 --- a/modules/core/locales/nn/LC_MESSAGES/core.po +++ b/modules/core/locales/nn/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Om problemet vedvarar, kan du rapportere det til systemadministratorane. msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Om du er ein utviklar som set opp ei \"single sign-on\" løysing, så har du eit problem med metadataoppsettet. Kontroller at metadata er rett satt opp hjå både identitetsleverandøren og tenesteleverandøren." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Om du er ein brukar som mottok denne feilen etter at du følgde ei lenke på ei nettside, så bør du melde denne feilen til eigaren av den nettsida." msgid "Missing cookie" diff --git a/modules/core/locales/pt_BR/LC_MESSAGES/core.po b/modules/core/locales/pt_BR/LC_MESSAGES/core.po index 42d6e701aa..28608e5abe 100644 --- a/modules/core/locales/pt_BR/LC_MESSAGES/core.po +++ b/modules/core/locales/pt_BR/LC_MESSAGES/core.po @@ -11,7 +11,7 @@ msgstr "Hospedado Shibboleth 1.3 Service Provider Metadata (gerado automaticamen msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Se você é um desenvolvedor que está implantando uma solução SSO, você tem um problema com a configuração de metadados. Verifique se os metadados estão configurados corretamente no provedor de identidade e no provedor de serviços." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Se você é um usuário que recebeu esse erro depois de seguir um link em um site, você deve relatar esse erro para o proprietário do site." msgid "Shibboleth 1.3 SP example - test logging in through your Shib IdP" diff --git a/modules/core/locales/ro/LC_MESSAGES/core.po b/modules/core/locales/ro/LC_MESSAGES/core.po index 04aeef0232..d38f98dbe9 100644 --- a/modules/core/locales/ro/LC_MESSAGES/core.po +++ b/modules/core/locales/ro/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Dacă problema persistă, anunțați administratorii de sistem." msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Dacă sunteți dezvoltator care implementează o soluție single sign-on, aveți o problemă la configurarea metadatelor. Vă rugăm să verificați configurarea corectă a metadatelor, atât la furnizorul de identitate cât și la furnizorul de servicii." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Dacă sunteți un utilizator care a primit acest mesaj de eroare în urma utilizării unui link din alt sit, vă rugăm să anunțați această eroare deținătorului sitului respectiv." msgid "Missing cookie" diff --git a/modules/core/locales/ru/LC_MESSAGES/core.po b/modules/core/locales/ru/LC_MESSAGES/core.po index 73999cf94a..b369877b35 100644 --- a/modules/core/locales/ru/LC_MESSAGES/core.po +++ b/modules/core/locales/ru/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Если проблема остается, сообщить об это msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Если вы разработчик внедряющий Технологию единого вход (SSO), у вас есть проблемы с метаданными конфигурации. Убедитесь, что метаданные настроены правильно на Провайдере подлинности и Поставщике услуг." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Если, перейдя по ссылке на сайт, вы увидели эту ошибку, вы должны сообщить об этом владелецу этого сайта." msgid "Missing cookie" diff --git a/modules/core/locales/sk/LC_MESSAGES/core.po b/modules/core/locales/sk/LC_MESSAGES/core.po index 5e716056f5..3b9cee1438 100644 --- a/modules/core/locales/sk/LC_MESSAGES/core.po +++ b/modules/core/locales/sk/LC_MESSAGES/core.po @@ -44,7 +44,7 @@ msgstr "Ak tento problém pretrváva, môžete odoslať hlásenie systémovým a msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Ak ste vývojár a nastavujete systém jednotného prihlásenia, máte problém s konfiguráciou metadát. Skontrolujte, či sú metadáta nakonfigurované správne na oboch stranách - poskytovateľa služby a poskytovateľa identity" -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Ak ste dostali túto chybu po kliknutí na odkaz na nejakej stránky, mali by ste túto chybu nahlásiť vlastníkovi tejto stránky." msgid "If you report this error, please also report this tracking number which makes it possible to locate your session in the logs available to the system administrator:" diff --git a/modules/core/locales/sl/LC_MESSAGES/core.po b/modules/core/locales/sl/LC_MESSAGES/core.po index 4f5470809a..4cac02ff50 100644 --- a/modules/core/locales/sl/LC_MESSAGES/core.po +++ b/modules/core/locales/sl/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Če se ta napaka ponavlja, jo lahko prijavite za skrbniku sistema." msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Če ste razvijalec, ki razvija SSO rešitev preverite, ali so nastavitve metapodatkov ustrezne, tako na stani ponudnika identitete (IdP), kot na strani ponudnika storitve (SP)." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Če ste na to težavo naleteli po kliku povezave te spletne strani, prijavite težavo skrbniku te spletne strani." msgid "Missing cookie" diff --git a/modules/core/locales/sr/LC_MESSAGES/core.po b/modules/core/locales/sr/LC_MESSAGES/core.po index 74080e7dc0..e4cc14a9a8 100644 --- a/modules/core/locales/sr/LC_MESSAGES/core.po +++ b/modules/core/locales/sr/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Ako se ova greška bude i dalje pojavljivala, možete je prijaviti admin msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Postoji greška sa podešavanjima metapodataka. Ukoliko ste administrator sistema, proverite da li metapodaci ispravno uneseni na strani davaoca servisa i davaoca identiteta." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Ukoliko se ova greška pojavila nakon što ste sledili link na nekoj web stranici, onda biste grešku trebali prijaviti vlasniku navedene stranice." msgid "Missing cookie" diff --git a/modules/core/locales/st/LC_MESSAGES/core.po b/modules/core/locales/st/LC_MESSAGES/core.po index ac7de9a565..89033304dc 100644 --- a/modules/core/locales/st/LC_MESSAGES/core.po +++ b/modules/core/locales/st/LC_MESSAGES/core.po @@ -17,7 +17,7 @@ msgstr "Haeba bothata bona bo phehella, o ka bo tlaleha ho batsamaisi ba sistimi msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Haeba o mohlahisi ya sebedisang tharollo ya ho saena hang, o na le bothata ka phetolo ya metadata. Netefatsa hore metadata e hlophiswe ka ho nepahala ho bobedi mofani wa boitsebiso le mofani wa tshebeletso." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Haeba o le mosebedisi ya fumaneng phoso ena kamora ho latela lehokela le setsing, o tlameha ho tlaleha phoso ena ho monga setsi." msgid "Incorrect Attributes" diff --git a/modules/core/locales/sv/LC_MESSAGES/core.po b/modules/core/locales/sv/LC_MESSAGES/core.po index c4bd09412c..6915278b13 100644 --- a/modules/core/locales/sv/LC_MESSAGES/core.po +++ b/modules/core/locales/sv/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "Om problemet kvarstår kan du rapportera det till systemadministratörer msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "Om du är en utvecklare som driftsätter en lösning med single-on har du problem med metadatakonfigurationen. Kontrollera att metadata är korrekt konfigurerade både i identitetsutgivare och tjänsteleverantören." -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "Om du är en användare och fick detta fel när du klickade på en länk bör du rapportera felet till den som hanterar webbplatsen med länken." msgid "Missing cookie" diff --git a/modules/core/locales/zh/LC_MESSAGES/core.po b/modules/core/locales/zh/LC_MESSAGES/core.po index 7258481b4b..cd47a0fcc2 100644 --- a/modules/core/locales/zh/LC_MESSAGES/core.po +++ b/modules/core/locales/zh/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "如果这个错误再次出现,你可以向你的系统管理员报告 msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "如果你是部署这个单点登录系统的开发人员,那么你的配置文件存在问题,验证服务提供者和身份提供者是否配置正确" -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "如果你是点击一个网站上的链接后收到该错误的用户,你应该报告这个错误给站点所有人" msgid "Missing cookie" diff --git a/modules/core/locales/zh_TW/LC_MESSAGES/core.po b/modules/core/locales/zh_TW/LC_MESSAGES/core.po index e0920b716d..6c98953842 100644 --- a/modules/core/locales/zh_TW/LC_MESSAGES/core.po +++ b/modules/core/locales/zh_TW/LC_MESSAGES/core.po @@ -23,7 +23,7 @@ msgstr "如果這個錯誤持續存在,您可以將它回報系統管理者。 msgid "If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider." msgstr "若您是單一簽入程式開發人員,您的詮釋資料設定可能有問題。請確認服務提供者或驗證提供者之詮釋資料設定檔是否正確。" -msgid "If you are an user who received this error after following a link on a site, you should report this error to the owner of that site." +msgid "If you are a user who received this error after following a link on a site, you should report this error to the owner of that site." msgstr "若您是個使用者,而您於此網站收到下列連結,請反映此錯誤給此站管理員。" msgid "Missing cookie" diff --git a/modules/core/templates/method_not_allowed.twig b/modules/core/templates/method_not_allowed.twig new file mode 100644 index 0000000000..4ae99ae124 --- /dev/null +++ b/modules/core/templates/method_not_allowed.twig @@ -0,0 +1,6 @@ +

{{ 'This is most likely a configuration problem on either the service provider or identity provider.'|trans }}

+ +
    +
  • {{ 'If you are a user who received this error after following a link on a site, you should report this error to the owner of that site.'|trans }}
  • +
  • {{ 'If you are a developer who is deploying a single sign-on solution, you have are trying to reach an endpoint using the wrong HTTP-method.'|trans }}
  • +
diff --git a/modules/core/templates/no_metadata.twig b/modules/core/templates/no_metadata.twig index 218358fb0c..42184165c2 100644 --- a/modules/core/templates/no_metadata.twig +++ b/modules/core/templates/no_metadata.twig @@ -1,7 +1,7 @@

{{ 'This is most likely a configuration problem on either the service provider or identity provider.'|trans }}

    -
  • {{ 'If you are an user who received this error after following a link on a site, you should report this error to the owner of that site.'|trans }}
  • +
  • {{ 'If you are a user who received this error after following a link on a site, you should report this error to the owner of that site.'|trans }}
  • {{ 'If you are a developer who is deploying a single sign-on solution, you have a problem with the metadata configuration. Verify that metadata is configured correctly on both the identity provider and service provider.'|trans }}
diff --git a/src/SimpleSAML/Error/Error.php b/src/SimpleSAML/Error/Error.php index 37f68d82e2..f10477cdf1 100644 --- a/src/SimpleSAML/Error/Error.php +++ b/src/SimpleSAML/Error/Error.php @@ -5,11 +5,7 @@ namespace SimpleSAML\Error; use SimpleSAML\Assert\Assert; -use SimpleSAML\Configuration; -use SimpleSAML\Logger; -use SimpleSAML\Module; -use SimpleSAML\Session; -use SimpleSAML\Utils; +use SimpleSAML\{Configuration, Logger, Module, Session, Utils}; use SimpleSAML\XHTML\Template; use Throwable; @@ -203,7 +199,6 @@ protected function saveError(): array $etrace = implode("\n", $data); $reportId = bin2hex(openssl_random_pseudo_bytes(4)); - Logger::error('Error report with id ' . $reportId . ' generated.'); $config = Configuration::getInstance(); $session = Session::getSessionFromRequest(); @@ -238,13 +233,16 @@ protected function saveError(): array * Display this error. * * This method displays a standard SimpleSAMLphp error page and exits. + * + * @param int $logLevel The log-level for this exception + * @param bool $suppressReport Whether or not sending an error report is an option */ - public function show(): void + public function show(int $logLevel = Logger::ERR, bool $suppressReport = false): void { // log the error message - $this->logError(); - + $this->log($logLevel); $errorData = $this->saveError(); + $config = Configuration::getInstance(); $data = []; @@ -260,12 +258,14 @@ public function show(): void // check if there is a valid technical contact email address if ( - $config->getOptionalBoolean('errorreporting', true) + $suppressReport === false + && $config->getOptionalBoolean('errorreporting', true) && $config->getOptionalString('technicalcontact_email', 'na@example.org') !== 'na@example.org' ) { // enable error reporting $httpUtils = new Utils\HTTP(); $data['errorReportAddress'] = Module::getModuleURL('core/errorReport'); + Logger::error('Error report with id ' . $errorData['reportId'] . ' generated.'); } $data['email'] = ''; diff --git a/src/SimpleSAML/Error/ErrorCodes.php b/src/SimpleSAML/Error/ErrorCodes.php index c3bd92b6bb..c343b6dda2 100644 --- a/src/SimpleSAML/Error/ErrorCodes.php +++ b/src/SimpleSAML/Error/ErrorCodes.php @@ -40,6 +40,7 @@ public function __construct() public const MEMCACHEDOWN = 'MEMCACHEDOWN'; public const METADATA = 'METADATA'; public const METADATANOTFOUND = 'METADATANOTFOUND'; + public const METHODNOTALLOWED = 'METHODNOTALLOWED'; public const NOACCESS = 'NOACCESS'; public const NOCERT = 'NOCERT'; public const NORELAYSTATE = 'NORELAYSTATE'; @@ -91,6 +92,7 @@ final public static function defaultGetAllErrorCodeTitles(): array self::MEMCACHEDOWN => Translate::noop('Cannot retrieve session data'), self::METADATA => Translate::noop('Error loading metadata'), self::METADATANOTFOUND => Translate::noop('Metadata not found'), + self::METHODNOTALLOWED => Translate::noop('Method not allowed'), self::NOACCESS => Translate::noop('No access'), self::NOCERT => Translate::noop('No certificate'), self::NORELAYSTATE => Translate::noop('No RelayState'), @@ -233,6 +235,7 @@ final public static function defaultGetAllErrorCodeDescriptions(): array " are the administrator of this service, you should make sure your " . "metadata configuration is correctly setup."), self::METADATANOTFOUND => Translate::noop('Unable to locate metadata for %ENTITYID%'), + self::METHODNOTALLOWED => Translate::noop('%MESSAGE%'), self::NOACCESS => Translate::noop("" . "This endpoint is not enabled. Check the enable options in your " . "configuration of SimpleSAMLphp."), diff --git a/src/SimpleSAML/Error/ExceptionHandler.php b/src/SimpleSAML/Error/ExceptionHandler.php index 3041784988..e73302ea27 100644 --- a/src/SimpleSAML/Error/ExceptionHandler.php +++ b/src/SimpleSAML/Error/ExceptionHandler.php @@ -6,7 +6,8 @@ use Error as BuiltinError; use Exception as BuiltinException; -use SimpleSAML\Module; +use SimpleSAML\{Logger, Module}; +use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; use Throwable; use function class_exists; @@ -26,7 +27,10 @@ public function customExceptionHandler(Throwable $exception): void { Module::callHooks('exception_handler', $exception); - if ($exception instanceof Error) { + if ($exception instanceof MethodNotAllowedHttpException) { + $e = new MethodNotAllowed($exception); + $e->show(Logger::DEBUG, true); + } elseif ($exception instanceof Error) { $exception->show(); } elseif ($exception instanceof BuiltinException) { $e = new Error(ErrorCodes::UNHANDLEDEXCEPTION, $exception); diff --git a/src/SimpleSAML/Error/MethodNotAllowed.php b/src/SimpleSAML/Error/MethodNotAllowed.php new file mode 100644 index 0000000000..dff300db5d --- /dev/null +++ b/src/SimpleSAML/Error/MethodNotAllowed.php @@ -0,0 +1,33 @@ +includeTemplate = 'core:method_not_allowed.twig'; + parent::__construct( + [ + ErrorCodes::METHODNOTALLOWED, + '%MESSAGE%' => $cause->getMessage(), + ], + $cause, + 405, + ); + } +} From 05da31e775882903291e508392c9f752e1eb9e70 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 5 Sep 2024 19:08:21 +0200 Subject: [PATCH 190/532] Release 2.3.1 --- composer.json | 2 +- composer.lock | 480 +++++++++++++++---------------- docs/simplesamlphp-changelog.md | 7 +- extra/simplesamlphp.spec | 2 +- src/SimpleSAML/Configuration.php | 2 +- 5 files changed, 242 insertions(+), 251 deletions(-) diff --git a/composer.json b/composer.json index 4f766a691a..e7b132762b 100644 --- a/composer.json +++ b/composer.json @@ -129,5 +129,5 @@ "translations:unused": "php bin/translations translations:unused", "translations:update:translatable": "php bin/translations translations:update:translatable" }, - "version": "v2.3.0" + "version": "v2.3.1" } diff --git a/composer.lock b/composer.lock index 964cf3f8a8..21f995c6a9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d7fd451e223bbeefa23ea28e2b09064c", + "content-hash": "1c0b6d5f21924e1ec7135582a2a76cb5", "packages": [ { "name": "gettext/gettext", @@ -655,16 +655,16 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "79dff0b268932c640297f5208d6298f71855c03e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/79dff0b268932c640297f5208d6298f71855c03e", + "reference": "79dff0b268932c640297f5208d6298f71855c03e", "shasum": "" }, "require": { @@ -699,9 +699,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.1" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-08-21T13:31:24+00:00" }, { "name": "robrichards/xmlseclibs", @@ -747,16 +747,16 @@ }, { "name": "simplesamlphp/assert", - "version": "v1.2.1", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/assert.git", - "reference": "bc80f10858179af2516b48643f3ec43ae7a36937" + "reference": "7b7ef2a68eb0e36e67915ebd802e1bb29483d7d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/bc80f10858179af2516b48643f3ec43ae7a36937", - "reference": "bc80f10858179af2516b48643f3ec43ae7a36937", + "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/7b7ef2a68eb0e36e67915ebd802e1bb29483d7d9", + "reference": "7b7ef2a68eb0e36e67915ebd802e1bb29483d7d9", "shasum": "" }, "require": { @@ -769,6 +769,7 @@ "webmozart/assert": "^1.11" }, "require-dev": { + "ext-intl": "*", "simplesamlphp/simplesamlphp-test-framework": "^1.7" }, "type": "library", @@ -799,9 +800,9 @@ "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments", "support": { "issues": "https://github.com/simplesamlphp/assert/issues", - "source": "https://github.com/simplesamlphp/assert/tree/v1.2.1" + "source": "https://github.com/simplesamlphp/assert/tree/v1.3.0" }, - "time": "2024-07-23T14:28:59+00:00" + "time": "2024-07-26T11:30:06+00:00" }, { "name": "simplesamlphp/composer-module-installer", @@ -906,16 +907,16 @@ }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.2.7", + "version": "v2.2.8", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "06da64ae4c7d3fae044d076d6523acff4561d11f" + "reference": "939224aa1ebdfa4207e257f37cfe453e90eccbc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/06da64ae4c7d3fae044d076d6523acff4561d11f", - "reference": "06da64ae4c7d3fae044d076d6523acff4561d11f", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/939224aa1ebdfa4207e257f37cfe453e90eccbc8", + "reference": "939224aa1ebdfa4207e257f37cfe453e90eccbc8", "shasum": "" }, "require": { @@ -936,22 +937,22 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.2.7" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.2.8" }, - "time": "2024-08-19T18:08:18+00:00" + "time": "2024-09-01T19:55:36+00:00" }, { "name": "simplesamlphp/xml-common", - "version": "v1.17.0", + "version": "v1.17.2", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "d06e0c6b4f42048181aec575211ff0ac171b0ec1" + "reference": "c76769ab4e8eb7153f31d083e7af7f06f9747ed7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/d06e0c6b4f42048181aec575211ff0ac171b0ec1", - "reference": "d06e0c6b4f42048181aec575211ff0ac171b0ec1", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/c76769ab4e8eb7153f31d083e7af7f06f9747ed7", + "reference": "c76769ab4e8eb7153f31d083e7af7f06f9747ed7", "shasum": "" }, "require": { @@ -997,20 +998,20 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2024-07-25T08:25:58+00:00" + "time": "2024-09-03T19:35:21+00:00" }, { "name": "simplesamlphp/xml-security", - "version": "v1.8.5", + "version": "v1.8.7", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-security.git", - "reference": "a2ac09c77c68833b3530c3c49ff0e248f0f5b077" + "reference": "10071025f286b49edd7f30a12ab216515c170925" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/a2ac09c77c68833b3530c3c49ff0e248f0f5b077", - "reference": "a2ac09c77c68833b3530c3c49ff0e248f0f5b077", + "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/10071025f286b49edd7f30a12ab216515c170925", + "reference": "10071025f286b49edd7f30a12ab216515c170925", "shasum": "" }, "require": { @@ -1059,22 +1060,22 @@ ], "support": { "issues": "https://github.com/simplesamlphp/xml-security/issues", - "source": "https://github.com/simplesamlphp/xml-security/tree/v1.8.5" + "source": "https://github.com/simplesamlphp/xml-security/tree/v1.8.7" }, - "time": "2024-07-30T09:38:52+00:00" + "time": "2024-09-03T18:57:31+00:00" }, { "name": "symfony/cache", - "version": "v6.4.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "6702d2d777260e6ff3451fee2d7d78ab5f715cdc" + "reference": "36daef8fce88fe0b9a4f8cf4c342ced5c05616dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/6702d2d777260e6ff3451fee2d7d78ab5f715cdc", - "reference": "6702d2d777260e6ff3451fee2d7d78ab5f715cdc", + "url": "https://api.github.com/repos/symfony/cache/zipball/36daef8fce88fe0b9a4f8cf4c342ced5c05616dc", + "reference": "36daef8fce88fe0b9a4f8cf4c342ced5c05616dc", "shasum": "" }, "require": { @@ -1141,7 +1142,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.10" + "source": "https://github.com/symfony/cache/tree/v6.4.11" }, "funding": [ { @@ -1157,7 +1158,7 @@ "type": "tidelift" } ], - "time": "2024-07-17T06:05:49+00:00" + "time": "2024-08-05T07:40:31+00:00" }, { "name": "symfony/cache-contracts", @@ -1312,16 +1313,16 @@ }, { "name": "symfony/console", - "version": "v6.4.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc" + "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/504974cbe43d05f83b201d6498c206f16fc0cdbc", - "reference": "504974cbe43d05f83b201d6498c206f16fc0cdbc", + "url": "https://api.github.com/repos/symfony/console/zipball/42686880adaacdad1835ee8fc2a9ec5b7bd63998", + "reference": "42686880adaacdad1835ee8fc2a9ec5b7bd63998", "shasum": "" }, "require": { @@ -1386,7 +1387,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.10" + "source": "https://github.com/symfony/console/tree/v6.4.11" }, "funding": [ { @@ -1402,20 +1403,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-08-15T22:48:29+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb" + "reference": "e93c8368dc9915c2fe12018ff22fcbbdd32c9a9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5caf9c5f6085f13b27d70a236b776c07e4a1c3eb", - "reference": "5caf9c5f6085f13b27d70a236b776c07e4a1c3eb", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e93c8368dc9915c2fe12018ff22fcbbdd32c9a9e", + "reference": "e93c8368dc9915c2fe12018ff22fcbbdd32c9a9e", "shasum": "" }, "require": { @@ -1467,7 +1468,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.10" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.11" }, "funding": [ { @@ -1483,7 +1484,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T07:32:07+00:00" + "time": "2024-08-29T08:15:38+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1851,16 +1852,16 @@ }, { "name": "symfony/finder", - "version": "v6.4.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "af29198d87112bebdd397bd7735fbd115997824c" + "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/af29198d87112bebdd397bd7735fbd115997824c", - "reference": "af29198d87112bebdd397bd7735fbd115997824c", + "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453", + "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453", "shasum": "" }, "require": { @@ -1895,7 +1896,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.10" + "source": "https://github.com/symfony/finder/tree/v6.4.11" }, "funding": [ { @@ -1911,7 +1912,7 @@ "type": "tidelift" } ], - "time": "2024-07-24T07:06:38+00:00" + "time": "2024-08-13T14:27:37+00:00" }, { "name": "symfony/framework-bundle", @@ -2140,16 +2141,16 @@ }, { "name": "symfony/http-kernel", - "version": "v6.4.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "147e0daf618d7575b5007055340d09aece5cf068" + "reference": "1ba6b89d781cb47448155cc70dd2e0f1b0584c79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/147e0daf618d7575b5007055340d09aece5cf068", - "reference": "147e0daf618d7575b5007055340d09aece5cf068", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1ba6b89d781cb47448155cc70dd2e0f1b0584c79", + "reference": "1ba6b89d781cb47448155cc70dd2e0f1b0584c79", "shasum": "" }, "require": { @@ -2234,7 +2235,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.10" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.11" }, "funding": [ { @@ -2250,7 +2251,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T14:52:04+00:00" + "time": "2024-08-30T16:57:20+00:00" }, { "name": "symfony/intl", @@ -2809,86 +2810,6 @@ ], "time": "2024-06-19T12:30:46+00:00" }, - { - "name": "symfony/polyfill-php80", - "version": "v1.30.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-05-31T15:07:36+00:00" - }, { "name": "symfony/polyfill-php81", "version": "v1.30.0", @@ -3043,16 +2964,16 @@ }, { "name": "symfony/routing", - "version": "v6.4.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87" + "reference": "8ee0c24c1bf61c263a26f1b9b6d19e83b1121f2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/aad19fe10753ba842f0d653a8db819c4b3affa87", - "reference": "aad19fe10753ba842f0d653a8db819c4b3affa87", + "url": "https://api.github.com/repos/symfony/routing/zipball/8ee0c24c1bf61c263a26f1b9b6d19e83b1121f2a", + "reference": "8ee0c24c1bf61c263a26f1b9b6d19e83b1121f2a", "shasum": "" }, "require": { @@ -3106,7 +3027,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.10" + "source": "https://github.com/symfony/routing/tree/v6.4.11" }, "funding": [ { @@ -3122,7 +3043,7 @@ "type": "tidelift" } ], - "time": "2024-07-15T09:26:24+00:00" + "time": "2024-08-29T08:15:38+00:00" }, { "name": "symfony/service-contracts", @@ -3209,16 +3130,16 @@ }, { "name": "symfony/string", - "version": "v6.4.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ccf9b30251719567bfd46494138327522b9a9446" + "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ccf9b30251719567bfd46494138327522b9a9446", - "reference": "ccf9b30251719567bfd46494138327522b9a9446", + "url": "https://api.github.com/repos/symfony/string/zipball/5bc3eb632cf9c8dbfd6529d89be9950d1518883b", + "reference": "5bc3eb632cf9c8dbfd6529d89be9950d1518883b", "shasum": "" }, "require": { @@ -3275,7 +3196,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.10" + "source": "https://github.com/symfony/string/tree/v6.4.11" }, "funding": [ { @@ -3291,7 +3212,7 @@ "type": "tidelift" } ], - "time": "2024-07-22T10:21:14+00:00" + "time": "2024-08-12T09:55:28+00:00" }, { "name": "symfony/translation-contracts", @@ -3373,16 +3294,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v6.4.9", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "9bcb26445b9d4ef1087c389234bf33fb00e10ea6" + "reference": "2cf03a4012631b74d68f9e6c3e03798ac592cbe5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/9bcb26445b9d4ef1087c389234bf33fb00e10ea6", - "reference": "9bcb26445b9d4ef1087c389234bf33fb00e10ea6", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/2cf03a4012631b74d68f9e6c3e03798ac592cbe5", + "reference": "2cf03a4012631b74d68f9e6c3e03798ac592cbe5", "shasum": "" }, "require": { @@ -3462,7 +3383,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.9" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.11" }, "funding": [ { @@ -3478,20 +3399,20 @@ "type": "tidelift" } ], - "time": "2024-06-21T16:04:15+00:00" + "time": "2024-08-29T08:15:38+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.10", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4" + "reference": "ee14c8254a480913268b1e3b1cba8045ed122694" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a71cc3374f5fb9759da1961d28c452373b343dd4", - "reference": "a71cc3374f5fb9759da1961d28c452373b343dd4", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ee14c8254a480913268b1e3b1cba8045ed122694", + "reference": "ee14c8254a480913268b1e3b1cba8045ed122694", "shasum": "" }, "require": { @@ -3547,7 +3468,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.10" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.11" }, "funding": [ { @@ -3563,7 +3484,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-08-30T16:03:21+00:00" }, { "name": "symfony/var-exporter", @@ -3644,16 +3565,16 @@ }, { "name": "symfony/yaml", - "version": "v6.4.8", + "version": "v6.4.11", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9" + "reference": "be37e7f13195e05ab84ca5269365591edd240335" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9", + "url": "https://api.github.com/repos/symfony/yaml/zipball/be37e7f13195e05ab84ca5269365591edd240335", + "reference": "be37e7f13195e05ab84ca5269365591edd240335", "shasum": "" }, "require": { @@ -3696,7 +3617,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.8" + "source": "https://github.com/symfony/yaml/tree/v6.4.11" }, "funding": [ { @@ -3712,24 +3633,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-08-12T09:55:28+00:00" }, { "name": "twig/intl-extra", - "version": "v3.11.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "e9cadd61342e71e45b2f4f0558122433fd7e4566" + "reference": "61e1189333120a475d2b67b93664b8002668fc27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/e9cadd61342e71e45b2f4f0558122433fd7e4566", - "reference": "e9cadd61342e71e45b2f4f0558122433fd7e4566", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/61e1189333120a475d2b67b93664b8002668fc27", + "reference": "61e1189333120a475d2b67b93664b8002668fc27", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/intl": "^5.4|^6.4|^7.0", "twig/twig": "^3.10" }, @@ -3764,7 +3685,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.11.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.12.0" }, "funding": [ { @@ -3776,28 +3697,27 @@ "type": "tidelift" } ], - "time": "2024-06-21T06:25:01+00:00" + "time": "2024-08-10T10:32:24+00:00" }, { "name": "twig/twig", - "version": "v3.11.0", + "version": "v3.12.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "e80fb8ebba85c7341a97a9ebf825d7fd4b77708d" + "reference": "4d19472d4ac1838e0b1f0e029ce1fa4040eb34ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/e80fb8ebba85c7341a97a9ebf825d7fd4b77708d", - "reference": "e80fb8ebba85c7341a97a9ebf825d7fd4b77708d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/4d19472d4ac1838e0b1f0e029ce1fa4040eb34ea", + "reference": "4d19472d4ac1838e0b1f0e029ce1fa4040eb34ea", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php80": "^1.22", "symfony/polyfill-php81": "^1.29" }, "require-dev": { @@ -3844,7 +3764,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.11.0" + "source": "https://github.com/twigphp/Twig/tree/v3.12.0" }, "funding": [ { @@ -3856,7 +3776,7 @@ "type": "tidelift" } ], - "time": "2024-08-08T16:15:16+00:00" + "time": "2024-08-29T09:51:12+00:00" }, { "name": "webmozart/assert", @@ -4057,23 +3977,24 @@ }, { "name": "mikey179/vfsstream", - "version": "v1.6.11", + "version": "v1.6.12", "source": { "type": "git", "url": "https://github.com/bovigo/vfsStream.git", - "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f" + "reference": "fe695ec993e0a55c3abdda10a9364eb31c6f1bf0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f", - "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f", + "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/fe695ec993e0a55c3abdda10a9364eb31c6f1bf0", + "reference": "fe695ec993e0a55c3abdda10a9364eb31c6f1bf0", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^4.5|^5.0" + "phpunit/phpunit": "^7.5||^8.5||^9.6", + "yoast/phpunit-polyfills": "^2.0" }, "type": "library", "extra": { @@ -4104,7 +4025,7 @@ "source": "https://github.com/bovigo/vfsStream/tree/master", "wiki": "https://github.com/bovigo/vfsStream/wiki" }, - "time": "2022-02-23T02:02:42+00:00" + "time": "2024-08-29T18:43:31+00:00" }, { "name": "myclabs/deep-copy", @@ -4342,22 +4263,22 @@ }, { "name": "phpstan/extension-installer", - "version": "1.4.1", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/phpstan/extension-installer.git", - "reference": "f6b87faf9fc7978eab2f7919a8760bc9f58f9203" + "reference": "85e90b3942d06b2326fba0403ec24fe912372936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f6b87faf9fc7978eab2f7919a8760bc9f58f9203", - "reference": "f6b87faf9fc7978eab2f7919a8760bc9f58f9203", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936", "shasum": "" }, "require": { "composer-plugin-api": "^2.0", "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.9.0" + "phpstan/phpstan": "^1.9.0 || ^2.0" }, "require-dev": { "composer/composer": "^2.0", @@ -4378,24 +4299,28 @@ "MIT" ], "description": "Composer plugin for automatic installation of PHPStan extensions", + "keywords": [ + "dev", + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/extension-installer/issues", - "source": "https://github.com/phpstan/extension-installer/tree/1.4.1" + "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" }, - "time": "2024-06-10T08:20:49+00:00" + "time": "2024-09-04T20:21:43+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.29.1", + "version": "1.30.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" + "reference": "5ceb0e384997db59f38774bf79c2a6134252c08f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", - "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/5ceb0e384997db59f38774bf79c2a6134252c08f", + "reference": "5ceb0e384997db59f38774bf79c2a6134252c08f", "shasum": "" }, "require": { @@ -4427,22 +4352,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.30.0" }, - "time": "2024-05-31T08:52:43+00:00" + "time": "2024-08-29T09:54:52+00:00" }, { "name": "phpstan/phpstan", - "version": "1.11.11", + "version": "1.12.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "707c2aed5d8d0075666e673a5e71440c1d01a5a3" + "reference": "0ca1c7bb55fca8fe6448f16fff0f311ccec960a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/707c2aed5d8d0075666e673a5e71440c1d01a5a3", - "reference": "707c2aed5d8d0075666e673a5e71440c1d01a5a3", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0ca1c7bb55fca8fe6448f16fff0f311ccec960a1", + "reference": "0ca1c7bb55fca8fe6448f16fff0f311ccec960a1", "shasum": "" }, "require": { @@ -4487,7 +4412,7 @@ "type": "github" } ], - "time": "2024-08-19T14:37:29+00:00" + "time": "2024-09-05T16:09:28+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -4541,32 +4466,32 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.15", + "version": "10.1.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-text-template": "^3.0", - "sebastian/code-unit-reverse-lookup": "^3.0", - "sebastian/complexity": "^3.0", - "sebastian/environment": "^6.0", - "sebastian/lines-of-code": "^2.0", - "sebastian/version": "^4.0", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { "phpunit/phpunit": "^10.1" @@ -4578,7 +4503,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "10.1.x-dev" } }, "autoload": { @@ -4607,7 +4532,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" }, "funding": [ { @@ -4615,7 +4540,7 @@ "type": "github" } ], - "time": "2024-06-29T08:25:15+00:00" + "time": "2024-08-22T04:31:57+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4862,16 +4787,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.30", + "version": "10.5.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "b15524febac0153876b4ba9aab3326c2ee94c897" + "reference": "f069f46840445d37a4e6f0de8c5879598f9c4327" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b15524febac0153876b4ba9aab3326c2ee94c897", - "reference": "b15524febac0153876b4ba9aab3326c2ee94c897", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f069f46840445d37a4e6f0de8c5879598f9c4327", + "reference": "f069f46840445d37a4e6f0de8c5879598f9c4327", "shasum": "" }, "require": { @@ -4885,7 +4810,7 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.15", + "phpunit/php-code-coverage": "^10.1.16", "phpunit/php-file-iterator": "^4.1.0", "phpunit/php-invoker": "^4.0.0", "phpunit/php-text-template": "^3.0.1", @@ -4943,7 +4868,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.30" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.32" }, "funding": [ { @@ -4959,7 +4884,7 @@ "type": "tidelift" } ], - "time": "2024-08-13T06:09:37+00:00" + "time": "2024-09-04T13:33:39+00:00" }, { "name": "predis/predis", @@ -5938,28 +5863,89 @@ ], "time": "2023-02-07T11:34:05+00:00" }, + { + "name": "simplesamlphp/saml2-legacy", + "version": "v4.6.12", + "source": { + "type": "git", + "url": "https://github.com/simplesamlphp/saml2-legacy.git", + "reference": "ee0ac34f4396306f877c6cea07f28fb6879ed37c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/ee0ac34f4396306f877c6cea07f28fb6879ed37c", + "reference": "ee0ac34f4396306f877c6cea07f28fb6879ed37c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-openssl": "*", + "ext-zlib": "*", + "php": ">=7.1 || ^8.0", + "psr/log": "~1.1 || ^2.0 || ^3.0", + "robrichards/xmlseclibs": "^3.1.1", + "webmozart/assert": "^1.9" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "sebastian/phpcpd": "~4.1 || ^5.0 || ^6.0", + "simplesamlphp/simplesamlphp-test-framework": "~0.1.0", + "squizlabs/php_codesniffer": "~3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "v4.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "SAML2\\": "src/SAML2" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Andreas Åkre Solberg", + "email": "andreas.solberg@uninett.no" + } + ], + "description": "SAML2 PHP library from SimpleSAMLphp", + "support": { + "source": "https://github.com/simplesamlphp/saml2-legacy/tree/v4.6.12" + }, + "time": "2024-04-30T09:01:00+00:00" + }, { "name": "simplesamlphp/simplesamlphp-module-adfs", - "version": "v2.1.5", + "version": "v2.1.7", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-module-adfs.git", - "reference": "f2202b9d8d4c14f09690f4781988e435f7dfd405" + "reference": "3aef826c02a2934b06668730260df0b0138824f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-adfs/zipball/f2202b9d8d4c14f09690f4781988e435f7dfd405", - "reference": "f2202b9d8d4c14f09690f4781988e435f7dfd405", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-module-adfs/zipball/3aef826c02a2934b06668730260df0b0138824f7", + "reference": "3aef826c02a2934b06668730260df0b0138824f7", "shasum": "" }, "require": { - "php": "^8.0", + "ext-dom": "*", + "php": "^8.1", + "robrichards/xmlseclibs": "^3.1", "simplesamlphp/assert": "^1.0", "simplesamlphp/composer-module-installer": "^1.3.2", - "simplesamlphp/xml-security": "^1.6" + "simplesamlphp/saml2-legacy": "^4.6", + "simplesamlphp/simplesamlphp": "^2.3", + "simplesamlphp/xml-security": "^1.6", + "symfony/http-foundation": "^6.4" }, "require-dev": { - "simplesamlphp/simplesamlphp": "^3@dev", "simplesamlphp/simplesamlphp-test-framework": "^1.5.4" }, "type": "simplesamlphp-module", @@ -5992,7 +5978,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-module-adfs/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-module-adfs" }, - "time": "2024-05-27T12:30:45+00:00" + "time": "2024-09-01T09:36:25+00:00" }, { "name": "simplesamlphp/simplesamlphp-test-framework", @@ -6195,16 +6181,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v7.1.3", + "version": "v7.1.4", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "e823122d31935eb711e2767c31f3d71cb0b87fb1" + "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e823122d31935eb711e2767c31f3d71cb0b87fb1", - "reference": "e823122d31935eb711e2767c31f3d71cb0b87fb1", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e876eb90e32a8fc4c4911d458e09f88d65877d1c", + "reference": "e876eb90e32a8fc4c4911d458e09f88d65877d1c", "shasum": "" }, "require": { @@ -6257,7 +6243,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.3" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.1.4" }, "funding": [ { @@ -6273,7 +6259,7 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:41:01+00:00" + "time": "2024-08-13T14:28:19+00:00" }, { "name": "symfony/translation", diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 0a94b8a280..1c5d9092b1 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -5,14 +5,19 @@ This document lists the changes between versions of SimpleSAMLphp. See the [upgrade notes](https://simplesamlphp.org/docs/stable/simplesamlphp-upgrade-notes.html) for specific information about upgrading. -## Version 2.3.1 +## Version 2.3.2 Released TBD +## Version 2.3.1 + +Released 2024-09-05 + * Fixed accidental backwards incompatibility for plain-text admin passwords (#2212) * Fixed support for `pt-br` and `zh-tw` dialects (#2216) * Run ob_end_clean() on configuration file parsing error (#2219) * Fixed an incorrect exception message when string-style endpoints are used. +* Reduced all of the overhead logging related to HEAD/OPTIONS requests (#2234). `admin` diff --git a/extra/simplesamlphp.spec b/extra/simplesamlphp.spec index 2eea97ef29..c84ce0ce08 100644 --- a/extra/simplesamlphp.spec +++ b/extra/simplesamlphp.spec @@ -1,6 +1,6 @@ %define name simplesamlphp %define summary SAML IDP/SP written in PHP -%define version 2.3.0 +%define version 2.3.1 %define release 1 %define license LGPL 2.1 %define group Networking/WWW diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index df5bf03234..3171f38111 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -41,7 +41,7 @@ class Configuration implements Utils\ClearableState /** * The release version of this package */ - public const VERSION = '2.3.0'; + public const VERSION = '2.3.1'; /** * A default value which means that the given option is required. From 4164e8497a44bbc8f68c0771767061ba6ed727a6 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 6 Sep 2024 18:12:29 +0200 Subject: [PATCH 191/532] Stop pre-loading fonts --- templates/base.twig | 2 -- 1 file changed, 2 deletions(-) diff --git a/templates/base.twig b/templates/base.twig index d3256a3b1d..7c7b86829b 100644 --- a/templates/base.twig +++ b/templates/base.twig @@ -7,8 +7,6 @@ {{ pagetitle }} - {# Preloading must be done after referencing the resource #} - {{ include('_head.twig', ignore_missing = true) }} {% block preload %}{% endblock %} From 35986f519b60cfb4ccd9b978d05fcaaf530bb35e Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 6 Sep 2024 18:12:29 +0200 Subject: [PATCH 192/532] Stop pre-loading fonts --- templates/base.twig | 2 -- 1 file changed, 2 deletions(-) diff --git a/templates/base.twig b/templates/base.twig index d3256a3b1d..7c7b86829b 100644 --- a/templates/base.twig +++ b/templates/base.twig @@ -7,8 +7,6 @@ {{ pagetitle }} - {# Preloading must be done after referencing the resource #} - {{ include('_head.twig', ignore_missing = true) }} {% block preload %}{% endblock %} From 58229bb198a5d4110393b2280da7de1e95f1e919 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 6 Sep 2024 18:30:07 +0200 Subject: [PATCH 193/532] Fix a regression that led to fonts & icons not being loaded correctly (#2237) --- composer.json | 2 +- composer.lock | 14 +++++++------- docs/simplesamlphp-changelog.md | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index e7b132762b..f5229b9e2e 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ "simplesamlphp/assert": "^1.1", "simplesamlphp/composer-module-installer": "^1.3", "simplesamlphp/saml2": "^4.6", - "simplesamlphp/simplesamlphp-assets-base": "~2.2.6", + "simplesamlphp/simplesamlphp-assets-base": "~2.3.0", "simplesamlphp/xml-security": "^1.7", "symfony/cache": "^6.4", "symfony/config": "^6.4", diff --git a/composer.lock b/composer.lock index 21f995c6a9..4aec157173 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1c0b6d5f21924e1ec7135582a2a76cb5", + "content-hash": "d85de1625e5eca8c5283affbad72e94a", "packages": [ { "name": "gettext/gettext", @@ -907,16 +907,16 @@ }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.2.8", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "939224aa1ebdfa4207e257f37cfe453e90eccbc8" + "reference": "c6396600f0929dde7b78de41e6841251a3467063" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/939224aa1ebdfa4207e257f37cfe453e90eccbc8", - "reference": "939224aa1ebdfa4207e257f37cfe453e90eccbc8", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/c6396600f0929dde7b78de41e6841251a3467063", + "reference": "c6396600f0929dde7b78de41e6841251a3467063", "shasum": "" }, "require": { @@ -937,9 +937,9 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.2.8" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.3.0" }, - "time": "2024-09-01T19:55:36+00:00" + "time": "2024-09-06T16:21:56+00:00" }, { "name": "simplesamlphp/xml-common", diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 1c5d9092b1..2dbd605946 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -9,6 +9,8 @@ See the [upgrade notes](https://simplesamlphp.org/docs/stable/simplesamlphp-upgr Released TBD +* Fixed a regression that led to fonts & icons not being loaded correctly (#2237) + ## Version 2.3.1 Released 2024-09-05 From c97d738ad878df17804d7139ad334efb55f298e4 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 6 Sep 2024 18:55:29 +0200 Subject: [PATCH 194/532] Bugfix: show languages in language-bar in their own language instead of the current language --- docs/simplesamlphp-changelog.md | 1 + src/SimpleSAML/Locale/Language.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 2dbd605946..22ad856010 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -10,6 +10,7 @@ See the [upgrade notes](https://simplesamlphp.org/docs/stable/simplesamlphp-upgr Released TBD * Fixed a regression that led to fonts & icons not being loaded correctly (#2237) +* Fixed a regression that caused the languages in the language-bar to be all in English. ## Version 2.3.1 diff --git a/src/SimpleSAML/Locale/Language.php b/src/SimpleSAML/Locale/Language.php index 14326b990e..58cdc67e85 100644 --- a/src/SimpleSAML/Locale/Language.php +++ b/src/SimpleSAML/Locale/Language.php @@ -284,7 +284,7 @@ public function getLanguage(): string public function getLanguageLocalizedName(string $code): ?string { if (Locales::exists($code)) { - return Locales::getName($code); + return Locales::getName($code, $code); } Logger::error("Name for language \"$code\" not found. Check config."); return null; From eed33b0f85925f5803cc832298d96ba688233779 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 6 Sep 2024 18:55:51 +0200 Subject: [PATCH 195/532] Bugfix: show languages in language-bar in their own language instead of the current language --- src/SimpleSAML/Locale/Language.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SimpleSAML/Locale/Language.php b/src/SimpleSAML/Locale/Language.php index a305f4c552..4d1de972cd 100644 --- a/src/SimpleSAML/Locale/Language.php +++ b/src/SimpleSAML/Locale/Language.php @@ -285,7 +285,7 @@ public function getLanguage(): string public function getLanguageLocalizedName(string $code): ?string { if (Locales::exists($code)) { - return Locales::getName($code); + return Locales::getName($code, $code); } Logger::error("Name for language \"$code\" not found. Check config."); return null; From f95618ef487ce682745ebdc23baaa32992478d52 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 6 Sep 2024 19:15:38 +0200 Subject: [PATCH 196/532] Fix: only load metadata-converter.js when file-upload is enabled --- modules/admin/templates/metadata_converter.twig | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/admin/templates/metadata_converter.twig b/modules/admin/templates/metadata_converter.twig index 9423807280..44d9bfd3c9 100644 --- a/modules/admin/templates/metadata_converter.twig +++ b/modules/admin/templates/metadata_converter.twig @@ -34,7 +34,7 @@ {% for type, text in output -%} {%- if text -%}
-
+

{{ type }}

- + - + + + +{% endblock %} + + +{% block postload %}{% endblock %} + diff --git a/tests/src/SimpleSAML/Utils/HTTPTest.php b/tests/src/SimpleSAML/Utils/HTTPTest.php index ff5e2332ba..7521089369 100644 --- a/tests/src/SimpleSAML/Utils/HTTPTest.php +++ b/tests/src/SimpleSAML/Utils/HTTPTest.php @@ -18,6 +18,17 @@ #[CoversClass(Utils\HTTP::class)] class HTTPTest extends ClearStateTestCase { + /** + * Set up the test. + */ + protected function setUp(): void + { + parent::setUp(); + if (!defined('SIMPLESAMLPHP_TEST_NOEXIT')) { + define('SIMPLESAMLPHP_TEST_NOEXIT', true); + } + } + /** * Set up the environment ($_SERVER) populating the typical variables from a given URL. * @@ -584,7 +595,7 @@ public function testDetectSameSiteNoneBehavior(?string $userAgent, bool $support public static function detectSameSiteProvider(): array { - // @codingStandardsIgnoreStart + // phpcs:disable Generic.Files.LineLength return [ [null, true], ['some-new-browser', true], @@ -618,6 +629,124 @@ public static function detectSameSiteProvider(): array // old embedded browser ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/605.1.15 (KHTML, like Gecko)', false], ]; - // @codingStandardsIgnoreEnd + // phpcs:enable Generic.Files.LineLength + } + + /** + * submitPOSTData() should throw Error\Exception for an invalid destination URL. + */ + public function testSubmitPOSTDataThrowsOnInvalidURL(): void + { + $httpUtils = new Utils\HTTP(); + + // Minimal configuration to satisfy internals; won’t be used since we fail early. + Configuration::loadFromArray([ + 'baseurlpath' => 'https://example.com/simplesaml/', + ], '[ARRAY]', 'simplesaml'); + + $this->expectException(Error\Exception::class); + $this->expectExceptionMessage('Invalid destination URL: not-a-url'); + + $httpUtils->submitPOSTData('not-a-url', ['a' => 'b']); + } + + + /** + * When enable.http_post = true, destination is http:// and current request is HTTPS, we must redirect. + * We assert a Location header is sent pointing to a postredirect URL. + */ + #[Depends('testXdebugMode')] + #[RunInSeparateProcess] + public function testSubmitPOSTDataRedirectsFromHttpsToHttp(): void + { + $httpUtils = new Utils\HTTP(); + + // Configure base URL and allow http post. + Configuration::loadFromArray([ + 'baseurlpath' => 'https://idp.example.org/simplesaml/', + 'enable.http_post' => true, + 'secretsalt' => 'abc', + ], '[ARRAY]', 'simplesaml'); + + // Simulate the current request being HTTPS + $this->setupEnvFromURL('https://idp.example.org/simplesaml/module.php/core/someaction?x=1'); + + // Destination is explicitly http:// + $destination = 'http://sp.example.com/acs'; + $post = ['SAMLResponse' => 'abc', 'RelayState' => 'xyz']; + + try { + $httpUtils->submitPOSTData($destination, $post); + } catch (\Throwable $e) { + } + + $headers = function_exists('xdebug_get_headers') ? xdebug_get_headers() : []; + + // Find the Location header + $locationHeader = null; + foreach ($headers as $h) { + if (stripos($h, 'Location: ') === 0) { + $locationHeader = substr($h, 10); + break; + } + } + + $this->assertNotNull($locationHeader, 'Expected a Location header to be sent'); + $this->assertStringStartsWith('http://', $locationHeader, 'Location should be http://'); + $this->assertStringContainsString('/core/postredirect', $locationHeader); + $this->assertTrue( + (str_contains($locationHeader, 'RedirInfo=')), + 'Location should contain RedirInfo parameter', + ); + } + + + /** + * submitPOSTData() should pass slow_post_delay_ms to the template: + * - default 30000 when config key missing + * - default 30000 when config value < 0 + * - exact value when config value is 10000 + */ + #[DataProvider('slowPostDelayProvider')] + #[RunInSeparateProcess] + public function testSubmitPOSTDataSlowPostDelay(?int $configured, int $expected): void + { + $httpUtils = new Utils\HTTP(); + + // Base config + $config = [ + 'baseurlpath' => 'https://idp.example.org/simplesaml/', + 'enable.http_post' => false, + ]; + if ($configured !== null) { + $config['slow_post_delay_ms'] = $configured; + } + Configuration::loadFromArray($config, '[ARRAY]', 'simplesaml'); + + // Use https destination to bypass the http-redirect branch entirely + $destination = 'https://sp.example.com/acs'; + $post = ['k' => 'v']; + + // Capture output + ob_start(); + try { + $httpUtils->submitPOSTData($destination, $post); + } catch (\Throwable $e) { + } + $html = ob_get_clean(); + + // The template writes the delay into data-slow-post-delay attribute + $needle = 'data-slow-post-delay="' . $expected . '"'; + $this->assertStringContainsString($needle, $html); + } + + public static function slowPostDelayProvider(): array + { + return [ + // [configured, expected] + 'missing config => default' => [null, 30000], + 'negative config => default' => [-5, 30000], + 'positive config 10000 => 10000' => [10000, 10000], + ]; } } From ed323969a0debc49718bc7e99e26cfb28fb99973 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 6 Oct 2025 12:25:23 +0200 Subject: [PATCH 390/532] Bump dependencies --- composer.lock | 321 +++++++++++++++++++++++++------------------------- 1 file changed, 162 insertions(+), 159 deletions(-) diff --git a/composer.lock b/composer.lock index 5c94a34f8d..c0feedbcb2 100644 --- a/composer.lock +++ b/composer.lock @@ -425,16 +425,16 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.10.0", + "version": "v6.11.1", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "bf74d75a1fde6beaa34a0ddae2ec5fce0f72a144" + "reference": "d9e3b36b47f04b497a0164c5a20f92acb4593284" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/bf74d75a1fde6beaa34a0ddae2ec5fce0f72a144", - "reference": "bf74d75a1fde6beaa34a0ddae2ec5fce0f72a144", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/d9e3b36b47f04b497a0164c5a20f92acb4593284", + "reference": "d9e3b36b47f04b497a0164c5a20f92acb4593284", "shasum": "" }, "require": { @@ -455,6 +455,7 @@ }, "suggest": { "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", + "ext-imap": "Needed to support advanced email address parsing according to RFC822", "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", "ext-openssl": "Needed for secure SMTP sending and DKIM signing", "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", @@ -494,7 +495,7 @@ "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.10.0" + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.11.1" }, "funding": [ { @@ -502,7 +503,7 @@ "type": "github" } ], - "time": "2025-04-24T15:19:31+00:00" + "time": "2025-09-30T11:54:53+00:00" }, { "name": "psr/cache", @@ -1163,16 +1164,16 @@ }, { "name": "simplesamlphp/saml2-legacy", - "version": "v4.18.1", + "version": "v4.19.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2-legacy.git", - "reference": "9bbf43a5ace9c8e5107dad3a613b014b456ecd56" + "reference": "96eb144356702d7d913078fb2e4364e42458fc31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/9bbf43a5ace9c8e5107dad3a613b014b456ecd56", - "reference": "9bbf43a5ace9c8e5107dad3a613b014b456ecd56", + "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/96eb144356702d7d913078fb2e4364e42458fc31", + "reference": "96eb144356702d7d913078fb2e4364e42458fc31", "shasum": "" }, "require": { @@ -1217,22 +1218,22 @@ ], "description": "SAML2 PHP library from SimpleSAMLphp", "support": { - "source": "https://github.com/simplesamlphp/saml2-legacy/tree/v4.18.1" + "source": "https://github.com/simplesamlphp/saml2-legacy/tree/v4.19.0" }, - "time": "2025-03-16T11:50:02+00:00" + "time": "2025-09-05T23:39:13+00:00" }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.5.2", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "b0f93575e308507df584a8cc98555e45e8a448b8" + "reference": "c5a83d047c0b0a9bda253a033e095591da7d4eaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/b0f93575e308507df584a8cc98555e45e8a448b8", - "reference": "b0f93575e308507df584a8cc98555e45e8a448b8", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/c5a83d047c0b0a9bda253a033e095591da7d4eaf", + "reference": "c5a83d047c0b0a9bda253a033e095591da7d4eaf", "shasum": "" }, "require": { @@ -1253,9 +1254,9 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.2" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.3" }, - "time": "2025-08-21T20:01:56+00:00" + "time": "2025-09-18T16:58:14+00:00" }, { "name": "simplesamlphp/xml-common", @@ -1438,16 +1439,16 @@ }, { "name": "symfony/cache", - "version": "v7.3.2", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6" + "reference": "bf8afc8ffd4bfd3d9c373e417f041d9f1e5b863f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6", - "reference": "6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6", + "url": "https://api.github.com/repos/symfony/cache/zipball/bf8afc8ffd4bfd3d9c373e417f041d9f1e5b863f", + "reference": "bf8afc8ffd4bfd3d9c373e417f041d9f1e5b863f", "shasum": "" }, "require": { @@ -1516,7 +1517,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.3.2" + "source": "https://github.com/symfony/cache/tree/v7.3.4" }, "funding": [ { @@ -1536,7 +1537,7 @@ "type": "tidelift" } ], - "time": "2025-07-30T17:13:41+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/cache-contracts", @@ -1616,16 +1617,16 @@ }, { "name": "symfony/config", - "version": "v7.3.2", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "faef36e271bbeb74a9d733be4b56419b157762e2" + "reference": "8a09223170046d2cfda3d2e11af01df2c641e961" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/faef36e271bbeb74a9d733be4b56419b157762e2", - "reference": "faef36e271bbeb74a9d733be4b56419b157762e2", + "url": "https://api.github.com/repos/symfony/config/zipball/8a09223170046d2cfda3d2e11af01df2c641e961", + "reference": "8a09223170046d2cfda3d2e11af01df2c641e961", "shasum": "" }, "require": { @@ -1671,7 +1672,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.3.2" + "source": "https://github.com/symfony/config/tree/v7.3.4" }, "funding": [ { @@ -1691,20 +1692,20 @@ "type": "tidelift" } ], - "time": "2025-07-26T13:55:06+00:00" + "time": "2025-09-22T12:46:16+00:00" }, { "name": "symfony/console", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7" + "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", - "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", + "url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", + "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", "shasum": "" }, "require": { @@ -1769,7 +1770,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.3" + "source": "https://github.com/symfony/console/tree/v7.3.4" }, "funding": [ { @@ -1789,20 +1790,20 @@ "type": "tidelift" } ], - "time": "2025-08-25T06:35:40+00:00" + "time": "2025-09-22T15:31:00+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "ab6c38dad5da9b15b1f7afb2f5c5814112e70261" + "reference": "82119812ab0bf3425c1234d413efd1b19bb92ae4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/ab6c38dad5da9b15b1f7afb2f5c5814112e70261", - "reference": "ab6c38dad5da9b15b1f7afb2f5c5814112e70261", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/82119812ab0bf3425c1234d413efd1b19bb92ae4", + "reference": "82119812ab0bf3425c1234d413efd1b19bb92ae4", "shasum": "" }, "require": { @@ -1853,7 +1854,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.3.3" + "source": "https://github.com/symfony/dependency-injection/tree/v7.3.4" }, "funding": [ { @@ -1873,7 +1874,7 @@ "type": "tidelift" } ], - "time": "2025-08-14T09:54:27+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1944,16 +1945,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.3.2", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3" + "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/0b31a944fcd8759ae294da4d2808cbc53aebd0c3", - "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", + "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", "shasum": "" }, "require": { @@ -2001,7 +2002,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.3.2" + "source": "https://github.com/symfony/error-handler/tree/v7.3.4" }, "funding": [ { @@ -2021,7 +2022,7 @@ "type": "tidelift" } ], - "time": "2025-07-07T08:17:57+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/event-dispatcher", @@ -2391,16 +2392,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "19ec4ab6be90322ed190e041e2404a976ed22571" + "reference": "b13e7cec5a144c8dba6f4233a2c53c00bc29e140" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/19ec4ab6be90322ed190e041e2404a976ed22571", - "reference": "19ec4ab6be90322ed190e041e2404a976ed22571", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/b13e7cec5a144c8dba6f4233a2c53c00bc29e140", + "reference": "b13e7cec5a144c8dba6f4233a2c53c00bc29e140", "shasum": "" }, "require": { @@ -2525,7 +2526,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.3.3" + "source": "https://github.com/symfony/framework-bundle/tree/v7.3.4" }, "funding": [ { @@ -2545,20 +2546,20 @@ "type": "tidelift" } ], - "time": "2025-08-27T07:45:05+00:00" + "time": "2025-09-17T05:51:54+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00" + "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7475561ec27020196c49bb7c4f178d33d7d3dc00", - "reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c061c7c18918b1b64268771aad04b40be41dd2e6", + "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6", "shasum": "" }, "require": { @@ -2608,7 +2609,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.3.3" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.4" }, "funding": [ { @@ -2628,20 +2629,20 @@ "type": "tidelift" } ], - "time": "2025-08-20T08:04:18+00:00" + "time": "2025-09-16T08:38:17+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b" + "reference": "b796dffea7821f035047235e076b60ca2446e3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/72c304de37e1a1cec6d5d12b81187ebd4850a17b", - "reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b796dffea7821f035047235e076b60ca2446e3cf", + "reference": "b796dffea7821f035047235e076b60ca2446e3cf", "shasum": "" }, "require": { @@ -2726,7 +2727,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.3.3" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.4" }, "funding": [ { @@ -2746,20 +2747,20 @@ "type": "tidelift" } ], - "time": "2025-08-29T08:23:45+00:00" + "time": "2025-09-27T12:32:17+00:00" }, { "name": "symfony/intl", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "754d5ad02c889e380efc5a74fa3f6cfe56b7454d" + "reference": "e6db84864655885d9dac676a9d7dde0d904fda54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/754d5ad02c889e380efc5a74fa3f6cfe56b7454d", - "reference": "754d5ad02c889e380efc5a74fa3f6cfe56b7454d", + "url": "https://api.github.com/repos/symfony/intl/zipball/e6db84864655885d9dac676a9d7dde0d904fda54", + "reference": "e6db84864655885d9dac676a9d7dde0d904fda54", "shasum": "" }, "require": { @@ -2816,7 +2817,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.3.3" + "source": "https://github.com/symfony/intl/tree/v7.3.4" }, "funding": [ { @@ -2836,7 +2837,7 @@ "type": "tidelift" } ], - "time": "2025-08-19T14:06:46+00:00" + "time": "2025-09-08T14:11:30+00:00" }, { "name": "symfony/password-hasher", @@ -3415,16 +3416,16 @@ }, { "name": "symfony/routing", - "version": "v7.3.2", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4" + "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/7614b8ca5fa89b9cd233e21b627bfc5774f586e4", - "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4", + "url": "https://api.github.com/repos/symfony/routing/zipball/8dc648e159e9bac02b703b9fbd937f19ba13d07c", + "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c", "shasum": "" }, "require": { @@ -3476,7 +3477,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.3.2" + "source": "https://github.com/symfony/routing/tree/v7.3.4" }, "funding": [ { @@ -3496,7 +3497,7 @@ "type": "tidelift" } ], - "time": "2025-07-15T11:36:08+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/service-contracts", @@ -3583,16 +3584,16 @@ }, { "name": "symfony/string", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c" + "reference": "f96476035142921000338bad71e5247fbc138872" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", - "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", + "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872", + "reference": "f96476035142921000338bad71e5247fbc138872", "shasum": "" }, "require": { @@ -3607,7 +3608,6 @@ }, "require-dev": { "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3.0", @@ -3650,7 +3650,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.3.3" + "source": "https://github.com/symfony/string/tree/v7.3.4" }, "funding": [ { @@ -3670,7 +3670,7 @@ "type": "tidelift" } ], - "time": "2025-08-25T06:35:40+00:00" + "time": "2025-09-11T14:36:48+00:00" }, { "name": "symfony/translation-contracts", @@ -3867,16 +3867,16 @@ }, { "name": "symfony/var-dumper", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f" + "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", - "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", + "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", "shasum": "" }, "require": { @@ -3930,7 +3930,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.3" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.4" }, "funding": [ { @@ -3950,20 +3950,20 @@ "type": "tidelift" } ], - "time": "2025-08-13T11:49:31+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "d4dfcd2a822cbedd7612eb6fbd260e46f87b7137" + "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/d4dfcd2a822cbedd7612eb6fbd260e46f87b7137", - "reference": "d4dfcd2a822cbedd7612eb6fbd260e46f87b7137", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", + "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", "shasum": "" }, "require": { @@ -4011,7 +4011,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.3.3" + "source": "https://github.com/symfony/var-exporter/tree/v7.3.4" }, "funding": [ { @@ -4031,7 +4031,7 @@ "type": "tidelift" } ], - "time": "2025-08-18T13:10:53+00:00" + "time": "2025-09-11T10:12:26+00:00" }, { "name": "symfony/yaml", @@ -4852,16 +4852,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.22", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4" - }, + "version": "2.1.30", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/41600c8379eb5aee63e9413fe9e97273e25d57e4", - "reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a4a7f159927983dd4f7c8020ed227d80b7f39d7d", + "reference": "a4a7f159927983dd4f7c8020ed227d80b7f39d7d", "shasum": "" }, "require": { @@ -4906,7 +4901,7 @@ "type": "github" } ], - "time": "2025-08-04T19:17:37+00:00" + "time": "2025-10-02T16:07:52+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -5294,16 +5289,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.35", + "version": "11.5.42", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "d341ee94ee5007b286fc7907b383aae6b5b3cc91" + "reference": "1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d341ee94ee5007b286fc7907b383aae6b5b3cc91", - "reference": "d341ee94ee5007b286fc7907b383aae6b5b3cc91", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c", + "reference": "1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c", "shasum": "" }, "require": { @@ -5327,7 +5322,7 @@ "sebastian/comparator": "^6.3.2", "sebastian/diff": "^6.0.2", "sebastian/environment": "^7.2.1", - "sebastian/exporter": "^6.3.0", + "sebastian/exporter": "^6.3.2", "sebastian/global-state": "^7.0.2", "sebastian/object-enumerator": "^6.0.1", "sebastian/type": "^5.1.3", @@ -5375,7 +5370,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.35" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.42" }, "funding": [ { @@ -5399,7 +5394,7 @@ "type": "tidelift" } ], - "time": "2025-08-28T05:13:54+00:00" + "time": "2025-09-28T12:09:13+00:00" }, { "name": "predis/predis", @@ -5929,16 +5924,16 @@ }, { "name": "sebastian/exporter", - "version": "6.3.0", + "version": "6.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", "shasum": "" }, "require": { @@ -5952,7 +5947,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.1-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -5995,15 +5990,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" } ], - "time": "2024-12-05T09:17:50+00:00" + "time": "2025-09-24T06:12:51+00:00" }, { "name": "sebastian/global-state", @@ -6440,16 +6447,16 @@ }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.10.0", + "version": "v1.10.2", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "48e2fe311b59d5dc5da729175920035fe9a36276" + "reference": "41339027be51699193803ba210960dd2d0b09fe0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/48e2fe311b59d5dc5da729175920035fe9a36276", - "reference": "48e2fe311b59d5dc5da729175920035fe9a36276", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/41339027be51699193803ba210960dd2d0b09fe0", + "reference": "41339027be51699193803ba210960dd2d0b09fe0", "shasum": "" }, "require": { @@ -6461,6 +6468,7 @@ "phpunit/phpunit": "^11.5 || ^12.3", "psr/log": "^3.0", "slevomat/coding-standard": "^8.20", + "squizlabs/php_codesniffer": "^3.13 || ^4.0", "symfony/phpunit-bridge": "^7.3 || ^8.0" }, "require-dev": { @@ -6490,36 +6498,36 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2025-08-21T14:14:44+00:00" + "time": "2025-09-16T19:53:22+00:00" }, { "name": "slevomat/coding-standard", - "version": "8.21.1", + "version": "8.24.0", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "2b801e950ae1cceb30bb3c0373141f553c99d3c3" + "reference": "08e7989c0351f3f38b82172838195c35d9819efa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/2b801e950ae1cceb30bb3c0373141f553c99d3c3", - "reference": "2b801e950ae1cceb30bb3c0373141f553c99d3c3", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/08e7989c0351f3f38b82172838195c35d9819efa", + "reference": "08e7989c0351f3f38b82172838195c35d9819efa", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.1.2", "php": "^7.4 || ^8.0", "phpstan/phpdoc-parser": "^2.3.0", - "squizlabs/php_codesniffer": "^3.13.2" + "squizlabs/php_codesniffer": "^4.0.0" }, "require-dev": { "phing/phing": "3.0.1|3.1.0", "php-parallel-lint/php-parallel-lint": "1.4.0", - "phpstan/phpstan": "2.1.22", + "phpstan/phpstan": "2.1.29", "phpstan/phpstan-deprecation-rules": "2.0.3", "phpstan/phpstan-phpunit": "2.0.7", "phpstan/phpstan-strict-rules": "2.0.6", - "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.27|12.3.7" + "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.36|12.3.14" }, "type": "phpcodesniffer-standard", "extra": { @@ -6543,7 +6551,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.21.1" + "source": "https://github.com/slevomat/coding-standard/tree/8.24.0" }, "funding": [ { @@ -6555,41 +6563,36 @@ "type": "tidelift" } ], - "time": "2025-08-31T13:32:28+00:00" + "time": "2025-09-25T21:37:40+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.13.2", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "5b5e3821314f947dd040c70f7992a64eac89025c" + "reference": "06113cfdaf117fc2165f9cd040bd0f17fcd5242d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5b5e3821314f947dd040c70f7992a64eac89025c", - "reference": "5b5e3821314f947dd040c70f7992a64eac89025c", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/06113cfdaf117fc2165f9cd040bd0f17fcd5242d", + "reference": "06113cfdaf117fc2165f9cd040bd0f17fcd5242d", "shasum": "" }, "require": { "ext-simplexml": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": ">=5.4.0" + "php": ">=7.2.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + "phpunit/phpunit": "^8.4.0 || ^9.3.4 || ^10.5.32 || 11.3.3 - 11.5.28 || ^11.5.31" }, "bin": [ "bin/phpcbf", "bin/phpcs" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" @@ -6608,7 +6611,7 @@ "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "description": "PHP_CodeSniffer tokenizes PHP files and detects violations of a defined set of coding standards.", "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ "phpcs", @@ -6639,7 +6642,7 @@ "type": "thanks_dev" } ], - "time": "2025-06-17T22:17:01+00:00" + "time": "2025-09-15T11:28:58+00:00" }, { "name": "staabm/side-effects-detector", @@ -6695,16 +6698,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "7954e563ed14f924593169f6c4645d58d9d9ac77" + "reference": "ed77a629c13979e051b7000a317966474d566398" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/7954e563ed14f924593169f6c4645d58d9d9ac77", - "reference": "7954e563ed14f924593169f6c4645d58d9d9ac77", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/ed77a629c13979e051b7000a317966474d566398", + "reference": "ed77a629c13979e051b7000a317966474d566398", "shasum": "" }, "require": { @@ -6760,7 +6763,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.3.3" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.3.4" }, "funding": [ { @@ -6780,20 +6783,20 @@ "type": "tidelift" } ], - "time": "2025-08-04T15:15:28+00:00" + "time": "2025-09-12T12:18:52+00:00" }, { "name": "symfony/translation", - "version": "v7.3.3", + "version": "v7.3.4", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "e0837b4cbcef63c754d89a4806575cada743a38d" + "reference": "ec25870502d0c7072d086e8ffba1420c85965174" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/e0837b4cbcef63c754d89a4806575cada743a38d", - "reference": "e0837b4cbcef63c754d89a4806575cada743a38d", + "url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174", + "reference": "ec25870502d0c7072d086e8ffba1420c85965174", "shasum": "" }, "require": { @@ -6860,7 +6863,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.3.3" + "source": "https://github.com/symfony/translation/tree/v7.3.4" }, "funding": [ { @@ -6880,7 +6883,7 @@ "type": "tidelift" } ], - "time": "2025-08-01T21:02:37+00:00" + "time": "2025-09-07T11:39:36+00:00" }, { "name": "theseer/tokenizer", From ce75d601faca0685266d0a52e5ff9aabf821e4d4 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 6 Oct 2025 12:36:24 +0200 Subject: [PATCH 391/532] Use local version of phpcs --- .github/workflows/php.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 5fa6ceac3b..82df84cee8 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -166,7 +166,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: '8.3' - tools: composer, phpcs, psalm + tools: composer, psalm extensions: mbstring, soap, xml coverage: none @@ -198,7 +198,7 @@ jobs: run: composer install --no-progress --prefer-dist --optimize-autoloader - name: PHP Code Sniffer - run: phpcs + run: vendor/bin/phpcs - name: Psalm continue-on-error: true From d38b429fd23b4cb733a758ddc530f0db37b1cd0e Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 6 Oct 2025 14:01:02 +0200 Subject: [PATCH 392/532] Update minimum PHP version in admin-module --- modules/admin/src/Controller/Config.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/admin/src/Controller/Config.php b/modules/admin/src/Controller/Config.php index 235a0ec98f..8cd49391b8 100644 --- a/modules/admin/src/Controller/Config.php +++ b/modules/admin/src/Controller/Config.php @@ -205,11 +205,11 @@ protected function getPrerequisiteChecks(): array 'descr' => [ Translate::noop('PHP %minimum% or newer is needed. You are running: %current%'), [ - '%minimum%' => '8.1', + '%minimum%' => '8.2', '%current%' => explode('-', phpversion())[0], ], ], - 'enabled' => version_compare(phpversion(), '8.1', '>='), + 'enabled' => version_compare(phpversion(), '8.2', '>='), ], ]; $store = $this->config->getOptionalString('store.type', null); From ce4d0a7acc72a199ab50df60072ede8377abd52c Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 7 Oct 2025 10:37:24 +0200 Subject: [PATCH 393/532] Replace grouped use-statements and fix incorrect number of newlines --- tests/SigningTestCase.php | 6 +++ .../admin/src/Controller/FederationTest.php | 11 ++++ .../modules/admin/src/Controller/TestTest.php | 4 ++ .../core/src/Auth/Process/TargetedIDTest.php | 1 + .../src/Auth/Source/SourceIPSelectorTest.php | 1 + .../core/src/Controller/ExceptionTest.php | 4 +- .../modules/core/src/Controller/LoginTest.php | 9 +++- .../core/src/Controller/LogoutTest.php | 4 +- .../src/Controller/DiscoControllerTest.php | 10 ++++ tests/modules/saml/MessageTest.php | 5 ++ .../src/Auth/Process/FilterScopesTest.php | 4 ++ .../saml/src/Auth/Process/PairwiseIDTest.php | 4 +- .../saml/src/Auth/Process/SubjectIDTest.php | 5 +- tests/modules/saml/src/Auth/Source/SPTest.php | 54 ++++++++++++++++--- .../saml/src/Controller/MetadataTest.php | 14 +++++ .../src/Controller/ServiceProviderTest.php | 17 ++++-- tests/modules/saml/src/IdP/SAML2Test.php | 21 ++++++++ .../SimpleSAML/Auth/ProcessingChainTest.php | 1 + tests/src/SimpleSAML/Auth/SimpleTest.php | 5 +- tests/src/SimpleSAML/ConfigurationTest.php | 7 +-- tests/src/SimpleSAML/Error/ErrorCodesTest.php | 16 ++++++ tests/src/SimpleSAML/Error/ErrorTest.php | 14 +++++ tests/src/SimpleSAML/Locale/LanguageTest.php | 1 + .../SimpleSAML/Locale/LocalizationTest.php | 2 + tests/src/SimpleSAML/Locale/TranslateTest.php | 3 ++ .../Metadata/MetaDataStorageHandlerTest.php | 16 ++++++ .../SimpleSAML/Metadata/SAMLBuilderTest.php | 6 +++ .../SimpleSAML/Metadata/SAMLParserTest.php | 3 ++ tests/src/SimpleSAML/ModuleTest.php | 2 + .../src/SimpleSAML/SessionHandlerPHPTest.php | 5 +- tests/src/SimpleSAML/SessionTest.php | 10 +++- tests/src/SimpleSAML/Store/RedisStoreTest.php | 12 +++++ .../SimpleSAML/Utils/Config/MetadataTest.php | 2 + tests/src/SimpleSAML/Utils/ConfigTest.php | 1 + tests/src/SimpleSAML/Utils/CryptoTest.php | 6 ++- tests/src/SimpleSAML/Utils/EMailTest.php | 1 + tests/src/SimpleSAML/Utils/HTTPTest.php | 10 +++- tests/src/SimpleSAML/Utils/SystemTest.php | 4 +- tests/src/SimpleSAML/Utils/XMLTest.php | 2 + tests/src/SimpleSAML/XHTML/TemplateTest.php | 11 ++++ .../XHTML/TemplateTranslationTest.php | 4 ++ tests/src/SimpleSAML/XML/ParserTest.php | 1 + tests/src/SimpleSAML/XML/SignerTest.php | 9 ++-- tests/src/SimpleSAML/XML/ValidatorTest.php | 8 +-- tests/www/IndexTest.php | 2 + 45 files changed, 302 insertions(+), 36 deletions(-) diff --git a/tests/SigningTestCase.php b/tests/SigningTestCase.php index 1dbb858839..9d7aa4600a 100644 --- a/tests/SigningTestCase.php +++ b/tests/SigningTestCase.php @@ -167,11 +167,17 @@ class SigningTestCase extends TestCase /** @var \SimpleSAML\Configuration */ protected Configuration $config; + protected const ROOTDIRNAME = 'testdir'; + protected const DEFAULTCERTDIR = 'certdir'; + protected const CA_PRIVATE_KEY = 'ca.key.pem'; + protected const CA_CERTIFICATE = 'ca.cert.pem'; + protected const GOOD_PRIVATE_KEY = 'good.key.pem'; + protected const GOOD_CERTIFICATE = 'good.cert.pem'; diff --git a/tests/modules/admin/src/Controller/FederationTest.php b/tests/modules/admin/src/Controller/FederationTest.php index f7229039f9..070ef7df01 100644 --- a/tests/modules/admin/src/Controller/FederationTest.php +++ b/tests/modules/admin/src/Controller/FederationTest.php @@ -38,6 +38,7 @@ class FederationTest extends TestCase /** @var string */ public const CERT_PUBLIC = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.crt'; + /** @var \SimpleSAML\Configuration */ protected Configuration $config; @@ -56,6 +57,7 @@ class FederationTest extends TestCase /** @var string */ private string $ssp_metadata = self::FRAMEWORK . '/metadata/simplesamlphp/saml20-idp-remote_cert_selfsigned.php'; + /** * Set up for each test. */ @@ -110,6 +112,7 @@ public function __construct() { } + public function getList(string $set = 'saml20-idp-remote', bool $showExpired = false): array { if ($set === 'saml20-idp-hosted') { @@ -144,11 +147,13 @@ public function __construct() // stub } + public function authenticate(array &$state): void { // stub } + public static function getSourcesOfType(string $type): array { return [ @@ -227,6 +232,7 @@ public function testMetadataConverterData(): void $this->assertNull($response->data['error']); } + /** */ public function testMetadataConverterSkipsExpires(): void @@ -308,11 +314,13 @@ public function __construct() // stub } + public function authenticate(array &$state): void { // stub } + public function getMetadata(): Configuration { return Configuration::loadFromArray( @@ -322,6 +330,7 @@ public function getMetadata(): Configuration ); } + public static function getById(string $authId, ?string $type = null): ?Auth\Source { return new static(); @@ -356,6 +365,7 @@ public function __construct() { } + public function getMetaDataConfig(string $entityId, string $set): Configuration { return Configuration::loadFromArray([ @@ -392,6 +402,7 @@ public function __construct() { } + public function getMetaData(?string $entityId, string $set): array { return []; diff --git a/tests/modules/admin/src/Controller/TestTest.php b/tests/modules/admin/src/Controller/TestTest.php index b224229bfe..9c153c4ef0 100644 --- a/tests/modules/admin/src/Controller/TestTest.php +++ b/tests/modules/admin/src/Controller/TestTest.php @@ -181,6 +181,7 @@ public function isAuthenticated(): bool return false; } + public function login(array $params = []): void { // stub @@ -212,6 +213,7 @@ public function isAuthenticated(): bool return true; } + public function getAttributes(): array { $nameId = new NameID(); @@ -251,11 +253,13 @@ public function getAttributes(): array ]; } + public function getAuthDataArray(): ?array { return []; } + public function getAuthData(string $name): mixed { $nameId = new NameID(); diff --git a/tests/modules/core/src/Auth/Process/TargetedIDTest.php b/tests/modules/core/src/Auth/Process/TargetedIDTest.php index 688ef3c4d0..9d895a1255 100644 --- a/tests/modules/core/src/Auth/Process/TargetedIDTest.php +++ b/tests/modules/core/src/Auth/Process/TargetedIDTest.php @@ -25,6 +25,7 @@ class TargetedIDTest extends TestCase /** @var \SimpleSAML\Utils\Config */ protected static Utils\Config $configUtils; + /** * Set up for each test. */ diff --git a/tests/modules/core/src/Auth/Source/SourceIPSelectorTest.php b/tests/modules/core/src/Auth/Source/SourceIPSelectorTest.php index f244236ee6..f86c720dad 100644 --- a/tests/modules/core/src/Auth/Source/SourceIPSelectorTest.php +++ b/tests/modules/core/src/Auth/Source/SourceIPSelectorTest.php @@ -122,6 +122,7 @@ public static function doAuthentication(Auth\Source $as, array &$state): void // Dummy } + /** * @param array &$state * @return void diff --git a/tests/modules/core/src/Controller/ExceptionTest.php b/tests/modules/core/src/Controller/ExceptionTest.php index 5b56fd56a0..901f41dc4d 100644 --- a/tests/modules/core/src/Controller/ExceptionTest.php +++ b/tests/modules/core/src/Controller/ExceptionTest.php @@ -8,8 +8,10 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; use SimpleSAML\Assert\AssertionFailedException; -use SimpleSAML\{Configuration, Logger, Session}; +use SimpleSAML\Configuration; +use SimpleSAML\Logger; use SimpleSAML\Module\core\Controller; +use SimpleSAML\Session; use SimpleSAML\TestUtils\ArrayLogger; use SimpleSAML\XHTML\Template; use Symfony\Component\HttpFoundation\Request; diff --git a/tests/modules/core/src/Controller/LoginTest.php b/tests/modules/core/src/Controller/LoginTest.php index 56f6dde1f4..a2676770bb 100644 --- a/tests/modules/core/src/Controller/LoginTest.php +++ b/tests/modules/core/src/Controller/LoginTest.php @@ -5,9 +5,11 @@ namespace SimpleSAML\Test\Module\core\Controller; use PHPUnit\Framework\Attributes\CoversClass; -use SimpleSAML\{Auth, Configuration, Error}; -use SimpleSAML\Module\core\Controller; +use SimpleSAML\Auth; +use SimpleSAML\Configuration; +use SimpleSAML\Error; use SimpleSAML\Module\core\Auth\UserPassBase; +use SimpleSAML\Module\core\Controller; use SimpleSAML\TestUtils\ClearStateTestCase; use SimpleSAML\XHTML\Template; use Symfony\Component\HttpFoundation\Request; @@ -111,16 +113,19 @@ public function __construct() // stub } + public function authenticate(array &$state): void { // stub } + public static function getById(string $authId, ?string $type = null): ?UserPassBase { return new static(); } + protected function login(string $username, string $password): array { return ['mail' => 'noreply@simplesamlphp.org']; diff --git a/tests/modules/core/src/Controller/LogoutTest.php b/tests/modules/core/src/Controller/LogoutTest.php index c1657486f2..90dce57a2a 100644 --- a/tests/modules/core/src/Controller/LogoutTest.php +++ b/tests/modules/core/src/Controller/LogoutTest.php @@ -5,7 +5,9 @@ namespace SimpleSAML\Test\Module\core\Controller; use PHPUnit\Framework\Attributes\CoversClass; -use SimpleSAML\{Auth, Configuration, Error}; +use SimpleSAML\Auth; +use SimpleSAML\Configuration; +use SimpleSAML\Error; use SimpleSAML\HTTP\RunnableResponse; use SimpleSAML\Module\core\Controller; use SimpleSAML\TestUtils\ClearStateTestCase; diff --git a/tests/modules/multiauth/src/Controller/DiscoControllerTest.php b/tests/modules/multiauth/src/Controller/DiscoControllerTest.php index ded2e77a5a..278c34c4cf 100644 --- a/tests/modules/multiauth/src/Controller/DiscoControllerTest.php +++ b/tests/modules/multiauth/src/Controller/DiscoControllerTest.php @@ -128,11 +128,13 @@ public function __construct() // stub } + public function authenticate(array &$state): never { // stub } + public static function getById(string $authId, ?string $type = null): ?Source { return new static(); @@ -182,11 +184,13 @@ public function __construct() // stub } + public function authenticate(array &$state): never { // stub } + public static function getById(string $authId, ?string $type = null): ?Source { return new static(); @@ -238,11 +242,13 @@ public function __construct() // stub } + public function authenticate(array &$state): never { // stub } + public static function getById(string $authId, ?string $type = null): ?Source { return new static(); @@ -294,11 +300,13 @@ public function __construct() // stub } + public function authenticate(array &$state): never { // stub } + public static function getById(string $authId, ?string $type = null): ?Source { return new static(); @@ -348,11 +356,13 @@ public function __construct() // stub } + public function authenticate(array &$state): never { // stub } + public static function getById(string $authId, ?string $type = null): ?Source { return new static(); diff --git a/tests/modules/saml/MessageTest.php b/tests/modules/saml/MessageTest.php index ca0cbe0db5..52dcb00d52 100644 --- a/tests/modules/saml/MessageTest.php +++ b/tests/modules/saml/MessageTest.php @@ -40,6 +40,7 @@ class MessageTest extends TestCase /** @var string */ protected string $acmeeCertificateMismatch; + /** * Set up for each test. */ @@ -145,6 +146,7 @@ protected function setUp(): void parent::setUp(); } + public function testCheckSignThrowsWhenBadCertificate(): void { $this->expectException(\Exception::class); @@ -170,6 +172,7 @@ public function testCheckSignThrowsWhenBadCertificate(): void Message::checkSign($idpConfig, $authnRequest); } + public function testCheckSignThrowsWhenMissingCertificate(): void { $this->expectException(SSP_Error\Exception::class); @@ -194,6 +197,7 @@ public function testCheckSignThrowsWhenMissingCertificate(): void Message::checkSign($idpConfig, $authnRequest); } + public function testCheckSignThrowsWhenCertificateMismatch(): void { $this->expectException(SSP_Error\Error::class); @@ -234,6 +238,7 @@ public function testCheckSignThrowsWhenCertificateMismatch(): void Message::checkSign($idpConfig, $parsed); } + public function testCheckSignSucceeds(): void { $localMetadata = $this->acmeeMetadata; diff --git a/tests/modules/saml/src/Auth/Process/FilterScopesTest.php b/tests/modules/saml/src/Auth/Process/FilterScopesTest.php index 068dae1210..ebe3b9319b 100644 --- a/tests/modules/saml/src/Auth/Process/FilterScopesTest.php +++ b/tests/modules/saml/src/Auth/Process/FilterScopesTest.php @@ -84,6 +84,7 @@ public function testValidScopes(): void $this->assertEquals($request['Attributes'], $result['Attributes']); } + /** * Test implicit scope matching on IdP hostname */ @@ -114,6 +115,7 @@ public function testImplicitScopes(): void $this->assertEquals([], $result['Attributes']); } + /** * Test invalid scopes. */ @@ -161,6 +163,7 @@ public function testInvalidScopes(): void $this->assertEquals($request['Attributes'], $result['Attributes']); } + /** * Test that implicit matching is not done when explicit scopes present */ @@ -189,6 +192,7 @@ public function testNoImplicitMatchingWhenExplicitScopes(): void $this->assertEquals([], $result['Attributes']); } + /** * Test that the scope is considered to be the part after the first @ sign */ diff --git a/tests/modules/saml/src/Auth/Process/PairwiseIDTest.php b/tests/modules/saml/src/Auth/Process/PairwiseIDTest.php index a73ca709b0..41a61ee87d 100644 --- a/tests/modules/saml/src/Auth/Process/PairwiseIDTest.php +++ b/tests/modules/saml/src/Auth/Process/PairwiseIDTest.php @@ -9,8 +9,10 @@ use RuntimeException; use SAML2\Constants as C; use SAML2\Exception\ProtocolViolationException; -use SimpleSAML\{Configuration, Logger, Utils}; +use SimpleSAML\Configuration; +use SimpleSAML\Logger; use SimpleSAML\Module\saml\Auth\Process\PairwiseID; +use SimpleSAML\Utils; /** * Test for the saml:PairwiseID filter. diff --git a/tests/modules/saml/src/Auth/Process/SubjectIDTest.php b/tests/modules/saml/src/Auth/Process/SubjectIDTest.php index 501ce92d94..961514655d 100644 --- a/tests/modules/saml/src/Auth/Process/SubjectIDTest.php +++ b/tests/modules/saml/src/Auth/Process/SubjectIDTest.php @@ -9,8 +9,10 @@ use RuntimeException; use SAML2\Constants as C; use SAML2\Exception\ProtocolViolationException; -use SimpleSAML\{Configuration, Logger, Utils}; +use SimpleSAML\Configuration; +use SimpleSAML\Logger; use SimpleSAML\Module\saml\Auth\Process\SubjectID; +use SimpleSAML\Utils; /** * Test for the saml:SubjectID filter. @@ -247,6 +249,7 @@ public function testWeakIdentifierLogsWarning(): void self::processFilter($config, $request); } + /** * Test that weak identifiers log a warning: not an actual domain name */ diff --git a/tests/modules/saml/src/Auth/Source/SPTest.php b/tests/modules/saml/src/Auth/Source/SPTest.php index 9e074d669c..01eccd0192 100644 --- a/tests/modules/saml/src/Auth/Source/SPTest.php +++ b/tests/modules/saml/src/Auth/Source/SPTest.php @@ -7,11 +7,12 @@ use InvalidArgumentException; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; -use SAML2\{AuthnRequest, LogoutRequest}; +use SAML2\AuthnRequest; use SAML2\Constants; use SAML2\DOMDocumentFactory; use SAML2\Exception\Protocol\NoAvailableIDPException; use SAML2\Exception\Protocol\NoSupportedIDPException; +use SAML2\LogoutRequest; use SAML2\Utils; use SAML2\XML\Chunk; use SAML2\XML\saml\NameID; @@ -45,6 +46,7 @@ class SPTest extends ClearStateTestCase /** @var string */ public const CERT_OTHER_PUBLIC = '../' . self::SECURITY . '/certificates/other.simplesamlphp.org.crt'; + /** @var \SimpleSAML\Configuration|null $idpMetadata */ private ?Configuration $idpMetadata = null; @@ -354,7 +356,7 @@ public function testIdpListWithExplicitIdpMatch(): void $this->fail('Expected ExitTestException'); } catch (ExitTestException $e) { $r = $e->getTestResult(); - /** @var AuthnRequest $ar */ + /** @var \SAML2\AuthnRequest $ar */ $ar = $r['ar']; $xml = $ar->toSignedXML(); @@ -393,7 +395,7 @@ public function testIdpListWithSingleMatch(): void $this->fail('Expected ExitTestException'); } catch (ExitTestException $e) { $r = $e->getTestResult(); - /** @var AuthnRequest $ar */ + /** @var \SAML2\AuthnRequest $ar */ $ar = $r['ar']; $xml = $ar->toSignedXML(); @@ -442,6 +444,7 @@ public function testIdpListWithMultipleMatch(): void $as->authenticate($state); } + /** * Basic test for the hosted metadata generation in a default config */ @@ -469,6 +472,7 @@ public function testMetadataHostedBasicConfig(): void } } + /** * Test that adding IDPList to the state (of an AuthRequest) * will result in that IDP being added to the scope @@ -485,6 +489,7 @@ public function testSPIdpListScoping(): void ); } + /** * Test that adding IDPList to the idp metadata * will result in that IDP being added to the scope @@ -500,6 +505,7 @@ public function testIdpMetadataScoping(): void ); } + /** * Test that adding IDPList to the config * will result in that IDP being added to the scope @@ -570,6 +576,7 @@ public function testSPIdpListScopingOrder( } } + public static function getScopingOrders(): array { return [ @@ -606,6 +613,7 @@ public static function getScopingOrders(): array ]; } + /** * Test for the hosted metadata generation with a custom entityID */ @@ -620,6 +628,7 @@ public function testMetadataHostedSetEntityId(): void $this->assertEquals('urn:example:mysp:001', $md['entityid']); } + /** * Contacts in SP hosted config appear in metadata */ @@ -679,6 +688,7 @@ public function testMetadataHostedContacts(): void $this->assertArrayNotHasKey('attributes', $contact); } + /** * A globally set tech contact also appears in SP hosted metadata */ @@ -724,6 +734,7 @@ public function testMetadataHostedContactsIncludesGlobalTechContact(): void $this->assertArrayNotHasKey('surName', $contact); } + /** * The special value na@example.org global tech contact is not included in SP metadata */ @@ -753,8 +764,9 @@ public function testMetadataHostedContactsSkipsNAGlobalTechContact(): void $this->assertEquals('j.doe@example.edu', $md['contacts'][0]['emailAddress']); } + /** - * Contacts in SP hosted of unknown type throws Exceptiona + * Contacts in SP hosted of unknown type throws Exception */ public function testMetadataHostedContactsUnknownTypeThrowsException(): void { @@ -779,6 +791,7 @@ public function testMetadataHostedContactsUnknownTypeThrowsException(): void $md = $as->getHostedMetadata(); } + /** * SP acs.Bindings option overrides default bindigs */ @@ -808,6 +821,7 @@ public function testMetadataHostedAcsBindingsOption(): void ); } + /** * SP acs.Bindings option with unsupported value should be skipped */ @@ -837,6 +851,7 @@ public function testMetadataHostedAcsBindingsUnknownValueIsSkipped(): void ); } + /** * SP SLO Bindings option overrides default bindigs */ @@ -858,6 +873,7 @@ public function testMetadataHostedSloBindingsOption(): void ); } + /** * SP empty SLO Bindings option omits SLO in metadata */ @@ -875,6 +891,7 @@ public function testMetadataHostedSloBindingsEmptyNotInMetadata(): void $this->assertCount(0, $md['SingleLogoutService']); } + /** * SP SLO Bindings option with unknown value is accepted as-is */ @@ -900,6 +917,7 @@ public function testMetadataHostedSloBindingsUnknownValueIsAccepted(): void $this->assertEquals('urn:this:doesnotexist', $md['SingleLogoutService'][1]['Binding']); } + /** * SP SLO Location option is used as URL for all SLO Bindings */ @@ -928,6 +946,7 @@ public function testMetadataHostedSloURLIsUsedForAllSLOBindings(): void $this->assertEquals('https://sp.example.org/logout', $md['SingleLogoutService'][1]['Location']); } + /** * SP AssertionConsumerService option overrides default bindigs */ @@ -1023,6 +1042,7 @@ public function testMetadataHostedSigning(): void $this->assertTrue($md['validate.authnrequest']); } + /** * SP config option RegistrationInfo is reflected in metadata */ @@ -1052,6 +1072,7 @@ public function testMetadataHostedContainsRegistrationInfo(): void $this->assertEquals('http://sp.example.org/politica', $reginfo['policies']['es']); } + /** * SP config option NameIDPolicy is reflected in metadata */ @@ -1074,6 +1095,7 @@ public function testMetadataHostedNameIDPolicy(): void $this->assertEquals('urn:mace:shibboleth:1.0:nameIdentifier', $md['NameIDFormat']); } + /** * SP config option NameIDPolicy specified without Format is reflected in metadata */ @@ -1093,6 +1115,7 @@ public function testMetadataHostedNameIDPolicyNullFormat(): void $this->assertEquals('urn:oasis:names:tc:SAML:2.0:nameid-format:transient', $md['NameIDFormat']); } + /** * SP config option Organization* are reflected in metadata */ @@ -1124,6 +1147,7 @@ public function testMetadataHostedOrganizationData(): void $this->assertEquals('https://example.com/nl', $md['OrganizationURL']['nl']); } + /** * SP config option Organization* without explicit DisplayName are reflected in metadata */ @@ -1149,6 +1173,7 @@ public function testMetadataHostedOrganizationDataDefaultForDisplayNameIsName(): $this->assertEquals('https://example.com/nl', $md['OrganizationURL']['nl']); } + /** * SP config option Organization* without URL is rejected with an Exception */ @@ -1173,6 +1198,7 @@ public function testMetadataHostedOrganizationURLMissingRaisesException(): void $md = $as->getHostedMetadata(); } + /** * SP config option for UIInfo is reflected in metadata */ @@ -1202,6 +1228,7 @@ public function testMetadataHostedUIInfo(): void $this->assertEquals('Descripción en Español', $md['UIInfo']['Description']['es']); } + /** * SP config option for entity attribute extensions is reflected in metadata */ @@ -1222,6 +1249,7 @@ public function testMetadataHostedEntityExtensions(): void $this->assertEquals($ea, $md['EntityAttributes']); } + /** * SP config option for Name, Description, Attributes is in metadata */ @@ -1270,6 +1298,7 @@ public function testMetadataHostedNameDescriptionAttributes(): void ); } + /** * SP config option for Name, Description require attributes to be specified */ @@ -1294,6 +1323,7 @@ public function testMetadataHostedNameDescriptionAbsentWhenNoAttributes(): void $this->assertArrayNotHasKey('description', $md); } + /** * SP config for attributes also requires name in metadata */ @@ -1315,6 +1345,7 @@ public function testMetadataHostedAttributesRequiresName(): void $this->assertArrayNotHasKey('attributes', $md); } + /** * SP config for attributes with extra options */ @@ -1344,6 +1375,7 @@ public function testMetadataHostedAttributesExtraOptions(): void $this->assertEquals(true, $md['attributes.isDefault']); } + /** * SP config for holder-of-key profile via ProtocolBinding is reflected in metadata */ @@ -1371,6 +1403,7 @@ public function testMetadataHolderOfKeyViaProtocolBindingIsInMetadata(): void $this->assertEquals('urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', $hok['hoksso:ProtocolBinding']); } + /** * SP config with certificate are reflected in metadata */ @@ -1397,6 +1430,7 @@ public function testMetadatCertificateIsInMetadata(): void $this->assertEquals('', $md['keys'][0]['prefix']); } + /** * SP config with certificate in rollocer scenario are reflected in metadata */ @@ -1430,6 +1464,7 @@ public function testMetadatCertificateInRolloverIsInMetadata(): void $this->assertEquals('', $md['keys'][1]['prefix']); } + /** * We only support SAML 2.0 as a protocol with this auth source */ @@ -1446,6 +1481,7 @@ public function testSupportedProtocolsReturnsSAML20Only(): void $this->assertEquals('urn:oasis:names:tc:SAML:2.0:protocol', $protocols[0]); } + /** * We only support SAML 2.0 as a protocol with this auth source */ @@ -1478,9 +1514,10 @@ public function testSAML11BindingsDoesNotInfluenceProtocolsSupported(): void $this->assertEquals('urn:oasis:names:tc:SAML:2.0:protocol', $protocols[0]); } - /** - * Test sending a LogoutRequest - */ + + /** + * Test sending a LogoutRequest + */ public function testLogoutRequest(): void { $nameId = new NameID(); @@ -1525,7 +1562,8 @@ public function testLogoutRequest(): void $this->assertEquals('urn:some:namespace', $q[0]->firstChild->namespaceURI); } - /* + + /** * Test using the entityID from config/authsources.php.dist */ public function testSampleEntityIdException(): void diff --git a/tests/modules/saml/src/Controller/MetadataTest.php b/tests/modules/saml/src/Controller/MetadataTest.php index e94b73d984..4337ad9a5b 100644 --- a/tests/modules/saml/src/Controller/MetadataTest.php +++ b/tests/modules/saml/src/Controller/MetadataTest.php @@ -31,6 +31,8 @@ class MetadataTest extends TestCase protected Utils\Auth $authUtils; protected MetaDataStorageHandler $mdh; + + /** * Set up for each test. */ @@ -48,8 +50,11 @@ protected function setUp(): void /** @var string */ public const CERT_PUBLIC = self::XMLSEC . '/certificates/selfsigned.simplesamlphp.org.crt'; + + /** @var array */ private array $idps; + public function __construct() { $this->idps = [ @@ -72,6 +77,7 @@ public function __construct() ]; } + public function getMetaData(?string $entityId, string $set): array { if (isset($this->idps[$entityId]) && $set === 'saml20-idp-hosted') { @@ -81,6 +87,7 @@ public function getMetaData(?string $entityId, string $set): array throw new Error\MetadataNotFound($entityId ?? ''); } + public function getList(string $set = 'saml20-idp-remote', bool $showExpired = false): array { if ($set === 'saml20-idp-hosted') { @@ -89,6 +96,7 @@ public function getList(string $set = 'saml20-idp-remote', bool $showExpired = f return []; } + public function getMetaDataCurrentEntityID(string $set, string $type = 'entityid'): string { return 'urn:example:simplesaml:another:idp'; @@ -179,6 +187,7 @@ public function testMetadataAccess(bool $authenticated, bool $protected): void } } + public static function provideMetadataAccess(): array { return [ @@ -190,6 +199,7 @@ public static function provideMetadataAccess(): array ]; } + /** * Test that saml20-idp setting disabled disables access */ @@ -217,6 +227,7 @@ public function testDisabledSAML20IDPReturnsNoAccess(): void $result = $c->metadata($request); } + /** * Test that requesting a non-existing entityID throws an exception */ @@ -235,6 +246,7 @@ public function testMetadataUnknownEntityThrowsError(): void $result = $c->metadata($request); } + /** * Basic smoke test of generated metadata */ @@ -260,6 +272,7 @@ public function testMetadataYieldsContent(): void $this->assertStringContainsString($expect, $content); } + /** * Test not specifying explict entityID falls back to a default */ @@ -285,6 +298,7 @@ public function testMetadataDefaultIdPYieldsContent(): void $this->assertStringContainsString($expect, $content); } + /** * Check if caching headers are set */ diff --git a/tests/modules/saml/src/Controller/ServiceProviderTest.php b/tests/modules/saml/src/Controller/ServiceProviderTest.php index ab777b389a..2cc8abcb86 100644 --- a/tests/modules/saml/src/Controller/ServiceProviderTest.php +++ b/tests/modules/saml/src/Controller/ServiceProviderTest.php @@ -40,18 +40,20 @@ class ServiceProviderTest extends TestCase /** @var \SimpleSAML\Utils\Auth */ protected Utils\Auth $authUtils; - /** @var Controller\ServiceProvider */ + /** @var \SimpleSAML\Module\saml\Controller\ServiceProvider */ protected Controller\ServiceProvider $serviceProvider; - /** @var Utils\HTTP */ + /** @var \SimpleSAML\Utils\HTTP */ protected Utils\HTTP $httpUtils; + /** @var string */ public const RELAY_STATE = 'https://example.org'; + /** * Set up for each test. - * @throws Exception + * @throws \Exception */ protected function setUp(): void { @@ -144,6 +146,7 @@ public function testLoginMissingReturnTo(): void $c->login($request, 'phpunit'); } + /** * Test that accessing the login-endpoint with empty ReturnTo parameter leads to an exception * @@ -294,6 +297,7 @@ public static function loginNotAuthenticatedDataProvider(): array ]; } + /** * Test Login without Session/ Not Authenticated * @@ -347,6 +351,7 @@ public function testLoginHandleNotAuthenticated( } } + /** * @return array */ @@ -412,6 +417,7 @@ public static function loginAuthenticatedDataProvider(): array ]; } + /** * Test Login with Session/Authenticated * @@ -471,6 +477,7 @@ public function testLoginHandleAuthenticated( } } + /** * Test that accessing the discoResponse-endpoint with unknown authsource in state results in an exception * @@ -798,6 +805,7 @@ public function testMetadataAccess(bool $authenticated, bool $protected): void } } + public static function provideMetadataAccess(): array { return [ @@ -809,6 +817,7 @@ public static function provideMetadataAccess(): array ]; } + /** * Test that requesting a non-existing authsource yields an error */ @@ -826,6 +835,7 @@ public function testMetadataUnknownEntityThrowsError(): void $c->metadata($request, 'phpnonunit'); } + /** * Basic smoke test of generated metadata */ @@ -846,6 +856,7 @@ public function testMetadataYieldsContent(): void $this->assertStringContainsString($expect, $content); } + /** * Check if caching headers are set */ diff --git a/tests/modules/saml/src/IdP/SAML2Test.php b/tests/modules/saml/src/IdP/SAML2Test.php index 9e51018cec..80a578c699 100644 --- a/tests/modules/saml/src/IdP/SAML2Test.php +++ b/tests/modules/saml/src/IdP/SAML2Test.php @@ -28,6 +28,7 @@ class SAML2Test extends ClearStateTestCase /** @var string */ public const CERT_PUBLIC = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.crt'; + /** * Default values for the state array expected to be generated at the start of logins * @var array @@ -232,6 +233,7 @@ function ($arg) use (&$state) { return $state; } + /** * Perform needed setup to be able to provide an array config * of IdP-hosted metadata and be able to query this back from @@ -325,6 +327,7 @@ public function testIdPGetHostedMetadataMinimal(): void $this->assertStringStartsWith('MIICxDCCAi2gAwI', $hostedMd['keys'][0]['X509Certificate']); } + public function testIdPGetHostedKeyRollover(): void { $md = ['new_certificate' => self::CERT_PUBLIC, 'new_privatekey' => self::CERT_KEY]; @@ -345,6 +348,7 @@ public function testIdPGetHostedKeyRollover(): void $this->assertStringStartsWith('MIICxDCCAi2gAwI', $hostedMd['keys'][1]['X509Certificate']); } + public function testIdPGetHostedHttpsCertificate(): void { $md = ['https.certificate' => self::CERT_PUBLIC]; @@ -365,6 +369,7 @@ public function testIdPGetHostedHttpsCertificate(): void $this->assertStringStartsWith('MIICxDCCAi2gAwI', $hostedMd['keys'][1]['X509Certificate']); } + public function testIdPGetHostedMetadataArtifact(): void { $md = ['saml20.sendartifact' => true]; @@ -383,6 +388,7 @@ public function testIdPGetHostedMetadataArtifact(): void ); } + public function testIdPGetHostedMetadataHolderOfKey(): void { $md = ['saml20.hok.assertion' => true]; @@ -408,6 +414,7 @@ public function testIdPGetHostedMetadataHolderOfKey(): void ); } + public function testIdPGetHostedMetadataECP(): void { $md = ['saml20.ecp' => true]; @@ -433,6 +440,7 @@ public function testIdPGetHostedMetadataECP(): void ); } + /** * NameIDFormat option can be specified as string or array */ @@ -463,6 +471,7 @@ public function testIdPGetHostedNameIdFormat(): void $this->assertEquals('urn:oasis:names:tc:SAML:2.0:nameid-format:persistent', $hostedMd['NameIDFormat'][1]); } + public function testIdPGetHostedScopes(): void { $md = [ @@ -478,6 +487,7 @@ public function testIdPGetHostedScopes(): void $this->assertArrayNotHasKey('unknown-option', $hostedMd); } + /** * IdP config option Organization* are reflected in metadata */ @@ -504,6 +514,7 @@ public function testMetadataHostedOrganizationData(): void $this->assertEquals('https://example.com/nl', $md['OrganizationURL']['nl']); } + /** * IdP config option Organization* without explicit DisplayName are reflected in metadata */ @@ -524,6 +535,7 @@ public function testMetadataHostedOrganizationDataDefaultForDisplayNameIsName(): $this->assertEquals('https://example.com/nl', $md['OrganizationURL']['nl']); } + /** * IdP config option Organization* without URL is rejected with an Exception */ @@ -543,6 +555,7 @@ public function testMetadataHostedOrganizationURLMissingRaisesException(): void $md = $this->idpMetadataHandlerHelper($config); } + /** * IdP config option for entity attributes is reflected in metadata */ @@ -571,6 +584,7 @@ public function testMetadataHostedEntityAttributes(): void $this->assertTrue($md['hide.from.discovery']); } + /** * IdP config option for entity attribute extensions is reflected in metadata */ @@ -600,6 +614,7 @@ public function testMetadataHostedEntityExtensions(): void ); } + /** * IdP config option for UIInfo is reflected in metadata */ @@ -639,6 +654,7 @@ public function testMetadataHostedUIInfo(): void $this->assertEquals('geo:19.34343,12.342514', $md['DiscoHints']['GeolocationHint'][1]); } + /** * IdP config option RegistrationInfo is reflected in metadata */ @@ -663,6 +679,7 @@ public function testMetadataHostedContainsRegistrationInfo(): void $this->assertEquals('http://sp.example.org/politica', $reginfo['policies']['es']); } + /** * IdP config options wrt signing are reflected in metadata */ @@ -681,6 +698,7 @@ public function testMetadataHostedSigning(): void $this->assertArrayNotHasKey('redirect.validate', $md); } + /** * Contacts in IdP hosted config appear in metadata */ @@ -734,6 +752,7 @@ public function testMetadataHostedContacts(): void $this->assertArrayNotHasKey('attributes', $contact); } + /** * A globally set tech contact also appears in IdP hosted metadata */ @@ -773,6 +792,7 @@ public function testMetadataHostedContactsIncludesGlobalTechContact(): void $this->assertArrayNotHasKey('surName', $contact); } + /** * The special value na@example.org global tech contact is not included in IdP metadata */ @@ -798,6 +818,7 @@ public function testMetadataHostedContactsSkipsNAGlobalTechContact(): void $this->assertEquals('j.doe@example.edu', $md['contacts'][0]['emailAddress']); } + /** * Contacts in IdP hosted of unknown type throws Exceptiona */ diff --git a/tests/src/SimpleSAML/Auth/ProcessingChainTest.php b/tests/src/SimpleSAML/Auth/ProcessingChainTest.php index 2f6f83f5dc..3c9cd8446a 100644 --- a/tests/src/SimpleSAML/Auth/ProcessingChainTest.php +++ b/tests/src/SimpleSAML/Auth/ProcessingChainTest.php @@ -44,6 +44,7 @@ public function testInsertAuthProcs(): void $this->assertInstanceOf(AttributeLimit::class, $filterInChain[2]); } + public function testInsertAuthFromConfigs(): void { $config = []; diff --git a/tests/src/SimpleSAML/Auth/SimpleTest.php b/tests/src/SimpleSAML/Auth/SimpleTest.php index 3512733bbe..8a3b6e5099 100644 --- a/tests/src/SimpleSAML/Auth/SimpleTest.php +++ b/tests/src/SimpleSAML/Auth/SimpleTest.php @@ -4,9 +4,10 @@ namespace SimpleSAML\Test\Auth; -use ReflectionClass; use PHPUnit\Framework\Attributes\CoversClass; -use SimpleSAML\{Auth, Configuration}; +use ReflectionClass; +use SimpleSAML\Auth; +use SimpleSAML\Configuration; use SimpleSAML\TestUtils\ClearStateTestCase; /** diff --git a/tests/src/SimpleSAML/ConfigurationTest.php b/tests/src/SimpleSAML/ConfigurationTest.php index 0253117851..e43d0f98d3 100644 --- a/tests/src/SimpleSAML/ConfigurationTest.php +++ b/tests/src/SimpleSAML/ConfigurationTest.php @@ -1076,7 +1076,7 @@ public function testGetConfigNonexistentFilePreload(): void /** * @return void - * @throws Exception + * @throws \Exception */ public function testCanLoadDefinedConfigFromFile(): void { @@ -1090,7 +1090,7 @@ public function testCanLoadDefinedConfigFromFile(): void /** * @return void - * @throws Exception + * @throws \Exception */ public function testCanLoadReturnedConfigFromFile(): void { @@ -1101,9 +1101,10 @@ public function testCanLoadReturnedConfigFromFile(): void $this->assertArrayHasKey('returned', $config->toArray()); } + /** * @return void - * @throws Exception + * @throws \Exception */ public function testLoadFromFileConfigurationError(): void { diff --git a/tests/src/SimpleSAML/Error/ErrorCodesTest.php b/tests/src/SimpleSAML/Error/ErrorCodesTest.php index 0743a79507..a44dd97646 100644 --- a/tests/src/SimpleSAML/Error/ErrorCodesTest.php +++ b/tests/src/SimpleSAML/Error/ErrorCodesTest.php @@ -18,6 +18,7 @@ protected function instance(): ErrorCodes return new ErrorCodes(); } + /** * @deprecated */ @@ -28,6 +29,7 @@ public function testCanStaticallyGetFallbackValuesForNonExistentErrorCode(): voi $this->assertStringContainsString($nonExistentCode, ErrorCodes::getErrorCodeDescription($nonExistentCode)); } + public function testCanGetFallbackValuesForNonExistentErrorCode(): void { $nonExistentCode = 'nonexistent'; @@ -35,6 +37,7 @@ public function testCanGetFallbackValuesForNonExistentErrorCode(): void $this->assertStringContainsString($nonExistentCode, $this->instance()->getDescription($nonExistentCode)); } + /** * @deprecated */ @@ -79,6 +82,7 @@ public function testCanStaticallyGetDefaultErrorCodes(): void ); } + public function testCanGetDefaultErrorCodes(): void { $this->assertSameSize( @@ -120,6 +124,7 @@ public function testCanGetDefaultErrorCodes(): void ); } + /** * @deprecated */ @@ -128,14 +133,19 @@ public function testCanStaticallyExtendWithCustomErrorCodes(): void $customErrorCodes = new class extends ErrorCodes { public const CUSTOMCODE = 'CUSTOMCODE'; + + public static string $customTitle = 'customTitle'; + public static string $customDescription = 'customDescription'; + public static function getCustomErrorCodeTitles(): array { return [self::CUSTOMCODE => self::$customTitle]; } + public static function getCustomErrorCodeDescriptions(): array { return [self::CUSTOMCODE => self::$customDescription]; @@ -181,6 +191,7 @@ public static function getCustomErrorCodeDescriptions(): array ); } + /** * @deprecated */ @@ -189,14 +200,19 @@ public function testCanExtendWithCustomErrorCodes(): void $customErrorCodes = new class extends ErrorCodes { public const CUSTOMCODE = 'CUSTOMCODE'; + + public static string $customTitle = 'customTitle'; + public static string $customDescription = 'customDescription'; + public function getCustomTitles(): array { return [self::CUSTOMCODE => self::$customTitle]; } + public function getCustomDescriptions(): array { return [self::CUSTOMCODE => self::$customDescription]; diff --git a/tests/src/SimpleSAML/Error/ErrorTest.php b/tests/src/SimpleSAML/Error/ErrorTest.php index a73dd77e19..15abd4354c 100644 --- a/tests/src/SimpleSAML/Error/ErrorTest.php +++ b/tests/src/SimpleSAML/Error/ErrorTest.php @@ -17,11 +17,16 @@ class ErrorTest extends TestCase { private ErrorCodes $errorCodes; + private array|string $errorCodeSample; + private ?int $httpCodeSample; + private MockObject|Throwable|null $causeMock; + private MockObject|ErrorCodes|null $errorCodesMock; + protected function setUp(): void { $this->errorCodes = new ErrorCodes(); @@ -32,6 +37,7 @@ protected function setUp(): void $this->errorCodesMock = $this->createMock(ErrorCodes::class); } + protected function mocked(): Error { return new Error( @@ -42,6 +48,7 @@ protected function mocked(): Error ); } + public function testCanInstantiateWithErrorCodeString(): void { $error = new Error(ErrorCodes::WRONGUSERPASS); @@ -61,6 +68,7 @@ public function testCanInstantiateWithErrorCodeString(): void ); } + public function testCanInstantiateWithErrorCodeParamsArray(): void { $errorCodeParams = [ @@ -85,6 +93,7 @@ public function testCanInstantiateWithErrorCodeParamsArray(): void ); } + public function testCanUseInjectedMockedErrorCodes(): void { $testTitle = 'testTitle'; @@ -106,6 +115,7 @@ public function testCanUseInjectedMockedErrorCodes(): void $this->assertSame($testDescription, $error->getDictDescr()); } + public function testCanExtendWithCustomErrorCodes(): void { $customErrorCode = 'CUSTOMCODE'; @@ -117,10 +127,14 @@ public function getErrorCodes(): ErrorCodes return new class extends ErrorCodes { public const CUSTOMCODE = 'CUSTOMCODE'; + + public function getCustomTitles(): array { return [self::CUSTOMCODE => 'customCodeTitle']; } + + public function getCustomDescriptions(): array { return [self::CUSTOMCODE => 'customCodeDescription']; diff --git a/tests/src/SimpleSAML/Locale/LanguageTest.php b/tests/src/SimpleSAML/Locale/LanguageTest.php index 5a28695597..08794661a3 100644 --- a/tests/src/SimpleSAML/Locale/LanguageTest.php +++ b/tests/src/SimpleSAML/Locale/LanguageTest.php @@ -174,6 +174,7 @@ public function testSetLanguage(): void $this->assertEquals('en', $l->getLanguage()); } + public function testGetPreferredLanguages(): void { // test defaults diff --git a/tests/src/SimpleSAML/Locale/LocalizationTest.php b/tests/src/SimpleSAML/Locale/LocalizationTest.php index c27d48646a..c8c31cfa2a 100644 --- a/tests/src/SimpleSAML/Locale/LocalizationTest.php +++ b/tests/src/SimpleSAML/Locale/LocalizationTest.php @@ -49,6 +49,7 @@ public function testAddDomain(): void $this->assertEquals($newDomainLocaleDir, $registeredDomains[$newDomain]); } + /** * Test SimpleSAML\Locale\Localization::addModuleDomains(). */ @@ -66,6 +67,7 @@ public function testAddModuleDomain(): void $this->assertEquals($newDomainLocaleDir, $registeredDomains['attributes']); } + /** * Test SimpleSAML\Locale\Localization::addModuleDomains() with a theme. */ diff --git a/tests/src/SimpleSAML/Locale/TranslateTest.php b/tests/src/SimpleSAML/Locale/TranslateTest.php index a98594c315..b638a73cf8 100644 --- a/tests/src/SimpleSAML/Locale/TranslateTest.php +++ b/tests/src/SimpleSAML/Locale/TranslateTest.php @@ -26,6 +26,7 @@ public function testNoop(): void $this->assertEquals($testString, $t->noop($testString)); } + /** * Test SimpleSAML\Locale\Translate::translateFromArray(). */ @@ -38,6 +39,7 @@ public function testTranslateFromArray(): void $this->assertEquals('interlingua', $result); } + public function testTranslateFromArrayFallback(): void { $result = Translate::translateFromArray( @@ -47,6 +49,7 @@ public function testTranslateFromArrayFallback(): void $this->assertEquals('english', $result); } + public function testTranslateFromArrayFail(): void { $result = Translate::translateFromArray( diff --git a/tests/src/SimpleSAML/Metadata/MetaDataStorageHandlerTest.php b/tests/src/SimpleSAML/Metadata/MetaDataStorageHandlerTest.php index c993ac8c8e..26aaa9880e 100644 --- a/tests/src/SimpleSAML/Metadata/MetaDataStorageHandlerTest.php +++ b/tests/src/SimpleSAML/Metadata/MetaDataStorageHandlerTest.php @@ -26,6 +26,7 @@ protected function getHandler(?array $config = null): MetaDataStorageHandler return MetaDataStorageHandler::getMetadataHandler(); } + public static function entityIDsList(): array { return [ @@ -41,6 +42,8 @@ public static function entityIDsList(): array 'empty list' => [[]], ]; } + + /** * Test that loading specific entities work, and that metadata source precedence is followed */ @@ -69,6 +72,7 @@ public function testLoadEntities(array $entityIDs): void } } + /** * Test that retrieving a full metadataSet from a source works and precedence works */ @@ -93,6 +97,7 @@ public function testLoadMetadataSet(): void $this->assertEquals('hostname SP from source1', $entities['http://localhost/simplesaml']['name']['en']); } + /** * Query from a metadata set for which we have no entities should be empty */ @@ -103,6 +108,7 @@ public function testLoadMetadataSetEmpty(): void $this->assertCount(0, $entities); } + /** * Test the current metadata entity selection */ @@ -113,6 +119,7 @@ public function testGetMetadataCurrent(): void $this->assertEquals('http://localhost/simplesaml', $entity['entityid']); } + /** * Test the helper that returns the metadata as a Configuration object */ @@ -124,6 +131,7 @@ public function testGetMetadataConfig(): void $this->assertEquals('entityA', $entity->getValue('entityid')); } + /** * Test the helper that searches metadata by sha1 hash */ @@ -136,6 +144,7 @@ public function testGetMetadataConfigForSha1(): void $this->assertEquals('entityB', $entity->getValue('entityid')); } + /** * Test the helper that searches metadata by sha1 hash */ @@ -147,6 +156,7 @@ public function testGetMetadataConfigForSha1NotFoundReturnsNull(): void $this->assertNull($entity); } + /** * Test the current metadata entity selection, empty set */ @@ -157,6 +167,7 @@ public function testGetMetadataCurrentEmptySet(): void $this->getHandler()->getMetaDataCurrent('saml20-idp-remote'); } + /** * Test that trying to fetch a non-existent entity throws Exception */ @@ -171,6 +182,7 @@ public function testGetMetaDataNonExistentEntity(): void $this->getHandler()->getMetaData('doesnotexist', 'saml20-sp-remote'); } + /* * Test using the entityID from metadata-templates/saml20-idp-hosted.php */ @@ -181,6 +193,7 @@ public function testSampleEntityIdException(): void $this->getHandler()->getMetaDataCurrent('saml20-idp-hosted'); } + public function testCanHaveMultipleHostedIdps(): void { $config = [ @@ -195,6 +208,7 @@ public function testCanHaveMultipleHostedIdps(): void $this->assertCount(2, $idps); } + public function testCanGetDefaultHostedIdpInCaseOfMultipleHostedIdps(): void { $config = [ @@ -209,6 +223,7 @@ public function testCanGetDefaultHostedIdpInCaseOfMultipleHostedIdps(): void $this->assertSame('urn:x-simplesamlphp:example-idp-1', $defaultIdp['entityid']); } + public function testCanGetParticularIdpInCaseOfMultipleHostedIdps(): void { $config = [ @@ -223,6 +238,7 @@ public function testCanGetParticularIdpInCaseOfMultipleHostedIdps(): void $this->assertSame('urn:x-simplesamlphp:example-idp-2', $particularIdp['entityid']); } + public function testCanOverrideHostedIdpOptionsInCaseOfMultipleHostedIdps(): void { $config = [ diff --git a/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php b/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php index a1ad20e4fa..ffaa600620 100644 --- a/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php +++ b/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php @@ -18,6 +18,7 @@ class SAMLBuilderTest extends TestCase { private const SECURITY = 'vendor/simplesamlphp/xml-security/resources'; + /** */ protected function setUp(): void @@ -25,6 +26,7 @@ protected function setUp(): void Configuration::loadFromArray([], '', 'simplesaml'); } + /** */ protected function tearDown(): void @@ -32,6 +34,7 @@ protected function tearDown(): void Configuration::clearInternalState(); } + /** * Test the requested attributes are valued correctly. */ @@ -260,6 +263,7 @@ public function testProtocolSupportEnumeration(): void ); } + /** * Test custom metadata extension (saml:Extensions). */ @@ -300,6 +304,7 @@ public function testCustomMetadataExtension(): void $this->assertEquals($republishTargetContent, $rt1->textContent); } + /** * Test adding contacts to metadata */ @@ -390,6 +395,7 @@ public function testContacts(): void $this->assertEquals("Doe", $sn->item(0)->nodeValue); } + /* * Test certificate data. */ diff --git a/tests/src/SimpleSAML/Metadata/SAMLParserTest.php b/tests/src/SimpleSAML/Metadata/SAMLParserTest.php index 575c99790b..9f8c5da281 100644 --- a/tests/src/SimpleSAML/Metadata/SAMLParserTest.php +++ b/tests/src/SimpleSAML/Metadata/SAMLParserTest.php @@ -368,6 +368,7 @@ public function testRoleDescriptorExtensions(): void $this->assertEquals($expected['name'], $metadata['name']); } + /** * Test entity category hidden from discovery is parsed */ @@ -400,6 +401,7 @@ public function testHiddenFromDiscovery(): void $this->assertTrue($metadata['hide.from.discovery']); } + /** * Test entity category hidden from discovery is not returned when not present */ @@ -431,6 +433,7 @@ public function testHiddenFromDiscoveryNotHidden(): void $this->assertArrayNotHasKey('hide.from.discovery', $metadata); } + /** * Test entity category hidden from discovery is not returned when no mace dir entity categories present */ diff --git a/tests/src/SimpleSAML/ModuleTest.php b/tests/src/SimpleSAML/ModuleTest.php index 02dcaacf03..6f6a70d477 100644 --- a/tests/src/SimpleSAML/ModuleTest.php +++ b/tests/src/SimpleSAML/ModuleTest.php @@ -115,6 +115,7 @@ public function testResolveClass(): void )); } + /** * Test for SimpleSAML\Module::getModuleHooks(). It covers happy path. */ @@ -127,6 +128,7 @@ public function testGetModuleHooks(): void $this->assertEquals($expectedFile, $hooks['configpage']['file']); } + /** * Test for SimpleSAML\Module::getModuleHooks(). It covers invalid hook names */ diff --git a/tests/src/SimpleSAML/SessionHandlerPHPTest.php b/tests/src/SimpleSAML/SessionHandlerPHPTest.php index 75ad24b730..5236a47fb6 100644 --- a/tests/src/SimpleSAML/SessionHandlerPHPTest.php +++ b/tests/src/SimpleSAML/SessionHandlerPHPTest.php @@ -9,7 +9,8 @@ use PHPUnit\Framework\Attributes\DoesNotPerformAssertions; use PHPUnit\Framework\Attributes\RequiresPhpExtension; use PHPUnit\Framework\Attributes\RunInSeparateProcess; -use SimpleSAML\{Configuration, SessionHandlerPHP}; +use SimpleSAML\Configuration; +use SimpleSAML\SessionHandlerPHP; use SimpleSAML\TestUtils\ClearStateTestCase; /** @@ -168,7 +169,7 @@ public function testRestorePrevious(): void session_start(); Configuration::loadFromArray($this->sessionConfig, '[ARRAY]', 'simplesaml'); - /** @var SessionHandlerPHP $sh */ + /** @var \SimpleSAML\SessionHandlerPHP $sh */ $sh = SessionHandlerPHP::getSessionHandler(); $sh->setCookie('SimpleSAMLSessionID', 'Restore'); $sh->restorePrevious(); diff --git a/tests/src/SimpleSAML/SessionTest.php b/tests/src/SimpleSAML/SessionTest.php index 6444be04cb..b2b8332b22 100644 --- a/tests/src/SimpleSAML/SessionTest.php +++ b/tests/src/SimpleSAML/SessionTest.php @@ -6,8 +6,9 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; +use SimpleSAML\Configuration; +use SimpleSAML\Session; use SimpleSAML\TestUtils\ClearStateTestCase; -use SimpleSAML\{Configuration, Session}; /** */ @@ -17,6 +18,7 @@ class SessionTest extends ClearStateTestCase /** @var \SimpleSAML\Session */ protected Session $session; + /** */ public function setUp(): void @@ -26,6 +28,7 @@ public function setUp(): void $this->session = Session::getSessionFromRequest(); } + /** */ public function testSetRememberMeExpireDefaults(): void @@ -39,6 +42,7 @@ public function testSetRememberMeExpireDefaults(): void $this->assertEquals(time() + 14 * 86400, $this->session->getRememberMeExpire()); } + /** */ public function testSetRememberMeExpireExplicit(): void @@ -49,6 +53,7 @@ public function testSetRememberMeExpireExplicit(): void $this->assertEquals(time() + 1000, $this->session->getRememberMeExpire()); } + public static function expirationValues(): array { return [ @@ -58,6 +63,7 @@ public static function expirationValues(): array ]; } + #[DataProvider('expirationValues')] public function testSetDataExpiration(int|string $expire): void { @@ -74,6 +80,7 @@ public function testSetDataExpiration(int|string $expire): void } } + public static function getAllowedExpired(): array { return [ @@ -104,6 +111,7 @@ public static function getAllowedExpired(): array ]; } + /** * Tests that getData returns expected data when session is expired. * @throws \Exception diff --git a/tests/src/SimpleSAML/Store/RedisStoreTest.php b/tests/src/SimpleSAML/Store/RedisStoreTest.php index e7c06a6865..f26f634467 100644 --- a/tests/src/SimpleSAML/Store/RedisStoreTest.php +++ b/tests/src/SimpleSAML/Store/RedisStoreTest.php @@ -44,29 +44,35 @@ public function __construct( ) { } + public function __deconstruct() { } + public function disconnect(): void { } + public function get(string $str): ?string { return $this->unitTest->getMocked($str); } + public function set(string $str, mixed $value): void { $this->unitTest->setMocked($str, $value); } + public function setEx(string $str, int $expire, mixed $value): void { $this->unitTest->setExMocked($str, $expire, $value); } + public function del(string $str): void { $this->unitTest->delMocked($str); @@ -130,6 +136,7 @@ public function testRedisInstance(): void $this->assertInstanceOf(Store\RedisStore::class, $this->store); } + /** */ public function testRedisInstanceWithInsecureTLS(): void @@ -144,6 +151,7 @@ public function testRedisInstanceWithInsecureTLS(): void $this->assertInstanceOf(Store\RedisStore::class, $this->store); } + /** */ public function testRedisInstanceWithSecureTLS(): void @@ -160,6 +168,7 @@ public function testRedisInstanceWithSecureTLS(): void $this->assertInstanceOf(Store\RedisStore::class, $this->store); } + /** */ public function testRedisInstanceWithPassword(): void @@ -173,6 +182,7 @@ public function testRedisInstanceWithPassword(): void $this->assertInstanceOf(Store\RedisStore::class, $this->store); } + /** */ public function testRedisInstanceWithPasswordAndUsername(): void @@ -187,6 +197,7 @@ public function testRedisInstanceWithPasswordAndUsername(): void $this->assertInstanceOf(Store\RedisStore::class, $this->store); } + /** */ public function testRedisSentinelInstance(): void @@ -200,6 +211,7 @@ public function testRedisSentinelInstance(): void $this->assertInstanceOf(Store\RedisStore::class, $this->store); } + /** */ public function testInsertData(): void diff --git a/tests/src/SimpleSAML/Utils/Config/MetadataTest.php b/tests/src/SimpleSAML/Utils/Config/MetadataTest.php index 48967ff7ed..18a6ed61e2 100644 --- a/tests/src/SimpleSAML/Utils/Config/MetadataTest.php +++ b/tests/src/SimpleSAML/Utils/Config/MetadataTest.php @@ -246,6 +246,7 @@ public function testParseNameIdPolicy(): void ], Metadata::parseNameIdPolicy($nameIdPolicy)); } + /** * Test \SimpleSAML\Utils\Config\Metadata::parseNameIdPolicy(). * Test with settings that produce the fallback defaults. @@ -276,6 +277,7 @@ public function testParseNameIdPolicyDefaults(): void ], Metadata::parseNameIdPolicy($nameIdPolicy)); } + /** * Test \SimpleSAML\Utils\Config\Metadata::parseNameIdPolicy(). * Test with setting to empty array (meaning to not send any NameIdPolicy). diff --git a/tests/src/SimpleSAML/Utils/ConfigTest.php b/tests/src/SimpleSAML/Utils/ConfigTest.php index 51330c6a22..fee85e3cc0 100644 --- a/tests/src/SimpleSAML/Utils/ConfigTest.php +++ b/tests/src/SimpleSAML/Utils/ConfigTest.php @@ -55,6 +55,7 @@ public function testEnvVariableConfigDir(): void $this->assertEquals($configDir, __DIR__); } + /** * Test valid dir specified by env redirect var overrides default config dir */ diff --git a/tests/src/SimpleSAML/Utils/CryptoTest.php b/tests/src/SimpleSAML/Utils/CryptoTest.php index 4070dec357..01a60541a7 100644 --- a/tests/src/SimpleSAML/Utils/CryptoTest.php +++ b/tests/src/SimpleSAML/Utils/CryptoTest.php @@ -5,7 +5,8 @@ namespace SimpleSAML\Test\Utils; use InvalidArgumentException; -use org\bovigo\vfs\{vfsStream, vfsStreamDirectory}; +use org\bovigo\vfs\vfsStream; +use org\bovigo\vfs\vfsStreamDirectory; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; use SimpleSAML\Configuration; @@ -22,6 +23,7 @@ class CryptoTest extends TestCase private const DEFAULTCERTDIR = 'certdir'; + /** @var \org\bovigo\vfs\vfsStreamDirectory */ protected VfsStreamDirectory $root; @@ -75,6 +77,7 @@ class CryptoTest extends TestCase -----END CERTIFICATE----- PHP; + /** */ public function setUp(): void @@ -249,6 +252,7 @@ public function testBadPwInvalid(): void $this->assertFalse($res); } + /** * Check that hash cannot be used to authenticate ith. * @deprecated diff --git a/tests/src/SimpleSAML/Utils/EMailTest.php b/tests/src/SimpleSAML/Utils/EMailTest.php index 0a07de6e82..2fd3e88a4e 100644 --- a/tests/src/SimpleSAML/Utils/EMailTest.php +++ b/tests/src/SimpleSAML/Utils/EMailTest.php @@ -133,6 +133,7 @@ public function testInvalidSMTPConfiguration(): void $email->setTransportMethod('smtp'); } + /** * Test setting configuration. * diff --git a/tests/src/SimpleSAML/Utils/HTTPTest.php b/tests/src/SimpleSAML/Utils/HTTPTest.php index 7521089369..d506f2fc16 100644 --- a/tests/src/SimpleSAML/Utils/HTTPTest.php +++ b/tests/src/SimpleSAML/Utils/HTTPTest.php @@ -10,8 +10,10 @@ use PHPUnit\Framework\Attributes\DoesNotPerformAssertions; use PHPUnit\Framework\Attributes\RequiresPhpExtension; use PHPUnit\Framework\Attributes\RunInSeparateProcess; -use SimpleSAML\{Configuration, Error, Utils}; +use SimpleSAML\Configuration; +use SimpleSAML\Error; use SimpleSAML\TestUtils\ClearStateTestCase; +use SimpleSAML\Utils; /** */ @@ -29,6 +31,7 @@ protected function setUp(): void } } + /** * Set up the environment ($_SERVER) populating the typical variables from a given URL. * @@ -87,6 +90,7 @@ public function testAddURLParameters(): void $this->assertEquals($url . '&bar=foo', $httpUtils->addURLParameters($url, $params)); } + private function makeNativePath($s) { if (DIRECTORY_SEPARATOR == '\\') { @@ -95,6 +99,7 @@ private function makeNativePath($s) return $s; } + /** * Test SimpleSAML\Utils\HTTP::guessBasePath(). */ @@ -593,6 +598,7 @@ public function testDetectSameSiteNoneBehavior(?string $userAgent, bool $support $this->assertEquals($supportsNone, $httpUtils->canSetSameSiteNone(), $userAgent ?? 'No user agent set'); } + public static function detectSameSiteProvider(): array { // phpcs:disable Generic.Files.LineLength @@ -632,6 +638,7 @@ public static function detectSameSiteProvider(): array // phpcs:enable Generic.Files.LineLength } + /** * submitPOSTData() should throw Error\Exception for an invalid destination URL. */ @@ -740,6 +747,7 @@ public function testSubmitPOSTDataSlowPostDelay(?int $configured, int $expected) $this->assertStringContainsString($needle, $html); } + public static function slowPostDelayProvider(): array { return [ diff --git a/tests/src/SimpleSAML/Utils/SystemTest.php b/tests/src/SimpleSAML/Utils/SystemTest.php index b1eb14728f..02dc0f0a82 100644 --- a/tests/src/SimpleSAML/Utils/SystemTest.php +++ b/tests/src/SimpleSAML/Utils/SystemTest.php @@ -4,7 +4,8 @@ namespace SimpleSAML\Test\Utils; -use org\bovigo\vfs\{vfsStream, vfsStreamDirectory}; +use org\bovigo\vfs\vfsStream; +use org\bovigo\vfs\vfsStreamDirectory; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; use ReflectionClass; @@ -22,6 +23,7 @@ class SystemTest extends TestCase private const DEFAULTTEMPDIR = 'tempdir'; + /** @var \org\bovigo\vfs\vfsStreamDirectory */ protected VfsStreamDirectory $root; diff --git a/tests/src/SimpleSAML/Utils/XMLTest.php b/tests/src/SimpleSAML/Utils/XMLTest.php index ac35908545..5cc4e3c14e 100644 --- a/tests/src/SimpleSAML/Utils/XMLTest.php +++ b/tests/src/SimpleSAML/Utils/XMLTest.php @@ -22,6 +22,7 @@ class XMLTest extends TestCase { private const FRAMEWORK = 'vendor/simplesamlphp/saml2/tests/resources/xml'; + /** */ public function testIsDomNodeOfTypeBasic(): void @@ -285,6 +286,7 @@ public function testIsValidMetadata(): void $this->assertTrue($res === true); } + /** */ public function testCheckSAMLMessageInvalidType(): void diff --git a/tests/src/SimpleSAML/XHTML/TemplateTest.php b/tests/src/SimpleSAML/XHTML/TemplateTest.php index 8cf0015914..4396e4afb0 100644 --- a/tests/src/SimpleSAML/XHTML/TemplateTest.php +++ b/tests/src/SimpleSAML/XHTML/TemplateTest.php @@ -17,6 +17,7 @@ class TemplateTest extends TestCase { private const TEMPLATE = 'sandbox.twig'; + public function testSetup(): void { $c = Configuration::loadFromArray(['assets' => [ 'salt' => '1234567890']], '', 'simplesaml'); @@ -24,6 +25,7 @@ public function testSetup(): void $this->assertEquals(self::TEMPLATE, $t->getTemplateName()); } + public function testNormalizeName(): void { $c = Configuration::loadFromArray(['assets' => [ 'salt' => '1234567890']], '', 'simplesaml'); @@ -31,6 +33,7 @@ public function testNormalizeName(): void $this->assertEquals(self::TEMPLATE, $t->getTemplateName()); } + public function testTemplateModuleNamespace(): void { $c = Configuration::loadFromArray(['assets' => [ 'salt' => '1234567890']], '', 'simplesaml'); @@ -38,6 +41,7 @@ public function testTemplateModuleNamespace(): void $this->assertEquals('core:welcome.twig', $t->getTemplateName()); } + public static function debugModeProvider(): array { return [ @@ -46,6 +50,7 @@ public static function debugModeProvider(): array ]; } + #[DataProvider('debugModeProvider')] public function testTemplateDebugMode(bool $debugMode): void { @@ -61,6 +66,7 @@ public function testTemplateDebugMode(bool $debugMode): void } } + public function testGetEntityDisplayNameBasic(): void { $c = Configuration::loadFromArray(['assets' => [ 'salt' => '1234567890']], '', 'simplesaml'); @@ -79,6 +85,7 @@ public function testGetEntityDisplayNameBasic(): void $this->assertEquals('Something', $name); } + public function testGetEntityDisplayNamePriorities(): void { $c = Configuration::loadFromArray(['assets' => [ 'salt' => '1234567890']], '', 'simplesaml'); @@ -116,6 +123,7 @@ public function testGetEntityDisplayNamePriorities(): void $this->assertEquals('UIname NL', $name); } + public function testGetEntityPropertyTranslation(): void { $c = Configuration::loadFromArray(['assets' => [ 'salt' => '1234567890']], '', 'simplesaml'); @@ -147,6 +155,7 @@ public function testGetEntityPropertyTranslation(): void $this->assertNull($name); } + public function testAssetModuleTagDoesNotMatchCoreTag(): void { $c = Configuration::loadFromArray(['assets' => [ 'salt' => '1234567890']], '', 'simplesaml'); @@ -165,6 +174,7 @@ public function testAssetModuleTagDoesNotMatchCoreTag(): void ); } + public function testAssetWillReturnPathOnTagIsFalse(): void { $c = Configuration::loadFromArray(['assets' => [ 'salt' => '1234567890']], '', 'simplesaml'); @@ -177,6 +187,7 @@ public function testAssetWillReturnPathOnTagIsFalse(): void ); } + public function testAssetDebugTagProduction(): void { echo "testAssetDebugTagProduction! \n"; diff --git a/tests/src/SimpleSAML/XHTML/TemplateTranslationTest.php b/tests/src/SimpleSAML/XHTML/TemplateTranslationTest.php index 45add235b2..6f7e22be62 100644 --- a/tests/src/SimpleSAML/XHTML/TemplateTranslationTest.php +++ b/tests/src/SimpleSAML/XHTML/TemplateTranslationTest.php @@ -44,6 +44,7 @@ public function testCoreCardinalityErrorTemplate(): void $this->assertStringContainsString('got 1 values, want 2', $html); } + public function testCoreLoginUserPassTemplate(): void { $c = Configuration::loadFromArray(['assets' => [ 'salt' => '1234567890']], '', 'simplesaml'); @@ -67,6 +68,7 @@ public function testCoreLoginUserPassTemplate(): void $this->assertStringContainsString('value="h.c oersted"', $html); } + public function testCoreLogoutIframeTemplate(): void { $c = Configuration::loadFromArray(['assets' => [ 'salt' => '1234567890']], '', 'simplesaml'); @@ -102,6 +104,7 @@ public function testCoreLogoutIframeTemplate(): void $this->assertStringContainsString('ze missing service', $html); } + public function testAuthStatusTemplate(): void { $c = Configuration::loadFromArray(['assets' => [ 'salt' => '1234567890']], '', 'simplesaml'); @@ -125,6 +128,7 @@ public function testAuthStatusTemplate(): void ); } + public function testValidateTwigFiles(): void { $root = dirname(__DIR__, 4); diff --git a/tests/src/SimpleSAML/XML/ParserTest.php b/tests/src/SimpleSAML/XML/ParserTest.php index a64dde88be..299d2ebf52 100644 --- a/tests/src/SimpleSAML/XML/ParserTest.php +++ b/tests/src/SimpleSAML/XML/ParserTest.php @@ -27,6 +27,7 @@ class ParserTest extends TestCase XML; + /** @var \SimpleSAML\XML\Parser */ private Parser $xml; diff --git a/tests/src/SimpleSAML/XML/SignerTest.php b/tests/src/SimpleSAML/XML/SignerTest.php index a70108ffae..5ac8a83f27 100644 --- a/tests/src/SimpleSAML/XML/SignerTest.php +++ b/tests/src/SimpleSAML/XML/SignerTest.php @@ -49,6 +49,7 @@ class SignerTest extends SigningTestCase -----END CERTIFICATE----- NOWDOC; + private const OTHER_CERTIFICATE = 'other_certificate.pem'; @@ -81,7 +82,7 @@ public function testSignBasic(): void { $node = DOMDocumentFactory::fromString('value'); - /** @psalm-var DOMElement $element */ + /** @psalm-var \DOMElement $element */ $element = $node->getElementsByTagName("node")->item(0); $doc = new DOMDocument(); @@ -120,7 +121,7 @@ public function testSignWithCertificate(): void { $node = DOMDocumentFactory::fromString('value'); - /** @psalm-var DOMElement $element */ + /** @psalm-var \DOMElement $element */ $element = $node->getElementsByTagName("node")->item(0); $doc = new DOMDocument(); @@ -148,7 +149,7 @@ public function testSignWithMultiCertificate(): void $node = DOMDocumentFactory::fromString('value'); - /** @psalm-var DOMElement $element */ + /** @psalm-var \DOMElement $element */ $element = $node->getElementsByTagName("node")->item(0); $doc = new DOMDocument(); @@ -177,7 +178,7 @@ public function testSignMissingPrivateKey(): void { $node = DOMDocumentFactory::fromString('value'); - /** @psalm-var DOMElement $element */ + /** @psalm-var \DOMElement $element */ $element = $node->getElementsByTagName("node")->item(0); $doc = new DOMDocument(); diff --git a/tests/src/SimpleSAML/XML/ValidatorTest.php b/tests/src/SimpleSAML/XML/ValidatorTest.php index 87220d75e4..c33290a57e 100644 --- a/tests/src/SimpleSAML/XML/ValidatorTest.php +++ b/tests/src/SimpleSAML/XML/ValidatorTest.php @@ -35,7 +35,7 @@ public function testGetX509Certificate(): void { $doc = DOMDocumentFactory::fromString('value'); - /** @psalm-var DOMElement $node */ + /** @psalm-var \DOMElement $node */ $node = $doc->getElementsByTagName('node')->item(0); $signature_parent = $doc->appendChild(new DOMElement('signature_parent')); @@ -62,7 +62,7 @@ public function testIsNodeValidatedSuccess(): void { $doc = DOMDocumentFactory::fromString('value'); - /** @psalm-var DOMElement $node */ + /** @psalm-var \DOMElement $node */ $node = $doc->getElementsByTagName('node')->item(0); $signature_parent = $doc->appendChild(new DOMElement('signature_parent')); @@ -89,10 +89,10 @@ public function testIsNodeValidatedFailure(): void { $doc = DOMDocumentFactory::fromString('value1value2'); - /** @psalm-var DOMElement $node1 */ + /** @psalm-var \DOMElement $node1 */ $node1 = $doc->getElementsByTagName('node1')->item(0); - /** @psalm-var DOMElement $node2 */ + /** @psalm-var \DOMElement $node2 */ $node2 = $doc->getElementsByTagName('node2')->item(0); $signature_parent = $doc->appendChild(new DOMElement('signature_parent')); diff --git a/tests/www/IndexTest.php b/tests/www/IndexTest.php index 5be54e8431..83a50b3f41 100644 --- a/tests/www/IndexTest.php +++ b/tests/www/IndexTest.php @@ -107,6 +107,7 @@ public function testRedirection(): void ); } + /** * Test the frontpage.redirect config option */ @@ -125,6 +126,7 @@ public function testRedirectionFrontpageRedirectOption(): void ); } + /** * The tear down method that is executed after all tests in this class. */ From 5dd23cdd66d2fe3a622a3e52d574ac67ac931ec2 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 7 Oct 2025 19:50:37 +0200 Subject: [PATCH 394/532] Fix deprecated use om Symfony console commands --- src/SimpleSAML/Command/RouterDebugCommand.php | 12 +++++------- .../Command/UnusedTranslatableStringsCommand.php | 10 +++++----- .../Command/UpdateTranslatableStringsCommand.php | 14 +++++--------- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/SimpleSAML/Command/RouterDebugCommand.php b/src/SimpleSAML/Command/RouterDebugCommand.php index 24d3fd1bc9..037b515fb5 100644 --- a/src/SimpleSAML/Command/RouterDebugCommand.php +++ b/src/SimpleSAML/Command/RouterDebugCommand.php @@ -5,6 +5,7 @@ namespace SimpleSAML\Command; use Closure; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; @@ -12,14 +13,12 @@ use Symfony\Component\Console\Style\SymfonyStyle; use Symfony\Component\Routing\RouterInterface; +#[AsCommand( + name: 'debug:router', + description: 'Displays the current routes for a module.', +)] class RouterDebugCommand extends Command { - /** - * @var string|null - */ - protected static ?string $defaultName = 'debug:router'; - - /** * @param \Symfony\Component\Routing\RouterInterface $router * @@ -37,7 +36,6 @@ public function __construct( protected function configure(): void { $this - ->setDescription('Displays current routes for a module') ->setHelp( <<<'EOF' The %command.name% displays the configured routes for a module: diff --git a/src/SimpleSAML/Command/UnusedTranslatableStringsCommand.php b/src/SimpleSAML/Command/UnusedTranslatableStringsCommand.php index 6504ac135e..3f0a4ae3f4 100644 --- a/src/SimpleSAML/Command/UnusedTranslatableStringsCommand.php +++ b/src/SimpleSAML/Command/UnusedTranslatableStringsCommand.php @@ -12,6 +12,7 @@ use SimpleSAML\Module; use SimpleSAML\TestUtils\ArrayLogger; use SimpleSAML\Utils; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -28,12 +29,12 @@ use function in_array; use function sprintf; +#[AsCommand( + name: 'translations:unused', + description: 'Generates a list of translations that are no longer in used in PHP or Twig files.', +)] class UnusedTranslatableStringsCommand extends Command { - /** @var string|null */ - protected static ?string $defaultName = 'translations:unused'; - - /** * @return void */ @@ -49,7 +50,6 @@ protected function configure(): void 'simplesaml', ); - $this->setDescription('Generates a list of translations that are no longer in used in PHP or Twig files'); $this->addOption( 'module', null, diff --git a/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php b/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php index 38a7204e38..8efa0a32e5 100644 --- a/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php +++ b/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php @@ -14,6 +14,7 @@ use SimpleSAML\Module; use SimpleSAML\TestUtils\ArrayLogger; use SimpleSAML\Utils; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -32,14 +33,12 @@ use function ksort; use function sprintf; +#[AsCommand( + name: 'translations:update:translatable', + description: 'Generates fresh .po translation files based on the translatable strings from PHP and Twig files.', +)] class UpdateTranslatableStringsCommand extends Command { - /** - * @var string|null - */ - protected static ?string $defaultName = 'translations:update:translatable'; - - /** * @return void */ @@ -55,9 +54,6 @@ protected function configure(): void 'simplesaml', ); - $this->setDescription( - 'Generates fresh .po translation files based on the translatable strings from PHP and Twig files', - ); $this->addOption( 'module', null, From 478d899b316b58676b8bd6ea9d9919c57375fbcc Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 7 Oct 2025 20:08:48 +0200 Subject: [PATCH 395/532] bugfix: skip modules without locales-dir when updating translations --- .../UpdateTranslatableStringsCommand.php | 68 ++++++++++--------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php b/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php index 8efa0a32e5..61d9ecfc77 100644 --- a/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php +++ b/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php @@ -198,38 +198,42 @@ protected function execute(InputInterface $input, OutputInterface $output): int $moduleLocalesDir = $moduleDir . '/locales/'; $domain = $domain ?: 'messages'; - $finder = new Finder(); - foreach ($finder->files()->in($moduleLocalesDir . '**/LC_MESSAGES/')->name("{$domain}.po") as $poFile) { - $current = $loader->loadFile($poFile->getPathName()); - - $merged = $template->mergeWith( - $current, - Merge::TRANSLATIONS_OVERRIDE - | Merge::COMMENTS_OURS - | Merge::HEADERS_OURS - | Merge::REFERENCES_THEIRS - | Merge::EXTRACTED_COMMENTS_OURS, - ); - $merged->setDomain($domain); - - // - // Sort the translations in a predictable way - // - $iter = $merged->getIterator(); - $iter->ksort(); - $merged = $this->cloneIteratorToTranslations( - Translations::create($merged->getDomain(), $merged->getLanguage()), - $iter, - ); - - $language = basename(dirname($poFile->getPath())); - $merged->getHeaders() - ->set('Project-Id-Version', 'SimpleSAMLphp') - ->set('MIME-Version', '1.0') - ->set('Content-Type', 'text/plain; charset=UTF-8') - ->set('Content-Transfer-Encoding', '8bit') - ->setLanguage($language); - $poGenerator->generateFile($merged, $poFile->getPathName()); + if (file_exists($moduleLocalesDir)) { + // The module contains translations - if not we skip it. + + $finder = new Finder(); + foreach ($finder->files()->in($moduleLocalesDir . '**/LC_MESSAGES/')->name("{$domain}.po") as $poFile) { + $current = $loader->loadFile($poFile->getPathName()); + + $merged = $template->mergeWith( + $current, + Merge::TRANSLATIONS_OVERRIDE + | Merge::COMMENTS_OURS + | Merge::HEADERS_OURS + | Merge::REFERENCES_THEIRS + | Merge::EXTRACTED_COMMENTS_OURS, + ); + $merged->setDomain($domain); + + // + // Sort the translations in a predictable way + // + $iter = $merged->getIterator(); + $iter->ksort(); + $merged = $this->cloneIteratorToTranslations( + Translations::create($merged->getDomain(), $merged->getLanguage()), + $iter, + ); + + $language = basename(dirname($poFile->getPath())); + $merged->getHeaders() + ->set('Project-Id-Version', 'SimpleSAMLphp') + ->set('MIME-Version', '1.0') + ->set('Content-Type', 'text/plain; charset=UTF-8') + ->set('Content-Transfer-Encoding', '8bit') + ->setLanguage($language); + $poGenerator->generateFile($merged, $poFile->getPathName()); + } } } } From 4028a59d0f45a4120b9f479d90076a036aa6bf8d Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 7 Oct 2025 21:15:37 +0200 Subject: [PATCH 396/532] Replace grouped use-statements and fix incorrect number of newlines --- src/SimpleSAML/Auth/ProcessingChain.php | 4 +- src/SimpleSAML/Auth/Source.php | 4 +- src/SimpleSAML/Auth/State.php | 1 + .../UpdateTranslatableStringsCommand.php | 3 +- src/SimpleSAML/Configuration.php | 3 +- src/SimpleSAML/Error/Error.php | 11 ++- src/SimpleSAML/Error/ErrorCodes.php | 53 ++++++++++++-- src/SimpleSAML/Error/ExceptionHandler.php | 3 +- src/SimpleSAML/IdP.php | 6 +- src/SimpleSAML/Kernel.php | 10 ++- src/SimpleSAML/Locale/Language.php | 26 ++++--- src/SimpleSAML/Locale/Localization.php | 8 +- src/SimpleSAML/Locale/Translate.php | 2 +- src/SimpleSAML/Logger.php | 73 ++++++++++--------- src/SimpleSAML/Logger/FileLoggingHandler.php | 4 +- .../Metadata/MetaDataStorageHandler.php | 4 +- .../MetaDataStorageHandlerDirectory.php | 1 - .../MetaDataStorageHandlerFlatFile.php | 1 - src/SimpleSAML/Metadata/SAMLBuilder.php | 7 +- src/SimpleSAML/Metadata/SAMLParser.php | 22 +++--- src/SimpleSAML/Metadata/Sources/MDQ.php | 2 + src/SimpleSAML/Module.php | 22 ++++-- src/SimpleSAML/Session.php | 8 +- src/SimpleSAML/SessionHandlerCookie.php | 1 - src/SimpleSAML/SessionHandlerPHP.php | 1 + src/SimpleSAML/Stats.php | 1 - src/SimpleSAML/Store/RedisStore.php | 4 +- src/SimpleSAML/Store/SQLStore.php | 7 +- src/SimpleSAML/Utils/Config.php | 1 + src/SimpleSAML/Utils/Config/Metadata.php | 2 - src/SimpleSAML/Utils/Crypto.php | 23 +++--- src/SimpleSAML/Utils/EMail.php | 4 +- src/SimpleSAML/Utils/HTTP.php | 13 ++-- src/SimpleSAML/Utils/Net.php | 7 +- src/SimpleSAML/Utils/System.php | 14 +++- src/SimpleSAML/Utils/XML.php | 11 ++- src/SimpleSAML/XHTML/IdPDisco.php | 9 ++- src/SimpleSAML/XHTML/Template.php | 2 +- src/SimpleSAML/XML/Parser.php | 1 + test.php | 8 ++ tests/modules/saml/src/IdP/SAML2Test.php | 2 + 41 files changed, 251 insertions(+), 138 deletions(-) create mode 100644 test.php diff --git a/src/SimpleSAML/Auth/ProcessingChain.php b/src/SimpleSAML/Auth/ProcessingChain.php index 02cab9e8b7..3be20641f0 100644 --- a/src/SimpleSAML/Auth/ProcessingChain.php +++ b/src/SimpleSAML/Auth/ProcessingChain.php @@ -40,13 +40,11 @@ class ProcessingChain */ public const FILTERS_INDEX = '\SimpleSAML\Auth\ProcessingChain.filters'; - /** * The stage we use for completed requests. */ public const COMPLETED_STAGE = '\SimpleSAML\Auth\ProcessingChain.completed'; - /** * The request parameter we will use to pass the state identifier when we redirect after * having completed processing of the state. @@ -329,7 +327,7 @@ public static function fetchProcessedState(string $id): ?array /** * @param array $state * @psalm-param array{"\\\SimpleSAML\\\Auth\\\ProcessingChain.filters": array} $state - * @param ProcessingFilter[] $authProcs + * @param \SimpleSAML\Auth\ProcessingFilter[] $authProcs */ public static function insertFilters(array &$state, array $authProcs): void { diff --git a/src/SimpleSAML/Auth/Source.php b/src/SimpleSAML/Auth/Source.php index 81af7a2842..d41b4c5456 100644 --- a/src/SimpleSAML/Auth/Source.php +++ b/src/SimpleSAML/Auth/Source.php @@ -53,7 +53,7 @@ public function __construct(array $info, array &$config) * * @param string $type The type of the authentication source. * - * @return Source[] Array of \SimpleSAML\Auth\Source objects of the specified type. + * @return \SimpleSAML\Auth\Source[] Array of \SimpleSAML\Auth\Source objects of the specified type. * @throws \Exception If the authentication source is invalid. */ public static function getSourcesOfType(string $type): array @@ -305,7 +305,7 @@ private static function parseAuthSource(string $authId, array $config): Source '\SimpleSAML\Auth\SourceFactory', ); - /** @var SourceFactory $factory */ + /** @var \SimpleSAML\Auth\SourceFactory $factory */ $factory = new $factoryClass(); $authSource = $factory->create($info, $config); } catch (\Exception $e) { diff --git a/src/SimpleSAML/Auth/State.php b/src/SimpleSAML/Auth/State.php index af72cd4235..fd39ead301 100644 --- a/src/SimpleSAML/Auth/State.php +++ b/src/SimpleSAML/Auth/State.php @@ -93,6 +93,7 @@ class State */ public const EXCEPTION_PARAM = '\SimpleSAML\Auth\State_exceptionId'; + /** * State timeout. */ diff --git a/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php b/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php index 61d9ecfc77..215799865b 100644 --- a/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php +++ b/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php @@ -202,7 +202,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int // The module contains translations - if not we skip it. $finder = new Finder(); - foreach ($finder->files()->in($moduleLocalesDir . '**/LC_MESSAGES/')->name("{$domain}.po") as $poFile) { + $poFiles = $finder->files()->in($moduleLocalesDir . '**/LC_MESSAGES/')->name("{$domain}.po"); + foreach ($poFiles as $poFile) { $current = $loader->loadFile($poFile->getPathName()); $merged = $template->mergeWith( diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index f25f3412a3..7d6f79ab23 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -70,6 +70,7 @@ class Configuration implements Utils\ClearableState 'Referrer-Policy' => 'origin-when-cross-origin', ]; + /** * Associative array with mappings from instance-names to configuration objects. * @@ -1104,7 +1105,6 @@ public function getConfigItem(string $name): Configuration } - /** * Retrieve an optional array as a \SimpleSAML\Configuration object. * @@ -1190,6 +1190,7 @@ private function getDefaultBinding(string $endpointType): string } } + /** * Helper function for dealing with metadata endpoints. * diff --git a/src/SimpleSAML/Error/Error.php b/src/SimpleSAML/Error/Error.php index dfa7315754..d2e4073649 100644 --- a/src/SimpleSAML/Error/Error.php +++ b/src/SimpleSAML/Error/Error.php @@ -5,7 +5,11 @@ namespace SimpleSAML\Error; use SimpleSAML\Assert\Assert; -use SimpleSAML\{Configuration, Logger, Module, Session, Utils}; +use SimpleSAML\Configuration; +use SimpleSAML\Logger; +use SimpleSAML\Module; +use SimpleSAML\Session; +use SimpleSAML\Utils; use SimpleSAML\XHTML\Template; use Throwable; @@ -74,7 +78,7 @@ class Error extends Exception * (with index 0), is the error code, while the other elements are replacements for the error text. * * @param string|array $errorCode One of the error codes defined in the errors dictionary. - * @param Throwable|null $cause The exception which caused this fatal error (if any). Optional. + * @param \Throwable|null $cause The exception which caused this fatal error (if any). Optional. * @param int|null $httpCode The HTTP response code to use. Optional. */ public function __construct( @@ -109,6 +113,7 @@ public function __construct( parent::__construct($msg, -1, $cause); } + /** * Retrieve the ErrorCodes instance to use for resolving dictionary title and description tags. * @@ -117,7 +122,7 @@ public function __construct( * This has to be public to allow Login to get an object * containing custom error codes if they in use. * - * @return ErrorCodes + * @return \SimpleSAML\Erorr\ErrorCodes */ public function getErrorCodes(): ErrorCodes { diff --git a/src/SimpleSAML/Error/ErrorCodes.php b/src/SimpleSAML/Error/ErrorCodes.php index 86010252e6..8bad607bb8 100644 --- a/src/SimpleSAML/Error/ErrorCodes.php +++ b/src/SimpleSAML/Error/ErrorCodes.php @@ -16,54 +16,93 @@ */ class ErrorCodes { - public function __construct() - { - // Automatically register instances of subclasses with Login to allow - // custom ErrorCodes to work in a redirect environment - Login::registerErrorCodeClass($this); - } - final public const ACSPARAMS = 'ACSPARAMS'; + final public const ADMINNOTHASHED = 'ADMINNOTHASHED'; + final public const ARSPARAMS = 'ARSPARAMS'; + final public const AUTHSOURCEERROR = 'AUTHSOURCEERROR'; + final public const BADREQUEST = 'BADREQUEST'; + final public const CASERROR = 'CASERROR'; + final public const CONFIG = 'CONFIG'; + final public const CREATEREQUEST = 'CREATEREQUEST'; + final public const DISCOPARAMS = 'DISCOPARAMS'; + final public const GENERATEAUTHNRESPONSE = 'GENERATEAUTHNRESPONSE'; + final public const INVALIDCERT = 'INVALIDCERT'; + final public const LDAPERROR = 'LDAPERROR'; + final public const LOGOUTINFOLOST = 'LOGOUTINFOLOST'; + final public const LOGOUTREQUEST = 'LOGOUTREQUEST'; + final public const MEMCACHEDOWN = 'MEMCACHEDOWN'; + final public const METADATA = 'METADATA'; + final public const METADATANOTFOUND = 'METADATANOTFOUND'; + final public const METHODNOTALLOWED = 'METHODNOTALLOWED'; + final public const NOACCESS = 'NOACCESS'; + final public const NOCERT = 'NOCERT'; + final public const NORELAYSTATE = 'NORELAYSTATE'; + final public const NOSTATE = 'NOSTATE'; + final public const NOTFOUND = 'NOTFOUND'; + final public const NOTFOUNDREASON = 'NOTFOUNDREASON'; + final public const NOTSET = 'NOTSET'; + final public const NOTVALIDCERT = 'NOTVALIDCERT'; + final public const NOTVALIDCERTSIGNATURE = 'NOTVALIDCERTSIGNATURE'; + final public const PROCESSASSERTION = 'PROCESSASSERTION'; + final public const PROCESSAUTHNREQUEST = 'PROCESSAUTHNREQUEST'; + final public const RESPONSESTATUSNOSUCCESS = 'RESPONSESTATUSNOSUCCESS'; + final public const SLOSERVICEPARAMS = 'SLOSERVICEPARAMS'; + final public const SSOPARAMS = 'SSOPARAMS'; + final public const UNHANDLEDEXCEPTION = 'UNHANDLEDEXCEPTION'; + final public const UNKNOWNCERT = 'UNKNOWNCERT'; + final public const USERABORTED = 'USERABORTED'; + final public const WRONGUSERPASS = 'WRONGUSERPASS'; final public const KEY_TITLE = 'title'; + final public const KEY_DESCRIPTION = 'descr'; + /** + */ + public function __construct() + { + // Automatically register instances of subclasses with Login to allow + // custom ErrorCodes to work in a redirect environment + Login::registerErrorCodeClass($this); + } + + /** * Fetch all default translation strings for error code titles. * diff --git a/src/SimpleSAML/Error/ExceptionHandler.php b/src/SimpleSAML/Error/ExceptionHandler.php index e73302ea27..efb4b5e26d 100644 --- a/src/SimpleSAML/Error/ExceptionHandler.php +++ b/src/SimpleSAML/Error/ExceptionHandler.php @@ -6,7 +6,8 @@ use Error as BuiltinError; use Exception as BuiltinException; -use SimpleSAML\{Logger, Module}; +use SimpleSAML\Logger; +use SimpleSAML\Module; use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; use Throwable; diff --git a/src/SimpleSAML/IdP.php b/src/SimpleSAML/IdP.php index a587f997db..dd510345fd 100644 --- a/src/SimpleSAML/IdP.php +++ b/src/SimpleSAML/IdP.php @@ -161,7 +161,7 @@ public static function getByState(array &$state): IdP /** * Retrieve the configuration for this IdP. * - * @return Configuration The configuration object. + * @return \SimpleSAML\Configuration The configuration object. */ public function getConfig(): Configuration { @@ -542,8 +542,8 @@ public function doLogoutRedirect(string $url): void * * This function never returns. * - * @param IdP $idp Deprecated. Will be removed. - * @param array &$state The logout state from doLogoutRedirect(). + * @param \SimpleSAML\IdP $idp Deprecated. Will be removed. + * @param array &$state The logout state from doLogoutRedirect(). */ public static function finishLogoutRedirect(IdP $idp, array $state): void { diff --git a/src/SimpleSAML/Kernel.php b/src/SimpleSAML/Kernel.php index bb001642b3..3b143483d3 100644 --- a/src/SimpleSAML/Kernel.php +++ b/src/SimpleSAML/Kernel.php @@ -28,8 +28,10 @@ class Kernel extends BaseKernel { use MicroKernelTrait; + public const CONFIG_EXTS = '.{php,xml,yaml,yml}'; + /** @var string */ private string $module; @@ -113,8 +115,8 @@ public function getModule(): string /** * Configures the container. * - * @param ContainerBuilder $container - * @param LoaderInterface $loader + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + * @param \Symfony\Component\Config\Loader\LoaderInterface $loader */ protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void { @@ -137,7 +139,7 @@ protected function configureContainer(ContainerBuilder $container, LoaderInterfa /** * Import routes. * - * @param RoutingConfigurator $routes + * @param \Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator $routes */ protected function configureRoutes(RoutingConfigurator $routes): void { @@ -152,7 +154,7 @@ protected function configureRoutes(RoutingConfigurator $routes): void /** - * @param ContainerBuilder $container + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container */ private function registerModuleControllers(ContainerBuilder $container): void { diff --git a/src/SimpleSAML/Locale/Language.php b/src/SimpleSAML/Locale/Language.php index b9089fa048..6a80cb44a4 100644 --- a/src/SimpleSAML/Locale/Language.php +++ b/src/SimpleSAML/Locale/Language.php @@ -10,11 +10,23 @@ namespace SimpleSAML\Locale; -use SimpleSAML\{Configuration, Logger, Utils}; +use SimpleSAML\Configuration; +use SimpleSAML\Logger; +use SimpleSAML\Utils; use Symfony\Component\Intl\Locales; +use function sprintf; + class Language { + /** + * The final fallback language to use when no current or default available + * + * @var string + */ + public const FALLBACKLANGUAGE = 'en'; + + /** * This is the default language map. It is used to map languages codes from the user agent to other language codes. * @var array @@ -42,13 +54,6 @@ class Language */ private string $defaultLanguage; - /** - * The final fallback language to use when no current or default available - * - * @var string - */ - public const FALLBACKLANGUAGE = 'en'; - /** * An array holding a list of languages that are written from right to left. * @@ -194,7 +199,10 @@ private function getInstalledLanguages(): array $availableLanguages[] = $code; } else { /* The configured language code can't be found in Symfony's list of known locales */ - Logger::error("Locale \"$code\" is not known to the translation system. Check language settings in your config."); + Logger::error(sprintf( + "Locale \"%s\" is not known to the translation system. Check language settings in your config.", + $code, + )); } } diff --git a/src/SimpleSAML/Locale/Localization.php b/src/SimpleSAML/Locale/Localization.php index 27a56ed20a..71cbee3bd2 100644 --- a/src/SimpleSAML/Locale/Localization.php +++ b/src/SimpleSAML/Locale/Localization.php @@ -13,9 +13,11 @@ use Exception; use Gettext\Generator\ArrayGenerator; use Gettext\Loader\PoLoader; -use Gettext\{Translations, Translator, TranslatorFunctions}; -use SimpleSAML\{Configuration, Logger}; +use Gettext\Translator; +use Gettext\TranslatorFunctions; +use SimpleSAML\Configuration; use SimpleSAML\Locale\Translate; +use SimpleSAML\Logger; use Symfony\Component\HttpFoundation\File\File; use function explode; @@ -28,8 +30,10 @@ class Localization * @var string */ public const DEFAULT_DOMAIN = 'messages'; + public const CORE_DOMAIN = 'core'; + /** * The default locale directory * diff --git a/src/SimpleSAML/Locale/Translate.php b/src/SimpleSAML/Locale/Translate.php index fee181d2ab..ea6b85e6e1 100644 --- a/src/SimpleSAML/Locale/Translate.php +++ b/src/SimpleSAML/Locale/Translate.php @@ -11,7 +11,7 @@ namespace SimpleSAML\Locale; use Gettext\TranslatorFunctions; -use SimpleSAML\{Configuration, Logger}; +use SimpleSAML\Configuration; class Translate { diff --git a/src/SimpleSAML/Logger.php b/src/SimpleSAML/Logger.php index 7458374bd3..5595a6302c 100644 --- a/src/SimpleSAML/Logger.php +++ b/src/SimpleSAML/Logger.php @@ -18,6 +18,39 @@ */ class Logger { + /** + * This constant defines the string we set the track ID to while we are fetching the track ID from the session + * class. This is used to prevent infinite recursion. + * + * @var string + */ + public const NO_TRACKID = '_NOTRACKIDYET_'; + + /** @var int */ + public const EMERG = 0; + + /** @var int */ + public const ALERT = 1; + + /** @var int */ + public const CRIT = 2; + + /** @var int */ + public const ERR = 3; + + /** @var int */ + public const WARNING = 4; + + /** @var int */ + public const NOTICE = 5; + + /** @var int */ + public const INFO = 6; + + /** @var int */ + public const DEBUG = 7; + + /** * @var \SimpleSAML\Logger\LoggingHandlerInterface|null */ @@ -68,14 +101,6 @@ class Logger */ private static int $logMask = 0; - /** - * This constant defines the string we set the track ID to while we are fetching the track ID from the session - * class. This is used to prevent infinite recursion. - * - * @var string - */ - public const NO_TRACKID = '_NOTRACKIDYET_'; - /** * This variable holds the track ID we have retrieved from the session class. It can also be NULL, in which case * we haven't fetched the track ID yet, or self::NO_TRACKID, which means that we are fetching the track ID now. @@ -128,30 +153,6 @@ class Logger */ private static bool $shuttingDown = false; - /** @var int */ - public const EMERG = 0; - - /** @var int */ - public const ALERT = 1; - - /** @var int */ - public const CRIT = 2; - - /** @var int */ - public const ERR = 3; - - /** @var int */ - public const WARNING = 4; - - /** @var int */ - public const NOTICE = 5; - - /** @var int */ - public const INFO = 6; - - /** @var int */ - public const DEBUG = 7; - /** * Log an emergency message. @@ -207,6 +208,7 @@ public static function warning(string $string): void self::log(self::WARNING, $string); } + /** * Log a warning about deprecated code. * @@ -217,6 +219,7 @@ public static function deprecated(string $string): void self::log(self::WARNING, 'DEPRECATION WARNING: ' . $string); } + /** * We reserve the notice level for statistics, so do not use this level for other kind of log messages. * @@ -388,7 +391,7 @@ public static function popErrorMask(): void /** * Returns the current logging handler * - * @return LoggingHandlerInterface + * @return \SimpleSAML\Logger\LoggingHandlerInterface */ public static function getLoggingHandler(): ?LoggingHandlerInterface { @@ -399,7 +402,7 @@ public static function getLoggingHandler(): ?LoggingHandlerInterface /** * Sets the current logging handler * - * @param LoggingHandlerInterface|null $loggingHandler The logging handler to set + * @param \SimpleSAML\Logger\LoggingHandlerInterface|null $loggingHandler The logging handler to set */ public static function setLoggingHandler(?LoggingHandlerInterface $loggingHandler): void { @@ -407,6 +410,7 @@ public static function setLoggingHandler(?LoggingHandlerInterface $loggingHandle self::$loggingHandler = $loggingHandler; } + /** * Sets the log level. * @@ -417,6 +421,7 @@ public static function setLogLevel(int $level): void self::$logLevel = $level; } + /** * Defer a message for later logging. * diff --git a/src/SimpleSAML/Logger/FileLoggingHandler.php b/src/SimpleSAML/Logger/FileLoggingHandler.php index 75703c38c6..27771120a0 100644 --- a/src/SimpleSAML/Logger/FileLoggingHandler.php +++ b/src/SimpleSAML/Logger/FileLoggingHandler.php @@ -5,7 +5,9 @@ namespace SimpleSAML\Logger; use DateTimeImmutable; -use SimpleSAML\{Configuration, Logger, Utils}; +use SimpleSAML\Configuration; +use SimpleSAML\Logger; +use SimpleSAML\Utils; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\HttpFoundation\File\Exception\CannotWriteFileException; use Symfony\Component\HttpFoundation\File\File; diff --git a/src/SimpleSAML/Metadata/MetaDataStorageHandler.php b/src/SimpleSAML/Metadata/MetaDataStorageHandler.php index c930397957..46e84cabe9 100644 --- a/src/SimpleSAML/Metadata/MetaDataStorageHandler.php +++ b/src/SimpleSAML/Metadata/MetaDataStorageHandler.php @@ -29,7 +29,6 @@ class MetaDataStorageHandler implements ClearableState */ private static ?MetadataStorageHandler $metadataHandler = null; - /** * This is a list of all the metadata sources we have in our metadata * chain. When we need metadata, we will look through this chain from start to end. @@ -44,7 +43,7 @@ class MetaDataStorageHandler implements ClearableState * The metadata handler will be instantiated if this is the first call * to this function. * - * @return MetaDataStorageHandler The current metadata handler instance. + * @return \SimpleSAML\Metadata\MetaDataStorageHandler The current metadata handler instance. */ public static function getMetadataHandler(): MetaDataStorageHandler { @@ -302,6 +301,7 @@ public function getMetaDataForEntities(array $entityIds, string $set): array return $result; } + /** * This function looks up the metadata for the given entity id in the given set. It will throw an * exception if it is unable to locate the metadata. diff --git a/src/SimpleSAML/Metadata/MetaDataStorageHandlerDirectory.php b/src/SimpleSAML/Metadata/MetaDataStorageHandlerDirectory.php index 9246446ba8..db93e28d3a 100644 --- a/src/SimpleSAML/Metadata/MetaDataStorageHandlerDirectory.php +++ b/src/SimpleSAML/Metadata/MetaDataStorageHandlerDirectory.php @@ -31,7 +31,6 @@ class MetaDataStorageHandlerDirectory extends MetaDataStorageSource */ private string $directory = '/'; - /** * This is an associative array which stores the different metadata sets we have loaded. * diff --git a/src/SimpleSAML/Metadata/MetaDataStorageHandlerFlatFile.php b/src/SimpleSAML/Metadata/MetaDataStorageHandlerFlatFile.php index 0743373552..f314f26378 100644 --- a/src/SimpleSAML/Metadata/MetaDataStorageHandlerFlatFile.php +++ b/src/SimpleSAML/Metadata/MetaDataStorageHandlerFlatFile.php @@ -29,7 +29,6 @@ class MetaDataStorageHandlerFlatFile extends MetaDataStorageSource */ private string $directory = '/'; - /** * Optional explicit file path to load metadata from * diff --git a/src/SimpleSAML/Metadata/SAMLBuilder.php b/src/SimpleSAML/Metadata/SAMLBuilder.php index 1132ed6225..f5db175835 100644 --- a/src/SimpleSAML/Metadata/SAMLBuilder.php +++ b/src/SimpleSAML/Metadata/SAMLBuilder.php @@ -27,8 +27,11 @@ use SAML2\XML\saml\Attribute; use SAML2\XML\saml\AttributeValue; use SAML2\XML\shibmd\Scope; -use SimpleSAML\{Configuration, Module, Logger, Utils}; -use SimpleSAML\Assert\{Assert, AssertionFailedException}; +use SimpleSAML\Assert\Assert; +use SimpleSAML\Configuration; +use SimpleSAML\Logger; +use SimpleSAML\Module; +use SimpleSAML\Utils; /** * Class for generating SAML 2.0 metadata from SimpleSAMLphp metadata arrays. diff --git a/src/SimpleSAML/Metadata/SAMLParser.php b/src/SimpleSAML/Metadata/SAMLParser.php index 5688dbb190..1cd96caa13 100644 --- a/src/SimpleSAML/Metadata/SAMLParser.php +++ b/src/SimpleSAML/Metadata/SAMLParser.php @@ -250,7 +250,7 @@ public static function parseFile(string $file): SAMLParser * * @param string $metadata A string which contains XML encoded metadata. * - * @return SAMLParser An instance of this class with the metadata loaded. + * @return \SimpleSAML\Metadata\SAMLParser An instance of this class with the metadata loaded. * @throws \Exception If the string does not parse as XML. */ public static function parseString(string $metadata): SAMLParser @@ -270,7 +270,7 @@ public static function parseString(string $metadata): SAMLParser * * @param \DOMDocument $document The \DOMDocument which contains the EntityDescriptor element. * - * @return SAMLParser An instance of this class with the metadata loaded. + * @return \SimpleSAML\Metadata\SAMLParser An instance of this class with the metadata loaded. */ public static function parseDocument(DOMDocument $document): SAMLParser { @@ -286,7 +286,7 @@ public static function parseDocument(DOMDocument $document): SAMLParser * @param \SAML2\XML\md\EntityDescriptor $entityElement A \SAML2\XML\md\EntityDescriptor object which represents a * EntityDescriptor element. * - * @return SAMLParser An instance of this class with the metadata loaded. + * @return \SimpleSAML\Metadata\SAMLParser An instance of this class with the metadata loaded. */ public static function parseElement(EntityDescriptor $entityElement): SAMLParser { @@ -303,7 +303,7 @@ public static function parseElement(EntityDescriptor $entityElement): SAMLParser * @param string $file The path to the file which contains the EntityDescriptor or EntitiesDescriptor element. * @param array $context The connection context to pass to file_get_contents() * - * @return SAMLParser[] An array of SAMLParser instances. + * @return \SimpleSAML\Metadata\SAMLParser[] An array of SAMLParser instances. * @throws \Exception If the file does not parse as XML. */ public static function parseDescriptorsFile(string $file, array $context = []): array @@ -333,8 +333,8 @@ public static function parseDescriptorsFile(string $file, array $context = []): * * @param string $string The string with XML data. * - * @return SAMLParser[] An associative array of SAMLParser instances. The key of the array will - * be the entity id. + * @return \SimpleSAML\Metadata]SAMLParser[] An associative array of SAMLParser instances. + * The key of the array will be the entity id. * @throws \Exception If the string does not parse as XML. */ public static function parseDescriptorsString(string $string): array @@ -356,8 +356,8 @@ public static function parseDescriptorsString(string $string): array * @param \DOMElement|null $element The DOMElement which contains the EntityDescriptor element or the * EntitiesDescriptor element. * - * @return SAMLParser[] An associative array of SAMLParser instances. The key of the array will - * be the entity id. + * @return \SimpleSAML\Metadata\SAMLParser[] An associative array of SAMLParser instances. + * The key of the array will be the entity id. * @throws \Exception if the document is empty or the root is an unexpected node. */ public static function parseDescriptorsElement(?DOMElement $element = null): array @@ -395,7 +395,7 @@ private static function processDescriptorsElement( if ($element instanceof EntityDescriptor) { $ret = new SAMLParser($element, $maxExpireTime, $validators, $parentExtensions); $ret = [$ret->getEntityId() => $ret]; - /** @var SAMLParser[] $ret */ + /** @var \SimpleSAML\Metadata\SAMLParser[] $ret */ return $ret; } @@ -424,8 +424,8 @@ private static function processDescriptorsElement( * @param mixed $element The element we should determine the expiry time of. * @param int|null $maxExpireTime The maximum expiration time. * - * @return int|null The unix timestamp for when the element should expire. Will be NULL if no - * limit is set for the element. + * @return int|null The unix timestamp for when the element should expire. + * Will be NULL if no limit is set for the element. */ private static function getExpireTime(mixed $element, ?int $maxExpireTime): ?int { diff --git a/src/SimpleSAML/Metadata/Sources/MDQ.php b/src/SimpleSAML/Metadata/Sources/MDQ.php index 23ab985859..88effee3a7 100644 --- a/src/SimpleSAML/Metadata/Sources/MDQ.php +++ b/src/SimpleSAML/Metadata/Sources/MDQ.php @@ -61,6 +61,7 @@ class MDQ extends MetaDataStorageSource */ private int $cacheLength; + /** * This function initializes the dynamic XML metadata source. * @@ -350,6 +351,7 @@ public function getMetaData(string $entityId, string $set): ?array return $data; } + /** * This function loads the metadata for entity IDs in $entityIds. It is returned as an associative array * where the key is the entity id. An empty array may be returned if no matching entities were found diff --git a/src/SimpleSAML/Module.php b/src/SimpleSAML/Module.php index 55d7809654..ab1688f1d4 100644 --- a/src/SimpleSAML/Module.php +++ b/src/SimpleSAML/Module.php @@ -156,11 +156,16 @@ public static function isModuleEnabled(string $module): bool * configuration and the actual request, it will run a PHP script and exit, or return a Response produced either * by another controller or by a static file. * - * @param \Symfony\Component\HttpFoundation\Request|null $request The request to process. Defaults to the current one. - * - * @return Response|BinaryFileResponse Returns a Response object that can be sent to the browser. - * @throws Error\BadRequest In case the request URI is malformed. - * @throws Error\NotFound In case the request URI is invalid or the resource it points to cannot be found. + * @param \Symfony\Component\HttpFoundation\Request|null $request + * The request to process. Defaults to the current one. + * @return ( + * \Symfony\Component\HttpFoundation\Response| + * \Symfony\Component\HttpFoundation\BinaryFileResponse + * ) Returns a Response object that can be sent to the browser. + * + * @throws \SimpleSAML\Error\BadRequest In case the request URI is malformed. + * @throws \SimpleSAML\Error\NotFound + * In case the request URI is invalid or the resource it points to cannot be found. */ public static function process(?Request $request = null): Response { @@ -499,6 +504,7 @@ public static function createObject(string $className, ?string $subclass = null) return $obj; } + /** * Get absolute URL to a specified module resource. * @@ -604,9 +610,9 @@ public static function callHooks(string $hook, mixed &$data = null): void * * This method add the trailing slash and redirects to the resulting URL. * - * @param Request $request The request to process by this controller method. - * - * @return RedirectResponse A redirection to the URI specified in the request, but with a trailing slash. + * @param \Symfony\Component\HttpFoundation\Request $request The request to process by this controller method. + * @return \Symfony\Component\HttpFoundation\RedirectResponse + * A redirection to the URI specified in the request, but with a trailing slash. */ public static function addTrailingSlash(Request $request): RedirectResponse { diff --git a/src/SimpleSAML/Session.php b/src/SimpleSAML/Session.php index 59b8b489df..0f7d7fd003 100644 --- a/src/SimpleSAML/Session.php +++ b/src/SimpleSAML/Session.php @@ -35,6 +35,7 @@ class Session implements Utils\ClearableState */ public const DATA_TIMEOUT_SESSION_END = 'sessionEndTimeout'; + /** * The list of loaded session objects. * @@ -194,7 +195,7 @@ private function __construct(bool $transient = false) /** * Set the configuration we should use. * - * @param Configuration $config + * @param \SimpleSAML\Configuration $config */ public function setConfiguration(Configuration $config): void { @@ -250,7 +251,7 @@ public function __unserialize(array $serialized): void /** * Retrieves the current session. Creates a new session if there's not one. * - * @return Session The current session. + * @return \SimpleSAML\Session The current session. * @throws \Exception When session couldn't be initialized and the session fallback is disabled by configuration. */ public static function getSessionFromRequest(): Session @@ -498,7 +499,6 @@ public function cleanup(): void * Mark this session as dirty. * * This method will register a callback to save the session right before any output is sent to the browser. - * */ public function markDirty(): void { @@ -598,7 +598,7 @@ public function setRememberMeExpire(?int $lifetime = null): void * @param string $authority The authority the user logged in with. * @param array $data The authentication data for this authority. * - * @throws Error\CannotSetCookie If the authentication token cannot be set for some reason. + * @throws \SimpleSAML\Error\CannotSetCookie If the authentication token cannot be set for some reason. */ public function doLogin(string $authority, array $data = []): void { diff --git a/src/SimpleSAML/SessionHandlerCookie.php b/src/SimpleSAML/SessionHandlerCookie.php index eeb54239c9..cf409864ea 100644 --- a/src/SimpleSAML/SessionHandlerCookie.php +++ b/src/SimpleSAML/SessionHandlerCookie.php @@ -25,7 +25,6 @@ abstract class SessionHandlerCookie extends SessionHandler */ private ?string $session_id = null; - /** * This variable contains the session cookie name. * diff --git a/src/SimpleSAML/SessionHandlerPHP.php b/src/SimpleSAML/SessionHandlerPHP.php index 04553c3a76..dac685d496 100644 --- a/src/SimpleSAML/SessionHandlerPHP.php +++ b/src/SimpleSAML/SessionHandlerPHP.php @@ -165,6 +165,7 @@ public function newSessionId(): string return $sessionId; } + /** * Retrieve the session ID saved in the session cookie, if there's one. * diff --git a/src/SimpleSAML/Stats.php b/src/SimpleSAML/Stats.php index 7a375f4803..317ad4c755 100644 --- a/src/SimpleSAML/Stats.php +++ b/src/SimpleSAML/Stats.php @@ -23,7 +23,6 @@ class Stats */ private static bool $initialized = false; - /** * The statistics output callbacks. * diff --git a/src/SimpleSAML/Store/RedisStore.php b/src/SimpleSAML/Store/RedisStore.php index 3dab9bfa54..8c93351ae9 100644 --- a/src/SimpleSAML/Store/RedisStore.php +++ b/src/SimpleSAML/Store/RedisStore.php @@ -6,7 +6,9 @@ use Predis\Client; use SimpleSAML\Assert\Assert; -use SimpleSAML\{Configuration, Error, Utils}; +use SimpleSAML\Configuration; +use SimpleSAML\Error; +use SimpleSAML\Utils; use function class_exists; use function serialize; diff --git a/src/SimpleSAML/Store/SQLStore.php b/src/SimpleSAML/Store/SQLStore.php index 21e37239f4..ecefac6ae3 100644 --- a/src/SimpleSAML/Store/SQLStore.php +++ b/src/SimpleSAML/Store/SQLStore.php @@ -8,7 +8,9 @@ use PDO; use PDOException; use SimpleSAML\Assert\Assert; -use SimpleSAML\{Configuration, Logger, Utils}; +use SimpleSAML\Configuration; +use SimpleSAML\Logger; +use SimpleSAML\Utils; use function array_keys; use function count; @@ -17,12 +19,12 @@ use function in_array; use function intval; use function rand; +use function rawurlencode; use function serialize; use function sha1; use function strlen; use function unserialize; use function urldecode; -use function rawurlencode; /** * A data store using a RDBMS to keep the data. @@ -197,6 +199,7 @@ private function initTableVersionTable(): void } } + /** * Initialize key-value table. */ diff --git a/src/SimpleSAML/Utils/Config.php b/src/SimpleSAML/Utils/Config.php index e89200da41..7d4efb5e2a 100644 --- a/src/SimpleSAML/Utils/Config.php +++ b/src/SimpleSAML/Utils/Config.php @@ -63,6 +63,7 @@ public function getSecretSalt(): string return $secretSalt; } + /** * Returns the path to the config dir * diff --git a/src/SimpleSAML/Utils/Config/Metadata.php b/src/SimpleSAML/Utils/Config/Metadata.php index 0aa2e01b52..b66769d346 100644 --- a/src/SimpleSAML/Utils/Config/Metadata.php +++ b/src/SimpleSAML/Utils/Config/Metadata.php @@ -22,7 +22,6 @@ class Metadata */ public static string $ENTITY_CATEGORY = 'http://macedir.org/entity-category'; - /** * The string the identifies the REFEDS "Hide From Discovery" Entity Category. * @@ -30,7 +29,6 @@ class Metadata */ public static string $HIDE_FROM_DISCOVERY = 'http://refeds.org/category/hide-from-discovery'; - /** * Valid options for the ContactPerson element * diff --git a/src/SimpleSAML/Utils/Crypto.php b/src/SimpleSAML/Utils/Crypto.php index 64e8933d00..15bc9f6766 100644 --- a/src/SimpleSAML/Utils/Crypto.php +++ b/src/SimpleSAML/Utils/Crypto.php @@ -27,7 +27,7 @@ class Crypto * * @return string The decrypted data. * @throws \InvalidArgumentException If $ciphertext is not a string. - * @throws Error\Exception If the openssl module is not loaded. + * @throws \SimpleSAML\Error\Exception If the openssl module is not loaded. * * @see \SimpleSAML\Utils\Crypto::aesDecrypt() */ @@ -79,7 +79,7 @@ private function aesDecryptInternal(string $ciphertext, string $secret): string * * @return string The decrypted data. * @throws \InvalidArgumentException If $ciphertext is not a string. - * @throws Error\Exception If the openssl module is not loaded. + * @throws \SimpleSAML\Error\Exception If the openssl module is not loaded. * * @deprecated - Possibly use xml-security library */ @@ -102,7 +102,7 @@ public function aesDecrypt(string $ciphertext, ?string $secret = null): string * * @return string An HMAC of the encrypted data, the IV and the encrypted data, concatenated. * @throws \InvalidArgumentException If $data is not a string. - * @throws Error\Exception If the openssl module is not loaded. + * @throws \SimpleSAML\Error\Exception If the openssl module is not loaded. * * @see \SimpleSAML\Utils\Crypto::aesEncrypt() */ @@ -145,7 +145,7 @@ private function aesEncryptInternal(string $data, string $secret): string * * @return string An HMAC of the encrypted data, the IV and the encrypted data, concatenated. * @throws \InvalidArgumentException If $data is not a string. - * @throws Error\Exception If the openssl module is not loaded. + * @throws \SimpleSAML\Error\Exception If the openssl module is not loaded. * * @deprecated - Possibly use xml-security library */ @@ -197,8 +197,8 @@ public function der2pem(string $der, string $type = 'CERTIFICATE'): string * * @return array|null Extracted private key, or NULL if no private key is present. * @throws \InvalidArgumentException If $required is not boolean or $prefix is not a string. - * @throws Error\Exception If no private key is found in the metadata, or it was not possible to load - * it. + * @throws \SimpleSAML\Error\Exception If no private key is found in the metadata, + * or it was not possible to load it. * */ public function loadPrivateKey( @@ -254,8 +254,8 @@ public function loadPrivateKey( * @return array|null Public key or certificate data, or NULL if no public key or certificate was found. * @throws \InvalidArgumentException If $metadata is not an instance of \SimpleSAML\Configuration, $required is not * boolean or $prefix is not a string. - * @throws Error\Exception If no public key is found in the metadata, or it was not possible to load - * it. + * @throws \SimpleSAML\Error\Exception If no public key is found in the metadata, + * or it was not possible to load it. * */ public function loadPublicKey(Configuration $metadata, bool $required = false, string $prefix = ''): ?array @@ -333,7 +333,7 @@ public function pem2der(string $pem): string * * @return string The hashed password. * @throws \Exception If the algorithm is not known ti PHP. - * @throws Error\Exception If the algorithm specified is not supported. + * @throws \SimpleSAML\Error\Exception If the algorithm specified is not supported. * * @see hash_algos() * @deprecated Use Symfony NativePasswordHasher::hash instead @@ -372,7 +372,7 @@ public function secureCompare(string $known, string $user): bool * * @return boolean True if the hash corresponds with the given password, false otherwise. * @throws \InvalidArgumentException If the input parameters are not strings. - * @throws Error\Exception If the algorithm specified is not supported. + * @throws \SimpleSAML\Error\Exception If the algorithm specified is not supported. * * @deprecated Use Symfony NativePasswordHasher::verify instead */ @@ -387,6 +387,7 @@ public function pwValid(string $hash, string $password): bool return $hash === $password; } + /** * Retrieve a certificate or private key from specified storage location * @@ -463,6 +464,7 @@ private function retrieveCertOrKey(string $data_type, string $location, bool $fu return($data); } + /** * Public wrapper around retrieveCertOrKey to retrieve a certificate * @@ -479,6 +481,7 @@ public function retrieveCertificate(string $location, bool $full_path = false): return $this->retrieveCertOrKey('certificate', $location, $full_path); } + /** * Public wrapper around retrieveCertOrKey to retrieve a private key * diff --git a/src/SimpleSAML/Utils/EMail.php b/src/SimpleSAML/Utils/EMail.php index b141f0d725..a10872105f 100644 --- a/src/SimpleSAML/Utils/EMail.php +++ b/src/SimpleSAML/Utils/EMail.php @@ -230,8 +230,8 @@ public function setTransportMethod(string $transportMethod, array $transportOpti /** * Initializes the provided EMail object with the configuration provided from the SimpleSAMLphp configuration. * - * @param EMail $EMail - * @return EMail + * @param \SimpleSAML\Utils\EMail $EMail + * @return \SimpleSAML\Utils\EMail * @throws \Exception */ public function initFromConfig(EMail $EMail): EMail diff --git a/src/SimpleSAML/Utils/HTTP.php b/src/SimpleSAML/Utils/HTTP.php index b3093b5aff..ba8268f0b4 100644 --- a/src/SimpleSAML/Utils/HTTP.php +++ b/src/SimpleSAML/Utils/HTTP.php @@ -66,13 +66,14 @@ public function canSetSameSiteNone(): bool return true; } + /** * Obtain a URL where we can redirect to securely post a form with the given data to a specific destination. * * @param string $destination The destination URL. * @param array $data An associative array containing the data to be posted to $destination. * - * @throws Error\Exception If the current session is transient. + * @throws \SimpleSAML\Error\Exception If the current session is transient. * @return string A URL which allows to securely post a form to $destination. * */ @@ -362,13 +363,13 @@ public function checkSessionCookie(?string $retryURL = null): void * Check if a URL is valid and is in our list of allowed URLs. * * @param string $url The URL to check. - * @param string[]|null $trustedSites An optional white list of domains. If none specified, the 'trusted.url.domains' + * @param string[]|null $trustedSites An optional whitelist of domains. If none specified, the 'trusted.url.domains' * configuration directive will be used. * * @return string The normalized URL itself if it is allowed. An empty string if the $url parameter is empty as * defined by the empty() function. * @throws \InvalidArgumentException If the URL is malformed. - * @throws Error\Exception If the URL is not allowed by configuration. + * @throws \SimpleSAML\Error\Exception If the URL is not allowed by configuration. * */ public function checkURLAllowed(string $url, ?array $trustedSites = null): string @@ -457,7 +458,7 @@ public function checkURLAllowed(string $url, ?array $trustedSites = null): strin * @return string|array An array if $getHeaders is set, containing the data and the headers respectively; string * otherwise. * @throws \InvalidArgumentException If the input parameters are invalid. - * @throws Error\Exception If the file or URL cannot be retrieved. + * @throws \SimpleSAML\Error\Exception If the file or URL cannot be retrieved. * */ public function fetch(string $url, array $context = [], bool $getHeaders = false) @@ -1098,7 +1099,9 @@ public function setCookie(string $name, ?string $value, ?array $params = null, b Error\CannotSetCookie::SECURE_COOKIE, ); } - Logger::warning('Error setting cookie: setting secure cookie on plain HTTP (except on localhost) is not allowed.'); + Logger::warning( + 'Error setting cookie: setting secure cookie on plain HTTP (except on localhost) is not allowed.', + ); return; } diff --git a/src/SimpleSAML/Utils/Net.php b/src/SimpleSAML/Utils/Net.php index 0efa9f83bf..ac196856ea 100644 --- a/src/SimpleSAML/Utils/Net.php +++ b/src/SimpleSAML/Utils/Net.php @@ -4,7 +4,8 @@ namespace SimpleSAML\Utils; -use Symfony\Component\HttpFoundation\{IpUtils, Request}; +use Symfony\Component\HttpFoundation\IpUtils; +use Symfony\Component\HttpFoundation\Request; /** * Net-related utility methods. @@ -18,8 +19,8 @@ class Net * Check whether an IP address is part of a CIDR. * * @param string|array $cidr The network CIDR address. - * @param string|null $ip The IP address to check. Optional. Current remote address will be used if none specified. Do - * not rely on default parameter if running behind load balancers. + * @param string|null $ip The optional IP address to check. Current remote address will be used if none specified. + * Do not rely on the default parameter if running behind load balancers. * * @return boolean True if the IP address belongs to the specified CIDR, false otherwise. */ diff --git a/src/SimpleSAML/Utils/System.php b/src/SimpleSAML/Utils/System.php index 47cad13f22..2b5471be58 100644 --- a/src/SimpleSAML/Utils/System.php +++ b/src/SimpleSAML/Utils/System.php @@ -15,12 +15,19 @@ class System { public const WINDOWS = 1; + public const LINUX = 2; + public const OSX = 3; + public const HPUX = 4; + public const UNIX = 5; + public const BSD = 6; + public const IRIX = 7; + public const SUNOS = 8; @@ -64,9 +71,9 @@ public function getOS(): int|false * This function retrieves the path to a directory where temporary files can be saved. * * @return string Path to a temporary directory, without a trailing directory separator. - * @throws Error\Exception If the temporary directory cannot be created or it exists and cannot be written + * @throws \SimpleSAML\Error\Exception + * If the temporary directory cannot be created or it exists and cannot be written * to by the current user. - * */ public function getTempDir(): string { @@ -180,7 +187,7 @@ public function resolvePath(string $path, ?string $base = null): string * * * @throws \InvalidArgumentException If any of the input parameters doesn't have the proper types. - * @throws Error\Exception If the file cannot be saved, permissions cannot be changed or it is not + * @throws \SimpleSAML\Error\Exception If the file cannot be saved, permissions cannot be changed or it is not * possible to write to the target file. */ public function writeFile(string $filename, string $data, int $mode = 0600): void @@ -250,6 +257,7 @@ private function pathContainsDriveLetter(string $path): bool && $letterAsciiValue >= 65 && $letterAsciiValue <= 90; } + /** * Check if the supplied path contains a stream wrapper * diff --git a/src/SimpleSAML/Utils/XML.php b/src/SimpleSAML/Utils/XML.php index c735fc850f..c51a1e067d 100644 --- a/src/SimpleSAML/Utils/XML.php +++ b/src/SimpleSAML/Utils/XML.php @@ -327,7 +327,9 @@ public function isValid(string|DOMDocument $xml, string $schema): bool|string if ($res === true) { $config = Configuration::getInstance(); $sysUtils = new System(); - $schemaFile = $sysUtils->resolvePath($config->getVendorDir() . 'simplesamlphp/saml2/resources/schemas/' . $schema); + $schemaFile = $sysUtils->resolvePath( + $config->getVendorDir() . 'simplesamlphp/saml2/resources/schemas/' . $schema, + ); libxml_set_external_entity_loader( /** @@ -336,7 +338,12 @@ public function isValid(string|DOMDocument $xml, string $schema): bool|string * @param array $context * @return string|null */ - function (?string $public = null, string $system = '', /** @scrutinizer ignore-unused */ array $context = []) { + function ( + ?string $public = null, + string $system = '', + /** @scrutinizer ignore-unused */ + array $context = [], + ) { if (filter_var($system, FILTER_VALIDATE_URL) === $system) { return null; } diff --git a/src/SimpleSAML/XHTML/IdPDisco.php b/src/SimpleSAML/XHTML/IdPDisco.php index fc2fd53b86..7e82f007ae 100644 --- a/src/SimpleSAML/XHTML/IdPDisco.php +++ b/src/SimpleSAML/XHTML/IdPDisco.php @@ -559,10 +559,11 @@ public function handleRequest(): void if (sizeof($idpList) === 1) { $selectedIdP = array_key_first($idpList); - $this->log( - 'One candidate IdP, not showing discovery [' . $selectedIdP . '] (Redirecting the user back. returnIDParam=' . - $this->returnIdParam . ')', - ); + $this->log(sprintf( + 'One candidate IdP, not showing discovery [%s] (Redirecting the user back. returnIDParam=%s', + $selectedIdP, + $this->returnIdParam, + )); $httpUtils->redirectTrustedURL( $this->returnURL, [$this->returnIdParam => $selectedIdP], diff --git a/src/SimpleSAML/XHTML/Template.php b/src/SimpleSAML/XHTML/Template.php index 6ffbe04ae4..997340d779 100644 --- a/src/SimpleSAML/XHTML/Template.php +++ b/src/SimpleSAML/XHTML/Template.php @@ -251,7 +251,7 @@ private function normalizeTemplateName(string $templateName): string /** * Set up the places where twig can look for templates. * - * @return TemplateLoader The twig template loader or false if the template does not exist. + * @return \SimpleSAML\XHMTL\TemplateLoader The twig template loader or false if the template does not exist. * @throws \Twig\Error\LoaderError In case a failure occurs. */ private function setupTwigTemplatepaths(): TemplateLoader diff --git a/src/SimpleSAML/XML/Parser.php b/src/SimpleSAML/XML/Parser.php index 6a02f27ac3..164818816e 100644 --- a/src/SimpleSAML/XML/Parser.php +++ b/src/SimpleSAML/XML/Parser.php @@ -17,6 +17,7 @@ class Parser /** @var \SimpleXMLElement */ public SimpleXMLElement $simplexml; + /** * @param string $xml */ diff --git a/test.php b/test.php new file mode 100644 index 0000000000..26ec130017 --- /dev/null +++ b/test.php @@ -0,0 +1,8 @@ +files()->in($moduleLocalesDir . '**/LC_MESSAGES/')->name("{$domain}.po"); diff --git a/tests/modules/saml/src/IdP/SAML2Test.php b/tests/modules/saml/src/IdP/SAML2Test.php index 80a578c699..9008cfcf04 100644 --- a/tests/modules/saml/src/IdP/SAML2Test.php +++ b/tests/modules/saml/src/IdP/SAML2Test.php @@ -61,6 +61,7 @@ public function testIdPInitiatedLoginMinimumParams(): void $this->assertEquals('https://some-sp-entity-id', $state['SPMetadata']['entityid']); $this->assertStringStartsWith( + // phpcs:ignore Generic.Files.LineLength.TooLong 'http://idp.examlple.com/module.php/saml/idp/singleSignOnService?spentityid=https%3A%2F%2Fsome-sp-entity-id&cookie', $state['\SimpleSAML\Auth\State.restartURL'], ); @@ -121,6 +122,7 @@ public function testIdPInitShibCompatyMinimumParams(): void $this->assertEquals('https://some-sp-entity-id', $state['SPMetadata']['entityid']); $this->assertStringStartsWith( + // phpcs:ignore Generic.Files.LineLength.TooLong 'http://idp.examlple.com/module.php/saml/idp/singleSignOnService?spentityid=https%3A%2F%2Fsome-sp-entity-id&cookie', $state['\SimpleSAML\Auth\State.restartURL'], ); From 7bfb606e485ff3db2839d45f7b50c2d8417081d7 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 7 Oct 2025 22:49:15 +0200 Subject: [PATCH 397/532] Replace grouped use-statements and fix incorrect number of newlines --- modules/admin/src/Controller/Config.php | 4 ++- modules/admin/src/Controller/Federation.php | 6 +++- .../core/src/Auth/Source/SourceIPSelector.php | 7 ++-- modules/core/src/Auth/UserPassBase.php | 2 ++ modules/core/src/Auth/UserPassOrgBase.php | 1 + modules/core/src/Controller/ErrorReport.php | 6 +++- modules/core/src/Controller/Exception.php | 26 +++++++++----- modules/core/src/Controller/Login.php | 17 +++++---- modules/core/src/Controller/Logout.php | 18 ++++++---- modules/core/src/Controller/Redirection.php | 5 +-- .../core/src/Storage/SQLPermanentStorage.php | 1 + modules/cron/src/Cron.php | 2 ++ modules/debugsp/src/Controller/Test.php | 5 ++- .../exampleauth/src/Auth/Source/UserClick.php | 4 +-- .../src/Controller/ExampleAuth.php | 3 +- .../src/Controller/ProfileAuth.php | 8 +++-- .../multiauth/src/Auth/Source/MultiAuth.php | 1 + modules/saml/hooks/hook_sanitycheck.php | 5 +-- .../Process/ExpectedAuthnContextClassRef.php | 1 - .../saml/src/Auth/Process/FilterScopes.php | 2 ++ .../saml/src/Auth/Process/NameIDAttribute.php | 1 - modules/saml/src/Auth/Process/PairwiseID.php | 1 - .../Process/PersistentNameID2TargetedID.php | 1 - .../saml/src/Auth/Process/ScopedIssuer.php | 10 ++++-- modules/saml/src/Auth/Process/SubjectID.php | 7 ++-- modules/saml/src/Auth/Source/SP.php | 2 ++ modules/saml/src/BaseNameIDGenerator.php | 2 -- modules/saml/src/Controller/Exception.php | 3 +- modules/saml/src/Controller/Metadata.php | 4 +++ modules/saml/src/Controller/Proxy.php | 3 +- .../saml/src/Controller/ServiceProvider.php | 36 ++++++++++--------- modules/saml/src/IdP/SAML2.php | 4 ++- modules/saml/src/IdP/SQLNameID.php | 3 ++ modules/saml/src/SP/LogoutStore.php | 2 ++ 34 files changed, 137 insertions(+), 66 deletions(-) diff --git a/modules/admin/src/Controller/Config.php b/modules/admin/src/Controller/Config.php index 8cd49391b8..1f1fa66593 100644 --- a/modules/admin/src/Controller/Config.php +++ b/modules/admin/src/Controller/Config.php @@ -10,7 +10,8 @@ use SimpleSAML\Session; use SimpleSAML\Utils; use SimpleSAML\XHTML\Template; -use Symfony\Component\HttpFoundation\{Request, Response, StreamedResponse}; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\StreamedResponse; use function curl_close; use function curl_exec; @@ -37,6 +38,7 @@ class Config public const RELEASES_API = 'https://api.github.com/repos/simplesamlphp/simplesamlphp/releases/latest'; + /** @var \SimpleSAML\Utils\Auth */ protected Utils\Auth $authUtils; diff --git a/modules/admin/src/Controller/Federation.php b/modules/admin/src/Controller/Federation.php index 5c934ec333..e95ab7b4c2 100644 --- a/modules/admin/src/Controller/Federation.php +++ b/modules/admin/src/Controller/Federation.php @@ -211,7 +211,11 @@ private function getHostedIdP(): array $selfHost = $httpUtils->getSelfHostWithPath(); foreach ($idps as $index => $idp) { if (isset($idp['host']) && $idp['host'] !== '__DEFAULT__') { - $mdHostBase = str_replace('://' . $selfHost . '/', '://' . $idp['host'] . '/', $metadataBase); + $mdHostBase = str_replace( + '://' . $selfHost . '/', + '://' . $idp['host'] . '/', + $metadataBase, + ); } else { $mdHostBase = $metadataBase; } diff --git a/modules/core/src/Auth/Source/SourceIPSelector.php b/modules/core/src/Auth/Source/SourceIPSelector.php index 6f42e2d037..ce98026e51 100644 --- a/modules/core/src/Auth/Source/SourceIPSelector.php +++ b/modules/core/src/Auth/Source/SourceIPSelector.php @@ -4,9 +4,11 @@ namespace SimpleSAML\Module\core\Auth\Source; -use SimpleSAML\{Error, Logger}; use SimpleSAML\Assert\Assert; -use Symfony\Component\HttpFoundation\{IpUtils, Request}; +use SimpleSAML\Error; +use SimpleSAML\Logger; +use Symfony\Component\HttpFoundation\IpUtils; +use Symfony\Component\HttpFoundation\Request; use function array_key_exists; use function sprintf; @@ -34,6 +36,7 @@ class SourceIPSelector extends AbstractSourceSelector */ public const SOURCESID = '\SimpleSAML\Module\core\Auth\Source\SourceIPSelector.SourceId'; + /** * @param string|null The default authentication source to use when none of the zones match */ diff --git a/modules/core/src/Auth/UserPassBase.php b/modules/core/src/Auth/UserPassBase.php index d27575ee11..a42a728bab 100644 --- a/modules/core/src/Auth/UserPassBase.php +++ b/modules/core/src/Auth/UserPassBase.php @@ -33,6 +33,7 @@ abstract class UserPassBase extends Auth\Source */ public const AUTHID = '\SimpleSAML\Module\core\Auth\UserPassBase.AuthId'; + /** * Username we should force. * @@ -136,6 +137,7 @@ public function setForcedUsername(?string $forcedUsername): void $this->forcedUsername = $forcedUsername; } + /** * Return login links from configuration * @return string[] diff --git a/modules/core/src/Auth/UserPassOrgBase.php b/modules/core/src/Auth/UserPassOrgBase.php index be440c1f6c..7064bfcf8f 100644 --- a/modules/core/src/Auth/UserPassOrgBase.php +++ b/modules/core/src/Auth/UserPassOrgBase.php @@ -38,6 +38,7 @@ abstract class UserPassOrgBase extends Auth\Source */ public const ORGID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.SelectedOrg'; + /** * What way do we handle the organization as part of the username. * Three values: diff --git a/modules/core/src/Controller/ErrorReport.php b/modules/core/src/Controller/ErrorReport.php index c3fd76f650..a5a9d6ea9b 100644 --- a/modules/core/src/Controller/ErrorReport.php +++ b/modules/core/src/Controller/ErrorReport.php @@ -5,8 +5,12 @@ namespace SimpleSAML\Module\core\Controller; use Exception as BuiltinException; -use SimpleSAML\{Configuration, Error, Logger, Session, Utils}; +use SimpleSAML\Configuration; +use SimpleSAML\Error; use SimpleSAML\HTTP\RunnableResponse; +use SimpleSAML\Logger; +use SimpleSAML\Session; +use SimpleSAML\Utils; use SimpleSAML\XHTML\Template; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; diff --git a/modules/core/src/Controller/Exception.php b/modules/core/src/Controller/Exception.php index b79f06a33d..62f5b5748b 100644 --- a/modules/core/src/Controller/Exception.php +++ b/modules/core/src/Controller/Exception.php @@ -6,9 +6,16 @@ use DateTimeInterface; use SimpleSAML\Assert\Assert; -use SimpleSAML\{Auth, Configuration, Error, Logger, Module, Session, Utils}; +use SimpleSAML\Auth; +use SimpleSAML\Configuration; +use SimpleSAML\Error; +use SimpleSAML\Logger; +use SimpleSAML\Module; +use SimpleSAML\Session; +use SimpleSAML\Utils; use SimpleSAML\XHTML\Template; -use Symfony\Component\HttpFoundation\{Request, Response}; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; use function array_keys; use function date; @@ -49,7 +56,7 @@ public function __construct( /** * Show Service Provider error. * - * @param Request $request The request that lead to this login operation. + * @param \Symfony\Component\HttpFoundation\Request $request The request that lead to this login operation. * @param string $code The error code * @return \SimpleSAML\XHTML\Template An HTML template */ @@ -108,7 +115,7 @@ public function error(Request $request, string $code): Response /** * Show cardinality error. * - * @param Request $request The request that lead to this login operation. + * @param \Symfony\Component\HttpFoundation\Request $request The request that lead to this login operation. * @throws \SimpleSAML\Error\BadRequest * @return \SimpleSAML\XHTML\Template|\Symfony\Component\HttpFoundation\RedirectResponse * An HTML template or a redirection if we are not authenticated. @@ -142,7 +149,7 @@ public function cardinality(Request $request): Response /** * Show missing cookie error. * - * @param Request $request The request that lead to this login operation. + * @param \Symfony\Component\HttpFoundation\Request $request The request that lead to this login operation. * @return \SimpleSAML\XHTML\Template|\Symfony\Component\HttpFoundation\RedirectResponse * An HTML template or a redirection if we are not authenticated. */ @@ -165,10 +172,13 @@ public function nocookie(Request $request): Response * Show a warning to an user about the SP requesting SSO a short time after * doing it previously. * - * @param Request $request The request that lead to this login operation. + * @param \Symfony\Component\HttpFoundation\Request $request The request that lead to this login operation. * - * @return \SimpleSAML\XHTML\Template|\SimpleSAML\HTTP\RunnableResponse|\Symfony\Component\HttpFoundation\RedirectResponse - * An HTML template, a redirect or a "runnable" response. + * @return ( + * \SimpleSAML\XHTML\Template| + * \SimpleSAML\HTTP\RunnableResponse| + * \Symfony\Component\HttpFoundation\RedirectResponse + * ) An HTML template, a redirect or a "runnable" response. * * @throws \SimpleSAML\Error\BadRequest */ diff --git a/modules/core/src/Controller/Login.php b/modules/core/src/Controller/Login.php index 8d9811f43a..cba5327921 100644 --- a/modules/core/src/Controller/Login.php +++ b/modules/core/src/Controller/Login.php @@ -4,13 +4,18 @@ namespace SimpleSAML\Module\core\Controller; -use SimpleSAML\{Auth, Configuration, Error, Module, Utils}; -use SimpleSAML\Module\core\Auth\{UserPassBase, UserPassOrgBase}; +use SimpleSAML\Auth; +use SimpleSAML\Configuration; +use SimpleSAML\Error; +use SimpleSAML\Error\ErrorCodes; +use SimpleSAML\Module; +use SimpleSAML\Module\core\Auth\UserPassBase; +use SimpleSAML\Module\core\Auth\UserPassOrgBase; +use SimpleSAML\Utils; use SimpleSAML\XHTML\Template; use Symfony\Component\HttpFoundation\Cookie; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use SimpleSAML\Error\ErrorCodes; use function array_key_exists; use function substr; @@ -44,13 +49,12 @@ class Login protected static array $registeredErrorCodeClasses = []; - /** * Controller constructor. * * It initializes the global configuration for the controllers implemented here. * - * @param \SimpleSAML\Configuration $config The configuration to use by the controllers. + * @param \SimpleSAML\Configuration $config The configuration to use by the controllers. * * @throws \Exception */ @@ -136,6 +140,7 @@ public static function registerErrorCodeClass(ErrorCodes $ecc): void } } + /** * This method handles the generic part for both loginuserpass and loginuserpassorg * @@ -500,7 +505,7 @@ private function getReturnPath(Request $request): string /** * This clears the user's IdP discovery choices. * - * @param Request $request The request that lead to this login operation. + * @param \Symfony\Component\HttpFoundation\Request $request The request that lead to this login operation. */ public function cleardiscochoices(Request $request): void { diff --git a/modules/core/src/Controller/Logout.php b/modules/core/src/Controller/Logout.php index a31b26d136..aef2fa3645 100644 --- a/modules/core/src/Controller/Logout.php +++ b/modules/core/src/Controller/Logout.php @@ -7,10 +7,16 @@ use Exception as BuiltinException; use SAML2\Binding; use SAML2\Constants; -use SimpleSAML\{Auth, Configuration, Error, IdP, Logger, Stats, Utils}; +use SimpleSAML\Auth; +use SimpleSAML\Configuration; +use SimpleSAML\Error; use SimpleSAML\HTTP\RunnableResponse; +use SimpleSAML\IdP; +use SimpleSAML\Logger; use SimpleSAML\Metadata\MetaDataStorageHandler; use SimpleSAML\Module\saml\Message; +use SimpleSAML\Stats; +use SimpleSAML\Utils; use SimpleSAML\XHTML\Template; use Symfony\Component\HttpFoundation\Request; @@ -66,7 +72,7 @@ public function setAuthState(Auth\State $authState): void /** * Log the user out of a given authentication source. * - * @param Request $request The request that lead to this logout operation. + * @param \Symfony\Components\HttpFoundation\Request $request The request that lead to this logout operation. * @param string $as The name of the auth source. * * @return \SimpleSAML\HTTP\RunnableResponse A runnable response which will actually perform logout. @@ -106,7 +112,7 @@ private function getReturnPath(Request $request): string /** - * @param Request $request The request that lead to this logout operation. + * @param \Symfony\Component\HttpFoundation\Request $request The request that lead to this logout operation. * @return \SimpleSAML\HTTP\RunnableResponse */ public function logoutIframeDone(Request $request): RunnableResponse @@ -173,7 +179,7 @@ public function logoutIframeDone(Request $request): RunnableResponse /** - * @param Request $request The request that lead to this logout operation. + * @param \Symfony\Component\HttpFoundation\Request $request The request that lead to this logout operation. * @return \SimpleSAML\HTTP\RunnableResponse */ public function logoutIframePost(Request $request): RunnableResponse @@ -239,7 +245,7 @@ public function logoutIframePost(Request $request): RunnableResponse /** - * @param Request $request The request that lead to this logout operation. + * @param \Symfony\Component\HttpFoundation\Request $request The request that lead to this logout operation. * @return \SimpleSAML\XHTML\Template */ public function logoutIframe(Request $request): Template @@ -385,7 +391,7 @@ public function logoutIframe(Request $request): Template /** - * @param Request $request The request that lead to this logout operation. + * @param \Symfony\Component\HttpFoundation\Request $request The request that lead to this logout operation. * @return \SimpleSAML\HTTP\RunnableResponse */ public function resumeLogout(Request $request): RunnableResponse diff --git a/modules/core/src/Controller/Redirection.php b/modules/core/src/Controller/Redirection.php index 9ad8414e99..f2e2690c8c 100644 --- a/modules/core/src/Controller/Redirection.php +++ b/modules/core/src/Controller/Redirection.php @@ -13,7 +13,8 @@ use SimpleSAML\XMLSecurity\Alg\Encryption\AES; use SimpleSAML\XMLSecurity\Constants as C; use SimpleSAML\XMLSecurity\Key\SymmetricKey; -use Symfony\Component\HttpFoundation\{Request, Response}; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; /** * Controller class for the core module. @@ -44,7 +45,7 @@ public function __construct( /** * This controller provides a way to create a redirect to a POST request * - * @param Request $request The request that lead to this login operation. + * @param \Symfony\Component\HttpFoundation\Request $request The request that lead to this login operation. * @throws \SimpleSAML\Error\BadRequest * @return \SimpleSAML\XHTML\Template|\Symfony\Component\HttpFoundation\RedirectResponse * An HTML template or a redirection if we are not authenticated. diff --git a/modules/core/src/Storage/SQLPermanentStorage.php b/modules/core/src/Storage/SQLPermanentStorage.php index ba4c76bf0f..0dacb5aa5d 100644 --- a/modules/core/src/Storage/SQLPermanentStorage.php +++ b/modules/core/src/Storage/SQLPermanentStorage.php @@ -167,6 +167,7 @@ public function get(?string $type = null, ?string $key1 = null, ?string $key2 = return $res; } + /** * Return the value directly (not in a container) * diff --git a/modules/cron/src/Cron.php b/modules/cron/src/Cron.php index 0cffbc296c..95df20c701 100644 --- a/modules/cron/src/Cron.php +++ b/modules/cron/src/Cron.php @@ -34,6 +34,7 @@ public function __construct(?Configuration $cronconfig = null) $this->cronconfig = $cronconfig; } + /** * Invoke the cron hook for the given tag * @param string $tag The tag to use. Must be valid in the cronConfig @@ -63,6 +64,7 @@ public function runTag(string $tag): array return $croninfo; } + /** * @param string $tag * @return bool diff --git a/modules/debugsp/src/Controller/Test.php b/modules/debugsp/src/Controller/Test.php index bb3823059a..9d3dc3cf11 100644 --- a/modules/debugsp/src/Controller/Test.php +++ b/modules/debugsp/src/Controller/Test.php @@ -38,7 +38,6 @@ class Test protected $authState = Auth\State::class; - /** * TestController constructor. * @@ -51,6 +50,7 @@ public function __construct( ) { } + /** * Inject the \SimpleSAML\Auth\Simple dependency. * @@ -61,6 +61,7 @@ public function setAuthSimple(Auth\Simple $authSimple): void $this->authSimple = $authSimple; } + /** * Inject the \SimpleSAML\Auth\State dependency. * @@ -71,6 +72,7 @@ public function setAuthState(Auth\State $authState): void $this->authState = $authState; } + /** * Create a page listing the SPs that can be tested * @@ -94,6 +96,7 @@ private function makeSPList(Request $request, ?string $as = null): Response return $t; } + /** * Display the list of available authsources. * diff --git a/modules/exampleauth/src/Auth/Source/UserClick.php b/modules/exampleauth/src/Auth/Source/UserClick.php index 14f1d17515..2ae381561c 100644 --- a/modules/exampleauth/src/Auth/Source/UserClick.php +++ b/modules/exampleauth/src/Auth/Source/UserClick.php @@ -5,13 +5,12 @@ namespace SimpleSAML\Module\exampleauth\Auth\Source; use Exception; -use SimpleSAML\Auth; use SimpleSAML\Assert\Assert; +use SimpleSAML\Auth; use SimpleSAML\Error; use SimpleSAML\Logger; use SimpleSAML\Module; use SimpleSAML\Utils; -use Symfony\Component\HttpFoundation\{Request, Response}; use function array_key_exists; use function sprintf; @@ -37,6 +36,7 @@ class UserClick extends Auth\Source */ public const AUTHID = '\SimpleSAML\Module\exampleauth\Auth\UserClick.AuthId'; + /** * Our users, stored in an associative array. The key of the array is "", * while the value of each element is a new array with the attributes for each user. diff --git a/modules/exampleauth/src/Controller/ExampleAuth.php b/modules/exampleauth/src/Controller/ExampleAuth.php index 102e5c92d3..561816e9f1 100644 --- a/modules/exampleauth/src/Controller/ExampleAuth.php +++ b/modules/exampleauth/src/Controller/ExampleAuth.php @@ -12,7 +12,8 @@ use SimpleSAML\Session; use SimpleSAML\Utils; use SimpleSAML\XHTML\Template; -use Symfony\Component\HttpFoundation\{Request, Response}; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Session\Session as SymfonySession; use function preg_match; diff --git a/modules/exampleauth/src/Controller/ProfileAuth.php b/modules/exampleauth/src/Controller/ProfileAuth.php index 2680e33d6a..6e0c6f5d98 100644 --- a/modules/exampleauth/src/Controller/ProfileAuth.php +++ b/modules/exampleauth/src/Controller/ProfileAuth.php @@ -5,10 +5,14 @@ namespace SimpleSAML\Module\exampleauth\Controller; use Exception as BuiltinException; -use SimpleSAML\{Auth, Configuration, Error, Module, Utils}; +use SimpleSAML\Auth; +use SimpleSAML\Configuration; +use SimpleSAML\Error; +use SimpleSAML\Module; use SimpleSAML\Module\exampleauth\Auth\Source\UserClick; use SimpleSAML\XHTML\Template; -use Symfony\Component\HttpFoundation\{Request, Response}; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; use function trim; diff --git a/modules/multiauth/src/Auth/Source/MultiAuth.php b/modules/multiauth/src/Auth/Source/MultiAuth.php index b75fa98912..cbd8f98409 100644 --- a/modules/multiauth/src/Auth/Source/MultiAuth.php +++ b/modules/multiauth/src/Auth/Source/MultiAuth.php @@ -42,6 +42,7 @@ class MultiAuth extends Auth\Source */ public const SESSION_SOURCE = 'multiauth:selectedSource'; + /** * Array of sources we let the user chooses among. * @var array diff --git a/modules/saml/hooks/hook_sanitycheck.php b/modules/saml/hooks/hook_sanitycheck.php index 15d9ba3622..08e7af3893 100644 --- a/modules/saml/hooks/hook_sanitycheck.php +++ b/modules/saml/hooks/hook_sanitycheck.php @@ -2,10 +2,11 @@ declare(strict_types=1); -use Webmozart\Assert\Assert; -use SimpleSAML\{Configuration, Utils}; +use SimpleSAML\Assert\Assert; +use SimpleSAML\Configuration; use SimpleSAML\Locale\Translate; use SimpleSAML\Metadata\MetaDataStorageHandler; +use SimpleSAML\Utils; function saml_hook_sanitycheck(array &$hookinfo): void { diff --git a/modules/saml/src/Auth/Process/ExpectedAuthnContextClassRef.php b/modules/saml/src/Auth/Process/ExpectedAuthnContextClassRef.php index 05ded98294..b287cbf5b0 100644 --- a/modules/saml/src/Auth/Process/ExpectedAuthnContextClassRef.php +++ b/modules/saml/src/Auth/Process/ExpectedAuthnContextClassRef.php @@ -36,7 +36,6 @@ class ExpectedAuthnContextClassRef extends ProcessingFilter */ private array $accepted; - /** * AuthnContextClassRef of the assertion * @var string|null diff --git a/modules/saml/src/Auth/Process/FilterScopes.php b/modules/saml/src/Auth/Process/FilterScopes.php index 4d4222c89a..7a32f0aae0 100644 --- a/modules/saml/src/Auth/Process/FilterScopes.php +++ b/modules/saml/src/Auth/Process/FilterScopes.php @@ -24,6 +24,7 @@ class FilterScopes extends ProcessingFilter 'eduPersonPrincipalName', ]; + /** * Constructor for the processing filter. * @@ -39,6 +40,7 @@ public function __construct(array &$config, $reserved) } } + /** * This method applies the filter, removing any values * diff --git a/modules/saml/src/Auth/Process/NameIDAttribute.php b/modules/saml/src/Auth/Process/NameIDAttribute.php index 0037d04562..735313beea 100644 --- a/modules/saml/src/Auth/Process/NameIDAttribute.php +++ b/modules/saml/src/Auth/Process/NameIDAttribute.php @@ -24,7 +24,6 @@ class NameIDAttribute extends ProcessingFilter */ private string $attribute; - /** * The format of the NameID in the attribute. * diff --git a/modules/saml/src/Auth/Process/PairwiseID.php b/modules/saml/src/Auth/Process/PairwiseID.php index 104d20333c..d474499643 100644 --- a/modules/saml/src/Auth/Process/PairwiseID.php +++ b/modules/saml/src/Auth/Process/PairwiseID.php @@ -5,7 +5,6 @@ namespace SimpleSAML\Module\saml\Auth\Process; use SAML2\Constants; -use SimpleSAML\{Auth, Utils}; use function strtolower; diff --git a/modules/saml/src/Auth/Process/PersistentNameID2TargetedID.php b/modules/saml/src/Auth/Process/PersistentNameID2TargetedID.php index 03bbf0e397..ad1fe9f27f 100644 --- a/modules/saml/src/Auth/Process/PersistentNameID2TargetedID.php +++ b/modules/saml/src/Auth/Process/PersistentNameID2TargetedID.php @@ -23,7 +23,6 @@ class PersistentNameID2TargetedID extends ProcessingFilter */ private string $attribute; - /** * Whether we should insert it as an saml:NameID element. * diff --git a/modules/saml/src/Auth/Process/ScopedIssuer.php b/modules/saml/src/Auth/Process/ScopedIssuer.php index 5261232605..297e89eb4e 100644 --- a/modules/saml/src/Auth/Process/ScopedIssuer.php +++ b/modules/saml/src/Auth/Process/ScopedIssuer.php @@ -5,13 +5,13 @@ namespace SimpleSAML\Module\saml\Auth\Process; use SAML2\Exception\ProtocolViolationException; -use SimpleSAML\{Auth, Utils}; use SimpleSAML\Assert\Assert; +use SimpleSAML\Auth; use function array_key_exists; use function explode; -use function strpos; use function sprintf; +use function strpos; /** * Filter to generate a saml:issuer dynamically based on an input attribute. @@ -47,6 +47,7 @@ class ScopedIssuer extends Auth\ProcessingFilter */ public const SCOPE_PATTERN = '/^[a-z0-9][a-z0-9.-]{0,126}$/Di'; + /** * The attribute we should use for the scope of the saml:Issuer. * @@ -131,7 +132,10 @@ public function process(array &$state): void */ protected function getScopedAttribute(array $state): ?string { - if (!array_key_exists('Attributes', $state) || !array_key_exists($this->scopedAttribute, $state['Attributes'])) { + if ( + !array_key_exists('Attributes', $state) + || !array_key_exists($this->scopedAttribute, $state['Attributes']) + ) { return null; } diff --git a/modules/saml/src/Auth/Process/SubjectID.php b/modules/saml/src/Auth/Process/SubjectID.php index 3d4401c899..be5a3237fd 100644 --- a/modules/saml/src/Auth/Process/SubjectID.php +++ b/modules/saml/src/Auth/Process/SubjectID.php @@ -6,16 +6,18 @@ use SAML2\Constants; use SAML2\Exception\ProtocolViolationException; -use SimpleSAML\{Auth, Logger, Utils}; use SimpleSAML\Assert\Assert; +use SimpleSAML\Auth; +use SimpleSAML\Logger; +use SimpleSAML\Utils; use function array_key_exists; use function explode; use function hash_hmac; use function preg_match; +use function sprintf; use function strpos; use function strtolower; -use function sprintf; /** * Filter to generate the subject ID attribute. @@ -70,6 +72,7 @@ class SubjectID extends Auth\ProcessingFilter */ public const WARN_PATTERN = '/^[a-z0-9][a-z0-9=-]{3,}@[a-z0-9][a-z0-9.-]+\.[a-z]{2,}$/Di'; + /** * The attribute we should generate the subject id from. * diff --git a/modules/saml/src/Auth/Source/SP.php b/modules/saml/src/Auth/Source/SP.php index 756d0668e6..34c6e5666f 100644 --- a/modules/saml/src/Auth/Source/SP.php +++ b/modules/saml/src/Auth/Source/SP.php @@ -448,6 +448,7 @@ private function getSLOEndpoints(): array return $endpoints; } + /** * Get the DiscoveryResponse endpoint available for a given local SP. */ @@ -461,6 +462,7 @@ private function getDiscoveryResponseEndpoints(): array ] ]; } + /** * Determine if the Request Initiator Protocol is enabled * diff --git a/modules/saml/src/BaseNameIDGenerator.php b/modules/saml/src/BaseNameIDGenerator.php index c0206fd806..94688527d0 100644 --- a/modules/saml/src/BaseNameIDGenerator.php +++ b/modules/saml/src/BaseNameIDGenerator.php @@ -27,7 +27,6 @@ abstract class BaseNameIDGenerator extends ProcessingFilter */ private string|bool $nameQualifier; - /** * What SPNameQualifier should be used. * Can be one of: @@ -39,7 +38,6 @@ abstract class BaseNameIDGenerator extends ProcessingFilter */ private string|bool $spNameQualifier; - /** * The format of this NameID. * diff --git a/modules/saml/src/Controller/Exception.php b/modules/saml/src/Controller/Exception.php index 39d112f8a9..0da8dcba0c 100644 --- a/modules/saml/src/Controller/Exception.php +++ b/modules/saml/src/Controller/Exception.php @@ -4,7 +4,8 @@ namespace SimpleSAML\Module\saml\Controller; -use SimpleSAML\{Configuration, Logger}; +use SimpleSAML\Configuration; +use SimpleSAML\Logger; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; diff --git a/modules/saml/src/Controller/Metadata.php b/modules/saml/src/Controller/Metadata.php index 8bb14ab93f..e9766dea97 100644 --- a/modules/saml/src/Controller/Metadata.php +++ b/modules/saml/src/Controller/Metadata.php @@ -31,6 +31,7 @@ class Metadata /** @var \SimpleSAML\Metadata\MetaDataStorageHandler */ protected MetadataStorageHandler $mdHandler; + /** * Controller constructor. * @@ -45,6 +46,7 @@ public function __construct( $this->mdHandler = MetaDataStorageHandler::getMetadataHandler(); } + /** * Inject the \SimpleSAML\Utils\Auth dependency. * @@ -55,6 +57,7 @@ public function setAuthUtils(Utils\Auth $authUtils): void $this->authUtils = $authUtils; } + /** * Inject the \SimpleSAML\Metadata\MetadataStorageHandler dependency. */ @@ -63,6 +66,7 @@ public function setMetadataStorageHandler(MetadataStorageHandler $mdHandler): vo $this->mdHandler = $mdHandler; } + /** * This endpoint will offer the SAML 2.0 IdP metadata. * diff --git a/modules/saml/src/Controller/Proxy.php b/modules/saml/src/Controller/Proxy.php index 9b726c907d..73ff5c5903 100644 --- a/modules/saml/src/Controller/Proxy.php +++ b/modules/saml/src/Controller/Proxy.php @@ -14,7 +14,8 @@ use SimpleSAML\Module\saml\Auth\Source\SP; use SimpleSAML\Module\saml\Error\NoAvailableIDP; use SimpleSAML\XHTML\Template; -use Symfony\Component\HttpFoundation\{Request, Response}; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; /** * Controller class for the saml module. diff --git a/modules/saml/src/Controller/ServiceProvider.php b/modules/saml/src/Controller/ServiceProvider.php index d79673b331..91b2c38e2e 100644 --- a/modules/saml/src/Controller/ServiceProvider.php +++ b/modules/saml/src/Controller/ServiceProvider.php @@ -30,7 +30,8 @@ use SimpleSAML\Store\StoreFactory; use SimpleSAML\Utils; use SimpleSAML\XHTML\Template; -use Symfony\Component\HttpFoundation\{Request, Response}; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; use function array_merge; use function count; @@ -65,8 +66,8 @@ class ServiceProvider * * It initializes the global configuration for the controllers implemented here. * - * @param Configuration $config The configuration to use by the controllers. - * @param Session $session The Session to use by the controllers. + * @param \SimpleSAML\Configuration $config The configuration to use by the controllers. + * @param \SimpleSAML\Session $session The Session to use by the controllers. */ public function __construct( protected Configuration $config, @@ -98,15 +99,15 @@ public function setAuthUtils(Utils\Auth $authUtils): void } - /** - * Start single sign-on for an SP identified with the specified Authsource ID - * - * @param \Symfony\Component\HttpFoundation\Request $request - * @param string $sourceId - * - * @return \SimpleSAML\HTTP\RunnableResponse - * @throws Error\Exception - */ + /** + * Start single sign-on for an SP identified with the specified Authsource ID + * + * @param \Symfony\Component\HttpFoundation\Request $request + * @param string $sourceId + * + * @return \SimpleSAML\HTTP\RunnableResponse + * @throws \SimpleSAML\Error\Exception + */ public function login(Request $request, string $sourceId): RunnableResponse { // Initialize all the dependencies @@ -125,15 +126,16 @@ public function login(Request $request, string $sourceId): RunnableResponse return new RunnableResponse([$httpUtils, 'redirectTrustedURL'], [$returnTo]); } + /** - * @param Request $request - * @param Auth\Simple $authSource - * @param Auth\Source $spSource - * @param Utils\HTTP $httpUtils + * @param \Symfony\Component\HttpFoundation\Request $request + * @param \SimpleSAML\Auth\Simple $authSource + * @param \SimpleSAML\Auth\Source $spSource + * @param \SimpleSAML\Utils\HTTP $httpUtils * * @return string * @throws \SimpleSAML\Error\BadRequest - * @throws Error\Exception + * @throws \SimpleSAML\Error\Exception */ protected function loginHandler( Request $request, diff --git a/modules/saml/src/IdP/SAML2.php b/modules/saml/src/IdP/SAML2.php index 72c15ae52c..a850b91c33 100644 --- a/modules/saml/src/IdP/SAML2.php +++ b/modules/saml/src/IdP/SAML2.php @@ -761,7 +761,7 @@ public static function getAssociationConfig(IdP $idp, array $association): Confi * Retrieve the metadata of a hosted SAML 2 IdP. * * @param string $entityid The entity ID of the hosted SAML 2 IdP whose metadata we want. - * @param MetaDataStorageHandler|null $handler Optionally the metadata storage to use, + * @param \SimpleSAML\Metadata\MetaDataStorageHandler|null $handler Optionally the metadata storage to use, * if omitted the configured handler will be used. * * @return array @@ -1267,6 +1267,7 @@ private static function buildAssertion( return $a; } + /** * Helper for buildAssertion to decide on an NameID to set */ @@ -1328,6 +1329,7 @@ private static function generateNameId( return $nameId; } + /** * Encrypt an assertion. * diff --git a/modules/saml/src/IdP/SQLNameID.php b/modules/saml/src/IdP/SQLNameID.php index 6fbee905d8..dcbf9a3783 100644 --- a/modules/saml/src/IdP/SQLNameID.php +++ b/modules/saml/src/IdP/SQLNameID.php @@ -23,7 +23,9 @@ class SQLNameID { public const TABLE_VERSION = 1; + public const DEFAULT_TABLE_PREFIX = ''; + public const TABLE_SUFFIX = '_saml_PersistentNameID'; @@ -82,6 +84,7 @@ private static function tableName(array $config = []): string return $table; } + /** * @param array $config */ diff --git a/modules/saml/src/SP/LogoutStore.php b/modules/saml/src/SP/LogoutStore.php index e5a990cc7f..1ebe671861 100644 --- a/modules/saml/src/SP/LogoutStore.php +++ b/modules/saml/src/SP/LogoutStore.php @@ -52,9 +52,11 @@ private static function createLogoutTable(Store\SQLStore $store): void * NOTE: We get the name of the index by looking for the only unique index with a default name. */ $update = [ + // phpcs:disable Generic.Files.LineLength.TooLong 'ALTER TABLE ' . $store->prefix . '_saml_LogoutStore DROP INDEX IF EXISTS SELECT CONSTRAINT_NAME ' . 'FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME=' . $store->prefix . '_saml_LogoutStore ' . 'AND CONSTRAINT_NAME LIKE \'UQ__%"\'', + // phpcs:enable Generic.Files.LineLength.TooLong 'ALTER TABLE ' . $store->prefix . '_saml_LogoutStore ADD CONSTRAINT _authSource ' . 'PRIMARY KEY CLUSTERED (_authSource, _nameId, _sessionIndex)', ]; From 126dfb49016161b7f075ffa3cd8073e2131be294 Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Fri, 10 Oct 2025 17:49:25 +0200 Subject: [PATCH 398/532] Update doc-block to match behaviour (#2525) --- src/SimpleSAML/Utils/HTTP.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/SimpleSAML/Utils/HTTP.php b/src/SimpleSAML/Utils/HTTP.php index ba8268f0b4..7b5bb31c07 100644 --- a/src/SimpleSAML/Utils/HTTP.php +++ b/src/SimpleSAML/Utils/HTTP.php @@ -200,10 +200,7 @@ public function isValidURL(string $url): bool /** - * This function redirects the user to the specified address. - * - * This function will use the "HTTP 303 See Other" redirection if the current request used the POST method and the - * HTTP version is 1.1. Otherwise, a "HTTP 302 Found" redirection will be used. + * This function redirects the user to the specified address using the "HTTP 303 See Other" redirection. * * The function will also generate a simple web page with a clickable link to the target page. * From ff0d4f0a283c83a07c6688497dd24b1d399d7d01 Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Fri, 10 Oct 2025 17:51:58 +0200 Subject: [PATCH 399/532] Update .github/ISSUE_TEMPLATE/bug_report.md to match master (#2527) --- .github/ISSUE_TEMPLATE/bug_report.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 9e6459bfce..79e72a1409 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -6,6 +6,13 @@ about: Create a report to help us improve # **Help us to keep this issue-tracker clean! For questions or support, please refer to our [mailing lists](https://simplesamlphp.org/lists)** +**Specifics of your environment** +1. Are you acting as SP/IdP/proxy? +2. SimpleSAMLphp: What version are you using? +3. PHP: What version are you using? +4. Platform: unix or Windows? +5. Webserver: Apache/Nginx/ISS? + **Describe the bug** A clear and concise description of what the bug is. From ea11be4ab7ec6042abdb2d1ad9e654c4a3c0d227 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 10 Oct 2025 17:57:57 +0200 Subject: [PATCH 400/532] Fix markdown --- docs/simplesamlphp-changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 59b1fe3b8e..4249e2f176 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -11,7 +11,7 @@ Released TBD - November 2025 - as soon as Symfony 7.4 is released `authorize` -- Add entityID based filtering (simplesamlphp/simplesamlphp-module-authorize#30) (v1.7.0) +* Add entityID based filtering (simplesamlphp/simplesamlphp-module-authorize#30) (v1.7.0) ## Version 2.4.3 From ab8cd56df4b52b7d3e999955755355b0c43e0e53 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 10 Oct 2025 22:41:53 +0200 Subject: [PATCH 401/532] Replace direct use of global variable --- modules/saml/src/IdP/SAML2.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/saml/src/IdP/SAML2.php b/modules/saml/src/IdP/SAML2.php index a850b91c33..249121ad75 100644 --- a/modules/saml/src/IdP/SAML2.php +++ b/modules/saml/src/IdP/SAML2.php @@ -397,8 +397,8 @@ public static function receiveAuthnRequest(IdP $idp): void ); } - if (isset($_REQUEST['username'])) { - $username = (string) $_REQUEST['username']; + if ($request->query->has('username')) { + $username = $request->query->get('username'); } $issuer = $request->getIssuer(); From 49b02a58e0c02b8ef9f18e12eae0fe6a1a8f4f0a Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 13 Oct 2025 19:20:17 +0200 Subject: [PATCH 402/532] Bump saml2-lib --- composer.json | 8 +- composer.lock | 179 ++++++++++++++++-------------- src/SimpleSAML/XHTML/Template.php | 1 - 3 files changed, 99 insertions(+), 89 deletions(-) diff --git a/composer.json b/composer.json index 42755c3406..bcedb8ee87 100644 --- a/composer.json +++ b/composer.json @@ -63,11 +63,11 @@ "psr/log": "^3.0", "simplesamlphp/assert": "^1.8", "simplesamlphp/composer-module-installer": "^1.4", - "simplesamlphp/saml2": "^5.0.0", - "simplesamlphp/saml2-legacy": "^4.18.1", + "simplesamlphp/saml2": "^5.1.0-rc1", + "simplesamlphp/saml2-legacy": "^4.19.0", "simplesamlphp/simplesamlphp-assets-base": "~2.5.0", - "simplesamlphp/xml-common": "^1.24.2", - "simplesamlphp/xml-security": "^1.7", + "simplesamlphp/xml-common": "^2.0.3", + "simplesamlphp/xml-security": "^2.0.3", "symfony/cache": "~7.3.0", "symfony/config": "~7.3.0", "symfony/console": "~7.3.0", diff --git a/composer.lock b/composer.lock index c0feedbcb2..f8eb5d8f47 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9f6de1f16b1457f3c7b3446c4ba2b9fb", + "content-hash": "637e8ae172a533cdd10c92a6f7dbc0ca", "packages": [ { "name": "gettext/gettext", @@ -231,16 +231,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.7.1", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16" + "reference": "21dc724a0583619cd1652f673303492272778051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16", - "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", "shasum": "" }, "require": { @@ -256,7 +256,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -327,7 +327,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.1" + "source": "https://github.com/guzzle/psr7/tree/2.8.0" }, "funding": [ { @@ -343,7 +343,7 @@ "type": "tidelift" } ], - "time": "2025-03-27T12:30:47+00:00" + "time": "2025-08-23T21:21:41+00:00" }, { "name": "nyholm/psr7", @@ -951,16 +951,16 @@ }, { "name": "simplesamlphp/assert", - "version": "v1.8.2", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/assert.git", - "reference": "b551f50399540172f387d97b2e7246e6c352154d" + "reference": "13fe96d9f10ed340bc4fe11e03fed01c6dab8470" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/b551f50399540172f387d97b2e7246e6c352154d", - "reference": "b551f50399540172f387d97b2e7246e6c352154d", + "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/13fe96d9f10ed340bc4fe11e03fed01c6dab8470", + "reference": "13fe96d9f10ed340bc4fe11e03fed01c6dab8470", "shasum": "" }, "require": { @@ -968,18 +968,18 @@ "ext-filter": "*", "ext-pcre": "*", "ext-spl": "*", - "guzzlehttp/psr7": "~2.7.1", - "php": "^8.1", + "guzzlehttp/psr7": "~2.8.0", + "php": "^8.2", "webmozart/assert": "~1.11.0" }, "require-dev": { "ext-intl": "*", - "simplesamlphp/simplesamlphp-test-framework": "~1.9.2" + "simplesamlphp/simplesamlphp-test-framework": "~1.10.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "v1.1.x-dev" + "dev-master": "v1.10.x-dev" } }, "autoload": { @@ -1004,9 +1004,9 @@ "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments", "support": { "issues": "https://github.com/simplesamlphp/assert/issues", - "source": "https://github.com/simplesamlphp/assert/tree/v1.8.2" + "source": "https://github.com/simplesamlphp/assert/tree/v1.9.0" }, - "time": "2025-06-28T12:57:30+00:00" + "time": "2025-09-17T08:56:19+00:00" }, { "name": "simplesamlphp/composer-module-installer", @@ -1095,49 +1095,49 @@ }, { "name": "simplesamlphp/saml2", - "version": "v5.0.1", + "version": "v5.1.0-rc1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "9c0040881eec1d9447dcc5a043d91450e62f81f4" + "reference": "7fef41cf1251003dfd32a43826f1c08ec8e3400a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/9c0040881eec1d9447dcc5a043d91450e62f81f4", - "reference": "9c0040881eec1d9447dcc5a043d91450e62f81f4", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/7fef41cf1251003dfd32a43826f1c08ec8e3400a", + "reference": "7fef41cf1251003dfd32a43826f1c08ec8e3400a", "shasum": "" }, "require": { "ext-date": "*", "ext-dom": "*", "ext-filter": "*", - "ext-libxml": "*", "ext-openssl": "*", "ext-pcre": "*", "ext-zlib": "*", - "nyholm/psr7": "^1.8", - "php": "^8.1", - "psr/clock": "^1.0", - "psr/http-message": "^2.0", - "psr/log": "^2.0 || ^3.0", - "simplesamlphp/assert": "^1.1", - "simplesamlphp/xml-common": "^1.16", - "simplesamlphp/xml-security": "^1.6", - "simplesamlphp/xml-soap": "^1.3" + "nyholm/psr7": "~1.8.2", + "php": "^8.2", + "psr/clock": "~1.0.0", + "psr/http-message": "~2.0", + "psr/log": "~2.3.1 || ~3.0.0", + "simplesamlphp/assert": "~1.9.0", + "simplesamlphp/xml-common": "~2.0.3", + "simplesamlphp/xml-security": "~2.0.2", + "simplesamlphp/xml-soap": "~2.0.3" }, "require-dev": { - "beste/clock": "^3.0", - "icanhazstring/composer-unused": "^0.9.3", - "mockery/mockery": "^1.6", - "simplesamlphp/simplesamlphp-test-framework": "^1.5" + "beste/clock": "~3.0.0", + "ext-intl": "*", + "mockery/mockery": "~1.6.12", + "simplesamlphp/composer-xmlprovider-installer": "~1.0.2", + "simplesamlphp/simplesamlphp-test-framework": "~1.10.2" }, "suggest": { "ext-soap": "*" }, - "type": "library", + "type": "simplesamlphp-xmlprovider", "extra": { "branch-alias": { - "dev-master": "v5.0.x-dev" + "dev-master": "v6.0.x-dev" } }, "autoload": { @@ -1153,14 +1153,22 @@ { "name": "Andreas Åkre Solberg", "email": "andreas.solberg@uninett.no" + }, + { + "name": "Jaime Pérez Crespo", + "email": "jaime.perez@uninett.no" + }, + { + "name": "Tim van Dijen", + "email": "tvdijen@gmail.com" } ], "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v5.0.1" + "source": "https://github.com/simplesamlphp/saml2/tree/v5.1.0-rc1" }, - "time": "2025-05-13T18:12:37+00:00" + "time": "2025-10-11T10:44:41+00:00" }, { "name": "simplesamlphp/saml2-legacy", @@ -1224,16 +1232,16 @@ }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.5.3", + "version": "v2.5.4", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "c5a83d047c0b0a9bda253a033e095591da7d4eaf" + "reference": "39db948cb8f1b7f8310bef643379530754c2d3f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/c5a83d047c0b0a9bda253a033e095591da7d4eaf", - "reference": "c5a83d047c0b0a9bda253a033e095591da7d4eaf", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/39db948cb8f1b7f8310bef643379530754c2d3f5", + "reference": "39db948cb8f1b7f8310bef643379530754c2d3f5", "shasum": "" }, "require": { @@ -1254,43 +1262,45 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.3" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.4" }, - "time": "2025-09-18T16:58:14+00:00" + "time": "2025-10-12T01:18:09+00:00" }, { "name": "simplesamlphp/xml-common", - "version": "v1.26.0", + "version": "v2.0.3", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "96bb3d04f4cffe7fea2bc2abbbe634edd0bf12f5" + "reference": "a5a457fa0ed4228c1ccec9debe0ea4539e9e63fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/96bb3d04f4cffe7fea2bc2abbbe634edd0bf12f5", - "reference": "96bb3d04f4cffe7fea2bc2abbbe634edd0bf12f5", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/a5a457fa0ed4228c1ccec9debe0ea4539e9e63fb", + "reference": "a5a457fa0ed4228c1ccec9debe0ea4539e9e63fb", "shasum": "" }, "require": { + "ext-bcmath": "*", "ext-date": "*", "ext-dom": "*", "ext-filter": "*", "ext-libxml": "*", "ext-pcre": "*", "ext-spl": "*", - "php": "^8.1", - "simplesamlphp/assert": "~1.8.1", - "simplesamlphp/composer-xmlprovider-installer": "~1.0.2", - "symfony/finder": "~7.3.0" + "php": "^8.2", + "simplesamlphp/assert": "~1.9.0", + "simplesamlphp/composer-xmlprovider-installer": "~1.0.2" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "~1.9.2" + "simplesamlphp/simplesamlphp-test-framework": "~1.10.1" }, "type": "simplesamlphp-xmlprovider", "autoload": { "psr-4": { - "SimpleSAML\\XML\\": "src/" + "SimpleSAML\\XML\\": "src/XML", + "SimpleSAML\\XPath\\": "src/XPath", + "SimpleSAML\\XMLSchema\\": "src/XMLSchema" } }, "notification-url": "https://packagist.org/downloads/", @@ -1317,20 +1327,20 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2025-08-20T21:51:49+00:00" + "time": "2025-09-27T13:42:00+00:00" }, { "name": "simplesamlphp/xml-security", - "version": "v1.12.0", + "version": "v2.0.3", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-security.git", - "reference": "797c984b03e1cd52483538ff9e9b762cfbd942c1" + "reference": "73e1ef385756b7f7ec35ca4fd0bd1b0300f3ba12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/797c984b03e1cd52483538ff9e9b762cfbd942c1", - "reference": "797c984b03e1cd52483538ff9e9b762cfbd942c1", + "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/73e1ef385756b7f7ec35ca4fd0bd1b0300f3ba12", + "reference": "73e1ef385756b7f7ec35ca4fd0bd1b0300f3ba12", "shasum": "" }, "require": { @@ -1340,12 +1350,12 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-spl": "*", - "php": "^8.1", - "simplesamlphp/assert": "^1.6", - "simplesamlphp/xml-common": "^1.22.0" + "php": "^8.2", + "simplesamlphp/assert": "~1.9.0", + "simplesamlphp/xml-common": "~2.0.3" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "^1.8" + "simplesamlphp/simplesamlphp-test-framework": "~1.10.2" }, "type": "simplesamlphp-xmlprovider", "autoload": { @@ -1379,35 +1389,35 @@ ], "support": { "issues": "https://github.com/simplesamlphp/xml-security/issues", - "source": "https://github.com/simplesamlphp/xml-security/tree/v1.12.0" + "source": "https://github.com/simplesamlphp/xml-security/tree/v2.0.3" }, - "time": "2024-12-19T20:20:40+00:00" + "time": "2025-10-02T19:07:52+00:00" }, { "name": "simplesamlphp/xml-soap", - "version": "v1.4.0", + "version": "v2.0.3", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-soap.git", - "reference": "4a773cb58a634f4bdbf2cefa633631d0668bfa0a" + "reference": "0ebd2bf05039a985e6a44ff4f67fc870399f5768" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-soap/zipball/4a773cb58a634f4bdbf2cefa633631d0668bfa0a", - "reference": "4a773cb58a634f4bdbf2cefa633631d0668bfa0a", + "url": "https://api.github.com/repos/simplesamlphp/xml-soap/zipball/0ebd2bf05039a985e6a44ff4f67fc870399f5768", + "reference": "0ebd2bf05039a985e6a44ff4f67fc870399f5768", "shasum": "" }, "require": { "ext-dom": "*", "ext-pcre": "*", - "php": "^8.1", - "simplesamlphp/assert": "^1.0", - "simplesamlphp/xml-common": "^1.13" + "php": "^8.2", + "simplesamlphp/assert": "~1.9.0", + "simplesamlphp/xml-common": "~2.0.3" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "^1.5" + "simplesamlphp/simplesamlphp-test-framework": "~1.10.2" }, - "type": "library", + "type": "simplesamlphp-xmlprovider", "extra": { "branch-alias": { "dev-master": "v2.0.x-dev" @@ -1415,7 +1425,6 @@ }, "autoload": { "psr-4": { - "SimpleSAML\\SOAP\\": "src/", "SimpleSAML\\SOAP11\\": "src/SOAP11/", "SimpleSAML\\SOAP12\\": "src/SOAP12/" } @@ -1433,9 +1442,9 @@ "description": "SimpleSAMLphp library for XML SOAP", "support": { "issues": "https://github.com/simplesamlphp/xml-soap/issues", - "source": "https://github.com/simplesamlphp/xml-soap/tree/v1.4.0" + "source": "https://github.com/simplesamlphp/xml-soap/tree/v2.0.3" }, - "time": "2023-12-13T23:01:48+00:00" + "time": "2025-09-27T13:45:26+00:00" }, { "name": "symfony/cache", @@ -4852,11 +4861,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.30", + "version": "2.1.31", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a4a7f159927983dd4f7c8020ed227d80b7f39d7d", - "reference": "a4a7f159927983dd4f7c8020ed227d80b7f39d7d", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ead89849d879fe203ce9292c6ef5e7e76f867b96", + "reference": "ead89849d879fe203ce9292c6ef5e7e76f867b96", "shasum": "" }, "require": { @@ -4901,7 +4910,7 @@ "type": "github" } ], - "time": "2025-10-02T16:07:52+00:00" + "time": "2025-10-10T14:14:11+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -6938,7 +6947,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": { + "simplesamlphp/saml2": 5 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/src/SimpleSAML/XHTML/Template.php b/src/SimpleSAML/XHTML/Template.php index 997340d779..b0fac429f8 100644 --- a/src/SimpleSAML/XHTML/Template.php +++ b/src/SimpleSAML/XHTML/Template.php @@ -154,7 +154,6 @@ public function __construct( class_exists($controller) && in_array(TemplateControllerInterface::class, class_implements($controller)) ) { - /** @var \SimpleSAML\XHTML\TemplateControllerInterface $this->controller */ $this->controller = new $controller(); } else { throw new Error\ConfigurationError( From 854009c59e64c697ca0fd92d3b729aeff5a5c3f5 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 13 Oct 2025 19:24:43 +0200 Subject: [PATCH 403/532] Remove obsolete tests; the xs:duration values are thoroughly tested by the xml-common library --- tests/src/SimpleSAML/Utils/TimeTest.php | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/tests/src/SimpleSAML/Utils/TimeTest.php b/tests/src/SimpleSAML/Utils/TimeTest.php index 5831648bc5..ba46bc8e74 100644 --- a/tests/src/SimpleSAML/Utils/TimeTest.php +++ b/tests/src/SimpleSAML/Utils/TimeTest.php @@ -7,7 +7,6 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; use ReflectionClass; -use SimpleSAML\Assert\AssertionFailedException; use SimpleSAML\Configuration; use SimpleSAML\Error; use SimpleSAML\Utils; @@ -170,22 +169,5 @@ public function testParseDuration(): void $timeUtils->parseDuration('PT1M'), "Failure testing for 1 minute over current time.", ); - - // test invalid durations - try { - // invalid string - $timeUtils->parseDuration('abcdefg'); - $this->fail("Did not fail with invalid ISO 8601 duration."); - } catch (AssertionFailedException $e) { - $this->assertStringMatchesFormat('\'%s\' is not a valid xs:duration', $e->getMessage()); - } - - try { - // missing T delimiter - $timeUtils->parseDuration('P1S'); - $this->fail("Did not fail with duration missing T delimiter."); - } catch (AssertionFailedException $e) { - $this->assertStringMatchesFormat('\'%s\' is not a valid xs:duration', $e->getMessage()); - } } } From e1693f23f288285d860a117b499d021886a36f49 Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Tue, 14 Oct 2025 10:17:01 +0200 Subject: [PATCH 404/532] Adjust path in comment (#2531) --- config/authsources.php.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/authsources.php.dist b/config/authsources.php.dist index cdde34d65b..15dcfc759a 100644 --- a/config/authsources.php.dist +++ b/config/authsources.php.dist @@ -135,7 +135,7 @@ $config = [ /* // This authentication source serves as an example of integration with an // external authentication engine. Take a look at the comment in the beginning - // of modules/exampleauth/lib/Auth/Source/External.php for a description of + // of modules/exampleauth/src/Auth/Source/External.php for a description of // how to adjust it to your own site. 'example-external' => [ 'exampleauth:External', From f5546ab08784f33addbe26a8b48d735f31757a41 Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Tue, 14 Oct 2025 19:22:51 +0200 Subject: [PATCH 405/532] Equalize default value for 'headers.security' between master and v2.5 (#2534) --- config/config.php.dist | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/config/config.php.dist b/config/config.php.dist index 1263367df2..8bb0d34f65 100644 --- a/config/config.php.dist +++ b/config/config.php.dist @@ -281,7 +281,17 @@ $config = [ * Whenever you change any of these headers, make sure to validate your config by running your * hostname through a security-test like https://en.internet.nl 'headers.security' => [ - 'Content-Security-Policy' => "default-src 'none'; frame-ancestors 'self'; object-src 'none'; script-src 'self'; style-src 'self'; font-src 'self'; connect-src 'self'; img-src 'self' data:; base-uri 'none'", + 'Content-Security-Policy' => + "default-src 'none'; " . + "frame-ancestors 'self'; " . + "object-src 'none'; " . + "script-src 'self'; " . + "style-src 'self'; " . + "font-src 'self'; " . + "connect-src 'self'; " . + "media-src data:; " . + "img-src 'self' data:; " . + "base-uri 'none'", 'X-Frame-Options' => 'SAMEORIGIN', 'X-Content-Type-Options' => 'nosniff', 'Referrer-Policy' => 'origin-when-cross-origin', From 78ef5adfa7feaba83fd4c320eff33b3916b5eb8b Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Tue, 14 Oct 2025 21:22:09 +0200 Subject: [PATCH 406/532] Normalize default modules between master and v25 (#2537) --- config/config.php.dist | 6 ++---- src/SimpleSAML/Module.php | 1 + 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/config/config.php.dist b/config/config.php.dist index 8bb0d34f65..a93d3f993e 100644 --- a/config/config.php.dist +++ b/config/config.php.dist @@ -559,19 +559,17 @@ $config = [ ***********/ /* - * Configuration for enabling/disabling modules. By default the 'core', 'admin' and 'saml' modules are enabled. + * Configuration for enabling/disabling modules. By default, the 'core', 'admin' and 'saml' modules are enabled. * * Example: * * 'module.enable' => [ * 'exampleauth' => true, // Setting to TRUE enables. * 'consent' => false, // Setting to FALSE disables. - * 'core' => null, // Unset or NULL uses default. + * 'core' => null, // Unset or NULL uses default from \SimpleSAML\Module::$core_modules. * ], */ - 'module.enable' => [ - 'exampleauth' => false, 'core' => true, 'admin' => true, 'saml' => true, diff --git a/src/SimpleSAML/Module.php b/src/SimpleSAML/Module.php index ab1688f1d4..92cd587986 100644 --- a/src/SimpleSAML/Module.php +++ b/src/SimpleSAML/Module.php @@ -102,6 +102,7 @@ class Module */ public static array $core_modules = [ 'core' => true, + 'admin' => true, 'saml' => true, ]; From 9b81101bc933585c39d91bd8a2d73d74a3227712 Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Tue, 14 Oct 2025 21:27:10 +0200 Subject: [PATCH 407/532] Use core modules as default in Module class (#2539) --- src/SimpleSAML/Module.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SimpleSAML/Module.php b/src/SimpleSAML/Module.php index 92cd587986..249b7961db 100644 --- a/src/SimpleSAML/Module.php +++ b/src/SimpleSAML/Module.php @@ -576,7 +576,7 @@ public static function getModuleHooks(string $module): array public static function callHooks(string $hook, mixed &$data = null): void { $modules = self::getModules(); - $config = Configuration::getOptionalConfig()->getOptionalArray('module.enable', []); + $config = Configuration::getOptionalConfig()->getOptionalArray('module.enable', self::$core_modules); sort($modules); foreach ($modules as $module) { if (!self::isModuleEnabledWithConf($module, $config)) { From eccec03cbdfd61fc6a140ef790d17255c8863f5a Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 15 Oct 2025 13:35:40 +0200 Subject: [PATCH 408/532] Revert "Replace direct use of global variable" This reverts commit ccc6e6218847d4d5e9988b4cdd1985d7b454ac71. --- modules/saml/src/IdP/SAML2.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/saml/src/IdP/SAML2.php b/modules/saml/src/IdP/SAML2.php index 249121ad75..a850b91c33 100644 --- a/modules/saml/src/IdP/SAML2.php +++ b/modules/saml/src/IdP/SAML2.php @@ -397,8 +397,8 @@ public static function receiveAuthnRequest(IdP $idp): void ); } - if ($request->query->has('username')) { - $username = $request->query->get('username'); + if (isset($_REQUEST['username'])) { + $username = (string) $_REQUEST['username']; } $issuer = $request->getIssuer(); From 183add0536ea8c97cdec04d5eead70306aac126a Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Fri, 17 Oct 2025 10:32:44 +0200 Subject: [PATCH 409/532] Equalize some docs with master (#2541) --- docs/simplesamlphp-advancedfeatures.md | 10 +++++----- docs/simplesamlphp-changelog-1.x.md | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/docs/simplesamlphp-advancedfeatures.md b/docs/simplesamlphp-advancedfeatures.md index 47430e9878..3b00fc13d9 100644 --- a/docs/simplesamlphp-advancedfeatures.md +++ b/docs/simplesamlphp-advancedfeatures.md @@ -116,23 +116,23 @@ class CustomCode * @param \SimpleSAML\Session $session The session to approve/reject * @param bool $init true if called during session init. */ - public static function checkSession(\SimpleSAML\Session $session, bool $init = false) + public static function checkSession(\SimpleSAML\Session $session, bool $init = false): bool { $authority = "default-sp"; - if( $init ) { + if ($init) { // init can not fail // return value is ignored return true; } - $ad = $session->getAuthData($authority,"Attributes"); - if( !$ad ) { + $ad = $session->getAuthData($authority, "Attributes"); + if (empty($ad)) { return true; } $uid = $ad["uid"]; - if( in_array("badboy@localhost.localdomain",$uid)) { + if (in_array("badboy@localhost.localdomain", $uid)) { // drop the session return false; } diff --git a/docs/simplesamlphp-changelog-1.x.md b/docs/simplesamlphp-changelog-1.x.md index d372b377e9..6fad58eb04 100644 --- a/docs/simplesamlphp-changelog-1.x.md +++ b/docs/simplesamlphp-changelog-1.x.md @@ -5,6 +5,24 @@ This document lists the changes between versions of SimpleSAMLphp. See the upgrade notes for specific information about upgrading. +## Version 1.19.8 + +Released 2-3-2023 + +* Dependencies have been bumped (CVE-2022-24894) + +## Version 1.19.7 + +Released 5-12-2022 + +* Backported fix to error report page (#1637) +* Many doc fixes +* Fixed the handling of SAML AttributeQuery and SOAP-binding (#314 @ saml2) +* Fixed serialization of complex AttributeValue structures +* Bump composer + npm dependencies (includes a fix for CVE-2022-39261) +* Many updated translations +* Handle ETag/If-None-Match logic (#1672 + #1673) + ## Version 1.19.6 Released 2022-07-01 From 90f1765d0866c365fe8cff0dfeb1f18f99ebf39f Mon Sep 17 00:00:00 2001 From: Thijs Kinkhorst Date: Fri, 17 Oct 2025 14:56:36 +0000 Subject: [PATCH 410/532] Update legacy urls to current ones --- docs/simplesamlphp-idp-more.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/simplesamlphp-idp-more.md b/docs/simplesamlphp-idp-more.md index 28181dd31f..5068730a87 100644 --- a/docs/simplesamlphp-idp-more.md +++ b/docs/simplesamlphp-idp-more.md @@ -35,11 +35,11 @@ If you do not want to start the SSO flow at the SP, you may use the IdP-first se Here is an example of such a URL: -`https://idp.example.org/simplesaml/saml2/idp/SSOService.php?spentityid=urn:mace:feide.no:someservice` +`https://idp.example.org/simplesaml/saml2/idp/singleSignOnService?spentityid=urn:mace:feide.no:someservice` You can also add a `RelayState` parameter to the IdP-first URL: -`https://idp.example.org/simplesaml/saml2/idp/SSOService.php?spentityid=urn:mace:feide.no:someservice&RelayState=https://sp.example.org/somepage` +`https://idp.example.org/simplesaml/saml2/idp/singleSignOnService?spentityid=urn:mace:feide.no:someservice&RelayState=https://sp.example.org/somepage` The `RelayState` parameter is often used to carry the URL the SP should redirect to after authentication. It is also possible to specify the Assertion Consumer URL with the `ConsumerURL` parameter. @@ -53,7 +53,7 @@ IdP-initiated logout IdP-initiated logout can be initiated by visiting the URL: -`https://idp.example.org/simplesaml/saml2/idp/SingleLogoutService.php?ReturnTo=` +`https://idp.example.org/simplesaml/saml2/idp/initSingleLogout?ReturnTo=` It will send a logout request to each SP, and afterwards return the user to the URL specified in the `ReturnTo` parameter. Bear in mind that IdPs might disallow redirecting to URLs other than those of their own for security reasons, so in order to get the redirection to work, it might be necessary to ask the IdP to whitelist the URL we are planning to redirect to. From 9a52ca42fafaf5b00371b650cbaf19b742c3f8b8 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Tue, 21 Oct 2025 10:04:37 +1000 Subject: [PATCH 411/532] docs: maybe suggest showerrors=false to hide backtraces? (#2547) * docs: maybe suggest showerrors=false to hide backtraces? * yay for lint. those \n\n are killers --- docs/simplesamlphp-install.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/simplesamlphp-install.md b/docs/simplesamlphp-install.md index eba882de27..59f6b1ac06 100644 --- a/docs/simplesamlphp-install.md +++ b/docs/simplesamlphp-install.md @@ -279,6 +279,13 @@ Here is an example of the configuration option: You can see [a list of Supported Timezones at php.net](http://php.net/manual/en/timezones.php). +You might consider setting showerrors to `false` to hide error +descriptions and backtraces from the browser. + +```php +'showerrors' => false, +``` + ## Configuring PHP ### Sending e-mails from PHP From d4e815b4f63f7771b2abddbd1044fa850d3917fa Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 21 Oct 2025 23:22:15 +0200 Subject: [PATCH 412/532] Start testing on PHP 8.5 --- .github/workflows/php.yml | 18 +- composer.json | 14 +- composer.lock | 1687 +++++++++++++++++++++++++++++++++---- 3 files changed, 1522 insertions(+), 197 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 82df84cee8..b19be4eee2 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -18,9 +18,9 @@ jobs: strategy: fail-fast: false matrix: - php-version: ['8.2', '8.3', '8.4'] + php-version: ['8.2', '8.3', '8.4', '8.5'] - uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml@v1.9.2 + uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml@v1.10.3 with: php-version: ${{ matrix.php-version }} @@ -29,7 +29,7 @@ jobs: strategy: fail-fast: false - uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml@v1.9.2 + uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml@v1.10.3 with: enable_eslinter: true enable_jsonlinter: true @@ -44,7 +44,7 @@ jobs: fail-fast: false matrix: operating-system: [ubuntu-latest] - php-versions: ['8.2', '8.3', '8.4'] + php-versions: ['8.2', '8.3', '8.4', '8.5'] steps: - name: Setup PHP, with composer and extensions @@ -90,15 +90,15 @@ jobs: run: composer install --no-progress --prefer-dist --optimize-autoloader - name: Run unit tests with coverage - if: ${{ matrix.php-versions == '8.2' }} + if: ${{ matrix.php-versions == '8.5' }} run: ./vendor/bin/phpunit - name: Run unit tests (no coverage) - if: ${{ matrix.php-versions != '8.2' }} + if: ${{ matrix.php-versions != '8.5' }} run: ./vendor/bin/phpunit --no-coverage - name: Save coverage data - if: ${{ matrix.php-versions == '8.2' }} + if: ${{ matrix.php-versions == '8.5' }} uses: actions/upload-artifact@v4 with: name: coverage-data @@ -112,7 +112,7 @@ jobs: fail-fast: true matrix: operating-system: [windows-latest] - php-versions: ['8.2', '8.3', '8.4'] + php-versions: ['8.2', '8.3', '8.4', '8.5'] steps: - name: Setup PHP, with composer and extensions @@ -165,7 +165,7 @@ jobs: # https://github.com/shivammathur/setup-php uses: shivammathur/setup-php@v2 with: - php-version: '8.3' + php-version: '8.5' tools: composer, psalm extensions: mbstring, soap, xml coverage: none diff --git a/composer.json b/composer.json index bcedb8ee87..907a6f788c 100644 --- a/composer.json +++ b/composer.json @@ -61,13 +61,13 @@ "gettext/translator": "^1.2", "phpmailer/phpmailer": "^6.10", "psr/log": "^3.0", - "simplesamlphp/assert": "^1.8", - "simplesamlphp/composer-module-installer": "^1.4", + "simplesamlphp/assert": "^1.9", + "simplesamlphp/composer-module-installer": "^1.5", "simplesamlphp/saml2": "^5.1.0-rc1", - "simplesamlphp/saml2-legacy": "^4.19.0", - "simplesamlphp/simplesamlphp-assets-base": "~2.5.0", - "simplesamlphp/xml-common": "^2.0.3", - "simplesamlphp/xml-security": "^2.0.3", + "simplesamlphp/saml2-legacy": "^4.19", + "simplesamlphp/simplesamlphp-assets-base": "~2.5", + "simplesamlphp/xml-common": "^2.0", + "simplesamlphp/xml-security": "^2.0", "symfony/cache": "~7.3.0", "symfony/config": "~7.3.0", "symfony/console": "~7.3.0", @@ -96,7 +96,7 @@ "gettext/php-scanner": "~2.0.1", "mikey179/vfsstream": "~1.6", "predis/predis": "~3.2.0", - "simplesamlphp/simplesamlphp-test-framework": "~1.10.0", + "simplesamlphp/simplesamlphp-test-framework": "~1.10.3", "symfony/translation": "~7.3.0" }, "suggest": { diff --git a/composer.lock b/composer.lock index f8eb5d8f47..dff153015e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,630 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "637e8ae172a533cdd10c92a6f7dbc0ca", + "content-hash": "b5be919f84270a10d8cb03844e2b1953", "packages": [ + { + "name": "composer/ca-bundle", + "version": "1.5.8", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "719026bb30813accb68271fee7e39552a58e9f65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/719026bb30813accb68271fee7e39552a58e9f65", + "reference": "719026bb30813accb68271fee7e39552a58e9f65", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.5.8" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T18:49:47+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.6.2", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "ba9f089655d4cdd64e762a6044f411ccdaec0076" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ba9f089655d4cdd64e762a6044f411ccdaec0076", + "reference": "ba9f089655d4cdd64e762a6044f411ccdaec0076", + "shasum": "" + }, + "require": { + "composer/pcre": "^2.1 || ^3.1", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.6.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T18:52:43+00:00" + }, + { + "name": "composer/composer", + "version": "2.8.12", + "source": { + "type": "git", + "url": "https://github.com/composer/composer.git", + "reference": "3e38919bc9a2c3c026f2151b5e56d04084ce8f0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/composer/zipball/3e38919bc9a2c3c026f2151b5e56d04084ce8f0b", + "reference": "3e38919bc9a2c3c026f2151b5e56d04084ce8f0b", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.5", + "composer/class-map-generator": "^1.4.0", + "composer/metadata-minifier": "^1.0", + "composer/pcre": "^2.2 || ^3.2", + "composer/semver": "^3.3", + "composer/spdx-licenses": "^1.5.7", + "composer/xdebug-handler": "^2.0.2 || ^3.0.3", + "justinrainbow/json-schema": "^6.5.1", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "react/promise": "^3.3", + "seld/jsonlint": "^1.4", + "seld/phar-utils": "^1.2", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.47 || ^6.4.25 || ^7.1.10", + "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.1.10", + "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.1.10", + "symfony/polyfill-php73": "^1.24", + "symfony/polyfill-php80": "^1.24", + "symfony/polyfill-php81": "^1.24", + "symfony/process": "^5.4.47 || ^6.4.25 || ^7.1.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.11.8", + "phpstan/phpstan-deprecation-rules": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.0", + "phpstan/phpstan-symfony": "^1.4.0", + "symfony/phpunit-bridge": "^6.4.25 || ^7.3.3" + }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives", + "ext-zlib": "Allow gzip compression of HTTP requests" + }, + "bin": [ + "bin/composer" + ], + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] + }, + "branch-alias": { + "dev-main": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\": "src/Composer/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "https://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", + "homepage": "https://getcomposer.org/", + "keywords": [ + "autoload", + "dependency", + "package" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/composer/issues", + "security": "https://github.com/composer/composer/security/policy", + "source": "https://github.com/composer/composer/tree/2.8.12" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-09-19T11:41:59+00:00" + }, + { + "name": "composer/metadata-minifier", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/metadata-minifier.git", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "composer/composer": "^2", + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\MetadataMinifier\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Small utility library that handles metadata minification and expansion.", + "keywords": [ + "composer", + "compression" + ], + "support": { + "issues": "https://github.com/composer/metadata-minifier/issues", + "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-04-07T13:37:33+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T19:15:30+00:00" + }, + { + "name": "composer/spdx-licenses", + "version": "1.5.9", + "source": { + "type": "git", + "url": "https://github.com/composer/spdx-licenses.git", + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/edf364cefe8c43501e21e88110aac10b284c3c9f", + "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Spdx\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "SPDX licenses list and validation library.", + "keywords": [ + "license", + "spdx", + "validator" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/spdx-licenses/issues", + "source": "https://github.com/composer/spdx-licenses/tree/1.5.9" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2025-05-12T21:07:07+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, { "name": "gettext/gettext", "version": "v5.7.3", @@ -345,6 +967,154 @@ ], "time": "2025-08-23T21:21:41+00:00" }, + { + "name": "justinrainbow/json-schema", + "version": "6.6.0", + "source": { + "type": "git", + "url": "https://github.com/jsonrainbow/json-schema.git", + "reference": "68ba7677532803cc0c5900dd5a4d730537f2b2f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/68ba7677532803cc0c5900dd5a4d730537f2b2f3", + "reference": "68ba7677532803cc0c5900dd5a4d730537f2b2f3", + "shasum": "" + }, + "require": { + "ext-json": "*", + "marc-mabe/php-enum": "^4.0", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.3.0", + "json-schema/json-schema-test-suite": "^23.2", + "marc-mabe/php-enum-phpstan": "^2.0", + "phpspec/prophecy": "^1.19", + "phpstan/phpstan": "^1.12", + "phpunit/phpunit": "^8.5" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/jsonrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/6.6.0" + }, + "time": "2025-10-10T11:34:09+00:00" + }, + { + "name": "marc-mabe/php-enum", + "version": "v4.7.2", + "source": { + "type": "git", + "url": "https://github.com/marc-mabe/php-enum.git", + "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/bb426fcdd65c60fb3638ef741e8782508fda7eef", + "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef", + "shasum": "" + }, + "require": { + "ext-reflection": "*", + "php": "^7.1 | ^8.0" + }, + "require-dev": { + "phpbench/phpbench": "^0.16.10 || ^1.0.4", + "phpstan/phpstan": "^1.3.1", + "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11", + "vimeo/psalm": "^4.17.0 | ^5.26.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.2-dev", + "dev-master": "4.7-dev" + } + }, + "autoload": { + "psr-4": { + "MabeEnum\\": "src/" + }, + "classmap": [ + "stubs/Stringable.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Marc Bennewitz", + "email": "dev@mabe.berlin", + "homepage": "https://mabe.berlin/", + "role": "Lead" + } + ], + "description": "Simple and fast implementation of enumerations with native PHP", + "homepage": "https://github.com/marc-mabe/php-enum", + "keywords": [ + "enum", + "enum-map", + "enum-set", + "enumeration", + "enumerator", + "enummap", + "enumset", + "map", + "set", + "type", + "type-hint", + "typehint" + ], + "support": { + "issues": "https://github.com/marc-mabe/php-enum/issues", + "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.2" + }, + "time": "2025-09-14T11:18:39+00:00" + }, { "name": "nyholm/psr7", "version": "1.8.2", @@ -425,16 +1195,16 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.11.1", + "version": "v6.12.0", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "d9e3b36b47f04b497a0164c5a20f92acb4593284" + "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/d9e3b36b47f04b497a0164c5a20f92acb4593284", - "reference": "d9e3b36b47f04b497a0164c5a20f92acb4593284", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/d1ac35d784bf9f5e61b424901d5a014967f15b12", + "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12", "shasum": "" }, "require": { @@ -455,7 +1225,6 @@ }, "suggest": { "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", - "ext-imap": "Needed to support advanced email address parsing according to RFC822", "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", "ext-openssl": "Needed for secure SMTP sending and DKIM signing", "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", @@ -495,7 +1264,7 @@ "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.11.1" + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.12.0" }, "funding": [ { @@ -503,7 +1272,7 @@ "type": "github" } ], - "time": "2025-09-30T11:54:53+00:00" + "time": "2025-10-15T16:49:08+00:00" }, { "name": "psr/cache", @@ -907,6 +1676,79 @@ }, "time": "2019-03-08T08:55:37+00:00" }, + { + "name": "react/promise", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", + "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", + "shasum": "" + }, + "require": { + "php": ">=7.1.0" + }, + "require-dev": { + "phpstan/phpstan": "1.12.28 || 1.4.10", + "phpunit/phpunit": "^9.6 || ^7.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2025-08-19T18:57:03+00:00" + }, { "name": "robrichards/xmlseclibs", "version": "3.1.3", @@ -933,34 +1775,207 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "BSD-3-Clause" + ], + "description": "A PHP library for XML Security", + "homepage": "https://github.com/robrichards/xmlseclibs", + "keywords": [ + "security", + "signature", + "xml", + "xmldsig" + ], + "support": { + "issues": "https://github.com/robrichards/xmlseclibs/issues", + "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.3" + }, + "time": "2024-11-20T21:13:56+00:00" + }, + { + "name": "seld/jsonlint", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2", + "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "support": { + "issues": "https://github.com/Seldaek/jsonlint/issues", + "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" + } + ], + "time": "2024-07-11T14:55:45+00:00" + }, + { + "name": "seld/phar-utils", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\PharUtils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "PHAR file format utilities, for when PHP phars you up", + "keywords": [ + "phar" + ], + "support": { + "issues": "https://github.com/Seldaek/phar-utils/issues", + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" + }, + "time": "2022-08-31T10:31:18+00:00" + }, + { + "name": "seld/signal-handler", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" ], - "description": "A PHP library for XML Security", - "homepage": "https://github.com/robrichards/xmlseclibs", + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", "keywords": [ - "security", - "signature", - "xml", - "xmldsig" + "posix", + "sigint", + "signal", + "sigterm", + "unix" ], "support": { - "issues": "https://github.com/robrichards/xmlseclibs/issues", - "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.3" + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" }, - "time": "2024-11-20T21:13:56+00:00" + "time": "2023-09-03T09:24:00+00:00" }, { "name": "simplesamlphp/assert", - "version": "v1.9.0", + "version": "v1.9.1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/assert.git", - "reference": "13fe96d9f10ed340bc4fe11e03fed01c6dab8470" + "reference": "d0e7b9c12e4f613c6f32e1242cc08838cdeb39d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/13fe96d9f10ed340bc4fe11e03fed01c6dab8470", - "reference": "13fe96d9f10ed340bc4fe11e03fed01c6dab8470", + "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/d0e7b9c12e4f613c6f32e1242cc08838cdeb39d3", + "reference": "d0e7b9c12e4f613c6f32e1242cc08838cdeb39d3", "shasum": "" }, "require": { @@ -970,7 +1985,7 @@ "ext-spl": "*", "guzzlehttp/psr7": "~2.8.0", "php": "^8.2", - "webmozart/assert": "~1.11.0" + "webmozart/assert": "~1.12.0" }, "require-dev": { "ext-intl": "*", @@ -1004,32 +2019,33 @@ "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments", "support": { "issues": "https://github.com/simplesamlphp/assert/issues", - "source": "https://github.com/simplesamlphp/assert/tree/v1.9.0" + "source": "https://github.com/simplesamlphp/assert/tree/v1.9.1" }, - "time": "2025-09-17T08:56:19+00:00" + "time": "2025-10-20T22:29:33+00:00" }, { "name": "simplesamlphp/composer-module-installer", - "version": "v1.4.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/composer-module-installer.git", - "reference": "edb2155d200e2a208816d06f42cfa78bfd9e7cf4" + "reference": "b843bcb4b464c22348d9d05bc3ec247e2b5e2489" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/composer-module-installer/zipball/edb2155d200e2a208816d06f42cfa78bfd9e7cf4", - "reference": "edb2155d200e2a208816d06f42cfa78bfd9e7cf4", + "url": "https://api.github.com/repos/simplesamlphp/composer-module-installer/zipball/b843bcb4b464c22348d9d05bc3ec247e2b5e2489", + "reference": "b843bcb4b464c22348d9d05bc3ec247e2b5e2489", "shasum": "" }, "require": { - "composer-plugin-api": "^2.6", - "php": "^8.1", - "simplesamlphp/assert": "^1.6" + "composer-plugin-api": "~2.6.0", + "composer/composer": "~2.8.12", + "ext-mbstring": "*", + "php": "^8.2", + "simplesamlphp/assert": "~1.9.1" }, "require-dev": { - "composer/composer": "^2.8.3", - "simplesamlphp/simplesamlphp-test-framework": "^1.8.0" + "simplesamlphp/simplesamlphp-test-framework": "~1.10.2" }, "type": "composer-plugin", "extra": { @@ -1047,9 +2063,9 @@ "description": "A Composer plugin that allows installing SimpleSAMLphp modules through Composer.", "support": { "issues": "https://github.com/simplesamlphp/composer-module-installer/issues", - "source": "https://github.com/simplesamlphp/composer-module-installer/tree/v1.4.0" + "source": "https://github.com/simplesamlphp/composer-module-installer/tree/v1.5.0" }, - "time": "2024-12-08T16:57:03+00:00" + "time": "2025-10-20T21:51:01+00:00" }, { "name": "simplesamlphp/composer-xmlprovider-installer", @@ -1099,12 +2115,12 @@ "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "7fef41cf1251003dfd32a43826f1c08ec8e3400a" + "reference": "6e3c2fed39884212e88c445a959fd12b12fc2c1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/7fef41cf1251003dfd32a43826f1c08ec8e3400a", - "reference": "7fef41cf1251003dfd32a43826f1c08ec8e3400a", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/6e3c2fed39884212e88c445a959fd12b12fc2c1e", + "reference": "6e3c2fed39884212e88c445a959fd12b12fc2c1e", "shasum": "" }, "require": { @@ -1168,7 +2184,7 @@ "issues": "https://github.com/simplesamlphp/saml2/issues", "source": "https://github.com/simplesamlphp/saml2/tree/v5.1.0-rc1" }, - "time": "2025-10-11T10:44:41+00:00" + "time": "2025-10-17T13:51:34+00:00" }, { "name": "simplesamlphp/saml2-legacy", @@ -1232,16 +2248,16 @@ }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.5.4", + "version": "v2.5.7", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "39db948cb8f1b7f8310bef643379530754c2d3f5" + "reference": "b6d9ce8749884b6197a1a41f80512cf6767b035b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/39db948cb8f1b7f8310bef643379530754c2d3f5", - "reference": "39db948cb8f1b7f8310bef643379530754c2d3f5", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/b6d9ce8749884b6197a1a41f80512cf6767b035b", + "reference": "b6d9ce8749884b6197a1a41f80512cf6767b035b", "shasum": "" }, "require": { @@ -1262,9 +2278,9 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.4" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.7" }, - "time": "2025-10-12T01:18:09+00:00" + "time": "2025-10-21T15:44:31+00:00" }, { "name": "simplesamlphp/xml-common", @@ -1331,16 +2347,16 @@ }, { "name": "simplesamlphp/xml-security", - "version": "v2.0.3", + "version": "v2.0.4", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-security.git", - "reference": "73e1ef385756b7f7ec35ca4fd0bd1b0300f3ba12" + "reference": "df14c3091c1015dfee1725c7054e11b6103b11eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/73e1ef385756b7f7ec35ca4fd0bd1b0300f3ba12", - "reference": "73e1ef385756b7f7ec35ca4fd0bd1b0300f3ba12", + "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/df14c3091c1015dfee1725c7054e11b6103b11eb", + "reference": "df14c3091c1015dfee1725c7054e11b6103b11eb", "shasum": "" }, "require": { @@ -1389,9 +2405,9 @@ ], "support": { "issues": "https://github.com/simplesamlphp/xml-security/issues", - "source": "https://github.com/simplesamlphp/xml-security/tree/v2.0.3" + "source": "https://github.com/simplesamlphp/xml-security/tree/v2.0.4" }, - "time": "2025-10-02T19:07:52+00:00" + "time": "2025-10-17T18:35:00+00:00" }, { "name": "simplesamlphp/xml-soap", @@ -2818,15 +3834,252 @@ "description": "Provides access to the localization data of the ICU library", "homepage": "https://symfony.com", "keywords": [ - "i18n", - "icu", - "internationalization", + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "support": { + "source": "https://github.com/symfony/intl/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-08T14:11:30+00:00" + }, + { + "name": "symfony/password-hasher", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/password-hasher.git", + "reference": "31fbe66af859582a20b803f38be96be8accdf2c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/31fbe66af859582a20b803f38be96be8accdf2c3", + "reference": "31fbe66af859582a20b803f38be96be8accdf2c3", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "conflict": { + "symfony/security-core": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PasswordHasher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides password hashing utilities", + "homepage": "https://symfony.com", + "keywords": [ + "hashing", + "password" + ], + "support": { + "source": "https://github.com/symfony/password-hasher/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-02-04T08:22:58+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", "intl", - "l10n", - "localization" + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.3.4" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" }, "funding": [ { @@ -2846,37 +4099,45 @@ "type": "tidelift" } ], - "time": "2025-09-08T14:11:30+00:00" + "time": "2025-06-27T09:58:17+00:00" }, { - "name": "symfony/password-hasher", - "version": "v7.3.0", + "name": "symfony/polyfill-intl-icu", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/password-hasher.git", - "reference": "31fbe66af859582a20b803f38be96be8accdf2c3" + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/31fbe66af859582a20b803f38be96be8accdf2c3", - "reference": "31fbe66af859582a20b803f38be96be8accdf2c3", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", + "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", "shasum": "" }, "require": { - "php": ">=8.2" - }, - "conflict": { - "symfony/security-core": "<6.4" + "php": ">=7.2" }, - "require-dev": { - "symfony/console": "^6.4|^7.0", - "symfony/security-core": "^6.4|^7.0" + "suggest": { + "ext-intl": "For best performance and support of other locales than \"en\"" }, "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\PasswordHasher\\": "" + "Symfony\\Polyfill\\Intl\\Icu\\": "" }, + "classmap": [ + "Resources/stubs" + ], "exclude-from-classmap": [ "/Tests/" ] @@ -2887,22 +4148,26 @@ ], "authors": [ { - "name": "Robin Chalas", - "email": "robin.chalas@gmail.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides password hashing utilities", + "description": "Symfony polyfill for intl's ICU-related data and classes", "homepage": "https://symfony.com", "keywords": [ - "hashing", - "password" + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.3.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0" }, "funding": [ { @@ -2913,35 +4178,36 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-02-04T08:22:58+00:00" + "time": "2025-06-20T22:24:30+00:00" }, { - "name": "symfony/polyfill-ctype", + "name": "symfony/polyfill-intl-normalizer", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { "php": ">=7.2" }, - "provide": { - "ext-ctype": "*" - }, "suggest": { - "ext-ctype": "For best performance" + "ext-intl": "For best performance" }, "type": "library", "extra": { @@ -2955,8 +4221,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2964,24 +4233,26 @@ ], "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for ctype functions", + "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "ctype", + "intl", + "normalizer", "polyfill", - "portable" + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -3004,24 +4275,28 @@ "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-intl-grapheme", + "name": "symfony/polyfill-mbstring", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { - "ext-intl": "For best performance" + "ext-mbstring": "For best performance" }, "type": "library", "extra": { @@ -3035,7 +4310,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + "Symfony\\Polyfill\\Mbstring\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -3052,18 +4327,17 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's grapheme_* functions", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "grapheme", - "intl", + "mbstring", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" }, "funding": [ { @@ -3083,28 +4357,25 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { - "name": "symfony/polyfill-intl-icu", + "name": "symfony/polyfill-php73", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c" + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { "php": ">=7.2" }, - "suggest": { - "ext-intl": "For best performance and support of other locales than \"en\"" - }, "type": "library", "extra": { "thanks": { @@ -3117,13 +4388,10 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Icu\\": "" + "Symfony\\Polyfill\\Php73\\": "" }, "classmap": [ "Resources/stubs" - ], - "exclude-from-classmap": [ - "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3140,18 +4408,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's ICU-related data and classes", + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "icu", - "intl", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" }, "funding": [ { @@ -3171,28 +4437,25 @@ "type": "tidelift" } ], - "time": "2025-06-20T22:24:30+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", + "name": "symfony/polyfill-php80", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { "php": ">=7.2" }, - "suggest": { - "ext-intl": "For best performance" - }, "type": "library", "extra": { "thanks": { @@ -3205,7 +4468,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + "Symfony\\Polyfill\\Php80\\": "" }, "classmap": [ "Resources/stubs" @@ -3216,6 +4479,10 @@ "MIT" ], "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -3225,18 +4492,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "intl", - "normalizer", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" }, "funding": [ { @@ -3256,32 +4521,25 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { - "name": "symfony/polyfill-mbstring", + "name": "symfony/polyfill-php81", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "ext-iconv": "*", "php": ">=7.2" }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, "type": "library", "extra": { "thanks": { @@ -3294,8 +4552,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3311,17 +4572,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "mbstring", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" }, "funding": [ { @@ -3341,7 +4601,7 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", @@ -3423,6 +4683,71 @@ ], "time": "2025-07-08T02:45:35+00:00" }, + { + "name": "symfony/process", + "version": "v7.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b", + "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-11T10:12:26+00:00" + }, { "name": "symfony/routing", "version": "v7.3.4", @@ -4263,28 +5588,28 @@ }, { "name": "webmozart/assert", - "version": "1.11.0", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + "reference": "541057574806f942c94662b817a50f63f7345360" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/541057574806f942c94662b817a50f63f7345360", + "reference": "541057574806f942c94662b817a50f63f7345360", "shasum": "" }, "require": { "ext-ctype": "*", + "ext-date": "*", + "ext-filter": "*", "php": "^7.2 || ^8.0" }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" }, "type": "library", "extra": { @@ -4315,9 +5640,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" + "source": "https://github.com/webmozarts/assert/tree/1.12.0" }, - "time": "2022-06-03T18:03:27+00:00" + "time": "2025-10-20T12:43:39+00:00" } ], "packages-dev": [ @@ -4590,16 +5915,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.6.1", + "version": "v5.6.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2" + "reference": "3a454ca033b9e06b63282ce19562e892747449bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", - "reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb", + "reference": "3a454ca033b9e06b63282ce19562e892747449bb", "shasum": "" }, "require": { @@ -4642,9 +5967,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2" }, - "time": "2025-08-13T20:13:15+00:00" + "time": "2025-10-21T19:32:17+00:00" }, { "name": "phar-io/manifest", @@ -6456,16 +7781,16 @@ }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.10.2", + "version": "v1.10.3", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "41339027be51699193803ba210960dd2d0b09fe0" + "reference": "0571b27731ad4ec90a2350e6a927cb2214ad3a6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/41339027be51699193803ba210960dd2d0b09fe0", - "reference": "41339027be51699193803ba210960dd2d0b09fe0", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/0571b27731ad4ec90a2350e6a927cb2214ad3a6b", + "reference": "0571b27731ad4ec90a2350e6a927cb2214ad3a6b", "shasum": "" }, "require": { @@ -6507,7 +7832,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2025-09-16T19:53:22+00:00" + "time": "2025-10-20T22:31:05+00:00" }, { "name": "slevomat/coding-standard", From 484c85a22db85bf47f6a12a910fd0fa1cd2baf31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ivan=C4=8Di=C4=87?= Date: Thu, 23 Oct 2025 16:23:44 +0200 Subject: [PATCH 413/532] Equalize some more docs with master --- docs/simplesamlphp-install.md | 6 ++-- docs/simplesamlphp-metadata-extensions-rpi.md | 20 +++++------ docs/simplesamlphp-reference-idp-hosted.md | 34 +++++++++++-------- docs/simplesamlphp-reference-sp-remote.md | 2 +- docs/simplesamlphp-sp.md | 4 +-- docs/simplesamlphp-upgrade-notes-2.0.md | 2 ++ 6 files changed, 37 insertions(+), 31 deletions(-) diff --git a/docs/simplesamlphp-install.md b/docs/simplesamlphp-install.md index 59f6b1ac06..64372c3b25 100644 --- a/docs/simplesamlphp-install.md +++ b/docs/simplesamlphp-install.md @@ -407,7 +407,7 @@ As an example, let's see how you can install SimpleSAMLphp in your home director just created in your `public_html` directory. For example, if your home directory is reachable in `https://host.example/~myaccount/`, set the base URL path accordingly: - ```bash + ```php 'baseurlpath' => 'https://host.example/~myaccount/simplesaml/', ``` @@ -437,13 +437,13 @@ Now, we need to make a few configuration changes. First, let's edit `~/public_ht Change the two lines from: ```php -require_once(dirname(_FILE__, 2) . '/lib/_autoload.php'); +require_once(dirname(_FILE__, 2) . '/src/_autoload.php'); ``` to something like: ```php -require_once(dirname(__FILE__, 3) . '/lib/_autoload.php'); +require_once(dirname(__FILE__, 3) . '/src/_autoload.php'); ``` **Warning**: note that this will make upgrading SimpleSAMLphp much more difficult, since you will need to move the diff --git a/docs/simplesamlphp-metadata-extensions-rpi.md b/docs/simplesamlphp-metadata-extensions-rpi.md index 148e53f4fe..a2fa17f01d 100644 --- a/docs/simplesamlphp-metadata-extensions-rpi.md +++ b/docs/simplesamlphp-metadata-extensions-rpi.md @@ -30,16 +30,16 @@ RegistrationInfo Items The configuration is the same for all the different files, and consists of a single directive called `RegistrationInfo`, which **must** be an indexed array with the following options: -`authority` +`RegistrationAuthority` : A string containing an identifier of the authority who has registered this metadata. This parameter is **mandatory**. -`instant` +`RegistrationInstant` : A string containing the instant when the entity or entities where registered by the authority. This parameter is optional, and must be expressed in the UTC timezone with the *zulu* (`Z`) timezone identifier. If omitted, there will be no `registrationInstant` in the resulting metadata, except in the `aggregator2` module, which will use the instant when the metadata was generated. -`policies` +`RegistrationPolicy` : An indexed array containing URLs pointing to the policy under which the entity or entities where registered. Each index must be the language code corresponding to the language of the URL. This parameter is optional, and will be omitted in the resulting metadata if not configured. @@ -54,9 +54,9 @@ Service Provider: 'entityID' => NULL, ... 'RegistrationInfo' => [ - 'authority' => 'urn:mace:sp.example.org', - 'instant' => '2008-01-17T11:28:03.577Z', - 'policies' => ['en' => 'http://sp.example.org/policy', 'es' => 'http://sp.example.org/politica'], + 'RegistrationAuthority' => 'urn:mace:sp.example.org', + 'RegistrationInstant' => '2008-01-17T11:28:03.577Z', + 'RegistrationPolicy' => ['en' => 'http://sp.example.org/policy', 'es' => 'http://sp.example.org/politica'], ], ], @@ -66,8 +66,8 @@ Identity Provider: 'host' => '__DEFAULT__', ... 'RegistrationInfo' => [ - 'authority' => 'urn:mace:idp.example.org', - 'instant' => '2008-01-17T11:28:03.577Z', + 'RegistrationAuthority' => 'urn:mace:idp.example.org', + 'RegistrationInstant' => '2008-01-17T11:28:03.577Z', ], ]; @@ -79,8 +79,8 @@ Identity Provider: ... ], 'RegistrationInfo' => [ - 'authority' => 'urn:mace:example.federation', - 'policies' => ['en' => 'http://example.org/federation_policy', 'es' => 'https://example.org/politica_federacion'], + 'RegistrationAuthority' => 'urn:mace:example.federation', + 'RegistrationPolicy' => ['en' => 'http://example.org/federation_policy', 'es' => 'https://example.org/politica_federacion'], ], ], ]; diff --git a/docs/simplesamlphp-reference-idp-hosted.md b/docs/simplesamlphp-reference-idp-hosted.md index 9fc0628d92..c0873d6fc5 100644 --- a/docs/simplesamlphp-reference-idp-hosted.md +++ b/docs/simplesamlphp-reference-idp-hosted.md @@ -60,12 +60,12 @@ in the advanced features page. ```php 'contacts' => [ [ - 'contactType' => 'support', - 'emailAddress' => 'support@example.org', - 'givenName' => 'John', - 'surName' => 'Doe', - 'telephoneNumber' => '+31(0)12345678', - 'company' => 'Example Inc.', + 'ContactType' => 'support', + 'EmailAddress' => 'support@example.org', + 'GivenName' => 'John', + 'SurName' => 'Doe', + 'TelephoneNumber' => '+31(0)12345678', + 'Company' => 'Example Inc.', ], ], ``` @@ -75,15 +75,19 @@ in the advanced features page. ```php 'contacts' => [ [ - 'contactType' => 'other', - 'emailAddress' => 'mailto:abuse@example.org', - 'givenName' => 'John', - 'surName' => 'Doe', - 'telephoneNumber' => '+31(0)12345678', - 'company' => 'Example Inc.', - 'attributes' => [ - 'xmlns:remd' => 'http://refeds.org/metadata', - 'remd:contactType' => 'http://refeds.org/metadata/contactType/security', + 'ContactType' => 'other', + 'EmailAddress' => 'mailto:abuse@example.org', + 'GivenName' => 'John', + 'SurName' => 'Doe', + 'TelephoneNumber' => '+31(0)12345678', + 'Company' => 'Example Inc.', + 'attributes' => [ + [ + 'namespaceURI' => 'http://refeds.org/metadata', + 'namespacePrefix' => 'remd', + 'attrName' => 'contactType', + 'attrValue' => 'http://refeds.org/metadata/contactType/security', + ], ], ], ], diff --git a/docs/simplesamlphp-reference-sp-remote.md b/docs/simplesamlphp-reference-sp-remote.md index 593b8d0c8e..a2d3d44f1b 100644 --- a/docs/simplesamlphp-reference-sp-remote.md +++ b/docs/simplesamlphp-reference-sp-remote.md @@ -110,7 +110,7 @@ The following options can be set: the actual value used is fetched from metadata by the following priority: -: +: 1. SP Remote Metadata 2. IdP Hosted Metadata diff --git a/docs/simplesamlphp-sp.md b/docs/simplesamlphp-sp.md index 99b93e2256..1e9f0a1958 100644 --- a/docs/simplesamlphp-sp.md +++ b/docs/simplesamlphp-sp.md @@ -92,13 +92,13 @@ metadata file: $metadata['https://example.org/saml-idp'] = [ 'SingleSignOnService' => [ [ - 'Location' => 'https://example.org/simplesaml/saml2/idp/SSOService.php', + 'Location' => 'https://example.org/simplesaml/module.php/saml/idp/singleSignOnService', 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', ], ], 'SingleLogoutService' => [ [ - 'Location' => 'https://example.org/simplesaml/saml2/idp/SingleLogoutService.php', + 'Location' => 'https://example.org/simplesaml/module.php/saml/idp/singleLogout', 'ResponseLocation' => 'https://sp.example.org/LogoutResponse', 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', ], diff --git a/docs/simplesamlphp-upgrade-notes-2.0.md b/docs/simplesamlphp-upgrade-notes-2.0.md index f03a29538e..8356ffc274 100644 --- a/docs/simplesamlphp-upgrade-notes-2.0.md +++ b/docs/simplesamlphp-upgrade-notes-2.0.md @@ -27,6 +27,8 @@ composer require simplesamlphp/simplesamlphp-module-ldap --update-no-dev If you are using a database to store metadata, make sure to replace any `__DYNAMIC:__` entityID's with a real value manually. Dynamic records are no longer loaded from the database. See the "Upgrading and EntityIDs" section at the end of the document for more information. +- EntityIDs are now checked for validity in accordance to SAML 2.0 Core specification, section 8.3.6 Entity Identifier: + "... The syntax of such an identifier is a URI of not more than 1024 characters in length." - Modules must be enabled through the `module.enable` option in `config.php`. Modules can no longer be enabled by having a file named `enable` or `default-enable` in the module's root directory. - The base URL of the SimpleSAMLphp installation no longer provides an admin menu. Instead this is now at the location From fab535390580a0f3788bf17801fcae858e1807a2 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 14 Nov 2025 19:33:38 +0100 Subject: [PATCH 414/532] Bump dependencies --- composer.lock | 4972 +++++++++++++++++++++++-------------------------- 1 file changed, 2359 insertions(+), 2613 deletions(-) diff --git a/composer.lock b/composer.lock index dff153015e..5dd3390d5f 100644 --- a/composer.lock +++ b/composer.lock @@ -7,39 +7,34 @@ "content-hash": "b5be919f84270a10d8cb03844e2b1953", "packages": [ { - "name": "composer/ca-bundle", - "version": "1.5.8", + "name": "gettext/gettext", + "version": "v5.7.3", "source": { "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "719026bb30813accb68271fee7e39552a58e9f65" + "url": "https://github.com/php-gettext/Gettext.git", + "reference": "95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/719026bb30813accb68271fee7e39552a58e9f65", - "reference": "719026bb30813accb68271fee7e39552a58e9f65", + "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1", + "reference": "95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1", "shasum": "" }, "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^7.2 || ^8.0" + "gettext/languages": "^2.3", + "php": "^7.2|^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^8 || ^9", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "brick/varexporter": "^0.3.5", + "friendsofphp/php-cs-fixer": "^3.2", + "oscarotero/php-cs-fixer-config": "^2.0", + "phpunit/phpunit": "^8.0|^9.0", + "squizlabs/php_codesniffer": "^3.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, "autoload": { "psr-4": { - "Composer\\CaBundle\\": "src" + "Gettext\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -48,72 +43,71 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Oscar Otero", + "email": "oom@oscarotero.com", + "homepage": "http://oscarotero.com", + "role": "Developer" } ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "description": "PHP gettext manager", + "homepage": "https://github.com/php-gettext/Gettext", "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" + "JS", + "gettext", + "i18n", + "mo", + "po", + "translation" ], "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.8" + "email": "oom@oscarotero.com", + "issues": "https://github.com/php-gettext/Gettext/issues", + "source": "https://github.com/php-gettext/Gettext/tree/v5.7.3" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://paypal.me/oscarotero", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/oscarotero", "type": "github" + }, + { + "url": "https://www.patreon.com/misteroom", + "type": "patreon" } ], - "time": "2025-08-20T18:49:47+00:00" + "time": "2024-12-01T10:18:08+00:00" }, { - "name": "composer/class-map-generator", - "version": "1.6.2", + "name": "gettext/languages", + "version": "2.12.1", "source": { "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "ba9f089655d4cdd64e762a6044f411ccdaec0076" + "url": "https://github.com/php-gettext/Languages.git", + "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/ba9f089655d4cdd64e762a6044f411ccdaec0076", - "reference": "ba9f089655d4cdd64e762a6044f411ccdaec0076", + "url": "https://api.github.com/repos/php-gettext/Languages/zipball/0b0b0851c55168e1dfb14305735c64019732b5f1", + "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1", "shasum": "" }, "require": { - "composer/pcre": "^2.1 || ^3.1", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" + "php": ">=5.3" }, "require-dev": { - "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-deprecation-rules": "^1 || ^2", - "phpstan/phpstan-phpunit": "^1 || ^2", - "phpstan/phpstan-strict-rules": "^1.1 || ^2", - "phpunit/phpunit": "^8", - "symfony/filesystem": "^5.4 || ^6" + "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4" }, + "bin": [ + "bin/export-plural-rules", + "bin/import-cldr-data" + ], "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, "autoload": { "psr-4": { - "Composer\\ClassMapGenerator\\": "src" + "Gettext\\Languages\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -122,98 +116,76 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" + "name": "Michele Locati", + "email": "mlocati@gmail.com", + "role": "Developer" } ], - "description": "Utilities to scan PHP code and generate class maps.", + "description": "gettext languages with plural rules", + "homepage": "https://github.com/php-gettext/Languages", "keywords": [ - "classmap" + "cldr", + "i18n", + "internationalization", + "l10n", + "language", + "languages", + "localization", + "php", + "plural", + "plural rules", + "plurals", + "translate", + "translations", + "unicode" ], "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.6.2" + "issues": "https://github.com/php-gettext/Languages/issues", + "source": "https://github.com/php-gettext/Languages/tree/2.12.1" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://paypal.me/mlocati", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/mlocati", "type": "github" } ], - "time": "2025-08-20T18:52:43+00:00" + "time": "2025-03-19T11:14:02+00:00" }, { - "name": "composer/composer", - "version": "2.8.12", + "name": "gettext/translator", + "version": "v1.2.1", "source": { "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "3e38919bc9a2c3c026f2151b5e56d04084ce8f0b" + "url": "https://github.com/php-gettext/Translator.git", + "reference": "8ae0ac79053bcb732a6c584cd86f7a82ef183161" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/3e38919bc9a2c3c026f2151b5e56d04084ce8f0b", - "reference": "3e38919bc9a2c3c026f2151b5e56d04084ce8f0b", + "url": "https://api.github.com/repos/php-gettext/Translator/zipball/8ae0ac79053bcb732a6c584cd86f7a82ef183161", + "reference": "8ae0ac79053bcb732a6c584cd86f7a82ef183161", "shasum": "" }, "require": { - "composer/ca-bundle": "^1.5", - "composer/class-map-generator": "^1.4.0", - "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2.2 || ^3.2", - "composer/semver": "^3.3", - "composer/spdx-licenses": "^1.5.7", - "composer/xdebug-handler": "^2.0.2 || ^3.0.3", - "justinrainbow/json-schema": "^6.5.1", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^3.3", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.2", - "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.47 || ^6.4.25 || ^7.1.10", - "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.1.10", - "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.1.10", - "symfony/polyfill-php73": "^1.24", - "symfony/polyfill-php80": "^1.24", - "symfony/polyfill-php81": "^1.24", - "symfony/process": "^5.4.47 || ^6.4.25 || ^7.1.10" + "php": "^7.2|^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.11.8", - "phpstan/phpstan-deprecation-rules": "^1.2.0", - "phpstan/phpstan-phpunit": "^1.4.0", - "phpstan/phpstan-strict-rules": "^1.6.0", - "phpstan/phpstan-symfony": "^1.4.0", - "symfony/phpunit-bridge": "^6.4.25 || ^7.3.3" + "friendsofphp/php-cs-fixer": "^2.15", + "gettext/gettext": "^5.0.0", + "oscarotero/php-cs-fixer-config": "^1.0", + "phpunit/phpunit": "^8.0", + "squizlabs/php_codesniffer": "^3.0" }, "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" + "gettext/gettext": "Is necessary to load and generate array files used by the translator" }, - "bin": [ - "bin/composer" - ], "type": "library", - "extra": { - "phpstan": { - "includes": [ - "phpstan/rules.neon" - ] - }, - "branch-alias": { - "dev-main": "2.8-dev" - } - }, "autoload": { "psr-4": { - "Composer\\": "src/Composer/" + "Gettext\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -222,72 +194,83 @@ ], "authors": [ { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "https://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" + "name": "Oscar Otero", + "email": "oom@oscarotero.com", + "homepage": "http://oscarotero.com", + "role": "Developer" } ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", + "description": "Gettext translator functions", + "homepage": "https://github.com/php-gettext/Translator", "keywords": [ - "autoload", - "dependency", - "package" + "gettext", + "i18n", + "php", + "translator" ], "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/composer/issues", - "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.8.12" + "email": "oom@oscarotero.com", + "issues": "https://github.com/php-gettext/Translator/issues", + "source": "https://github.com/php-gettext/Translator/tree/v1.2.1" }, "funding": [ { - "url": "https://packagist.com", + "url": "https://paypal.me/oscarotero", "type": "custom" }, { - "url": "https://github.com/composer", + "url": "https://github.com/oscarotero", "type": "github" + }, + { + "url": "https://www.patreon.com/misteroom", + "type": "patreon" } ], - "time": "2025-09-19T11:41:59+00:00" + "time": "2025-01-09T09:20:22+00:00" }, { - "name": "composer/metadata-minifier", - "version": "1.0.0", + "name": "guzzlehttp/psr7", + "version": "2.8.0", "source": { "type": "git", - "url": "https://github.com/composer/metadata-minifier.git", - "reference": "c549d23829536f0d0e984aaabbf02af91f443207" + "url": "https://github.com/guzzle/psr7.git", + "reference": "21dc724a0583619cd1652f673303492272778051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", - "reference": "c549d23829536f0d0e984aaabbf02af91f443207", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", + "reference": "21dc724a0583619cd1652f673303492272778051", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" }, "require-dev": { - "composer/composer": "^2", - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.x-dev" + "bamarni-bin": { + "bin-links": true, + "forward-command": false } }, "autoload": { "psr-4": { - "Composer\\MetadataMinifier\\": "src" + "GuzzleHttp\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -296,75 +279,112 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], - "description": "Small utility library that handles metadata minification and expansion.", + "description": "PSR-7 message implementation that also provides common utility methods", "keywords": [ - "composer", - "compression" + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" ], "support": { - "issues": "https://github.com/composer/metadata-minifier/issues", - "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.8.0" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" + "url": "https://github.com/GrahamCampbell", + "type": "github" }, { - "url": "https://github.com/composer", + "url": "https://github.com/Nyholm", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", "type": "tidelift" } ], - "time": "2021-04-07T13:37:33+00:00" + "time": "2025-08-23T21:21:41+00:00" }, { - "name": "composer/pcre", - "version": "3.3.2", + "name": "nyholm/psr7", + "version": "1.8.2", "source": { "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + "url": "https://github.com/Nyholm/psr7.git", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", - "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", "shasum": "" }, "require": { - "php": "^7.4 || ^8.0" + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" }, - "conflict": { - "phpstan/phpstan": "<1.11.10" + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" }, "require-dev": { - "phpstan/phpstan": "^1.12 || ^2", - "phpstan/phpstan-strict-rules": "^1 || ^2", - "phpunit/phpunit": "^8 || ^9" + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" }, "type": "library", "extra": { - "phpstan": { - "includes": [ - "extension.neon" - ] - }, "branch-alias": { - "dev-main": "3.x-dev" + "dev-master": "1.8-dev" } }, "autoload": { "psr-4": { - "Composer\\Pcre\\": "src" + "Nyholm\\Psr7\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -373,145 +393,143 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" } ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" + "psr-17", + "psr-7" ], "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.3.2" + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", + "url": "https://github.com/Zegnat", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" + "url": "https://github.com/nyholm", + "type": "github" } ], - "time": "2024-11-12T16:29:46+00:00" + "time": "2024-09-09T07:06:30+00:00" }, { - "name": "composer/semver", - "version": "3.4.4", + "name": "phpmailer/phpmailer", + "version": "v6.12.0", "source": { "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", - "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/d1ac35d784bf9f5e61b424901d5a014967f15b12", + "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "php": ">=5.5.0" }, "require-dev": { - "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/annotations": "^1.2.6 || ^1.13.3", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.7.2", + "yoast/phpunit-polyfills": "^1.0.4" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } + "suggest": { + "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "ext-openssl": "Needed for secure SMTP sending and DKIM signing", + "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", + "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" }, + "type": "library", "autoload": { "psr-4": { - "Composer\\Semver\\": "src" + "PHPMailer\\PHPMailer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "LGPL-2.1-only" ], "authors": [ { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" }, { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" }, { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" + "name": "Brent R. Matzelle" } ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.4" + "issues": "https://github.com/PHPMailer/PHPMailer/issues", + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.12.0" }, "funding": [ { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", + "url": "https://github.com/Synchro", "type": "github" } ], - "time": "2025-08-20T19:15:30+00:00" + "time": "2025-10-15T16:49:08+00:00" }, { - "name": "composer/spdx-licenses", - "version": "1.5.9", + "name": "psr/cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f" + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/edf364cefe8c43501e21e88110aac10b284c3c9f", - "reference": "edf364cefe8c43501e21e88110aac10b284c3c9f", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.11", - "symfony/phpunit-bridge": "^3 || ^7" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { - "Composer\\Spdx\\": "src" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -520,76 +538,42 @@ ], "authors": [ { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "SPDX licenses list and validation library.", + "description": "Common interface for caching libraries", "keywords": [ - "license", - "spdx", - "validator" + "cache", + "psr", + "psr-6" ], "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.9" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2025-05-12T21:07:07+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { - "name": "composer/xdebug-handler", - "version": "3.0.5", + "name": "psr/clock", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", - "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", "shasum": "" }, "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + "php": "^7.0 || ^8.0" }, "type": "library", "autoload": { "psr-4": { - "Composer\\XdebugHandler\\": "src" + "Psr\\Clock\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -598,65 +582,51 @@ ], "authors": [ { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "Restarts a process without Xdebug.", + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", "keywords": [ - "Xdebug", - "performance" + "clock", + "now", + "psr", + "psr-20", + "time" ], "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2024-05-06T16:37:16+00:00" + "time": "2022-11-25T14:36:26+00:00" }, { - "name": "gettext/gettext", - "version": "v5.7.3", + "name": "psr/container", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/php-gettext/Gettext.git", - "reference": "95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1" + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1", - "reference": "95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "gettext/languages": "^2.3", - "php": "^7.2|^8.0" - }, - "require-dev": { - "brick/varexporter": "^0.3.5", - "friendsofphp/php-cs-fixer": "^3.2", - "oscarotero/php-cs-fixer-config": "^2.0", - "phpunit/phpunit": "^8.0|^9.0", - "squizlabs/php_codesniffer": "^3.0" + "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { - "Gettext\\": "src" + "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -665,752 +635,12 @@ ], "authors": [ { - "name": "Oscar Otero", - "email": "oom@oscarotero.com", - "homepage": "http://oscarotero.com", - "role": "Developer" + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" } ], - "description": "PHP gettext manager", - "homepage": "https://github.com/php-gettext/Gettext", - "keywords": [ - "JS", - "gettext", - "i18n", - "mo", - "po", - "translation" - ], - "support": { - "email": "oom@oscarotero.com", - "issues": "https://github.com/php-gettext/Gettext/issues", - "source": "https://github.com/php-gettext/Gettext/tree/v5.7.3" - }, - "funding": [ - { - "url": "https://paypal.me/oscarotero", - "type": "custom" - }, - { - "url": "https://github.com/oscarotero", - "type": "github" - }, - { - "url": "https://www.patreon.com/misteroom", - "type": "patreon" - } - ], - "time": "2024-12-01T10:18:08+00:00" - }, - { - "name": "gettext/languages", - "version": "2.12.1", - "source": { - "type": "git", - "url": "https://github.com/php-gettext/Languages.git", - "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Languages/zipball/0b0b0851c55168e1dfb14305735c64019732b5f1", - "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4" - }, - "bin": [ - "bin/export-plural-rules", - "bin/import-cldr-data" - ], - "type": "library", - "autoload": { - "psr-4": { - "Gettext\\Languages\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michele Locati", - "email": "mlocati@gmail.com", - "role": "Developer" - } - ], - "description": "gettext languages with plural rules", - "homepage": "https://github.com/php-gettext/Languages", - "keywords": [ - "cldr", - "i18n", - "internationalization", - "l10n", - "language", - "languages", - "localization", - "php", - "plural", - "plural rules", - "plurals", - "translate", - "translations", - "unicode" - ], - "support": { - "issues": "https://github.com/php-gettext/Languages/issues", - "source": "https://github.com/php-gettext/Languages/tree/2.12.1" - }, - "funding": [ - { - "url": "https://paypal.me/mlocati", - "type": "custom" - }, - { - "url": "https://github.com/mlocati", - "type": "github" - } - ], - "time": "2025-03-19T11:14:02+00:00" - }, - { - "name": "gettext/translator", - "version": "v1.2.1", - "source": { - "type": "git", - "url": "https://github.com/php-gettext/Translator.git", - "reference": "8ae0ac79053bcb732a6c584cd86f7a82ef183161" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Translator/zipball/8ae0ac79053bcb732a6c584cd86f7a82ef183161", - "reference": "8ae0ac79053bcb732a6c584cd86f7a82ef183161", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.15", - "gettext/gettext": "^5.0.0", - "oscarotero/php-cs-fixer-config": "^1.0", - "phpunit/phpunit": "^8.0", - "squizlabs/php_codesniffer": "^3.0" - }, - "suggest": { - "gettext/gettext": "Is necessary to load and generate array files used by the translator" - }, - "type": "library", - "autoload": { - "psr-4": { - "Gettext\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Oscar Otero", - "email": "oom@oscarotero.com", - "homepage": "http://oscarotero.com", - "role": "Developer" - } - ], - "description": "Gettext translator functions", - "homepage": "https://github.com/php-gettext/Translator", - "keywords": [ - "gettext", - "i18n", - "php", - "translator" - ], - "support": { - "email": "oom@oscarotero.com", - "issues": "https://github.com/php-gettext/Translator/issues", - "source": "https://github.com/php-gettext/Translator/tree/v1.2.1" - }, - "funding": [ - { - "url": "https://paypal.me/oscarotero", - "type": "custom" - }, - { - "url": "https://github.com/oscarotero", - "type": "github" - }, - { - "url": "https://www.patreon.com/misteroom", - "type": "patreon" - } - ], - "time": "2025-01-09T09:20:22+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "2.8.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "bamarni-bin": { - "bin-links": true, - "forward-command": false - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2025-08-23T21:21:41+00:00" - }, - { - "name": "justinrainbow/json-schema", - "version": "6.6.0", - "source": { - "type": "git", - "url": "https://github.com/jsonrainbow/json-schema.git", - "reference": "68ba7677532803cc0c5900dd5a4d730537f2b2f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/68ba7677532803cc0c5900dd5a4d730537f2b2f3", - "reference": "68ba7677532803cc0c5900dd5a4d730537f2b2f3", - "shasum": "" - }, - "require": { - "ext-json": "*", - "marc-mabe/php-enum": "^4.0", - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "3.3.0", - "json-schema/json-schema-test-suite": "^23.2", - "marc-mabe/php-enum-phpstan": "^2.0", - "phpspec/prophecy": "^1.19", - "phpstan/phpstan": "^1.12", - "phpunit/phpunit": "^8.5" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/jsonrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "support": { - "issues": "https://github.com/jsonrainbow/json-schema/issues", - "source": "https://github.com/jsonrainbow/json-schema/tree/6.6.0" - }, - "time": "2025-10-10T11:34:09+00:00" - }, - { - "name": "marc-mabe/php-enum", - "version": "v4.7.2", - "source": { - "type": "git", - "url": "https://github.com/marc-mabe/php-enum.git", - "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/bb426fcdd65c60fb3638ef741e8782508fda7eef", - "reference": "bb426fcdd65c60fb3638ef741e8782508fda7eef", - "shasum": "" - }, - "require": { - "ext-reflection": "*", - "php": "^7.1 | ^8.0" - }, - "require-dev": { - "phpbench/phpbench": "^0.16.10 || ^1.0.4", - "phpstan/phpstan": "^1.3.1", - "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11", - "vimeo/psalm": "^4.17.0 | ^5.26.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-3.x": "3.2-dev", - "dev-master": "4.7-dev" - } - }, - "autoload": { - "psr-4": { - "MabeEnum\\": "src/" - }, - "classmap": [ - "stubs/Stringable.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Marc Bennewitz", - "email": "dev@mabe.berlin", - "homepage": "https://mabe.berlin/", - "role": "Lead" - } - ], - "description": "Simple and fast implementation of enumerations with native PHP", - "homepage": "https://github.com/marc-mabe/php-enum", - "keywords": [ - "enum", - "enum-map", - "enum-set", - "enumeration", - "enumerator", - "enummap", - "enumset", - "map", - "set", - "type", - "type-hint", - "typehint" - ], - "support": { - "issues": "https://github.com/marc-mabe/php-enum/issues", - "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.2" - }, - "time": "2025-09-14T11:18:39+00:00" - }, - { - "name": "nyholm/psr7", - "version": "1.8.2", - "source": { - "type": "git", - "url": "https://github.com/Nyholm/psr7.git", - "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", - "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0", - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "http-interop/http-factory-tests": "^0.9", - "php-http/message-factory": "^1.0", - "php-http/psr7-integration-tests": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", - "symfony/error-handler": "^4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, - "autoload": { - "psr-4": { - "Nyholm\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" - }, - { - "name": "Martijn van der Ven", - "email": "martijn@vanderven.se" - } - ], - "description": "A fast PHP7 implementation of PSR-7", - "homepage": "https://tnyholm.se", - "keywords": [ - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.2" - }, - "funding": [ - { - "url": "https://github.com/Zegnat", - "type": "github" - }, - { - "url": "https://github.com/nyholm", - "type": "github" - } - ], - "time": "2024-09-09T07:06:30+00:00" - }, - { - "name": "phpmailer/phpmailer", - "version": "v6.12.0", - "source": { - "type": "git", - "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/d1ac35d784bf9f5e61b424901d5a014967f15b12", - "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-filter": "*", - "ext-hash": "*", - "php": ">=5.5.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "doctrine/annotations": "^1.2.6 || ^1.13.3", - "php-parallel-lint/php-console-highlighter": "^1.0.0", - "php-parallel-lint/php-parallel-lint": "^1.3.2", - "phpcompatibility/php-compatibility": "^9.3.5", - "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.7.2", - "yoast/phpunit-polyfills": "^1.0.4" - }, - "suggest": { - "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", - "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", - "ext-openssl": "Needed for secure SMTP sending and DKIM signing", - "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", - "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", - "league/oauth2-google": "Needed for Google XOAUTH2 authentication", - "psr/log": "For optional PSR-3 debug logging", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", - "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPMailer\\PHPMailer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-only" - ], - "authors": [ - { - "name": "Marcus Bointon", - "email": "phpmailer@synchromedia.co.uk" - }, - { - "name": "Jim Jagielski", - "email": "jimjag@gmail.com" - }, - { - "name": "Andy Prevost", - "email": "codeworxtech@users.sourceforge.net" - }, - { - "name": "Brent R. Matzelle" - } - ], - "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "support": { - "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.12.0" - }, - "funding": [ - { - "url": "https://github.com/Synchro", - "type": "github" - } - ], - "time": "2025-10-15T16:49:08+00:00" - }, - { - "name": "psr/cache", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/3.0.0" - }, - "time": "2021-02-03T23:26:27+00:00" - }, - { - "name": "psr/clock", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Clock\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", - "keywords": [ - "clock", - "now", - "psr", - "psr-20", - "time" - ], - "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" - }, - "time": "2022-11-25T14:36:26+00:00" - }, - { - "name": "psr/container", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", "keywords": [ "PSR-11", "container", @@ -1676,79 +906,6 @@ }, "time": "2019-03-08T08:55:37+00:00" }, - { - "name": "react/promise", - "version": "v3.3.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "23444f53a813a3296c1368bb104793ce8d88f04a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a", - "reference": "23444f53a813a3296c1368bb104793ce8d88f04a", - "shasum": "" - }, - "require": { - "php": ">=7.1.0" - }, - "require-dev": { - "phpstan/phpstan": "1.12.28 || 1.4.10", - "phpunit/phpunit": "^9.6 || ^7.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" - ], - "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v3.3.0" - }, - "funding": [ - { - "url": "https://opencollective.com/reactphp", - "type": "open_collective" - } - ], - "time": "2025-08-19T18:57:03+00:00" - }, { "name": "robrichards/xmlseclibs", "version": "3.1.3", @@ -1786,183 +943,10 @@ "xmldsig" ], "support": { - "issues": "https://github.com/robrichards/xmlseclibs/issues", - "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.3" - }, - "time": "2024-11-20T21:13:56+00:00" - }, - { - "name": "seld/jsonlint", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2", - "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2", - "shasum": "" - }, - "require": { - "php": "^5.3 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.11", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" - }, - "bin": [ - "bin/jsonlint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], - "support": { - "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" - } - ], - "time": "2024-07-11T14:55:45+00:00" - }, - { - "name": "seld/phar-utils", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\PharUtils\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], - "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" - }, - "time": "2022-08-31T10:31:18+00:00" - }, - { - "name": "seld/signal-handler", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", - "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "require-dev": { - "phpstan/phpstan": "^1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "psr/log": "^1 || ^2 || ^3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\Signal\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", - "keywords": [ - "posix", - "sigint", - "signal", - "sigterm", - "unix" - ], - "support": { - "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" + "issues": "https://github.com/robrichards/xmlseclibs/issues", + "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.3" }, - "time": "2023-09-03T09:24:00+00:00" + "time": "2024-11-20T21:13:56+00:00" }, { "name": "simplesamlphp/assert", @@ -2025,27 +1009,27 @@ }, { "name": "simplesamlphp/composer-module-installer", - "version": "v1.5.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/composer-module-installer.git", - "reference": "b843bcb4b464c22348d9d05bc3ec247e2b5e2489" + "reference": "9543c32a0711fb63b637fe75fc08f0309d1c0b32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/composer-module-installer/zipball/b843bcb4b464c22348d9d05bc3ec247e2b5e2489", - "reference": "b843bcb4b464c22348d9d05bc3ec247e2b5e2489", + "url": "https://api.github.com/repos/simplesamlphp/composer-module-installer/zipball/9543c32a0711fb63b637fe75fc08f0309d1c0b32", + "reference": "9543c32a0711fb63b637fe75fc08f0309d1c0b32", "shasum": "" }, "require": { - "composer-plugin-api": "~2.6.0", - "composer/composer": "~2.8.12", + "composer-plugin-api": "~2.9.0", "ext-mbstring": "*", "php": "^8.2", "simplesamlphp/assert": "~1.9.1" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "~1.10.2" + "composer/composer": "~2.8.12", + "simplesamlphp/simplesamlphp-test-framework": "~1.10.3" }, "type": "composer-plugin", "extra": { @@ -2063,9 +1047,9 @@ "description": "A Composer plugin that allows installing SimpleSAMLphp modules through Composer.", "support": { "issues": "https://github.com/simplesamlphp/composer-module-installer/issues", - "source": "https://github.com/simplesamlphp/composer-module-installer/tree/v1.5.0" + "source": "https://github.com/simplesamlphp/composer-module-installer/tree/v1.6.0" }, - "time": "2025-10-20T21:51:01+00:00" + "time": "2025-11-13T11:11:03+00:00" }, { "name": "simplesamlphp/composer-xmlprovider-installer", @@ -2464,16 +1448,16 @@ }, { "name": "symfony/cache", - "version": "v7.3.4", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "bf8afc8ffd4bfd3d9c373e417f041d9f1e5b863f" + "reference": "1277a1ec61c8d93ea61b2a59738f1deb9bfb6701" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/bf8afc8ffd4bfd3d9c373e417f041d9f1e5b863f", - "reference": "bf8afc8ffd4bfd3d9c373e417f041d9f1e5b863f", + "url": "https://api.github.com/repos/symfony/cache/zipball/1277a1ec61c8d93ea61b2a59738f1deb9bfb6701", + "reference": "1277a1ec61c8d93ea61b2a59738f1deb9bfb6701", "shasum": "" }, "require": { @@ -2542,7 +1526,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.3.4" + "source": "https://github.com/symfony/cache/tree/v7.3.6" }, "funding": [ { @@ -2562,7 +1546,7 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2025-10-30T13:22:58+00:00" }, { "name": "symfony/cache-contracts", @@ -2642,16 +1626,16 @@ }, { "name": "symfony/config", - "version": "v7.3.4", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "8a09223170046d2cfda3d2e11af01df2c641e961" + "reference": "9d18eba95655a3152ae4c1d53c6cc34eb4d4a0b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/8a09223170046d2cfda3d2e11af01df2c641e961", - "reference": "8a09223170046d2cfda3d2e11af01df2c641e961", + "url": "https://api.github.com/repos/symfony/config/zipball/9d18eba95655a3152ae4c1d53c6cc34eb4d4a0b7", + "reference": "9d18eba95655a3152ae4c1d53c6cc34eb4d4a0b7", "shasum": "" }, "require": { @@ -2697,7 +1681,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.3.4" + "source": "https://github.com/symfony/config/tree/v7.3.6" }, "funding": [ { @@ -2717,20 +1701,20 @@ "type": "tidelift" } ], - "time": "2025-09-22T12:46:16+00:00" + "time": "2025-11-02T08:04:43+00:00" }, { "name": "symfony/console", - "version": "v7.3.4", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db" + "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", - "reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db", + "url": "https://api.github.com/repos/symfony/console/zipball/c28ad91448f86c5f6d9d2c70f0cf68bf135f252a", + "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a", "shasum": "" }, "require": { @@ -2795,7 +1779,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.4" + "source": "https://github.com/symfony/console/tree/v7.3.6" }, "funding": [ { @@ -2815,20 +1799,20 @@ "type": "tidelift" } ], - "time": "2025-09-22T15:31:00+00:00" + "time": "2025-11-04T01:21:42+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.3.4", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "82119812ab0bf3425c1234d413efd1b19bb92ae4" + "reference": "98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/82119812ab0bf3425c1234d413efd1b19bb92ae4", - "reference": "82119812ab0bf3425c1234d413efd1b19bb92ae4", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69", + "reference": "98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69", "shasum": "" }, "require": { @@ -2879,7 +1863,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.3.4" + "source": "https://github.com/symfony/dependency-injection/tree/v7.3.6" }, "funding": [ { @@ -2899,7 +1883,7 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2025-10-31T10:11:11+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2970,16 +1954,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.3.4", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4" + "reference": "bbe40bfab84323d99dab491b716ff142410a92a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", - "reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/bbe40bfab84323d99dab491b716ff142410a92a8", + "reference": "bbe40bfab84323d99dab491b716ff142410a92a8", "shasum": "" }, "require": { @@ -3027,7 +2011,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.3.4" + "source": "https://github.com/symfony/error-handler/tree/v7.3.6" }, "funding": [ { @@ -3047,7 +2031,7 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2025-10-31T19:12:50+00:00" }, { "name": "symfony/event-dispatcher", @@ -3279,16 +2263,16 @@ }, { "name": "symfony/filesystem", - "version": "v7.3.2", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd" + "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/edcbb768a186b5c3f25d0643159a787d3e63b7fd", - "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/e9bcfd7837928ab656276fe00464092cc9e1826a", + "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a", "shasum": "" }, "require": { @@ -3325,7 +2309,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.3.2" + "source": "https://github.com/symfony/filesystem/tree/v7.3.6" }, "funding": [ { @@ -3345,20 +2329,20 @@ "type": "tidelift" } ], - "time": "2025-07-07T08:17:47+00:00" + "time": "2025-11-05T09:52:27+00:00" }, { "name": "symfony/finder", - "version": "v7.3.2", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" + "reference": "9f696d2f1e340484b4683f7853b273abff94421f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", - "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", + "url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f", + "reference": "9f696d2f1e340484b4683f7853b273abff94421f", "shasum": "" }, "require": { @@ -3393,7 +2377,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.3.2" + "source": "https://github.com/symfony/finder/tree/v7.3.5" }, "funding": [ { @@ -3413,20 +2397,20 @@ "type": "tidelift" } ], - "time": "2025-07-15T13:41:35+00:00" + "time": "2025-10-15T18:45:57+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.3.4", + "version": "v7.3.6", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "b13e7cec5a144c8dba6f4233a2c53c00bc29e140" + "reference": "cabfdfa82bc4f75d693a329fe263d96937636b77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/b13e7cec5a144c8dba6f4233a2c53c00bc29e140", - "reference": "b13e7cec5a144c8dba6f4233a2c53c00bc29e140", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/cabfdfa82bc4f75d693a329fe263d96937636b77", + "reference": "cabfdfa82bc4f75d693a329fe263d96937636b77", "shasum": "" }, "require": { @@ -3551,7 +2535,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.3.4" + "source": "https://github.com/symfony/framework-bundle/tree/v7.3.6" }, "funding": [ { @@ -3571,20 +2555,20 @@ "type": "tidelift" } ], - "time": "2025-09-17T05:51:54+00:00" + "time": "2025-10-30T09:42:24+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.3.4", + "version": "v7.3.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6" + "reference": "db488a62f98f7a81d5746f05eea63a74e55bb7c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c061c7c18918b1b64268771aad04b40be41dd2e6", - "reference": "c061c7c18918b1b64268771aad04b40be41dd2e6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/db488a62f98f7a81d5746f05eea63a74e55bb7c4", + "reference": "db488a62f98f7a81d5746f05eea63a74e55bb7c4", "shasum": "" }, "require": { @@ -3634,7 +2618,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.3.4" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.7" }, "funding": [ { @@ -3654,20 +2638,20 @@ "type": "tidelift" } ], - "time": "2025-09-16T08:38:17+00:00" + "time": "2025-11-08T16:41:12+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.3.4", + "version": "v7.3.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b796dffea7821f035047235e076b60ca2446e3cf" + "reference": "10b8e9b748ea95fa4539c208e2487c435d3c87ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b796dffea7821f035047235e076b60ca2446e3cf", - "reference": "b796dffea7821f035047235e076b60ca2446e3cf", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/10b8e9b748ea95fa4539c208e2487c435d3c87ce", + "reference": "10b8e9b748ea95fa4539c208e2487c435d3c87ce", "shasum": "" }, "require": { @@ -3752,7 +2736,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.3.4" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.7" }, "funding": [ { @@ -3772,20 +2756,20 @@ "type": "tidelift" } ], - "time": "2025-09-27T12:32:17+00:00" + "time": "2025-11-12T11:38:40+00:00" }, { "name": "symfony/intl", - "version": "v7.3.4", + "version": "v7.3.5", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "e6db84864655885d9dac676a9d7dde0d904fda54" + "reference": "9eccaaa94ac6f9deb3620c9d47a057d965baeabf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/e6db84864655885d9dac676a9d7dde0d904fda54", - "reference": "e6db84864655885d9dac676a9d7dde0d904fda54", + "url": "https://api.github.com/repos/symfony/intl/zipball/9eccaaa94ac6f9deb3620c9d47a057d965baeabf", + "reference": "9eccaaa94ac6f9deb3620c9d47a057d965baeabf", "shasum": "" }, "require": { @@ -3842,7 +2826,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.3.4" + "source": "https://github.com/symfony/intl/tree/v7.3.5" }, "funding": [ { @@ -3862,7 +2846,7 @@ "type": "tidelift" } ], - "time": "2025-09-08T14:11:30+00:00" + "time": "2025-10-01T06:11:17+00:00" }, { "name": "symfony/password-hasher", @@ -4306,12 +3290,263 @@ } }, "autoload": { - "files": [ - "bootstrap.php" - ], + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.3.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "c97abe725f2a1a858deca629a6488c8fc20c3091" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/c97abe725f2a1a858deca629a6488c8fc20c3091", + "reference": "c97abe725f2a1a858deca629a6488c8fc20c3091", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.3.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-05T07:57:47+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4327,17 +3562,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Generic abstractions related to writing services", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -4357,41 +3593,49 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { - "name": "symfony/polyfill-php73", - "version": "v1.33.0", + "name": "symfony/string", + "version": "v7.3.4", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + "url": "https://github.com/symfony/string.git", + "reference": "f96476035142921000338bad71e5247fbc138872" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872", + "reference": "f96476035142921000338bad71e5247fbc138872", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" }, + "type": "library", "autoload": { "files": [ - "bootstrap.php" + "Resources/functions.php" ], "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" + "Symfony\\Component\\String\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4408,16 +3652,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" + "source": "https://github.com/symfony/string/tree/v7.3.4" }, "funding": [ { @@ -4437,41 +3683,41 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-09-11T14:36:48+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.33.0", + "name": "symfony/translation-contracts", + "version": "v3.6.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.1" }, "type": "library", "extra": { "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" } }, "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Contracts\\Translation\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4479,10 +3725,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -4492,16 +3734,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Generic abstractions related to translation", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" }, "funding": [ { @@ -4521,41 +3765,82 @@ "type": "tidelift" } ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.33.0", + "name": "symfony/twig-bridge", + "version": "v7.3.6", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "d1aaec8eee1f5591f56b9efe00194d73a8e38319" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", - "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d1aaec8eee1f5591f56b9efe00194d73a8e38319", + "reference": "d1aaec8eee1f5591f56b9efe00194d73a8e38319", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/translation-contracts": "^2.5|^3", + "twig/twig": "^3.21" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/console": "<6.4", + "symfony/form": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/mime": "<6.4", + "symfony/serializer": "<6.4", + "symfony/translation": "<6.4", + "symfony/workflow": "<6.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/asset": "^6.4|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/emoji": "^7.1", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/form": "^6.4.20|^7.2.5", + "symfony/html-sanitizer": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^6.4|^7.0", + "symfony/security-csrf": "^6.4|^7.0", + "symfony/security-http": "^6.4|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/cssinliner-extra": "^3", + "twig/inky-extra": "^3", + "twig/markdown-extra": "^3" }, + "type": "symfony-bridge", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" + "Symfony\\Bridge\\Twig\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4564,24 +3849,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0" + "source": "https://github.com/symfony/twig-bridge/tree/v7.3.6" }, "funding": [ { @@ -4601,41 +3880,50 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-11-04T15:37:51+00:00" }, { - "name": "symfony/polyfill-php83", - "version": "v1.33.0", + "name": "symfony/var-dumper", + "version": "v7.3.5", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "url": "https://github.com/symfony/var-dumper.git", + "reference": "476c4ae17f43a9a36650c69879dcf5b1e6ae724d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/476c4ae17f43a9a36650c69879dcf5b1e6ae724d", + "reference": "476c4ae17f43a9a36650c69879dcf5b1e6ae724d", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } + "conflict": { + "symfony/console": "<6.4" }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", "autoload": { "files": [ - "bootstrap.php" + "Resources/functions/dump.php" ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" + "Symfony\\Component\\VarDumper\\": "" }, - "classmap": [ - "Resources/stubs" + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4652,16 +3940,14 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" + "debug", + "dump" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.5" }, "funding": [ { @@ -4681,29 +3967,35 @@ "type": "tidelift" } ], - "time": "2025-07-08T02:45:35+00:00" + "time": "2025-09-27T09:00:46+00:00" }, { - "name": "symfony/process", + "name": "symfony/var-exporter", "version": "v7.3.4", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b" + "url": "https://github.com/symfony/var-exporter.git", + "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/f24f8f316367b30810810d4eb30c543d7003ff3b", - "reference": "f24f8f316367b30810810d4eb30c543d7003ff3b", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", + "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Process\\": "" + "Symfony\\Component\\VarExporter\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4715,18 +4007,28 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Executes commands in sub-processes", + "description": "Allows exporting any serializable PHP data structure to plain PHP code", "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], "support": { - "source": "https://github.com/symfony/process/tree/v7.3.4" + "source": "https://github.com/symfony/var-exporter/tree/v7.3.4" }, "funding": [ { @@ -4749,40 +4051,37 @@ "time": "2025-09-11T10:12:26+00:00" }, { - "name": "symfony/routing", - "version": "v7.3.4", + "name": "symfony/yaml", + "version": "v7.3.5", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c" + "url": "https://github.com/symfony/yaml.git", + "reference": "90208e2fc6f68f613eae7ca25a2458a931b1bacc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/8dc648e159e9bac02b703b9fbd937f19ba13d07c", - "reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c", + "url": "https://api.github.com/repos/symfony/yaml/zipball/90208e2fc6f68f613eae7ca25a2458a931b1bacc", + "reference": "90208e2fc6f68f613eae7ca25a2458a931b1bacc", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/yaml": "<6.4" + "symfony/console": "<6.4" }, "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" + "symfony/console": "^6.4|^7.0" }, + "bin": [ + "Resources/bin/yaml-lint" + ], "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\Routing\\": "" + "Symfony\\Component\\Yaml\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -4802,16 +4101,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Maps an HTTP request to a set of configuration variables", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.3.4" + "source": "https://github.com/symfony/yaml/tree/v7.3.5" }, "funding": [ { @@ -4831,46 +4124,37 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2025-09-27T09:00:46+00:00" }, { - "name": "symfony/service-contracts", - "version": "v3.6.0", + "name": "twig/intl-extra", + "version": "v3.21.0", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" + "url": "https://github.com/twigphp/intl-extra.git", + "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", - "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/05bc5d46b9df9e62399eae53e7c0b0633298b146", + "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146", "shasum": "" }, "require": { - "php": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=8.1.0", + "symfony/intl": "^5.4|^6.4|^7.0", + "twig/twig": "^3.13|^4.0" }, - "conflict": { - "ext-psr": "<1.1|>=2" + "require-dev": { + "symfony/phpunit-bridge": "^6.4|^7.0" }, "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, - "branch-alias": { - "dev-main": "3.6-dev" - } - }, "autoload": { "psr-4": { - "Symfony\\Contracts\\Service\\": "" + "Twig\\Extra\\Intl\\": "" }, "exclude-from-classmap": [ - "/Test/" + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4879,286 +4163,222 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" } ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", + "description": "A Twig extension for Intl", + "homepage": "https://twig.symfony.com", "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" + "intl", + "twig" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.21.0" }, "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, { "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/twig/twig", "type": "tidelift" } ], - "time": "2025-04-25T09:37:31+00:00" + "time": "2025-01-31T20:45:36+00:00" }, { - "name": "symfony/string", - "version": "v7.3.4", + "name": "twig/twig", + "version": "v3.22.0", "source": { "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "f96476035142921000338bad71e5247fbc138872" + "url": "https://github.com/twigphp/Twig.git", + "reference": "4509984193026de413baf4ba80f68590a7f2c51d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872", - "reference": "f96476035142921000338bad71e5247fbc138872", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/4509984193026de413baf4ba80f68590a7f2c51d", + "reference": "4509984193026de413baf4ba80f68590a7f2c51d", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/translation-contracts": "<2.5" + "php": ">=8.1.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "symfony/emoji": "^7.1", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" + "phpstan/phpstan": "^2.0", + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, "type": "library", "autoload": { "files": [ - "Resources/functions.php" + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" ], "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Twig\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" } ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" + "templating" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.3.4" + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.22.0" }, "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, { "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/twig/twig", "type": "tidelift" } ], - "time": "2025-09-11T14:36:48+00:00" + "time": "2025-10-29T15:56:47+00:00" }, { - "name": "symfony/translation-contracts", - "version": "v3.6.0", + "name": "webmozart/assert", + "version": "1.12.1", "source": { "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" + "url": "https://github.com/webmozarts/assert.git", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", - "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", + "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", "shasum": "" }, "require": { - "php": ">=8.1" + "ext-ctype": "*", + "ext-date": "*", + "ext-filter": "*", + "php": "^7.2 || ^8.0" + }, + "suggest": { + "ext-intl": "", + "ext-simplexml": "", + "ext-spl": "" }, "type": "library", "extra": { - "thanks": { - "url": "https://github.com/symfony/contracts", - "name": "symfony/contracts" - }, "branch-alias": { - "dev-main": "3.6-dev" + "dev-master": "1.10-dev" } }, "autoload": { "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Test/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "Webmozart\\Assert\\": "src/" } - ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" } ], - "time": "2024-09-27T08:32:26+00:00" - }, + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.12.1" + }, + "time": "2025-10-29T15:56:20+00:00" + } + ], + "packages-dev": [ { - "name": "symfony/twig-bridge", - "version": "v7.3.3", + "name": "azjezz/psl", + "version": "3.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "33558f013b7f6ed72805527c8405cae0062e47c5" + "url": "https://github.com/azjezz/psl.git", + "reference": "78078f2c505473d2a28319ffe426b2a82ac76790" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/33558f013b7f6ed72805527c8405cae0062e47c5", - "reference": "33558f013b7f6ed72805527c8405cae0062e47c5", + "url": "https://api.github.com/repos/azjezz/psl/zipball/78078f2c505473d2a28319ffe426b2a82ac76790", + "reference": "78078f2c505473d2a28319ffe426b2a82ac76790", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^3.21" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/console": "<6.4", - "symfony/form": "<6.4", - "symfony/http-foundation": "<6.4", - "symfony/http-kernel": "<6.4", - "symfony/mime": "<6.4", - "symfony/serializer": "<6.4", - "symfony/translation": "<6.4", - "symfony/workflow": "<6.4" + "ext-bcmath": "*", + "ext-intl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "ext-sodium": "*", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0", + "revolt/event-loop": "^1.0.6" }, "require-dev": { - "egulias/email-validator": "^2.1.10|^3|^4", - "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^6.4|^7.0", - "symfony/asset-mapper": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/emoji": "^7.1", - "symfony/expression-language": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/form": "^6.4.20|^7.2.5", - "symfony/html-sanitizer": "^6.4|^7.0", - "symfony/http-foundation": "^7.3", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^6.4|^7.0", - "symfony/routing": "^6.4|^7.0", - "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^6.4|^7.0", - "symfony/security-csrf": "^6.4|^7.0", - "symfony/security-http": "^6.4|^7.0", - "symfony/serializer": "^6.4.3|^7.0.3", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/web-link": "^6.4|^7.0", - "symfony/workflow": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0", - "twig/cssinliner-extra": "^3", - "twig/inky-extra": "^3", - "twig/markdown-extra": "^3" + "carthage-software/mago": "~0.13.1", + "php-coveralls/php-coveralls": "^2.7.0", + "php-standard-library/psalm-plugin": "^2.3.0", + "phpbench/phpbench": "^1.2.15", + "phpunit/phpunit": "^9.6.18", + "roave/infection-static-analysis-plugin": "^1.36.0", + "vimeo/psalm": "^6.0.0" + }, + "suggest": { + "php-standard-library/phpstan-extension": "PHPStan integration", + "php-standard-library/psalm-plugin": "Psalm integration" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/hhvm/hsl", + "name": "hhvm/hsl" + } }, - "type": "symfony-bridge", "autoload": { + "files": [ + "src/bootstrap.php" + ], "psr-4": { - "Symfony\\Bridge\\Twig\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Psl\\": "src/Psl" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5166,82 +4386,45 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "azjezz", + "email": "azjezz@protonmail.com" } ], - "description": "Provides integration for Twig with various Symfony components", - "homepage": "https://symfony.com", + "description": "PHP Standard Library", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.3.3" + "issues": "https://github.com/azjezz/psl/issues", + "source": "https://github.com/azjezz/psl/tree/3.3.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/azjezz", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-08-18T13:10:53+00:00" + "time": "2025-03-03T00:07:00+00:00" }, { - "name": "symfony/var-dumper", - "version": "v7.3.4", + "name": "composer-unused/contracts", + "version": "0.3.0", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb" + "url": "https://github.com/composer-unused/contracts.git", + "reference": "5ec448d3ee80735dccad6a21a3266c377d0845ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", - "reference": "b8abe7daf2730d07dfd4b2ee1cecbf0dd2fbdabb", + "url": "https://api.github.com/repos/composer-unused/contracts/zipball/5ec448d3ee80735dccad6a21a3266c377d0845ae", + "reference": "5ec448d3ee80735dccad6a21a3266c377d0845ae", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/console": "<6.4" - }, - "require-dev": { - "symfony/console": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.12" + "php": "^7.4 || ^8.0" }, - "bin": [ - "Resources/bin/var-dump-server" - ], "type": "library", "autoload": { - "files": [ - "Resources/functions/dump.php" - ], "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "ComposerUnused\\Contracts\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5249,74 +4432,60 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Andreas Frömer", + "email": "composer-unused@icanhazstring.com" } ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], + "description": "Contract repository for composer-unused", "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.4" + "issues": "https://github.com/composer-unused/contracts/issues", + "source": "https://github.com/composer-unused/contracts/tree/0.3.0" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/icanhazstring", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2023-03-17T00:41:49+00:00" }, { - "name": "symfony/var-exporter", - "version": "v7.3.4", + "name": "composer-unused/symbol-parser", + "version": "0.3.1", "source": { "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4" + "url": "https://github.com/composer-unused/symbol-parser.git", + "reference": "a55ecd3c10867be27a2eabf31cd1600160d250ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", - "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", + "url": "https://api.github.com/repos/composer-unused/symbol-parser/zipball/a55ecd3c10867be27a2eabf31cd1600160d250ae", + "reference": "a55ecd3c10867be27a2eabf31cd1600160d250ae", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" + "composer-unused/contracts": "^0.3", + "nikic/php-parser": "^5.0", + "php": "^7.4 || ^8.0", + "phpstan/phpdoc-parser": "^1.25 || ^2", + "psr/container": "^1.0 || ^2.0", + "psr/log": "^1.1 || ^2 || ^3", + "symfony/finder": "^5.3 || ^6.0 || ^7.0" }, "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "ergebnis/composer-normalize": "^2.45", + "ext-ds": "*", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^9.6.10 || ^10.5", + "roave/security-advisories": "dev-master", + "squizlabs/php_codesniffer": "^3.11.3", + "symfony/serializer": "^5.4" }, "type": "library", "autoload": { "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "ComposerUnused\\SymbolParser\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5324,85 +4493,73 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Andreas Frömer", + "email": "composer-unused@icanhazstring.com" } ], - "description": "Allows exporting any serializable PHP data structure to plain PHP code", - "homepage": "https://symfony.com", + "description": "Toolkit to parse symbols from a composer package", + "homepage": "https://github.com/composer-unused/symbol-parser", "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "lazy-loading", - "proxy", - "serialize" + "composer", + "parser", + "symbol" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.3.4" + "issues": "https://github.com/composer-unused/symbol-parser/issues", + "source": "https://github.com/composer-unused/symbol-parser" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/sponsors/icanhazstring", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://paypal.me/icanhazstring", + "type": "other" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2025-03-19T09:13:50+00:00" }, { - "name": "symfony/yaml", - "version": "v7.3.3", + "name": "composer/pcre", + "version": "3.3.2", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "d4f4a66866fe2451f61296924767280ab5732d9d" + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/d4f4a66866fe2451f61296924767280ab5732d9d", - "reference": "d4f4a66866fe2451f61296924767280ab5732d9d", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/polyfill-ctype": "^1.8" + "php": "^7.4 || ^8.0" }, "conflict": { - "symfony/console": "<6.4" + "phpstan/phpstan": "<1.11.10" }, "require-dev": { - "symfony/console": "^6.4|^7.0" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, - "bin": [ - "Resources/bin/yaml-lint" - ], "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] }, - "exclude-from-classmap": [ - "/Tests/" - ] + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5410,69 +4567,67 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" } ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], "support": { - "source": "https://github.com/symfony/yaml/tree/v7.3.3" + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { - "url": "https://symfony.com/sponsor", + "url": "https://packagist.com", "type": "custom" }, { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", + "url": "https://github.com/composer", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], - "time": "2025-08-27T11:34:33+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { - "name": "twig/intl-extra", - "version": "v3.21.0", + "name": "composer/xdebug-handler", + "version": "3.0.5", "source": { "type": "git", - "url": "https://github.com/twigphp/intl-extra.git", - "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146" + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/05bc5d46b9df9e62399eae53e7c0b0633298b146", - "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", "shasum": "" }, "require": { - "php": ">=8.1.0", - "symfony/intl": "^5.4|^6.4|^7.0", - "twig/twig": "^3.13|^4.0" + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" }, "require-dev": { - "symfony/phpunit-bridge": "^6.4|^7.0" + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" }, "type": "library", "autoload": { "psr-4": { - "Twig\\Extra\\Intl\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Composer\\XdebugHandler\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5480,146 +4635,161 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" } ], - "description": "A Twig extension for Intl", - "homepage": "https://twig.symfony.com", + "description": "Restarts a process without Xdebug.", "keywords": [ - "intl", - "twig" + "Xdebug", + "performance" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.21.0" + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" }, "funding": [ { - "url": "https://github.com/fabpot", + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "url": "https://tidelift.com/funding/github/packagist/composer/composer", "type": "tidelift" } ], - "time": "2025-01-31T20:45:36+00:00" + "time": "2024-05-06T16:37:16+00:00" }, { - "name": "twig/twig", - "version": "v3.21.1", + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d" + "url": "https://github.com/PHPCSStandards/composer-installer.git", + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/285123877d4dd97dd7c11842ac5fb7e86e60d81d", - "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/845eb62303d2ca9b289ef216356568ccc075ffd1", + "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1", "shasum": "" }, "require": { - "php": ">=8.1.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" + "composer-plugin-api": "^2.2", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.1.0 || ^4.0" }, "require-dev": { - "phpstan/phpstan": "^2.0", - "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" + "composer/composer": "^2.2", + "ext-json": "*", + "ext-zip": "*", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev", + "yoast/phpunit-polyfills": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" }, - "type": "library", "autoload": { - "files": [ - "src/Resources/core.php", - "src/Resources/debug.php", - "src/Resources/escaper.php", - "src/Resources/string_loader.php" - ], "psr-4": { - "Twig\\": "src/" + "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" + "name": "Franck Nijhof", + "email": "opensource@frenck.dev", + "homepage": "https://frenck.dev", + "role": "Open source developer" }, { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" } ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", "keywords": [ - "templating" + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" ], "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.21.1" + "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", + "source": "https://github.com/PHPCSStandards/composer-installer" }, "funding": [ { - "url": "https://github.com/fabpot", + "url": "https://github.com/PHPCSStandards", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2025-05-03T07:21:55+00:00" + "time": "2025-11-11T04:32:07+00:00" }, { - "name": "webmozart/assert", - "version": "1.12.0", + "name": "gettext/php-scanner", + "version": "v2.0.1", "source": { "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "541057574806f942c94662b817a50f63f7345360" + "url": "https://github.com/php-gettext/PHP-Scanner.git", + "reference": "43f53b6e0d5f9ac5ea165d8202c18267d6bd5dfd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/541057574806f942c94662b817a50f63f7345360", - "reference": "541057574806f942c94662b817a50f63f7345360", + "url": "https://api.github.com/repos/php-gettext/PHP-Scanner/zipball/43f53b6e0d5f9ac5ea165d8202c18267d6bd5dfd", + "reference": "43f53b6e0d5f9ac5ea165d8202c18267d6bd5dfd", "shasum": "" }, "require": { - "ext-ctype": "*", - "ext-date": "*", - "ext-filter": "*", - "php": "^7.2 || ^8.0" + "gettext/gettext": "^5.5.0", + "nikic/php-parser": "^5", + "php": ">=7.4" }, - "suggest": { - "ext-intl": "", - "ext-simplexml": "", - "ext-spl": "" + "require-dev": { + "friendsofphp/php-cs-fixer": "^3", + "oscarotero/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, "autoload": { "psr-4": { - "Webmozart\\Assert\\": "src/" + "Gettext\\Scanner\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -5628,58 +4798,93 @@ ], "authors": [ { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" + "name": "Oscar Otero", + "email": "oom@oscarotero.com", + "homepage": "http://oscarotero.com", + "role": "Developer" } ], - "description": "Assertions to validate method input/output with nice error messages.", + "description": "PHP scanner for gettext", + "homepage": "https://github.com/php-gettext/PHP-Scanner", "keywords": [ - "assert", - "check", - "validate" + "gettext", + "i18n", + "php", + "scanner", + "translation" ], "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.12.0" + "email": "oom@oscarotero.com", + "issues": "https://github.com/php-gettext/PHP-Scanner/issues", + "source": "https://github.com/php-gettext/PHP-Scanner/tree/v2.0.1" }, - "time": "2025-10-20T12:43:39+00:00" - } - ], - "packages-dev": [ + "time": "2024-11-29T20:14:52+00:00" + }, { - "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v1.1.2", + "name": "icanhazstring/composer-unused", + "version": "0.9.5", "source": { "type": "git", - "url": "https://github.com/PHPCSStandards/composer-installer.git", - "reference": "e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1" + "url": "https://github.com/composer-unused/composer-unused.git", + "reference": "13b1d32e35e7c6dc997c01342c4fe1b217b6d767" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1", - "reference": "e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1", + "url": "https://api.github.com/repos/composer-unused/composer-unused/zipball/13b1d32e35e7c6dc997c01342c4fe1b217b6d767", + "reference": "13b1d32e35e7c6dc997c01342c4fe1b217b6d767", "shasum": "" }, "require": { - "composer-plugin-api": "^2.2", - "php": ">=5.4", - "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + "composer-runtime-api": "^2.0", + "composer-unused/contracts": "^0.3", + "composer-unused/symbol-parser": "^0.3.1", + "composer/xdebug-handler": "^3.0", + "ext-json": "*", + "nikic/php-parser": "^5.0", + "ondram/ci-detector": "^4.1", + "php": "^8.1", + "phpstan/phpdoc-parser": "^1.25 || ^2", + "psr/container": "^1.0 || ^2.0", + "psr/log": "^1.1 || ^2 || ^3", + "symfony/config": "^6.0 || ^7.0", + "symfony/console": "^6.0 || ^7.0", + "symfony/dependency-injection": "^6.0 || ^7.0", + "symfony/property-access": "^6.0 || ^7.0", + "symfony/serializer": "^6.0 || ^7.0", + "webmozart/assert": "^1.10", + "webmozart/glob": "^4.4" }, "require-dev": { - "composer/composer": "^2.2", - "ext-json": "*", - "ext-zip": "*", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpcompatibility/php-compatibility": "^9.0", - "yoast/phpunit-polyfills": "^1.0" + "bamarni/composer-bin-plugin": "^1.8", + "codeception/verify": "^3.1", + "dg/bypass-finals": "^1.6", + "ergebnis/composer-normalize": "^2.42", + "ext-ds": "*", + "ext-zend-opcache": "*", + "jangregor/phpstan-prophecy": "^2.1.1", + "mikey179/vfsstream": "^1.6.10", + "php-ds/php-ds": "^1.5", + "phpspec/prophecy-phpunit": "^2.2.0", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^2.1.8", + "phpstan/phpstan-phpunit": "^2.0.4", + "phpunit/phpunit": "^9.6.13", + "roave/security-advisories": "dev-master", + "squizlabs/php_codesniffer": "^3.9" }, - "type": "composer-plugin", + "bin": [ + "bin/composer-unused" + ], + "type": "library", "extra": { - "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + "bamarni-bin": { + "bin-links": true, + "forward-command": true + } }, "autoload": { "psr-4": { - "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + "ComposerUnused\\ComposerUnused\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -5688,89 +4893,82 @@ ], "authors": [ { - "name": "Franck Nijhof", - "email": "opensource@frenck.dev", - "homepage": "https://frenck.dev", - "role": "Open source developer" - }, - { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" + "name": "Andreas Frömer", + "email": "composer-unused@icanhazstring.com" } ], - "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "description": "Show unused packages by scanning your code", + "homepage": "https://github.com/composer-unused/composer-unused", "keywords": [ - "PHPCodeSniffer", - "PHP_CodeSniffer", - "code quality", - "codesniffer", "composer", - "installer", - "phpcbf", - "phpcs", - "plugin", - "qa", - "quality", - "standard", - "standards", - "style guide", - "stylecheck", - "tests" + "php-parser", + "static analysis", + "unused" ], "support": { - "issues": "https://github.com/PHPCSStandards/composer-installer/issues", - "security": "https://github.com/PHPCSStandards/composer-installer/security/policy", - "source": "https://github.com/PHPCSStandards/composer-installer" + "issues": "https://github.com/composer-unused/composer-unused/issues", + "source": "https://github.com/composer-unused/composer-unused" }, "funding": [ { - "url": "https://github.com/PHPCSStandards", - "type": "github" - }, - { - "url": "https://github.com/jrfnl", + "url": "https://github.com/sponsors/icanhazstring", "type": "github" }, { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" - }, - { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" + "url": "https://paypal.me/icanhazstring", + "type": "other" } ], - "time": "2025-07-17T20:45:56+00:00" + "time": "2025-09-22T07:07:50+00:00" }, { - "name": "gettext/php-scanner", - "version": "v2.0.1", + "name": "maglnet/composer-require-checker", + "version": "4.18.0", "source": { "type": "git", - "url": "https://github.com/php-gettext/PHP-Scanner.git", - "reference": "43f53b6e0d5f9ac5ea165d8202c18267d6bd5dfd" + "url": "https://github.com/maglnet/ComposerRequireChecker.git", + "reference": "de930e82bb61e0161d909696950692523b8eaa3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/PHP-Scanner/zipball/43f53b6e0d5f9ac5ea165d8202c18267d6bd5dfd", - "reference": "43f53b6e0d5f9ac5ea165d8202c18267d6bd5dfd", + "url": "https://api.github.com/repos/maglnet/ComposerRequireChecker/zipball/de930e82bb61e0161d909696950692523b8eaa3f", + "reference": "de930e82bb61e0161d909696950692523b8eaa3f", "shasum": "" }, "require": { - "gettext/gettext": "^5.5.0", - "nikic/php-parser": "^5", - "php": ">=7.4" + "azjezz/psl": "^3.2.0", + "composer-runtime-api": "^2.0.0", + "ext-phar": "*", + "nikic/php-parser": "^5.4.0", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "symfony/console": "^7.2.1", + "webmozart/glob": "^4.7.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3", - "oscarotero/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^9", - "squizlabs/php_codesniffer": "^3.0" + "doctrine/coding-standard": "^14.0.0", + "ext-zend-opcache": "*", + "phing/phing": "^3.0.1", + "php-standard-library/phpstan-extension": "^2.0", + "php-standard-library/psalm-plugin": "^2.3", + "phpstan/phpstan": "^2.1.19", + "phpunit/phpunit": "^11.5.27", + "psalm/plugin-phpunit": "^0.19.5", + "roave/infection-static-analysis-plugin": "^1.38.0", + "spatie/temporary-directory": "^2.3.0", + "vimeo/psalm": "^6.13.0" }, + "bin": [ + "bin/composer-require-checker" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, "autoload": { "psr-4": { - "Gettext\\Scanner\\": "src" + "ComposerRequireChecker\\": "src/ComposerRequireChecker" } }, "notification-url": "https://packagist.org/downloads/", @@ -5779,27 +4977,32 @@ ], "authors": [ { - "name": "Oscar Otero", - "email": "oom@oscarotero.com", - "homepage": "http://oscarotero.com", - "role": "Developer" + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.io/" + }, + { + "name": "Matthias Glaub", + "email": "magl@magl.net", + "homepage": "http://magl.net" } ], - "description": "PHP scanner for gettext", - "homepage": "https://github.com/php-gettext/PHP-Scanner", + "description": "CLI tool to analyze composer dependencies and verify that no unknown symbols are used in the sources of a package", + "homepage": "https://github.com/maglnet/ComposerRequireChecker", "keywords": [ - "gettext", - "i18n", - "php", - "scanner", - "translation" + "cli", + "composer", + "dependency", + "imports", + "require", + "requirements", + "static analysis" ], "support": { - "email": "oom@oscarotero.com", - "issues": "https://github.com/php-gettext/PHP-Scanner/issues", - "source": "https://github.com/php-gettext/PHP-Scanner/tree/v2.0.1" + "issues": "https://github.com/maglnet/ComposerRequireChecker/issues", + "source": "https://github.com/maglnet/ComposerRequireChecker/tree/4.18.0" }, - "time": "2024-11-29T20:14:52+00:00" + "time": "2025-10-30T11:58:39+00:00" }, { "name": "mikey179/vfsstream", @@ -5971,6 +5174,84 @@ }, "time": "2025-10-21T19:32:17+00:00" }, + { + "name": "ondram/ci-detector", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/OndraM/ci-detector.git", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "reference": "8b0223b5ed235fd377c75fdd1bfcad05c0f168b8", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.13.2", + "lmc/coding-standard": "^3.0.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.1.0", + "phpstan/phpstan": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.0.0", + "phpunit/phpunit": "^9.6.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "OndraM\\CiDetector\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ondřej Machulda", + "email": "ondrej.machulda@gmail.com" + } + ], + "description": "Detect continuous integration environment and provide unified access to properties of current build", + "keywords": [ + "CircleCI", + "Codeship", + "Wercker", + "adapter", + "appveyor", + "aws", + "aws codebuild", + "azure", + "azure devops", + "azure pipelines", + "bamboo", + "bitbucket", + "buddy", + "ci-info", + "codebuild", + "continuous integration", + "continuousphp", + "devops", + "drone", + "github", + "gitlab", + "interface", + "jenkins", + "pipelines", + "sourcehut", + "teamcity", + "travis" + ], + "support": { + "issues": "https://github.com/OndraM/ci-detector/issues", + "source": "https://github.com/OndraM/ci-detector/tree/4.2.0" + }, + "time": "2024-03-12T13:22:30+00:00" + }, { "name": "phar-io/manifest", "version": "2.0.4", @@ -6186,11 +5467,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.31", + "version": "2.1.32", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ead89849d879fe203ce9292c6ef5e7e76f867b96", - "reference": "ead89849d879fe203ce9292c6ef5e7e76f867b96", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e126cad1e30a99b137b8ed75a85a676450ebb227", + "reference": "e126cad1e30a99b137b8ed75a85a676450ebb227", "shasum": "" }, "require": { @@ -6235,7 +5516,7 @@ "type": "github" } ], - "time": "2025-10-10T14:14:11+00:00" + "time": "2025-11-11T15:18:17+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -6288,35 +5569,34 @@ }, { "name": "phpunit/php-code-coverage", - "version": "11.0.11", + "version": "12.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4" + "reference": "67e8aed88f93d0e6e1cb7effe1a2dfc2fee6022c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", - "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/67e8aed88f93d0e6e1cb7effe1a2dfc2fee6022c", + "reference": "67e8aed88f93d0e6e1cb7effe1a2dfc2fee6022c", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.4.0", - "php": ">=8.2", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-text-template": "^4.0.1", - "sebastian/code-unit-reverse-lookup": "^4.0.1", - "sebastian/complexity": "^4.0.1", - "sebastian/environment": "^7.2.0", - "sebastian/lines-of-code": "^3.0.1", - "sebastian/version": "^5.0.2", + "nikic/php-parser": "^5.6.1", + "php": ">=8.3", + "phpunit/php-file-iterator": "^6.0", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.0.3", + "sebastian/lines-of-code": "^4.0", + "sebastian/version": "^6.0", "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^11.5.2" + "phpunit/phpunit": "^12.3.7" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -6325,7 +5605,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "11.0.x-dev" + "dev-main": "12.4.x-dev" } }, "autoload": { @@ -6354,7 +5634,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.11" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.4.0" }, "funding": [ { @@ -6374,32 +5654,32 @@ "type": "tidelift" } ], - "time": "2025-08-27T14:37:49+00:00" + "time": "2025-09-24T13:44:41+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "5.1.0", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + "reference": "961bc913d42fe24a257bfff826a5068079ac7782" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", + "reference": "961bc913d42fe24a257bfff826a5068079ac7782", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -6427,7 +5707,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" }, "funding": [ { @@ -6435,28 +5715,28 @@ "type": "github" } ], - "time": "2024-08-27T05:02:59+00:00" + "time": "2025-02-07T04:58:37+00:00" }, { "name": "phpunit/php-invoker", - "version": "5.0.1", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-pcntl": "*" @@ -6464,7 +5744,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -6491,7 +5771,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" }, "funding": [ { @@ -6499,32 +5779,32 @@ "type": "github" } ], - "time": "2024-07-03T05:07:44+00:00" + "time": "2025-02-07T04:58:58+00:00" }, { "name": "phpunit/php-text-template", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -6551,7 +5831,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" }, "funding": [ { @@ -6559,32 +5839,32 @@ "type": "github" } ], - "time": "2024-07-03T05:08:43+00:00" + "time": "2025-02-07T04:59:16+00:00" }, { "name": "phpunit/php-timer", - "version": "7.0.1", + "version": "8.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -6611,7 +5891,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" }, "funding": [ { @@ -6619,20 +5899,20 @@ "type": "github" } ], - "time": "2024-07-03T05:09:35+00:00" + "time": "2025-02-07T04:59:38+00:00" }, { "name": "phpunit/phpunit", - "version": "11.5.42", + "version": "12.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c" + "reference": "d8f644d8d9bb904867f7a0aeb1bd306e0d966949" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c", - "reference": "1c6cb5dfe412af3d0dfd414cfd110e3b9cfdbc3c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d8f644d8d9bb904867f7a0aeb1bd306e0d966949", + "reference": "d8f644d8d9bb904867f7a0aeb1bd306e0d966949", "shasum": "" }, "require": { @@ -6645,34 +5925,30 @@ "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.11", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-invoker": "^5.0.1", - "phpunit/php-text-template": "^4.0.1", - "phpunit/php-timer": "^7.0.1", - "sebastian/cli-parser": "^3.0.2", - "sebastian/code-unit": "^3.0.3", - "sebastian/comparator": "^6.3.2", - "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.1", - "sebastian/exporter": "^6.3.2", - "sebastian/global-state": "^7.0.2", - "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.1.3", - "sebastian/version": "^5.0.2", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.4.0", + "phpunit/php-file-iterator": "^6.0.0", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.0", + "sebastian/comparator": "^7.1.3", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.0.3", + "sebastian/exporter": "^7.0.2", + "sebastian/global-state": "^8.0.2", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/type": "^6.0.3", + "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { - "dev-main": "11.5-dev" + "dev-main": "12.4-dev" } }, "autoload": { @@ -6704,7 +5980,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.42" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.4.3" }, "funding": [ { @@ -6728,7 +6004,7 @@ "type": "tidelift" } ], - "time": "2025-09-28T12:09:13+00:00" + "time": "2025-11-13T07:20:26+00:00" }, { "name": "predis/predis", @@ -6794,86 +6070,101 @@ "time": "2025-08-06T06:41:24+00:00" }, { - "name": "sebastian/cli-parser", - "version": "3.0.2", + "name": "revolt/event-loop", + "version": "v1.0.7", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + "url": "https://github.com/revoltphp/event-loop.git", + "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3", + "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "ext-json": "*", + "jetbrains/phpstorm-stubs": "^2019.3", + "phpunit/phpunit": "^9", + "psalm/phar": "^5.15" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "1.x-dev" } }, "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "Revolt\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "name": "Aaron Piotrowski", + "email": "aaron@trowski.com" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "ceesjank@gmail.com" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + }, + { + "name": "Niklas Keller", + "email": "me@kelunik.com" } ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", + "description": "Rock-solid event loop for concurrent PHP applications.", + "keywords": [ + "async", + "asynchronous", + "concurrency", + "event", + "event-loop", + "non-blocking", + "scheduler" + ], "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + "issues": "https://github.com/revoltphp/event-loop/issues", + "source": "https://github.com/revoltphp/event-loop/tree/v1.0.7" }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:41:36+00:00" + "time": "2025-01-25T19:27:39+00:00" }, { - "name": "sebastian/code-unit", - "version": "3.0.3", + "name": "sebastian/cli-parser", + "version": "4.2.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.5" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.2-dev" } }, "autoload": { @@ -6892,100 +6183,56 @@ "role": "lead" } ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "security": "https://github.com/sebastianbergmann/code-unit/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2025-03-19T07:56:08+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ + }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" - }, - "funding": [ + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" } ], - "time": "2024-07-03T04:45:54+00:00" + "time": "2025-09-14T09:36:45+00:00" }, { "name": "sebastian/comparator", - "version": "6.3.2", + "version": "7.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8" + "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8", - "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dc904b4bb3ab070865fa4068cd84f3da8b945148", + "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/diff": "^6.0", - "sebastian/exporter": "^6.0" + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.4" + "phpunit/phpunit": "^12.2" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -6993,7 +6240,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.3-dev" + "dev-main": "7.1-dev" } }, "autoload": { @@ -7033,7 +6280,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.3" }, "funding": [ { @@ -7053,33 +6300,33 @@ "type": "tidelift" } ], - "time": "2025-08-10T08:07:46+00:00" + "time": "2025-08-20T11:27:00+00:00" }, { "name": "sebastian/complexity", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -7103,7 +6350,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" }, "funding": [ { @@ -7111,33 +6358,33 @@ "type": "github" } ], - "time": "2024-07-03T04:49:50+00:00" + "time": "2025-02-07T04:55:25+00:00" }, { "name": "sebastian/diff", - "version": "6.0.2", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0", - "symfony/process": "^4.2 || ^5" + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -7170,7 +6417,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" }, "funding": [ { @@ -7178,27 +6425,27 @@ "type": "github" } ], - "time": "2024-07-03T04:53:05+00:00" + "time": "2025-02-07T04:55:46+00:00" }, { "name": "sebastian/environment", - "version": "7.2.1", + "version": "8.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-posix": "*" @@ -7206,7 +6453,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "7.2-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -7234,7 +6481,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" }, "funding": [ { @@ -7254,34 +6501,34 @@ "type": "tidelift" } ], - "time": "2025-05-21T11:55:47+00:00" + "time": "2025-08-12T14:11:56+00:00" }, { "name": "sebastian/exporter", - "version": "6.3.2", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" + "reference": "016951ae10980765e4e7aee491eb288c64e505b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", - "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.3-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -7324,7 +6571,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.2" }, "funding": [ { @@ -7344,35 +6591,35 @@ "type": "tidelift" } ], - "time": "2025-09-24T06:12:51+00:00" + "time": "2025-09-24T06:16:11+00:00" }, { "name": "sebastian/global-state", - "version": "7.0.2", + "version": "8.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + "reference": "ef1377171613d09edd25b7816f05be8313f9115d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -7398,41 +6645,53 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.2" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" } ], - "time": "2024-07-03T04:57:36+00:00" + "time": "2025-08-29T11:29:25+00:00" }, { "name": "sebastian/lines-of-code", - "version": "3.0.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -7456,7 +6715,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" }, "funding": [ { @@ -7464,34 +6723,34 @@ "type": "github" } ], - "time": "2024-07-03T04:58:38+00:00" + "time": "2025-02-07T04:57:28+00:00" }, { "name": "sebastian/object-enumerator", - "version": "6.0.1", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -7514,7 +6773,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" }, "funding": [ { @@ -7522,32 +6781,32 @@ "type": "github" } ], - "time": "2024-07-03T05:00:13+00:00" + "time": "2025-02-07T04:57:48+00:00" }, { "name": "sebastian/object-reflector", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -7570,7 +6829,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" }, "funding": [ { @@ -7578,32 +6837,32 @@ "type": "github" } ], - "time": "2024-07-03T05:01:32+00:00" + "time": "2025-02-07T04:58:17+00:00" }, { "name": "sebastian/recursion-context", - "version": "6.0.3", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", - "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -7634,7 +6893,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" }, "funding": [ { @@ -7654,32 +6913,98 @@ "type": "tidelift" } ], - "time": "2025-08-13T04:42:22+00:00" + "time": "2025-08-13T04:44:59+00:00" }, { "name": "sebastian/type", - "version": "5.1.3", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", - "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2025-08-09T06:57:12+00:00" + }, + { + "name": "sebastian/version", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "shasum": "" + }, + "require": { + "php": ">=8.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -7698,383 +7023,675 @@ "role": "lead" } ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-07T05:00:38+00:00" + }, + { + "name": "simplesamlphp/simplesamlphp-test-framework", + "version": "v1.10.4", + "source": { + "type": "git", + "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", + "reference": "352be3344677237eb72a5e05436bc5a8097d26d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/352be3344677237eb72a5e05436bc5a8097d26d1", + "reference": "352be3344677237eb72a5e05436bc5a8097d26d1", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "icanhazstring/composer-unused": "^0.9", + "maglnet/composer-require-checker": "^4", + "php": "^8.2", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpunit/phpunit": "^11.5 || ^12.3", + "psr/log": "^3.0", + "slevomat/coding-standard": "^8.20", + "squizlabs/php_codesniffer": "^3.13 || ^4.0", + "symfony/phpunit-bridge": "^7.3 || ^8.0" + }, + "require-dev": { + "simplesamlphp/simplesamlphp": "^2.4" + }, + "type": "project", + "autoload": { + "psr-4": { + "SimpleSAML\\TestUtils\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Tim van Dijen", + "email": "tvdijen@gmail.com" + } + ], + "description": "Test framework for SimpleSAMLphp and related repositories ", + "keywords": [ + "test-framework" + ], + "support": { + "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", + "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" + }, + "time": "2025-11-10T12:31:22+00:00" + }, + { + "name": "slevomat/coding-standard", + "version": "8.24.0", + "source": { + "type": "git", + "url": "https://github.com/slevomat/coding-standard.git", + "reference": "08e7989c0351f3f38b82172838195c35d9819efa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/08e7989c0351f3f38b82172838195c35d9819efa", + "reference": "08e7989c0351f3f38b82172838195c35d9819efa", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.1.2", + "php": "^7.4 || ^8.0", + "phpstan/phpdoc-parser": "^2.3.0", + "squizlabs/php_codesniffer": "^4.0.0" + }, + "require-dev": { + "phing/phing": "3.0.1|3.1.0", + "php-parallel-lint/php-parallel-lint": "1.4.0", + "phpstan/phpstan": "2.1.29", + "phpstan/phpstan-deprecation-rules": "2.0.3", + "phpstan/phpstan-phpunit": "2.0.7", + "phpstan/phpstan-strict-rules": "2.0.6", + "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.36|12.3.14" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "SlevomatCodingStandard\\": "SlevomatCodingStandard/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "keywords": [ + "dev", + "phpcs" + ], + "support": { + "issues": "https://github.com/slevomat/coding-standard/issues", + "source": "https://github.com/slevomat/coding-standard/tree/8.24.0" + }, + "funding": [ + { + "url": "https://github.com/kukulich", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "type": "tidelift" + } + ], + "time": "2025-09-25T21:37:40+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "0525c73950de35ded110cffafb9892946d7771b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0525c73950de35ded110cffafb9892946d7771b5", + "reference": "0525c73950de35ded110cffafb9892946d7771b5", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=7.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.4.0 || ^9.3.4 || ^10.5.32 || 11.3.3 - 11.5.28 || ^11.5.31" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/PHPCSStandards", "type": "github" }, { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" + "url": "https://github.com/jrfnl", + "type": "github" }, { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" }, { - "url": "https://tidelift.com/funding/github/packagist/sebastian/type", - "type": "tidelift" + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2025-08-09T06:55:48+00:00" + "time": "2025-11-10T16:43:36+00:00" }, { - "name": "sebastian/version", - "version": "5.0.2", + "name": "staabm/side-effects-detector", + "version": "1.0.5", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", "shasum": "" }, "require": { - "php": ">=8.2" + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" }, + "type": "library", "autoload": { "classmap": [ - "src/" + "lib/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" }, "funding": [ { - "url": "https://github.com/sebastianbergmann", + "url": "https://github.com/staabm", "type": "github" } ], - "time": "2024-10-09T05:16:32+00:00" + "time": "2024-10-20T05:08:20+00:00" }, { - "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.10.3", + "name": "symfony/phpunit-bridge", + "version": "v7.3.4", "source": { "type": "git", - "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "0571b27731ad4ec90a2350e6a927cb2214ad3a6b" + "url": "https://github.com/symfony/phpunit-bridge.git", + "reference": "ed77a629c13979e051b7000a317966474d566398" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/0571b27731ad4ec90a2350e6a927cb2214ad3a6b", - "reference": "0571b27731ad4ec90a2350e6a927cb2214ad3a6b", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/ed77a629c13979e051b7000a317966474d566398", + "reference": "ed77a629c13979e051b7000a317966474d566398", "shasum": "" }, "require": { - "ext-curl": "*", - "php": "^8.2", - "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "^2.1", - "phpstan/phpstan-mockery": "^2.0", - "phpunit/phpunit": "^11.5 || ^12.3", - "psr/log": "^3.0", - "slevomat/coding-standard": "^8.20", - "squizlabs/php_codesniffer": "^3.13 || ^4.0", - "symfony/phpunit-bridge": "^7.3 || ^8.0" + "php": ">=7.2.5" + }, + "conflict": { + "phpunit/phpunit": "<7.5|9.1.2" }, "require-dev": { - "simplesamlphp/simplesamlphp": "^2.4" + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/error-handler": "^5.4|^6.4|^7.0", + "symfony/polyfill-php81": "^1.27" + }, + "bin": [ + "bin/simple-phpunit" + ], + "type": "symfony-bridge", + "extra": { + "thanks": { + "url": "https://github.com/sebastianbergmann/phpunit", + "name": "phpunit/phpunit" + } }, - "type": "project", "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "SimpleSAML\\TestUtils\\": "lib/" - } + "Symfony\\Bridge\\PhpUnit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/bin/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-2.1-or-later" + "MIT" ], "authors": [ { - "name": "Tim van Dijen", - "email": "tvdijen@gmail.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "Test framework for SimpleSAMLphp and related repositories ", + "description": "Provides utilities for PHPUnit, especially user deprecation notices management", + "homepage": "https://symfony.com", "keywords": [ - "test-framework" + "testing" ], "support": { - "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.3.4" }, - "time": "2025-10-20T22:31:05+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-09-12T12:18:52+00:00" }, { - "name": "slevomat/coding-standard", - "version": "8.24.0", + "name": "symfony/polyfill-php84", + "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/slevomat/coding-standard.git", - "reference": "08e7989c0351f3f38b82172838195c35d9819efa" + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/08e7989c0351f3f38b82172838195c35d9819efa", - "reference": "08e7989c0351f3f38b82172838195c35d9819efa", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", "shasum": "" }, "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.1.2", - "php": "^7.4 || ^8.0", - "phpstan/phpdoc-parser": "^2.3.0", - "squizlabs/php_codesniffer": "^4.0.0" - }, - "require-dev": { - "phing/phing": "3.0.1|3.1.0", - "php-parallel-lint/php-parallel-lint": "1.4.0", - "phpstan/phpstan": "2.1.29", - "phpstan/phpstan-deprecation-rules": "2.0.3", - "phpstan/phpstan-phpunit": "2.0.7", - "phpstan/phpstan-strict-rules": "2.0.6", - "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.36|12.3.14" + "php": ">=7.2" }, - "type": "phpcodesniffer-standard", + "type": "library", "extra": { - "branch-alias": { - "dev-master": "8.x-dev" + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "SlevomatCodingStandard\\": "SlevomatCodingStandard/" - } + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", "keywords": [ - "dev", - "phpcs" + "compatibility", + "polyfill", + "portable", + "shim" ], "support": { - "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.24.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" }, "funding": [ { - "url": "https://github.com/kukulich", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-09-25T21:37:40+00:00" + "time": "2025-06-24T13:30:11+00:00" }, { - "name": "squizlabs/php_codesniffer", - "version": "4.0.0", + "name": "symfony/property-access", + "version": "v7.3.3", "source": { "type": "git", - "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "06113cfdaf117fc2165f9cd040bd0f17fcd5242d" + "url": "https://github.com/symfony/property-access.git", + "reference": "4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/06113cfdaf117fc2165f9cd040bd0f17fcd5242d", - "reference": "06113cfdaf117fc2165f9cd040bd0f17fcd5242d", + "url": "https://api.github.com/repos/symfony/property-access/zipball/4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7", + "reference": "4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7", "shasum": "" }, "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=7.2.0" + "php": ">=8.2", + "symfony/property-info": "^6.4|^7.0" }, "require-dev": { - "phpunit/phpunit": "^8.4.0 || ^9.3.4 || ^10.5.32 || 11.3.3 - 11.5.28 || ^11.5.31" + "symfony/cache": "^6.4|^7.0" }, - "bin": [ - "bin/phpcbf", - "bin/phpcs" - ], "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Greg Sherwood", - "role": "Former lead" - }, - { - "name": "Juliette Reinders Folmer", - "role": "Current lead" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { - "name": "Contributors", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "description": "PHP_CodeSniffer tokenizes PHP files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", "keywords": [ - "phpcs", - "standards", - "static analysis" + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" ], "support": { - "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", - "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", - "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", - "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + "source": "https://github.com/symfony/property-access/tree/v7.3.3" }, "funding": [ { - "url": "https://github.com/PHPCSStandards", - "type": "github" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "url": "https://github.com/jrfnl", + "url": "https://github.com/fabpot", "type": "github" }, { - "url": "https://opencollective.com/php_codesniffer", - "type": "open_collective" + "url": "https://github.com/nicolas-grekas", + "type": "github" }, { - "url": "https://thanks.dev/u/gh/phpcsstandards", - "type": "thanks_dev" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2025-09-15T11:28:58+00:00" + "time": "2025-08-04T15:15:28+00:00" }, { - "name": "staabm/side-effects-detector", - "version": "1.0.5", + "name": "symfony/property-info", + "version": "v7.3.5", "source": { "type": "git", - "url": "https://github.com/staabm/side-effects-detector.git", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + "url": "https://github.com/symfony/property-info.git", + "reference": "0b346ed259dc5da43535caf243005fe7d4b0f051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "url": "https://api.github.com/repos/symfony/property-info/zipball/0b346ed259dc5da43535caf243005fe7d4b0f051", + "reference": "0b346ed259dc5da43535caf243005fe7d4b0f051", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": "^7.4 || ^8.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0", + "symfony/type-info": "^7.3.5" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/serializer": "<6.4" }, "require-dev": { - "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.6", - "phpunit/phpunit": "^9.6.21", - "symfony/var-dumper": "^5.4.43", - "tomasvotruba/type-coverage": "1.0.0", - "tomasvotruba/unused-public": "1.0.0" + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" }, "type": "library", "autoload": { - "classmap": [ - "lib/" + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], - "description": "A static analysis tool to detect side effects in PHP code", + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", "keywords": [ - "static analysis" + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" ], "support": { - "issues": "https://github.com/staabm/side-effects-detector/issues", - "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + "source": "https://github.com/symfony/property-info/tree/v7.3.5" }, "funding": [ { - "url": "https://github.com/staabm", + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "time": "2024-10-20T05:08:20+00:00" + "time": "2025-10-05T22:12:41+00:00" }, { - "name": "symfony/phpunit-bridge", - "version": "v7.3.4", + "name": "symfony/serializer", + "version": "v7.3.5", "source": { "type": "git", - "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "ed77a629c13979e051b7000a317966474d566398" + "url": "https://github.com/symfony/serializer.git", + "reference": "ba2e50a5f2870c93f0f47ca1a4e56e4bbe274035" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/ed77a629c13979e051b7000a317966474d566398", - "reference": "ed77a629c13979e051b7000a317966474d566398", + "url": "https://api.github.com/repos/symfony/serializer/zipball/ba2e50a5f2870c93f0f47ca1a4e56e4bbe274035", + "reference": "ba2e50a5f2870c93f0f47ca1a4e56e4bbe274035", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php84": "^1.30" }, "conflict": { - "phpunit/phpunit": "<7.5|9.1.2" + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/uid": "<6.4", + "symfony/validator": "<6.4", + "symfony/yaml": "<6.4" }, "require-dev": { - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/error-handler": "^5.4|^6.4|^7.0", - "symfony/polyfill-php81": "^1.27" - }, - "bin": [ - "bin/simple-phpunit" - ], - "type": "symfony-bridge", - "extra": { - "thanks": { - "url": "https://github.com/sebastianbergmann/phpunit", - "name": "phpunit/phpunit" - } + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "seld/jsonlint": "^1.10", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^7.2", + "symfony/error-handler": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/type-info": "^7.1.8", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" }, + "type": "library", "autoload": { - "files": [ - "bootstrap.php" - ], "psr-4": { - "Symfony\\Bridge\\PhpUnit\\": "" + "Symfony\\Component\\Serializer\\": "" }, "exclude-from-classmap": [ - "/Tests/", - "/bin/" + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -8083,21 +7700,18 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Provides utilities for PHPUnit, especially user deprecation notices management", + "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", - "keywords": [ - "testing" - ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.3.4" + "source": "https://github.com/symfony/serializer/tree/v7.3.5" }, "funding": [ { @@ -8117,7 +7731,7 @@ "type": "tidelift" } ], - "time": "2025-09-12T12:18:52+00:00" + "time": "2025-10-08T11:26:21+00:00" }, { "name": "symfony/translation", @@ -8219,18 +7833,101 @@ ], "time": "2025-09-07T11:39:36+00:00" }, + { + "name": "symfony/type-info", + "version": "v7.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "8b36f41421160db56914f897b57eaa6a830758b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/type-info/zipball/8b36f41421160db56914f897b57eaa6a830758b3", + "reference": "8b36f41421160db56914f897b57eaa6a830758b3", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.30" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.30|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v7.3.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-10-16T12:30:12+00:00" + }, { "name": "theseer/tokenizer", - "version": "1.2.3", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "reference": "d74205c497bfbca49f34d4bc4c19c17e22db4ebb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/d74205c497bfbca49f34d4bc4c19c17e22db4ebb", + "reference": "d74205c497bfbca49f34d4bc4c19c17e22db4ebb", "shasum": "" }, "require": { @@ -8259,7 +7956,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + "source": "https://github.com/theseer/tokenizer/tree/1.3.0" }, "funding": [ { @@ -8267,7 +7964,56 @@ "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2025-11-13T13:44:09+00:00" + }, + { + "name": "webmozart/glob", + "version": "4.7.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/glob.git", + "reference": "8a2842112d6916e61e0e15e316465b611f3abc17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/glob/zipball/8a2842112d6916e61e0e15e316465b611f3abc17", + "reference": "8a2842112d6916e61e0e15e316465b611f3abc17", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "symfony/filesystem": "^5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Glob\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "A PHP implementation of Ant's glob.", + "support": { + "issues": "https://github.com/webmozarts/glob/issues", + "source": "https://github.com/webmozarts/glob/tree/4.7.0" + }, + "time": "2024-03-07T20:33:40+00:00" } ], "aliases": [], @@ -8295,5 +8041,5 @@ "ext-curl": "*", "ext-pdo_sqlite": "*" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } From 81a69fd2aeb32a3a169ed9bee68d9ce2584db8b5 Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Sun, 16 Nov 2025 00:09:14 +0100 Subject: [PATCH 415/532] Equalize some docs with master (#2543) --- docs/simplesamlphp-ecp-idp.md | 4 ++-- docs/simplesamlphp-errorhandling.md | 2 +- docs/simplesamlphp-googleapps.md | 2 +- docs/simplesamlphp-hok-idp.md | 12 ++++++++++-- docs/simplesamlphp-idp-more.md | 6 +++--- docs/simplesamlphp-idp.md | 4 ++-- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/docs/simplesamlphp-ecp-idp.md b/docs/simplesamlphp-ecp-idp.md index e541c0056e..dd0ffa2948 100644 --- a/docs/simplesamlphp-ecp-idp.md +++ b/docs/simplesamlphp-ecp-idp.md @@ -37,11 +37,11 @@ The `saml20-idp-remote` metadata for simpleSAMLphp SPs should contain something 'SingleSignOnService' => [ 0 => [ 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', - 'Location' => 'https://idp.example.org/simplesaml/saml2/idp/SSOService.php', + 'Location' => 'https://idp.example.org/simplesaml/module.php/saml/idp/singleSignOnService', ], 1 => [ 'index' => 0, - 'Location' => 'https://didp.example.org/simplesaml/saml2/idp/SSOService.php', + 'Location' => 'https://didp.example.org/simplesaml/module.php/saml/idp/singleSignOnService', 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:SOAP', ], ], diff --git a/docs/simplesamlphp-errorhandling.md b/docs/simplesamlphp-errorhandling.md index 99200bc1e9..3a5e59539b 100644 --- a/docs/simplesamlphp-errorhandling.md +++ b/docs/simplesamlphp-errorhandling.md @@ -85,7 +85,7 @@ Throwing SAML 2 errors will tie your code directly to the SAML 2 protocol, and i On the SP side, we want to convert SAML 2 errors to SimpleSAMLphp exceptions again. This is handled by the `toException()` method in `\SimpleSAML\Module\saml\Error`. -The assertion consumer script of the SAML 2 authentication source (`modules/saml2/sp/acs.php`) uses this method. +The assertion consumer service of the SAML 2 authentication source uses this method. The result is that generic exceptions are thrown from that authentication source. For example, `NoPassive` errors will be converted back to instances of `\SAML2\Exception\Protocol\NoPassiveException`. diff --git a/docs/simplesamlphp-googleapps.md b/docs/simplesamlphp-googleapps.md index 7db85832f5..db7adfc947 100644 --- a/docs/simplesamlphp-googleapps.md +++ b/docs/simplesamlphp-googleapps.md @@ -187,7 +187,7 @@ You will find in the metadata the XML tag `` which contains the right URL to input in the field, it will look something like this: -`https://dev2.andreas.feide.no/simplesaml/saml2/idp/SSOService.php` +`https://dev2.andreas.feide.no/simplesaml/module.php/saml/idp/singleSignOnService` The Sign-out page or change password URL can be static pages on your server. (Google does not support SAML Single Log Out.) diff --git a/docs/simplesamlphp-hok-idp.md b/docs/simplesamlphp-hok-idp.md index d11463a08a..527924d42b 100644 --- a/docs/simplesamlphp-hok-idp.md +++ b/docs/simplesamlphp-hok-idp.md @@ -47,11 +47,19 @@ The `saml20-idp-remote` metadata for SimpleSAMLphp SPs should contain something [ 'hoksso:ProtocolBinding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', 'Binding' => 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser', - 'Location' => 'https://idp.example.org/simplesaml/saml2/idp/SSOService.php', + 'Location' => 'https://idp.example.org/simplesaml/module.php/saml/idp/singleSignOnService', + 'attributes' => [ + [ + 'namespaceURI' => 'urn:oasis:names:tc:SAML:2.0:profiles:holder-of-key:SSO:browser', + 'namespacePrefix' => 'hoksso', + 'attrName' => 'ProtocolBinding', + 'attrValue' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', + ], + ], ], [ 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', - 'Location' => 'https://idp.example.org/simplesaml/saml2/idp/SSOService.php', + 'Location' => 'https://idp.example.org/simplesaml/module.php/saml/idp/singleSignOnService', ], ], ``` diff --git a/docs/simplesamlphp-idp-more.md b/docs/simplesamlphp-idp-more.md index 5068730a87..4dadf4ca4f 100644 --- a/docs/simplesamlphp-idp-more.md +++ b/docs/simplesamlphp-idp-more.md @@ -35,11 +35,11 @@ If you do not want to start the SSO flow at the SP, you may use the IdP-first se Here is an example of such a URL: -`https://idp.example.org/simplesaml/saml2/idp/singleSignOnService?spentityid=urn:mace:feide.no:someservice` +`https://idp.example.org/simplesaml/module.php/saml/idp/singleSignOnService?spentityid=urn:mace:feide.no:someservice` You can also add a `RelayState` parameter to the IdP-first URL: -`https://idp.example.org/simplesaml/saml2/idp/singleSignOnService?spentityid=urn:mace:feide.no:someservice&RelayState=https://sp.example.org/somepage` +`https://idp.example.org/simplesaml/module.php/saml/idp/singleSignOnService?spentityid=urn:mace:feide.no:someservice&RelayState=https://sp.example.org/somepage` The `RelayState` parameter is often used to carry the URL the SP should redirect to after authentication. It is also possible to specify the Assertion Consumer URL with the `ConsumerURL` parameter. @@ -53,7 +53,7 @@ IdP-initiated logout IdP-initiated logout can be initiated by visiting the URL: -`https://idp.example.org/simplesaml/saml2/idp/initSingleLogout?ReturnTo=` +`https://idp.example.org/simplesaml/saml2/idp/SingleLogoutService.php?ReturnTo=` It will send a logout request to each SP, and afterwards return the user to the URL specified in the `ReturnTo` parameter. Bear in mind that IdPs might disallow redirecting to URLs other than those of their own for security reasons, so in order to get the redirection to work, it might be necessary to ask the IdP to whitelist the URL we are planning to redirect to. diff --git a/docs/simplesamlphp-idp.md b/docs/simplesamlphp-idp.md index 9c7eb9d2e9..b5af78fca3 100644 --- a/docs/simplesamlphp-idp.md +++ b/docs/simplesamlphp-idp.md @@ -232,14 +232,14 @@ If you do not want to start the SSO flow at the SP, you may use the IdP-first se Here is an example of such a URL: -`https://idp.example.org/simplesaml/saml2/idp/SSOService.php?spentityid=sp.example.org` +`https://idp.example.org/simplesaml/module.php/saml/idp/singleSignOnService?spentityid=sp.example.org` If the SP is a SimpleSAMLphp SP, you must also specify a `RelayState` parameter for the SP. This must be set to a URL the user should be redirected to after authentication. The `RelayState` parameter can be specified in the [SP configuration](./saml:sp), or it can be sent from the IdP. To send the RelayState parameter from a SimpleSAMLphp IdP, specify it in the query string to SSOService.php: -`https://idp.example.org/simplesaml/saml2/idp/SSOService.php?spentityid=sp.example.org&RelayState=https://sp.example.org/welcome.php` +`https://idp.example.org/simplesaml/module.php/saml/idp/singleSignOnService?spentityid=sp.example.org&RelayState=https://sp.example.org/welcome.php` To set it in the SP configuration, add it to `authsources.php`: From 6154614382f8b51b0453594e672634430f232cdf Mon Sep 17 00:00:00 2001 From: Guy Halse Date: Mon, 17 Nov 2025 23:49:33 +0200 Subject: [PATCH 416/532] store.redis.tls should apply to sentinels (#2557) --- src/SimpleSAML/Store/RedisStore.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SimpleSAML/Store/RedisStore.php b/src/SimpleSAML/Store/RedisStore.php index 8c93351ae9..96b02960b1 100644 --- a/src/SimpleSAML/Store/RedisStore.php +++ b/src/SimpleSAML/Store/RedisStore.php @@ -100,6 +100,7 @@ public function __construct(?Client $redis = null) 'service' => $mastergroup, 'prefix' => $prefix, 'parameters' => [ + 'scheme' => $scheme, 'database' => $database, ] + (!empty($ssl) ? ['ssl' => $ssl] : []) From 19a9c53b6a23a8973fb0cd64c65395fae95534a4 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 18 Nov 2025 09:11:15 +0100 Subject: [PATCH 417/532] Release 2.5.0-rc3 --- composer.json | 2 +- composer.lock | 546 +++++++++++++++++++++++++++++--------------------- 2 files changed, 321 insertions(+), 227 deletions(-) diff --git a/composer.json b/composer.json index 907a6f788c..1760eaa53a 100644 --- a/composer.json +++ b/composer.json @@ -142,5 +142,5 @@ "echo 'Post-install tasks completed!'" ] }, - "version": "v2.5.0" + "version": "v2.5.0-rc3" } diff --git a/composer.lock b/composer.lock index 5dd3390d5f..58dd77ebad 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b5be919f84270a10d8cb03844e2b1953", + "content-hash": "f45217929906460f80f6d5c025657fed", "packages": [ { "name": "gettext/gettext", @@ -5569,34 +5569,35 @@ }, { "name": "phpunit/php-code-coverage", - "version": "12.4.0", + "version": "11.0.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "67e8aed88f93d0e6e1cb7effe1a2dfc2fee6022c" + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/67e8aed88f93d0e6e1cb7effe1a2dfc2fee6022c", - "reference": "67e8aed88f93d0e6e1cb7effe1a2dfc2fee6022c", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", + "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.6.1", - "php": ">=8.3", - "phpunit/php-file-iterator": "^6.0", - "phpunit/php-text-template": "^5.0", - "sebastian/complexity": "^5.0", - "sebastian/environment": "^8.0.3", - "sebastian/lines-of-code": "^4.0", - "sebastian/version": "^6.0", + "nikic/php-parser": "^5.4.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^12.3.7" + "phpunit/phpunit": "^11.5.2" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -5605,7 +5606,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "12.4.x-dev" + "dev-main": "11.0.x-dev" } }, "autoload": { @@ -5634,7 +5635,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.4.0" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.11" }, "funding": [ { @@ -5654,32 +5655,32 @@ "type": "tidelift" } ], - "time": "2025-09-24T13:44:41+00:00" + "time": "2025-08-27T14:37:49+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "6.0.0", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782" + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -5707,7 +5708,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" }, "funding": [ { @@ -5715,28 +5716,28 @@ "type": "github" } ], - "time": "2025-02-07T04:58:37+00:00" + "time": "2024-08-27T05:02:59+00:00" }, { "name": "phpunit/php-invoker", - "version": "6.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", - "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-pcntl": "*" @@ -5744,7 +5745,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -5771,7 +5772,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" }, "funding": [ { @@ -5779,32 +5780,32 @@ "type": "github" } ], - "time": "2025-02-07T04:58:58+00:00" + "time": "2024-07-03T05:07:44+00:00" }, { "name": "phpunit/php-text-template", - "version": "5.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", - "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -5831,7 +5832,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" }, "funding": [ { @@ -5839,32 +5840,32 @@ "type": "github" } ], - "time": "2025-02-07T04:59:16+00:00" + "time": "2024-07-03T05:08:43+00:00" }, { "name": "phpunit/php-timer", - "version": "8.0.0", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", - "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -5891,7 +5892,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" }, "funding": [ { @@ -5899,20 +5900,20 @@ "type": "github" } ], - "time": "2025-02-07T04:59:38+00:00" + "time": "2024-07-03T05:09:35+00:00" }, { "name": "phpunit/phpunit", - "version": "12.4.3", + "version": "11.5.44", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "d8f644d8d9bb904867f7a0aeb1bd306e0d966949" + "reference": "c346885c95423eda3f65d85a194aaa24873cda82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d8f644d8d9bb904867f7a0aeb1bd306e0d966949", - "reference": "d8f644d8d9bb904867f7a0aeb1bd306e0d966949", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c346885c95423eda3f65d85a194aaa24873cda82", + "reference": "c346885c95423eda3f65d85a194aaa24873cda82", "shasum": "" }, "require": { @@ -5925,30 +5926,34 @@ "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=8.3", - "phpunit/php-code-coverage": "^12.4.0", - "phpunit/php-file-iterator": "^6.0.0", - "phpunit/php-invoker": "^6.0.0", - "phpunit/php-text-template": "^5.0.0", - "phpunit/php-timer": "^8.0.0", - "sebastian/cli-parser": "^4.2.0", - "sebastian/comparator": "^7.1.3", - "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.3", - "sebastian/exporter": "^7.0.2", - "sebastian/global-state": "^8.0.2", - "sebastian/object-enumerator": "^7.0.0", - "sebastian/type": "^6.0.3", - "sebastian/version": "^6.0.0", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.11", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.2", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.1", + "sebastian/exporter": "^6.3.2", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.3", + "sebastian/version": "^5.0.2", "staabm/side-effects-detector": "^1.0.5" }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { - "dev-main": "12.4-dev" + "dev-main": "11.5-dev" } }, "autoload": { @@ -5980,7 +5985,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.4.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.44" }, "funding": [ { @@ -6004,7 +6009,7 @@ "type": "tidelift" } ], - "time": "2025-11-13T07:20:26+00:00" + "time": "2025-11-13T07:17:35+00:00" }, { "name": "predis/predis", @@ -6143,28 +6148,28 @@ }, { "name": "sebastian/cli-parser", - "version": "4.2.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", - "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.2-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -6188,51 +6193,152 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.0" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - }, + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" + }, + "funding": [ { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-19T07:56:08+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ { - "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", - "type": "tidelift" + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" } ], - "time": "2025-09-14T09:36:45+00:00" + "time": "2024-07-03T04:45:54+00:00" }, { "name": "sebastian/comparator", - "version": "7.1.3", + "version": "6.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148" + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/dc904b4bb3ab070865fa4068cd84f3da8b945148", - "reference": "dc904b4bb3ab070865fa4068cd84f3da8b945148", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8", + "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.3", - "sebastian/diff": "^7.0", - "sebastian/exporter": "^7.0" + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^12.2" + "phpunit/phpunit": "^11.4" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -6240,7 +6346,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "7.1-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -6280,7 +6386,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2" }, "funding": [ { @@ -6300,33 +6406,33 @@ "type": "tidelift" } ], - "time": "2025-08-20T11:27:00+00:00" + "time": "2025-08-10T08:07:46+00:00" }, { "name": "sebastian/complexity", - "version": "5.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", - "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -6350,7 +6456,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" }, "funding": [ { @@ -6358,33 +6464,33 @@ "type": "github" } ], - "time": "2025-02-07T04:55:25+00:00" + "time": "2024-07-03T04:49:50+00:00" }, { "name": "sebastian/diff", - "version": "7.0.0", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "7ab1ea946c012266ca32390913653d844ecd085f" + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", - "reference": "7ab1ea946c012266ca32390913653d844ecd085f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0", - "symfony/process": "^7.2" + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -6417,7 +6523,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" }, "funding": [ { @@ -6425,27 +6531,27 @@ "type": "github" } ], - "time": "2025-02-07T04:55:46+00:00" + "time": "2024-07-03T04:53:05+00:00" }, { "name": "sebastian/environment", - "version": "8.0.3", + "version": "7.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.3" }, "suggest": { "ext-posix": "*" @@ -6453,7 +6559,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "7.2-dev" } }, "autoload": { @@ -6481,7 +6587,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" }, "funding": [ { @@ -6501,34 +6607,34 @@ "type": "tidelift" } ], - "time": "2025-08-12T14:11:56+00:00" + "time": "2025-05-21T11:55:47+00:00" }, { "name": "sebastian/exporter", - "version": "7.0.2", + "version": "6.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "016951ae10980765e4e7aee491eb288c64e505b7" + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", - "reference": "016951ae10980765e4e7aee491eb288c64e505b7", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.3", - "sebastian/recursion-context": "^7.0" + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -6571,7 +6677,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.2" + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" }, "funding": [ { @@ -6591,35 +6697,35 @@ "type": "tidelift" } ], - "time": "2025-09-24T06:16:11+00:00" + "time": "2025-09-24T06:12:51+00:00" }, { "name": "sebastian/global-state", - "version": "8.0.2", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "ef1377171613d09edd25b7816f05be8313f9115d" + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", - "reference": "ef1377171613d09edd25b7816f05be8313f9115d", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", "shasum": "" }, "require": { - "php": ">=8.3", - "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -6645,53 +6751,41 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", - "type": "tidelift" } ], - "time": "2025-08-29T11:29:25+00:00" + "time": "2024-07-03T04:57:36+00:00" }, { "name": "sebastian/lines-of-code", - "version": "4.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", - "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -6715,7 +6809,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" }, "funding": [ { @@ -6723,34 +6817,34 @@ "type": "github" } ], - "time": "2025-02-07T04:57:28+00:00" + "time": "2024-07-03T04:58:38+00:00" }, { "name": "sebastian/object-enumerator", - "version": "7.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", - "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", "shasum": "" }, "require": { - "php": ">=8.3", - "sebastian/object-reflector": "^5.0", - "sebastian/recursion-context": "^7.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -6773,7 +6867,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" }, "funding": [ { @@ -6781,32 +6875,32 @@ "type": "github" } ], - "time": "2025-02-07T04:57:48+00:00" + "time": "2024-07-03T05:00:13+00:00" }, { "name": "sebastian/object-reflector", - "version": "5.0.0", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "4bfa827c969c98be1e527abd576533293c634f6a" + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", - "reference": "4bfa827c969c98be1e527abd576533293c634f6a", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -6829,7 +6923,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" }, "funding": [ { @@ -6837,32 +6931,32 @@ "type": "github" } ], - "time": "2025-02-07T04:58:17+00:00" + "time": "2024-07-03T05:01:32+00:00" }, { "name": "sebastian/recursion-context", - "version": "7.0.1", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", - "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -6893,7 +6987,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" }, "funding": [ { @@ -6913,32 +7007,32 @@ "type": "tidelift" } ], - "time": "2025-08-13T04:44:59+00:00" + "time": "2025-08-13T04:42:22+00:00" }, { "name": "sebastian/type", - "version": "6.0.3", + "version": "5.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", - "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -6962,7 +7056,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" }, "funding": [ { @@ -6982,29 +7076,29 @@ "type": "tidelift" } ], - "time": "2025-08-09T06:57:12+00:00" + "time": "2025-08-09T06:55:48+00:00" }, { "name": "sebastian/version", - "version": "6.0.0", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", - "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", "shasum": "" }, "require": { - "php": ">=8.3" + "php": ">=8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -7028,7 +7122,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" }, "funding": [ { @@ -7036,7 +7130,7 @@ "type": "github" } ], - "time": "2025-02-07T05:00:38+00:00" + "time": "2024-10-09T05:16:32+00:00" }, { "name": "simplesamlphp/simplesamlphp-test-framework", @@ -7918,16 +8012,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.3.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "d74205c497bfbca49f34d4bc4c19c17e22db4ebb" + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/d74205c497bfbca49f34d4bc4c19c17e22db4ebb", - "reference": "d74205c497bfbca49f34d4bc4c19c17e22db4ebb", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { @@ -7956,7 +8050,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.3.0" + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, "funding": [ { @@ -7964,7 +8058,7 @@ "type": "github" } ], - "time": "2025-11-13T13:44:09+00:00" + "time": "2025-11-17T20:03:58+00:00" }, { "name": "webmozart/glob", From 87bd56f96bf570689cd27f8de6dcad81a93ed8f5 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 20 Nov 2025 20:26:43 +0100 Subject: [PATCH 418/532] Bump saml2-library --- composer.json | 2 +- composer.lock | 177 ++++++++++++++++++++++++++++++++------------------ 2 files changed, 115 insertions(+), 64 deletions(-) diff --git a/composer.json b/composer.json index 1760eaa53a..dca166feb3 100644 --- a/composer.json +++ b/composer.json @@ -63,7 +63,7 @@ "psr/log": "^3.0", "simplesamlphp/assert": "^1.9", "simplesamlphp/composer-module-installer": "^1.5", - "simplesamlphp/saml2": "^5.1.0-rc1", + "simplesamlphp/saml2": "~6.0", "simplesamlphp/saml2-legacy": "^4.19", "simplesamlphp/simplesamlphp-assets-base": "~2.5", "simplesamlphp/xml-common": "^2.0", diff --git a/composer.lock b/composer.lock index 58dd77ebad..f87b4b9d00 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f45217929906460f80f6d5c025657fed", + "content-hash": "8a3de50ebd0d2ca467418aa7aabacee4", "packages": [ { "name": "gettext/gettext", @@ -1053,25 +1053,25 @@ }, { "name": "simplesamlphp/composer-xmlprovider-installer", - "version": "v1.0.2", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/composer-xmlprovider-installer.git", - "reference": "3d882187b5b0b404c381a2e4d17498ca4b2785b3" + "reference": "294025c97062d96fe0b0c466a0a189f1a4010628" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/composer-xmlprovider-installer/zipball/3d882187b5b0b404c381a2e4d17498ca4b2785b3", - "reference": "3d882187b5b0b404c381a2e4d17498ca4b2785b3", + "url": "https://api.github.com/repos/simplesamlphp/composer-xmlprovider-installer/zipball/294025c97062d96fe0b0c466a0a189f1a4010628", + "reference": "294025c97062d96fe0b0c466a0a189f1a4010628", "shasum": "" }, "require": { - "composer-plugin-api": "^2.0", - "php": "^8.1" + "composer-plugin-api": "~2.9.0", + "php": "^8.2" }, "require-dev": { - "composer/composer": "^2.4", - "simplesamlphp/simplesamlphp-test-framework": "^1.5.4" + "composer/composer": "~2.9.0", + "simplesamlphp/simplesamlphp-test-framework": "~1.10.3" }, "type": "composer-plugin", "extra": { @@ -1089,22 +1089,22 @@ "description": "A composer plugin that will auto-generate a classmap with all classes that implement SerializableElementInterface.", "support": { "issues": "https://github.com/simplesamlphp/composer-xmlprovider-installer/issues", - "source": "https://github.com/simplesamlphp/composer-xmlprovider-installer/tree/v1.0.2" + "source": "https://github.com/simplesamlphp/composer-xmlprovider-installer/tree/v1.2.0" }, - "time": "2025-06-28T18:54:25+00:00" + "time": "2025-11-13T11:11:51+00:00" }, { "name": "simplesamlphp/saml2", - "version": "v5.1.0-rc1", + "version": "v6.0.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "6e3c2fed39884212e88c445a959fd12b12fc2c1e" + "reference": "11a1c44f248a95e688f97de6ad118d9c3a67afea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/6e3c2fed39884212e88c445a959fd12b12fc2c1e", - "reference": "6e3c2fed39884212e88c445a959fd12b12fc2c1e", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/11a1c44f248a95e688f97de6ad118d9c3a67afea", + "reference": "11a1c44f248a95e688f97de6ad118d9c3a67afea", "shasum": "" }, "require": { @@ -1114,22 +1114,21 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-zlib": "*", - "nyholm/psr7": "~1.8.2", + "nyholm/psr7": "~1.8", "php": "^8.2", - "psr/clock": "~1.0.0", + "psr/clock": "~1.0", "psr/http-message": "~2.0", - "psr/log": "~2.3.1 || ~3.0.0", - "simplesamlphp/assert": "~1.9.0", - "simplesamlphp/xml-common": "~2.0.3", - "simplesamlphp/xml-security": "~2.0.2", - "simplesamlphp/xml-soap": "~2.0.3" + "psr/log": "~2.3 || ~3.0", + "simplesamlphp/assert": "~1.9", + "simplesamlphp/xml-common": "~2.3", + "simplesamlphp/xml-security": "~2.0", + "simplesamlphp/xml-soap": "~2.0" }, "require-dev": { - "beste/clock": "~3.0.0", + "beste/clock": "~3.0", "ext-intl": "*", - "mockery/mockery": "~1.6.12", - "simplesamlphp/composer-xmlprovider-installer": "~1.0.2", - "simplesamlphp/simplesamlphp-test-framework": "~1.10.2" + "mockery/mockery": "~1.6", + "simplesamlphp/simplesamlphp-test-framework": "~1.10" }, "suggest": { "ext-soap": "*" @@ -1137,7 +1136,7 @@ "type": "simplesamlphp-xmlprovider", "extra": { "branch-alias": { - "dev-master": "v6.0.x-dev" + "dev-master": "v5.1.x-dev" } }, "autoload": { @@ -1166,9 +1165,9 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v5.1.0-rc1" + "source": "https://github.com/simplesamlphp/saml2/tree/v6.0.0" }, - "time": "2025-10-17T13:51:34+00:00" + "time": "2025-11-20T18:20:05+00:00" }, { "name": "simplesamlphp/saml2-legacy", @@ -1268,16 +1267,16 @@ }, { "name": "simplesamlphp/xml-common", - "version": "v2.0.3", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "a5a457fa0ed4228c1ccec9debe0ea4539e9e63fb" + "reference": "7e864651195fc80db3fedfa490c549f00d423d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/a5a457fa0ed4228c1ccec9debe0ea4539e9e63fb", - "reference": "a5a457fa0ed4228c1ccec9debe0ea4539e9e63fb", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/7e864651195fc80db3fedfa490c549f00d423d72", + "reference": "7e864651195fc80db3fedfa490c549f00d423d72", "shasum": "" }, "require": { @@ -1289,11 +1288,11 @@ "ext-pcre": "*", "ext-spl": "*", "php": "^8.2", - "simplesamlphp/assert": "~1.9.0", - "simplesamlphp/composer-xmlprovider-installer": "~1.0.2" + "simplesamlphp/assert": "~1.9", + "simplesamlphp/composer-xmlprovider-installer": "~1.2" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "~1.10.1" + "simplesamlphp/simplesamlphp-test-framework": "~1.10" }, "type": "simplesamlphp-xmlprovider", "autoload": { @@ -1327,20 +1326,20 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2025-09-27T13:42:00+00:00" + "time": "2025-11-20T16:45:06+00:00" }, { "name": "simplesamlphp/xml-security", - "version": "v2.0.4", + "version": "v2.0.8", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-security.git", - "reference": "df14c3091c1015dfee1725c7054e11b6103b11eb" + "reference": "a5c7c1db45c8891b07355f8c4038970ff8a0a2df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/df14c3091c1015dfee1725c7054e11b6103b11eb", - "reference": "df14c3091c1015dfee1725c7054e11b6103b11eb", + "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/a5c7c1db45c8891b07355f8c4038970ff8a0a2df", + "reference": "a5c7c1db45c8891b07355f8c4038970ff8a0a2df", "shasum": "" }, "require": { @@ -1351,11 +1350,11 @@ "ext-pcre": "*", "ext-spl": "*", "php": "^8.2", - "simplesamlphp/assert": "~1.9.0", - "simplesamlphp/xml-common": "~2.0.3" + "simplesamlphp/assert": "~1.9", + "simplesamlphp/xml-common": "~2.4" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "~1.10.2" + "simplesamlphp/simplesamlphp-test-framework": "~1.10" }, "type": "simplesamlphp-xmlprovider", "autoload": { @@ -1389,33 +1388,33 @@ ], "support": { "issues": "https://github.com/simplesamlphp/xml-security/issues", - "source": "https://github.com/simplesamlphp/xml-security/tree/v2.0.4" + "source": "https://github.com/simplesamlphp/xml-security/tree/v2.0.8" }, - "time": "2025-10-17T18:35:00+00:00" + "time": "2025-11-20T17:42:51+00:00" }, { "name": "simplesamlphp/xml-soap", - "version": "v2.0.3", + "version": "v2.0.7", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-soap.git", - "reference": "0ebd2bf05039a985e6a44ff4f67fc870399f5768" + "reference": "c794e1a6783ec7424f864c77776af7ba3983a53e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-soap/zipball/0ebd2bf05039a985e6a44ff4f67fc870399f5768", - "reference": "0ebd2bf05039a985e6a44ff4f67fc870399f5768", + "url": "https://api.github.com/repos/simplesamlphp/xml-soap/zipball/c794e1a6783ec7424f864c77776af7ba3983a53e", + "reference": "c794e1a6783ec7424f864c77776af7ba3983a53e", "shasum": "" }, "require": { "ext-dom": "*", "ext-pcre": "*", "php": "^8.2", - "simplesamlphp/assert": "~1.9.0", - "simplesamlphp/xml-common": "~2.0.3" + "simplesamlphp/assert": "~1.9", + "simplesamlphp/xml-common": "~2.4" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "~1.10.2" + "simplesamlphp/simplesamlphp-test-framework": "~1.10" }, "type": "simplesamlphp-xmlprovider", "extra": { @@ -1442,9 +1441,9 @@ "description": "SimpleSAMLphp library for XML SOAP", "support": { "issues": "https://github.com/simplesamlphp/xml-soap/issues", - "source": "https://github.com/simplesamlphp/xml-soap/tree/v2.0.3" + "source": "https://github.com/simplesamlphp/xml-soap/tree/v2.0.7" }, - "time": "2025-09-27T13:45:26+00:00" + "time": "2025-11-20T18:07:30+00:00" }, { "name": "symfony/cache", @@ -5567,6 +5566,59 @@ }, "time": "2024-10-14T03:18:12+00:00" }, + { + "name": "phpstan/phpstan-phpunit", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-phpunit.git", + "reference": "2fe9fbeceaf76dd1ebaa7bbbb25e2fb5e59db2fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/2fe9fbeceaf76dd1ebaa7bbbb25e2fb5e59db2fe", + "reference": "2fe9fbeceaf76dd1ebaa7bbbb25e2fb5e59db2fe", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^2.1.32" + }, + "conflict": { + "phpunit/phpunit": "<7.0" + }, + "require-dev": { + "nikic/php-parser": "^5", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^9.6" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPUnit extensions and rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-phpunit/issues", + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.8" + }, + "time": "2025-11-11T07:55:22+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "11.0.11", @@ -7134,16 +7186,16 @@ }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.10.4", + "version": "v1.10.5", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "352be3344677237eb72a5e05436bc5a8097d26d1" + "reference": "d1a20462abe549a483d27be7dc35a8cf78b0f285" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/352be3344677237eb72a5e05436bc5a8097d26d1", - "reference": "352be3344677237eb72a5e05436bc5a8097d26d1", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/d1a20462abe549a483d27be7dc35a8cf78b0f285", + "reference": "d1a20462abe549a483d27be7dc35a8cf78b0f285", "shasum": "" }, "require": { @@ -7154,6 +7206,7 @@ "phpstan/extension-installer": "^1.4", "phpstan/phpstan": "^2.1", "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^11.5 || ^12.3", "psr/log": "^3.0", "slevomat/coding-standard": "^8.20", @@ -7187,7 +7240,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2025-11-10T12:31:22+00:00" + "time": "2025-11-18T22:25:10+00:00" }, { "name": "slevomat/coding-standard", @@ -8112,9 +8165,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "simplesamlphp/saml2": 5 - }, + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { From 5c1986a0aab947467d48768c4c497f8d5a0ba538 Mon Sep 17 00:00:00 2001 From: Mark Kaulertz <33390109+m0ark@users.noreply.github.com> Date: Thu, 27 Nov 2025 02:21:34 +0100 Subject: [PATCH 419/532] Use PSR-14 events to replace hook infrastructure (#2560) * Replace hook infrastructure with PSR-14 events * fix lookup for module event listeners * remove redunant registration of module event listeners * use correct config key to resolve enabled modules * fix template reference * add missing event variable type hints * refactor: remove event dispatcher property and instantiate it locally * refactor: move enabled modules discovery to ModuleListenerProvider --- composer.json | 3 +- modules/admin/src/Controller/Config.php | 24 ++++ modules/admin/src/Controller/Federation.php | 8 ++ modules/admin/src/Controller/Menu.php | 6 + modules/admin/src/Event/AdminMenuEvent.php | 22 +++ modules/admin/src/Event/ConfigPageEvent.php | 20 +++ .../admin/src/Event/FederationPageEvent.php | 19 +++ modules/admin/src/Event/SanityCheckEvent.php | 34 +++++ modules/cron/hooks/hook_configpage.php | 22 --- modules/cron/hooks/hook_cron.php | 23 ---- modules/cron/src/Cron.php | 13 ++ modules/cron/src/Event/CronEvent.php | 43 ++++++ .../src/Event/Listener/ConfigPageListener.php | 22 +++ .../src/Event/Listener/CronEventListener.php | 20 +++ modules/saml/hooks/hook_sanitycheck.php | 60 -------- .../Listener/SamlSanityCheckListener.php | 81 +++++++++++ src/SimpleSAML/Error/ExceptionHandler.php | 7 + .../Event/Dispatcher/EventDispatcher.php | 46 +++++++ .../ModuleEventDispatcherFactory.php | 22 +++ .../Event/ExceptionHandlerEvent.php | 20 +++ .../Event/Provider/ModuleListenerProvider.php | 130 ++++++++++++++++++ 21 files changed, 539 insertions(+), 106 deletions(-) create mode 100644 modules/admin/src/Event/AdminMenuEvent.php create mode 100644 modules/admin/src/Event/ConfigPageEvent.php create mode 100644 modules/admin/src/Event/FederationPageEvent.php create mode 100644 modules/admin/src/Event/SanityCheckEvent.php delete mode 100644 modules/cron/hooks/hook_configpage.php delete mode 100644 modules/cron/hooks/hook_cron.php create mode 100644 modules/cron/src/Event/CronEvent.php create mode 100644 modules/cron/src/Event/Listener/ConfigPageListener.php create mode 100644 modules/cron/src/Event/Listener/CronEventListener.php delete mode 100644 modules/saml/hooks/hook_sanitycheck.php create mode 100644 modules/saml/src/Event/Listener/SamlSanityCheckListener.php create mode 100644 src/SimpleSAML/Event/Dispatcher/EventDispatcher.php create mode 100644 src/SimpleSAML/Event/Dispatcher/ModuleEventDispatcherFactory.php create mode 100644 src/SimpleSAML/Event/ExceptionHandlerEvent.php create mode 100644 src/SimpleSAML/Event/Provider/ModuleListenerProvider.php diff --git a/composer.json b/composer.json index dca166feb3..b15f2aac5e 100644 --- a/composer.json +++ b/composer.json @@ -56,10 +56,10 @@ "ext-simplexml": "*", "ext-SPL": "*", "ext-zlib": "*", - "gettext/gettext": "^5.7", "gettext/translator": "^1.2", "phpmailer/phpmailer": "^6.10", + "psr/event-dispatcher": "~1.0.0", "psr/log": "^3.0", "simplesamlphp/assert": "^1.9", "simplesamlphp/composer-module-installer": "^1.5", @@ -72,6 +72,7 @@ "symfony/config": "~7.3.0", "symfony/console": "~7.3.0", "symfony/dependency-injection": "~7.3.0", + "symfony/event-dispatcher": "~7.3.0", "symfony/expression-language": "~7.3.0", "symfony/filesystem": "~7.3.0", "symfony/finder": "~7.3.0", diff --git a/modules/admin/src/Controller/Config.php b/modules/admin/src/Controller/Config.php index 1f1fa66593..60a5f1ba46 100644 --- a/modules/admin/src/Controller/Config.php +++ b/modules/admin/src/Controller/Config.php @@ -5,8 +5,11 @@ namespace SimpleSAML\Module\admin\Controller; use SimpleSAML\Configuration; +use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; use SimpleSAML\Locale\Translate; use SimpleSAML\Module; +use SimpleSAML\Module\admin\Event\ConfigPageEvent; +use SimpleSAML\Module\admin\Event\SanityCheckEvent; use SimpleSAML\Session; use SimpleSAML\Utils; use SimpleSAML\XHTML\Template; @@ -144,6 +147,10 @@ public function main(/** @scrutinizer ignore-unused */ Request $request): Templa 'modulelist' => $this->getModuleList(), ]; + $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); + /** @var CronEvent $event */ + $event = $eventDispatcher->dispatch(new ConfigPageEvent($t)); + $t = $event->getTemplate(); Module::callHooks('configpage', $t); $this->menu->addOption('logout', $this->authUtils->getAdminLogoutURL(), Translate::noop('Log out')); return $this->menu->insert($t); @@ -372,8 +379,25 @@ protected function getPrerequisiteChecks(): array // Add module specific checks via the sanitycheck hook that a module can provide. + $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); + /** @var SanityCheckEvent $event */ + $event = $eventDispatcher->dispatch(new SanityCheckEvent()); + $hookinfo = [ 'info' => [], 'errors' => [] ]; Module::callHooks('sanitycheck', $hookinfo); + + // Merge results from the event into $hookinfo. Can be removed when hook infrastructure is removed. + $hookinfo = [ + 'info' => array_merge( + $event->getInfo(), + $hookinfo['info'], + ), + 'errors' => array_merge( + $event->getErrors(), + $hookinfo['errors'], + ), + ]; + foreach (['info', 'errors'] as $resulttype) { foreach ($hookinfo[$resulttype] as $result) { $matrix[] = [ diff --git a/modules/admin/src/Controller/Federation.php b/modules/admin/src/Controller/Federation.php index e95ab7b4c2..8dd39bb19d 100644 --- a/modules/admin/src/Controller/Federation.php +++ b/modules/admin/src/Controller/Federation.php @@ -9,6 +9,7 @@ use SimpleSAML\Assert\Assert; use SimpleSAML\Auth; use SimpleSAML\Configuration; +use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; use SimpleSAML\Locale\Translate; use SimpleSAML\Logger; use SimpleSAML\Metadata\MetaDataStorageHandler; @@ -17,6 +18,7 @@ use SimpleSAML\Metadata\Signer; use SimpleSAML\Module; use SimpleSAML\Module\adfs\IdP\ADFS as ADFS_IdP; +use SimpleSAML\Module\admin\Event\FederationPageEvent; use SimpleSAML\Module\saml\IdP\SAML2 as SAML2_IdP; use SimpleSAML\Utils; use SimpleSAML\XHTML\Template; @@ -25,6 +27,7 @@ use Symfony\Component\HttpFoundation\ResponseHeaderBag; use Symfony\Component\VarExporter\VarExporter; + use function array_merge; use function array_pop; use function array_values; @@ -181,6 +184,11 @@ public function main(/** @scrutinizer ignore-unused */ Request $request): Templa 'logouturl' => $this->authUtils->getAdminLogoutURL(), ]; + $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); + /** @var FederationPageEvent $event */ + $event = $eventDispatcher->dispatch(new FederationPageEvent($t)); + $t = $event->getTemplate(); + Module::callHooks('federationpage', $t); Assert::isInstanceOf($t, Template::class); diff --git a/modules/admin/src/Controller/Menu.php b/modules/admin/src/Controller/Menu.php index 084ee6c33b..99d7b34b80 100644 --- a/modules/admin/src/Controller/Menu.php +++ b/modules/admin/src/Controller/Menu.php @@ -5,8 +5,10 @@ namespace SimpleSAML\Module\admin\Controller; use SimpleSAML\Assert\Assert; +use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; use SimpleSAML\Locale\Translate; use SimpleSAML\Module; +use SimpleSAML\Module\admin\Event\AdminMenuEvent; use SimpleSAML\XHTML\Template; /** @@ -87,6 +89,10 @@ public function addOption(string $id, string $url, string $name): void public function insert(Template $template): Template { $template->data['menu'] = $this->options; + $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); + /** @var AdminMenuEvent $event */ + $event = $eventDispatcher->dispatch(new AdminMenuEvent($template)); + $template = $event->getTemplate(); Module::callHooks('adminmenu', $template); Assert::isInstanceOf($template, Template::class); diff --git a/modules/admin/src/Event/AdminMenuEvent.php b/modules/admin/src/Event/AdminMenuEvent.php new file mode 100644 index 0000000000..a2a62e8f38 --- /dev/null +++ b/modules/admin/src/Event/AdminMenuEvent.php @@ -0,0 +1,22 @@ +template = $template; + } + + public function getTemplate(): XHTML\Template + { + return $this->template; + } +} \ No newline at end of file diff --git a/modules/admin/src/Event/ConfigPageEvent.php b/modules/admin/src/Event/ConfigPageEvent.php new file mode 100644 index 0000000000..4259c93134 --- /dev/null +++ b/modules/admin/src/Event/ConfigPageEvent.php @@ -0,0 +1,20 @@ +template; + } +} \ No newline at end of file diff --git a/modules/admin/src/Event/FederationPageEvent.php b/modules/admin/src/Event/FederationPageEvent.php new file mode 100644 index 0000000000..0e837ee7bb --- /dev/null +++ b/modules/admin/src/Event/FederationPageEvent.php @@ -0,0 +1,19 @@ +template; + } +} \ No newline at end of file diff --git a/modules/admin/src/Event/SanityCheckEvent.php b/modules/admin/src/Event/SanityCheckEvent.php new file mode 100644 index 0000000000..d6f38a69a3 --- /dev/null +++ b/modules/admin/src/Event/SanityCheckEvent.php @@ -0,0 +1,34 @@ +info[] = $message; + } + + public function addError(string $message): void + { + $this->errors[] = $message; + } + + public function getInfo(): array + { + return $this->info; + } + + public function getErrors(): array + { + return $this->errors; + } +} \ No newline at end of file diff --git a/modules/cron/hooks/hook_configpage.php b/modules/cron/hooks/hook_configpage.php deleted file mode 100644 index 0442547aff..0000000000 --- a/modules/cron/hooks/hook_configpage.php +++ /dev/null @@ -1,22 +0,0 @@ -data['links'][] = [ - 'href' => Module::getModuleURL('cron/info'), - 'text' => Translate::noop('Cron module information page'), - ]; - - $template->getLocalization()->addModuleDomain('cron'); -} diff --git a/modules/cron/hooks/hook_cron.php b/modules/cron/hooks/hook_cron.php deleted file mode 100644 index 3f07679e94..0000000000 --- a/modules/cron/hooks/hook_cron.php +++ /dev/null @@ -1,23 +0,0 @@ -getOptionalBoolean('debug_message', true)) { - $croninfo['summary'][] = 'Cron did run tag [' . $croninfo['tag'] . '] at ' . date(DATE_RFC822); - } -} diff --git a/modules/cron/src/Cron.php b/modules/cron/src/Cron.php index 95df20c701..32312301f2 100644 --- a/modules/cron/src/Cron.php +++ b/modules/cron/src/Cron.php @@ -5,10 +5,13 @@ namespace SimpleSAML\Module\cron; use Exception; +use Psr\EventDispatcher\EventDispatcherInterface; use SimpleSAML\Assert\Assert; use SimpleSAML\Configuration; +use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; use SimpleSAML\Logger; use SimpleSAML\Module; +use SimpleSAML\Module\cron\Event\CronEvent; /** * Handles interactions with SSP's cron system/hooks. @@ -53,7 +56,17 @@ public function runTag(string $tag): array 'tag' => $tag, ]; + // DEPRECATED: call the hook infrastructure Module::callHooks('cron', $croninfo); + // NEW: dispatch the cron event + $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); + /** @var CronEvent $event */ + $event = $eventDispatcher->dispatch(new CronEvent($tag)); + // merge results from the event into $croninfo. Can be removed when hook infrastructure is removed. + $croninfo['summary'] = array_merge($croninfo['summary'], array_map( + fn ($result) => $result['message'], + $event->getResults() + )); Assert::isArray($croninfo); foreach ($summary as $s) { diff --git a/modules/cron/src/Event/CronEvent.php b/modules/cron/src/Event/CronEvent.php new file mode 100644 index 0000000000..114d805913 --- /dev/null +++ b/modules/cron/src/Event/CronEvent.php @@ -0,0 +1,43 @@ +tag; + } + + public function addResult(string $taskName, bool $success, string $message = ''): void + { + $this->results[$taskName] = [ + 'success' => $success, + 'message' => $message, + ]; + } + + public function getResults(): array + { + return $this->results; + } + + public function hasFailures(): bool + { + foreach ($this->results as $result) { + if (!$result['success']) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/modules/cron/src/Event/Listener/ConfigPageListener.php b/modules/cron/src/Event/Listener/ConfigPageListener.php new file mode 100644 index 0000000000..2c86a926cc --- /dev/null +++ b/modules/cron/src/Event/Listener/ConfigPageListener.php @@ -0,0 +1,22 @@ +getTemplate(); + + $template->data['links'][] = [ + 'href' => \SimpleSAML\Module::getModuleURL('cron/info'), + 'text' => \SimpleSAML\Locale\Translate::noop('Cron module information page'), + ]; + + $template->getLocalization()->addModuleDomain('cron'); + } +} \ No newline at end of file diff --git a/modules/cron/src/Event/Listener/CronEventListener.php b/modules/cron/src/Event/Listener/CronEventListener.php new file mode 100644 index 0000000000..dc18022499 --- /dev/null +++ b/modules/cron/src/Event/Listener/CronEventListener.php @@ -0,0 +1,20 @@ +getOptionalBoolean('debug_message', true)) { + $event->addResult('cron info', true, 'Cron did run tag [' . $event->getTag() . '] at ' . date(DATE_RFC822)); + } + } +} \ No newline at end of file diff --git a/modules/saml/hooks/hook_sanitycheck.php b/modules/saml/hooks/hook_sanitycheck.php deleted file mode 100644 index 08e7af3893..0000000000 --- a/modules/saml/hooks/hook_sanitycheck.php +++ /dev/null @@ -1,60 +0,0 @@ -getOptionalBoolean('enable.saml20-idp', false) !== false) { - $handler = MetaDataStorageHandler::getMetadataHandler(); - try { - $metadata = $handler->getMetaDataCurrent('saml20-idp-hosted'); - } catch (Exception $e) { - $hookinfo['errors'][] = MODID . Translate::noop('Hosted IdP metadata present'); - } - - if (isset($metadata)) { - $metadata_config = Configuration::loadfromArray($metadata); - $private = $cryptoUtils->loadPrivateKey($metadata_config, false); - $public = $cryptoUtils->loadPublicKey($metadata_config, false); - - $matches = matchingKeyPair($public['PEM'], $private['PEM'], $private['password']); - $hookinfo[$matches ? 'info' : 'errors'][] = MODID . - Translate::noop('Matching key-pair for signing assertions'); - - $private = $cryptoUtils->loadPrivateKey($metadata_config, false, 'new_'); - if ($private !== null) { - $public = $cryptoUtils->loadPublicKey($metadata_config, false, 'new_'); - $matches = matchingKeyPair($public['PEM'], $private['PEM'], $private['password']); - $hookinfo[$matches ? 'info' : 'errors'][] = MODID . - Translate::noop('Matching key-pair for signing assertions (rollover key)'); - } - } - } - - if ($config->getOptionalBoolean('metadata.sign.enable', false) !== false) { - $private = $cryptoUtils->loadPrivateKey($config, true, 'metadata.sign.'); - $public = $cryptoUtils->loadPublicKey($config, true, 'metadata.sign.'); - $matches = matchingKeyPair($public['PEM'], $private['PEM'], $private['password']); - $hookinfo[$matches ? 'info' : 'errors'][] = - MODID . Translate::noop('Matching key-pair for signing metadata'); - } -} - -function matchingKeyPair(string $publicKey, string $privateKey, ?string $password = null): bool -{ - return openssl_x509_check_private_key($publicKey, [$privateKey, $password]); -} diff --git a/modules/saml/src/Event/Listener/SamlSanityCheckListener.php b/modules/saml/src/Event/Listener/SamlSanityCheckListener.php new file mode 100644 index 0000000000..0ed1b300b0 --- /dev/null +++ b/modules/saml/src/Event/Listener/SamlSanityCheckListener.php @@ -0,0 +1,81 @@ +getOptionalBoolean('enable.saml20-idp', false) !== false) { + $handler = MetaDataStorageHandler::getMetadataHandler($config); + try { + $metadata = $handler->getMetaDataCurrent('saml20-idp-hosted'); + } catch (Exception $e) { + $event->addError(MODID . Translate::noop('Hosted IdP metadata present')); + } + + if (isset($metadata)) { + $metadata_config = Configuration::loadfromArray($metadata); + $private = $cryptoUtils->loadPrivateKey($metadata_config, false); + $public = $cryptoUtils->loadPublicKey($metadata_config, false); + + $matches = $this->matchingKeyPair($public['PEM'], $private['PEM'], $private['password']); + $message = MODID . + Translate::noop('Matching key-pair for signing assertions'); + if ($matches) { + $event->addInfo($message); + } else { + $event->addError($message); + } + + $private = $cryptoUtils->loadPrivateKey($metadata_config, false, 'new_'); + if ($private !== null) { + $public = $cryptoUtils->loadPublicKey($metadata_config, false, 'new_'); + $matches = $this->matchingKeyPair($public['PEM'], $private['PEM'], $private['password']); + $message = MODID . + Translate::noop('Matching key-pair for signing assertions (rollover key)'); + if ($matches) { + $event->addInfo($message); + } else { + $event->addError($message); + } + } + } + } + + if ($config->getOptionalBoolean('metadata.sign.enable', false) !== false) { + $private = $cryptoUtils->loadPrivateKey($config, true, 'metadata.sign.'); + $public = $cryptoUtils->loadPublicKey($config, true, 'metadata.sign.'); + $matches = $this->matchingKeyPair($public['PEM'], $private['PEM'], $private['password']); + $message = MODID . Translate::noop('Matching key-pair for signing metadata'); + if ($matches) { + $event->addInfo($message); + } else { + $event->addError($message); + } + } + } + + function matchingKeyPair( + string $publicKey, + string $privateKey, + #[\SensitiveParameter] + ?string $password = null, + ): bool { + return openssl_x509_check_private_key($publicKey, [$privateKey, $password]); + } +} \ No newline at end of file diff --git a/src/SimpleSAML/Error/ExceptionHandler.php b/src/SimpleSAML/Error/ExceptionHandler.php index efb4b5e26d..4b7c34daa4 100644 --- a/src/SimpleSAML/Error/ExceptionHandler.php +++ b/src/SimpleSAML/Error/ExceptionHandler.php @@ -6,6 +6,8 @@ use Error as BuiltinError; use Exception as BuiltinException; +use SimpleSAML\Event\ExceptionHandlerEvent; +use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; use SimpleSAML\Logger; use SimpleSAML\Module; use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; @@ -26,6 +28,11 @@ class ExceptionHandler */ public function customExceptionHandler(Throwable $exception): void { + $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); + /** @var ExceptionHandlerEvent $event */ + $event = $eventDispatcher->dispatch(new ExceptionHandlerEvent($exception)); + $exception = $event->getException(); + Module::callHooks('exception_handler', $exception); if ($exception instanceof MethodNotAllowedHttpException) { diff --git a/src/SimpleSAML/Event/Dispatcher/EventDispatcher.php b/src/SimpleSAML/Event/Dispatcher/EventDispatcher.php new file mode 100644 index 0000000000..e9bed7d10b --- /dev/null +++ b/src/SimpleSAML/Event/Dispatcher/EventDispatcher.php @@ -0,0 +1,46 @@ +isPropagationStopped()) { + return $event; + } + + /** @var iterable $listeners */ + $listeners = $this->listenerProvider->getListenersForEvent($event); + + foreach ($listeners as $listener) { + try { + // Call the listener + $listener($event); + } catch (\Throwable $e) { + // Log the error + \SimpleSAML\Logger::error('Error in event listener: ' . $e->getMessage()); + + // Rethrow the exception according to PSR-14 + throw $e; + } + + // Check if propagation should stop + if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) { + break; + } + } + + return $event; + } +} \ No newline at end of file diff --git a/src/SimpleSAML/Event/Dispatcher/ModuleEventDispatcherFactory.php b/src/SimpleSAML/Event/Dispatcher/ModuleEventDispatcherFactory.php new file mode 100644 index 0000000000..9f87c21184 --- /dev/null +++ b/src/SimpleSAML/Event/Dispatcher/ModuleEventDispatcherFactory.php @@ -0,0 +1,22 @@ +exception = $exception; + } + + public function getException(): \Throwable + { + return $this->exception; + } +} \ No newline at end of file diff --git a/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php b/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php new file mode 100644 index 0000000000..7299a0bccc --- /dev/null +++ b/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php @@ -0,0 +1,130 @@ +> */ + private array $listeners = []; + + public function __construct() + { + $configuration = Configuration::getInstance(); + $enabledModules = $configuration->getArray('module.enable', []); + $this->discoverListeners($enabledModules); + } + + + private function discoverListeners(array $enabledModules): void + { + foreach ($enabledModules as $moduleName => $enabled) { + if (!$enabled) { + continue; + } + + $listenerDir = dirname(__DIR__, 4) . "/modules/$moduleName/src/Event/Listener"; + + if (!is_dir($listenerDir)) { + continue; + } + + foreach(glob("{$listenerDir}/*.php") as $file) { + $className = $this->getClassNameFromFile($file, $moduleName); + + if (!$className || !class_exists($className)) { + continue; + } + + $this->registerListenerClass($className); + } + } + } + + private function registerListenerClass(string $className): void + { + $reflection = new \ReflectionClass($className); + + // support named methods with event type hints + foreach ($reflection->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) { + if ($method->getName() === '__construct') { + continue; + } + + $params = $method->getParameters(); + if (count($params) > 0) { + $eventType = $params[0]->getType(); + if ($eventType && !$eventType->isBuiltin()) { + $eventClass = $eventType->getName(); + $instance = new $className(); + $this->addListener($eventClass, [$instance, $method->getName()]); + } + } + } + } + + public function addListener(string $eventClass, callable $listener, int $priority = 0): void + { + if (!isset($this->listeners[$eventClass])) { + $this->listeners[$eventClass] = []; + } + + $this->listeners[$eventClass][] = [ + 'callable' => $listener, + 'priority' => $priority, + ]; + + // Sort listeners by priority (higher priority first) + usort($this->listeners[$eventClass], function ($a, $b) { + return $b['priority'] <=> $a['priority']; + }); + } + + /** + * Get the listeners for a specific event type. + * + * @param object $event The event object. + * + * @return iterable The listeners for the event type. + */ + public function getListenersForEvent(object $event): iterable + { + $eventClass = get_class($event); + + // check for exact class match + if (isset($this->listeners[$eventClass])) { + foreach ($this->listeners[$eventClass] as $listenerData) { + yield $listenerData['callable']; + } + } + + // check for parent classes + foreach (class_parents($event) as $parentClass) { + if (isset($this->listeners[$parentClass])) { + foreach ($this->listeners[$parentClass] as $listenerData) { + yield $listenerData['callable']; + } + } + } + + // check for implemented interfaces + foreach (class_implements($event) as $interface) { + if (isset($this->listeners[$interface])) { + foreach ($this->listeners[$interface] as $listenerData) { + yield $listenerData['callable']; + } + } + } + } + + private function getClassNameFromFile(string $file, string $moduleName): ?string + { + $basename = basename($file, '.php'); + $className = "SimpleSAML\\Module\\{$moduleName}\\Event\\Listener\\{$basename}"; + return $className; + } +} \ No newline at end of file From 33ee3aef489f3f9a6da30943d7456751a17cb108 Mon Sep 17 00:00:00 2001 From: Nathan Robertson Date: Thu, 27 Nov 2025 16:04:26 +1100 Subject: [PATCH 420/532] Add regular expression support to AttributeValueMap authproc filter (#2558) --- .../core/docs/authproc_attributevaluemap.md | 25 +++++- .../src/Auth/Process/AttributeValueMap.php | 22 ++++- .../Auth/Process/AttributeValueMapTest.php | 87 +++++++++++++++++++ 3 files changed, 132 insertions(+), 2 deletions(-) diff --git a/modules/core/docs/authproc_attributevaluemap.md b/modules/core/docs/authproc_attributevaluemap.md index d4e6d684c5..94b3f0a5ba 100644 --- a/modules/core/docs/authproc_attributevaluemap.md +++ b/modules/core/docs/authproc_attributevaluemap.md @@ -5,7 +5,8 @@ Filter that creates a target attribute based on one or more value(s) in source a Besides the mapping of source values to target values, the filter has the following options: * `%replace` can be used to replace all existing values in target with new ones (any existing values will be lost) -* `%keep` can be used to keep the source attribute, otherwise it will be removed. +* `%keep` can be used to keep the source attribute, otherwise it will be removed (regardless of whether there is a match or not). +* `%regex` can be used to evaluate the values as regular expressions instead of plain strings. **Examples**: @@ -84,3 +85,25 @@ Replace any existing `affiliation` attribute values and keep the `groups` attrib ], ], ], + +## Regular expressions + +Will add eduPersonAffiliation containing value `student` if the `memberOf` attribute contains +some value matching `/^cn=student,o=[a-z]+,o=organization,dc=org` +(eg. `cn=student,o=some,o=organization,dc=org`). +The `memberOf` attribute will be removed (use `%keep`, to keep it) and existing values in +`eduPersonAffiliation` will be merged (use `%replace` to replace them). + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeValueMap', + 'sourceattribute' => 'memberOf', + 'targetattribute' => 'eduPersonAffiliation', + '%regex', + 'values' => [ + 'student' => [ + '/^cn=student,o=[a-z]+,o=organization,dc=org$/', + ], + ], + ], + ], diff --git a/modules/core/src/Auth/Process/AttributeValueMap.php b/modules/core/src/Auth/Process/AttributeValueMap.php index 6c635ea56f..a7de2e40ac 100644 --- a/modules/core/src/Auth/Process/AttributeValueMap.php +++ b/modules/core/src/Auth/Process/AttributeValueMap.php @@ -46,6 +46,12 @@ class AttributeValueMap extends Auth\ProcessingFilter */ private bool $replace = false; + /** + * Whether $sourceattribute values should be treated as regular expressions or not. + * @var bool + */ + private bool $regex = false; + /** * Initialize the filter. @@ -66,6 +72,8 @@ public function __construct(array &$config, $reserved) $this->replace = true; } elseif ($value === '%keep') { $this->keep = true; + } elseif ($value === '%regex') { + $this->regex = true; } else { // unknown configuration option, log it and ignore the error Logger::warning( @@ -129,7 +137,19 @@ public function process(array &$state): void if (!is_array($values)) { $values = [$values]; } - if (count(array_intersect($values, $sourceattribute)) > 0) { + if ($this->regex) { + foreach ($sourceattribute as $sourcevalue) { + foreach ($values as $pattern) { + if (preg_match($pattern, $sourcevalue) === 1) { + Logger::debug("AttributeValueMap: regex match for '$value'"); + $targetvalues[] = $value; + // no need to check other patterns for this sourceattribute value + break 2; + } + } + } + continue; + } elseif (count(array_intersect($values, $sourceattribute)) > 0) { Logger::debug("AttributeValueMap: intersect match for '$value'"); $targetvalues[] = $value; } diff --git a/tests/modules/core/src/Auth/Process/AttributeValueMapTest.php b/tests/modules/core/src/Auth/Process/AttributeValueMapTest.php index 38ff6177ea..d8cd94a717 100644 --- a/tests/modules/core/src/Auth/Process/AttributeValueMapTest.php +++ b/tests/modules/core/src/Auth/Process/AttributeValueMapTest.php @@ -59,6 +59,34 @@ public function testBasic(): void } + /** + * The most basic test of no match. + * + * @throws \SimpleSAML\Error\Exception + */ + public function testBasicNoMatch(): void + { + $config = [ + 'sourceattribute' => 'memberOf', + 'targetattribute' => 'eduPersonAffiliation', + 'values' => [ + 'member' => [ + 'nomatch', + ], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['theGroup'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayNotHasKey('memberOf', $attributes); + $this->assertArrayNotHasKey('eduPersonAffiliation', $attributes); + } + + /** * Test basic functionality, remove duplicates * @@ -225,4 +253,63 @@ public function testMissingTargetAttribute(): void ]; self::processFilter($config, $request); } + + + /** + * Basic regular expression functionality test. + * + * @throws \SimpleSAML\Error\Exception + */ + public function testBasicRegex(): void + { + $config = [ + 'sourceattribute' => 'memberOf', + 'targetattribute' => 'eduPersonAffiliation', + '%regex', + 'values' => [ + 'member' => [ + '/^the/', + ], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['theGroup'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayNotHasKey('memberOf', $attributes); + $this->assertArrayHasKey('eduPersonAffiliation', $attributes); + $this->assertEquals($attributes['eduPersonAffiliation'], ['member']); + } + + + /** + * Basic regular expression functionality test of a "no match". + * + * @throws \SimpleSAML\Error\Exception + */ + public function testBasicRegexNoMatch(): void + { + $config = [ + 'sourceattribute' => 'memberOf', + 'targetattribute' => 'eduPersonAffiliation', + '%regex', + 'values' => [ + 'member' => [ + '/^nomatch$/', + ], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['theGroup'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayNotHasKey('memberOf', $attributes); + $this->assertArrayNotHasKey('eduPersonAffiliation', $attributes); + } } From f9e22464a60a8377ada6edca44aedfdbaf559f59 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 29 Nov 2025 21:31:14 +0100 Subject: [PATCH 421/532] Bump dependencies including Symfony 7.3 > 7.4 --- composer.json | 72 ++--- composer.lock | 834 +++++++++++++++++++++++++------------------------- 2 files changed, 456 insertions(+), 450 deletions(-) diff --git a/composer.json b/composer.json index b15f2aac5e..fd87ccc7b4 100644 --- a/composer.json +++ b/composer.json @@ -56,49 +56,49 @@ "ext-simplexml": "*", "ext-SPL": "*", "ext-zlib": "*", - "gettext/gettext": "^5.7", - "gettext/translator": "^1.2", - "phpmailer/phpmailer": "^6.10", - "psr/event-dispatcher": "~1.0.0", - "psr/log": "^3.0", - "simplesamlphp/assert": "^1.9", - "simplesamlphp/composer-module-installer": "^1.5", + "gettext/gettext": "~5.7", + "gettext/translator": "~1.2", + "phpmailer/phpmailer": "~6.10", + "psr/event-dispatcher": "~1.0", + "psr/log": "~3.0", + "simplesamlphp/assert": "~1.9", + "simplesamlphp/composer-module-installer": "~1.5", "simplesamlphp/saml2": "~6.0", - "simplesamlphp/saml2-legacy": "^4.19", - "simplesamlphp/simplesamlphp-assets-base": "~2.5", - "simplesamlphp/xml-common": "^2.0", - "simplesamlphp/xml-security": "^2.0", - "symfony/cache": "~7.3.0", - "symfony/config": "~7.3.0", - "symfony/console": "~7.3.0", - "symfony/dependency-injection": "~7.3.0", - "symfony/event-dispatcher": "~7.3.0", - "symfony/expression-language": "~7.3.0", - "symfony/filesystem": "~7.3.0", - "symfony/finder": "~7.3.0", - "symfony/framework-bundle": "~7.3.0", - "symfony/http-foundation": "~7.3.0", - "symfony/http-kernel": "~7.3.0", - "symfony/intl": "~7.3.0", - "symfony/password-hasher": "~7.3.0", - "symfony/polyfill-intl-icu": "~1.33.0", - "symfony/routing": "~7.3.0", - "symfony/translation-contracts": "~3.6.0", - "symfony/twig-bridge": "~7.3.0", - "symfony/var-exporter": "~7.3.0", - "symfony/yaml": "~7.3.0", - "twig/intl-extra": "~3.21.0", - "twig/twig": "^3.21.1" + "simplesamlphp/saml2-legacy": "~4.19", + "simplesamlphp/simplesamlphp-assets-base": "~2.5.0", + "simplesamlphp/xml-common": "~2.4", + "simplesamlphp/xml-security": "~2.0", + "symfony/cache": "~7.4", + "symfony/config": "~7.4", + "symfony/console": "~7.4", + "symfony/dependency-injection": "~7.4", + "symfony/event-dispatcher": "~7.4", + "symfony/expression-language": "~7.4", + "symfony/filesystem": "~7.4", + "symfony/finder": "~7.4", + "symfony/framework-bundle": "~7.4", + "symfony/http-foundation": "~7.4", + "symfony/http-kernel": "~7.4", + "symfony/intl": "~7.4", + "symfony/password-hasher": "~7.4", + "symfony/polyfill-intl-icu": "~1.33", + "symfony/routing": "~7.4", + "symfony/translation-contracts": "~3.6", + "symfony/twig-bridge": "~7.4", + "symfony/var-exporter": "~7.4", + "symfony/yaml": "~7.4", + "twig/intl-extra": "~3.21", + "twig/twig": "~3.21" }, "require-dev": { "ext-curl": "*", "ext-pdo_sqlite": "*", - "gettext/php-scanner": "~2.0.1", + "gettext/php-scanner": "~2.0", "mikey179/vfsstream": "~1.6", - "predis/predis": "~3.2.0", - "simplesamlphp/simplesamlphp-test-framework": "~1.10.3", - "symfony/translation": "~7.3.0" + "predis/predis": "~3.3", + "simplesamlphp/simplesamlphp-test-framework": "~1.10", + "symfony/translation": "~7.4" }, "suggest": { "predis/predis": "Needed if a Redis server is used to store session information", diff --git a/composer.lock b/composer.lock index f87b4b9d00..5acdbedd95 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8a3de50ebd0d2ca467418aa7aabacee4", + "content-hash": "a0e7d5e6cd96d3a2243700a40c83e383", "packages": [ { "name": "gettext/gettext", @@ -1447,16 +1447,16 @@ }, { "name": "symfony/cache", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "1277a1ec61c8d93ea61b2a59738f1deb9bfb6701" + "reference": "a7a1325a5de2e54ddb45fda002ff528162e48293" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/1277a1ec61c8d93ea61b2a59738f1deb9bfb6701", - "reference": "1277a1ec61c8d93ea61b2a59738f1deb9bfb6701", + "url": "https://api.github.com/repos/symfony/cache/zipball/a7a1325a5de2e54ddb45fda002ff528162e48293", + "reference": "a7a1325a5de2e54ddb45fda002ff528162e48293", "shasum": "" }, "require": { @@ -1464,12 +1464,14 @@ "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", "symfony/cache-contracts": "^3.6", - "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "conflict": { "doctrine/dbal": "<3.6", + "ext-redis": "<6.1", + "ext-relay": "<0.12.1", "symfony/dependency-injection": "<6.4", "symfony/http-kernel": "<6.4", "symfony/var-dumper": "<6.4" @@ -1484,13 +1486,13 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/clock": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/filesystem": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -1525,7 +1527,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.3.6" + "source": "https://github.com/symfony/cache/tree/v7.4.0" }, "funding": [ { @@ -1545,7 +1547,7 @@ "type": "tidelift" } ], - "time": "2025-10-30T13:22:58+00:00" + "time": "2025-11-16T10:14:42+00:00" }, { "name": "symfony/cache-contracts", @@ -1625,22 +1627,22 @@ }, { "name": "symfony/config", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "9d18eba95655a3152ae4c1d53c6cc34eb4d4a0b7" + "reference": "f76c74e93bce2b9285f2dad7fbd06fa8182a7a41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/9d18eba95655a3152ae4c1d53c6cc34eb4d4a0b7", - "reference": "9d18eba95655a3152ae4c1d53c6cc34eb4d4a0b7", + "url": "https://api.github.com/repos/symfony/config/zipball/f76c74e93bce2b9285f2dad7fbd06fa8182a7a41", + "reference": "f76c74e93bce2b9285f2dad7fbd06fa8182a7a41", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^7.1", + "symfony/filesystem": "^7.1|^8.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -1648,11 +1650,11 @@ "symfony/service-contracts": "<2.5" }, "require-dev": { - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -1680,7 +1682,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.3.6" + "source": "https://github.com/symfony/config/tree/v7.4.0" }, "funding": [ { @@ -1700,20 +1702,20 @@ "type": "tidelift" } ], - "time": "2025-11-02T08:04:43+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/console", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a" + "reference": "0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c28ad91448f86c5f6d9d2c70f0cf68bf135f252a", - "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a", + "url": "https://api.github.com/repos/symfony/console/zipball/0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8", + "reference": "0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8", "shasum": "" }, "require": { @@ -1721,7 +1723,7 @@ "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^7.2" + "symfony/string": "^7.2|^8.0" }, "conflict": { "symfony/dependency-injection": "<6.4", @@ -1735,16 +1737,16 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -1778,7 +1780,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.6" + "source": "https://github.com/symfony/console/tree/v7.4.0" }, "funding": [ { @@ -1798,28 +1800,28 @@ "type": "tidelift" } ], - "time": "2025-11-04T01:21:42+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69" + "reference": "3972ca7bbd649467b21a54870721b9e9f3652f9b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69", - "reference": "98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/3972ca7bbd649467b21a54870721b9e9f3652f9b", + "reference": "3972ca7bbd649467b21a54870721b9e9f3652f9b", "shasum": "" }, "require": { "php": ">=8.2", "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^3.5", - "symfony/var-exporter": "^6.4.20|^7.2.5" + "symfony/service-contracts": "^3.6", + "symfony/var-exporter": "^6.4.20|^7.2.5|^8.0" }, "conflict": { "ext-psr": "<1.1|>=2", @@ -1832,9 +1834,9 @@ "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/config": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -1862,7 +1864,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.3.6" + "source": "https://github.com/symfony/dependency-injection/tree/v7.4.0" }, "funding": [ { @@ -1882,7 +1884,7 @@ "type": "tidelift" } ], - "time": "2025-10-31T10:11:11+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1953,32 +1955,33 @@ }, { "name": "symfony/error-handler", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "bbe40bfab84323d99dab491b716ff142410a92a8" + "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/bbe40bfab84323d99dab491b716ff142410a92a8", - "reference": "bbe40bfab84323d99dab491b716ff142410a92a8", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/48be2b0653594eea32dcef130cca1c811dcf25c2", + "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2", "shasum": "" }, "require": { "php": ">=8.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "conflict": { "symfony/deprecation-contracts": "<2.5", "symfony/http-kernel": "<6.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0|^8.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ @@ -2010,7 +2013,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.3.6" + "source": "https://github.com/symfony/error-handler/tree/v7.4.0" }, "funding": [ { @@ -2030,20 +2033,20 @@ "type": "tidelift" } ], - "time": "2025-10-31T19:12:50+00:00" + "time": "2025-11-05T14:29:59+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.3.3", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191" + "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191", - "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9dddcddff1ef974ad87b3708e4b442dc38b2261d", + "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d", "shasum": "" }, "require": { @@ -2060,13 +2063,14 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/error-handler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^6.4|^7.0" + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -2094,7 +2098,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.0" }, "funding": [ { @@ -2114,7 +2118,7 @@ "type": "tidelift" } ], - "time": "2025-08-13T11:49:31+00:00" + "time": "2025-10-28T09:38:46+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -2194,21 +2198,21 @@ }, { "name": "symfony/expression-language", - "version": "v7.3.2", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "32d2d19c62e58767e6552166c32fb259975d2b23" + "reference": "8b9bbbb8c71f79a09638f6ea77c531e511139efa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/32d2d19c62e58767e6552166c32fb259975d2b23", - "reference": "32d2d19c62e58767e6552166c32fb259975d2b23", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/8b9bbbb8c71f79a09638f6ea77c531e511139efa", + "reference": "8b9bbbb8c71f79a09638f6ea77c531e511139efa", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/cache": "^6.4|^7.0", + "symfony/cache": "^6.4|^7.0|^8.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3" }, @@ -2238,7 +2242,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v7.3.2" + "source": "https://github.com/symfony/expression-language/tree/v7.4.0" }, "funding": [ { @@ -2258,20 +2262,20 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:29:33+00:00" + "time": "2025-11-12T15:39:26+00:00" }, { "name": "symfony/filesystem", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a" + "reference": "d551b38811096d0be9c4691d406991b47c0c630a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/e9bcfd7837928ab656276fe00464092cc9e1826a", - "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a", + "reference": "d551b38811096d0be9c4691d406991b47c0c630a", "shasum": "" }, "require": { @@ -2280,7 +2284,7 @@ "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^6.4|^7.0" + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -2308,7 +2312,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.3.6" + "source": "https://github.com/symfony/filesystem/tree/v7.4.0" }, "funding": [ { @@ -2328,27 +2332,27 @@ "type": "tidelift" } ], - "time": "2025-11-05T09:52:27+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/finder", - "version": "v7.3.5", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9f696d2f1e340484b4683f7853b273abff94421f" + "reference": "340b9ed7320570f319028a2cbec46d40535e94bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f", - "reference": "9f696d2f1e340484b4683f7853b273abff94421f", + "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd", + "reference": "340b9ed7320570f319028a2cbec46d40535e94bd", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "symfony/filesystem": "^6.4|^7.0" + "symfony/filesystem": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -2376,7 +2380,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.3.5" + "source": "https://github.com/symfony/finder/tree/v7.4.0" }, "funding": [ { @@ -2396,38 +2400,39 @@ "type": "tidelift" } ], - "time": "2025-10-15T18:45:57+00:00" + "time": "2025-11-05T05:42:40+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "cabfdfa82bc4f75d693a329fe263d96937636b77" + "reference": "3c62a3437267ac55bcd40175689c74772250e943" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/cabfdfa82bc4f75d693a329fe263d96937636b77", - "reference": "cabfdfa82bc4f75d693a329fe263d96937636b77", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/3c62a3437267ac55bcd40175689c74772250e943", + "reference": "3c62a3437267ac55bcd40175689c74772250e943", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", "php": ">=8.2", - "symfony/cache": "^6.4|^7.0", - "symfony/config": "^7.3", - "symfony/dependency-injection": "^7.2", + "symfony/cache": "^6.4.12|^7.0|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^7.3", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/filesystem": "^7.1", - "symfony/finder": "^6.4|^7.0", - "symfony/http-foundation": "^7.3", - "symfony/http-kernel": "^7.2", + "symfony/error-handler": "^7.3|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^7.1|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^6.4|^7.0" + "symfony/polyfill-php85": "^1.32", + "symfony/routing": "^7.4|^8.0" }, "conflict": { "doctrine/persistence": "<1.3", @@ -2439,14 +2444,12 @@ "symfony/console": "<6.4", "symfony/dom-crawler": "<6.4", "symfony/dotenv": "<6.4", - "symfony/form": "<6.4", + "symfony/form": "<7.4", "symfony/http-client": "<6.4", - "symfony/json-streamer": ">=7.4", "symfony/lock": "<6.4", "symfony/mailer": "<6.4", - "symfony/messenger": "<6.4", + "symfony/messenger": "<7.4", "symfony/mime": "<6.4", - "symfony/object-mapper": ">=7.4", "symfony/property-access": "<6.4", "symfony/property-info": "<6.4", "symfony/runtime": "<6.4.13|>=7.0,<7.1.6", @@ -2461,51 +2464,52 @@ "symfony/validator": "<6.4", "symfony/web-profiler-bundle": "<6.4", "symfony/webhook": "<7.2", - "symfony/workflow": "<7.3.0-beta2" + "symfony/workflow": "<7.4" }, "require-dev": { "doctrine/persistence": "^1.3|^2|^3", "dragonmantank/cron-expression": "^3.1", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "seld/jsonlint": "^1.10", - "symfony/asset": "^6.4|^7.0", - "symfony/asset-mapper": "^6.4|^7.0", - "symfony/browser-kit": "^6.4|^7.0", - "symfony/clock": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/css-selector": "^6.4|^7.0", - "symfony/dom-crawler": "^6.4|^7.0", - "symfony/dotenv": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/form": "^6.4|^7.0", - "symfony/html-sanitizer": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/json-streamer": "7.3.*", - "symfony/lock": "^6.4|^7.0", - "symfony/mailer": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/notifier": "^6.4|^7.0", - "symfony/object-mapper": "^v7.3.0-beta2", + "symfony/asset": "^6.4|^7.0|^8.0", + "symfony/asset-mapper": "^6.4|^7.0|^8.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/dotenv": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/form": "^7.4|^8.0", + "symfony/html-sanitizer": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/json-streamer": "^7.3|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/mailer": "^6.4|^7.0|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/notifier": "^6.4|^7.0|^8.0", + "symfony/object-mapper": "^7.3|^8.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0", - "symfony/scheduler": "^6.4.4|^7.0.4", - "symfony/security-bundle": "^6.4|^7.0", - "symfony/semaphore": "^6.4|^7.0", - "symfony/serializer": "^7.2.5", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/string": "^6.4|^7.0", - "symfony/translation": "^7.3", - "symfony/twig-bundle": "^6.4|^7.0", - "symfony/type-info": "^7.1.8", - "symfony/uid": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/web-link": "^6.4|^7.0", - "symfony/webhook": "^7.2", - "symfony/workflow": "^7.3", - "symfony/yaml": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/runtime": "^6.4.13|^7.1.6|^8.0", + "symfony/scheduler": "^6.4.4|^7.0.4|^8.0", + "symfony/security-bundle": "^6.4|^7.0|^8.0", + "symfony/semaphore": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.2.5|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/translation": "^7.3|^8.0", + "symfony/twig-bundle": "^6.4|^7.0|^8.0", + "symfony/type-info": "^7.1.8|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/web-link": "^6.4|^7.0|^8.0", + "symfony/webhook": "^7.2|^8.0", + "symfony/workflow": "^7.4|^8.0", + "symfony/yaml": "^7.3|^8.0", "twig/twig": "^3.12" }, "type": "symfony-bundle", @@ -2534,7 +2538,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.3.6" + "source": "https://github.com/symfony/framework-bundle/tree/v7.4.0" }, "funding": [ { @@ -2554,27 +2558,26 @@ "type": "tidelift" } ], - "time": "2025-10-30T09:42:24+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.3.7", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "db488a62f98f7a81d5746f05eea63a74e55bb7c4" + "reference": "769c1720b68e964b13b58529c17d4a385c62167b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/db488a62f98f7a81d5746f05eea63a74e55bb7c4", - "reference": "db488a62f98f7a81d5746f05eea63a74e55bb7c4", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/769c1720b68e964b13b58529c17d4a385c62167b", + "reference": "769c1720b68e964b13b58529c17d4a385c62167b", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php83": "^1.27" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.1" }, "conflict": { "doctrine/dbal": "<3.6", @@ -2583,13 +2586,13 @@ "require-dev": { "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4.12|^7.1.5", - "symfony/clock": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0" + "symfony/cache": "^6.4.12|^7.1.5|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -2617,7 +2620,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.3.7" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.0" }, "funding": [ { @@ -2637,29 +2640,29 @@ "type": "tidelift" } ], - "time": "2025-11-08T16:41:12+00:00" + "time": "2025-11-13T08:49:24+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.3.7", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "10b8e9b748ea95fa4539c208e2487c435d3c87ce" + "reference": "7348193cd384495a755554382e4526f27c456085" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/10b8e9b748ea95fa4539c208e2487c435d3c87ce", - "reference": "10b8e9b748ea95fa4539c208e2487c435d3c87ce", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/7348193cd384495a755554382e4526f27c456085", + "reference": "7348193cd384495a755554382e4526f27c456085", "shasum": "" }, "require": { "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^7.3", - "symfony/http-foundation": "^7.3", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^7.3|^8.0", + "symfony/http-foundation": "^7.4|^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -2669,6 +2672,7 @@ "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", "symfony/doctrine-bridge": "<6.4", + "symfony/flex": "<2.10", "symfony/form": "<6.4", "symfony/http-client": "<6.4", "symfony/http-client-contracts": "<2.5", @@ -2686,27 +2690,27 @@ }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^6.4|^7.0", - "symfony/clock": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/css-selector": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/dom-crawler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", "symfony/http-client-contracts": "^2.5|^3", - "symfony/process": "^6.4|^7.0", - "symfony/property-access": "^7.1", - "symfony/routing": "^6.4|^7.0", - "symfony/serializer": "^7.1", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^7.1|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.1|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0", - "symfony/var-exporter": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", "twig/twig": "^3.12" }, "type": "library", @@ -2735,7 +2739,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.3.7" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.0" }, "funding": [ { @@ -2755,20 +2759,20 @@ "type": "tidelift" } ], - "time": "2025-11-12T11:38:40+00:00" + "time": "2025-11-27T13:38:24+00:00" }, { "name": "symfony/intl", - "version": "v7.3.5", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "9eccaaa94ac6f9deb3620c9d47a057d965baeabf" + "reference": "2fa074de6c7faa6b54f2891fc22708f42245ed5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/9eccaaa94ac6f9deb3620c9d47a057d965baeabf", - "reference": "9eccaaa94ac6f9deb3620c9d47a057d965baeabf", + "url": "https://api.github.com/repos/symfony/intl/zipball/2fa074de6c7faa6b54f2891fc22708f42245ed5c", + "reference": "2fa074de6c7faa6b54f2891fc22708f42245ed5c", "shasum": "" }, "require": { @@ -2779,8 +2783,8 @@ "symfony/string": "<7.1" }, "require-dev": { - "symfony/filesystem": "^6.4|^7.0", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -2825,7 +2829,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.3.5" + "source": "https://github.com/symfony/intl/tree/v7.4.0" }, "funding": [ { @@ -2845,20 +2849,20 @@ "type": "tidelift" } ], - "time": "2025-10-01T06:11:17+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/password-hasher", - "version": "v7.3.0", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "31fbe66af859582a20b803f38be96be8accdf2c3" + "reference": "aa075ce6f54fe931f03c1e382597912f4fd94e1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/31fbe66af859582a20b803f38be96be8accdf2c3", - "reference": "31fbe66af859582a20b803f38be96be8accdf2c3", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/aa075ce6f54fe931f03c1e382597912f4fd94e1e", + "reference": "aa075ce6f54fe931f03c1e382597912f4fd94e1e", "shasum": "" }, "require": { @@ -2868,8 +2872,8 @@ "symfony/security-core": "<6.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0", - "symfony/security-core": "^6.4|^7.0" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -2901,7 +2905,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.3.0" + "source": "https://github.com/symfony/password-hasher/tree/v7.4.0" }, "funding": [ { @@ -2912,12 +2916,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-02-04T08:22:58+00:00" + "time": "2025-08-13T16:46:49+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3343,17 +3351,17 @@ "time": "2024-12-23T08:48:59+00:00" }, { - "name": "symfony/polyfill-php83", + "name": "symfony/polyfill-php85", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", "shasum": "" }, "require": { @@ -3371,7 +3379,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" + "Symfony\\Polyfill\\Php85\\": "" }, "classmap": [ "Resources/stubs" @@ -3391,7 +3399,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -3400,7 +3408,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" }, "funding": [ { @@ -3420,20 +3428,20 @@ "type": "tidelift" } ], - "time": "2025-07-08T02:45:35+00:00" + "time": "2025-06-23T16:12:55+00:00" }, { "name": "symfony/routing", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "c97abe725f2a1a858deca629a6488c8fc20c3091" + "reference": "4720254cb2644a0b876233d258a32bf017330db7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/c97abe725f2a1a858deca629a6488c8fc20c3091", - "reference": "c97abe725f2a1a858deca629a6488c8fc20c3091", + "url": "https://api.github.com/repos/symfony/routing/zipball/4720254cb2644a0b876233d258a32bf017330db7", + "reference": "4720254cb2644a0b876233d258a32bf017330db7", "shasum": "" }, "require": { @@ -3447,11 +3455,11 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -3485,7 +3493,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.3.6" + "source": "https://github.com/symfony/routing/tree/v7.4.0" }, "funding": [ { @@ -3505,7 +3513,7 @@ "type": "tidelift" } ], - "time": "2025-11-05T07:57:47+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/service-contracts", @@ -3596,22 +3604,23 @@ }, { "name": "symfony/string", - "version": "v7.3.4", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f96476035142921000338bad71e5247fbc138872" + "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872", - "reference": "f96476035142921000338bad71e5247fbc138872", + "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003", + "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-grapheme": "~1.33", "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0" }, @@ -3619,11 +3628,11 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/emoji": "^7.1", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -3662,7 +3671,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.3.4" + "source": "https://github.com/symfony/string/tree/v7.4.0" }, "funding": [ { @@ -3682,7 +3691,7 @@ "type": "tidelift" } ], - "time": "2025-09-11T14:36:48+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/translation-contracts", @@ -3768,16 +3777,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "d1aaec8eee1f5591f56b9efe00194d73a8e38319" + "reference": "e96998da928007554b8b8c02e677861877daced9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d1aaec8eee1f5591f56b9efe00194d73a8e38319", - "reference": "d1aaec8eee1f5591f56b9efe00194d73a8e38319", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/e96998da928007554b8b8c02e677861877daced9", + "reference": "e96998da928007554b8b8c02e677861877daced9", "shasum": "" }, "require": { @@ -3802,33 +3811,33 @@ "egulias/email-validator": "^2.1.10|^3|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^6.4|^7.0", - "symfony/asset-mapper": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/emoji": "^7.1", - "symfony/expression-language": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/form": "^6.4.20|^7.2.5", - "symfony/html-sanitizer": "^6.4|^7.0", - "symfony/http-foundation": "^7.3", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", + "symfony/asset": "^6.4|^7.0|^8.0", + "symfony/asset-mapper": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/emoji": "^7.1|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/form": "^6.4.20|^7.2.5|^8.0", + "symfony/html-sanitizer": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^7.3|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^6.4|^7.0", - "symfony/routing": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^6.4|^7.0", - "symfony/security-csrf": "^6.4|^7.0", - "symfony/security-http": "^6.4|^7.0", - "symfony/serializer": "^6.4.3|^7.0.3", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/web-link": "^6.4|^7.0", - "symfony/workflow": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0", + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/security-csrf": "^6.4|^7.0|^8.0", + "symfony/security-http": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/web-link": "^6.4|^7.0|^8.0", + "symfony/workflow": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0", "twig/cssinliner-extra": "^3", "twig/inky-extra": "^3", "twig/markdown-extra": "^3" @@ -3859,7 +3868,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.3.6" + "source": "https://github.com/symfony/twig-bridge/tree/v7.4.0" }, "funding": [ { @@ -3879,20 +3888,20 @@ "type": "tidelift" } ], - "time": "2025-11-04T15:37:51+00:00" + "time": "2025-11-05T14:29:59+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.3.5", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "476c4ae17f43a9a36650c69879dcf5b1e6ae724d" + "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/476c4ae17f43a9a36650c69879dcf5b1e6ae724d", - "reference": "476c4ae17f43a9a36650c69879dcf5b1e6ae724d", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41fd6c4ae28c38b294b42af6db61446594a0dece", + "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece", "shasum": "" }, "require": { @@ -3904,10 +3913,10 @@ "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/uid": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", "twig/twig": "^3.12" }, "bin": [ @@ -3946,7 +3955,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.5" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.0" }, "funding": [ { @@ -3966,20 +3975,20 @@ "type": "tidelift" } ], - "time": "2025-09-27T09:00:46+00:00" + "time": "2025-10-27T20:36:44+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.3.4", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4" + "reference": "03a60f169c79a28513a78c967316fbc8bf17816f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", - "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/03a60f169c79a28513a78c967316fbc8bf17816f", + "reference": "03a60f169c79a28513a78c967316fbc8bf17816f", "shasum": "" }, "require": { @@ -3987,9 +3996,9 @@ "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4027,7 +4036,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.3.4" + "source": "https://github.com/symfony/var-exporter/tree/v7.4.0" }, "funding": [ { @@ -4047,32 +4056,32 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2025-09-11T10:15:23+00:00" }, { "name": "symfony/yaml", - "version": "v7.3.5", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "90208e2fc6f68f613eae7ca25a2458a931b1bacc" + "reference": "6c84a4b55aee4cd02034d1c528e83f69ddf63810" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/90208e2fc6f68f613eae7ca25a2458a931b1bacc", - "reference": "90208e2fc6f68f613eae7ca25a2458a931b1bacc", + "url": "https://api.github.com/repos/symfony/yaml/zipball/6c84a4b55aee4cd02034d1c528e83f69ddf63810", + "reference": "6c84a4b55aee4cd02034d1c528e83f69ddf63810", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0" + "symfony/console": "^6.4|^7.0|^8.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -4103,7 +4112,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.3.5" + "source": "https://github.com/symfony/yaml/tree/v7.4.0" }, "funding": [ { @@ -4123,25 +4132,25 @@ "type": "tidelift" } ], - "time": "2025-09-27T09:00:46+00:00" + "time": "2025-11-16T10:14:42+00:00" }, { "name": "twig/intl-extra", - "version": "v3.21.0", + "version": "v3.22.1", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146" + "reference": "93ac31e53cdd3f2e541f42690cd0c54ca8138ab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/05bc5d46b9df9e62399eae53e7c0b0633298b146", - "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/93ac31e53cdd3f2e541f42690cd0c54ca8138ab1", + "reference": "93ac31e53cdd3f2e541f42690cd0c54ca8138ab1", "shasum": "" }, "require": { "php": ">=8.1.0", - "symfony/intl": "^5.4|^6.4|^7.0", + "symfony/intl": "^5.4|^6.4|^7.0|^8.0", "twig/twig": "^3.13|^4.0" }, "require-dev": { @@ -4175,7 +4184,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.21.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.22.1" }, "funding": [ { @@ -4187,7 +4196,7 @@ "type": "tidelift" } ], - "time": "2025-01-31T20:45:36+00:00" + "time": "2025-11-02T11:00:49+00:00" }, { "name": "twig/twig", @@ -6065,16 +6074,16 @@ }, { "name": "predis/predis", - "version": "v3.2.0", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/predis/predis.git", - "reference": "9e9deec4dfd3ebf65d32eb368f498c646ba2ecd8" + "reference": "153097374b39a2f737fe700ebcd725642526cdec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/9e9deec4dfd3ebf65d32eb368f498c646ba2ecd8", - "reference": "9e9deec4dfd3ebf65d32eb368f498c646ba2ecd8", + "url": "https://api.github.com/repos/predis/predis/zipball/153097374b39a2f737fe700ebcd725642526cdec", + "reference": "153097374b39a2f737fe700ebcd725642526cdec", "shasum": "" }, "require": { @@ -6116,7 +6125,7 @@ ], "support": { "issues": "https://github.com/predis/predis/issues", - "source": "https://github.com/predis/predis/tree/v3.2.0" + "source": "https://github.com/predis/predis/tree/v3.3.0" }, "funding": [ { @@ -6124,20 +6133,20 @@ "type": "github" } ], - "time": "2025-08-06T06:41:24+00:00" + "time": "2025-11-24T17:48:50+00:00" }, { "name": "revolt/event-loop", - "version": "v1.0.7", + "version": "v1.0.8", "source": { "type": "git", "url": "https://github.com/revoltphp/event-loop.git", - "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3" + "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3", - "reference": "09bf1bf7f7f574453efe43044b06fafe12216eb3", + "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/b6fc06dce8e9b523c9946138fa5e62181934f91c", + "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c", "shasum": "" }, "require": { @@ -6194,9 +6203,9 @@ ], "support": { "issues": "https://github.com/revoltphp/event-loop/issues", - "source": "https://github.com/revoltphp/event-loop/tree/v1.0.7" + "source": "https://github.com/revoltphp/event-loop/tree/v1.0.8" }, - "time": "2025-01-25T19:27:39+00:00" + "time": "2025-08-27T21:33:23+00:00" }, { "name": "sebastian/cli-parser", @@ -7244,32 +7253,32 @@ }, { "name": "slevomat/coding-standard", - "version": "8.24.0", + "version": "8.25.1", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "08e7989c0351f3f38b82172838195c35d9819efa" + "reference": "4caa5ec5a30b84b2305e80159c710d437f40cc40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/08e7989c0351f3f38b82172838195c35d9819efa", - "reference": "08e7989c0351f3f38b82172838195c35d9819efa", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/4caa5ec5a30b84b2305e80159c710d437f40cc40", + "reference": "4caa5ec5a30b84b2305e80159c710d437f40cc40", "shasum": "" }, "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.1.2", + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.2.0", "php": "^7.4 || ^8.0", "phpstan/phpdoc-parser": "^2.3.0", - "squizlabs/php_codesniffer": "^4.0.0" + "squizlabs/php_codesniffer": "^4.0.1" }, "require-dev": { "phing/phing": "3.0.1|3.1.0", "php-parallel-lint/php-parallel-lint": "1.4.0", - "phpstan/phpstan": "2.1.29", + "phpstan/phpstan": "2.1.32", "phpstan/phpstan-deprecation-rules": "2.0.3", - "phpstan/phpstan-phpunit": "2.0.7", - "phpstan/phpstan-strict-rules": "2.0.6", - "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.36|12.3.14" + "phpstan/phpstan-phpunit": "2.0.8", + "phpstan/phpstan-strict-rules": "2.0.7", + "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.36|12.4.4" }, "type": "phpcodesniffer-standard", "extra": { @@ -7293,7 +7302,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.24.0" + "source": "https://github.com/slevomat/coding-standard/tree/8.25.1" }, "funding": [ { @@ -7305,7 +7314,7 @@ "type": "tidelift" } ], - "time": "2025-09-25T21:37:40+00:00" + "time": "2025-11-25T18:01:43+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -7440,28 +7449,24 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v7.3.4", + "version": "v8.0.0", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "ed77a629c13979e051b7000a317966474d566398" + "reference": "51b2adaf2cdb00cdab11e6b593e37ef76358e161" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/ed77a629c13979e051b7000a317966474d566398", - "reference": "ed77a629c13979e051b7000a317966474d566398", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/51b2adaf2cdb00cdab11e6b593e37ef76358e161", + "reference": "51b2adaf2cdb00cdab11e6b593e37ef76358e161", "shasum": "" }, "require": { - "php": ">=7.2.5" - }, - "conflict": { - "phpunit/phpunit": "<7.5|9.1.2" + "php": ">=8.1.0" }, "require-dev": { - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/error-handler": "^5.4|^6.4|^7.0", - "symfony/polyfill-php81": "^1.27" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4.3|^7.0.3|^8.0" }, "bin": [ "bin/simple-phpunit" @@ -7505,7 +7510,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.3.4" + "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.0" }, "funding": [ { @@ -7525,7 +7530,7 @@ "type": "tidelift" } ], - "time": "2025-09-12T12:18:52+00:00" + "time": "2025-10-29T07:48:08+00:00" }, { "name": "symfony/polyfill-php84", @@ -7609,24 +7614,25 @@ }, { "name": "symfony/property-access", - "version": "v7.3.3", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7" + "reference": "537626149d2910ca43eb9ce465654366bf4442f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7", - "reference": "4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7", + "url": "https://api.github.com/repos/symfony/property-access/zipball/537626149d2910ca43eb9ce465654366bf4442f4", + "reference": "537626149d2910ca43eb9ce465654366bf4442f4", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/property-info": "^6.4|^7.0" + "symfony/property-info": "^6.4|^7.0|^8.0" }, "require-dev": { - "symfony/cache": "^6.4|^7.0" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4.1|^7.0.1|^8.0" }, "type": "library", "autoload": { @@ -7665,7 +7671,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.3.3" + "source": "https://github.com/symfony/property-access/tree/v7.4.0" }, "funding": [ { @@ -7685,27 +7691,27 @@ "type": "tidelift" } ], - "time": "2025-08-04T15:15:28+00:00" + "time": "2025-09-08T21:14:32+00:00" }, { "name": "symfony/property-info", - "version": "v7.3.5", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "0b346ed259dc5da43535caf243005fe7d4b0f051" + "reference": "c3c686e3d3a33a99f6967e69d6d5832acb7c25a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/0b346ed259dc5da43535caf243005fe7d4b0f051", - "reference": "0b346ed259dc5da43535caf243005fe7d4b0f051", + "url": "https://api.github.com/repos/symfony/property-info/zipball/c3c686e3d3a33a99f6967e69d6d5832acb7c25a1", + "reference": "c3c686e3d3a33a99f6967e69d6d5832acb7c25a1", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0", - "symfony/type-info": "^7.3.5" + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/type-info": "^7.3.5|^8.0" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", @@ -7717,9 +7723,9 @@ "require-dev": { "phpdocumentor/reflection-docblock": "^5.2", "phpstan/phpdoc-parser": "^1.0|^2.0", - "symfony/cache": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7755,7 +7761,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.3.5" + "source": "https://github.com/symfony/property-info/tree/v7.4.0" }, "funding": [ { @@ -7775,20 +7781,20 @@ "type": "tidelift" } ], - "time": "2025-10-05T22:12:41+00:00" + "time": "2025-11-13T08:38:49+00:00" }, { "name": "symfony/serializer", - "version": "v7.3.5", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "ba2e50a5f2870c93f0f47ca1a4e56e4bbe274035" + "reference": "5a3bbf317b3f1025126b6d9debce53515601ab43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/ba2e50a5f2870c93f0f47ca1a4e56e4bbe274035", - "reference": "ba2e50a5f2870c93f0f47ca1a4e56e4bbe274035", + "url": "https://api.github.com/repos/symfony/serializer/zipball/5a3bbf317b3f1025126b6d9debce53515601ab43", + "reference": "5a3bbf317b3f1025126b6d9debce53515601ab43", "shasum": "" }, "require": { @@ -7811,26 +7817,26 @@ "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", "phpstan/phpdoc-parser": "^1.0|^2.0", "seld/jsonlint": "^1.10", - "symfony/cache": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^7.2", - "symfony/error-handler": "^6.4|^7.0", - "symfony/filesystem": "^6.4|^7.0", - "symfony/form": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/property-access": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0", + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^7.2|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/form": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/type-info": "^7.1.8", - "symfony/uid": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0", - "symfony/var-exporter": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" + "symfony/type-info": "^7.1.8|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7858,7 +7864,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.3.5" + "source": "https://github.com/symfony/serializer/tree/v7.4.0" }, "funding": [ { @@ -7878,27 +7884,27 @@ "type": "tidelift" } ], - "time": "2025-10-08T11:26:21+00:00" + "time": "2025-11-18T13:23:20+00:00" }, { "name": "symfony/translation", - "version": "v7.3.4", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "ec25870502d0c7072d086e8ffba1420c85965174" + "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174", - "reference": "ec25870502d0c7072d086e8ffba1420c85965174", + "url": "https://api.github.com/repos/symfony/translation/zipball/2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", + "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" + "symfony/translation-contracts": "^2.5.3|^3.3" }, "conflict": { "nikic/php-parser": "<5.0", @@ -7917,17 +7923,17 @@ "require-dev": { "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7958,7 +7964,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.3.4" + "source": "https://github.com/symfony/translation/tree/v7.4.0" }, "funding": [ { @@ -7978,20 +7984,20 @@ "type": "tidelift" } ], - "time": "2025-09-07T11:39:36+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/type-info", - "version": "v7.3.5", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "8b36f41421160db56914f897b57eaa6a830758b3" + "reference": "7f9743e921abcce92a03fc693530209c59e73076" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/8b36f41421160db56914f897b57eaa6a830758b3", - "reference": "8b36f41421160db56914f897b57eaa6a830758b3", + "url": "https://api.github.com/repos/symfony/type-info/zipball/7f9743e921abcce92a03fc693530209c59e73076", + "reference": "7f9743e921abcce92a03fc693530209c59e73076", "shasum": "" }, "require": { @@ -8041,7 +8047,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.3.5" + "source": "https://github.com/symfony/type-info/tree/v7.4.0" }, "funding": [ { @@ -8061,7 +8067,7 @@ "type": "tidelift" } ], - "time": "2025-10-16T12:30:12+00:00" + "time": "2025-11-07T09:36:46+00:00" }, { "name": "theseer/tokenizer", From 3b2fa7d39301096cc2103c917dd4075a0086f317 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 29 Nov 2025 22:55:54 +0100 Subject: [PATCH 422/532] Fix phplinter --- .github/workflows/php.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index b19be4eee2..cbff46775b 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -20,7 +20,7 @@ jobs: matrix: php-version: ['8.2', '8.3', '8.4', '8.5'] - uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml@v1.10.3 + uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml@v1.10.6 with: php-version: ${{ matrix.php-version }} @@ -29,7 +29,7 @@ jobs: strategy: fail-fast: false - uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml@v1.10.3 + uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml@v1.10.6 with: enable_eslinter: true enable_jsonlinter: true From 23c589b5440f5ef0f39937f5c2d106abac55834f Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 30 Nov 2025 23:13:33 +0100 Subject: [PATCH 423/532] Fix CI dependency cache --- .github/workflows/php.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index cbff46775b..a3cc81430b 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -82,7 +82,7 @@ jobs: - name: Cache composer dependencies uses: actions/cache@v4 with: - path: $COMPOSER_CACHE + path: ${{ env.COMPOSER_CACHE }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: ${{ runner.os }}-composer- @@ -144,7 +144,7 @@ jobs: - name: Cache composer dependencies uses: actions/cache@v4 with: - path: $COMPOSER_CACHE + path: ${{ env.COMPOSER_CACHE }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: ${{ runner.os }}-composer- @@ -187,7 +187,7 @@ jobs: - name: Cache composer dependencies uses: actions/cache@v4 with: - path: $COMPOSER_CACHE + path: ${{ env.COMPOSER_CACHE }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: ${{ runner.os }}-composer- @@ -260,7 +260,7 @@ jobs: - name: Cache composer dependencies uses: actions/cache@v4 with: - path: $COMPOSER_CACHE + path: ${{ env.COMPOSER_CACHE }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: ${{ runner.os }}-composer- From f1d494e18f6b2d30a9c45552781e9c82189ed081 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Tue, 2 Dec 2025 12:15:20 +1000 Subject: [PATCH 424/532] tests: update for psr14 with cron looking at config page (#2568) * tests: update for psr14 with cron looking at config page * put those around the right way * I found that the key in $response->data['summary'] is different In testRunCorrectKey() doing var_dump($response->data['summary']); ``` array(1) { 'cron info' => string(57) "Cron did run tag [daily] at Fri, 28 Nov..." } ``` It seems before that the keys were just numeric [1] so maybe we should change runTag to do this (or duplicate the keys with numeric) to be non breaking? [1] https://github.com/simplesamlphp/simplesamlphp/blob/87bd56f96bf570689cd27f8de6dcad81a93ed8f5/modules/cron/hooks/hook_cron.php#L21 * I think this might fix this CI failure * make cron a core module to see if the 2 tests pass in CI * make the module listenerprovider use the core modules list by def * we do not want to make that temporary change perm * test * see it early * test2 * test3 * test4 * allow instance to be remade * cleanup --- src/SimpleSAML/Configuration.php | 1 - .../ModuleEventDispatcherFactory.php | 10 ++++- .../Event/Provider/ModuleListenerProvider.php | 5 ++- .../modules/cron/src/Controller/CronTest.php | 10 ++++- tests/src/SimpleSAML/ModuleTest.php | 37 ++++++++++++++++--- 5 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index 7d6f79ab23..5bfb609eb1 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -365,7 +365,6 @@ public static function getInstance(string $instancename = 'simplesaml'): Configu if (array_key_exists($instancename, self::$instance)) { return self::$instance[$instancename]; } - if ($instancename === 'simplesaml') { try { return self::getConfig(); diff --git a/src/SimpleSAML/Event/Dispatcher/ModuleEventDispatcherFactory.php b/src/SimpleSAML/Event/Dispatcher/ModuleEventDispatcherFactory.php index 9f87c21184..93d96315a3 100644 --- a/src/SimpleSAML/Event/Dispatcher/ModuleEventDispatcherFactory.php +++ b/src/SimpleSAML/Event/Dispatcher/ModuleEventDispatcherFactory.php @@ -19,4 +19,12 @@ public static function getInstance(): EventDispatcher return self::$instance; } -} \ No newline at end of file + + public static function testingRemakeInstance(): EventDispatcher + { + $provider = new ModuleListenerProvider(); + self::$instance = new EventDispatcher($provider); + return self::$instance; + } + +} diff --git a/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php b/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php index 7299a0bccc..929c674597 100644 --- a/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php +++ b/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php @@ -6,6 +6,7 @@ use Psr\EventDispatcher\ListenerProviderInterface; use SimpleSAML\Configuration; +use SimpleSAML\Module; class ModuleListenerProvider implements ListenerProviderInterface { @@ -15,7 +16,7 @@ class ModuleListenerProvider implements ListenerProviderInterface public function __construct() { $configuration = Configuration::getInstance(); - $enabledModules = $configuration->getArray('module.enable', []); + $enabledModules = $configuration->getOptionalArray('module.enable', Module::$core_modules); $this->discoverListeners($enabledModules); } @@ -127,4 +128,4 @@ private function getClassNameFromFile(string $file, string $moduleName): ?string $className = "SimpleSAML\\Module\\{$moduleName}\\Event\\Listener\\{$basename}"; return $className; } -} \ No newline at end of file +} diff --git a/tests/modules/cron/src/Controller/CronTest.php b/tests/modules/cron/src/Controller/CronTest.php index 6e0e878780..73d106346f 100644 --- a/tests/modules/cron/src/Controller/CronTest.php +++ b/tests/modules/cron/src/Controller/CronTest.php @@ -13,6 +13,7 @@ use SimpleSAML\Session; use SimpleSAML\Utils; use SimpleSAML\XHTML\Template; +use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; /** * Set of tests for the controllers in the "cron" module. @@ -65,6 +66,8 @@ public function requireAdmin(): void 'key' => 'verysecret', 'allowed_tags' => ['daily'], 'sendemail' => false, + 'module.enable' => ['cron' => true], + 'debug_message' => true, ], '[ARRAY]', 'simplesaml', @@ -72,6 +75,9 @@ public function requireAdmin(): void 'module_cron.php', 'simplesaml', ); + + ModuleEventDispatcherFactory::testingRemakeInstance(); + } @@ -101,6 +107,7 @@ public function testInfo(): void */ public function testRunCorrectKey(): void { + $_SERVER['REQUEST_URI'] = '/module.php/cron/run/daily/verysecret'; $c = new Controller\Cron($this->config, $this->session); @@ -112,7 +119,8 @@ public function testRunCorrectKey(): void $this->assertFalse($response->data['mail_required']); $this->assertArrayHasKey('time', $response->data); $this->assertCount(1, $response->data['summary']); - $this->assertEquals('Cron did run tag [daily] at ' . $response->data['time'], $response->data['summary'][0]); + + $this->assertEquals('Cron did run tag [daily] at ' . $response->data['time'], $response->data['summary']['cron info']); } diff --git a/tests/src/SimpleSAML/ModuleTest.php b/tests/src/SimpleSAML/ModuleTest.php index 6f6a70d477..2c51e35f2e 100644 --- a/tests/src/SimpleSAML/ModuleTest.php +++ b/tests/src/SimpleSAML/ModuleTest.php @@ -11,6 +11,11 @@ use SimpleSAML\Module; use Symfony\Component\Filesystem\Path; +use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; +use SimpleSAML\Module\admin\Event\ConfigPageEvent; +use SimpleSAML\XHTML\Template; +use SimpleSAML\Locale\Translate; + /** */ #[CoversClass(Module::class)] @@ -121,11 +126,33 @@ public function testResolveClass(): void */ public function testGetModuleHooks(): void { - $hooks = Module::getModuleHooks('cron'); - $this->assertArrayHasKey('configpage', $hooks); - $this->assertEquals('cron_hook_configpage', $hooks['configpage']['func']); - $expectedFile = Path::canonicalize(dirname(__DIR__, 3) . '/modules/cron/hooks/hook_configpage.php'); - $this->assertEquals($expectedFile, $hooks['configpage']['file']); + $c = Configuration::loadFromArray( + [ + 'assets' => [ 'salt' => '1234567890'], + 'module.enable' => ['saml' => true, 'admin' => true, 'cron' => true,], + ], '', 'simplesaml'); + Configuration::setPreLoadedConfig($c); + $t = new Template($c, 'admin:config.twig'); + $t->data = [ + 'links' => [ + [ + 'href' => Module::getModuleURL('admin/diagnostics'), + 'text' => Translate::noop('Diagnostics on hostname, port and protocol'), + ], + [ + 'href' => Module::getModuleURL('admin/phpinfo'), + 'text' => Translate::noop('Information on your PHP installation'), + ], + ], + ]; + + $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); + $event = $eventDispatcher->dispatch(new ConfigPageEvent($t)); + $t = $event->getTemplate(); + $this->assertEquals( + \SimpleSAML\Locale\Translate::noop('Cron module information page'), + $t->data['links'][2]['text']); + } From 51a791885ee3b8484868a15e0fe313d1011cf2f9 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Tue, 2 Dec 2025 12:33:59 +1000 Subject: [PATCH 425/532] docs: add some docs for the new PSR hook interface (#2567) * docs: add some docs for the new PSR hook interface * some of the crappier lint * indent * lint * . * lint2 * lint again * gotta watch out for those double blanks!! * transpose I can understand --- docs/simplesamlphp-modules.md | 123 +++++++++++++++++++++++++++++++++- 1 file changed, 122 insertions(+), 1 deletion(-) diff --git a/docs/simplesamlphp-modules.md b/docs/simplesamlphp-modules.md index 1271b0ee46..0a1c4ef745 100644 --- a/docs/simplesamlphp-modules.md +++ b/docs/simplesamlphp-modules.md @@ -185,7 +185,128 @@ replaces `modules/core/templates/default/loginuserpass.php`. `templates/default/frontpage.php`. This theme can be activated by setting `theme.use` to `example:test`. -## Hook interface +## Event listeners (new Hooks) + +In SimpleSAMLphp 2.5 the hook interface was updated to use PSR-14 +events [PSR-14 events](https://www.php-fig.org/psr/psr-14) as well as +the legacy custom "hook" interface. When hooks are called in 2.5 both +the new PSR-14 event listeners are called followed by the older custom +hook. You are likely better to create new event listeners in new +configurations and might like to consider moving your hooks to event +listeners over time. + +If you are using an older version of SimpleSAMLphp please see the +below section for information on how to use the older interface. + +This section discusses how to make new event listeners with an +eye toward moving an existing hook to become an event listener. + +The PSR events that can be used are defined in your module's +src/Event subdirectory. For example, for the admin module you can +see modules/admin/src/Event/ConfigPageEvent.php which defines +a class ConfigPageEvent in the `SimpleSAML\Module\admin\Event` namespace. + +That event takes some state in the constructor and likely has one or +more access methods to later retrieve that state. + +The event might be listened to by the same or another module by +defining a `Listener` class. In the running concrete example the class +in modules/cron/src/Event/Listener/ConfigPageListener.php defines a +`ConfigPageListener` class in the +`SimpleSAML\Module\cron\Event\Listener` namespace. That listener class +has an `__invoke` method that will be passed the `ConfigPageEvent` +object and has no return value. + +The `ConfigPageEvent` is a reasonable starting point for testing your +own listener. If you create a new listener for ConfigPageEvent you can +use `Logger::error` to check that you get called and use the +admin/config page through the admin module to trigger this event +fairly easily. You might like to base your new listener on the +ConfigPageListener for the cron module. + +To update a hook from a 2.4 release or below you will need to move +your hook class from the `hooks` directory to the `src/Event/Listener` +subdirectory. Considering the config page example again, the +`hooks/hook_configpage.php` file should move to `src/Event/Listener`. +That hook defined a single top level function with a specific function +name `cron_hook_configpage`. In the event listener the new +`src/Event/Listener/ConfigPageListener.php` file will need to be in +the `SimpleSAML\Module\cron\Event\Listener` namespace and define a +class `ConfigPageListener`. The single top level function is moved +into a member function `__invoke` taking a single parameter +`ConfigPageEvent`. + +The old hook function took a reference `Template &$template` directly +as the single argument. The new PSR class takes a `ConfigPageEvent` +object. The ConfigPageEvent object provides access to the template +using the `getTemplate` method on the event. + +The old hook function in `hooks` might look like the following. + + // old hook interface + function cron_hook_configpage(Template &$template): void + { + $template->data['links'][] = [ + 'href' => Module::getModuleURL('cron/info'), + 'text' => Translate::noop('Cron module information page'), + ]; + ... + } + +The new Listener version in `src/Event/Listener` is shown below. + + class ConfigPageListener + { + public function __invoke(ConfigPageEvent $event): void + { + $template = $event->getTemplate(); + + $template->data['links'][] = [ + 'href' => \SimpleSAML\Module::getModuleURL('cron/info'), + 'text' => \SimpleSAML\Locale\Translate::noop('Cron module information page'), + ]; + ... + } + } + +That `ConfigPageEvent` class is defined in +`modules/admin/src/Event/ConfigPageEvent.php`. + + class ConfigPageEvent + { + public function __construct( + private readonly XHTML\Template $template, + ) + {} + + public function getTemplate(): XHTML\Template + { + return $this->template; + } + } + +In summary to move a hook to the new PSR-14 events you have to move +the hook file to your module's src/Event/Listener directory and have +it take a new Event object that passes the function argument to it. +The event will be a simple class defined in your `src/Event` +directory. + +When you wish to call event listeners in your code you can use code +like the following. The event dispatcher is passed an event which +contains all of the state you wish to make available to the event +listeners. You can then get the state which may have been updated by +one or more listeners using a getter method and do something with the +result. + + $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); + $event = $eventDispatcher->dispatch(new ConfigPageEvent($t)); + $t = $event->getTemplate(); + +## Hook interface (SimpleSAMLphp 2.4 and below) + +Releases 2.4 and below use a custom hook interface to allow code to +run when specific things of interest are happening. If you are using +SimpleSAMLphp 2.5 or above please see the above section on Event listeners instead. The hook interface allows you to call a hook function in all enabled modules which define that hook. Hook functions are stored in a From cacfbf3eea4ed960cbaba1d743e27773ba975791 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 8 Dec 2025 13:19:46 +0100 Subject: [PATCH 426/532] Fix uncaught canonicalization-failure (CVE-2025-66475) --- composer.lock | 276 +++++++++++++++++++++++++------------------------- 1 file changed, 138 insertions(+), 138 deletions(-) diff --git a/composer.lock b/composer.lock index 5acdbedd95..2156ea74ca 100644 --- a/composer.lock +++ b/composer.lock @@ -908,16 +908,16 @@ }, { "name": "robrichards/xmlseclibs", - "version": "3.1.3", + "version": "3.1.4", "source": { "type": "git", "url": "https://github.com/robrichards/xmlseclibs.git", - "reference": "2bdfd742624d739dfadbd415f00181b4a77aaf07" + "reference": "bc87389224c6de95802b505e5265b0ec2c5bcdbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/2bdfd742624d739dfadbd415f00181b4a77aaf07", - "reference": "2bdfd742624d739dfadbd415f00181b4a77aaf07", + "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/bc87389224c6de95802b505e5265b0ec2c5bcdbd", + "reference": "bc87389224c6de95802b505e5265b0ec2c5bcdbd", "shasum": "" }, "require": { @@ -944,9 +944,9 @@ ], "support": { "issues": "https://github.com/robrichards/xmlseclibs/issues", - "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.3" + "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.4" }, - "time": "2024-11-20T21:13:56+00:00" + "time": "2025-12-08T11:57:53+00:00" }, { "name": "simplesamlphp/assert", @@ -1095,16 +1095,16 @@ }, { "name": "simplesamlphp/saml2", - "version": "v6.0.0", + "version": "v6.0.1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "11a1c44f248a95e688f97de6ad118d9c3a67afea" + "reference": "c15bde28f1c32f8a54f177fcd65c6580238817c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/11a1c44f248a95e688f97de6ad118d9c3a67afea", - "reference": "11a1c44f248a95e688f97de6ad118d9c3a67afea", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/c15bde28f1c32f8a54f177fcd65c6580238817c9", + "reference": "c15bde28f1c32f8a54f177fcd65c6580238817c9", "shasum": "" }, "require": { @@ -1120,7 +1120,7 @@ "psr/http-message": "~2.0", "psr/log": "~2.3 || ~3.0", "simplesamlphp/assert": "~1.9", - "simplesamlphp/xml-common": "~2.3", + "simplesamlphp/xml-common": "~2.4", "simplesamlphp/xml-security": "~2.0", "simplesamlphp/xml-soap": "~2.0" }, @@ -1165,22 +1165,22 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v6.0.0" + "source": "https://github.com/simplesamlphp/saml2/tree/v6.0.1" }, - "time": "2025-11-20T18:20:05+00:00" + "time": "2025-12-06T11:49:43+00:00" }, { "name": "simplesamlphp/saml2-legacy", - "version": "v4.19.0", + "version": "v4.19.1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2-legacy.git", - "reference": "96eb144356702d7d913078fb2e4364e42458fc31" + "reference": "a9812c7fc0bb7cee9ce001e8cc94570c37acdfb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/96eb144356702d7d913078fb2e4364e42458fc31", - "reference": "96eb144356702d7d913078fb2e4364e42458fc31", + "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/a9812c7fc0bb7cee9ce001e8cc94570c37acdfb2", + "reference": "a9812c7fc0bb7cee9ce001e8cc94570c37acdfb2", "shasum": "" }, "require": { @@ -1189,7 +1189,7 @@ "ext-zlib": "*", "php": ">=7.1 || ^8.0", "psr/log": "~1.1 || ^2.0 || ^3.0", - "robrichards/xmlseclibs": "^3.1.1", + "robrichards/xmlseclibs": "^3.1.4", "webmozart/assert": "^1.9" }, "conflict": { @@ -1225,9 +1225,9 @@ ], "description": "SAML2 PHP library from SimpleSAMLphp", "support": { - "source": "https://github.com/simplesamlphp/saml2-legacy/tree/v4.19.0" + "source": "https://github.com/simplesamlphp/saml2-legacy/tree/v4.19.1" }, - "time": "2025-09-05T23:39:13+00:00" + "time": "2025-12-08T12:05:03+00:00" }, { "name": "simplesamlphp/simplesamlphp-assets-base", @@ -1267,16 +1267,16 @@ }, { "name": "simplesamlphp/xml-common", - "version": "v2.4.0", + "version": "v2.4.2", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "7e864651195fc80db3fedfa490c549f00d423d72" + "reference": "2155a18021fc09ed9796dc9a1f6ea48818d1bb6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/7e864651195fc80db3fedfa490c549f00d423d72", - "reference": "7e864651195fc80db3fedfa490c549f00d423d72", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/2155a18021fc09ed9796dc9a1f6ea48818d1bb6a", + "reference": "2155a18021fc09ed9796dc9a1f6ea48818d1bb6a", "shasum": "" }, "require": { @@ -1326,20 +1326,20 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2025-11-20T16:45:06+00:00" + "time": "2025-12-08T23:28:08+00:00" }, { "name": "simplesamlphp/xml-security", - "version": "v2.0.8", + "version": "v2.0.9", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-security.git", - "reference": "a5c7c1db45c8891b07355f8c4038970ff8a0a2df" + "reference": "c1b310c5fb7e4b2121551f28968df3f54ff30d2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/a5c7c1db45c8891b07355f8c4038970ff8a0a2df", - "reference": "a5c7c1db45c8891b07355f8c4038970ff8a0a2df", + "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/c1b310c5fb7e4b2121551f28968df3f54ff30d2e", + "reference": "c1b310c5fb7e4b2121551f28968df3f54ff30d2e", "shasum": "" }, "require": { @@ -1388,9 +1388,9 @@ ], "support": { "issues": "https://github.com/simplesamlphp/xml-security/issues", - "source": "https://github.com/simplesamlphp/xml-security/tree/v2.0.8" + "source": "https://github.com/simplesamlphp/xml-security/tree/v2.0.9" }, - "time": "2025-11-20T17:42:51+00:00" + "time": "2025-12-08T12:08:30+00:00" }, { "name": "simplesamlphp/xml-soap", @@ -1447,16 +1447,16 @@ }, { "name": "symfony/cache", - "version": "v7.4.0", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "a7a1325a5de2e54ddb45fda002ff528162e48293" + "reference": "21e0755783bbbab58f2bb6a7a57896d21d27a366" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/a7a1325a5de2e54ddb45fda002ff528162e48293", - "reference": "a7a1325a5de2e54ddb45fda002ff528162e48293", + "url": "https://api.github.com/repos/symfony/cache/zipball/21e0755783bbbab58f2bb6a7a57896d21d27a366", + "reference": "21e0755783bbbab58f2bb6a7a57896d21d27a366", "shasum": "" }, "require": { @@ -1527,7 +1527,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.4.0" + "source": "https://github.com/symfony/cache/tree/v7.4.1" }, "funding": [ { @@ -1547,7 +1547,7 @@ "type": "tidelift" } ], - "time": "2025-11-16T10:14:42+00:00" + "time": "2025-12-04T18:11:45+00:00" }, { "name": "symfony/cache-contracts", @@ -1627,16 +1627,16 @@ }, { "name": "symfony/config", - "version": "v7.4.0", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "f76c74e93bce2b9285f2dad7fbd06fa8182a7a41" + "reference": "2c323304c354a43a48b61c5fa760fc4ed60ce495" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/f76c74e93bce2b9285f2dad7fbd06fa8182a7a41", - "reference": "f76c74e93bce2b9285f2dad7fbd06fa8182a7a41", + "url": "https://api.github.com/repos/symfony/config/zipball/2c323304c354a43a48b61c5fa760fc4ed60ce495", + "reference": "2c323304c354a43a48b61c5fa760fc4ed60ce495", "shasum": "" }, "require": { @@ -1682,7 +1682,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.4.0" + "source": "https://github.com/symfony/config/tree/v7.4.1" }, "funding": [ { @@ -1702,20 +1702,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2025-12-05T07:52:08+00:00" }, { "name": "symfony/console", - "version": "v7.4.0", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8" + "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8", - "reference": "0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8", + "url": "https://api.github.com/repos/symfony/console/zipball/6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e", + "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e", "shasum": "" }, "require": { @@ -1780,7 +1780,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.0" + "source": "https://github.com/symfony/console/tree/v7.4.1" }, "funding": [ { @@ -1800,20 +1800,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2025-12-05T15:23:39+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.4.0", + "version": "v7.4.2", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "3972ca7bbd649467b21a54870721b9e9f3652f9b" + "reference": "baf614f7c15b30ba6762d4b1ddabdf83dbf0d29b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/3972ca7bbd649467b21a54870721b9e9f3652f9b", - "reference": "3972ca7bbd649467b21a54870721b9e9f3652f9b", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/baf614f7c15b30ba6762d4b1ddabdf83dbf0d29b", + "reference": "baf614f7c15b30ba6762d4b1ddabdf83dbf0d29b", "shasum": "" }, "require": { @@ -1864,7 +1864,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.4.0" + "source": "https://github.com/symfony/dependency-injection/tree/v7.4.2" }, "funding": [ { @@ -1884,7 +1884,7 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2025-12-08T06:57:04+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2404,16 +2404,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v7.4.0", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "3c62a3437267ac55bcd40175689c74772250e943" + "reference": "2fa3b3ad6ed75ce0cc8cad8a5027b4f25b990bc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/3c62a3437267ac55bcd40175689c74772250e943", - "reference": "3c62a3437267ac55bcd40175689c74772250e943", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/2fa3b3ad6ed75ce0cc8cad8a5027b4f25b990bc3", + "reference": "2fa3b3ad6ed75ce0cc8cad8a5027b4f25b990bc3", "shasum": "" }, "require": { @@ -2538,7 +2538,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.4.0" + "source": "https://github.com/symfony/framework-bundle/tree/v7.4.1" }, "funding": [ { @@ -2558,20 +2558,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2025-12-05T14:04:53+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.4.0", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "769c1720b68e964b13b58529c17d4a385c62167b" + "reference": "bd1af1e425811d6f077db240c3a588bdb405cd27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/769c1720b68e964b13b58529c17d4a385c62167b", - "reference": "769c1720b68e964b13b58529c17d4a385c62167b", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/bd1af1e425811d6f077db240c3a588bdb405cd27", + "reference": "bd1af1e425811d6f077db240c3a588bdb405cd27", "shasum": "" }, "require": { @@ -2620,7 +2620,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.0" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.1" }, "funding": [ { @@ -2640,20 +2640,20 @@ "type": "tidelift" } ], - "time": "2025-11-13T08:49:24+00:00" + "time": "2025-12-07T11:13:10+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.0", + "version": "v7.4.2", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "7348193cd384495a755554382e4526f27c456085" + "reference": "f6e6f0a5fa8763f75a504b930163785fb6dd055f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/7348193cd384495a755554382e4526f27c456085", - "reference": "7348193cd384495a755554382e4526f27c456085", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f6e6f0a5fa8763f75a504b930163785fb6dd055f", + "reference": "f6e6f0a5fa8763f75a504b930163785fb6dd055f", "shasum": "" }, "require": { @@ -2739,7 +2739,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.0" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.2" }, "funding": [ { @@ -2759,7 +2759,7 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:38:24+00:00" + "time": "2025-12-08T07:43:37+00:00" }, { "name": "symfony/intl", @@ -3777,16 +3777,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.4.0", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "e96998da928007554b8b8c02e677861877daced9" + "reference": "9103559ef3e9f06708d8bff6810f6335b8f1eee8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/e96998da928007554b8b8c02e677861877daced9", - "reference": "e96998da928007554b8b8c02e677861877daced9", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/9103559ef3e9f06708d8bff6810f6335b8f1eee8", + "reference": "9103559ef3e9f06708d8bff6810f6335b8f1eee8", "shasum": "" }, "require": { @@ -3818,7 +3818,7 @@ "symfony/emoji": "^7.1|^8.0", "symfony/expression-language": "^6.4|^7.0|^8.0", "symfony/finder": "^6.4|^7.0|^8.0", - "symfony/form": "^6.4.20|^7.2.5|^8.0", + "symfony/form": "^6.4.30|~7.3.8|^7.4.1|^8.0.1", "symfony/html-sanitizer": "^6.4|^7.0|^8.0", "symfony/http-foundation": "^7.3|^8.0", "symfony/http-kernel": "^6.4|^7.0|^8.0", @@ -3868,7 +3868,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.4.0" + "source": "https://github.com/symfony/twig-bridge/tree/v7.4.1" }, "funding": [ { @@ -3888,7 +3888,7 @@ "type": "tidelift" } ], - "time": "2025-11-05T14:29:59+00:00" + "time": "2025-12-05T14:04:53+00:00" }, { "name": "symfony/var-dumper", @@ -4060,16 +4060,16 @@ }, { "name": "symfony/yaml", - "version": "v7.4.0", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "6c84a4b55aee4cd02034d1c528e83f69ddf63810" + "reference": "24dd4de28d2e3988b311751ac49e684d783e2345" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/6c84a4b55aee4cd02034d1c528e83f69ddf63810", - "reference": "6c84a4b55aee4cd02034d1c528e83f69ddf63810", + "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345", + "reference": "24dd4de28d2e3988b311751ac49e684d783e2345", "shasum": "" }, "require": { @@ -4112,7 +4112,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.0" + "source": "https://github.com/symfony/yaml/tree/v7.4.1" }, "funding": [ { @@ -4132,7 +4132,7 @@ "type": "tidelift" } ], - "time": "2025-11-16T10:14:42+00:00" + "time": "2025-12-04T18:11:45+00:00" }, { "name": "twig/intl-extra", @@ -4200,16 +4200,16 @@ }, { "name": "twig/twig", - "version": "v3.22.0", + "version": "v3.22.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "4509984193026de413baf4ba80f68590a7f2c51d" + "reference": "1de2ec1fc43ab58a4b7e80b214b96bfc895750f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/4509984193026de413baf4ba80f68590a7f2c51d", - "reference": "4509984193026de413baf4ba80f68590a7f2c51d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/1de2ec1fc43ab58a4b7e80b214b96bfc895750f3", + "reference": "1de2ec1fc43ab58a4b7e80b214b96bfc895750f3", "shasum": "" }, "require": { @@ -4263,7 +4263,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.22.0" + "source": "https://github.com/twigphp/Twig/tree/v3.22.1" }, "funding": [ { @@ -4275,7 +4275,7 @@ "type": "tidelift" } ], - "time": "2025-10-29T15:56:47+00:00" + "time": "2025-11-16T16:01:12+00:00" }, { "name": "webmozart/assert", @@ -5126,16 +5126,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.6.2", + "version": "v5.7.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "3a454ca033b9e06b63282ce19562e892747449bb" + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb", - "reference": "3a454ca033b9e06b63282ce19562e892747449bb", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", "shasum": "" }, "require": { @@ -5178,9 +5178,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" }, - "time": "2025-10-21T19:32:17+00:00" + "time": "2025-12-06T11:56:16+00:00" }, { "name": "ondram/ci-detector", @@ -5475,11 +5475,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.32", + "version": "2.1.33", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e126cad1e30a99b137b8ed75a85a676450ebb227", - "reference": "e126cad1e30a99b137b8ed75a85a676450ebb227", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9e800e6bee7d5bd02784d4c6069b48032d16224f", + "reference": "9e800e6bee7d5bd02784d4c6069b48032d16224f", "shasum": "" }, "require": { @@ -5524,7 +5524,7 @@ "type": "github" } ], - "time": "2025-11-11T15:18:17+00:00" + "time": "2025-12-05T10:24:31+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -5577,16 +5577,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "2.0.8", + "version": "2.0.10", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "2fe9fbeceaf76dd1ebaa7bbbb25e2fb5e59db2fe" + "reference": "8d61a5854e7497d95bc85188e13537e99bd7aae7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/2fe9fbeceaf76dd1ebaa7bbbb25e2fb5e59db2fe", - "reference": "2fe9fbeceaf76dd1ebaa7bbbb25e2fb5e59db2fe", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/8d61a5854e7497d95bc85188e13537e99bd7aae7", + "reference": "8d61a5854e7497d95bc85188e13537e99bd7aae7", "shasum": "" }, "require": { @@ -5624,9 +5624,9 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.8" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.10" }, - "time": "2025-11-11T07:55:22+00:00" + "time": "2025-12-06T11:15:39+00:00" }, { "name": "phpunit/php-code-coverage", @@ -5965,16 +5965,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.44", + "version": "11.5.46", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c346885c95423eda3f65d85a194aaa24873cda82" + "reference": "75dfe79a2aa30085b7132bb84377c24062193f33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c346885c95423eda3f65d85a194aaa24873cda82", - "reference": "c346885c95423eda3f65d85a194aaa24873cda82", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/75dfe79a2aa30085b7132bb84377c24062193f33", + "reference": "75dfe79a2aa30085b7132bb84377c24062193f33", "shasum": "" }, "require": { @@ -6046,7 +6046,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.44" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.46" }, "funding": [ { @@ -6070,7 +6070,7 @@ "type": "tidelift" } ], - "time": "2025-11-13T07:17:35+00:00" + "time": "2025-12-06T08:01:15+00:00" }, { "name": "predis/predis", @@ -7195,16 +7195,16 @@ }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.10.5", + "version": "v1.10.6", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "d1a20462abe549a483d27be7dc35a8cf78b0f285" + "reference": "b33c1108738ab06fb40314cd1449445da402095f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/d1a20462abe549a483d27be7dc35a8cf78b0f285", - "reference": "d1a20462abe549a483d27be7dc35a8cf78b0f285", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/b33c1108738ab06fb40314cd1449445da402095f", + "reference": "b33c1108738ab06fb40314cd1449445da402095f", "shasum": "" }, "require": { @@ -7249,7 +7249,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2025-11-18T22:25:10+00:00" + "time": "2025-11-29T21:53:08+00:00" }, { "name": "slevomat/coding-standard", @@ -7695,23 +7695,23 @@ }, { "name": "symfony/property-info", - "version": "v7.4.0", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "c3c686e3d3a33a99f6967e69d6d5832acb7c25a1" + "reference": "912aafe70bee5cfd09fec5916fe35b83f04ae6ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/c3c686e3d3a33a99f6967e69d6d5832acb7c25a1", - "reference": "c3c686e3d3a33a99f6967e69d6d5832acb7c25a1", + "url": "https://api.github.com/repos/symfony/property-info/zipball/912aafe70bee5cfd09fec5916fe35b83f04ae6ae", + "reference": "912aafe70bee5cfd09fec5916fe35b83f04ae6ae", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/string": "^6.4|^7.0|^8.0", - "symfony/type-info": "^7.3.5|^8.0" + "symfony/type-info": "~7.3.8|^7.4.1|^8.0.1" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", @@ -7761,7 +7761,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.4.0" + "source": "https://github.com/symfony/property-info/tree/v7.4.1" }, "funding": [ { @@ -7781,20 +7781,20 @@ "type": "tidelift" } ], - "time": "2025-11-13T08:38:49+00:00" + "time": "2025-12-05T14:04:53+00:00" }, { "name": "symfony/serializer", - "version": "v7.4.0", + "version": "v7.4.2", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "5a3bbf317b3f1025126b6d9debce53515601ab43" + "reference": "1a957acb613b520e443c2c659a67c782b67794bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/5a3bbf317b3f1025126b6d9debce53515601ab43", - "reference": "5a3bbf317b3f1025126b6d9debce53515601ab43", + "url": "https://api.github.com/repos/symfony/serializer/zipball/1a957acb613b520e443c2c659a67c782b67794bc", + "reference": "1a957acb613b520e443c2c659a67c782b67794bc", "shasum": "" }, "require": { @@ -7864,7 +7864,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.4.0" + "source": "https://github.com/symfony/serializer/tree/v7.4.2" }, "funding": [ { @@ -7884,7 +7884,7 @@ "type": "tidelift" } ], - "time": "2025-11-18T13:23:20+00:00" + "time": "2025-12-07T17:35:40+00:00" }, { "name": "symfony/translation", @@ -7988,16 +7988,16 @@ }, { "name": "symfony/type-info", - "version": "v7.4.0", + "version": "v7.4.1", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "7f9743e921abcce92a03fc693530209c59e73076" + "reference": "ac5ab66b21c758df71b7210cf1033d1ac807f202" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/7f9743e921abcce92a03fc693530209c59e73076", - "reference": "7f9743e921abcce92a03fc693530209c59e73076", + "url": "https://api.github.com/repos/symfony/type-info/zipball/ac5ab66b21c758df71b7210cf1033d1ac807f202", + "reference": "ac5ab66b21c758df71b7210cf1033d1ac807f202", "shasum": "" }, "require": { @@ -8047,7 +8047,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.4.0" + "source": "https://github.com/symfony/type-info/tree/v7.4.1" }, "funding": [ { @@ -8067,7 +8067,7 @@ "type": "tidelift" } ], - "time": "2025-11-07T09:36:46+00:00" + "time": "2025-12-05T14:04:53+00:00" }, { "name": "theseer/tokenizer", From de34275d88197d82de48119376a27c20df12f904 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 10 Dec 2025 22:10:29 +0100 Subject: [PATCH 427/532] Bump module installer --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index fd87ccc7b4..c9edb94759 100644 --- a/composer.json +++ b/composer.json @@ -56,13 +56,14 @@ "ext-simplexml": "*", "ext-SPL": "*", "ext-zlib": "*", + "gettext/gettext": "~5.7", "gettext/translator": "~1.2", "phpmailer/phpmailer": "~6.10", "psr/event-dispatcher": "~1.0", "psr/log": "~3.0", "simplesamlphp/assert": "~1.9", - "simplesamlphp/composer-module-installer": "~1.5", + "simplesamlphp/composer-module-installer": "~1.6", "simplesamlphp/saml2": "~6.0", "simplesamlphp/saml2-legacy": "~4.19", "simplesamlphp/simplesamlphp-assets-base": "~2.5.0", From e9b1651fe560ee02f147c5a975ab4eea7cde43df Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 10 Dec 2025 23:16:50 +0100 Subject: [PATCH 428/532] Remove accidentally committed test-file --- test.php | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 test.php diff --git a/test.php b/test.php deleted file mode 100644 index 26ec130017..0000000000 --- a/test.php +++ /dev/null @@ -1,8 +0,0 @@ -files()->in($moduleLocalesDir . '**/LC_MESSAGES/')->name("{$domain}.po"); From 17f4c09d02f12b05e2f5e03342a6a8b10c6abfb8 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Thu, 11 Dec 2025 11:49:17 +1000 Subject: [PATCH 429/532] fix for attributes.po translations (#2576) * A 2.4 PR of 2575 to see what the CI makes of it in that env. https://github.com/simplesamlphp/simplesamlphp/pull/2575 * it seems that the number of attempted paths in included in the count --- src/SimpleSAML/Locale/Localization.php | 1 + src/SimpleSAML/Locale/Translate.php | 2 +- tests/modules/core/src/Controller/ExceptionTest.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/SimpleSAML/Locale/Localization.php b/src/SimpleSAML/Locale/Localization.php index 71cbee3bd2..0ff02fbe53 100644 --- a/src/SimpleSAML/Locale/Localization.php +++ b/src/SimpleSAML/Locale/Localization.php @@ -84,6 +84,7 @@ public function __construct( $this->language = new Language($configuration); $this->langcode = $this->language->getPosixLanguage($this->language->getLanguage()); $this->setupL10N(); + $this->addAttributeDomains(); } diff --git a/src/SimpleSAML/Locale/Translate.php b/src/SimpleSAML/Locale/Translate.php index ea6b85e6e1..03416ebac1 100644 --- a/src/SimpleSAML/Locale/Translate.php +++ b/src/SimpleSAML/Locale/Translate.php @@ -111,7 +111,7 @@ public static function translateSingularGettext(?string $original): string // try attributes.po if ($text === $original) { // @TODO: Fix this to be compatible with PHP 8.4 - domain cannot be an empty string - $text = TranslatorFunctions::getTranslator()->dgettext("", $original); + $text = TranslatorFunctions::getTranslator()->dgettext("attributes", $original); } } } diff --git a/tests/modules/core/src/Controller/ExceptionTest.php b/tests/modules/core/src/Controller/ExceptionTest.php index 901f41dc4d..91db3aefee 100644 --- a/tests/modules/core/src/Controller/ExceptionTest.php +++ b/tests/modules/core/src/Controller/ExceptionTest.php @@ -86,7 +86,7 @@ public function testErrorURL(string $code, string $ts, string $rp, string $tid, Logger::setCaptureLog(false); $log = Logger::getCapturedLog(); - self::assertCount(7, $log); + self::assertCount(9, $log); self::assertStringContainsString( "A Service Provider reported the following error during authentication: " From 668a5c283f06a19d1b926e284d1ff89750e9387c Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 11 Dec 2025 09:52:39 +0100 Subject: [PATCH 430/532] Fix lock-file --- composer.json | 2 +- composer.lock | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index c9edb94759..d2473d7e27 100644 --- a/composer.json +++ b/composer.json @@ -144,5 +144,5 @@ "echo 'Post-install tasks completed!'" ] }, - "version": "v2.5.0-rc3" + "version": "v2.5.0-rc5" } diff --git a/composer.lock b/composer.lock index 2156ea74ca..9b48bcb1f5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a0e7d5e6cd96d3a2243700a40c83e383", + "content-hash": "70b5b97bd612c974b035a11f48238d5d", "packages": [ { "name": "gettext/gettext", @@ -1231,21 +1231,21 @@ }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.5.7", + "version": "v2.5.8", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "b6d9ce8749884b6197a1a41f80512cf6767b035b" + "reference": "653d8307375664d59f6e464e58c4deb27bea3c4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/b6d9ce8749884b6197a1a41f80512cf6767b035b", - "reference": "b6d9ce8749884b6197a1a41f80512cf6767b035b", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/653d8307375664d59f6e464e58c4deb27bea3c4e", + "reference": "653d8307375664d59f6e464e58c4deb27bea3c4e", "shasum": "" }, "require": { "php": "^8.2", - "simplesamlphp/composer-module-installer": "^1.4.0" + "simplesamlphp/composer-module-installer": "~1.6.0" }, "type": "simplesamlphp-module", "notification-url": "https://packagist.org/downloads/", @@ -1261,9 +1261,9 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.7" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.8" }, - "time": "2025-10-21T15:44:31+00:00" + "time": "2025-12-10T21:08:51+00:00" }, { "name": "simplesamlphp/xml-common", From 8e1da160e2942137d319c08d44c8f644c1960bc6 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 15 Dec 2025 09:14:26 +0100 Subject: [PATCH 431/532] Add ext-sodium to the installed extensions --- .github/workflows/php.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index a3cc81430b..37004077a8 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -52,7 +52,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-versions }} - extensions: intl, mbstring, mysql, pdo, pdo_sqlite, soap, xml + extensions: intl, mbstring, mysql, pdo, pdo_sqlite, soap, sodium, xml tools: composer:v2 ini-values: error_reporting=E_ALL coverage: xdebug @@ -120,7 +120,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-versions }} - extensions: intl, mbstring, mysql, pdo, pdo_sqlite, soap, xml + extensions: intl, mbstring, mysql, pdo, pdo_sqlite, soap, sodium, xml tools: composer:v2 ini-values: error_reporting=E_ALL coverage: none @@ -195,7 +195,8 @@ jobs: run: composer validate - name: Install Composer dependencies - run: composer install --no-progress --prefer-dist --optimize-autoloader + run: composer install --no-progress --prefer-dist --optimize-autoloader \ + --ignore-platform-req=maglnet/composer-require-checker - name: PHP Code Sniffer run: vendor/bin/phpcs From 439843850a82c807f64245347c4fe6b77e036f57 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 18 Dec 2025 21:40:01 +0100 Subject: [PATCH 432/532] Fix old use of comparison-enumeration --- modules/saml/src/Auth/Source/SP.php | 25 +++++++++++-------------- modules/saml/src/Message.php | 8 +++++--- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/modules/saml/src/Auth/Source/SP.php b/modules/saml/src/Auth/Source/SP.php index 34c6e5666f..b6593656fb 100644 --- a/modules/saml/src/Auth/Source/SP.php +++ b/modules/saml/src/Auth/Source/SP.php @@ -26,6 +26,9 @@ use SimpleSAML\Store; use SimpleSAML\Store\StoreFactory; use SimpleSAML\Utils; +use SimpleSAML\SAML2\XML\samlp\AuthnContextComparisonTypeEnum; + +use function array_column; class SP extends Auth\Source { @@ -507,17 +510,16 @@ private function startSSO2(Configuration $idpMetadata, array $state): void } if ($accr !== null) { - $comp = Constants::COMPARISON_EXACT; + $comp = AuthnContextComparisonTypeEnum::Exact; if ($idpMetadata->getOptionalString('AuthnContextComparison', null) !== null) { $comp = $idpMetadata->getString('AuthnContextComparison'); } elseif ( isset($state['saml:AuthnContextComparison']) - && in_array($state['saml:AuthnContextComparison'], [ - Constants::COMPARISON_EXACT, - Constants::COMPARISON_MINIMUM, - Constants::COMPARISON_MAXIMUM, - Constants::COMPARISON_BETTER, - ], true) + && in_array( + $state['saml:AuthnContextComparison'], + array_column(AuthnContextComparisonTypeEnum::cases(), 'value'), + true, + ) ) { $comp = $state['saml:AuthnContextComparison']; } @@ -531,12 +533,7 @@ private function startSSO2(Configuration $idpMetadata, array $state): void isset($state['saml:RequestedAuthnContext']['Comparison']) && in_array( $state['saml:RequestedAuthnContext']['Comparison'], - [ - Constants::COMPARISON_EXACT, - Constants::COMPARISON_MINIMUM, - Constants::COMPARISON_MAXIMUM, - Constants::COMPARISON_BETTER, - ], + array_column(AuthnContextComparisonTypeEnum::cases(), 'value'), true, ) ) { @@ -911,7 +908,7 @@ public function reauthenticate(array &$state): void if ( $this->passAuthnContextClassRef && isset($state['saml:RequestedAuthnContext']) - && $state['saml:RequestedAuthnContext']['Comparison'] === Constants::COMPARISON_EXACT + && $state['saml:RequestedAuthnContext']['Comparison'] === AuthnContextComparisonTypeEnum::Exact->value && isset($data['saml:sp:AuthnContext']) && $state['saml:RequestedAuthnContext']['AuthnContextClassRef'][0] !== $data['saml:sp:AuthnContext'] ) { diff --git a/modules/saml/src/Message.php b/modules/saml/src/Message.php index 0c2f270717..f8beb913c1 100644 --- a/modules/saml/src/Message.php +++ b/modules/saml/src/Message.php @@ -25,9 +25,11 @@ use SimpleSAML\Logger; use SimpleSAML\Module\saml\Error as SAMLError; use SimpleSAML\SAML2\Constants; -use SimpleSAML\SAML2\XML\Comparison; +use SimpleSAML\SAML2\XML\samlp\AuthnContextComparisonTypeEnum; use SimpleSAML\Utils; +use function array_column; + /** * Common code for building SAML 2 messages based on the available metadata. * @@ -522,8 +524,8 @@ public static function buildAuthnRequest( $accr = $spMetadata->getArrayizeString('AuthnContextClassRef'); $comp = $spMetadata->getOptionalValueValidate( 'AuthnContextComparison', - array_column(Comparison::cases(), 'value'), - Comparison::EXACT->value, + array_column(AuthnContextComparisonTypeEnum::cases(), 'value'), + AuthnContextComparisonTypeEnum::Exact->value, ); $ar->setRequestedAuthnContext(['AuthnContextClassRef' => $accr, 'Comparison' => $comp]); } From 67c144de4f3cdd537fcccdc9eb48b47db4f50d5e Mon Sep 17 00:00:00 2001 From: Jason Davis <8051493+happydude@users.noreply.github.com> Date: Thu, 15 Jan 2026 14:41:21 -0700 Subject: [PATCH 433/532] Utils\Http php 8.5 deprecation fix (#2585) * Fix php 8.5 deprecation Deprecated: The predefined locally scoped $http_response_header variable is deprecated * Fix php 8.5 deprecation Deprecated: The predefined locally scoped $http_response_header variable is deprecated --- src/SimpleSAML/Utils/HTTP.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/SimpleSAML/Utils/HTTP.php b/src/SimpleSAML/Utils/HTTP.php index 7b5bb31c07..e69732df5c 100644 --- a/src/SimpleSAML/Utils/HTTP.php +++ b/src/SimpleSAML/Utils/HTTP.php @@ -510,9 +510,14 @@ public function fetch(string $url, array $context = [], bool $getHeaders = false // data and headers if ($getHeaders) { - if (!empty($http_response_header)) { + if (PHP_VERSION_ID > 80500) { + $http_response_headers = http_get_last_response_headers(); + } else { + $http_response_headers = $http_response_header ?? []; + } + if (!empty($http_response_headers)) { $headers = []; - foreach ($http_response_header as $h) { + foreach ($http_response_headers as $h) { if (preg_match('@^HTTP/1\.[01]\s+\d{3}\s+@', $h)) { $headers = []; // reset $headers[0] = $h; From bc5239074776d89f024d00880a4ef2423ea5e98a Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 28 Jan 2026 07:56:01 +0100 Subject: [PATCH 434/532] Bump dependencies --- composer.json | 2 +- composer.lock | 1083 +++++++++++++++++++++++-------------------------- 2 files changed, 500 insertions(+), 585 deletions(-) diff --git a/composer.json b/composer.json index d2473d7e27..9bac93022b 100644 --- a/composer.json +++ b/composer.json @@ -98,7 +98,7 @@ "gettext/php-scanner": "~2.0", "mikey179/vfsstream": "~1.6", "predis/predis": "~3.3", - "simplesamlphp/simplesamlphp-test-framework": "~1.10", + "simplesamlphp/simplesamlphp-test-framework": "~1.11", "symfony/translation": "~7.4" }, "suggest": { diff --git a/composer.lock b/composer.lock index 9b48bcb1f5..d483fa1b6f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "70b5b97bd612c974b035a11f48238d5d", + "content-hash": "9243b3e0c34a24cc63ef0ca656363928", "packages": [ { "name": "gettext/gettext", @@ -1231,16 +1231,16 @@ }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.5.8", + "version": "v2.5.10", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "653d8307375664d59f6e464e58c4deb27bea3c4e" + "reference": "5b348022d2e80b8f5f1c6bf11db08d4c5fb8e88c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/653d8307375664d59f6e464e58c4deb27bea3c4e", - "reference": "653d8307375664d59f6e464e58c4deb27bea3c4e", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/5b348022d2e80b8f5f1c6bf11db08d4c5fb8e88c", + "reference": "5b348022d2e80b8f5f1c6bf11db08d4c5fb8e88c", "shasum": "" }, "require": { @@ -1261,22 +1261,22 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.8" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.10" }, - "time": "2025-12-10T21:08:51+00:00" + "time": "2026-01-26T17:24:19+00:00" }, { "name": "simplesamlphp/xml-common", - "version": "v2.4.2", + "version": "v2.6.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "2155a18021fc09ed9796dc9a1f6ea48818d1bb6a" + "reference": "e43fd4bea99c1092fcd575af96595c1feabde853" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/2155a18021fc09ed9796dc9a1f6ea48818d1bb6a", - "reference": "2155a18021fc09ed9796dc9a1f6ea48818d1bb6a", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/e43fd4bea99c1092fcd575af96595c1feabde853", + "reference": "e43fd4bea99c1092fcd575af96595c1feabde853", "shasum": "" }, "require": { @@ -1287,19 +1287,21 @@ "ext-libxml": "*", "ext-pcre": "*", "ext-spl": "*", - "php": "^8.2", + "guzzlehttp/psr7": "~2.8", + "php": "^8.3", + "psr/clock": "~1.0", "simplesamlphp/assert": "~1.9", "simplesamlphp/composer-xmlprovider-installer": "~1.2" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "~1.10" + "simplesamlphp/simplesamlphp-test-framework": "~1.11" }, "type": "simplesamlphp-xmlprovider", "autoload": { "psr-4": { - "SimpleSAML\\XML\\": "src/XML", - "SimpleSAML\\XPath\\": "src/XPath", - "SimpleSAML\\XMLSchema\\": "src/XMLSchema" + "SimpleSAML\\XML\\": "src/XML/", + "SimpleSAML\\XPath\\": "src/XPath/", + "SimpleSAML\\XMLSchema\\": "src/XMLSchema/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1319,27 +1321,29 @@ "description": "A library with classes and utilities for handling XML structures.", "homepage": "http://simplesamlphp.org", "keywords": [ - "saml", - "xml" + "Xpath", + "schema", + "xml", + "xsd" ], "support": { "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2025-12-08T23:28:08+00:00" + "time": "2026-01-21T22:57:54+00:00" }, { "name": "simplesamlphp/xml-security", - "version": "v2.0.9", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-security.git", - "reference": "c1b310c5fb7e4b2121551f28968df3f54ff30d2e" + "reference": "c3a2b89855764f515089f92357e196ae6e4d6801" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/c1b310c5fb7e4b2121551f28968df3f54ff30d2e", - "reference": "c1b310c5fb7e4b2121551f28968df3f54ff30d2e", + "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/c3a2b89855764f515089f92357e196ae6e4d6801", + "reference": "c3a2b89855764f515089f92357e196ae6e4d6801", "shasum": "" }, "require": { @@ -1349,12 +1353,12 @@ "ext-openssl": "*", "ext-pcre": "*", "ext-spl": "*", - "php": "^8.2", + "php": "^8.3", "simplesamlphp/assert": "~1.9", - "simplesamlphp/xml-common": "~2.4" + "simplesamlphp/xml-common": "~2.5" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "~1.10" + "simplesamlphp/simplesamlphp-test-framework": "~1.11" }, "type": "simplesamlphp-xmlprovider", "autoload": { @@ -1388,33 +1392,33 @@ ], "support": { "issues": "https://github.com/simplesamlphp/xml-security/issues", - "source": "https://github.com/simplesamlphp/xml-security/tree/v2.0.9" + "source": "https://github.com/simplesamlphp/xml-security/tree/v2.2.0" }, - "time": "2025-12-08T12:08:30+00:00" + "time": "2026-01-26T22:00:19+00:00" }, { "name": "simplesamlphp/xml-soap", - "version": "v2.0.7", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-soap.git", - "reference": "c794e1a6783ec7424f864c77776af7ba3983a53e" + "reference": "ffd6ff05c062548efe22cedf6376ee67a5da69d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-soap/zipball/c794e1a6783ec7424f864c77776af7ba3983a53e", - "reference": "c794e1a6783ec7424f864c77776af7ba3983a53e", + "url": "https://api.github.com/repos/simplesamlphp/xml-soap/zipball/ffd6ff05c062548efe22cedf6376ee67a5da69d9", + "reference": "ffd6ff05c062548efe22cedf6376ee67a5da69d9", "shasum": "" }, "require": { "ext-dom": "*", "ext-pcre": "*", - "php": "^8.2", + "php": "^8.3", "simplesamlphp/assert": "~1.9", - "simplesamlphp/xml-common": "~2.4" + "simplesamlphp/xml-common": "~2.5" }, "require-dev": { - "simplesamlphp/simplesamlphp-test-framework": "~1.10" + "simplesamlphp/simplesamlphp-test-framework": "~1.11" }, "type": "simplesamlphp-xmlprovider", "extra": { @@ -1441,22 +1445,22 @@ "description": "SimpleSAMLphp library for XML SOAP", "support": { "issues": "https://github.com/simplesamlphp/xml-soap/issues", - "source": "https://github.com/simplesamlphp/xml-soap/tree/v2.0.7" + "source": "https://github.com/simplesamlphp/xml-soap/tree/v2.2.0" }, - "time": "2025-11-20T18:07:30+00:00" + "time": "2026-01-21T23:26:53+00:00" }, { "name": "symfony/cache", - "version": "v7.4.1", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "21e0755783bbbab58f2bb6a7a57896d21d27a366" + "reference": "67ca35eaa52dd9c1f07a42d459b5a2544dd29b34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/21e0755783bbbab58f2bb6a7a57896d21d27a366", - "reference": "21e0755783bbbab58f2bb6a7a57896d21d27a366", + "url": "https://api.github.com/repos/symfony/cache/zipball/67ca35eaa52dd9c1f07a42d459b5a2544dd29b34", + "reference": "67ca35eaa52dd9c1f07a42d459b5a2544dd29b34", "shasum": "" }, "require": { @@ -1527,7 +1531,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.4.1" + "source": "https://github.com/symfony/cache/tree/v7.4.4" }, "funding": [ { @@ -1547,7 +1551,7 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:11:45+00:00" + "time": "2026-01-23T12:59:19+00:00" }, { "name": "symfony/cache-contracts", @@ -1627,16 +1631,16 @@ }, { "name": "symfony/config", - "version": "v7.4.1", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "2c323304c354a43a48b61c5fa760fc4ed60ce495" + "reference": "4275b53b8ab0cf37f48bf273dc2285c8178efdfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/2c323304c354a43a48b61c5fa760fc4ed60ce495", - "reference": "2c323304c354a43a48b61c5fa760fc4ed60ce495", + "url": "https://api.github.com/repos/symfony/config/zipball/4275b53b8ab0cf37f48bf273dc2285c8178efdfb", + "reference": "4275b53b8ab0cf37f48bf273dc2285c8178efdfb", "shasum": "" }, "require": { @@ -1682,7 +1686,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.4.1" + "source": "https://github.com/symfony/config/tree/v7.4.4" }, "funding": [ { @@ -1702,20 +1706,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T07:52:08+00:00" + "time": "2026-01-13T11:36:38+00:00" }, { "name": "symfony/console", - "version": "v7.4.1", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e" + "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e", - "reference": "6d9f0fbf2ec2e9785880096e3abd0ca0c88b506e", + "url": "https://api.github.com/repos/symfony/console/zipball/41e38717ac1dd7a46b6bda7d6a82af2d98a78894", + "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894", "shasum": "" }, "require": { @@ -1780,7 +1784,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.1" + "source": "https://github.com/symfony/console/tree/v7.4.4" }, "funding": [ { @@ -1800,20 +1804,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T15:23:39+00:00" + "time": "2026-01-13T11:36:38+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.4.2", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "baf614f7c15b30ba6762d4b1ddabdf83dbf0d29b" + "reference": "dbbaba1cc65ccfa29106e931f68b51cd2f4b32bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/baf614f7c15b30ba6762d4b1ddabdf83dbf0d29b", - "reference": "baf614f7c15b30ba6762d4b1ddabdf83dbf0d29b", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/dbbaba1cc65ccfa29106e931f68b51cd2f4b32bb", + "reference": "dbbaba1cc65ccfa29106e931f68b51cd2f4b32bb", "shasum": "" }, "require": { @@ -1864,7 +1868,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.4.2" + "source": "https://github.com/symfony/dependency-injection/tree/v7.4.4" }, "funding": [ { @@ -1884,7 +1888,7 @@ "type": "tidelift" } ], - "time": "2025-12-08T06:57:04+00:00" + "time": "2026-01-23T12:59:19+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1955,16 +1959,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2" + "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/48be2b0653594eea32dcef130cca1c811dcf25c2", - "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8da531f364ddfee53e36092a7eebbbd0b775f6b8", + "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8", "shasum": "" }, "require": { @@ -2013,7 +2017,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.4.0" + "source": "https://github.com/symfony/error-handler/tree/v7.4.4" }, "funding": [ { @@ -2033,20 +2037,20 @@ "type": "tidelift" } ], - "time": "2025-11-05T14:29:59+00:00" + "time": "2026-01-20T16:42:42+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d" + "reference": "dc2c0eba1af673e736bb851d747d266108aea746" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9dddcddff1ef974ad87b3708e4b442dc38b2261d", - "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dc2c0eba1af673e736bb851d747d266108aea746", + "reference": "dc2c0eba1af673e736bb851d747d266108aea746", "shasum": "" }, "require": { @@ -2098,7 +2102,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.4" }, "funding": [ { @@ -2118,7 +2122,7 @@ "type": "tidelift" } ], - "time": "2025-10-28T09:38:46+00:00" + "time": "2026-01-05T11:45:34+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -2198,16 +2202,16 @@ }, { "name": "symfony/expression-language", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "8b9bbbb8c71f79a09638f6ea77c531e511139efa" + "reference": "f3a6497eb6573e185f2ec41cd3b3f0cd68ddf667" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/8b9bbbb8c71f79a09638f6ea77c531e511139efa", - "reference": "8b9bbbb8c71f79a09638f6ea77c531e511139efa", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/f3a6497eb6573e185f2ec41cd3b3f0cd68ddf667", + "reference": "f3a6497eb6573e185f2ec41cd3b3f0cd68ddf667", "shasum": "" }, "require": { @@ -2242,7 +2246,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v7.4.0" + "source": "https://github.com/symfony/expression-language/tree/v7.4.4" }, "funding": [ { @@ -2262,7 +2266,7 @@ "type": "tidelift" } ], - "time": "2025-11-12T15:39:26+00:00" + "time": "2026-01-05T08:47:25+00:00" }, { "name": "symfony/filesystem", @@ -2336,16 +2340,16 @@ }, { "name": "symfony/finder", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "340b9ed7320570f319028a2cbec46d40535e94bd" + "reference": "01b24a145bbeaa7141e75887ec904c34a6728a5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd", - "reference": "340b9ed7320570f319028a2cbec46d40535e94bd", + "url": "https://api.github.com/repos/symfony/finder/zipball/01b24a145bbeaa7141e75887ec904c34a6728a5f", + "reference": "01b24a145bbeaa7141e75887ec904c34a6728a5f", "shasum": "" }, "require": { @@ -2380,7 +2384,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.0" + "source": "https://github.com/symfony/finder/tree/v7.4.4" }, "funding": [ { @@ -2400,20 +2404,20 @@ "type": "tidelift" } ], - "time": "2025-11-05T05:42:40+00:00" + "time": "2026-01-12T12:19:02+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.4.1", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "2fa3b3ad6ed75ce0cc8cad8a5027b4f25b990bc3" + "reference": "71fffd9f6cf8df1e2ee311176c85a10eddfdb08c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/2fa3b3ad6ed75ce0cc8cad8a5027b4f25b990bc3", - "reference": "2fa3b3ad6ed75ce0cc8cad8a5027b4f25b990bc3", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/71fffd9f6cf8df1e2ee311176c85a10eddfdb08c", + "reference": "71fffd9f6cf8df1e2ee311176c85a10eddfdb08c", "shasum": "" }, "require": { @@ -2421,8 +2425,8 @@ "ext-xml": "*", "php": ">=8.2", "symfony/cache": "^6.4.12|^7.0|^8.0", - "symfony/config": "^7.4|^8.0", - "symfony/dependency-injection": "^7.4|^8.0", + "symfony/config": "^7.4.4|^8.0.4", + "symfony/dependency-injection": "^7.4.4|^8.0.4", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^7.3|^8.0", "symfony/event-dispatcher": "^6.4|^7.0|^8.0", @@ -2538,7 +2542,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.4.1" + "source": "https://github.com/symfony/framework-bundle/tree/v7.4.4" }, "funding": [ { @@ -2558,20 +2562,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:04:53+00:00" + "time": "2026-01-12T12:19:02+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.4.1", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "bd1af1e425811d6f077db240c3a588bdb405cd27" + "reference": "977a554a34cf8edc95ca351fbecb1bb1ad05cc94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/bd1af1e425811d6f077db240c3a588bdb405cd27", - "reference": "bd1af1e425811d6f077db240c3a588bdb405cd27", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/977a554a34cf8edc95ca351fbecb1bb1ad05cc94", + "reference": "977a554a34cf8edc95ca351fbecb1bb1ad05cc94", "shasum": "" }, "require": { @@ -2620,7 +2624,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.1" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.4" }, "funding": [ { @@ -2640,20 +2644,20 @@ "type": "tidelift" } ], - "time": "2025-12-07T11:13:10+00:00" + "time": "2026-01-09T12:14:21+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.2", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f6e6f0a5fa8763f75a504b930163785fb6dd055f" + "reference": "48b067768859f7b68acf41dfb857a5a4be00acdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f6e6f0a5fa8763f75a504b930163785fb6dd055f", - "reference": "f6e6f0a5fa8763f75a504b930163785fb6dd055f", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/48b067768859f7b68acf41dfb857a5a4be00acdd", + "reference": "48b067768859f7b68acf41dfb857a5a4be00acdd", "shasum": "" }, "require": { @@ -2739,7 +2743,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.2" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.4" }, "funding": [ { @@ -2759,20 +2763,20 @@ "type": "tidelift" } ], - "time": "2025-12-08T07:43:37+00:00" + "time": "2026-01-24T22:13:01+00:00" }, { "name": "symfony/intl", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "2fa074de6c7faa6b54f2891fc22708f42245ed5c" + "reference": "7fa2d46174166bcd7829abc8717949f8a0b21fb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/2fa074de6c7faa6b54f2891fc22708f42245ed5c", - "reference": "2fa074de6c7faa6b54f2891fc22708f42245ed5c", + "url": "https://api.github.com/repos/symfony/intl/zipball/7fa2d46174166bcd7829abc8717949f8a0b21fb7", + "reference": "7fa2d46174166bcd7829abc8717949f8a0b21fb7", "shasum": "" }, "require": { @@ -2829,7 +2833,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.4.0" + "source": "https://github.com/symfony/intl/tree/v7.4.4" }, "funding": [ { @@ -2849,20 +2853,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2026-01-12T12:19:02+00:00" }, { "name": "symfony/password-hasher", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "aa075ce6f54fe931f03c1e382597912f4fd94e1e" + "reference": "ab8e0ef42483f31c417c82ecfcf7be7b91d784fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/aa075ce6f54fe931f03c1e382597912f4fd94e1e", - "reference": "aa075ce6f54fe931f03c1e382597912f4fd94e1e", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/ab8e0ef42483f31c417c82ecfcf7be7b91d784fe", + "reference": "ab8e0ef42483f31c417c82ecfcf7be7b91d784fe", "shasum": "" }, "require": { @@ -2905,7 +2909,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.4.0" + "source": "https://github.com/symfony/password-hasher/tree/v7.4.4" }, "funding": [ { @@ -2925,7 +2929,7 @@ "type": "tidelift" } ], - "time": "2025-08-13T16:46:49+00:00" + "time": "2026-01-01T22:13:48+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3432,16 +3436,16 @@ }, { "name": "symfony/routing", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "4720254cb2644a0b876233d258a32bf017330db7" + "reference": "0798827fe2c79caeed41d70b680c2c3507d10147" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/4720254cb2644a0b876233d258a32bf017330db7", - "reference": "4720254cb2644a0b876233d258a32bf017330db7", + "url": "https://api.github.com/repos/symfony/routing/zipball/0798827fe2c79caeed41d70b680c2c3507d10147", + "reference": "0798827fe2c79caeed41d70b680c2c3507d10147", "shasum": "" }, "require": { @@ -3493,7 +3497,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.0" + "source": "https://github.com/symfony/routing/tree/v7.4.4" }, "funding": [ { @@ -3513,7 +3517,7 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2026-01-12T12:19:02+00:00" }, { "name": "symfony/service-contracts", @@ -3604,16 +3608,16 @@ }, { "name": "symfony/string", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003" + "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003", - "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003", + "url": "https://api.github.com/repos/symfony/string/zipball/1c4b10461bf2ec27537b5f36105337262f5f5d6f", + "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f", "shasum": "" }, "require": { @@ -3671,7 +3675,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.4.0" + "source": "https://github.com/symfony/string/tree/v7.4.4" }, "funding": [ { @@ -3691,7 +3695,7 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2026-01-12T10:54:30+00:00" }, { "name": "symfony/translation-contracts", @@ -3777,16 +3781,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.4.1", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "9103559ef3e9f06708d8bff6810f6335b8f1eee8" + "reference": "23c337a975c1527a4b91199f795abb62ede5238f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/9103559ef3e9f06708d8bff6810f6335b8f1eee8", - "reference": "9103559ef3e9f06708d8bff6810f6335b8f1eee8", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/23c337a975c1527a4b91199f795abb62ede5238f", + "reference": "23c337a975c1527a4b91199f795abb62ede5238f", "shasum": "" }, "require": { @@ -3799,7 +3803,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/console": "<6.4", - "symfony/form": "<6.4", + "symfony/form": "<6.4.32|>7,<7.3.10|>7.4,<7.4.4|>8.0,<8.0.4", "symfony/http-foundation": "<6.4", "symfony/http-kernel": "<6.4", "symfony/mime": "<6.4", @@ -3818,7 +3822,7 @@ "symfony/emoji": "^7.1|^8.0", "symfony/expression-language": "^6.4|^7.0|^8.0", "symfony/finder": "^6.4|^7.0|^8.0", - "symfony/form": "^6.4.30|~7.3.8|^7.4.1|^8.0.1", + "symfony/form": "^6.4.32|~7.3.10|^7.4.4|^8.0.4", "symfony/html-sanitizer": "^6.4|^7.0|^8.0", "symfony/http-foundation": "^7.3|^8.0", "symfony/http-kernel": "^6.4|^7.0|^8.0", @@ -3868,7 +3872,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.4.1" + "source": "https://github.com/symfony/twig-bridge/tree/v7.4.4" }, "funding": [ { @@ -3888,20 +3892,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:04:53+00:00" + "time": "2026-01-07T10:07:42+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece" + "reference": "0e4769b46a0c3c62390d124635ce59f66874b282" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41fd6c4ae28c38b294b42af6db61446594a0dece", - "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0e4769b46a0c3c62390d124635ce59f66874b282", + "reference": "0e4769b46a0c3c62390d124635ce59f66874b282", "shasum": "" }, "require": { @@ -3955,7 +3959,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.0" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.4" }, "funding": [ { @@ -3975,7 +3979,7 @@ "type": "tidelift" } ], - "time": "2025-10-27T20:36:44+00:00" + "time": "2026-01-01T22:13:48+00:00" }, { "name": "symfony/var-exporter", @@ -4136,16 +4140,16 @@ }, { "name": "twig/intl-extra", - "version": "v3.22.1", + "version": "v3.23.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "93ac31e53cdd3f2e541f42690cd0c54ca8138ab1" + "reference": "32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/93ac31e53cdd3f2e541f42690cd0c54ca8138ab1", - "reference": "93ac31e53cdd3f2e541f42690cd0c54ca8138ab1", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f", + "reference": "32f15a38d45a8d0ec11bc8a3d97d3ac2a261499f", "shasum": "" }, "require": { @@ -4184,7 +4188,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.22.1" + "source": "https://github.com/twigphp/intl-extra/tree/v3.23.0" }, "funding": [ { @@ -4196,20 +4200,20 @@ "type": "tidelift" } ], - "time": "2025-11-02T11:00:49+00:00" + "time": "2026-01-17T13:57:47+00:00" }, { "name": "twig/twig", - "version": "v3.22.1", + "version": "v3.23.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "1de2ec1fc43ab58a4b7e80b214b96bfc895750f3" + "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/1de2ec1fc43ab58a4b7e80b214b96bfc895750f3", - "reference": "1de2ec1fc43ab58a4b7e80b214b96bfc895750f3", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", + "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", "shasum": "" }, "require": { @@ -4263,7 +4267,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.22.1" + "source": "https://github.com/twigphp/Twig/tree/v3.23.0" }, "funding": [ { @@ -4275,7 +4279,7 @@ "type": "tidelift" } ], - "time": "2025-11-16T16:01:12+00:00" + "time": "2026-01-23T21:00:41+00:00" }, { "name": "webmozart/assert", @@ -4339,16 +4343,16 @@ "packages-dev": [ { "name": "azjezz/psl", - "version": "3.3.0", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/azjezz/psl.git", - "reference": "78078f2c505473d2a28319ffe426b2a82ac76790" + "reference": "15153a64c9824335ce11654522e7d88de762d39e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/azjezz/psl/zipball/78078f2c505473d2a28319ffe426b2a82ac76790", - "reference": "78078f2c505473d2a28319ffe426b2a82ac76790", + "url": "https://api.github.com/repos/azjezz/psl/zipball/15153a64c9824335ce11654522e7d88de762d39e", + "reference": "15153a64c9824335ce11654522e7d88de762d39e", "shasum": "" }, "require": { @@ -4357,17 +4361,15 @@ "ext-json": "*", "ext-mbstring": "*", "ext-sodium": "*", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0", - "revolt/event-loop": "^1.0.6" + "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "revolt/event-loop": "^1.0.7" }, "require-dev": { - "carthage-software/mago": "~0.13.1", + "carthage-software/mago": "^1.0.0-beta.32", + "infection/infection": "^0.31.2", "php-coveralls/php-coveralls": "^2.7.0", - "php-standard-library/psalm-plugin": "^2.3.0", - "phpbench/phpbench": "^1.2.15", - "phpunit/phpunit": "^9.6.18", - "roave/infection-static-analysis-plugin": "^1.36.0", - "vimeo/psalm": "^6.0.0" + "phpbench/phpbench": "^1.4.0", + "phpunit/phpunit": "^9.6.22" }, "suggest": { "php-standard-library/phpstan-extension": "PHPStan integration", @@ -4401,15 +4403,19 @@ "description": "PHP Standard Library", "support": { "issues": "https://github.com/azjezz/psl/issues", - "source": "https://github.com/azjezz/psl/tree/3.3.0" + "source": "https://github.com/azjezz/psl/tree/4.2.0" }, "funding": [ { "url": "https://github.com/azjezz", "type": "github" + }, + { + "url": "https://github.com/veewee", + "type": "github" } ], - "time": "2025-03-03T00:07:00+00:00" + "time": "2025-10-25T08:31:40+00:00" }, { "name": "composer-unused/contracts", @@ -4931,39 +4937,42 @@ }, { "name": "maglnet/composer-require-checker", - "version": "4.18.0", + "version": "4.20.0", "source": { "type": "git", "url": "https://github.com/maglnet/ComposerRequireChecker.git", - "reference": "de930e82bb61e0161d909696950692523b8eaa3f" + "reference": "c62d517ef5ac2d347dd9b3d02c1cc16c0f1091e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maglnet/ComposerRequireChecker/zipball/de930e82bb61e0161d909696950692523b8eaa3f", - "reference": "de930e82bb61e0161d909696950692523b8eaa3f", + "url": "https://api.github.com/repos/maglnet/ComposerRequireChecker/zipball/c62d517ef5ac2d347dd9b3d02c1cc16c0f1091e2", + "reference": "c62d517ef5ac2d347dd9b3d02c1cc16c0f1091e2", "shasum": "" }, "require": { - "azjezz/psl": "^3.2.0", + "azjezz/psl": "^4.2.0", "composer-runtime-api": "^2.0.0", "ext-phar": "*", - "nikic/php-parser": "^5.4.0", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", - "symfony/console": "^7.2.1", + "nikic/php-parser": "^5.7.0", + "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "symfony/console": "^7.4.1", "webmozart/glob": "^4.7.0" }, + "conflict": { + "revolt/event-loop": "< 1.0.8" + }, "require-dev": { "doctrine/coding-standard": "^14.0.0", "ext-zend-opcache": "*", - "phing/phing": "^3.0.1", - "php-standard-library/phpstan-extension": "^2.0", + "phing/phing": "^3.1.1", + "php-standard-library/phpstan-extension": "^2.0.2", "php-standard-library/psalm-plugin": "^2.3", - "phpstan/phpstan": "^2.1.19", - "phpunit/phpunit": "^11.5.27", + "phpstan/phpstan": "^2.1.33", + "phpunit/phpunit": "^12.5.4", "psalm/plugin-phpunit": "^0.19.5", - "roave/infection-static-analysis-plugin": "^1.38.0", + "roave/infection-static-analysis-plugin": "^1.42.0", "spatie/temporary-directory": "^2.3.0", - "vimeo/psalm": "^6.13.0" + "vimeo/psalm": "^6.14.3" }, "bin": [ "bin/composer-require-checker" @@ -5008,9 +5017,9 @@ ], "support": { "issues": "https://github.com/maglnet/ComposerRequireChecker/issues", - "source": "https://github.com/maglnet/ComposerRequireChecker/tree/4.18.0" + "source": "https://github.com/maglnet/ComposerRequireChecker/tree/4.20.0" }, - "time": "2025-10-30T11:58:39+00:00" + "time": "2025-12-29T11:34:42+00:00" }, { "name": "mikey179/vfsstream", @@ -5428,16 +5437,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.0", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495" + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495", - "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", + "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", "shasum": "" }, "require": { @@ -5469,17 +5478,17 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" }, - "time": "2025-08-30T15:50:23+00:00" + "time": "2026-01-25T14:56:51+00:00" }, { "name": "phpstan/phpstan", - "version": "2.1.33", + "version": "2.1.37", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9e800e6bee7d5bd02784d4c6069b48032d16224f", - "reference": "9e800e6bee7d5bd02784d4c6069b48032d16224f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/28cd424c5ea984128c95cfa7ea658808e8954e49", + "reference": "28cd424c5ea984128c95cfa7ea658808e8954e49", "shasum": "" }, "require": { @@ -5524,7 +5533,7 @@ "type": "github" } ], - "time": "2025-12-05T10:24:31+00:00" + "time": "2026-01-24T08:21:55+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -5577,16 +5586,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "2.0.10", + "version": "2.0.12", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "8d61a5854e7497d95bc85188e13537e99bd7aae7" + "reference": "e4c5a22bf43d3d2bd5a780ad261a622ff62c49a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/8d61a5854e7497d95bc85188e13537e99bd7aae7", - "reference": "8d61a5854e7497d95bc85188e13537e99bd7aae7", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/e4c5a22bf43d3d2bd5a780ad261a622ff62c49a4", + "reference": "e4c5a22bf43d3d2bd5a780ad261a622ff62c49a4", "shasum": "" }, "require": { @@ -5624,41 +5633,40 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.10" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.12" }, - "time": "2025-12-06T11:15:39+00:00" + "time": "2026-01-22T13:40:00+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "11.0.11", + "version": "12.5.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4" + "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", - "reference": "4f7722aa9a7b76aa775e2d9d4e95d1ea16eeeef4", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4a9739b51cbcb355f6e95659612f92e282a7077b", + "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.4.0", - "php": ">=8.2", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-text-template": "^4.0.1", - "sebastian/code-unit-reverse-lookup": "^4.0.1", - "sebastian/complexity": "^4.0.1", - "sebastian/environment": "^7.2.0", - "sebastian/lines-of-code": "^3.0.1", - "sebastian/version": "^5.0.2", - "theseer/tokenizer": "^1.2.3" + "nikic/php-parser": "^5.7.0", + "php": ">=8.3", + "phpunit/php-file-iterator": "^6.0", + "phpunit/php-text-template": "^5.0", + "sebastian/complexity": "^5.0", + "sebastian/environment": "^8.0.3", + "sebastian/lines-of-code": "^4.0", + "sebastian/version": "^6.0", + "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^11.5.2" + "phpunit/phpunit": "^12.5.1" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -5667,7 +5675,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "11.0.x-dev" + "dev-main": "12.5.x-dev" } }, "autoload": { @@ -5696,7 +5704,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.11" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.2" }, "funding": [ { @@ -5716,32 +5724,32 @@ "type": "tidelift" } ], - "time": "2025-08-27T14:37:49+00:00" + "time": "2025-12-24T07:03:04+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "5.1.0", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + "reference": "961bc913d42fe24a257bfff826a5068079ac7782" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", + "reference": "961bc913d42fe24a257bfff826a5068079ac7782", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -5769,7 +5777,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" }, "funding": [ { @@ -5777,28 +5785,28 @@ "type": "github" } ], - "time": "2024-08-27T05:02:59+00:00" + "time": "2025-02-07T04:58:37+00:00" }, { "name": "phpunit/php-invoker", - "version": "5.0.1", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406", + "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-pcntl": "*" @@ -5806,7 +5814,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -5833,7 +5841,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0" }, "funding": [ { @@ -5841,32 +5849,32 @@ "type": "github" } ], - "time": "2024-07-03T05:07:44+00:00" + "time": "2025-02-07T04:58:58+00:00" }, { "name": "phpunit/php-text-template", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e1367a453f0eda562eedb4f659e13aa900d66c53", + "reference": "e1367a453f0eda562eedb4f659e13aa900d66c53", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -5893,7 +5901,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.0" }, "funding": [ { @@ -5901,32 +5909,32 @@ "type": "github" } ], - "time": "2024-07-03T05:08:43+00:00" + "time": "2025-02-07T04:59:16+00:00" }, { "name": "phpunit/php-timer", - "version": "7.0.1", + "version": "8.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", + "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -5953,7 +5961,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0" }, "funding": [ { @@ -5961,20 +5969,20 @@ "type": "github" } ], - "time": "2024-07-03T05:09:35+00:00" + "time": "2025-02-07T04:59:38+00:00" }, { "name": "phpunit/phpunit", - "version": "11.5.46", + "version": "12.5.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "75dfe79a2aa30085b7132bb84377c24062193f33" + "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/75dfe79a2aa30085b7132bb84377c24062193f33", - "reference": "75dfe79a2aa30085b7132bb84377c24062193f33", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/37ddb96c14bfee10304825edbb7e66d341ec6889", + "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889", "shasum": "" }, "require": { @@ -5987,34 +5995,30 @@ "myclabs/deep-copy": "^1.13.4", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.11", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-invoker": "^5.0.1", - "phpunit/php-text-template": "^4.0.1", - "phpunit/php-timer": "^7.0.1", - "sebastian/cli-parser": "^3.0.2", - "sebastian/code-unit": "^3.0.3", - "sebastian/comparator": "^6.3.2", - "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.1", - "sebastian/exporter": "^6.3.2", - "sebastian/global-state": "^7.0.2", - "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.1.3", - "sebastian/version": "^5.0.2", + "php": ">=8.3", + "phpunit/php-code-coverage": "^12.5.2", + "phpunit/php-file-iterator": "^6.0.0", + "phpunit/php-invoker": "^6.0.0", + "phpunit/php-text-template": "^5.0.0", + "phpunit/php-timer": "^8.0.0", + "sebastian/cli-parser": "^4.2.0", + "sebastian/comparator": "^7.1.4", + "sebastian/diff": "^7.0.0", + "sebastian/environment": "^8.0.3", + "sebastian/exporter": "^7.0.2", + "sebastian/global-state": "^8.0.2", + "sebastian/object-enumerator": "^7.0.0", + "sebastian/type": "^6.0.3", + "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { - "dev-main": "11.5-dev" + "dev-main": "12.5-dev" } }, "autoload": { @@ -6046,7 +6050,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.46" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.8" }, "funding": [ { @@ -6070,7 +6074,7 @@ "type": "tidelift" } ], - "time": "2025-12-06T08:01:15+00:00" + "time": "2026-01-27T06:12:29+00:00" }, { "name": "predis/predis", @@ -6209,28 +6213,28 @@ }, { "name": "sebastian/cli-parser", - "version": "3.0.2", + "version": "4.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/90f41072d220e5c40df6e8635f5dafba2d9d4d04", + "reference": "90f41072d220e5c40df6e8635f5dafba2d9d4d04", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.2-dev" } }, "autoload": { @@ -6254,152 +6258,51 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.0" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2024-07-03T04:41:36+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "security": "https://github.com/sebastianbergmann/code-unit/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" - }, - "funding": [ + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-03-19T07:56:08+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" - }, - "funding": [ + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser", + "type": "tidelift" } ], - "time": "2024-07-03T04:45:54+00:00" + "time": "2025-09-14T09:36:45+00:00" }, { "name": "sebastian/comparator", - "version": "6.3.2", + "version": "7.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8" + "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85c77556683e6eee4323e4c5468641ca0237e2e8", - "reference": "85c77556683e6eee4323e4c5468641ca0237e2e8", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a7de5df2e094f9a80b40a522391a7e6022df5f6", + "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/diff": "^6.0", - "sebastian/exporter": "^6.0" + "php": ">=8.3", + "sebastian/diff": "^7.0", + "sebastian/exporter": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.4" + "phpunit/phpunit": "^12.2" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -6407,7 +6310,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.3-dev" + "dev-main": "7.1-dev" } }, "autoload": { @@ -6447,7 +6350,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.2" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.4" }, "funding": [ { @@ -6467,33 +6370,33 @@ "type": "tidelift" } ], - "time": "2025-08-10T08:07:46+00:00" + "time": "2026-01-24T09:28:48+00:00" }, { "name": "sebastian/complexity", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb", + "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -6517,7 +6420,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0" }, "funding": [ { @@ -6525,33 +6428,33 @@ "type": "github" } ], - "time": "2024-07-03T04:49:50+00:00" + "time": "2025-02-07T04:55:25+00:00" }, { "name": "sebastian/diff", - "version": "6.0.2", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0", - "symfony/process": "^4.2 || ^5" + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -6584,7 +6487,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" }, "funding": [ { @@ -6592,27 +6495,27 @@ "type": "github" } ], - "time": "2024-07-03T04:53:05+00:00" + "time": "2025-02-07T04:55:46+00:00" }, { "name": "sebastian/environment", - "version": "7.2.1", + "version": "8.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "suggest": { "ext-posix": "*" @@ -6620,7 +6523,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "7.2-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -6648,7 +6551,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" }, "funding": [ { @@ -6668,34 +6571,34 @@ "type": "tidelift" } ], - "time": "2025-05-21T11:55:47+00:00" + "time": "2025-08-12T14:11:56+00:00" }, { "name": "sebastian/exporter", - "version": "6.3.2", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" + "reference": "016951ae10980765e4e7aee491eb288c64e505b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", - "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/016951ae10980765e4e7aee491eb288c64e505b7", + "reference": "016951ae10980765e4e7aee491eb288c64e505b7", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.3-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -6738,7 +6641,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" + "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.2" }, "funding": [ { @@ -6758,35 +6661,35 @@ "type": "tidelift" } ], - "time": "2025-09-24T06:12:51+00:00" + "time": "2025-09-24T06:16:11+00:00" }, { "name": "sebastian/global-state", - "version": "7.0.2", + "version": "8.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + "reference": "ef1377171613d09edd25b7816f05be8313f9115d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ef1377171613d09edd25b7816f05be8313f9115d", + "reference": "ef1377171613d09edd25b7816f05be8313f9115d", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "8.0-dev" } }, "autoload": { @@ -6812,41 +6715,53 @@ "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", + "type": "tidelift" } ], - "time": "2024-07-03T04:57:36+00:00" + "time": "2025-08-29T11:29:25+00:00" }, { "name": "sebastian/lines-of-code", - "version": "3.0.1", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/97ffee3bcfb5805568d6af7f0f893678fc076d2f", + "reference": "97ffee3bcfb5805568d6af7f0f893678fc076d2f", "shasum": "" }, "require": { "nikic/php-parser": "^5.0", - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -6870,7 +6785,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.0" }, "funding": [ { @@ -6878,34 +6793,34 @@ "type": "github" } ], - "time": "2024-07-03T04:58:38+00:00" + "time": "2025-02-07T04:57:28+00:00" }, { "name": "sebastian/object-enumerator", - "version": "6.0.1", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894", + "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894", "shasum": "" }, "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" + "php": ">=8.3", + "sebastian/object-reflector": "^5.0", + "sebastian/recursion-context": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -6928,7 +6843,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0" }, "funding": [ { @@ -6936,32 +6851,32 @@ "type": "github" } ], - "time": "2024-07-03T05:00:13+00:00" + "time": "2025-02-07T04:57:48+00:00" }, { "name": "sebastian/object-reflector", - "version": "4.0.1", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + "reference": "4bfa827c969c98be1e527abd576533293c634f6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a", + "reference": "4bfa827c969c98be1e527abd576533293c634f6a", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "4.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -6984,7 +6899,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0" }, "funding": [ { @@ -6992,32 +6907,32 @@ "type": "github" } ], - "time": "2024-07-03T05:01:32+00:00" + "time": "2025-02-07T04:58:17+00:00" }, { "name": "sebastian/recursion-context", - "version": "6.0.3", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", - "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", + "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -7048,7 +6963,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1" }, "funding": [ { @@ -7068,32 +6983,32 @@ "type": "tidelift" } ], - "time": "2025-08-13T04:42:22+00:00" + "time": "2025-08-13T04:44:59+00:00" }, { "name": "sebastian/type", - "version": "5.1.3", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", - "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e549163b9760b8f71f191651d22acf32d56d6d4d", + "reference": "e549163b9760b8f71f191651d22acf32d56d6d4d", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^11.3" + "phpunit/phpunit": "^12.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.1-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -7117,7 +7032,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" + "source": "https://github.com/sebastianbergmann/type/tree/6.0.3" }, "funding": [ { @@ -7137,29 +7052,29 @@ "type": "tidelift" } ], - "time": "2025-08-09T06:55:48+00:00" + "time": "2025-08-09T06:57:12+00:00" }, { "name": "sebastian/version", - "version": "5.0.2", + "version": "6.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/3e6ccf7657d4f0a59200564b08cead899313b53c", + "reference": "3e6ccf7657d4f0a59200564b08cead899313b53c", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "5.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -7183,7 +7098,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + "source": "https://github.com/sebastianbergmann/version/tree/6.0.0" }, "funding": [ { @@ -7191,39 +7106,39 @@ "type": "github" } ], - "time": "2024-10-09T05:16:32+00:00" + "time": "2025-02-07T05:00:38+00:00" }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.10.6", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "b33c1108738ab06fb40314cd1449445da402095f" + "reference": "c63076afb619d950f30958aa551eb7b548f9fc84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/b33c1108738ab06fb40314cd1449445da402095f", - "reference": "b33c1108738ab06fb40314cd1449445da402095f", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/c63076afb619d950f30958aa551eb7b548f9fc84", + "reference": "c63076afb619d950f30958aa551eb7b548f9fc84", "shasum": "" }, "require": { "ext-curl": "*", "icanhazstring/composer-unused": "^0.9", - "maglnet/composer-require-checker": "^4", - "php": "^8.2", + "maglnet/composer-require-checker": "^4.19", + "php": "^8.3", "phpstan/extension-installer": "^1.4", "phpstan/phpstan": "^2.1", "phpstan/phpstan-mockery": "^2.0", "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^11.5 || ^12.3", + "phpunit/phpunit": "^12.3", "psr/log": "^3.0", - "slevomat/coding-standard": "^8.20", - "squizlabs/php_codesniffer": "^3.13 || ^4.0", - "symfony/phpunit-bridge": "^7.3 || ^8.0" + "slevomat/coding-standard": "^8.25", + "squizlabs/php_codesniffer": "^4.0", + "symfony/phpunit-bridge": "^8.0" }, "require-dev": { - "simplesamlphp/simplesamlphp": "^2.4" + "simplesamlphp/simplesamlphp": "^2.5@dev" }, "type": "project", "autoload": { @@ -7249,36 +7164,36 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2025-11-29T21:53:08+00:00" + "time": "2025-12-16T19:55:18+00:00" }, { "name": "slevomat/coding-standard", - "version": "8.25.1", + "version": "8.27.1", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "4caa5ec5a30b84b2305e80159c710d437f40cc40" + "reference": "29bdaee8b65e7ed2b8e702b01852edba8bae1769" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/4caa5ec5a30b84b2305e80159c710d437f40cc40", - "reference": "4caa5ec5a30b84b2305e80159c710d437f40cc40", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/29bdaee8b65e7ed2b8e702b01852edba8bae1769", + "reference": "29bdaee8b65e7ed2b8e702b01852edba8bae1769", "shasum": "" }, "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.2.0", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.2.0", "php": "^7.4 || ^8.0", - "phpstan/phpdoc-parser": "^2.3.0", + "phpstan/phpdoc-parser": "^2.3.1", "squizlabs/php_codesniffer": "^4.0.1" }, "require-dev": { - "phing/phing": "3.0.1|3.1.0", + "phing/phing": "3.0.1|3.1.1", "php-parallel-lint/php-parallel-lint": "1.4.0", - "phpstan/phpstan": "2.1.32", + "phpstan/phpstan": "2.1.37", "phpstan/phpstan-deprecation-rules": "2.0.3", - "phpstan/phpstan-phpunit": "2.0.8", + "phpstan/phpstan-phpunit": "2.0.12", "phpstan/phpstan-strict-rules": "2.0.7", - "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.36|12.4.4" + "phpunit/phpunit": "9.6.31|10.5.60|11.4.4|11.5.49|12.5.7" }, "type": "phpcodesniffer-standard", "extra": { @@ -7302,7 +7217,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.25.1" + "source": "https://github.com/slevomat/coding-standard/tree/8.27.1" }, "funding": [ { @@ -7314,7 +7229,7 @@ "type": "tidelift" } ], - "time": "2025-11-25T18:01:43+00:00" + "time": "2026-01-25T15:57:07+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -7449,16 +7364,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "51b2adaf2cdb00cdab11e6b593e37ef76358e161" + "reference": "3c59b07980df5d4ae4a2620287016209802261ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/51b2adaf2cdb00cdab11e6b593e37ef76358e161", - "reference": "51b2adaf2cdb00cdab11e6b593e37ef76358e161", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/3c59b07980df5d4ae4a2620287016209802261ea", + "reference": "3c59b07980df5d4ae4a2620287016209802261ea", "shasum": "" }, "require": { @@ -7510,7 +7425,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.3" }, "funding": [ { @@ -7530,7 +7445,7 @@ "type": "tidelift" } ], - "time": "2025-10-29T07:48:08+00:00" + "time": "2025-12-10T13:10:54+00:00" }, { "name": "symfony/polyfill-php84", @@ -7614,21 +7529,21 @@ }, { "name": "symfony/property-access", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "537626149d2910ca43eb9ce465654366bf4442f4" + "reference": "fa49bf1ca8fce1ba0e2dba4e4658554cfb9364b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/537626149d2910ca43eb9ce465654366bf4442f4", - "reference": "537626149d2910ca43eb9ce465654366bf4442f4", + "url": "https://api.github.com/repos/symfony/property-access/zipball/fa49bf1ca8fce1ba0e2dba4e4658554cfb9364b1", + "reference": "fa49bf1ca8fce1ba0e2dba4e4658554cfb9364b1", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/property-info": "^6.4|^7.0|^8.0" + "symfony/property-info": "^6.4.32|~7.3.10|^7.4.4|^8.0.4" }, "require-dev": { "symfony/cache": "^6.4|^7.0|^8.0", @@ -7671,7 +7586,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.4.0" + "source": "https://github.com/symfony/property-access/tree/v7.4.4" }, "funding": [ { @@ -7691,27 +7606,27 @@ "type": "tidelift" } ], - "time": "2025-09-08T21:14:32+00:00" + "time": "2026-01-05T08:47:25+00:00" }, { "name": "symfony/property-info", - "version": "v7.4.1", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "912aafe70bee5cfd09fec5916fe35b83f04ae6ae" + "reference": "b5305f3bc5727d0395e9681237e870ed5a5d21ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/912aafe70bee5cfd09fec5916fe35b83f04ae6ae", - "reference": "912aafe70bee5cfd09fec5916fe35b83f04ae6ae", + "url": "https://api.github.com/repos/symfony/property-info/zipball/b5305f3bc5727d0395e9681237e870ed5a5d21ae", + "reference": "b5305f3bc5727d0395e9681237e870ed5a5d21ae", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/string": "^6.4|^7.0|^8.0", - "symfony/type-info": "~7.3.8|^7.4.1|^8.0.1" + "symfony/type-info": "~7.3.10|^7.4.4|^8.0.4" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", @@ -7761,7 +7676,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.4.1" + "source": "https://github.com/symfony/property-info/tree/v7.4.4" }, "funding": [ { @@ -7781,20 +7696,20 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:04:53+00:00" + "time": "2026-01-23T10:51:15+00:00" }, { "name": "symfony/serializer", - "version": "v7.4.2", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "1a957acb613b520e443c2c659a67c782b67794bc" + "reference": "3b9a5d5c941a2a6e2a7dbe0e63fc3161888a5cd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/1a957acb613b520e443c2c659a67c782b67794bc", - "reference": "1a957acb613b520e443c2c659a67c782b67794bc", + "url": "https://api.github.com/repos/symfony/serializer/zipball/3b9a5d5c941a2a6e2a7dbe0e63fc3161888a5cd4", + "reference": "3b9a5d5c941a2a6e2a7dbe0e63fc3161888a5cd4", "shasum": "" }, "require": { @@ -7864,7 +7779,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.4.2" + "source": "https://github.com/symfony/serializer/tree/v7.4.4" }, "funding": [ { @@ -7884,20 +7799,20 @@ "type": "tidelift" } ], - "time": "2025-12-07T17:35:40+00:00" + "time": "2026-01-23T10:51:15+00:00" }, { "name": "symfony/translation", - "version": "v7.4.0", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68" + "reference": "bfde13711f53f549e73b06d27b35a55207528877" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", - "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", + "url": "https://api.github.com/repos/symfony/translation/zipball/bfde13711f53f549e73b06d27b35a55207528877", + "reference": "bfde13711f53f549e73b06d27b35a55207528877", "shasum": "" }, "require": { @@ -7964,7 +7879,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.4.0" + "source": "https://github.com/symfony/translation/tree/v7.4.4" }, "funding": [ { @@ -7984,20 +7899,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2026-01-13T10:40:19+00:00" }, { "name": "symfony/type-info", - "version": "v7.4.1", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "ac5ab66b21c758df71b7210cf1033d1ac807f202" + "reference": "f83c725e72b39b2704b9d6fc85070ad6ac7a5889" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/ac5ab66b21c758df71b7210cf1033d1ac807f202", - "reference": "ac5ab66b21c758df71b7210cf1033d1ac807f202", + "url": "https://api.github.com/repos/symfony/type-info/zipball/f83c725e72b39b2704b9d6fc85070ad6ac7a5889", + "reference": "f83c725e72b39b2704b9d6fc85070ad6ac7a5889", "shasum": "" }, "require": { @@ -8047,7 +7962,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.4.1" + "source": "https://github.com/symfony/type-info/tree/v7.4.4" }, "funding": [ { @@ -8067,27 +7982,27 @@ "type": "tidelift" } ], - "time": "2025-12-05T14:04:53+00:00" + "time": "2026-01-09T12:14:21+00:00" }, { "name": "theseer/tokenizer", - "version": "1.3.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", - "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4", + "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.1" }, "type": "library", "autoload": { @@ -8109,7 +8024,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.3.1" + "source": "https://github.com/theseer/tokenizer/tree/2.0.1" }, "funding": [ { @@ -8117,7 +8032,7 @@ "type": "github" } ], - "time": "2025-11-17T20:03:58+00:00" + "time": "2025-12-08T11:19:18+00:00" }, { "name": "webmozart/glob", From fe60682be86900cef7ebd8c82a9aa558e4d98af7 Mon Sep 17 00:00:00 2001 From: Ioannis Igoumenos <3846025+ioigoume@users.noreply.github.com> Date: Thu, 5 Feb 2026 03:07:36 +0200 Subject: [PATCH 435/532] BUGFIX: http-getselfurl-robust-path-and-query (#2589) * Improve HTTP::getSelfURL() path detection and URL reconstruction * Revert reconstruction of URL from parts when REQUEST_URI can be used.Add specific test for the modrewrite scenario. --- src/SimpleSAML/Utils/HTTP.php | 45 ++++++++++++++++------ tests/src/SimpleSAML/Utils/HTTPTest.php | 50 +++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 12 deletions(-) diff --git a/src/SimpleSAML/Utils/HTTP.php b/src/SimpleSAML/Utils/HTTP.php index e69732df5c..b3e03e6239 100644 --- a/src/SimpleSAML/Utils/HTTP.php +++ b/src/SimpleSAML/Utils/HTTP.php @@ -785,12 +785,19 @@ public function getSelfURL(): string $cur_path = realpath($_SERVER['SCRIPT_FILENAME']); // make sure we got a string from realpath() $cur_path = is_string($cur_path) ? $cur_path : ''; + // find the path to the current script relative to the public/ directory of SimpleSAMLphp $rel_path = str_replace($baseDir . 'public' . DIRECTORY_SEPARATOR, '', $cur_path); - // convert that relative path to an HTTP query + $url_path = str_replace(DIRECTORY_SEPARATOR, '/', $rel_path); - // find where the relative path starts in the current request URI - $uri_pos = (!empty($url_path)) ? strpos($_SERVER['REQUEST_URI'] ?? '', $url_path) : false; + + $requestUri = (string)($_SERVER['REQUEST_URI'] ?? ''); + $requestPath = (string)parse_url($requestUri, PHP_URL_PATH); + $requestQuery = (string)parse_url($requestUri, PHP_URL_QUERY); + $requestFragment = (string)parse_url($requestUri, PHP_URL_FRAGMENT); + + // Match script-relative path only against the path part of the request + $uri_pos = (!empty($url_path)) ? strpos($requestPath, $url_path) : false; if ($cur_path == $rel_path || $uri_pos === false) { /* @@ -799,12 +806,13 @@ public function getSelfURL(): string * - $_SERVER['SCRIPT_FILENAME'] points to a script that doesn't exist. E.g. functional testing. In this * case, realpath() returns false and str_replace an empty string, so we compare them loosely. * - * - The URI requested does not belong to a script in the public/ directory of SimpleSAMLphp. In that case, - * removing SimpleSAMLphp's base dir from the current path yields the same path, so $cur_path and + * - The script is not located under the public/ directory of SimpleSAMLphp. In that case, removing + * SimpleSAMLphp's base dir and public/ from the current path yields the same path, so $cur_path and * $rel_path are equal. * - * - The request URI does not match the current script. Even if the current script is located in the - * public/ directory of SimpleSAMLphp, the URI does not contain its relative path, and $uri_pos is false. + * - The request path does not match the current script. Even if the current script is located in the + * public/ directory of SimpleSAMLphp, the request path (without query string) does not contain its + * relative path, and $uri_pos is false. * * It doesn't matter which one of those cases we have. We just know we can't apply our base URL to the * current URI, so we need to build it back from the PHP environment, unless we have a base URL specified @@ -814,20 +822,33 @@ public function getSelfURL(): string $appurl = ($appcfg !== null) ? $appcfg->getOptionalString('baseURL', null) : null; if (!empty($appurl)) { - $protocol = parse_url($appurl, PHP_URL_SCHEME); - $hostname = parse_url($appurl, PHP_URL_HOST); - $port = parse_url($appurl, PHP_URL_PORT); - $port = !empty($port) ? ':' . $port : ''; + $protocol = (string)parse_url($appurl, PHP_URL_SCHEME); + $hostname = (string)parse_url($appurl, PHP_URL_HOST); + $portNum = parse_url($appurl, PHP_URL_PORT); + $port = !empty($portNum) ? ':' . $portNum : ''; } else { // no base URL specified for app, just use the current URL $protocol = $this->getServerHTTPS() ? 'https' : 'http'; $hostname = $this->getServerHost(); $port = $this->getServerPort(); } + return $protocol . '://' . $hostname . $port . $_SERVER['REQUEST_URI']; } - return $this->getBaseURL() . $url_path . substr($_SERVER['REQUEST_URI'], $uri_pos + strlen($url_path)); + // Normal case: baseURL + script-relative path + remaining path, plus query if present + $suffix = substr($requestPath, $uri_pos + strlen($url_path)); + $url = $this->getBaseURL() . $url_path . $suffix; + + if ($requestQuery !== '') { + $url .= '?' . $requestQuery; + } + + if ($requestFragment !== '') { + $url .= '#' . $requestFragment; + } + + return $url; } diff --git a/tests/src/SimpleSAML/Utils/HTTPTest.php b/tests/src/SimpleSAML/Utils/HTTPTest.php index d506f2fc16..1f53c9d853 100644 --- a/tests/src/SimpleSAML/Utils/HTTPTest.php +++ b/tests/src/SimpleSAML/Utils/HTTPTest.php @@ -757,4 +757,54 @@ public static function slowPostDelayProvider(): array 'positive config 10000 => 10000' => [10000, 10000], ]; } + + /** + * Ensure getSelfURL() returns the externally visible URL when SimpleSAMLphp + * is reached via a rewritten path (e.g. /cas/login -> /simplesaml/module.php/...), + * and the internal script name (module.php) appears only in the query string. + * + * This simulates an Apache mod_rewrite rule like: + * RewriteRule ^/cas/login(.*) /${SSP_APACHE_ALIAS}module.php/casserver/login.php$1 [PT] + * + * In this scenario the public URL is /cas/login?... while the actual script is + * public/module.php. + */ + public function testGetSelfURLWithRewrittenCasLogin(): void + { + $originalServer = $_SERVER; + + $httpUtils = new Utils\HTTP(); + + $cfg = Configuration::loadFromArray([ + 'baseurlpath' => 'https://tr-monitor-okta2.qa.athena-institute.net/simplesaml/', + ], '[ARRAY]', 'simplesaml'); + $baseDir = $cfg->getBaseDir(); + + $_SERVER = [ + 'HTTPS' => 'on', + 'HTTP_HOST' => 'tr-monitor-okta2.qa.athena-institute.net', + 'SERVER_NAME' => 'tr-monitor-okta2.qa.athena-institute.net', + 'SERVER_PORT' => 443, + 'SCRIPT_URI' => 'https://tr-monitor-okta2.qa.athena-institute.net/cas/login', + 'SCRIPT_NAME' => '/module.php', + 'SCRIPT_FILENAME' => $baseDir . 'public' . DIRECTORY_SEPARATOR . 'module.php', + 'PATH_TRANSLATED' => $baseDir . 'public' . DIRECTORY_SEPARATOR . 'casserver/login.php', + 'PHP_SELF' => '/module.php/casserver/login.php', + 'QUERY_STRING' => 'service=' + . 'https%3A%2F%2Fcas-test-bridge.bridge.qa.cirrusidentity.com%2Fmodule.php%2Fcas%2Flinkback.php' + . '%3FstateId%3D_somestate', + 'REQUEST_URI' => '/cas/login?service=' + . 'https%3A%2F%2Fcas-test-bridge.bridge.qa.cirrusidentity.com%2Fmodule.php%2Fcas%2Flinkback.php' + . '%3FstateId%3D_somestate', + ]; + + $expected = 'https://tr-monitor-okta2.qa.athena-institute.net' + . '/cas/login' + . '?service=https%3A%2F%2Fcas-test-bridge.bridge.qa.cirrusidentity.com%2Fmodule.php%2Fcas%2Flinkback.php' + . '%3FstateId%3D_somestate'; + + $this->assertSame($expected, $httpUtils->getSelfURL()); + + $_SERVER = $originalServer; + } } From 26d17d0095ea60e8d73b6a824ca1c1264e2037fe Mon Sep 17 00:00:00 2001 From: Guy Halse Date: Thu, 5 Feb 2026 03:15:33 +0200 Subject: [PATCH 436/532] Record values from RequestedAttributes (#2582) --- src/SimpleSAML/Metadata/SAMLParser.php | 11 ++++++++++- tests/src/SimpleSAML/Metadata/SAMLParserTest.php | 6 ++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/SimpleSAML/Metadata/SAMLParser.php b/src/SimpleSAML/Metadata/SAMLParser.php index 1cd96caa13..cb8a693a6c 100644 --- a/src/SimpleSAML/Metadata/SAMLParser.php +++ b/src/SimpleSAML/Metadata/SAMLParser.php @@ -1075,7 +1075,16 @@ private static function parseAttributeConsumerService(AttributeConsumingService $sp['attributes.required'] = []; foreach ($element->getRequestedAttribute() as $child) { $attrname = $child->getName(); - $sp['attributes'][] = $attrname; + $attrvalue = $child->getAttributeValue(); + if (empty($attrvalue)) { + $sp['attributes'][] = $attrname; + } else { + $values = []; + foreach ($attrvalue as $attrval) { + $values[] = $attrval->getString(); + } + $sp['attributes'][$attrname] = $values; + } if ($child->getIsRequired() === true) { $sp['attributes.required'][] = $attrname; diff --git a/tests/src/SimpleSAML/Metadata/SAMLParserTest.php b/tests/src/SimpleSAML/Metadata/SAMLParserTest.php index 9f8c5da281..99936cf90e 100644 --- a/tests/src/SimpleSAML/Metadata/SAMLParserTest.php +++ b/tests/src/SimpleSAML/Metadata/SAMLParserTest.php @@ -222,6 +222,9 @@ public function testAttributeConsumingServiceParsing(): void + + urn:mace:dir:entitlement:common-lib-terms + @@ -243,6 +246,9 @@ public function testAttributeConsumingServiceParsing(): void "urn:mace:dir:attribute-def:eduPersonPrincipalName", "urn:mace:dir:attribute-def:mail", "urn:mace:dir:attribute-def:displayName", + "urn:oid:1.3.6.1.4.1.5923.1.1.1.7" => [ + "urn:mace:dir:entitlement:common-lib-terms", + ], ]; $expected_r = ["urn:mace:dir:attribute-def:eduPersonPrincipalName"]; From 77091e4858d3c6ef43f8b6964330fd0e2deac6f0 Mon Sep 17 00:00:00 2001 From: Dick Visser Date: Wed, 18 Feb 2026 18:27:38 +0100 Subject: [PATCH 437/532] Remove stray spacing in twig (#2596) --- templates/_table.twig | 21 ++++++++++----------- templates/auth_status.twig | 6 +++--- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/templates/_table.twig b/templates/_table.twig index df05e0d43e..763d447260 100644 --- a/templates/_table.twig +++ b/templates/_table.twig @@ -3,21 +3,20 @@ {% for name, values in items %} - {% block namecol -%} + {%~ block namecol -%} {{ name }} {%- endblock %} + + {%- for value in values -%} + {% if loop.length>1 and loop.first %}
    {% endif -%} + {%- if loop.length>1 %}
  • {% endif -%} - - {% for value in values %} - {% if loop.length>1 and loop.first %}
      {% endif -%} - {%- if loop.length>1 %}
    • {% endif -%} + {%- block value %}{% endblock -%} - {%- block value %}{% endblock -%} - - {%- if loop.length>1 %}
    • {% endif -%} - {%- if loop.length>1 and loop.last %}
    {% endif %} - {% endfor %} - + {%- if loop.length>1 %}
  • {% endif -%} + {%- if loop.length>1 and loop.last %}
{% endif %} + {%- endfor -%} + {% endfor %}
diff --git a/templates/auth_status.twig b/templates/auth_status.twig index 731ef1f87c..1d3e3f43dd 100644 --- a/templates/auth_status.twig +++ b/templates/auth_status.twig @@ -18,9 +18,9 @@ {% embed '_table.twig' -%} - {% block namecol -%} + {% block namecol %} {% set translated = name|trans %} - {% if translated != name %} {{ translated }}
{% endif %} {{ name }} + {% if translated != name %} {{ translated }}
{% endif %}{{ name }} {% endblock %} @@ -28,7 +28,7 @@ {% if name =='jpegPhoto'-%} {% else %}{{ value }}{% endif -%} - {% endblock %} + {% endblock -%} {%- endembed %} From f7a4bac9cf64e7bc11162dacf5433190362b46bc Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Sat, 21 Feb 2026 09:39:43 +1000 Subject: [PATCH 438/532] Updates for CI in 2.5 series (#2595) * NO MERGE: testing CI on 2.5 series * composer update * composer update w p83 * update for getMockForAbstractClass * perhaps using getMock is the right solution here * need php 8.3 for the ssp 2.5 series * rerun * . * move that back to 8.2 * Fix CI * remove that first bogus commit --------- Co-authored-by: Tim van Dijen --- .github/workflows/php.yml | 6 +- composer.lock | 295 +++++++++--------- modules/saml/src/Auth/Source/SP.php | 2 +- .../Auth/Process/CardinalitySingleTest.php | 3 +- .../core/src/Auth/Process/CardinalityTest.php | 5 +- .../core/src/Auth/UserPassBaseTest.php | 12 +- 6 files changed, 169 insertions(+), 154 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 37004077a8..b88a8ab67d 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - php-version: ['8.2', '8.3', '8.4', '8.5'] + php-version: ['8.3', '8.4', '8.5'] uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml@v1.10.6 with: @@ -44,7 +44,7 @@ jobs: fail-fast: false matrix: operating-system: [ubuntu-latest] - php-versions: ['8.2', '8.3', '8.4', '8.5'] + php-versions: ['8.3', '8.4', '8.5'] steps: - name: Setup PHP, with composer and extensions @@ -112,7 +112,7 @@ jobs: fail-fast: true matrix: operating-system: [windows-latest] - php-versions: ['8.2', '8.3', '8.4', '8.5'] + php-versions: ['8.3', '8.4', '8.5'] steps: - name: Setup PHP, with composer and extensions diff --git a/composer.lock b/composer.lock index d483fa1b6f..c420614c4a 100644 --- a/composer.lock +++ b/composer.lock @@ -1231,16 +1231,16 @@ }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.5.10", + "version": "v2.5.11", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "5b348022d2e80b8f5f1c6bf11db08d4c5fb8e88c" + "reference": "23fb1fd3911077a3bef26cc2d2cb39594dd83acb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/5b348022d2e80b8f5f1c6bf11db08d4c5fb8e88c", - "reference": "5b348022d2e80b8f5f1c6bf11db08d4c5fb8e88c", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/23fb1fd3911077a3bef26cc2d2cb39594dd83acb", + "reference": "23fb1fd3911077a3bef26cc2d2cb39594dd83acb", "shasum": "" }, "require": { @@ -1261,9 +1261,9 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.10" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.11" }, - "time": "2026-01-26T17:24:19+00:00" + "time": "2026-02-15T02:01:47+00:00" }, { "name": "simplesamlphp/xml-common", @@ -1451,16 +1451,16 @@ }, { "name": "symfony/cache", - "version": "v7.4.4", + "version": "v7.4.5", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "67ca35eaa52dd9c1f07a42d459b5a2544dd29b34" + "reference": "8dde98d5a4123b53877aca493f9be57b333f14bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/67ca35eaa52dd9c1f07a42d459b5a2544dd29b34", - "reference": "67ca35eaa52dd9c1f07a42d459b5a2544dd29b34", + "url": "https://api.github.com/repos/symfony/cache/zipball/8dde98d5a4123b53877aca493f9be57b333f14bd", + "reference": "8dde98d5a4123b53877aca493f9be57b333f14bd", "shasum": "" }, "require": { @@ -1531,7 +1531,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.4.4" + "source": "https://github.com/symfony/cache/tree/v7.4.5" }, "funding": [ { @@ -1551,7 +1551,7 @@ "type": "tidelift" } ], - "time": "2026-01-23T12:59:19+00:00" + "time": "2026-01-27T16:16:02+00:00" }, { "name": "symfony/cache-contracts", @@ -1808,16 +1808,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v7.4.4", + "version": "v7.4.5", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "dbbaba1cc65ccfa29106e931f68b51cd2f4b32bb" + "reference": "76a02cddca45a5254479ad68f9fa274ead0a7ef2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/dbbaba1cc65ccfa29106e931f68b51cd2f4b32bb", - "reference": "dbbaba1cc65ccfa29106e931f68b51cd2f4b32bb", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/76a02cddca45a5254479ad68f9fa274ead0a7ef2", + "reference": "76a02cddca45a5254479ad68f9fa274ead0a7ef2", "shasum": "" }, "require": { @@ -1868,7 +1868,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.4.4" + "source": "https://github.com/symfony/dependency-injection/tree/v7.4.5" }, "funding": [ { @@ -1888,7 +1888,7 @@ "type": "tidelift" } ], - "time": "2026-01-23T12:59:19+00:00" + "time": "2026-01-27T16:16:02+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2340,16 +2340,16 @@ }, { "name": "symfony/finder", - "version": "v7.4.4", + "version": "v7.4.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "01b24a145bbeaa7141e75887ec904c34a6728a5f" + "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/01b24a145bbeaa7141e75887ec904c34a6728a5f", - "reference": "01b24a145bbeaa7141e75887ec904c34a6728a5f", + "url": "https://api.github.com/repos/symfony/finder/zipball/ad4daa7c38668dcb031e63bc99ea9bd42196a2cb", + "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb", "shasum": "" }, "require": { @@ -2384,7 +2384,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.4" + "source": "https://github.com/symfony/finder/tree/v7.4.5" }, "funding": [ { @@ -2404,20 +2404,20 @@ "type": "tidelift" } ], - "time": "2026-01-12T12:19:02+00:00" + "time": "2026-01-26T15:07:59+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.4.4", + "version": "v7.4.5", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "71fffd9f6cf8df1e2ee311176c85a10eddfdb08c" + "reference": "dcf89ca6712d9e1b5d3f14dea0e1c2685a05d1cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/71fffd9f6cf8df1e2ee311176c85a10eddfdb08c", - "reference": "71fffd9f6cf8df1e2ee311176c85a10eddfdb08c", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/dcf89ca6712d9e1b5d3f14dea0e1c2685a05d1cd", + "reference": "dcf89ca6712d9e1b5d3f14dea0e1c2685a05d1cd", "shasum": "" }, "require": { @@ -2440,8 +2440,8 @@ }, "conflict": { "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", + "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/type-resolver": "<1.5.1", "symfony/asset": "<6.4", "symfony/asset-mapper": "<6.4", "symfony/clock": "<6.4", @@ -2473,7 +2473,7 @@ "require-dev": { "doctrine/persistence": "^1.3|^2|^3", "dragonmantank/cron-expression": "^3.1", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpdocumentor/reflection-docblock": "^5.2", "seld/jsonlint": "^1.10", "symfony/asset": "^6.4|^7.0|^8.0", "symfony/asset-mapper": "^6.4|^7.0|^8.0", @@ -2542,7 +2542,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.4.4" + "source": "https://github.com/symfony/framework-bundle/tree/v7.4.5" }, "funding": [ { @@ -2562,20 +2562,20 @@ "type": "tidelift" } ], - "time": "2026-01-12T12:19:02+00:00" + "time": "2026-01-27T08:59:58+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.4.4", + "version": "v7.4.5", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "977a554a34cf8edc95ca351fbecb1bb1ad05cc94" + "reference": "446d0db2b1f21575f1284b74533e425096abdfb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/977a554a34cf8edc95ca351fbecb1bb1ad05cc94", - "reference": "977a554a34cf8edc95ca351fbecb1bb1ad05cc94", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/446d0db2b1f21575f1284b74533e425096abdfb6", + "reference": "446d0db2b1f21575f1284b74533e425096abdfb6", "shasum": "" }, "require": { @@ -2624,7 +2624,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.4" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.5" }, "funding": [ { @@ -2644,20 +2644,20 @@ "type": "tidelift" } ], - "time": "2026-01-09T12:14:21+00:00" + "time": "2026-01-27T16:16:02+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.4", + "version": "v7.4.5", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "48b067768859f7b68acf41dfb857a5a4be00acdd" + "reference": "229eda477017f92bd2ce7615d06222ec0c19e82a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/48b067768859f7b68acf41dfb857a5a4be00acdd", - "reference": "48b067768859f7b68acf41dfb857a5a4be00acdd", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/229eda477017f92bd2ce7615d06222ec0c19e82a", + "reference": "229eda477017f92bd2ce7615d06222ec0c19e82a", "shasum": "" }, "require": { @@ -2743,7 +2743,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.4" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.5" }, "funding": [ { @@ -2763,7 +2763,7 @@ "type": "tidelift" } ], - "time": "2026-01-24T22:13:01+00:00" + "time": "2026-01-28T10:33:42+00:00" }, { "name": "symfony/intl", @@ -3781,16 +3781,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.4.4", + "version": "v7.4.5", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "23c337a975c1527a4b91199f795abb62ede5238f" + "reference": "f2dd26b604e856476ef7e0efa4568bc07eb7ddc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/23c337a975c1527a4b91199f795abb62ede5238f", - "reference": "23c337a975c1527a4b91199f795abb62ede5238f", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/f2dd26b604e856476ef7e0efa4568bc07eb7ddc8", + "reference": "f2dd26b604e856476ef7e0efa4568bc07eb7ddc8", "shasum": "" }, "require": { @@ -3800,8 +3800,8 @@ "twig/twig": "^3.21" }, "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", + "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/type-resolver": "<1.5.1", "symfony/console": "<6.4", "symfony/form": "<6.4.32|>7,<7.3.10|>7.4,<7.4.4|>8.0,<8.0.4", "symfony/http-foundation": "<6.4", @@ -3814,7 +3814,7 @@ "require-dev": { "egulias/email-validator": "^2.1.10|^3|^4", "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpdocumentor/reflection-docblock": "^5.2", "symfony/asset": "^6.4|^7.0|^8.0", "symfony/asset-mapper": "^6.4|^7.0|^8.0", "symfony/console": "^6.4|^7.0|^8.0", @@ -3872,7 +3872,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.4.4" + "source": "https://github.com/symfony/twig-bridge/tree/v7.4.5" }, "funding": [ { @@ -3892,7 +3892,7 @@ "type": "tidelift" } ], - "time": "2026-01-07T10:07:42+00:00" + "time": "2026-01-27T08:59:58+00:00" }, { "name": "symfony/var-dumper", @@ -4343,16 +4343,16 @@ "packages-dev": [ { "name": "azjezz/psl", - "version": "4.2.0", + "version": "4.2.1", "source": { "type": "git", "url": "https://github.com/azjezz/psl.git", - "reference": "15153a64c9824335ce11654522e7d88de762d39e" + "reference": "28c6752857597a1bb6fa8be16678c144b9097ab8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/azjezz/psl/zipball/15153a64c9824335ce11654522e7d88de762d39e", - "reference": "15153a64c9824335ce11654522e7d88de762d39e", + "url": "https://api.github.com/repos/azjezz/psl/zipball/28c6752857597a1bb6fa8be16678c144b9097ab8", + "reference": "28c6752857597a1bb6fa8be16678c144b9097ab8", "shasum": "" }, "require": { @@ -4365,7 +4365,7 @@ "revolt/event-loop": "^1.0.7" }, "require-dev": { - "carthage-software/mago": "^1.0.0-beta.32", + "carthage-software/mago": "^1.3.0", "infection/infection": "^0.31.2", "php-coveralls/php-coveralls": "^2.7.0", "phpbench/phpbench": "^1.4.0", @@ -4403,7 +4403,7 @@ "description": "PHP Standard Library", "support": { "issues": "https://github.com/azjezz/psl/issues", - "source": "https://github.com/azjezz/psl/tree/4.2.0" + "source": "https://github.com/azjezz/psl/tree/4.2.1" }, "funding": [ { @@ -4415,7 +4415,7 @@ "type": "github" } ], - "time": "2025-10-25T08:31:40+00:00" + "time": "2026-01-29T12:38:33+00:00" }, { "name": "composer-unused/contracts", @@ -4465,16 +4465,16 @@ }, { "name": "composer-unused/symbol-parser", - "version": "0.3.1", + "version": "0.3.3", "source": { "type": "git", "url": "https://github.com/composer-unused/symbol-parser.git", - "reference": "a55ecd3c10867be27a2eabf31cd1600160d250ae" + "reference": "afa62007cca768bd1ecbc0e8ed347c675c239410" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer-unused/symbol-parser/zipball/a55ecd3c10867be27a2eabf31cd1600160d250ae", - "reference": "a55ecd3c10867be27a2eabf31cd1600160d250ae", + "url": "https://api.github.com/repos/composer-unused/symbol-parser/zipball/afa62007cca768bd1ecbc0e8ed347c675c239410", + "reference": "afa62007cca768bd1ecbc0e8ed347c675c239410", "shasum": "" }, "require": { @@ -4484,16 +4484,17 @@ "phpstan/phpdoc-parser": "^1.25 || ^2", "psr/container": "^1.0 || ^2.0", "psr/log": "^1.1 || ^2 || ^3", - "symfony/finder": "^5.3 || ^6.0 || ^7.0" + "symfony/finder": "^5.3 || ^6.0 || ^7.0 || ^8.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.45", + "ergebnis/composer-normalize": "^2.49", "ext-ds": "*", "phpstan/phpstan": "^2.1", - "phpunit/phpunit": "^9.6.10 || ^10.5", + "phpunit/phpunit": "^10.5", "roave/security-advisories": "dev-master", - "squizlabs/php_codesniffer": "^3.11.3", - "symfony/serializer": "^5.4" + "squizlabs/php_codesniffer": "^4.0.1", + "symfony/property-access": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/serializer": "^5.4 || ^6.0 || ^7.0 || ^8.0" }, "type": "library", "autoload": { @@ -4532,7 +4533,7 @@ "type": "other" } ], - "time": "2025-03-19T09:13:50+00:00" + "time": "2026-01-29T13:38:57+00:00" }, { "name": "composer/pcre", @@ -4836,16 +4837,16 @@ }, { "name": "icanhazstring/composer-unused", - "version": "0.9.5", + "version": "0.9.6", "source": { "type": "git", "url": "https://github.com/composer-unused/composer-unused.git", - "reference": "13b1d32e35e7c6dc997c01342c4fe1b217b6d767" + "reference": "c60030af7954a528746dd2180c10b5e0871e84c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer-unused/composer-unused/zipball/13b1d32e35e7c6dc997c01342c4fe1b217b6d767", - "reference": "13b1d32e35e7c6dc997c01342c4fe1b217b6d767", + "url": "https://api.github.com/repos/composer-unused/composer-unused/zipball/c60030af7954a528746dd2180c10b5e0871e84c7", + "reference": "c60030af7954a528746dd2180c10b5e0871e84c7", "shasum": "" }, "require": { @@ -4860,19 +4861,19 @@ "phpstan/phpdoc-parser": "^1.25 || ^2", "psr/container": "^1.0 || ^2.0", "psr/log": "^1.1 || ^2 || ^3", - "symfony/config": "^6.0 || ^7.0", - "symfony/console": "^6.0 || ^7.0", - "symfony/dependency-injection": "^6.0 || ^7.0", - "symfony/property-access": "^6.0 || ^7.0", - "symfony/serializer": "^6.0 || ^7.0", - "webmozart/assert": "^1.10", + "symfony/config": "^6.0 || ^7.0 || ^8.0", + "symfony/console": "^6.0 || ^7.0 || ^8.0", + "symfony/dependency-injection": "^6.0 || ^7.0 || ^8.0", + "symfony/property-access": "^6.0 || ^7.0 || ^8.0", + "symfony/serializer": "^6.0 || ^7.0 || ^8.0", + "webmozart/assert": "^1.10 || ^2.0", "webmozart/glob": "^4.4" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8", "codeception/verify": "^3.1", "dg/bypass-finals": "^1.6", - "ergebnis/composer-normalize": "^2.42", + "ergebnis/composer-normalize": "^2.49", "ext-ds": "*", "ext-zend-opcache": "*", "jangregor/phpstan-prophecy": "^2.1.1", @@ -4880,11 +4881,11 @@ "php-ds/php-ds": "^1.5", "phpspec/prophecy-phpunit": "^2.2.0", "phpstan/extension-installer": "^1.3", - "phpstan/phpstan": "^2.1.8", - "phpstan/phpstan-phpunit": "^2.0.4", - "phpunit/phpunit": "^9.6.13", + "phpstan/phpstan": "^2.1.37", + "phpstan/phpstan-phpunit": "^2.0.12", + "phpunit/phpunit": "^9.6.34", "roave/security-advisories": "dev-master", - "squizlabs/php_codesniffer": "^3.9" + "squizlabs/php_codesniffer": "^3.13" }, "bin": [ "bin/composer-unused" @@ -4933,7 +4934,7 @@ "type": "other" } ], - "time": "2025-09-22T07:07:50+00:00" + "time": "2026-01-30T05:52:24+00:00" }, { "name": "maglnet/composer-require-checker", @@ -5484,11 +5485,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.37", + "version": "2.1.39", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/28cd424c5ea984128c95cfa7ea658808e8954e49", - "reference": "28cd424c5ea984128c95cfa7ea658808e8954e49", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c6f73a2af4cbcd99c931d0fb8f08548cc0fa8224", + "reference": "c6f73a2af4cbcd99c931d0fb8f08548cc0fa8224", "shasum": "" }, "require": { @@ -5533,7 +5534,7 @@ "type": "github" } ], - "time": "2026-01-24T08:21:55+00:00" + "time": "2026-02-11T14:48:56+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -5586,16 +5587,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "2.0.12", + "version": "2.0.16", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "e4c5a22bf43d3d2bd5a780ad261a622ff62c49a4" + "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/e4c5a22bf43d3d2bd5a780ad261a622ff62c49a4", - "reference": "e4c5a22bf43d3d2bd5a780ad261a622ff62c49a4", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/6ab598e1bc106e6827fd346ae4a12b4a5d634c32", + "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32", "shasum": "" }, "require": { @@ -5631,24 +5632,27 @@ "MIT" ], "description": "PHPUnit extensions and rules for PHPStan", + "keywords": [ + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.12" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.16" }, - "time": "2026-01-22T13:40:00+00:00" + "time": "2026-02-14T09:05:21+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "12.5.2", + "version": "12.5.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b" + "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4a9739b51cbcb355f6e95659612f92e282a7077b", - "reference": "4a9739b51cbcb355f6e95659612f92e282a7077b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b015312f28dd75b75d3422ca37dff2cd1a565e8d", + "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d", "shasum": "" }, "require": { @@ -5704,7 +5708,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.3" }, "funding": [ { @@ -5724,20 +5728,20 @@ "type": "tidelift" } ], - "time": "2025-12-24T07:03:04+00:00" + "time": "2026-02-06T06:01:44+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "6.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782" + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/961bc913d42fe24a257bfff826a5068079ac7782", - "reference": "961bc913d42fe24a257bfff826a5068079ac7782", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", + "reference": "3d1cd096ef6bea4bf2762ba586e35dbd317cbfd5", "shasum": "" }, "require": { @@ -5777,15 +5781,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2025-02-07T04:58:37+00:00" + "time": "2026-02-02T14:04:18+00:00" }, { "name": "phpunit/php-invoker", @@ -5973,16 +5989,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.8", + "version": "12.5.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889" + "reference": "9b518cb40f9474572c9f0178e96ff3dc1cf02bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/37ddb96c14bfee10304825edbb7e66d341ec6889", - "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9b518cb40f9474572c9f0178e96ff3dc1cf02bf1", + "reference": "9b518cb40f9474572c9f0178e96ff3dc1cf02bf1", "shasum": "" }, "require": { @@ -5996,8 +6012,8 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.5.2", - "phpunit/php-file-iterator": "^6.0.0", + "phpunit/php-code-coverage": "^12.5.3", + "phpunit/php-file-iterator": "^6.0.1", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", "phpunit/php-timer": "^8.0.0", @@ -6008,6 +6024,7 @@ "sebastian/exporter": "^7.0.2", "sebastian/global-state": "^8.0.2", "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", "sebastian/type": "^6.0.3", "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" @@ -6050,7 +6067,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.8" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.11" }, "funding": [ { @@ -6074,20 +6091,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T06:12:29+00:00" + "time": "2026-02-10T12:32:02+00:00" }, { "name": "predis/predis", - "version": "v3.3.0", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/predis/predis.git", - "reference": "153097374b39a2f737fe700ebcd725642526cdec" + "reference": "1183f5732e6b10efd33f64984a96726eaecb59aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/153097374b39a2f737fe700ebcd725642526cdec", - "reference": "153097374b39a2f737fe700ebcd725642526cdec", + "url": "https://api.github.com/repos/predis/predis/zipball/1183f5732e6b10efd33f64984a96726eaecb59aa", + "reference": "1183f5732e6b10efd33f64984a96726eaecb59aa", "shasum": "" }, "require": { @@ -6129,7 +6146,7 @@ ], "support": { "issues": "https://github.com/predis/predis/issues", - "source": "https://github.com/predis/predis/tree/v3.3.0" + "source": "https://github.com/predis/predis/tree/v3.4.0" }, "funding": [ { @@ -6137,7 +6154,7 @@ "type": "github" } ], - "time": "2025-11-24T17:48:50+00:00" + "time": "2026-02-11T17:30:28+00:00" }, { "name": "revolt/event-loop", @@ -7610,16 +7627,16 @@ }, { "name": "symfony/property-info", - "version": "v7.4.4", + "version": "v7.4.5", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "b5305f3bc5727d0395e9681237e870ed5a5d21ae" + "reference": "1c9d326bd69602561e2ea467a16c09b5972eee21" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/b5305f3bc5727d0395e9681237e870ed5a5d21ae", - "reference": "b5305f3bc5727d0395e9681237e870ed5a5d21ae", + "url": "https://api.github.com/repos/symfony/property-info/zipball/1c9d326bd69602561e2ea467a16c09b5972eee21", + "reference": "1c9d326bd69602561e2ea467a16c09b5972eee21", "shasum": "" }, "require": { @@ -7629,7 +7646,7 @@ "symfony/type-info": "~7.3.10|^7.4.4|^8.0.4" }, "conflict": { - "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/reflection-docblock": "<5.2|>=6", "phpdocumentor/type-resolver": "<1.5.1", "symfony/cache": "<6.4", "symfony/dependency-injection": "<6.4", @@ -7676,7 +7693,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.4.4" + "source": "https://github.com/symfony/property-info/tree/v7.4.5" }, "funding": [ { @@ -7696,20 +7713,20 @@ "type": "tidelift" } ], - "time": "2026-01-23T10:51:15+00:00" + "time": "2026-01-27T16:16:02+00:00" }, { "name": "symfony/serializer", - "version": "v7.4.4", + "version": "v7.4.5", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "3b9a5d5c941a2a6e2a7dbe0e63fc3161888a5cd4" + "reference": "480cd1237c98ab1219c20945b92c9d4480a44f47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/3b9a5d5c941a2a6e2a7dbe0e63fc3161888a5cd4", - "reference": "3b9a5d5c941a2a6e2a7dbe0e63fc3161888a5cd4", + "url": "https://api.github.com/repos/symfony/serializer/zipball/480cd1237c98ab1219c20945b92c9d4480a44f47", + "reference": "480cd1237c98ab1219c20945b92c9d4480a44f47", "shasum": "" }, "require": { @@ -7719,8 +7736,8 @@ "symfony/polyfill-php84": "^1.30" }, "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", + "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/type-resolver": "<1.5.1", "symfony/dependency-injection": "<6.4", "symfony/property-access": "<6.4", "symfony/property-info": "<6.4", @@ -7729,7 +7746,7 @@ "symfony/yaml": "<6.4" }, "require-dev": { - "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "phpdocumentor/reflection-docblock": "^5.2", "phpstan/phpdoc-parser": "^1.0|^2.0", "seld/jsonlint": "^1.10", "symfony/cache": "^6.4|^7.0|^8.0", @@ -7779,7 +7796,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.4.4" + "source": "https://github.com/symfony/serializer/tree/v7.4.5" }, "funding": [ { @@ -7799,7 +7816,7 @@ "type": "tidelift" } ], - "time": "2026-01-23T10:51:15+00:00" + "time": "2026-01-27T08:59:58+00:00" }, { "name": "symfony/translation", diff --git a/modules/saml/src/Auth/Source/SP.php b/modules/saml/src/Auth/Source/SP.php index b6593656fb..485f68653e 100644 --- a/modules/saml/src/Auth/Source/SP.php +++ b/modules/saml/src/Auth/Source/SP.php @@ -510,7 +510,7 @@ private function startSSO2(Configuration $idpMetadata, array $state): void } if ($accr !== null) { - $comp = AuthnContextComparisonTypeEnum::Exact; + $comp = AuthnContextComparisonTypeEnum::Exact->value; if ($idpMetadata->getOptionalString('AuthnContextComparison', null) !== null) { $comp = $idpMetadata->getString('AuthnContextComparison'); } elseif ( diff --git a/tests/modules/core/src/Auth/Process/CardinalitySingleTest.php b/tests/modules/core/src/Auth/Process/CardinalitySingleTest.php index b0da5d3f37..432114e9ac 100644 --- a/tests/modules/core/src/Auth/Process/CardinalitySingleTest.php +++ b/tests/modules/core/src/Auth/Process/CardinalitySingleTest.php @@ -47,7 +47,7 @@ private function processFilter(array $config, array $request): array protected function setUp(): void { Configuration::loadFromArray([], '[ARRAY]', 'simplesaml'); - $this->httpUtils = $this->createStub(Utils\HTTP::class); + $this->httpUtils = $this->getMockBuilder(Utils\HTTP::class)->getMock(); } @@ -154,7 +154,6 @@ public function testFlattenUnchanged(): void /** * Test abort */ - #[DoesNotPerformAssertions] public function testAbort(): void { $config = [ diff --git a/tests/modules/core/src/Auth/Process/CardinalityTest.php b/tests/modules/core/src/Auth/Process/CardinalityTest.php index 86eda1a26f..185c4b16cb 100644 --- a/tests/modules/core/src/Auth/Process/CardinalityTest.php +++ b/tests/modules/core/src/Auth/Process/CardinalityTest.php @@ -48,7 +48,7 @@ private function processFilter(array $config, array $request): array protected function setUp(): void { Configuration::loadFromArray([], '[ARRAY]', 'simplesaml'); - $this->httpUtils = $this->createStub(Utils\HTTP::class); + $this->httpUtils = $this->getMockBuilder(Utils\HTTP::class)->getMock(); } @@ -115,7 +115,6 @@ public function testMaxMin(): void /** * Test maximum is out of bounds results in redirect */ - #[DoesNotPerformAssertions] public function testMaxOutOfBounds(): void { $config = [ @@ -138,7 +137,6 @@ public function testMaxOutOfBounds(): void /** * Test minimum is out of bounds results in redirect */ - #[DoesNotPerformAssertions] public function testMinOutOfBounds(): void { $config = [ @@ -161,7 +159,6 @@ public function testMinOutOfBounds(): void /** * Test missing attribute results in redirect */ - #[DoesNotPerformAssertions] public function testMissingAttribute(): void { $config = [ diff --git a/tests/modules/core/src/Auth/UserPassBaseTest.php b/tests/modules/core/src/Auth/UserPassBaseTest.php index d5e398a657..2d13591e53 100644 --- a/tests/modules/core/src/Auth/UserPassBaseTest.php +++ b/tests/modules/core/src/Auth/UserPassBaseTest.php @@ -31,12 +31,12 @@ public function testAuthenticateECPCallsLoginAndSetsAttributes(): void $stub = $this->getMockBuilder(UserPassBase::class) ->disableOriginalConstructor() ->onlyMethods(['login']) - ->getMockForAbstractClass(); + ->getMock(); $stub->expects($this->once()) ->method('login') ->with($username, $password) - ->will($this->returnValue($attributes)); + ->willReturn($attributes); /** @var \SimpleSAML\Module\core\Auth\UserPassBase $stub */ $stub->authenticate($state); @@ -61,7 +61,8 @@ public function testAuthenticateECPMissingUsername(): void $stub = $this->getMockBuilder(UserPassBase::class) ->disableOriginalConstructor() - ->getMockForAbstractClass(); + ->onlyMethods(['login']) + ->getMock(); /** @var \SimpleSAML\Module\core\Auth\UserPassBase $stub */ $stub->authenticate($state); @@ -84,7 +85,8 @@ public function testAuthenticateECPMissingPassword(): void $stub = $this->getMockBuilder(UserPassBase::class) ->disableOriginalConstructor() - ->getMockForAbstractClass(); + ->onlyMethods(['login']) + ->getMock(); /** @var \SimpleSAML\Module\core\Auth\UserPassBase $stub */ $stub->authenticate($state); @@ -113,7 +115,7 @@ public function testAuthenticateECPCallsLoginWithForcedUsername(): void $stub->expects($this->once()) ->method('login') ->with($forcedUsername, $password) - ->will($this->returnValue($attributes)); + ->willReturn($attributes); /** @var \SimpleSAML\Module\core\Auth\UserPassBase $stub */ $stub->setForcedUsername($forcedUsername); From 5f1980cb6563d7d3a83d206816559f27aa246d9e Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 21 Feb 2026 00:43:17 +0100 Subject: [PATCH 439/532] Fix: Bump minimum PHP-version --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index b88a8ab67d..a2c4f13bc1 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -239,7 +239,7 @@ jobs: # https://github.com/shivammathur/setup-php uses: shivammathur/setup-php@v2 with: - php-version: '8.2' + php-version: '8.3' extensions: mbstring, soap, xml tools: composer:v2 coverage: none From 2d865140e4a723b6090f88f8b90fd8d950bb9003 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 21 Feb 2026 00:44:05 +0100 Subject: [PATCH 440/532] Fix CI --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index a2c4f13bc1..192745414f 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -195,7 +195,7 @@ jobs: run: composer validate - name: Install Composer dependencies - run: composer install --no-progress --prefer-dist --optimize-autoloader \ + run: composer install --no-progress --prefer-dist --optimize-autoloader\ --ignore-platform-req=maglnet/composer-require-checker - name: PHP Code Sniffer From 3af2fd0433ab17449b110321b00f4ace187f1d27 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 21 Feb 2026 09:11:26 +0100 Subject: [PATCH 441/532] Fix QA tests --- .github/workflows/php.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 192745414f..5b9ff4472a 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -195,8 +195,11 @@ jobs: run: composer validate - name: Install Composer dependencies - run: composer install --no-progress --prefer-dist --optimize-autoloader\ - --ignore-platform-req=maglnet/composer-require-checker + run: | + composer install \ + --no-progress \ + --prefer-dist --optimize-autoloader \ + --ignore-platform-req=maglnet/composer-require-checker - name: PHP Code Sniffer run: vendor/bin/phpcs From 829a42e5a3cfc4fead02f51f0235407fccece391 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 21 Feb 2026 23:18:47 +0100 Subject: [PATCH 442/532] Bump dependencies --- composer.json | 14 ++-- composer.lock | 211 +++++++++++++++++++++++++------------------------- 2 files changed, 113 insertions(+), 112 deletions(-) diff --git a/composer.json b/composer.json index 9bac93022b..a62c95f7eb 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,7 @@ "files": ["tests/_autoload_modules.php"] }, "require": { - "php": "^8.2", + "php": "^8.3", "ext-date": "*", "ext-dom": "*", "ext-hash": "*", @@ -62,13 +62,13 @@ "phpmailer/phpmailer": "~6.10", "psr/event-dispatcher": "~1.0", "psr/log": "~3.0", - "simplesamlphp/assert": "~1.9", - "simplesamlphp/composer-module-installer": "~1.6", - "simplesamlphp/saml2": "~6.0", - "simplesamlphp/saml2-legacy": "~4.19", + "simplesamlphp/assert": "~1.9 || ~2.0", + "simplesamlphp/composer-module-installer": "~1.7", + "simplesamlphp/saml2": "~6.1", + "simplesamlphp/saml2-legacy": "~4.20", "simplesamlphp/simplesamlphp-assets-base": "~2.5.0", - "simplesamlphp/xml-common": "~2.4", - "simplesamlphp/xml-security": "~2.0", + "simplesamlphp/xml-common": "~2.7", + "simplesamlphp/xml-security": "~2.3", "symfony/cache": "~7.4", "symfony/config": "~7.4", "symfony/console": "~7.4", diff --git a/composer.lock b/composer.lock index c420614c4a..210a7b3967 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9243b3e0c34a24cc63ef0ca656363928", + "content-hash": "b1ebb044acd8f304370624c7df7796b3", "packages": [ { "name": "gettext/gettext", @@ -950,16 +950,16 @@ }, { "name": "simplesamlphp/assert", - "version": "v1.9.1", + "version": "v2.0.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/assert.git", - "reference": "d0e7b9c12e4f613c6f32e1242cc08838cdeb39d3" + "reference": "773e87980de4d0977f4b4c292bb0b5d8247813de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/d0e7b9c12e4f613c6f32e1242cc08838cdeb39d3", - "reference": "d0e7b9c12e4f613c6f32e1242cc08838cdeb39d3", + "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/773e87980de4d0977f4b4c292bb0b5d8247813de", + "reference": "773e87980de4d0977f4b4c292bb0b5d8247813de", "shasum": "" }, "require": { @@ -967,13 +967,13 @@ "ext-filter": "*", "ext-pcre": "*", "ext-spl": "*", - "guzzlehttp/psr7": "~2.8.0", - "php": "^8.2", - "webmozart/assert": "~1.12.0" + "guzzlehttp/psr7": "~2.8", + "php": "^8.3", + "webmozart/assert": "~2.1" }, "require-dev": { "ext-intl": "*", - "simplesamlphp/simplesamlphp-test-framework": "~1.10.2" + "simplesamlphp/simplesamlphp-test-framework": "~1.11" }, "type": "library", "extra": { @@ -1003,33 +1003,33 @@ "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments", "support": { "issues": "https://github.com/simplesamlphp/assert/issues", - "source": "https://github.com/simplesamlphp/assert/tree/v1.9.1" + "source": "https://github.com/simplesamlphp/assert/tree/v2.0.0" }, - "time": "2025-10-20T22:29:33+00:00" + "time": "2026-02-03T14:33:49+00:00" }, { "name": "simplesamlphp/composer-module-installer", - "version": "v1.6.0", + "version": "v1.7.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/composer-module-installer.git", - "reference": "9543c32a0711fb63b637fe75fc08f0309d1c0b32" + "reference": "7560ebd48e74001329a0c2ba44cc467c2e823368" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/composer-module-installer/zipball/9543c32a0711fb63b637fe75fc08f0309d1c0b32", - "reference": "9543c32a0711fb63b637fe75fc08f0309d1c0b32", + "url": "https://api.github.com/repos/simplesamlphp/composer-module-installer/zipball/7560ebd48e74001329a0c2ba44cc467c2e823368", + "reference": "7560ebd48e74001329a0c2ba44cc467c2e823368", "shasum": "" }, "require": { - "composer-plugin-api": "~2.9.0", + "composer-plugin-api": "~2.9", "ext-mbstring": "*", - "php": "^8.2", - "simplesamlphp/assert": "~1.9.1" + "php": "^8.3", + "simplesamlphp/assert": "~2.0" }, "require-dev": { - "composer/composer": "~2.8.12", - "simplesamlphp/simplesamlphp-test-framework": "~1.10.3" + "composer/composer": "~2.9", + "simplesamlphp/simplesamlphp-test-framework": "~1.11" }, "type": "composer-plugin", "extra": { @@ -1047,31 +1047,31 @@ "description": "A Composer plugin that allows installing SimpleSAMLphp modules through Composer.", "support": { "issues": "https://github.com/simplesamlphp/composer-module-installer/issues", - "source": "https://github.com/simplesamlphp/composer-module-installer/tree/v1.6.0" + "source": "https://github.com/simplesamlphp/composer-module-installer/tree/v1.7.0" }, - "time": "2025-11-13T11:11:03+00:00" + "time": "2026-02-19T23:36:00+00:00" }, { "name": "simplesamlphp/composer-xmlprovider-installer", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/composer-xmlprovider-installer.git", - "reference": "294025c97062d96fe0b0c466a0a189f1a4010628" + "reference": "80a2d6a30c730a5fd90358f4875b94140114c643" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/composer-xmlprovider-installer/zipball/294025c97062d96fe0b0c466a0a189f1a4010628", - "reference": "294025c97062d96fe0b0c466a0a189f1a4010628", + "url": "https://api.github.com/repos/simplesamlphp/composer-xmlprovider-installer/zipball/80a2d6a30c730a5fd90358f4875b94140114c643", + "reference": "80a2d6a30c730a5fd90358f4875b94140114c643", "shasum": "" }, "require": { - "composer-plugin-api": "~2.9.0", - "php": "^8.2" + "composer-plugin-api": "~2.9", + "php": "^8.3" }, "require-dev": { - "composer/composer": "~2.9.0", - "simplesamlphp/simplesamlphp-test-framework": "~1.10.3" + "composer/composer": "~2.9", + "simplesamlphp/simplesamlphp-test-framework": "~1.11" }, "type": "composer-plugin", "extra": { @@ -1089,22 +1089,22 @@ "description": "A composer plugin that will auto-generate a classmap with all classes that implement SerializableElementInterface.", "support": { "issues": "https://github.com/simplesamlphp/composer-xmlprovider-installer/issues", - "source": "https://github.com/simplesamlphp/composer-xmlprovider-installer/tree/v1.2.0" + "source": "https://github.com/simplesamlphp/composer-xmlprovider-installer/tree/v1.3.0" }, - "time": "2025-11-13T11:11:51+00:00" + "time": "2026-02-19T23:34:51+00:00" }, { "name": "simplesamlphp/saml2", - "version": "v6.0.1", + "version": "v6.1.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "c15bde28f1c32f8a54f177fcd65c6580238817c9" + "reference": "489e704f2fda575373aa8b8e8b179703ca9f16e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/c15bde28f1c32f8a54f177fcd65c6580238817c9", - "reference": "c15bde28f1c32f8a54f177fcd65c6580238817c9", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/489e704f2fda575373aa8b8e8b179703ca9f16e5", + "reference": "489e704f2fda575373aa8b8e8b179703ca9f16e5", "shasum": "" }, "require": { @@ -1115,20 +1115,20 @@ "ext-pcre": "*", "ext-zlib": "*", "nyholm/psr7": "~1.8", - "php": "^8.2", + "php": "^8.3", "psr/clock": "~1.0", "psr/http-message": "~2.0", - "psr/log": "~2.3 || ~3.0", - "simplesamlphp/assert": "~1.9", - "simplesamlphp/xml-common": "~2.4", - "simplesamlphp/xml-security": "~2.0", - "simplesamlphp/xml-soap": "~2.0" + "psr/log": "~3.0", + "simplesamlphp/assert": "~2.0", + "simplesamlphp/xml-common": "~2.7", + "simplesamlphp/xml-security": "~2.3", + "simplesamlphp/xml-soap": "~2.3" }, "require-dev": { "beste/clock": "~3.0", "ext-intl": "*", "mockery/mockery": "~1.6", - "simplesamlphp/simplesamlphp-test-framework": "~1.10" + "simplesamlphp/simplesamlphp-test-framework": "~1.11" }, "suggest": { "ext-soap": "*" @@ -1136,7 +1136,7 @@ "type": "simplesamlphp-xmlprovider", "extra": { "branch-alias": { - "dev-master": "v5.1.x-dev" + "dev-master": "v6.1.x-dev" } }, "autoload": { @@ -1165,42 +1165,39 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v6.0.1" + "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.0" }, - "time": "2025-12-06T11:49:43+00:00" + "time": "2026-02-19T23:24:33+00:00" }, { "name": "simplesamlphp/saml2-legacy", - "version": "v4.19.1", + "version": "v4.20.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2-legacy.git", - "reference": "a9812c7fc0bb7cee9ce001e8cc94570c37acdfb2" + "reference": "e886d51e9f942793e00d1800b4768cf511db5c03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/a9812c7fc0bb7cee9ce001e8cc94570c37acdfb2", - "reference": "a9812c7fc0bb7cee9ce001e8cc94570c37acdfb2", + "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/e886d51e9f942793e00d1800b4768cf511db5c03", + "reference": "e886d51e9f942793e00d1800b4768cf511db5c03", "shasum": "" }, "require": { "ext-dom": "*", "ext-openssl": "*", "ext-zlib": "*", - "php": ">=7.1 || ^8.0", - "psr/log": "~1.1 || ^2.0 || ^3.0", + "php": "^8.3", + "psr/log": "^2.0 || ^3.0", "robrichards/xmlseclibs": "^3.1.4", - "webmozart/assert": "^1.9" + "webmozart/assert": "^2.0" }, "conflict": { "robrichards/xmlseclibs": "3.1.2" }, "require-dev": { - "mockery/mockery": "^1.3", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "sebastian/phpcpd": "~4.1 || ^5.0 || ^6.0", - "simplesamlphp/simplesamlphp-test-framework": "~0.1.0", - "squizlabs/php_codesniffer": "~3.5" + "mockery/mockery": "~1.6", + "simplesamlphp/simplesamlphp-test-framework": "~1.11" }, "type": "library", "extra": { @@ -1225,27 +1222,27 @@ ], "description": "SAML2 PHP library from SimpleSAMLphp", "support": { - "source": "https://github.com/simplesamlphp/saml2-legacy/tree/v4.19.1" + "source": "https://github.com/simplesamlphp/saml2-legacy/tree/v4.20.0" }, - "time": "2025-12-08T12:05:03+00:00" + "time": "2026-02-21T21:49:45+00:00" }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.5.11", + "version": "v2.5.12", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "23fb1fd3911077a3bef26cc2d2cb39594dd83acb" + "reference": "16399d5da8ce8c6c99664265a180c7f9fe3941e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/23fb1fd3911077a3bef26cc2d2cb39594dd83acb", - "reference": "23fb1fd3911077a3bef26cc2d2cb39594dd83acb", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/16399d5da8ce8c6c99664265a180c7f9fe3941e1", + "reference": "16399d5da8ce8c6c99664265a180c7f9fe3941e1", "shasum": "" }, "require": { - "php": "^8.2", - "simplesamlphp/composer-module-installer": "~1.6.0" + "php": "^8.3", + "simplesamlphp/composer-module-installer": "~1.7" }, "type": "simplesamlphp-module", "notification-url": "https://packagist.org/downloads/", @@ -1261,22 +1258,22 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.11" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.12" }, - "time": "2026-02-15T02:01:47+00:00" + "time": "2026-02-20T21:18:30+00:00" }, { "name": "simplesamlphp/xml-common", - "version": "v2.6.0", + "version": "v2.7.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "e43fd4bea99c1092fcd575af96595c1feabde853" + "reference": "c98db082c3168aeabd8f664984c9c5152deb3519" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/e43fd4bea99c1092fcd575af96595c1feabde853", - "reference": "e43fd4bea99c1092fcd575af96595c1feabde853", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/c98db082c3168aeabd8f664984c9c5152deb3519", + "reference": "c98db082c3168aeabd8f664984c9c5152deb3519", "shasum": "" }, "require": { @@ -1290,7 +1287,7 @@ "guzzlehttp/psr7": "~2.8", "php": "^8.3", "psr/clock": "~1.0", - "simplesamlphp/assert": "~1.9", + "simplesamlphp/assert": "~2.0", "simplesamlphp/composer-xmlprovider-installer": "~1.2" }, "require-dev": { @@ -1330,20 +1327,20 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2026-01-21T22:57:54+00:00" + "time": "2026-02-16T21:02:41+00:00" }, { "name": "simplesamlphp/xml-security", - "version": "v2.2.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-security.git", - "reference": "c3a2b89855764f515089f92357e196ae6e4d6801" + "reference": "161123dcdce0a31fdc34c582bf9c73aadde829ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/c3a2b89855764f515089f92357e196ae6e4d6801", - "reference": "c3a2b89855764f515089f92357e196ae6e4d6801", + "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/161123dcdce0a31fdc34c582bf9c73aadde829ed", + "reference": "161123dcdce0a31fdc34c582bf9c73aadde829ed", "shasum": "" }, "require": { @@ -1354,8 +1351,8 @@ "ext-pcre": "*", "ext-spl": "*", "php": "^8.3", - "simplesamlphp/assert": "~1.9", - "simplesamlphp/xml-common": "~2.5" + "simplesamlphp/assert": "~2.0", + "simplesamlphp/xml-common": "~2.7" }, "require-dev": { "simplesamlphp/simplesamlphp-test-framework": "~1.11" @@ -1392,30 +1389,30 @@ ], "support": { "issues": "https://github.com/simplesamlphp/xml-security/issues", - "source": "https://github.com/simplesamlphp/xml-security/tree/v2.2.0" + "source": "https://github.com/simplesamlphp/xml-security/tree/v2.3.0" }, - "time": "2026-01-26T22:00:19+00:00" + "time": "2026-02-17T20:20:13+00:00" }, { "name": "simplesamlphp/xml-soap", - "version": "v2.2.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-soap.git", - "reference": "ffd6ff05c062548efe22cedf6376ee67a5da69d9" + "reference": "014a0846d3b3a1a29f8d39c5bf75a827de216501" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-soap/zipball/ffd6ff05c062548efe22cedf6376ee67a5da69d9", - "reference": "ffd6ff05c062548efe22cedf6376ee67a5da69d9", + "url": "https://api.github.com/repos/simplesamlphp/xml-soap/zipball/014a0846d3b3a1a29f8d39c5bf75a827de216501", + "reference": "014a0846d3b3a1a29f8d39c5bf75a827de216501", "shasum": "" }, "require": { "ext-dom": "*", "ext-pcre": "*", "php": "^8.3", - "simplesamlphp/assert": "~1.9", - "simplesamlphp/xml-common": "~2.5" + "simplesamlphp/assert": "~2.0", + "simplesamlphp/xml-common": "~2.7" }, "require-dev": { "simplesamlphp/simplesamlphp-test-framework": "~1.11" @@ -1445,9 +1442,9 @@ "description": "SimpleSAMLphp library for XML SOAP", "support": { "issues": "https://github.com/simplesamlphp/xml-soap/issues", - "source": "https://github.com/simplesamlphp/xml-soap/tree/v2.2.0" + "source": "https://github.com/simplesamlphp/xml-soap/tree/v2.3.0" }, - "time": "2026-01-21T23:26:53+00:00" + "time": "2026-02-17T20:22:50+00:00" }, { "name": "symfony/cache", @@ -4283,23 +4280,23 @@ }, { "name": "webmozart/assert", - "version": "1.12.1", + "version": "2.1.5", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68" + "reference": "79155f94852fa27e2f73b459f6503f5e87e2c188" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68", - "reference": "9be6926d8b485f55b9229203f962b51ed377ba68", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/79155f94852fa27e2f73b459f6503f5e87e2c188", + "reference": "79155f94852fa27e2f73b459f6503f5e87e2c188", "shasum": "" }, "require": { "ext-ctype": "*", "ext-date": "*", "ext-filter": "*", - "php": "^7.2 || ^8.0" + "php": "^8.2" }, "suggest": { "ext-intl": "", @@ -4309,7 +4306,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10-dev" + "dev-feature/2-0": "2.0-dev" } }, "autoload": { @@ -4325,6 +4322,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" + }, + { + "name": "Woody Gilk", + "email": "woody.gilk@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", @@ -4335,9 +4336,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.12.1" + "source": "https://github.com/webmozarts/assert/tree/2.1.5" }, - "time": "2025-10-29T15:56:20+00:00" + "time": "2026-02-18T14:09:36+00:00" } ], "packages-dev": [ @@ -5989,16 +5990,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.11", + "version": "12.5.14", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9b518cb40f9474572c9f0178e96ff3dc1cf02bf1" + "reference": "47283cfd98d553edcb1353591f4e255dc1bb61f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9b518cb40f9474572c9f0178e96ff3dc1cf02bf1", - "reference": "9b518cb40f9474572c9f0178e96ff3dc1cf02bf1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/47283cfd98d553edcb1353591f4e255dc1bb61f0", + "reference": "47283cfd98d553edcb1353591f4e255dc1bb61f0", "shasum": "" }, "require": { @@ -6067,7 +6068,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.11" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.14" }, "funding": [ { @@ -6091,7 +6092,7 @@ "type": "tidelift" } ], - "time": "2026-02-10T12:32:02+00:00" + "time": "2026-02-18T12:38:40+00:00" }, { "name": "predis/predis", @@ -8107,7 +8108,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.2", + "php": "^8.3", "ext-date": "*", "ext-dom": "*", "ext-hash": "*", From 71e785d2939d96dd18e8e8390720149814acf91d Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Thu, 26 Feb 2026 09:40:20 +1000 Subject: [PATCH 443/532] PHP 8.3 is the min version now (#2599) See composer for requirement for example --- docs/simplesamlphp-upgrade-notes-2.5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/simplesamlphp-upgrade-notes-2.5.md b/docs/simplesamlphp-upgrade-notes-2.5.md index 5fa61207d3..9576460127 100644 --- a/docs/simplesamlphp-upgrade-notes-2.5.md +++ b/docs/simplesamlphp-upgrade-notes-2.5.md @@ -5,5 +5,5 @@ The following changes are relevant for installers and/or developers. ## Software requirements -- The minimum PHP version required is now PHP 8.2. +- The minimum PHP version required is now PHP 8.3. - Symfony was upgraded to 7.4 (LTS). From 4c5695ebf0005978f9ccc783dbbebd6cb357ddc3 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Thu, 26 Feb 2026 09:51:45 +1000 Subject: [PATCH 444/532] docs: 2.5 include some information about symfony cache (#2600) I have also included some of the likely error messages to help search engines possibly hook to the update notes page if folks search for those issues. --- docs/simplesamlphp-upgrade-notes-2.5.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/simplesamlphp-upgrade-notes-2.5.md b/docs/simplesamlphp-upgrade-notes-2.5.md index 9576460127..6e65c6a7e4 100644 --- a/docs/simplesamlphp-upgrade-notes-2.5.md +++ b/docs/simplesamlphp-upgrade-notes-2.5.md @@ -7,3 +7,21 @@ The following changes are relevant for installers and/or developers. - The minimum PHP version required is now PHP 8.3. - Symfony was upgraded to 7.4 (LTS). + +## General Upgrade Advice + +When updating SimpleSAMLphp you might like to run the following to +remove any cached objects that might have older code signatures to the +new SimpleSAMLphp version. If you encounter a permissions error +running the clear-symfony-cache shown below please see the [the +SimpleSAMLphp installation instructions](simplesamlphp-install) for +information about how to update the filesystem permissions. + +```sh +composer clear-symfony-cache +``` + +The above command is particularly useful if you see a message after +your update about "has required constructor arguments and does not +exist in the container" or "Did you forget to define the controller as +a service?" as these error messages might indicate a stale cache. From 5327237954b58d940201262b31b1bfd0d3ba72ab Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 1 Mar 2026 00:34:30 +0100 Subject: [PATCH 445/532] Cleanup --- .../admin/src/Controller/FederationTest.php | 15 +++++---------- .../src/Auth/Process/CardinalitySingleTest.php | 1 - .../core/src/Auth/Process/CardinalityTest.php | 1 - tests/modules/cron/src/Controller/CronTest.php | 6 ++---- tests/modules/saml/src/Auth/Source/SPTest.php | 15 +++++---------- .../saml/src/Controller/MetadataTest.php | 9 +++------ .../src/Controller/ServiceProviderTest.php | 3 +-- tests/modules/saml/src/IdP/SAML2Test.php | 9 +++------ tests/src/SimpleSAML/Error/ErrorCodesTest.php | 4 ++-- tests/src/SimpleSAML/Error/ErrorTest.php | 2 +- tests/src/SimpleSAML/ModuleTest.php | 18 ++++++++++-------- tests/src/SimpleSAML/Utils/SystemTest.php | 4 ++-- tests/src/SimpleSAML/XHTML/TemplateTest.php | 2 +- tests/src/SimpleSAML/XML/ParserTest.php | 2 +- tests/src/SimpleSAML/XML/SignerTest.php | 2 +- 15 files changed, 37 insertions(+), 56 deletions(-) diff --git a/tests/modules/admin/src/Controller/FederationTest.php b/tests/modules/admin/src/Controller/FederationTest.php index 070ef7df01..163e19dc85 100644 --- a/tests/modules/admin/src/Controller/FederationTest.php +++ b/tests/modules/admin/src/Controller/FederationTest.php @@ -23,20 +23,15 @@ #[CoversClass(Controller\Federation::class)] class FederationTest extends TestCase { - /** @var string */ - private const SECURITY = 'vendor/simplesamlphp/xml-security/resources'; + private const string SECURITY = 'vendor/simplesamlphp/xml-security/resources'; - /** @var string */ - private const FRAMEWORK = 'vendor/simplesamlphp/simplesamlphp-test-framework'; + private const string FRAMEWORK = 'vendor/simplesamlphp/simplesamlphp-test-framework'; - /** @var string */ - private const LIBRARY = 'vendor/simplesamlphp/saml2/tests/resources'; + private const string LIBRARY = 'vendor/simplesamlphp/saml2/tests/resources'; - /** @var string */ - public const CERT_KEY = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.key'; + public const string CERT_KEY = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.key'; - /** @var string */ - public const CERT_PUBLIC = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.crt'; + public const string CERT_PUBLIC = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.crt'; /** @var \SimpleSAML\Configuration */ diff --git a/tests/modules/core/src/Auth/Process/CardinalitySingleTest.php b/tests/modules/core/src/Auth/Process/CardinalitySingleTest.php index 432114e9ac..ac5b6678c6 100644 --- a/tests/modules/core/src/Auth/Process/CardinalitySingleTest.php +++ b/tests/modules/core/src/Auth/Process/CardinalitySingleTest.php @@ -4,7 +4,6 @@ namespace SimpleSAML\Test\Module\core\Auth\Process; -use PHPUnit\Framework\Attributes\DoesNotPerformAssertions; use PHPUnit\Framework\TestCase; use SimpleSAML\Configuration; use SimpleSAML\Module\core\Auth\Process\CardinalitySingle; diff --git a/tests/modules/core/src/Auth/Process/CardinalityTest.php b/tests/modules/core/src/Auth/Process/CardinalityTest.php index 185c4b16cb..f4f141bd7e 100644 --- a/tests/modules/core/src/Auth/Process/CardinalityTest.php +++ b/tests/modules/core/src/Auth/Process/CardinalityTest.php @@ -4,7 +4,6 @@ namespace SimpleSAML\Test\Module\core\Auth\Process; -use PHPUnit\Framework\Attributes\DoesNotPerformAssertions; use PHPUnit\Framework\TestCase; use SimpleSAML\Configuration; use SimpleSAML\Error\Exception as SspException; diff --git a/tests/modules/cron/src/Controller/CronTest.php b/tests/modules/cron/src/Controller/CronTest.php index 73d106346f..4ae0067a32 100644 --- a/tests/modules/cron/src/Controller/CronTest.php +++ b/tests/modules/cron/src/Controller/CronTest.php @@ -9,11 +9,11 @@ use PHPUnit\Framework\TestCase; use SimpleSAML\Configuration; use SimpleSAML\Error; +use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; use SimpleSAML\Module\cron\Controller; use SimpleSAML\Session; use SimpleSAML\Utils; use SimpleSAML\XHTML\Template; -use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; /** * Set of tests for the controllers in the "cron" module. @@ -77,7 +77,6 @@ public function requireAdmin(): void ); ModuleEventDispatcherFactory::testingRemakeInstance(); - } @@ -107,7 +106,6 @@ public function testInfo(): void */ public function testRunCorrectKey(): void { - $_SERVER['REQUEST_URI'] = '/module.php/cron/run/daily/verysecret'; $c = new Controller\Cron($this->config, $this->session); @@ -119,7 +117,7 @@ public function testRunCorrectKey(): void $this->assertFalse($response->data['mail_required']); $this->assertArrayHasKey('time', $response->data); $this->assertCount(1, $response->data['summary']); - + $this->assertEquals('Cron did run tag [daily] at ' . $response->data['time'], $response->data['summary']['cron info']); } diff --git a/tests/modules/saml/src/Auth/Source/SPTest.php b/tests/modules/saml/src/Auth/Source/SPTest.php index 01eccd0192..94230a2bfa 100644 --- a/tests/modules/saml/src/Auth/Source/SPTest.php +++ b/tests/modules/saml/src/Auth/Source/SPTest.php @@ -31,20 +31,15 @@ #[CoversClass(SP::class)] class SPTest extends ClearStateTestCase { - /** @var string */ - private const SECURITY = 'vendor/simplesamlphp/xml-security/resources'; + private const string SECURITY = 'vendor/simplesamlphp/xml-security/resources'; - /** @var string */ - public const CERT_KEY = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.key'; + public const string CERT_KEY = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.key'; - /** @var string */ - public const CERT_PUBLIC = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.crt'; + public const string CERT_PUBLIC = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.crt'; - /** @var string */ - public const CERT_OTHER_KEY = '../' . self::SECURITY . '/certificates/other.simplesamlphp.org.key'; + public const string CERT_OTHER_KEY = '../' . self::SECURITY . '/certificates/other.simplesamlphp.org.key'; - /** @var string */ - public const CERT_OTHER_PUBLIC = '../' . self::SECURITY . '/certificates/other.simplesamlphp.org.crt'; + public const string CERT_OTHER_PUBLIC = '../' . self::SECURITY . '/certificates/other.simplesamlphp.org.crt'; /** @var \SimpleSAML\Configuration|null $idpMetadata */ diff --git a/tests/modules/saml/src/Controller/MetadataTest.php b/tests/modules/saml/src/Controller/MetadataTest.php index 4337ad9a5b..8f8086eab0 100644 --- a/tests/modules/saml/src/Controller/MetadataTest.php +++ b/tests/modules/saml/src/Controller/MetadataTest.php @@ -41,14 +41,11 @@ protected function setUp(): void parent::setUp(); $this->mdh = new class () extends MetaDataStorageHandler { - /** @var string */ - private const XMLSEC = '../vendor/simplesamlphp/xml-security/resources'; + private const string XMLSEC = '../vendor/simplesamlphp/xml-security/resources'; - /** @var string */ - public const CERT_KEY = self::XMLSEC . '/certificates/selfsigned.simplesamlphp.org.key'; + public const string CERT_KEY = self::XMLSEC . '/certificates/selfsigned.simplesamlphp.org.key'; - /** @var string */ - public const CERT_PUBLIC = self::XMLSEC . '/certificates/selfsigned.simplesamlphp.org.crt'; + public const string CERT_PUBLIC = self::XMLSEC . '/certificates/selfsigned.simplesamlphp.org.crt'; /** @var array */ diff --git a/tests/modules/saml/src/Controller/ServiceProviderTest.php b/tests/modules/saml/src/Controller/ServiceProviderTest.php index 2cc8abcb86..551bfc35a9 100644 --- a/tests/modules/saml/src/Controller/ServiceProviderTest.php +++ b/tests/modules/saml/src/Controller/ServiceProviderTest.php @@ -47,8 +47,7 @@ class ServiceProviderTest extends TestCase protected Utils\HTTP $httpUtils; - /** @var string */ - public const RELAY_STATE = 'https://example.org'; + public const string RELAY_STATE = 'https://example.org'; /** diff --git a/tests/modules/saml/src/IdP/SAML2Test.php b/tests/modules/saml/src/IdP/SAML2Test.php index 9008cfcf04..484cfb1d81 100644 --- a/tests/modules/saml/src/IdP/SAML2Test.php +++ b/tests/modules/saml/src/IdP/SAML2Test.php @@ -19,14 +19,11 @@ #[CoversClass(SAML2::class)] class SAML2Test extends ClearStateTestCase { - /** @var string */ - private const SECURITY = 'vendor/simplesamlphp/xml-security/resources'; + private const string SECURITY = 'vendor/simplesamlphp/xml-security/resources'; - /** @var string */ - public const CERT_KEY = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.key'; + public const string CERT_KEY = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.key'; - /** @var string */ - public const CERT_PUBLIC = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.crt'; + public const string CERT_PUBLIC = '../' . self::SECURITY . '/certificates/selfsigned.simplesamlphp.org.crt'; /** diff --git a/tests/src/SimpleSAML/Error/ErrorCodesTest.php b/tests/src/SimpleSAML/Error/ErrorCodesTest.php index a44dd97646..c7bb122a8b 100644 --- a/tests/src/SimpleSAML/Error/ErrorCodesTest.php +++ b/tests/src/SimpleSAML/Error/ErrorCodesTest.php @@ -132,7 +132,7 @@ public function testCanStaticallyExtendWithCustomErrorCodes(): void { $customErrorCodes = new class extends ErrorCodes { - public const CUSTOMCODE = 'CUSTOMCODE'; + public const string CUSTOMCODE = 'CUSTOMCODE'; public static string $customTitle = 'customTitle'; @@ -199,7 +199,7 @@ public function testCanExtendWithCustomErrorCodes(): void { $customErrorCodes = new class extends ErrorCodes { - public const CUSTOMCODE = 'CUSTOMCODE'; + public const string CUSTOMCODE = 'CUSTOMCODE'; public static string $customTitle = 'customTitle'; diff --git a/tests/src/SimpleSAML/Error/ErrorTest.php b/tests/src/SimpleSAML/Error/ErrorTest.php index 15abd4354c..fc5cb0e0fb 100644 --- a/tests/src/SimpleSAML/Error/ErrorTest.php +++ b/tests/src/SimpleSAML/Error/ErrorTest.php @@ -126,7 +126,7 @@ public function getErrorCodes(): ErrorCodes { return new class extends ErrorCodes { - public const CUSTOMCODE = 'CUSTOMCODE'; + public const string CUSTOMCODE = 'CUSTOMCODE'; public function getCustomTitles(): array diff --git a/tests/src/SimpleSAML/ModuleTest.php b/tests/src/SimpleSAML/ModuleTest.php index 2c51e35f2e..02ff46c917 100644 --- a/tests/src/SimpleSAML/ModuleTest.php +++ b/tests/src/SimpleSAML/ModuleTest.php @@ -8,13 +8,12 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; use SimpleSAML\Configuration; -use SimpleSAML\Module; -use Symfony\Component\Filesystem\Path; - use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; +use SimpleSAML\Locale\Translate; +use SimpleSAML\Module; use SimpleSAML\Module\admin\Event\ConfigPageEvent; use SimpleSAML\XHTML\Template; -use SimpleSAML\Locale\Translate; +use Symfony\Component\Filesystem\Path; /** */ @@ -130,7 +129,10 @@ public function testGetModuleHooks(): void [ 'assets' => [ 'salt' => '1234567890'], 'module.enable' => ['saml' => true, 'admin' => true, 'cron' => true,], - ], '', 'simplesaml'); + ], + '', + 'simplesaml', + ); Configuration::setPreLoadedConfig($c); $t = new Template($c, 'admin:config.twig'); $t->data = [ @@ -150,9 +152,9 @@ public function testGetModuleHooks(): void $event = $eventDispatcher->dispatch(new ConfigPageEvent($t)); $t = $event->getTemplate(); $this->assertEquals( - \SimpleSAML\Locale\Translate::noop('Cron module information page'), - $t->data['links'][2]['text']); - + Translate::noop('Cron module information page'), + $t->data['links'][2]['text'], + ); } diff --git a/tests/src/SimpleSAML/Utils/SystemTest.php b/tests/src/SimpleSAML/Utils/SystemTest.php index 02dc0f0a82..d728f394f5 100644 --- a/tests/src/SimpleSAML/Utils/SystemTest.php +++ b/tests/src/SimpleSAML/Utils/SystemTest.php @@ -19,9 +19,9 @@ #[CoversClass(Utils\System::class)] class SystemTest extends TestCase { - private const ROOTDIRNAME = 'testdir'; + private const string ROOTDIRNAME = 'testdir'; - private const DEFAULTTEMPDIR = 'tempdir'; + private const string DEFAULTTEMPDIR = 'tempdir'; /** @var \org\bovigo\vfs\vfsStreamDirectory */ diff --git a/tests/src/SimpleSAML/XHTML/TemplateTest.php b/tests/src/SimpleSAML/XHTML/TemplateTest.php index 4396e4afb0..2bfebec83c 100644 --- a/tests/src/SimpleSAML/XHTML/TemplateTest.php +++ b/tests/src/SimpleSAML/XHTML/TemplateTest.php @@ -15,7 +15,7 @@ #[CoversClass(Template::class)] class TemplateTest extends TestCase { - private const TEMPLATE = 'sandbox.twig'; + private const string TEMPLATE = 'sandbox.twig'; public function testSetup(): void diff --git a/tests/src/SimpleSAML/XML/ParserTest.php b/tests/src/SimpleSAML/XML/ParserTest.php index 299d2ebf52..7a5f5c309a 100644 --- a/tests/src/SimpleSAML/XML/ParserTest.php +++ b/tests/src/SimpleSAML/XML/ParserTest.php @@ -20,7 +20,7 @@ #[CoversClass(Parser::class)] class ParserTest extends TestCase { - private const XMLDOC = <<< XML + private const string XMLDOC = <<< XML Hello, World! diff --git a/tests/src/SimpleSAML/XML/SignerTest.php b/tests/src/SimpleSAML/XML/SignerTest.php index 5ac8a83f27..d5eee37c50 100644 --- a/tests/src/SimpleSAML/XML/SignerTest.php +++ b/tests/src/SimpleSAML/XML/SignerTest.php @@ -50,7 +50,7 @@ class SignerTest extends SigningTestCase NOWDOC; - private const OTHER_CERTIFICATE = 'other_certificate.pem'; + private const string OTHER_CERTIFICATE = 'other_certificate.pem'; /** From 0df9b8441eda2c5365411c6ef908ee2b5fad67fc Mon Sep 17 00:00:00 2001 From: Nathan Robertson Date: Mon, 2 Mar 2026 19:02:29 +1100 Subject: [PATCH 446/532] phpcs fixes (#2605) * phpcs fixes for tests * Fix phpcs issues * More phpcs fixes --- modules/admin/src/Controller/Config.php | 10 +-- modules/admin/src/Controller/Federation.php | 3 +- modules/admin/src/Controller/Menu.php | 2 +- modules/admin/src/Event/AdminMenuEvent.php | 4 +- modules/admin/src/Event/ConfigPageEvent.php | 7 +- .../admin/src/Event/FederationPageEvent.php | 6 +- modules/admin/src/Event/SanityCheckEvent.php | 11 ++- .../Source/RequestedAuthnContextSelector.php | 6 +- .../core/src/Auth/Source/SourceIPSelector.php | 6 +- modules/core/src/Auth/UserPassBase.php | 4 +- modules/core/src/Auth/UserPassOrgBase.php | 6 +- modules/core/src/Controller/Exception.php | 7 +- modules/cron/src/Cron.php | 5 +- modules/cron/src/Event/CronEvent.php | 11 ++- .../src/Event/Listener/ConfigPageListener.php | 2 +- .../src/Event/Listener/CronEventListener.php | 2 +- .../exampleauth/src/Auth/Source/External.php | 2 +- .../exampleauth/src/Auth/Source/UserClick.php | 4 +- .../multiauth/src/Auth/Source/MultiAuth.php | 8 +- modules/saml/src/Auth/Process/PairwiseID.php | 2 +- .../saml/src/Auth/Process/ScopedIssuer.php | 4 +- modules/saml/src/Auth/Process/SubjectID.php | 11 +-- modules/saml/src/Auth/Source/SP.php | 2 +- .../Listener/SamlSanityCheckListener.php | 9 ++- modules/saml/src/IdP/SQLNameID.php | 6 +- src/SimpleSAML/Auth/ProcessingChain.php | 6 +- src/SimpleSAML/Auth/State.php | 18 ++--- src/SimpleSAML/Configuration.php | 8 +- src/SimpleSAML/Error/CannotSetCookie.php | 12 +-- src/SimpleSAML/Error/ErrorCodes.php | 76 +++++++++---------- src/SimpleSAML/Error/ExceptionHandler.php | 4 +- .../Event/Dispatcher/EventDispatcher.php | 7 +- .../ModuleEventDispatcherFactory.php | 5 +- .../Event/ExceptionHandlerEvent.php | 4 +- .../Event/Provider/ModuleListenerProvider.php | 7 +- src/SimpleSAML/Kernel.php | 2 +- src/SimpleSAML/Locale/Language.php | 4 +- src/SimpleSAML/Locale/Localization.php | 6 +- src/SimpleSAML/Logger.php | 28 +++---- .../MetaDataStorageHandlerSerialize.php | 4 +- src/SimpleSAML/Session.php | 2 +- src/SimpleSAML/Utils/Random.php | 2 +- src/SimpleSAML/Utils/System.php | 16 ++-- tests/SigningTestCase.php | 12 +-- .../modules/cron/src/Controller/CronTest.php | 6 +- .../saml/src/Controller/MetadataTest.php | 2 - .../SimpleSAML/Metadata/SAMLBuilderTest.php | 2 +- tests/src/SimpleSAML/ModuleTest.php | 2 - tests/src/SimpleSAML/Utils/CryptoTest.php | 4 +- tests/src/SimpleSAML/Utils/HTTPTest.php | 1 + tests/src/SimpleSAML/Utils/XMLTest.php | 2 +- 51 files changed, 193 insertions(+), 189 deletions(-) diff --git a/modules/admin/src/Controller/Config.php b/modules/admin/src/Controller/Config.php index 60a5f1ba46..e12237e487 100644 --- a/modules/admin/src/Controller/Config.php +++ b/modules/admin/src/Controller/Config.php @@ -37,9 +37,9 @@ */ class Config { - public const LATEST_VERSION_STATE_KEY = 'core:latest_simplesamlphp_version'; + public const string LATEST_VERSION_STATE_KEY = 'core:latest_simplesamlphp_version'; - public const RELEASES_API = 'https://api.github.com/repos/simplesamlphp/simplesamlphp/releases/latest'; + public const string RELEASES_API = 'https://api.github.com/repos/simplesamlphp/simplesamlphp/releases/latest'; /** @var \SimpleSAML\Utils\Auth */ @@ -148,7 +148,7 @@ public function main(/** @scrutinizer ignore-unused */ Request $request): Templa ]; $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); - /** @var CronEvent $event */ + /** @var \SimpleSAML\Module\admin\Controller\CronEvent $event */ $event = $eventDispatcher->dispatch(new ConfigPageEvent($t)); $t = $event->getTemplate(); Module::callHooks('configpage', $t); @@ -380,9 +380,9 @@ protected function getPrerequisiteChecks(): array // Add module specific checks via the sanitycheck hook that a module can provide. $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); - /** @var SanityCheckEvent $event */ + /** @var \SimpleSAML\Module\admin\Event\SanityCheckEvent $event */ $event = $eventDispatcher->dispatch(new SanityCheckEvent()); - + $hookinfo = [ 'info' => [], 'errors' => [] ]; Module::callHooks('sanitycheck', $hookinfo); diff --git a/modules/admin/src/Controller/Federation.php b/modules/admin/src/Controller/Federation.php index 8dd39bb19d..f6486e2b32 100644 --- a/modules/admin/src/Controller/Federation.php +++ b/modules/admin/src/Controller/Federation.php @@ -27,7 +27,6 @@ use Symfony\Component\HttpFoundation\ResponseHeaderBag; use Symfony\Component\VarExporter\VarExporter; - use function array_merge; use function array_pop; use function array_values; @@ -185,7 +184,7 @@ public function main(/** @scrutinizer ignore-unused */ Request $request): Templa ]; $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); - /** @var FederationPageEvent $event */ + /** @var \SimpleSAML\Module\admin\Event\FederationPageEvent $event */ $event = $eventDispatcher->dispatch(new FederationPageEvent($t)); $t = $event->getTemplate(); diff --git a/modules/admin/src/Controller/Menu.php b/modules/admin/src/Controller/Menu.php index 99d7b34b80..0bf2a344fb 100644 --- a/modules/admin/src/Controller/Menu.php +++ b/modules/admin/src/Controller/Menu.php @@ -90,7 +90,7 @@ public function insert(Template $template): Template { $template->data['menu'] = $this->options; $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); - /** @var AdminMenuEvent $event */ + /** @var \SimpleSAML\Module\admin\Event\AdminMenuEvent $event */ $event = $eventDispatcher->dispatch(new AdminMenuEvent($template)); $template = $event->getTemplate(); Module::callHooks('adminmenu', $template); diff --git a/modules/admin/src/Event/AdminMenuEvent.php b/modules/admin/src/Event/AdminMenuEvent.php index a2a62e8f38..8941d323a3 100644 --- a/modules/admin/src/Event/AdminMenuEvent.php +++ b/modules/admin/src/Event/AdminMenuEvent.php @@ -10,13 +10,15 @@ class AdminMenuEvent { private XHTML\Template $template; + public function __construct(XHTML\Template $template) { $this->template = $template; } + public function getTemplate(): XHTML\Template { return $this->template; } -} \ No newline at end of file +} diff --git a/modules/admin/src/Event/ConfigPageEvent.php b/modules/admin/src/Event/ConfigPageEvent.php index 4259c93134..9f651e1d1b 100644 --- a/modules/admin/src/Event/ConfigPageEvent.php +++ b/modules/admin/src/Event/ConfigPageEvent.php @@ -10,11 +10,12 @@ class ConfigPageEvent { public function __construct( private readonly XHTML\Template $template, - ) - {} + ) { + } + public function getTemplate(): XHTML\Template { return $this->template; } -} \ No newline at end of file +} diff --git a/modules/admin/src/Event/FederationPageEvent.php b/modules/admin/src/Event/FederationPageEvent.php index 0e837ee7bb..156ba5f2ab 100644 --- a/modules/admin/src/Event/FederationPageEvent.php +++ b/modules/admin/src/Event/FederationPageEvent.php @@ -10,10 +10,12 @@ class FederationPageEvent { public function __construct( private readonly XHTML\Template $template, - ) {} + ) { + } + public function getTemplate(): XHTML\Template { return $this->template; } -} \ No newline at end of file +} diff --git a/modules/admin/src/Event/SanityCheckEvent.php b/modules/admin/src/Event/SanityCheckEvent.php index d6f38a69a3..58486f5e9f 100644 --- a/modules/admin/src/Event/SanityCheckEvent.php +++ b/modules/admin/src/Event/SanityCheckEvent.php @@ -7,28 +7,35 @@ class SanityCheckEvent { private array $info = []; + private array $errors = []; - public function __construct() { + + public function __construct() + { } + public function addInfo(string $message): void { $this->info[] = $message; } + public function addError(string $message): void { $this->errors[] = $message; } + public function getInfo(): array { return $this->info; } + public function getErrors(): array { return $this->errors; } -} \ No newline at end of file +} diff --git a/modules/core/src/Auth/Source/RequestedAuthnContextSelector.php b/modules/core/src/Auth/Source/RequestedAuthnContextSelector.php index 411e6868d8..c62d783523 100644 --- a/modules/core/src/Auth/Source/RequestedAuthnContextSelector.php +++ b/modules/core/src/Auth/Source/RequestedAuthnContextSelector.php @@ -23,17 +23,17 @@ class RequestedAuthnContextSelector extends AbstractSourceSelector /** * The key of the AuthId field in the state. */ - public const AUTHID = '\SimpleSAML\Module\core\Auth\Source\RequestedAuthnContextSelector.AuthId'; + public const string AUTHID = '\SimpleSAML\Module\core\Auth\Source\RequestedAuthnContextSelector.AuthId'; /** * The string used to identify our states. */ - public const STAGEID = '\SimpleSAML\Module\core\Auth\Source\RequestedAuthnContextSelector.StageId'; + public const string STAGEID = '\SimpleSAML\Module\core\Auth\Source\RequestedAuthnContextSelector.StageId'; /** * The key where the sources is saved in the state. */ - public const SOURCESID = '\SimpleSAML\Module\core\Auth\Source\RequestedAuthnContextSelector.SourceId'; + public const string SOURCESID = '\SimpleSAML\Module\core\Auth\Source\RequestedAuthnContextSelector.SourceId'; /** diff --git a/modules/core/src/Auth/Source/SourceIPSelector.php b/modules/core/src/Auth/Source/SourceIPSelector.php index ce98026e51..45bddaf772 100644 --- a/modules/core/src/Auth/Source/SourceIPSelector.php +++ b/modules/core/src/Auth/Source/SourceIPSelector.php @@ -24,17 +24,17 @@ class SourceIPSelector extends AbstractSourceSelector /** * The key of the AuthId field in the state. */ - public const AUTHID = '\SimpleSAML\Module\core\Auth\Source\SourceIPSelector.AuthId'; + public const string AUTHID = '\SimpleSAML\Module\core\Auth\Source\SourceIPSelector.AuthId'; /** * The string used to identify our states. */ - public const STAGEID = '\SimpleSAML\Module\core\Auth\Source\SourceIPSelector.StageId'; + public const string STAGEID = '\SimpleSAML\Module\core\Auth\Source\SourceIPSelector.StageId'; /** * The key where the sources is saved in the state. */ - public const SOURCESID = '\SimpleSAML\Module\core\Auth\Source\SourceIPSelector.SourceId'; + public const string SOURCESID = '\SimpleSAML\Module\core\Auth\Source\SourceIPSelector.SourceId'; /** diff --git a/modules/core/src/Auth/UserPassBase.php b/modules/core/src/Auth/UserPassBase.php index a42a728bab..f96bb22e65 100644 --- a/modules/core/src/Auth/UserPassBase.php +++ b/modules/core/src/Auth/UserPassBase.php @@ -26,12 +26,12 @@ abstract class UserPassBase extends Auth\Source /** * The string used to identify our states. */ - public const STAGEID = '\SimpleSAML\Module\core\Auth\UserPassBase.state'; + public const string STAGEID = '\SimpleSAML\Module\core\Auth\UserPassBase.state'; /** * The key of the AuthId field in the state. */ - public const AUTHID = '\SimpleSAML\Module\core\Auth\UserPassBase.AuthId'; + public const string AUTHID = '\SimpleSAML\Module\core\Auth\UserPassBase.AuthId'; /** diff --git a/modules/core/src/Auth/UserPassOrgBase.php b/modules/core/src/Auth/UserPassOrgBase.php index 7064bfcf8f..1f52b850f9 100644 --- a/modules/core/src/Auth/UserPassOrgBase.php +++ b/modules/core/src/Auth/UserPassOrgBase.php @@ -26,17 +26,17 @@ abstract class UserPassOrgBase extends Auth\Source /** * The string used to identify our states. */ - public const STAGEID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.state'; + public const string STAGEID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.state'; /** * The key of the AuthId field in the state. */ - public const AUTHID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.AuthId'; + public const string AUTHID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.AuthId'; /** * The key of the OrgId field in the state, identifies which org was selected. */ - public const ORGID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.SelectedOrg'; + public const string ORGID = '\SimpleSAML\Module\core\Auth\UserPassOrgBase.SelectedOrg'; /** diff --git a/modules/core/src/Controller/Exception.php b/modules/core/src/Controller/Exception.php index 62f5b5748b..a9fcfc5c53 100644 --- a/modules/core/src/Controller/Exception.php +++ b/modules/core/src/Controller/Exception.php @@ -33,7 +33,12 @@ */ class Exception { - public const CODES = ['IDENTIFICATION_FAILURE', 'AUTHENTICATION_FAILURE', 'AUTHORIZATION_FAILURE', 'OTHER_ERROR']; + public const array CODES = [ + 'IDENTIFICATION_FAILURE', + 'AUTHENTICATION_FAILURE', + 'AUTHORIZATION_FAILURE', + 'OTHER_ERROR', + ]; /** diff --git a/modules/cron/src/Cron.php b/modules/cron/src/Cron.php index 32312301f2..0435e47fcb 100644 --- a/modules/cron/src/Cron.php +++ b/modules/cron/src/Cron.php @@ -5,7 +5,6 @@ namespace SimpleSAML\Module\cron; use Exception; -use Psr\EventDispatcher\EventDispatcherInterface; use SimpleSAML\Assert\Assert; use SimpleSAML\Configuration; use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; @@ -60,12 +59,12 @@ public function runTag(string $tag): array Module::callHooks('cron', $croninfo); // NEW: dispatch the cron event $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); - /** @var CronEvent $event */ + /** @var \SimpleSAML\Module\cron\Event\CronEvent $event */ $event = $eventDispatcher->dispatch(new CronEvent($tag)); // merge results from the event into $croninfo. Can be removed when hook infrastructure is removed. $croninfo['summary'] = array_merge($croninfo['summary'], array_map( fn ($result) => $result['message'], - $event->getResults() + $event->getResults(), )); Assert::isArray($croninfo); diff --git a/modules/cron/src/Event/CronEvent.php b/modules/cron/src/Event/CronEvent.php index 114d805913..32ab0cd361 100644 --- a/modules/cron/src/Event/CronEvent.php +++ b/modules/cron/src/Event/CronEvent.php @@ -8,16 +8,19 @@ class CronEvent { private array $results = []; + public function __construct( private readonly string $tag, - ) - {} + ) { + } + public function getTag(): string { return $this->tag; } + public function addResult(string $taskName, bool $success, string $message = ''): void { $this->results[$taskName] = [ @@ -26,11 +29,13 @@ public function addResult(string $taskName, bool $success, string $message = '') ]; } + public function getResults(): array { return $this->results; } + public function hasFailures(): bool { foreach ($this->results as $result) { @@ -40,4 +45,4 @@ public function hasFailures(): bool } return false; } -} \ No newline at end of file +} diff --git a/modules/cron/src/Event/Listener/ConfigPageListener.php b/modules/cron/src/Event/Listener/ConfigPageListener.php index 2c86a926cc..37fb84e378 100644 --- a/modules/cron/src/Event/Listener/ConfigPageListener.php +++ b/modules/cron/src/Event/Listener/ConfigPageListener.php @@ -19,4 +19,4 @@ public function __invoke(ConfigPageEvent $event): void $template->getLocalization()->addModuleDomain('cron'); } -} \ No newline at end of file +} diff --git a/modules/cron/src/Event/Listener/CronEventListener.php b/modules/cron/src/Event/Listener/CronEventListener.php index dc18022499..800cbdc000 100644 --- a/modules/cron/src/Event/Listener/CronEventListener.php +++ b/modules/cron/src/Event/Listener/CronEventListener.php @@ -17,4 +17,4 @@ public function __invoke(CronEvent $event): void $event->addResult('cron info', true, 'Cron did run tag [' . $event->getTag() . '] at ' . date(DATE_RFC822)); } } -} \ No newline at end of file +} diff --git a/modules/exampleauth/src/Auth/Source/External.php b/modules/exampleauth/src/Auth/Source/External.php index 4bbc9c865d..a18b290e5a 100644 --- a/modules/exampleauth/src/Auth/Source/External.php +++ b/modules/exampleauth/src/Auth/Source/External.php @@ -36,7 +36,7 @@ class External extends Auth\Source /** * The key of the AuthId field in the state. */ - public const AUTHID = 'SimpleSAML\Module\exampleauth\Auth\Source\External.AuthId'; + public const string AUTHID = 'SimpleSAML\Module\exampleauth\Auth\Source\External.AuthId'; /** diff --git a/modules/exampleauth/src/Auth/Source/UserClick.php b/modules/exampleauth/src/Auth/Source/UserClick.php index 2ae381561c..1c6ac4e4f8 100644 --- a/modules/exampleauth/src/Auth/Source/UserClick.php +++ b/modules/exampleauth/src/Auth/Source/UserClick.php @@ -29,12 +29,12 @@ class UserClick extends Auth\Source /** * The string used to identify our states. */ - public const STAGEID = '\SimpleSAML\Module\exampleauth\Auth\UserClick.state'; + public const string STAGEID = '\SimpleSAML\Module\exampleauth\Auth\UserClick.state'; /** * The key of the AuthId field in the state. */ - public const AUTHID = '\SimpleSAML\Module\exampleauth\Auth\UserClick.AuthId'; + public const string AUTHID = '\SimpleSAML\Module\exampleauth\Auth\UserClick.AuthId'; /** diff --git a/modules/multiauth/src/Auth/Source/MultiAuth.php b/modules/multiauth/src/Auth/Source/MultiAuth.php index cbd8f98409..fd6c45304d 100644 --- a/modules/multiauth/src/Auth/Source/MultiAuth.php +++ b/modules/multiauth/src/Auth/Source/MultiAuth.php @@ -25,22 +25,22 @@ class MultiAuth extends Auth\Source /** * The key of the AuthId field in the state. */ - public const AUTHID = '\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth.AuthId'; + public const string AUTHID = '\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth.AuthId'; /** * The string used to identify our states. */ - public const STAGEID = '\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth.StageId'; + public const string STAGEID = '\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth.StageId'; /** * The key where the sources is saved in the state. */ - public const SOURCESID = '\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth.SourceId'; + public const string SOURCESID = '\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth.SourceId'; /** * The key where the selected source is saved in the session. */ - public const SESSION_SOURCE = 'multiauth:selectedSource'; + public const string SESSION_SOURCE = 'multiauth:selectedSource'; /** diff --git a/modules/saml/src/Auth/Process/PairwiseID.php b/modules/saml/src/Auth/Process/PairwiseID.php index d474499643..166bc01684 100644 --- a/modules/saml/src/Auth/Process/PairwiseID.php +++ b/modules/saml/src/Auth/Process/PairwiseID.php @@ -38,7 +38,7 @@ class PairwiseID extends SubjectID /** * The name for this class */ - public const NAME = 'PairwiseID'; + public const string NAME = 'PairwiseID'; /** diff --git a/modules/saml/src/Auth/Process/ScopedIssuer.php b/modules/saml/src/Auth/Process/ScopedIssuer.php index 297e89eb4e..c101b8ee54 100644 --- a/modules/saml/src/Auth/Process/ScopedIssuer.php +++ b/modules/saml/src/Auth/Process/ScopedIssuer.php @@ -42,10 +42,8 @@ class ScopedIssuer extends Auth\ProcessingFilter { /** * The regular expression to match the scope - * - * @var string */ - public const SCOPE_PATTERN = '/^[a-z0-9][a-z0-9.-]{0,126}$/Di'; + public const string SCOPE_PATTERN = '/^[a-z0-9][a-z0-9.-]{0,126}$/Di'; /** diff --git a/modules/saml/src/Auth/Process/SubjectID.php b/modules/saml/src/Auth/Process/SubjectID.php index be5a3237fd..3122d32b10 100644 --- a/modules/saml/src/Auth/Process/SubjectID.php +++ b/modules/saml/src/Auth/Process/SubjectID.php @@ -49,28 +49,25 @@ class SubjectID extends Auth\ProcessingFilter /** * The name for this class */ - public const NAME = 'SubjectID'; + public const string NAME = 'SubjectID'; /** * The regular expression to match the scope * - * @var string */ - public const SCOPE_PATTERN = '/^[a-z0-9][a-z0-9.-]{0,126}$/Di'; + public const string SCOPE_PATTERN = '/^[a-z0-9][a-z0-9.-]{0,126}$/Di'; /** * The regular expression to match the specifications * - * @var string */ - public const SPEC_PATTERN = '/^[a-z0-9][a-z0-9=-]{0,126}@[a-z0-9][a-z0-9.-]{0,126}$/Di'; + public const string SPEC_PATTERN = '/^[a-z0-9][a-z0-9=-]{0,126}@[a-z0-9][a-z0-9.-]{0,126}$/Di'; /** * The regular expression to match worrisome identifiers that need to raise a warning * - * @var string */ - public const WARN_PATTERN = '/^[a-z0-9][a-z0-9=-]{3,}@[a-z0-9][a-z0-9.-]+\.[a-z]{2,}$/Di'; + public const string WARN_PATTERN = '/^[a-z0-9][a-z0-9=-]{3,}@[a-z0-9][a-z0-9.-]+\.[a-z]{2,}$/Di'; /** diff --git a/modules/saml/src/Auth/Source/SP.php b/modules/saml/src/Auth/Source/SP.php index 485f68653e..d6be02e221 100644 --- a/modules/saml/src/Auth/Source/SP.php +++ b/modules/saml/src/Auth/Source/SP.php @@ -22,11 +22,11 @@ use SimpleSAML\Metadata\MetaDataStorageHandler; use SimpleSAML\Module; use SimpleSAML\Module\saml\Error\ProxyCountExceeded; +use SimpleSAML\SAML2\XML\samlp\AuthnContextComparisonTypeEnum; use SimpleSAML\Session; use SimpleSAML\Store; use SimpleSAML\Store\StoreFactory; use SimpleSAML\Utils; -use SimpleSAML\SAML2\XML\samlp\AuthnContextComparisonTypeEnum; use function array_column; diff --git a/modules/saml/src/Event/Listener/SamlSanityCheckListener.php b/modules/saml/src/Event/Listener/SamlSanityCheckListener.php index 0ed1b300b0..94f006c356 100644 --- a/modules/saml/src/Event/Listener/SamlSanityCheckListener.php +++ b/modules/saml/src/Event/Listener/SamlSanityCheckListener.php @@ -1,4 +1,4 @@ - "default-src 'none'; " . "frame-ancestors 'self'; " . diff --git a/src/SimpleSAML/Error/CannotSetCookie.php b/src/SimpleSAML/Error/CannotSetCookie.php index 48a2079950..3478ddeee1 100644 --- a/src/SimpleSAML/Error/CannotSetCookie.php +++ b/src/SimpleSAML/Error/CannotSetCookie.php @@ -14,23 +14,17 @@ class CannotSetCookie extends Exception { /** * The exception was thrown for unknown reasons. - * - * @var int */ - public const UNKNOWN = 0; + public const int UNKNOWN = 0; /** * The exception was due to the HTTP headers being already sent, and therefore we cannot send additional headers to * set the cookie. - * - * @var int */ - public const HEADERS_SENT = 1; + public const int HEADERS_SENT = 1; /** * The exception was due to trying to set a secure cookie over an insecure channel. - * - * @var int */ - public const SECURE_COOKIE = 2; + public const int SECURE_COOKIE = 2; } diff --git a/src/SimpleSAML/Error/ErrorCodes.php b/src/SimpleSAML/Error/ErrorCodes.php index 8bad607bb8..009d0deeb8 100644 --- a/src/SimpleSAML/Error/ErrorCodes.php +++ b/src/SimpleSAML/Error/ErrorCodes.php @@ -16,81 +16,81 @@ */ class ErrorCodes { - final public const ACSPARAMS = 'ACSPARAMS'; + final public const string ACSPARAMS = 'ACSPARAMS'; - final public const ADMINNOTHASHED = 'ADMINNOTHASHED'; + final public const string ADMINNOTHASHED = 'ADMINNOTHASHED'; - final public const ARSPARAMS = 'ARSPARAMS'; + final public const string ARSPARAMS = 'ARSPARAMS'; - final public const AUTHSOURCEERROR = 'AUTHSOURCEERROR'; + final public const string AUTHSOURCEERROR = 'AUTHSOURCEERROR'; - final public const BADREQUEST = 'BADREQUEST'; + final public const string BADREQUEST = 'BADREQUEST'; - final public const CASERROR = 'CASERROR'; + final public const string CASERROR = 'CASERROR'; - final public const CONFIG = 'CONFIG'; + final public const string CONFIG = 'CONFIG'; - final public const CREATEREQUEST = 'CREATEREQUEST'; + final public const string CREATEREQUEST = 'CREATEREQUEST'; - final public const DISCOPARAMS = 'DISCOPARAMS'; + final public const string DISCOPARAMS = 'DISCOPARAMS'; - final public const GENERATEAUTHNRESPONSE = 'GENERATEAUTHNRESPONSE'; + final public const string GENERATEAUTHNRESPONSE = 'GENERATEAUTHNRESPONSE'; - final public const INVALIDCERT = 'INVALIDCERT'; + final public const string INVALIDCERT = 'INVALIDCERT'; - final public const LDAPERROR = 'LDAPERROR'; + final public const string LDAPERROR = 'LDAPERROR'; - final public const LOGOUTINFOLOST = 'LOGOUTINFOLOST'; + final public const string LOGOUTINFOLOST = 'LOGOUTINFOLOST'; - final public const LOGOUTREQUEST = 'LOGOUTREQUEST'; + final public const string LOGOUTREQUEST = 'LOGOUTREQUEST'; - final public const MEMCACHEDOWN = 'MEMCACHEDOWN'; + final public const string MEMCACHEDOWN = 'MEMCACHEDOWN'; - final public const METADATA = 'METADATA'; + final public const string METADATA = 'METADATA'; - final public const METADATANOTFOUND = 'METADATANOTFOUND'; + final public const string METADATANOTFOUND = 'METADATANOTFOUND'; - final public const METHODNOTALLOWED = 'METHODNOTALLOWED'; + final public const string METHODNOTALLOWED = 'METHODNOTALLOWED'; - final public const NOACCESS = 'NOACCESS'; + final public const string NOACCESS = 'NOACCESS'; - final public const NOCERT = 'NOCERT'; + final public const string NOCERT = 'NOCERT'; - final public const NORELAYSTATE = 'NORELAYSTATE'; + final public const string NORELAYSTATE = 'NORELAYSTATE'; - final public const NOSTATE = 'NOSTATE'; + final public const string NOSTATE = 'NOSTATE'; - final public const NOTFOUND = 'NOTFOUND'; + final public const string NOTFOUND = 'NOTFOUND'; - final public const NOTFOUNDREASON = 'NOTFOUNDREASON'; + final public const string NOTFOUNDREASON = 'NOTFOUNDREASON'; - final public const NOTSET = 'NOTSET'; + final public const string NOTSET = 'NOTSET'; - final public const NOTVALIDCERT = 'NOTVALIDCERT'; + final public const string NOTVALIDCERT = 'NOTVALIDCERT'; - final public const NOTVALIDCERTSIGNATURE = 'NOTVALIDCERTSIGNATURE'; + final public const string NOTVALIDCERTSIGNATURE = 'NOTVALIDCERTSIGNATURE'; - final public const PROCESSASSERTION = 'PROCESSASSERTION'; + final public const string PROCESSASSERTION = 'PROCESSASSERTION'; - final public const PROCESSAUTHNREQUEST = 'PROCESSAUTHNREQUEST'; + final public const string PROCESSAUTHNREQUEST = 'PROCESSAUTHNREQUEST'; - final public const RESPONSESTATUSNOSUCCESS = 'RESPONSESTATUSNOSUCCESS'; + final public const string RESPONSESTATUSNOSUCCESS = 'RESPONSESTATUSNOSUCCESS'; - final public const SLOSERVICEPARAMS = 'SLOSERVICEPARAMS'; + final public const string SLOSERVICEPARAMS = 'SLOSERVICEPARAMS'; - final public const SSOPARAMS = 'SSOPARAMS'; + final public const string SSOPARAMS = 'SSOPARAMS'; - final public const UNHANDLEDEXCEPTION = 'UNHANDLEDEXCEPTION'; + final public const string UNHANDLEDEXCEPTION = 'UNHANDLEDEXCEPTION'; - final public const UNKNOWNCERT = 'UNKNOWNCERT'; + final public const string UNKNOWNCERT = 'UNKNOWNCERT'; - final public const USERABORTED = 'USERABORTED'; + final public const string USERABORTED = 'USERABORTED'; - final public const WRONGUSERPASS = 'WRONGUSERPASS'; + final public const string WRONGUSERPASS = 'WRONGUSERPASS'; - final public const KEY_TITLE = 'title'; + final public const string KEY_TITLE = 'title'; - final public const KEY_DESCRIPTION = 'descr'; + final public const string KEY_DESCRIPTION = 'descr'; /** diff --git a/src/SimpleSAML/Error/ExceptionHandler.php b/src/SimpleSAML/Error/ExceptionHandler.php index 4b7c34daa4..6720715631 100644 --- a/src/SimpleSAML/Error/ExceptionHandler.php +++ b/src/SimpleSAML/Error/ExceptionHandler.php @@ -6,8 +6,8 @@ use Error as BuiltinError; use Exception as BuiltinException; -use SimpleSAML\Event\ExceptionHandlerEvent; use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; +use SimpleSAML\Event\ExceptionHandlerEvent; use SimpleSAML\Logger; use SimpleSAML\Module; use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; @@ -29,7 +29,7 @@ class ExceptionHandler public function customExceptionHandler(Throwable $exception): void { $eventDispatcher = ModuleEventDispatcherFactory::getInstance(); - /** @var ExceptionHandlerEvent $event */ + /** @var \SimpleSAML\Event\ExceptionHandlerEvent $event */ $event = $eventDispatcher->dispatch(new ExceptionHandlerEvent($exception)); $exception = $event->getException(); diff --git a/src/SimpleSAML/Event/Dispatcher/EventDispatcher.php b/src/SimpleSAML/Event/Dispatcher/EventDispatcher.php index e9bed7d10b..a28d2cb38e 100644 --- a/src/SimpleSAML/Event/Dispatcher/EventDispatcher.php +++ b/src/SimpleSAML/Event/Dispatcher/EventDispatcher.php @@ -4,7 +4,9 @@ namespace SimpleSAML\Event\Dispatcher; -use Psr\EventDispatcher\{EventDispatcherInterface, ListenerProviderInterface, StoppableEventInterface}; +use Psr\EventDispatcher\EventDispatcherInterface; +use Psr\EventDispatcher\ListenerProviderInterface; +use Psr\EventDispatcher\StoppableEventInterface; class EventDispatcher implements EventDispatcherInterface { @@ -13,6 +15,7 @@ public function __construct( ) { } + public function dispatch(object $event): object { // Check if event propagation already stopped @@ -43,4 +46,4 @@ public function dispatch(object $event): object return $event; } -} \ No newline at end of file +} diff --git a/src/SimpleSAML/Event/Dispatcher/ModuleEventDispatcherFactory.php b/src/SimpleSAML/Event/Dispatcher/ModuleEventDispatcherFactory.php index 93d96315a3..64468b4a70 100644 --- a/src/SimpleSAML/Event/Dispatcher/ModuleEventDispatcherFactory.php +++ b/src/SimpleSAML/Event/Dispatcher/ModuleEventDispatcherFactory.php @@ -1,4 +1,4 @@ -exception = $exception; } + public function getException(): \Throwable { return $this->exception; } -} \ No newline at end of file +} diff --git a/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php b/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php index 929c674597..664fae43e1 100644 --- a/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php +++ b/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php @@ -13,6 +13,7 @@ class ModuleListenerProvider implements ListenerProviderInterface /** @var array> */ private array $listeners = []; + public function __construct() { $configuration = Configuration::getInstance(); @@ -34,7 +35,7 @@ private function discoverListeners(array $enabledModules): void continue; } - foreach(glob("{$listenerDir}/*.php") as $file) { + foreach (glob("{$listenerDir}/*.php") as $file) { $className = $this->getClassNameFromFile($file, $moduleName); if (!$className || !class_exists($className)) { @@ -46,6 +47,7 @@ private function discoverListeners(array $enabledModules): void } } + private function registerListenerClass(string $className): void { $reflection = new \ReflectionClass($className); @@ -68,6 +70,7 @@ private function registerListenerClass(string $className): void } } + public function addListener(string $eventClass, callable $listener, int $priority = 0): void { if (!isset($this->listeners[$eventClass])) { @@ -85,6 +88,7 @@ public function addListener(string $eventClass, callable $listener, int $priorit }); } + /** * Get the listeners for a specific event type. * @@ -122,6 +126,7 @@ public function getListenersForEvent(object $event): iterable } } + private function getClassNameFromFile(string $file, string $moduleName): ?string { $basename = basename($file, '.php'); diff --git a/src/SimpleSAML/Kernel.php b/src/SimpleSAML/Kernel.php index 3b143483d3..32e0b48b4a 100644 --- a/src/SimpleSAML/Kernel.php +++ b/src/SimpleSAML/Kernel.php @@ -29,7 +29,7 @@ class Kernel extends BaseKernel use MicroKernelTrait; - public const CONFIG_EXTS = '.{php,xml,yaml,yml}'; + public const string CONFIG_EXTS = '.{php,xml,yaml,yml}'; /** @var string */ diff --git a/src/SimpleSAML/Locale/Language.php b/src/SimpleSAML/Locale/Language.php index 6a80cb44a4..c8dcc9863c 100644 --- a/src/SimpleSAML/Locale/Language.php +++ b/src/SimpleSAML/Locale/Language.php @@ -21,10 +21,8 @@ class Language { /** * The final fallback language to use when no current or default available - * - * @var string */ - public const FALLBACKLANGUAGE = 'en'; + public const string FALLBACKLANGUAGE = 'en'; /** diff --git a/src/SimpleSAML/Locale/Localization.php b/src/SimpleSAML/Locale/Localization.php index 0ff02fbe53..a9945d425c 100644 --- a/src/SimpleSAML/Locale/Localization.php +++ b/src/SimpleSAML/Locale/Localization.php @@ -26,12 +26,10 @@ class Localization { /** * The default gettext domain. - * - * @var string */ - public const DEFAULT_DOMAIN = 'messages'; + public const string DEFAULT_DOMAIN = 'messages'; - public const CORE_DOMAIN = 'core'; + public const string CORE_DOMAIN = 'core'; /** diff --git a/src/SimpleSAML/Logger.php b/src/SimpleSAML/Logger.php index 5595a6302c..2c7b7a438b 100644 --- a/src/SimpleSAML/Logger.php +++ b/src/SimpleSAML/Logger.php @@ -21,34 +21,24 @@ class Logger /** * This constant defines the string we set the track ID to while we are fetching the track ID from the session * class. This is used to prevent infinite recursion. - * - * @var string */ - public const NO_TRACKID = '_NOTRACKIDYET_'; + public const string NO_TRACKID = '_NOTRACKIDYET_'; - /** @var int */ - public const EMERG = 0; + public const int EMERG = 0; - /** @var int */ - public const ALERT = 1; + public const int ALERT = 1; - /** @var int */ - public const CRIT = 2; + public const int CRIT = 2; - /** @var int */ - public const ERR = 3; + public const int ERR = 3; - /** @var int */ - public const WARNING = 4; + public const int WARNING = 4; - /** @var int */ - public const NOTICE = 5; + public const int NOTICE = 5; - /** @var int */ - public const INFO = 6; + public const int INFO = 6; - /** @var int */ - public const DEBUG = 7; + public const int DEBUG = 7; /** diff --git a/src/SimpleSAML/Metadata/MetaDataStorageHandlerSerialize.php b/src/SimpleSAML/Metadata/MetaDataStorageHandlerSerialize.php index 8844b9dbf9..cf975379df 100644 --- a/src/SimpleSAML/Metadata/MetaDataStorageHandlerSerialize.php +++ b/src/SimpleSAML/Metadata/MetaDataStorageHandlerSerialize.php @@ -30,10 +30,8 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource { /** * The file extension we use for our metadata files. - * - * @var string */ - public const EXTENSION = '.serialized'; + public const string EXTENSION = '.serialized'; /** diff --git a/src/SimpleSAML/Session.php b/src/SimpleSAML/Session.php index 0f7d7fd003..3f4820c738 100644 --- a/src/SimpleSAML/Session.php +++ b/src/SimpleSAML/Session.php @@ -33,7 +33,7 @@ class Session implements Utils\ClearableState * This is a timeout value for setData, which indicates that the data * should never be deleted, i.e. lasts the whole session lifetime. */ - public const DATA_TIMEOUT_SESSION_END = 'sessionEndTimeout'; + public const string DATA_TIMEOUT_SESSION_END = 'sessionEndTimeout'; /** diff --git a/src/SimpleSAML/Utils/Random.php b/src/SimpleSAML/Utils/Random.php index c7af40344a..c9a2a515ba 100644 --- a/src/SimpleSAML/Utils/Random.php +++ b/src/SimpleSAML/Utils/Random.php @@ -14,7 +14,7 @@ class Random /** * The fixed length of random identifiers. */ - public const ID_LENGTH = 43; + public const int ID_LENGTH = 43; /** diff --git a/src/SimpleSAML/Utils/System.php b/src/SimpleSAML/Utils/System.php index 2b5471be58..e41d301b34 100644 --- a/src/SimpleSAML/Utils/System.php +++ b/src/SimpleSAML/Utils/System.php @@ -14,21 +14,21 @@ */ class System { - public const WINDOWS = 1; + public const int WINDOWS = 1; - public const LINUX = 2; + public const int LINUX = 2; - public const OSX = 3; + public const int OSX = 3; - public const HPUX = 4; + public const int HPUX = 4; - public const UNIX = 5; + public const int UNIX = 5; - public const BSD = 6; + public const int BSD = 6; - public const IRIX = 7; + public const int IRIX = 7; - public const SUNOS = 8; + public const int SUNOS = 8; /** diff --git a/tests/SigningTestCase.php b/tests/SigningTestCase.php index 9d7aa4600a..3d1b8fce77 100644 --- a/tests/SigningTestCase.php +++ b/tests/SigningTestCase.php @@ -168,17 +168,17 @@ class SigningTestCase extends TestCase protected Configuration $config; - protected const ROOTDIRNAME = 'testdir'; + protected const string ROOTDIRNAME = 'testdir'; - protected const DEFAULTCERTDIR = 'certdir'; + protected const string DEFAULTCERTDIR = 'certdir'; - protected const CA_PRIVATE_KEY = 'ca.key.pem'; + protected const string CA_PRIVATE_KEY = 'ca.key.pem'; - protected const CA_CERTIFICATE = 'ca.cert.pem'; + protected const string CA_CERTIFICATE = 'ca.cert.pem'; - protected const GOOD_PRIVATE_KEY = 'good.key.pem'; + protected const string GOOD_PRIVATE_KEY = 'good.key.pem'; - protected const GOOD_CERTIFICATE = 'good.cert.pem'; + protected const string GOOD_CERTIFICATE = 'good.cert.pem'; /** diff --git a/tests/modules/cron/src/Controller/CronTest.php b/tests/modules/cron/src/Controller/CronTest.php index 4ae0067a32..ef7b685ee3 100644 --- a/tests/modules/cron/src/Controller/CronTest.php +++ b/tests/modules/cron/src/Controller/CronTest.php @@ -117,8 +117,10 @@ public function testRunCorrectKey(): void $this->assertFalse($response->data['mail_required']); $this->assertArrayHasKey('time', $response->data); $this->assertCount(1, $response->data['summary']); - - $this->assertEquals('Cron did run tag [daily] at ' . $response->data['time'], $response->data['summary']['cron info']); + $this->assertEquals( + 'Cron did run tag [daily] at ' . $response->data['time'], + $response->data['summary']['cron info'], + ); } diff --git a/tests/modules/saml/src/Controller/MetadataTest.php b/tests/modules/saml/src/Controller/MetadataTest.php index 8f8086eab0..4d2766ced1 100644 --- a/tests/modules/saml/src/Controller/MetadataTest.php +++ b/tests/modules/saml/src/Controller/MetadataTest.php @@ -24,10 +24,8 @@ #[CoversClass(Controller\Metadata::class)] class MetadataTest extends TestCase { - /** @var \SimpleSAML\Configuration */ protected Configuration $config; - /** @var \SimpleSAML\Utils\Auth */ protected Utils\Auth $authUtils; protected MetaDataStorageHandler $mdh; diff --git a/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php b/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php index ffaa600620..b6ceb5a98c 100644 --- a/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php +++ b/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php @@ -16,7 +16,7 @@ #[CoversClass(SAMLBuilder::class)] class SAMLBuilderTest extends TestCase { - private const SECURITY = 'vendor/simplesamlphp/xml-security/resources'; + private const string SECURITY = 'vendor/simplesamlphp/xml-security/resources'; /** diff --git a/tests/src/SimpleSAML/ModuleTest.php b/tests/src/SimpleSAML/ModuleTest.php index 02ff46c917..7942cb36f1 100644 --- a/tests/src/SimpleSAML/ModuleTest.php +++ b/tests/src/SimpleSAML/ModuleTest.php @@ -15,8 +15,6 @@ use SimpleSAML\XHTML\Template; use Symfony\Component\Filesystem\Path; -/** - */ #[CoversClass(Module::class)] class ModuleTest extends TestCase { diff --git a/tests/src/SimpleSAML/Utils/CryptoTest.php b/tests/src/SimpleSAML/Utils/CryptoTest.php index 01a60541a7..ea277a8c62 100644 --- a/tests/src/SimpleSAML/Utils/CryptoTest.php +++ b/tests/src/SimpleSAML/Utils/CryptoTest.php @@ -19,9 +19,9 @@ #[CoversClass(Utils\Crypto::class)] class CryptoTest extends TestCase { - private const ROOTDIRNAME = 'testdir'; + private const string ROOTDIRNAME = 'testdir'; - private const DEFAULTCERTDIR = 'certdir'; + private const string DEFAULTCERTDIR = 'certdir'; /** @var \org\bovigo\vfs\vfsStreamDirectory */ diff --git a/tests/src/SimpleSAML/Utils/HTTPTest.php b/tests/src/SimpleSAML/Utils/HTTPTest.php index 1f53c9d853..4afb357be7 100644 --- a/tests/src/SimpleSAML/Utils/HTTPTest.php +++ b/tests/src/SimpleSAML/Utils/HTTPTest.php @@ -758,6 +758,7 @@ public static function slowPostDelayProvider(): array ]; } + /** * Ensure getSelfURL() returns the externally visible URL when SimpleSAMLphp * is reached via a rewritten path (e.g. /cas/login -> /simplesaml/module.php/...), diff --git a/tests/src/SimpleSAML/Utils/XMLTest.php b/tests/src/SimpleSAML/Utils/XMLTest.php index 5cc4e3c14e..5ea184621a 100644 --- a/tests/src/SimpleSAML/Utils/XMLTest.php +++ b/tests/src/SimpleSAML/Utils/XMLTest.php @@ -20,7 +20,7 @@ #[CoversClass(Utils\XML::class)] class XMLTest extends TestCase { - private const FRAMEWORK = 'vendor/simplesamlphp/saml2/tests/resources/xml'; + private const string FRAMEWORK = 'vendor/simplesamlphp/saml2/tests/resources/xml'; /** From ad23c9f6e93fbe981ad32eaae0f814ec26a1f23a Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 2 Mar 2026 15:36:32 +0100 Subject: [PATCH 447/532] Bump dependencies --- composer.lock | 376 +++++++++--------- docs/simplesamlphp-reference-idp-hosted.md | 6 +- modules/saml/docs/sp.md | 4 +- .../src/Controller/WebBrowserSingleSignOn.php | 2 +- modules/saml/src/IdP/SAML2.php | 2 +- tests/modules/saml/src/Auth/Source/SPTest.php | 4 +- tests/modules/saml/src/IdP/SAML2Test.php | 5 +- .../SimpleSAML/Metadata/SAMLBuilderTest.php | 6 +- .../SimpleSAML/Metadata/SAMLParserTest.php | 2 +- tests/src/SimpleSAML/Utils/XMLTest.php | 2 +- tests/src/SimpleSAML/XML/SignerTest.php | 2 +- tests/src/SimpleSAML/XML/ValidatorTest.php | 2 +- 12 files changed, 209 insertions(+), 204 deletions(-) diff --git a/composer.lock b/composer.lock index 210a7b3967..ac47981ecb 100644 --- a/composer.lock +++ b/composer.lock @@ -82,16 +82,16 @@ }, { "name": "gettext/languages", - "version": "2.12.1", + "version": "2.12.2", "source": { "type": "git", "url": "https://github.com/php-gettext/Languages.git", - "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1" + "reference": "079d6f4842cbcbf5673a70d8e93169a684e7aadd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Languages/zipball/0b0b0851c55168e1dfb14305735c64019732b5f1", - "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1", + "url": "https://api.github.com/repos/php-gettext/Languages/zipball/079d6f4842cbcbf5673a70d8e93169a684e7aadd", + "reference": "079d6f4842cbcbf5673a70d8e93169a684e7aadd", "shasum": "" }, "require": { @@ -141,7 +141,7 @@ ], "support": { "issues": "https://github.com/php-gettext/Languages/issues", - "source": "https://github.com/php-gettext/Languages/tree/2.12.1" + "source": "https://github.com/php-gettext/Languages/tree/2.12.2" }, "funding": [ { @@ -153,7 +153,7 @@ "type": "github" } ], - "time": "2025-03-19T11:14:02+00:00" + "time": "2026-02-23T14:05:50+00:00" }, { "name": "gettext/translator", @@ -1095,16 +1095,16 @@ }, { "name": "simplesamlphp/saml2", - "version": "v6.1.0", + "version": "v6.1.1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "489e704f2fda575373aa8b8e8b179703ca9f16e5" + "reference": "c0143cc4a9cb524eeb6f0441854d636153baa738" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/489e704f2fda575373aa8b8e8b179703ca9f16e5", - "reference": "489e704f2fda575373aa8b8e8b179703ca9f16e5", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/c0143cc4a9cb524eeb6f0441854d636153baa738", + "reference": "c0143cc4a9cb524eeb6f0441854d636153baa738", "shasum": "" }, "require": { @@ -1165,9 +1165,9 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.0" + "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.1" }, - "time": "2026-02-19T23:24:33+00:00" + "time": "2026-02-28T21:51:25+00:00" }, { "name": "simplesamlphp/saml2-legacy", @@ -1175,12 +1175,12 @@ "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2-legacy.git", - "reference": "e886d51e9f942793e00d1800b4768cf511db5c03" + "reference": "255cd5b9492b19bac7c2a5c5acc89dd80641b2a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/e886d51e9f942793e00d1800b4768cf511db5c03", - "reference": "e886d51e9f942793e00d1800b4768cf511db5c03", + "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/255cd5b9492b19bac7c2a5c5acc89dd80641b2a1", + "reference": "255cd5b9492b19bac7c2a5c5acc89dd80641b2a1", "shasum": "" }, "require": { @@ -1190,6 +1190,7 @@ "php": "^8.3", "psr/log": "^2.0 || ^3.0", "robrichards/xmlseclibs": "^3.1.4", + "simplesamlphp/xml-common": "^2.7", "webmozart/assert": "^2.0" }, "conflict": { @@ -1224,7 +1225,7 @@ "support": { "source": "https://github.com/simplesamlphp/saml2-legacy/tree/v4.20.0" }, - "time": "2026-02-21T21:49:45+00:00" + "time": "2026-03-01T20:58:16+00:00" }, { "name": "simplesamlphp/simplesamlphp-assets-base", @@ -1264,16 +1265,16 @@ }, { "name": "simplesamlphp/xml-common", - "version": "v2.7.0", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "c98db082c3168aeabd8f664984c9c5152deb3519" + "reference": "1adc0d66f9fa15ccca7c525916b02969feb782e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/c98db082c3168aeabd8f664984c9c5152deb3519", - "reference": "c98db082c3168aeabd8f664984c9c5152deb3519", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/1adc0d66f9fa15ccca7c525916b02969feb782e2", + "reference": "1adc0d66f9fa15ccca7c525916b02969feb782e2", "shasum": "" }, "require": { @@ -1327,7 +1328,7 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2026-02-16T21:02:41+00:00" + "time": "2026-02-28T17:37:31+00:00" }, { "name": "simplesamlphp/xml-security", @@ -1448,16 +1449,16 @@ }, { "name": "symfony/cache", - "version": "v7.4.5", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "8dde98d5a4123b53877aca493f9be57b333f14bd" + "reference": "1d06192e8f164e2729b0031e6807d72a6195b8bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/8dde98d5a4123b53877aca493f9be57b333f14bd", - "reference": "8dde98d5a4123b53877aca493f9be57b333f14bd", + "url": "https://api.github.com/repos/symfony/cache/zipball/1d06192e8f164e2729b0031e6807d72a6195b8bb", + "reference": "1d06192e8f164e2729b0031e6807d72a6195b8bb", "shasum": "" }, "require": { @@ -1528,7 +1529,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.4.5" + "source": "https://github.com/symfony/cache/tree/v7.4.6" }, "funding": [ { @@ -1548,7 +1549,7 @@ "type": "tidelift" } ], - "time": "2026-01-27T16:16:02+00:00" + "time": "2026-02-21T23:29:27+00:00" }, { "name": "symfony/cache-contracts", @@ -1628,16 +1629,16 @@ }, { "name": "symfony/config", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "4275b53b8ab0cf37f48bf273dc2285c8178efdfb" + "reference": "9400e2f9226b3b64ebb0a8ae967ae84e54e39640" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/4275b53b8ab0cf37f48bf273dc2285c8178efdfb", - "reference": "4275b53b8ab0cf37f48bf273dc2285c8178efdfb", + "url": "https://api.github.com/repos/symfony/config/zipball/9400e2f9226b3b64ebb0a8ae967ae84e54e39640", + "reference": "9400e2f9226b3b64ebb0a8ae967ae84e54e39640", "shasum": "" }, "require": { @@ -1683,7 +1684,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.4.4" + "source": "https://github.com/symfony/config/tree/v7.4.6" }, "funding": [ { @@ -1703,20 +1704,20 @@ "type": "tidelift" } ], - "time": "2026-01-13T11:36:38+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/console", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894" + "reference": "6d643a93b47398599124022eb24d97c153c12f27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/41e38717ac1dd7a46b6bda7d6a82af2d98a78894", - "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894", + "url": "https://api.github.com/repos/symfony/console/zipball/6d643a93b47398599124022eb24d97c153c12f27", + "reference": "6d643a93b47398599124022eb24d97c153c12f27", "shasum": "" }, "require": { @@ -1781,7 +1782,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.4" + "source": "https://github.com/symfony/console/tree/v7.4.6" }, "funding": [ { @@ -1801,20 +1802,20 @@ "type": "tidelift" } ], - "time": "2026-01-13T11:36:38+00:00" + "time": "2026-02-25T17:02:47+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.4.5", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "76a02cddca45a5254479ad68f9fa274ead0a7ef2" + "reference": "a3f7d594ca53a34a7d39ae683fbca09408b0c598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/76a02cddca45a5254479ad68f9fa274ead0a7ef2", - "reference": "76a02cddca45a5254479ad68f9fa274ead0a7ef2", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a3f7d594ca53a34a7d39ae683fbca09408b0c598", + "reference": "a3f7d594ca53a34a7d39ae683fbca09408b0c598", "shasum": "" }, "require": { @@ -1865,7 +1866,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.4.5" + "source": "https://github.com/symfony/dependency-injection/tree/v7.4.6" }, "funding": [ { @@ -1885,7 +1886,7 @@ "type": "tidelift" } ], - "time": "2026-01-27T16:16:02+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2267,16 +2268,16 @@ }, { "name": "symfony/filesystem", - "version": "v7.4.0", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "d551b38811096d0be9c4691d406991b47c0c630a" + "reference": "3ebc794fa5315e59fd122561623c2e2e4280538e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a", - "reference": "d551b38811096d0be9c4691d406991b47c0c630a", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/3ebc794fa5315e59fd122561623c2e2e4280538e", + "reference": "3ebc794fa5315e59fd122561623c2e2e4280538e", "shasum": "" }, "require": { @@ -2313,7 +2314,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.4.0" + "source": "https://github.com/symfony/filesystem/tree/v7.4.6" }, "funding": [ { @@ -2333,20 +2334,20 @@ "type": "tidelift" } ], - "time": "2025-11-27T13:27:24+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/finder", - "version": "v7.4.5", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb" + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ad4daa7c38668dcb031e63bc99ea9bd42196a2cb", - "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb", + "url": "https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf", "shasum": "" }, "require": { @@ -2381,7 +2382,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.5" + "source": "https://github.com/symfony/finder/tree/v7.4.6" }, "funding": [ { @@ -2401,20 +2402,20 @@ "type": "tidelift" } ], - "time": "2026-01-26T15:07:59+00:00" + "time": "2026-01-29T09:40:50+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.4.5", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "dcf89ca6712d9e1b5d3f14dea0e1c2685a05d1cd" + "reference": "a4022da7530f794aa64cea34b388439afb6323a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/dcf89ca6712d9e1b5d3f14dea0e1c2685a05d1cd", - "reference": "dcf89ca6712d9e1b5d3f14dea0e1c2685a05d1cd", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/a4022da7530f794aa64cea34b388439afb6323a3", + "reference": "a4022da7530f794aa64cea34b388439afb6323a3", "shasum": "" }, "require": { @@ -2437,7 +2438,7 @@ }, "conflict": { "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1", "symfony/asset": "<6.4", "symfony/asset-mapper": "<6.4", @@ -2470,7 +2471,7 @@ "require-dev": { "doctrine/persistence": "^1.3|^2|^3", "dragonmantank/cron-expression": "^3.1", - "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "seld/jsonlint": "^1.10", "symfony/asset": "^6.4|^7.0|^8.0", "symfony/asset-mapper": "^6.4|^7.0|^8.0", @@ -2539,7 +2540,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.4.5" + "source": "https://github.com/symfony/framework-bundle/tree/v7.4.6" }, "funding": [ { @@ -2559,20 +2560,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T08:59:58+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.4.5", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "446d0db2b1f21575f1284b74533e425096abdfb6" + "reference": "fd97d5e926e988a363cef56fbbf88c5c528e9065" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/446d0db2b1f21575f1284b74533e425096abdfb6", - "reference": "446d0db2b1f21575f1284b74533e425096abdfb6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/fd97d5e926e988a363cef56fbbf88c5c528e9065", + "reference": "fd97d5e926e988a363cef56fbbf88c5c528e9065", "shasum": "" }, "require": { @@ -2621,7 +2622,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.5" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.6" }, "funding": [ { @@ -2641,20 +2642,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T16:16:02+00:00" + "time": "2026-02-21T16:25:55+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.5", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "229eda477017f92bd2ce7615d06222ec0c19e82a" + "reference": "002ac0cf4cd972a7fd0912dcd513a95e8a81ce83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/229eda477017f92bd2ce7615d06222ec0c19e82a", - "reference": "229eda477017f92bd2ce7615d06222ec0c19e82a", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/002ac0cf4cd972a7fd0912dcd513a95e8a81ce83", + "reference": "002ac0cf4cd972a7fd0912dcd513a95e8a81ce83", "shasum": "" }, "require": { @@ -2696,7 +2697,7 @@ "symfony/config": "^6.4|^7.0|^8.0", "symfony/console": "^6.4|^7.0|^8.0", "symfony/css-selector": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4.1|^7.0.1|^8.0", "symfony/dom-crawler": "^6.4|^7.0|^8.0", "symfony/expression-language": "^6.4|^7.0|^8.0", "symfony/finder": "^6.4|^7.0|^8.0", @@ -2740,7 +2741,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.5" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.6" }, "funding": [ { @@ -2760,20 +2761,20 @@ "type": "tidelift" } ], - "time": "2026-01-28T10:33:42+00:00" + "time": "2026-02-26T08:30:57+00:00" }, { "name": "symfony/intl", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "7fa2d46174166bcd7829abc8717949f8a0b21fb7" + "reference": "6d6a398b18f73b3110140dbb030dcee2ae4ea81f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/7fa2d46174166bcd7829abc8717949f8a0b21fb7", - "reference": "7fa2d46174166bcd7829abc8717949f8a0b21fb7", + "url": "https://api.github.com/repos/symfony/intl/zipball/6d6a398b18f73b3110140dbb030dcee2ae4ea81f", + "reference": "6d6a398b18f73b3110140dbb030dcee2ae4ea81f", "shasum": "" }, "require": { @@ -2830,7 +2831,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.4.4" + "source": "https://github.com/symfony/intl/tree/v7.4.6" }, "funding": [ { @@ -2850,20 +2851,20 @@ "type": "tidelift" } ], - "time": "2026-01-12T12:19:02+00:00" + "time": "2026-02-09T09:33:46+00:00" }, { "name": "symfony/password-hasher", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "ab8e0ef42483f31c417c82ecfcf7be7b91d784fe" + "reference": "376755eb9c9857d78aedb68341ad2f46d1908b29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/ab8e0ef42483f31c417c82ecfcf7be7b91d784fe", - "reference": "ab8e0ef42483f31c417c82ecfcf7be7b91d784fe", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/376755eb9c9857d78aedb68341ad2f46d1908b29", + "reference": "376755eb9c9857d78aedb68341ad2f46d1908b29", "shasum": "" }, "require": { @@ -2906,7 +2907,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.4.4" + "source": "https://github.com/symfony/password-hasher/tree/v7.4.6" }, "funding": [ { @@ -2926,7 +2927,7 @@ "type": "tidelift" } ], - "time": "2026-01-01T22:13:48+00:00" + "time": "2026-02-11T16:03:16+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3433,16 +3434,16 @@ }, { "name": "symfony/routing", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "0798827fe2c79caeed41d70b680c2c3507d10147" + "reference": "238d749c56b804b31a9bf3e26519d93b65a60938" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/0798827fe2c79caeed41d70b680c2c3507d10147", - "reference": "0798827fe2c79caeed41d70b680c2c3507d10147", + "url": "https://api.github.com/repos/symfony/routing/zipball/238d749c56b804b31a9bf3e26519d93b65a60938", + "reference": "238d749c56b804b31a9bf3e26519d93b65a60938", "shasum": "" }, "require": { @@ -3494,7 +3495,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.4" + "source": "https://github.com/symfony/routing/tree/v7.4.6" }, "funding": [ { @@ -3514,7 +3515,7 @@ "type": "tidelift" } ], - "time": "2026-01-12T12:19:02+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/service-contracts", @@ -3605,16 +3606,16 @@ }, { "name": "symfony/string", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f" + "reference": "9f209231affa85aa930a5e46e6eb03381424b30b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/1c4b10461bf2ec27537b5f36105337262f5f5d6f", - "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f", + "url": "https://api.github.com/repos/symfony/string/zipball/9f209231affa85aa930a5e46e6eb03381424b30b", + "reference": "9f209231affa85aa930a5e46e6eb03381424b30b", "shasum": "" }, "require": { @@ -3672,7 +3673,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.4.4" + "source": "https://github.com/symfony/string/tree/v7.4.6" }, "funding": [ { @@ -3692,7 +3693,7 @@ "type": "tidelift" } ], - "time": "2026-01-12T10:54:30+00:00" + "time": "2026-02-09T09:33:46+00:00" }, { "name": "symfony/translation-contracts", @@ -3778,16 +3779,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.4.5", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "f2dd26b604e856476ef7e0efa4568bc07eb7ddc8" + "reference": "8903bc9a64cf624ffe522893f3626d5a0b97175c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/f2dd26b604e856476ef7e0efa4568bc07eb7ddc8", - "reference": "f2dd26b604e856476ef7e0efa4568bc07eb7ddc8", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/8903bc9a64cf624ffe522893f3626d5a0b97175c", + "reference": "8903bc9a64cf624ffe522893f3626d5a0b97175c", "shasum": "" }, "require": { @@ -3797,7 +3798,7 @@ "twig/twig": "^3.21" }, "conflict": { - "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1", "symfony/console": "<6.4", "symfony/form": "<6.4.32|>7,<7.3.10|>7.4,<7.4.4|>8.0,<8.0.4", @@ -3811,7 +3812,7 @@ "require-dev": { "egulias/email-validator": "^2.1.10|^3|^4", "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "symfony/asset": "^6.4|^7.0|^8.0", "symfony/asset-mapper": "^6.4|^7.0|^8.0", "symfony/console": "^6.4|^7.0|^8.0", @@ -3869,7 +3870,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.4.5" + "source": "https://github.com/symfony/twig-bridge/tree/v7.4.6" }, "funding": [ { @@ -3889,20 +3890,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T08:59:58+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "0e4769b46a0c3c62390d124635ce59f66874b282" + "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0e4769b46a0c3c62390d124635ce59f66874b282", - "reference": "0e4769b46a0c3c62390d124635ce59f66874b282", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/045321c440ac18347b136c63d2e9bf28a2dc0291", + "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291", "shasum": "" }, "require": { @@ -3956,7 +3957,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.4" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.6" }, "funding": [ { @@ -3976,7 +3977,7 @@ "type": "tidelift" } ], - "time": "2026-01-01T22:13:48+00:00" + "time": "2026-02-15T10:53:20+00:00" }, { "name": "symfony/var-exporter", @@ -4061,16 +4062,16 @@ }, { "name": "symfony/yaml", - "version": "v7.4.1", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "24dd4de28d2e3988b311751ac49e684d783e2345" + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345", - "reference": "24dd4de28d2e3988b311751ac49e684d783e2345", + "url": "https://api.github.com/repos/symfony/yaml/zipball/58751048de17bae71c5aa0d13cb19d79bca26391", + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391", "shasum": "" }, "require": { @@ -4113,7 +4114,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.1" + "source": "https://github.com/symfony/yaml/tree/v7.4.6" }, "funding": [ { @@ -4133,7 +4134,7 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:11:45+00:00" + "time": "2026-02-09T09:33:46+00:00" }, { "name": "twig/intl-extra", @@ -4280,16 +4281,16 @@ }, { "name": "webmozart/assert", - "version": "2.1.5", + "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "79155f94852fa27e2f73b459f6503f5e87e2c188" + "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/79155f94852fa27e2f73b459f6503f5e87e2c188", - "reference": "79155f94852fa27e2f73b459f6503f5e87e2c188", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/ff31ad6efc62e66e518fbab1cde3453d389bcdc8", + "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8", "shasum": "" }, "require": { @@ -4336,24 +4337,24 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.1.5" + "source": "https://github.com/webmozarts/assert/tree/2.1.6" }, - "time": "2026-02-18T14:09:36+00:00" + "time": "2026-02-27T10:28:38+00:00" } ], "packages-dev": [ { "name": "azjezz/psl", - "version": "4.2.1", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/azjezz/psl.git", - "reference": "28c6752857597a1bb6fa8be16678c144b9097ab8" + "reference": "74c95be0214eb7ea39146ed00ac4eb71b45d787b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/azjezz/psl/zipball/28c6752857597a1bb6fa8be16678c144b9097ab8", - "reference": "28c6752857597a1bb6fa8be16678c144b9097ab8", + "url": "https://api.github.com/repos/azjezz/psl/zipball/74c95be0214eb7ea39146ed00ac4eb71b45d787b", + "reference": "74c95be0214eb7ea39146ed00ac4eb71b45d787b", "shasum": "" }, "require": { @@ -4366,7 +4367,7 @@ "revolt/event-loop": "^1.0.7" }, "require-dev": { - "carthage-software/mago": "^1.3.0", + "carthage-software/mago": "^1.6.0", "infection/infection": "^0.31.2", "php-coveralls/php-coveralls": "^2.7.0", "phpbench/phpbench": "^1.4.0", @@ -4404,7 +4405,7 @@ "description": "PHP Standard Library", "support": { "issues": "https://github.com/azjezz/psl/issues", - "source": "https://github.com/azjezz/psl/tree/4.2.1" + "source": "https://github.com/azjezz/psl/tree/4.3.0" }, "funding": [ { @@ -4416,7 +4417,7 @@ "type": "github" } ], - "time": "2026-01-29T12:38:33+00:00" + "time": "2026-02-24T01:58:53+00:00" }, { "name": "composer-unused/contracts", @@ -5486,11 +5487,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.39", + "version": "2.1.40", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c6f73a2af4cbcd99c931d0fb8f08548cc0fa8224", - "reference": "c6f73a2af4cbcd99c931d0fb8f08548cc0fa8224", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", + "reference": "9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", "shasum": "" }, "require": { @@ -5535,7 +5536,7 @@ "type": "github" } ], - "time": "2026-02-11T14:48:56+00:00" + "time": "2026-02-23T15:04:35+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -6096,16 +6097,16 @@ }, { "name": "predis/predis", - "version": "v3.4.0", + "version": "v3.4.1", "source": { "type": "git", "url": "https://github.com/predis/predis.git", - "reference": "1183f5732e6b10efd33f64984a96726eaecb59aa" + "reference": "0850f2f36ee179f0ff96c92c750e1366c6cd754c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/1183f5732e6b10efd33f64984a96726eaecb59aa", - "reference": "1183f5732e6b10efd33f64984a96726eaecb59aa", + "url": "https://api.github.com/repos/predis/predis/zipball/0850f2f36ee179f0ff96c92c750e1366c6cd754c", + "reference": "0850f2f36ee179f0ff96c92c750e1366c6cd754c", "shasum": "" }, "require": { @@ -6147,7 +6148,7 @@ ], "support": { "issues": "https://github.com/predis/predis/issues", - "source": "https://github.com/predis/predis/tree/v3.4.0" + "source": "https://github.com/predis/predis/tree/v3.4.1" }, "funding": [ { @@ -6155,7 +6156,7 @@ "type": "github" } ], - "time": "2026-02-11T17:30:28+00:00" + "time": "2026-02-23T19:51:21+00:00" }, { "name": "revolt/event-loop", @@ -7186,32 +7187,32 @@ }, { "name": "slevomat/coding-standard", - "version": "8.27.1", + "version": "8.28.0", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "29bdaee8b65e7ed2b8e702b01852edba8bae1769" + "reference": "0cd4b30cc1037eca54091c188d260d570e61770c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/29bdaee8b65e7ed2b8e702b01852edba8bae1769", - "reference": "29bdaee8b65e7ed2b8e702b01852edba8bae1769", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/0cd4b30cc1037eca54091c188d260d570e61770c", + "reference": "0cd4b30cc1037eca54091c188d260d570e61770c", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.2.0", "php": "^7.4 || ^8.0", - "phpstan/phpdoc-parser": "^2.3.1", + "phpstan/phpdoc-parser": "^2.3.2", "squizlabs/php_codesniffer": "^4.0.1" }, "require-dev": { - "phing/phing": "3.0.1|3.1.1", + "phing/phing": "3.0.1|3.1.2", "php-parallel-lint/php-parallel-lint": "1.4.0", - "phpstan/phpstan": "2.1.37", - "phpstan/phpstan-deprecation-rules": "2.0.3", - "phpstan/phpstan-phpunit": "2.0.12", - "phpstan/phpstan-strict-rules": "2.0.7", - "phpunit/phpunit": "9.6.31|10.5.60|11.4.4|11.5.49|12.5.7" + "phpstan/phpstan": "2.1.40", + "phpstan/phpstan-deprecation-rules": "2.0.4", + "phpstan/phpstan-phpunit": "2.0.16", + "phpstan/phpstan-strict-rules": "2.0.10", + "phpunit/phpunit": "9.6.34|10.5.63|11.4.4|11.5.50|12.5.14" }, "type": "phpcodesniffer-standard", "extra": { @@ -7235,7 +7236,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.27.1" + "source": "https://github.com/slevomat/coding-standard/tree/8.28.0" }, "funding": [ { @@ -7247,7 +7248,7 @@ "type": "tidelift" } ], - "time": "2026-01-25T15:57:07+00:00" + "time": "2026-02-23T21:35:24+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -7628,16 +7629,16 @@ }, { "name": "symfony/property-info", - "version": "v7.4.5", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "1c9d326bd69602561e2ea467a16c09b5972eee21" + "reference": "6396b28f44d7c28b209a1bd73acf0dd985a0a4ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/1c9d326bd69602561e2ea467a16c09b5972eee21", - "reference": "1c9d326bd69602561e2ea467a16c09b5972eee21", + "url": "https://api.github.com/repos/symfony/property-info/zipball/6396b28f44d7c28b209a1bd73acf0dd985a0a4ef", + "reference": "6396b28f44d7c28b209a1bd73acf0dd985a0a4ef", "shasum": "" }, "require": { @@ -7647,14 +7648,14 @@ "symfony/type-info": "~7.3.10|^7.4.4|^8.0.4" }, "conflict": { - "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1", "symfony/cache": "<6.4", "symfony/dependency-injection": "<6.4", "symfony/serializer": "<6.4" }, "require-dev": { - "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "phpstan/phpdoc-parser": "^1.0|^2.0", "symfony/cache": "^6.4|^7.0|^8.0", "symfony/dependency-injection": "^6.4|^7.0|^8.0", @@ -7694,7 +7695,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.4.5" + "source": "https://github.com/symfony/property-info/tree/v7.4.6" }, "funding": [ { @@ -7714,20 +7715,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T16:16:02+00:00" + "time": "2026-02-13T11:51:31+00:00" }, { "name": "symfony/serializer", - "version": "v7.4.5", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "480cd1237c98ab1219c20945b92c9d4480a44f47" + "reference": "83c3cbd6dcb96c1dbe197499a0714f8dceb0f274" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/480cd1237c98ab1219c20945b92c9d4480a44f47", - "reference": "480cd1237c98ab1219c20945b92c9d4480a44f47", + "url": "https://api.github.com/repos/symfony/serializer/zipball/83c3cbd6dcb96c1dbe197499a0714f8dceb0f274", + "reference": "83c3cbd6dcb96c1dbe197499a0714f8dceb0f274", "shasum": "" }, "require": { @@ -7737,17 +7738,18 @@ "symfony/polyfill-php84": "^1.30" }, "conflict": { - "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1", "symfony/dependency-injection": "<6.4", "symfony/property-access": "<6.4", "symfony/property-info": "<6.4", + "symfony/type-info": "<7.2.5", "symfony/uid": "<6.4", "symfony/validator": "<6.4", "symfony/yaml": "<6.4" }, "require-dev": { - "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "phpstan/phpdoc-parser": "^1.0|^2.0", "seld/jsonlint": "^1.10", "symfony/cache": "^6.4|^7.0|^8.0", @@ -7764,7 +7766,7 @@ "symfony/property-access": "^6.4|^7.0|^8.0", "symfony/property-info": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/type-info": "^7.1.8|^8.0", + "symfony/type-info": "^7.2.5|^8.0", "symfony/uid": "^6.4|^7.0|^8.0", "symfony/validator": "^6.4|^7.0|^8.0", "symfony/var-dumper": "^6.4|^7.0|^8.0", @@ -7797,7 +7799,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.4.5" + "source": "https://github.com/symfony/serializer/tree/v7.4.6" }, "funding": [ { @@ -7817,20 +7819,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T08:59:58+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/translation", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "bfde13711f53f549e73b06d27b35a55207528877" + "reference": "1888cf064399868af3784b9e043240f1d89d25ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/bfde13711f53f549e73b06d27b35a55207528877", - "reference": "bfde13711f53f549e73b06d27b35a55207528877", + "url": "https://api.github.com/repos/symfony/translation/zipball/1888cf064399868af3784b9e043240f1d89d25ce", + "reference": "1888cf064399868af3784b9e043240f1d89d25ce", "shasum": "" }, "require": { @@ -7897,7 +7899,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.4.4" + "source": "https://github.com/symfony/translation/tree/v7.4.6" }, "funding": [ { @@ -7917,20 +7919,20 @@ "type": "tidelift" } ], - "time": "2026-01-13T10:40:19+00:00" + "time": "2026-02-17T07:53:42+00:00" }, { "name": "symfony/type-info", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "f83c725e72b39b2704b9d6fc85070ad6ac7a5889" + "reference": "4855ceea609b2c09e48ff76e12a97a3955531735" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/f83c725e72b39b2704b9d6fc85070ad6ac7a5889", - "reference": "f83c725e72b39b2704b9d6fc85070ad6ac7a5889", + "url": "https://api.github.com/repos/symfony/type-info/zipball/4855ceea609b2c09e48ff76e12a97a3955531735", + "reference": "4855ceea609b2c09e48ff76e12a97a3955531735", "shasum": "" }, "require": { @@ -7980,7 +7982,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.4.4" + "source": "https://github.com/symfony/type-info/tree/v7.4.6" }, "funding": [ { @@ -8000,7 +8002,7 @@ "type": "tidelift" } ], - "time": "2026-01-09T12:14:21+00:00" + "time": "2026-02-17T14:00:31+00:00" }, { "name": "theseer/tokenizer", diff --git a/docs/simplesamlphp-reference-idp-hosted.md b/docs/simplesamlphp-reference-idp-hosted.md index c0873d6fc5..e21c52a49a 100644 --- a/docs/simplesamlphp-reference-idp-hosted.md +++ b/docs/simplesamlphp-reference-idp-hosted.md @@ -403,7 +403,7 @@ See the documentation for those extensions for more details: For other metadata extensions, you can use the `saml:Extensions` option: `saml:Extensions` -: An array of `\SAML2\XML\Chunk`s to include in the IdP metadata extensions, at the same level as `EntityAttributes`. +: An array of `\SimpleSAML\XML\Chunk`s to include in the IdP metadata extensions, at the same level as `EntityAttributes`. `Examples`: @@ -438,11 +438,11 @@ $metadata['https://example.org/saml-idp'] = [ ```php createElementNS('http://eduid.cz/schema/metadata/1.0', 'eduidmd:RepublishRequest'); $republishTarget = $dom->createElementNS('http://eduid.cz/schema/metadata/1.0', 'eduidmd:RepublishTarget', 'http://edugain.org/'); $republishRequest->appendChild($republishTarget); -$ext = [new \SAML2\XML\Chunk($republishRequest)]; +$ext = [new \SimpleSAML\XML\Chunk($republishRequest)]; $metadata['https://example.org/saml-idp'] = [ 'host' => '__DEFAULT__', diff --git a/modules/saml/docs/sp.md b/modules/saml/docs/sp.md index 4bf7c5e7bc..06762700c7 100644 --- a/modules/saml/docs/sp.md +++ b/modules/saml/docs/sp.md @@ -479,9 +479,9 @@ Here we will list some examples for this authentication source. ### Using samlp:Extensions - $dom = \SAML2\DOMDocumentFactory::create(); + $dom = \SimpleSAML\XML\DOMDocumentFactory::create(); $ce = $dom->createElementNS('http://www.example.com/XFoo', 'xfoo:test', 'Test data!'); - $ext[] = new \SAML2\XML\Chunk($ce); + $ext[] = new \SimpleSAML\XML\Chunk($ce); $auth = new \SimpleSAML\Auth\Simple('default-sp'); $auth->login([ diff --git a/modules/saml/src/Controller/WebBrowserSingleSignOn.php b/modules/saml/src/Controller/WebBrowserSingleSignOn.php index 0021c839c8..0fbb2dc625 100644 --- a/modules/saml/src/Controller/WebBrowserSingleSignOn.php +++ b/modules/saml/src/Controller/WebBrowserSingleSignOn.php @@ -7,7 +7,6 @@ use Exception; use SAML2\ArtifactResolve; use SAML2\ArtifactResponse; -use SAML2\DOMDocumentFactory; use SAML2\Exception\Protocol\UnsupportedBindingException; use SAML2\SOAP; use SAML2\XML\saml\Issuer; @@ -20,6 +19,7 @@ use SimpleSAML\Metadata; use SimpleSAML\Module; use SimpleSAML\Store\StoreFactory; +use SimpleSAML\XML\DOMDocumentFactory; /** * Controller class for the Web Browser Single Sign On profile. diff --git a/modules/saml/src/IdP/SAML2.php b/modules/saml/src/IdP/SAML2.php index a850b91c33..81c6a57eba 100644 --- a/modules/saml/src/IdP/SAML2.php +++ b/modules/saml/src/IdP/SAML2.php @@ -11,7 +11,6 @@ use SAML2\AuthnRequest; use SAML2\Binding; use SAML2\Constants; -use SAML2\DOMDocumentFactory; use SAML2\EncryptedAssertion; use SAML2\Exception\Protocol\UnsupportedBindingException; use SAML2\HTTPRedirect; @@ -37,6 +36,7 @@ use SimpleSAML\Module\saml\Message; use SimpleSAML\Stats; use SimpleSAML\Utils; +use SimpleSAML\XML\DOMDocumentFactory; /** * IdP implementation for SAML 2.0 protocol. diff --git a/tests/modules/saml/src/Auth/Source/SPTest.php b/tests/modules/saml/src/Auth/Source/SPTest.php index 94230a2bfa..9fed660f88 100644 --- a/tests/modules/saml/src/Auth/Source/SPTest.php +++ b/tests/modules/saml/src/Auth/Source/SPTest.php @@ -9,12 +9,10 @@ use PHPUnit\Framework\Attributes\DataProvider; use SAML2\AuthnRequest; use SAML2\Constants; -use SAML2\DOMDocumentFactory; use SAML2\Exception\Protocol\NoAvailableIDPException; use SAML2\Exception\Protocol\NoSupportedIDPException; use SAML2\LogoutRequest; use SAML2\Utils; -use SAML2\XML\Chunk; use SAML2\XML\saml\NameID; use SimpleSAML\Assert\AssertionFailedException; use SimpleSAML\Configuration; @@ -24,6 +22,8 @@ use SimpleSAML\Test\Utils\ExitTestException; use SimpleSAML\Test\Utils\SpTester; use SimpleSAML\TestUtils\ClearStateTestCase; +use SimpleSAML\XML\Chunk; +use SimpleSAML\XML\DOMDocumentFactory; /** * Set of test cases for \SimpleSAML\Module\saml\Auth\Source\SP. diff --git a/tests/modules/saml/src/IdP/SAML2Test.php b/tests/modules/saml/src/IdP/SAML2Test.php index 484cfb1d81..adf4caf0bc 100644 --- a/tests/modules/saml/src/IdP/SAML2Test.php +++ b/tests/modules/saml/src/IdP/SAML2Test.php @@ -6,13 +6,14 @@ use InvalidArgumentException; use PHPUnit\Framework\Attributes\CoversClass; -use SAML2\XML\Chunk; use SimpleSAML\Configuration; use SimpleSAML\Error\Exception; use SimpleSAML\IdP; use SimpleSAML\Metadata\MetaDataStorageHandlerSerialize; use SimpleSAML\Module\saml\IdP\SAML2; use SimpleSAML\TestUtils\ClearStateTestCase; +use SimpleSAML\XML\Chunk; +use SimpleSAML\XML\DOMDocumentFactory; /** */ @@ -589,7 +590,7 @@ public function testMetadataHostedEntityAttributes(): void */ public function testMetadataHostedEntityExtensions(): void { - $dom = \SAML2\DOMDocumentFactory::create(); + $dom = DOMDocumentFactory::create(); $republishRequest = $dom->createElementNS('http://eduid.cz/schema/metadata/1.0', 'eduidmd:RepublishRequest'); $republishTarget = $dom->createElementNS( 'http://eduid.cz/schema/metadata/1.0', diff --git a/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php b/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php index b6ceb5a98c..6fa53fc7c1 100644 --- a/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php +++ b/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php @@ -9,6 +9,8 @@ use SimpleSAML\Configuration; use SimpleSAML\Metadata\SAMLBuilder; use SimpleSAML\Module\saml\Auth\Source\SP; +use SimpleSAML\XML\Chunk; +use SimpleSAML\XML\DOMDocumentFactory; /** * Class SAMLBuilderTest @@ -272,7 +274,7 @@ public function testCustomMetadataExtension(): void $entityId = 'https://entity.example.com/id'; $set = 'saml20-idp-remote'; - $dom = \SAML2\DOMDocumentFactory::create(); + $dom = DOMDocumentFactory::create(); $republishRequest = $dom->createElementNS( 'http://eduid.cz/schema/metadata/1.0', 'eduidmd:RepublishRequest', @@ -284,7 +286,7 @@ public function testCustomMetadataExtension(): void $republishTargetContent, ); $republishRequest->appendChild($republishTarget); - $ext = [new \SAML2\XML\Chunk($republishRequest)]; + $ext = [new Chunk($republishRequest)]; $metadata = [ 'entityid' => $entityId, diff --git a/tests/src/SimpleSAML/Metadata/SAMLParserTest.php b/tests/src/SimpleSAML/Metadata/SAMLParserTest.php index 99936cf90e..58d1c38730 100644 --- a/tests/src/SimpleSAML/Metadata/SAMLParserTest.php +++ b/tests/src/SimpleSAML/Metadata/SAMLParserTest.php @@ -7,9 +7,9 @@ use DOMDocument; use PHPUnit\Framework\Attributes\CoversClass; use SAML2\Constants; -use SAML2\DOMDocumentFactory; use SimpleSAML\Metadata\SAMLParser; use SimpleSAML\Test\SigningTestCase; +use SimpleSAML\XML\DOMDocumentFactory; use SimpleSAML\XML\Signer; /** diff --git a/tests/src/SimpleSAML/Utils/XMLTest.php b/tests/src/SimpleSAML/Utils/XMLTest.php index 5ea184621a..bd2397f1f6 100644 --- a/tests/src/SimpleSAML/Utils/XMLTest.php +++ b/tests/src/SimpleSAML/Utils/XMLTest.php @@ -11,8 +11,8 @@ use InvalidArgumentException; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; -use SAML2\DOMDocumentFactory; use SimpleSAML\Utils; +use SimpleSAML\XML\DOMDocumentFactory; /** * Tests for SimpleSAML\Utils\XML. diff --git a/tests/src/SimpleSAML/XML/SignerTest.php b/tests/src/SimpleSAML/XML/SignerTest.php index d5eee37c50..3988c77e3d 100644 --- a/tests/src/SimpleSAML/XML/SignerTest.php +++ b/tests/src/SimpleSAML/XML/SignerTest.php @@ -9,9 +9,9 @@ use Exception; use PHPUnit\Framework\Attributes\CoversClass; use ReflectionClass; -use SAML2\DOMDocumentFactory; use SimpleSAML\Configuration; use SimpleSAML\Test\SigningTestCase; +use SimpleSAML\XML\DOMDocumentFactory; use SimpleSAML\XML\Signer; /** diff --git a/tests/src/SimpleSAML/XML/ValidatorTest.php b/tests/src/SimpleSAML/XML/ValidatorTest.php index c33290a57e..8bcce88883 100644 --- a/tests/src/SimpleSAML/XML/ValidatorTest.php +++ b/tests/src/SimpleSAML/XML/ValidatorTest.php @@ -7,8 +7,8 @@ use DOMElement; use Exception; use PHPUnit\Framework\Attributes\CoversClass; -use SAML2\DOMDocumentFactory; use SimpleSAML\Test\SigningTestCase; +use SimpleSAML\XML\DOMDocumentFactory; use SimpleSAML\XML\Signer; use SimpleSAML\XML\Validator; From e0d214133e32108ccddcaf21aeca3fbfdb3d37ab Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 2 Mar 2026 21:34:52 +0100 Subject: [PATCH 448/532] Fix PHPstan-issues (src) --- .github/workflows/php.yml | 27 +-- composer.lock | 12 +- phpstan-dev.neon | 6 + phpstan.neon | 6 + psalm-dev.xml | 179 ------------------ psalm.xml | 83 -------- src/SimpleSAML/Auth/ProcessingChain.php | 2 - src/SimpleSAML/Auth/ProcessingFilter.php | 1 + src/SimpleSAML/Auth/Source.php | 1 + .../Command/SspCacheClearCommand.php | 30 ++- .../UpdateTranslatableStringsCommand.php | 8 +- src/SimpleSAML/Compat/SspContainer.php | 2 +- src/SimpleSAML/Configuration.php | 3 +- src/SimpleSAML/Error/ConfigurationError.php | 1 + src/SimpleSAML/Error/Error.php | 2 +- src/SimpleSAML/Error/ErrorHandler.php | 1 - .../Event/Provider/ModuleListenerProvider.php | 1 + src/SimpleSAML/HTTP/RunnableResponse.php | 2 +- src/SimpleSAML/IdP.php | 1 - src/SimpleSAML/Locale/Translate.php | 5 - src/SimpleSAML/Logger.php | 1 - .../Metadata/MetaDataStorageHandler.php | 2 +- .../Metadata/MetaDataStorageHandlerPdo.php | 1 + src/SimpleSAML/Metadata/SAMLParser.php | 8 +- src/SimpleSAML/Metadata/Signer.php | 2 +- src/SimpleSAML/Module.php | 2 +- src/SimpleSAML/Stats/Output.php | 1 + src/SimpleSAML/Store/StoreFactory.php | 2 +- src/SimpleSAML/Utils/HTTP.php | 6 +- src/SimpleSAML/Utils/XML.php | 13 +- src/SimpleSAML/XHTML/Template.php | 2 +- 31 files changed, 84 insertions(+), 329 deletions(-) create mode 100644 phpstan-dev.neon create mode 100644 phpstan.neon delete mode 100644 psalm-dev.xml delete mode 100644 psalm.xml diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 5b9ff4472a..e60aa3ab74 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -166,7 +166,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: '8.5' - tools: composer, psalm + tools: composer extensions: mbstring, soap, xml coverage: none @@ -204,30 +204,13 @@ jobs: - name: PHP Code Sniffer run: vendor/bin/phpcs - - name: Psalm - continue-on-error: true - run: | - psalm \ - -c psalm.xml \ - --show-info=true \ - --shepherd \ - --php-version=${{ steps.setup-php.outputs.php-version }} - - - name: Psalm (testsuite) - continue-on-error: true + - name: PHPStan run: | - psalm \ - -c psalm-dev.xml \ - --show-info=true \ - --shepherd \ - --php-version=${{ steps.setup-php.outputs.php-version }} + vendor/bin/phpstan analyze -c phpstan.neon - - name: Psalter + - name: PHPStan (testsuite) run: | - psalm --alter \ - --issues=UnnecessaryVarAnnotation \ - --dry-run \ - --php-version=${{ steps.setup-php.outputs.php-version }} + vendor/bin/phpstan analyze -c phpstan-dev.neon - name: Check for unused translations continue-on-error: true diff --git a/composer.lock b/composer.lock index ac47981ecb..d9e09ae561 100644 --- a/composer.lock +++ b/composer.lock @@ -950,16 +950,16 @@ }, { "name": "simplesamlphp/assert", - "version": "v2.0.0", + "version": "v2.0.1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/assert.git", - "reference": "773e87980de4d0977f4b4c292bb0b5d8247813de" + "reference": "86b10121d5620aaa89f7448a9c8a401380c71f51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/773e87980de4d0977f4b4c292bb0b5d8247813de", - "reference": "773e87980de4d0977f4b4c292bb0b5d8247813de", + "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/86b10121d5620aaa89f7448a9c8a401380c71f51", + "reference": "86b10121d5620aaa89f7448a9c8a401380c71f51", "shasum": "" }, "require": { @@ -1003,9 +1003,9 @@ "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments", "support": { "issues": "https://github.com/simplesamlphp/assert/issues", - "source": "https://github.com/simplesamlphp/assert/tree/v2.0.0" + "source": "https://github.com/simplesamlphp/assert/tree/v2.0.1" }, - "time": "2026-02-03T14:33:49+00:00" + "time": "2026-03-02T19:58:46+00:00" }, { "name": "simplesamlphp/composer-module-installer", diff --git a/phpstan-dev.neon b/phpstan-dev.neon new file mode 100644 index 0000000000..37375608cc --- /dev/null +++ b/phpstan-dev.neon @@ -0,0 +1,6 @@ +parameters: + level: 3 + paths: + - tests +#includes: +# - phpstan-baseline-dev.neon diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000000..b29cf81faf --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,6 @@ +parameters: + level: 3 + paths: + - src +#includes: +# - phpstan-baseline.neon diff --git a/psalm-dev.xml b/psalm-dev.xml deleted file mode 100644 index d9e4d0b261..0000000000 --- a/psalm-dev.xml +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/psalm.xml b/psalm.xml deleted file mode 100644 index 672b82ee64..0000000000 --- a/psalm.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/SimpleSAML/Auth/ProcessingChain.php b/src/SimpleSAML/Auth/ProcessingChain.php index 10b0982b06..b2997429a1 100644 --- a/src/SimpleSAML/Auth/ProcessingChain.php +++ b/src/SimpleSAML/Auth/ProcessingChain.php @@ -326,7 +326,6 @@ public static function fetchProcessedState(string $id): ?array /** * @param array $state - * @psalm-param array{"\\\SimpleSAML\\\Auth\\\ProcessingChain.filters": array} $state * @param \SimpleSAML\Auth\ProcessingFilter[] $authProcs */ public static function insertFilters(array &$state, array $authProcs): void @@ -347,7 +346,6 @@ public static function insertFilters(array &$state, array $authProcs): void /** * @param array $state - * @psalm-param array{"\\\SimpleSAML\\\Auth\\\ProcessingChain.filters": array} $state * @param array $authProcConfigs * @return \SimpleSAML\Auth\ProcessingFilter[] */ diff --git a/src/SimpleSAML/Auth/ProcessingFilter.php b/src/SimpleSAML/Auth/ProcessingFilter.php index e920a68d62..54039581ba 100644 --- a/src/SimpleSAML/Auth/ProcessingFilter.php +++ b/src/SimpleSAML/Auth/ProcessingFilter.php @@ -50,6 +50,7 @@ abstract class ProcessingFilter * * @param array &$config Configuration for this filter. * @param mixed $reserved For future use. + * @phpstan-ignore constructor.unusedParameter */ public function __construct(array &$config, /** @scrutinizer ignore-unused */ $reserved) { diff --git a/src/SimpleSAML/Auth/Source.php b/src/SimpleSAML/Auth/Source.php index d41b4c5456..d9f1ca4478 100644 --- a/src/SimpleSAML/Auth/Source.php +++ b/src/SimpleSAML/Auth/Source.php @@ -39,6 +39,7 @@ abstract class Source * * @param array $info Information about this authentication source. * @param array &$config Configuration for this authentication source. + * @phpstan-ignore constructor.unusedParameter */ public function __construct(array $info, array &$config) { diff --git a/src/SimpleSAML/Command/SspCacheClearCommand.php b/src/SimpleSAML/Command/SspCacheClearCommand.php index f5bee7b133..272249dc94 100644 --- a/src/SimpleSAML/Command/SspCacheClearCommand.php +++ b/src/SimpleSAML/Command/SspCacheClearCommand.php @@ -7,6 +7,7 @@ use SimpleSAML\Configuration; use SimpleSAML\Error\CriticalConfigurationError; use SimpleSAML\Kernel; +use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Exception\RuntimeException; @@ -20,6 +21,8 @@ use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Finder\Finder; use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface; +use Symfony\Component\HttpKernel\Kernel as BaseKernel; +use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\HttpKernel\RebootableInterface; #[AsCommand( @@ -34,6 +37,9 @@ class SspCacheClearCommand extends Command /** @var array */ private array $enabledModules; + /** @var \Symfony\Component\HttpKernel\KernelInterface */ + private KernelInterface $temporaryKernel; + /** * @param \Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface $cacheClearer @@ -45,6 +51,24 @@ public function __construct( ) { parent::__construct(); $this->filesystem = $filesystem ?? new Filesystem(); + + $this->temporaryKernel = new class ('test', true) extends BaseKernel { + public function registerBundles(): iterable + { + return []; + } + + + public function registerContainerConfiguration(LoaderInterface $loader): void + { + } + + + public function getContainerClass(): string + { + return parent::getContainerClass(); + } + }; } @@ -71,7 +95,7 @@ protected function configure(): void /** * @param \Symfony\Component\Console\Input\InputInterface $input - * @param \Symfony\Component\Console\Input\OutputInterface $output + * @param \Symfony\Component\Console\Output\OutputInterface $output * * @throws \Symfony\Component\Console\Exception\ExceptionInterface */ @@ -292,7 +316,7 @@ private function isNfs(string $dir): bool private function warmup(string $warmupDir, string $realBuildDir): void { // create a temporary kernel - $kernel = $this->getApplication()->getKernel(); + $kernel = $this->temporaryKernel; if (!$kernel instanceof RebootableInterface) { $throwMessage = 'Calling "cache:clear" with a kernel that does not implement ' . '"Symfony\Component\HttpKernel\RebootableInterface" is not supported.'; @@ -309,7 +333,7 @@ private function warmup(string $warmupDir, string $realBuildDir): void */ private function warmupOptionals(string $cacheDir, string $warmupDir, SymfonyStyle $io): void { - $kernel = $this->getApplication()->getKernel(); + $kernel = $this->temporaryKernel; $warmer = $kernel->getContainer()->get('cache_warmer'); // non optional warmers already ran during container compilation $warmer->enableOnlyOptionalWarmers(); diff --git a/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php b/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php index 215799865b..04b842851c 100644 --- a/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php +++ b/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php @@ -4,6 +4,7 @@ namespace SimpleSAML\Command; +use ArrayIterator; use Gettext\Generator\PoGenerator; use Gettext\Loader\PoLoader; use Gettext\Merge; @@ -82,10 +83,10 @@ protected function configure(): void * This can be useful as the entries are cloned in the iterator order. * * @param \Gettext\Translations $ret - * @param iterable $iterator - * @return $ret + * @param \ArrayIterator $iterator + * @return \Gettext\Translations $ret */ - protected function cloneIteratorToTranslations(Translations $ret, iterable $iterator): Translations + protected function cloneIteratorToTranslations(Translations $ret, ArrayIterator $iterator): Translations { while ($iterator->valid()) { $ret->addOrMerge( @@ -219,6 +220,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int // // Sort the translations in a predictable way // + /** @var \ArrayIterator $iter */ $iter = $merged->getIterator(); $iter->ksort(); $merged = $this->cloneIteratorToTranslations( diff --git a/src/SimpleSAML/Compat/SspContainer.php b/src/SimpleSAML/Compat/SspContainer.php index bf6d8d2fd2..224b6c8898 100644 --- a/src/SimpleSAML/Compat/SspContainer.php +++ b/src/SimpleSAML/Compat/SspContainer.php @@ -94,7 +94,7 @@ public function getTempDir(): string /** * {@inheritdoc} * @param string $filename - * @param string $date + * @param string $data * @param int|null $mode */ public function writeFile(string $filename, string $data, ?int $mode = null): void diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index 92fa709ed0..887a555c0f 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -1068,7 +1068,7 @@ public function getOptionalArrayizeString(string $name, ?array $default): ?array { $ret = $this->getOptionalArrayize($name, $default); - Assert::nullOrAllString( + Assert::allNullOrString( $ret, sprintf( '%s: The option %s must be null, a string or an array of strings.', @@ -1342,7 +1342,6 @@ public function getDefaultEndpoint( * The default language returned is always 'en'. * * @param string $name The name of the option. - * @param array $default The default value. * * @return array Associative array with language => string pairs. * diff --git a/src/SimpleSAML/Error/ConfigurationError.php b/src/SimpleSAML/Error/ConfigurationError.php index b9bd562d3c..4215964f36 100644 --- a/src/SimpleSAML/Error/ConfigurationError.php +++ b/src/SimpleSAML/Error/ConfigurationError.php @@ -33,6 +33,7 @@ class ConfigurationError extends Error * @param string|null $reason The reason for this exception. * @param string|null $file The configuration file that originated this error. * @param array|null $config The configuration array that led to this problem. + * @phpstan-ignore constructor.unusedParameter */ public function __construct(?string $reason = null, ?string $file = null, ?array $config = null) { diff --git a/src/SimpleSAML/Error/Error.php b/src/SimpleSAML/Error/Error.php index d2e4073649..21a3b0eb66 100644 --- a/src/SimpleSAML/Error/Error.php +++ b/src/SimpleSAML/Error/Error.php @@ -122,7 +122,7 @@ public function __construct( * This has to be public to allow Login to get an object * containing custom error codes if they in use. * - * @return \SimpleSAML\Erorr\ErrorCodes + * @return \SimpleSAML\Error\ErrorCodes */ public function getErrorCodes(): ErrorCodes { diff --git a/src/SimpleSAML/Error/ErrorHandler.php b/src/SimpleSAML/Error/ErrorHandler.php index e349b499c4..d53f94e617 100644 --- a/src/SimpleSAML/Error/ErrorHandler.php +++ b/src/SimpleSAML/Error/ErrorHandler.php @@ -20,7 +20,6 @@ class ErrorHandler * @param string $errstr * @param string|null $errfile * @param int $errline - * @param string|null $errcontext * @return false */ public function customErrorHandler( diff --git a/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php b/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php index 664fae43e1..db5cacfcc7 100644 --- a/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php +++ b/src/SimpleSAML/Event/Provider/ModuleListenerProvider.php @@ -60,6 +60,7 @@ private function registerListenerClass(string $className): void $params = $method->getParameters(); if (count($params) > 0) { + /** @var \ReflectionNamedType $eventType */ $eventType = $params[0]->getType(); if ($eventType && !$eventType->isBuiltin()) { $eventClass = $eventType->getName(); diff --git a/src/SimpleSAML/HTTP/RunnableResponse.php b/src/SimpleSAML/HTTP/RunnableResponse.php index 738acf0431..19618464fd 100644 --- a/src/SimpleSAML/HTTP/RunnableResponse.php +++ b/src/SimpleSAML/HTTP/RunnableResponse.php @@ -24,7 +24,7 @@ class RunnableResponse extends Response * RunnableResponse constructor. * * @param callable $callable A callable that we should run as part of this response. - * @param array $args An array of arguments to be passed to the callable. Note that each element of the array + * @param array $arguments An array of arguments to be passed to the callable. Note that each element of the array */ public function __construct( callable $callable, diff --git a/src/SimpleSAML/IdP.php b/src/SimpleSAML/IdP.php index dd510345fd..97da6a5ed3 100644 --- a/src/SimpleSAML/IdP.php +++ b/src/SimpleSAML/IdP.php @@ -437,7 +437,6 @@ public function getLogoutHandler(): LogoutHandlerInterface throw new Error\Exception('Unknown logout handler: ' . var_export($logouttype, true)); } - /** @var \SimpleSAML\IdP\LogoutHandlerInterface */ return new $handler($this); } diff --git a/src/SimpleSAML/Locale/Translate.php b/src/SimpleSAML/Locale/Translate.php index 03416ebac1..eab4a838d9 100644 --- a/src/SimpleSAML/Locale/Translate.php +++ b/src/SimpleSAML/Locale/Translate.php @@ -83,11 +83,6 @@ public static function addDefaultDomain(string $domain): void * which will pass the following arguments. * The $id will match $original above but there are other arguments which may also be used in this method. * - * @param string $id - * @param array $parameters - * @param string|null $domain - * @param string|null $locale - * * @return string The translated string. */ public static function translateSingularGettext(?string $original): string diff --git a/src/SimpleSAML/Logger.php b/src/SimpleSAML/Logger.php index 2c7b7a438b..a318751c9a 100644 --- a/src/SimpleSAML/Logger.php +++ b/src/SimpleSAML/Logger.php @@ -479,7 +479,6 @@ private static function createLoggingHandler(?string $handler = null): void self::$format = $config->getOptionalString('logging.format', self::$format); try { - /** @var \SimpleSAML\Logger\LoggingHandlerInterface */ self::$loggingHandler = new $handler($config); self::$loggingHandler->setLogFormat(self::$format); self::$initializing = false; diff --git a/src/SimpleSAML/Metadata/MetaDataStorageHandler.php b/src/SimpleSAML/Metadata/MetaDataStorageHandler.php index 46e84cabe9..ccd7627c87 100644 --- a/src/SimpleSAML/Metadata/MetaDataStorageHandler.php +++ b/src/SimpleSAML/Metadata/MetaDataStorageHandler.php @@ -27,7 +27,7 @@ class MetaDataStorageHandler implements ClearableState * * @var \SimpleSAML\Metadata\MetaDataStorageHandler|null */ - private static ?MetadataStorageHandler $metadataHandler = null; + private static ?MetaDataStorageHandler $metadataHandler = null; /** * This is a list of all the metadata sources we have in our metadata diff --git a/src/SimpleSAML/Metadata/MetaDataStorageHandlerPdo.php b/src/SimpleSAML/Metadata/MetaDataStorageHandlerPdo.php index 55d7799aea..3c851fd9ed 100644 --- a/src/SimpleSAML/Metadata/MetaDataStorageHandlerPdo.php +++ b/src/SimpleSAML/Metadata/MetaDataStorageHandlerPdo.php @@ -58,6 +58,7 @@ class MetaDataStorageHandlerPdo extends MetaDataStorageSource * - 'password': Password for the database user. * * @param array $config An associative array with the configuration for this handler. + * @phpstan-ignore constructor.unusedParameter */ public function __construct(/** @scrutinizer ignore-unused */ array $config) { diff --git a/src/SimpleSAML/Metadata/SAMLParser.php b/src/SimpleSAML/Metadata/SAMLParser.php index cb8a693a6c..f5196a61b9 100644 --- a/src/SimpleSAML/Metadata/SAMLParser.php +++ b/src/SimpleSAML/Metadata/SAMLParser.php @@ -8,8 +8,6 @@ use DOMElement; use Exception; use RobRichards\XMLSecLibs\XMLSecurityKey; -use SAML2\Constants; -use SAML2\DOMDocumentFactory; use SAML2\SignedElementHelper; use SAML2\XML\ds\X509Certificate; use SAML2\XML\ds\X509Data; @@ -36,7 +34,9 @@ use SAML2\XML\shibmd\Scope; use SimpleSAML\Assert\Assert; use SimpleSAML\Logger; +use SimpleSAML\SAML2\Constants; use SimpleSAML\Utils; +use SimpleSAML\XML\DOMDocumentFactory; use Symfony\Component\Filesystem\Filesystem; use function array_diff; @@ -312,8 +312,8 @@ public static function parseDescriptorsFile(string $file, array $context = []): throw new Exception('Cannot open file; file name not specified.'); } - /** @var string $data */ $httpUtils = new Utils\HTTP(); + /** @var string $data */ $data = $httpUtils->fetch($file, $context); try { @@ -333,7 +333,7 @@ public static function parseDescriptorsFile(string $file, array $context = []): * * @param string $string The string with XML data. * - * @return \SimpleSAML\Metadata]SAMLParser[] An associative array of SAMLParser instances. + * @return \SimpleSAML\Metadata\SAMLParser[] An associative array of SAMLParser instances. * The key of the array will be the entity id. * @throws \Exception If the string does not parse as XML. */ diff --git a/src/SimpleSAML/Metadata/Signer.php b/src/SimpleSAML/Metadata/Signer.php index f78d15f937..3271af07dd 100644 --- a/src/SimpleSAML/Metadata/Signer.php +++ b/src/SimpleSAML/Metadata/Signer.php @@ -7,10 +7,10 @@ use Exception; use RobRichards\XMLSecLibs\XMLSecurityDSig; use RobRichards\XMLSecLibs\XMLSecurityKey; -use SAML2\DOMDocumentFactory; use SimpleSAML\Configuration; use SimpleSAML\Error; use SimpleSAML\Utils; +use SimpleSAML\XML\DOMDocumentFactory; use function array_key_exists; use function hash; diff --git a/src/SimpleSAML/Module.php b/src/SimpleSAML/Module.php index 249b7961db..e32b20381d 100644 --- a/src/SimpleSAML/Module.php +++ b/src/SimpleSAML/Module.php @@ -486,7 +486,7 @@ public static function resolveClass(string $id, string $type, ?string $subclass /** * Create an object of a class returned by resolveNonModuleClass() or resolveClass(). * - * @param string The classname. + * @param string $className The classname. * @param string|null $subclass The class should be a subclass of this class. Optional. * * @return object The new object diff --git a/src/SimpleSAML/Stats/Output.php b/src/SimpleSAML/Stats/Output.php index 5ea75fcf90..1dfc818f7d 100644 --- a/src/SimpleSAML/Stats/Output.php +++ b/src/SimpleSAML/Stats/Output.php @@ -17,6 +17,7 @@ abstract class Output * Initialize the output. * * @param \SimpleSAML\Configuration $config The configuration for this output. + * @phpstan-ignore constructor.unusedParameter */ public function __construct(/** @scrutinizer ignore-unused */ Configuration $config) { diff --git a/src/SimpleSAML/Store/StoreFactory.php b/src/SimpleSAML/Store/StoreFactory.php index 2e5289c93b..9009aed076 100644 --- a/src/SimpleSAML/Store/StoreFactory.php +++ b/src/SimpleSAML/Store/StoreFactory.php @@ -69,7 +69,7 @@ public static function getInstance(string $storeType): StoreInterface|false $c, ); } - /** @var \SimpleSAML\Store\StoreInterface|false */ + self::$instance = new $className(); } diff --git a/src/SimpleSAML/Utils/HTTP.php b/src/SimpleSAML/Utils/HTTP.php index b3e03e6239..c463d3b8e1 100644 --- a/src/SimpleSAML/Utils/HTTP.php +++ b/src/SimpleSAML/Utils/HTTP.php @@ -513,7 +513,7 @@ public function fetch(string $url, array $context = [], bool $getHeaders = false if (PHP_VERSION_ID > 80500) { $http_response_headers = http_get_last_response_headers(); } else { - $http_response_headers = $http_response_header ?? []; + $http_response_headers = $http_response_header; } if (!empty($http_response_headers)) { $headers = []; @@ -743,7 +743,7 @@ public function getSelfHostWithNonStandardPort(): string { $url = $this->getBaseURL(); - /** @var int $colon getBaseURL() will always return a valid URL */ + /** @var int<0, max>|false $colon getBaseURL() will always return a valid URL */ $colon = strpos($url, '://'); $start = $colon + 3; $length = strcspn($url, '/', $start); @@ -862,7 +862,7 @@ public function getSelfURLHost(): string { $url = $this->getSelfURL(); - /** @var int $colon getBaseURL() will always return a valid URL */ + /** @var int<0, max>|false $colon getBaseURL() will always return a valid URL */ $colon = strpos($url, '://'); $start = $colon + 3; $length = strcspn($url, '/', $start) + $start; diff --git a/src/SimpleSAML/Utils/XML.php b/src/SimpleSAML/Utils/XML.php index c51a1e067d..3646cc462f 100644 --- a/src/SimpleSAML/Utils/XML.php +++ b/src/SimpleSAML/Utils/XML.php @@ -17,12 +17,13 @@ use DOMNode; use DOMText; use Exception; -use SAML2\Constants as C; -use SAML2\DOMDocumentFactory; +use InvalidArgumentException; use SimpleSAML\Assert\Assert; use SimpleSAML\Configuration; use SimpleSAML\Error; use SimpleSAML\Logger; +use SimpleSAML\SAML2\Constants as C; +use SimpleSAML\XML\DOMDocumentFactory; use SimpleSAML\XML\Errors; class XML @@ -44,7 +45,7 @@ public function checkSAMLMessage(string $message, string $type): void { $allowed_types = ['saml20', 'saml-meta']; if (!in_array($type, $allowed_types, true)) { - throw new \InvalidArgumentException('Invalid input parameters.'); + throw new InvalidArgumentException('Invalid input parameters.'); } // a SAML message should not contain a doctype-declaration @@ -271,7 +272,7 @@ public function isDOMNodeOfType(DOMNode $element, string $name, string $nsURI): if ($nsURI[0] === '@') { // the defined shortcuts $shortcuts = [ - '@ds' => 'http://www.w3.org/2000/09/xmldsig#', + '@ds' => C::NS_XDSIG, '@md' => C::NS_MD, '@saml2' => C::NS_SAML, '@saml2p' => C::NS_SAMLP, @@ -279,7 +280,7 @@ public function isDOMNodeOfType(DOMNode $element, string $name, string $nsURI): // check if it is a valid shortcut if (!array_key_exists($nsURI, $shortcuts)) { - throw new \InvalidArgumentException('Unknown namespace shortcut: ' . $nsURI); + throw new InvalidArgumentException('Unknown namespace shortcut: ' . $nsURI); } // expand the shortcut @@ -351,7 +352,7 @@ function ( }, ); - /** @psalm-suppress PossiblyUndefinedVariable */ + /** @phpstan-ignore variable.undefined */ $res = $dom->schemaValidate($schemaFile); if ($res) { Errors::end(); diff --git a/src/SimpleSAML/XHTML/Template.php b/src/SimpleSAML/XHTML/Template.php index b0fac429f8..9bc6039a17 100644 --- a/src/SimpleSAML/XHTML/Template.php +++ b/src/SimpleSAML/XHTML/Template.php @@ -250,7 +250,7 @@ private function normalizeTemplateName(string $templateName): string /** * Set up the places where twig can look for templates. * - * @return \SimpleSAML\XHMTL\TemplateLoader The twig template loader or false if the template does not exist. + * @return \SimpleSAML\XHTML\TemplateLoader The twig template loader or false if the template does not exist. * @throws \Twig\Error\LoaderError In case a failure occurs. */ private function setupTwigTemplatepaths(): TemplateLoader From fc8af4acf26ad08ffd442d80e3caf3be073b6639 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 2 Mar 2026 22:51:22 +0100 Subject: [PATCH 449/532] Fix PHPstan-issues (tests) --- .../admin/src/Controller/ConfigTest.php | 6 ++-- .../core/src/Controller/LogoutTest.php | 2 +- .../src/Auth/Source/MultiAuthTest.php | 2 ++ .../src/Controller/DiscoControllerTest.php | 5 ++++ tests/modules/saml/src/Auth/Source/SPTest.php | 22 +++++---------- .../saml/src/Controller/MetadataTest.php | 2 +- .../src/Controller/ServiceProviderTest.php | 16 +++++------ tests/src/SimpleSAML/DatabaseTest.php | 2 +- .../SimpleSAML/Metadata/SAMLBuilderTest.php | 2 -- .../src/SimpleSAML/SessionHandlerPHPTest.php | 3 ++ tests/src/SimpleSAML/SessionTest.php | 2 ++ .../XHTML/TemplateTranslationTest.php | 28 +++---------------- tests/src/SimpleSAML/XML/ParserTest.php | 2 +- 13 files changed, 37 insertions(+), 57 deletions(-) diff --git a/tests/modules/admin/src/Controller/ConfigTest.php b/tests/modules/admin/src/Controller/ConfigTest.php index 384e30633a..80053bc606 100644 --- a/tests/modules/admin/src/Controller/ConfigTest.php +++ b/tests/modules/admin/src/Controller/ConfigTest.php @@ -5,6 +5,7 @@ namespace SimpleSAML\Test\Module\admin\Controller; use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use SimpleSAML\Configuration; use SimpleSAML\Module\admin\Controller; @@ -26,8 +27,8 @@ class ConfigTest extends TestCase /** @var \SimpleSAML\Utils\Auth */ protected Utils\Auth $authUtils; - /** @var \SimpleSAML\Session */ - protected Session $session; + /** @var \SimpleSAML\Session&\PHPUnit\Framework\MockObject\MockObject */ + protected Session&MockObject $session; /** @@ -69,7 +70,6 @@ public function requireAdmin(): void $session = $this->createMock(Session::class); $session->method('getData')->willReturn(['tag_name' => 'v1.18.7', 'html_url' => 'https://example.org']); - /** @var \SimpleSAML\Session $session */ $this->session = $session; } diff --git a/tests/modules/core/src/Controller/LogoutTest.php b/tests/modules/core/src/Controller/LogoutTest.php index 90dce57a2a..0b045a1002 100644 --- a/tests/modules/core/src/Controller/LogoutTest.php +++ b/tests/modules/core/src/Controller/LogoutTest.php @@ -68,7 +68,7 @@ public function testLogout(): void $this->assertInstanceOf(RunnableResponse::class, $response); $this->assertTrue($response->isSuccessful()); - /** @psalm-var array $callable */ + /** @var callable $callable */ $callable = $response->getCallable(); $this->assertInstanceOf(Auth\Simple::class, $callable[0]); $this->assertEquals('logout', $callable[1]); diff --git a/tests/modules/multiauth/src/Auth/Source/MultiAuthTest.php b/tests/modules/multiauth/src/Auth/Source/MultiAuthTest.php index c42b2b62d1..9f29166e91 100644 --- a/tests/modules/multiauth/src/Auth/Source/MultiAuthTest.php +++ b/tests/modules/multiauth/src/Auth/Source/MultiAuthTest.php @@ -26,6 +26,8 @@ class MultiAuthTest extends ClearStateTestCase */ public function setUp(): void { + parent::setUp(); + $this->config = Configuration::loadFromArray( ['module.enable' => ['multiauth' => true]], '[ARRAY]', diff --git a/tests/modules/multiauth/src/Controller/DiscoControllerTest.php b/tests/modules/multiauth/src/Controller/DiscoControllerTest.php index 278c34c4cf..955f1a96a8 100644 --- a/tests/modules/multiauth/src/Controller/DiscoControllerTest.php +++ b/tests/modules/multiauth/src/Controller/DiscoControllerTest.php @@ -132,6 +132,7 @@ public function __construct() public function authenticate(array &$state): never { // stub + exit(); } @@ -188,6 +189,7 @@ public function __construct() public function authenticate(array &$state): never { // stub + exit(); } @@ -246,6 +248,7 @@ public function __construct() public function authenticate(array &$state): never { // stub + exit(); } @@ -304,6 +307,7 @@ public function __construct() public function authenticate(array &$state): never { // stub + exit(); } @@ -360,6 +364,7 @@ public function __construct() public function authenticate(array &$state): never { // stub + exit(); } diff --git a/tests/modules/saml/src/Auth/Source/SPTest.php b/tests/modules/saml/src/Auth/Source/SPTest.php index 9fed660f88..08b7a353d1 100644 --- a/tests/modules/saml/src/Auth/Source/SPTest.php +++ b/tests/modules/saml/src/Auth/Source/SPTest.php @@ -125,16 +125,13 @@ private function createAuthnRequest(array $state = []): AuthnRequest $config = ['entityID' => 'urn:x-simplesamlphp:example-sp']; $as = new SpTester($info, $config); - /** @var \SAML2\AuthnRequest $ar */ - $ar = null; try { $as->startSSO2Test($this->getIdpMetadata(), $state); - $this->assertTrue(false, 'Expected ExitTestException'); + $this->fail('Expected ExitTestException'); } catch (ExitTestException $e) { $r = $e->getTestResult(); - $ar = $r['ar']; + return $r['ar']; } - return $ar; } @@ -152,16 +149,13 @@ private function createLogoutRequest(array $state = []): LogoutRequest $config = ['entityID' => 'urn:x-simplesamlphp:example-sp']; $as = new SpTester($info, $config); - /** @var \SAML2\LogoutRequest $lr */ - $lr = null; try { $as->startSLO2($state); - $this->assertTrue(false, 'Expected ExitTestException'); + $this->fail('Expected ExitTestException'); } catch (ExitTestException $e) { $r = $e->getTestResult(); - $lr = $r['lr']; + return $r['lr']; } - return $lr; } @@ -514,10 +508,9 @@ public function testRemoteMetadataScoping(): void ]; $as = new SpTester($info, $config); - /** @var \SAML2\AuthnRequest $ar */ try { $as->startSSO2Test($this->getIdpMetadata(), []); - $this->assertTrue(false, 'Expected ExitTestException'); + $this->fail('Expected ExitTestException'); } catch (ExitTestException $e) { ['ar' => $ar] = $e->getTestResult(); $this->assertContains( @@ -557,10 +550,9 @@ public function testSPIdpListScopingOrder( $as = new SpTester($info, $config); - /** @var \SAML2\AuthnRequest $ar */ try { $as->startSSO2Test($this->getIdpMetadata(), $state); - $this->assertTrue(false, 'Expected ExitTestException'); + $this->fail('Expected ExitTestException'); } catch (ExitTestException $e) { ['ar' => $ar] = $e->getTestResult(); @@ -1540,7 +1532,7 @@ public function testLogoutRequest(): void $lr = $this->createLogoutRequest($state); - /** @var \SAML2\XML\samlp\Extensions $extensions */ + /** @var \SimpleSAML\XML\Chunk[] $extensions */ $extensions = $lr->getExtensions(); $this->assertcount(1, $state['saml:logout:Extensions']); diff --git a/tests/modules/saml/src/Controller/MetadataTest.php b/tests/modules/saml/src/Controller/MetadataTest.php index 4d2766ced1..73c6cfdc6c 100644 --- a/tests/modules/saml/src/Controller/MetadataTest.php +++ b/tests/modules/saml/src/Controller/MetadataTest.php @@ -168,7 +168,7 @@ public function testMetadataAccess(bool $authenticated, bool $protected): void if ($protected && !$authenticated) { $this->assertInstanceOf(RunnableResponse::class, $result); - /** @psalm-var array $callable */ + /** @var callable $callable */ $callable = $result->getCallable(); $this->assertEquals("requireAdmin", $callable[1]); } else { diff --git a/tests/modules/saml/src/Controller/ServiceProviderTest.php b/tests/modules/saml/src/Controller/ServiceProviderTest.php index 551bfc35a9..8cdfdcb26b 100644 --- a/tests/modules/saml/src/Controller/ServiceProviderTest.php +++ b/tests/modules/saml/src/Controller/ServiceProviderTest.php @@ -339,13 +339,12 @@ public function testLoginHandleNotAuthenticated( if ($expectingException) { $this->expectException(\SimpleSAML\Error\Exception::class); $this->expectExceptionMessage('URL not allowed: https://evil.com'); - /** @psalm-suppress UndefinedMethod method defined in anonymous class */ + /** @phpstan-ignore method.notFound */ $this->serviceProvider->callHandleLogin($request, $as, $spSource, $this->httpUtils); } else { $as->expects($this->once())->method('requireAuth')->with($options); - /** @psalm-suppress UndefinedMethod method defined in anonymous class */ - $returnsTo = $this->serviceProvider - ->callHandleLogin($request, $as, $spSource, $this->httpUtils); + /** @phpstan-ignore method.notFound */ + $returnsTo = $this->serviceProvider->callHandleLogin($request, $as, $spSource, $this->httpUtils); $this->assertEquals($options['ReturnTo'], $returnsTo); } } @@ -461,7 +460,7 @@ public function testLoginHandleAuthenticated( if ($expectingException) { $this->expectException(\SimpleSAML\Error\Exception::class); $this->expectExceptionMessage('URL not allowed: https://evil.com'); - /** @psalm-suppress UndefinedMethod method defined in anonymous class */ + /** @phpstan-ignore method.notFound */ $this->serviceProvider->callHandleLogin($request, $as, $spSource, $this->httpUtils); } else { if ($expectLoginCalled) { @@ -469,9 +468,8 @@ public function testLoginHandleAuthenticated( } else { $as->expects($this->never())->method('login'); } - /** @psalm-suppress UndefinedMethod method defined in anonymous class */ - $returnsTo = $this->serviceProvider - ->callHandleLogin($request, $as, $spSource, $this->httpUtils); + /** @phpstan-ignore method.notFound */ + $returnsTo = $this->serviceProvider->callHandleLogin($request, $as, $spSource, $this->httpUtils); $this->assertEquals($options['ReturnTo'], $returnsTo); } } @@ -790,7 +788,7 @@ public function testMetadataAccess(bool $authenticated, bool $protected): void if ($protected && !$authenticated) { $this->assertInstanceOf(RunnableResponse::class, $result); - /** @psalm-var array $callable */ + /** @var callable $callable */ $callable = $result->getCallable(); $this->assertEquals("requireAdmin", $callable[1]); } else { diff --git a/tests/src/SimpleSAML/DatabaseTest.php b/tests/src/SimpleSAML/DatabaseTest.php index ac698789c4..4faa8bc224 100644 --- a/tests/src/SimpleSAML/DatabaseTest.php +++ b/tests/src/SimpleSAML/DatabaseTest.php @@ -23,7 +23,7 @@ * @package SimpleSAMLphp */ #[CoversClass(Database::class)] -class DatabaseTest extends TestCase +final class DatabaseTest extends TestCase { /** * @var \SimpleSAML\Configuration diff --git a/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php b/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php index 6fa53fc7c1..bd7732ff5f 100644 --- a/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php +++ b/tests/src/SimpleSAML/Metadata/SAMLBuilderTest.php @@ -345,11 +345,9 @@ public function testContacts(): void $samlBuilder->addMetadata($set, $metadata); $spDesc = $samlBuilder->getEntityDescriptor(); - /** @psalm-var \DOMNodeList $acs */ $contacts = $spDesc->getElementsByTagName("ContactPerson"); $this->assertEquals(2, $contacts->length); - /** @psalm-var \DOMElement $first */ $first = $contacts->item(0); $this->assertTrue($first->hasAttribute("contactType")); $this->assertEquals("other", $first->getAttribute("contactType")); diff --git a/tests/src/SimpleSAML/SessionHandlerPHPTest.php b/tests/src/SimpleSAML/SessionHandlerPHPTest.php index 5236a47fb6..b5aa40d8d2 100644 --- a/tests/src/SimpleSAML/SessionHandlerPHPTest.php +++ b/tests/src/SimpleSAML/SessionHandlerPHPTest.php @@ -36,7 +36,10 @@ class SessionHandlerPHPTest extends ClearStateTestCase */ protected function setUp(): void { + parent::setUp(); + $this->original = $_SERVER; + $_SERVER['HTTP_HOST'] = 'example.com'; $_SERVER['SERVER_NAME'] = 'example.com'; $_SERVER['HTTPS'] = 'on'; diff --git a/tests/src/SimpleSAML/SessionTest.php b/tests/src/SimpleSAML/SessionTest.php index b2b8332b22..c6d943fba0 100644 --- a/tests/src/SimpleSAML/SessionTest.php +++ b/tests/src/SimpleSAML/SessionTest.php @@ -23,6 +23,8 @@ class SessionTest extends ClearStateTestCase */ public function setUp(): void { + parent::setUp(); + Configuration::loadFromArray([], '[ARRAY]', 'simplesaml'); $this->session = Session::getSessionFromRequest(); diff --git a/tests/src/SimpleSAML/XHTML/TemplateTranslationTest.php b/tests/src/SimpleSAML/XHTML/TemplateTranslationTest.php index 6f7e22be62..0b24d4778c 100644 --- a/tests/src/SimpleSAML/XHTML/TemplateTranslationTest.php +++ b/tests/src/SimpleSAML/XHTML/TemplateTranslationTest.php @@ -34,12 +34,7 @@ public function testCoreCardinalityErrorTemplate(): void 'test 2' => [1, 2], ]; - $getContent = function (): string { - /** @var \SimpleSAML\XHTML\Template $this */ - return $this->getContents(); - }; - $html = $getContent->call($t); - + $html = $t->getContents(); $this->assertStringContainsString('got 0 values, want 1', $html); $this->assertStringContainsString('got 1 values, want 2', $html); } @@ -59,12 +54,7 @@ public function testCoreLoginUserPassTemplate(): void $t->data['AuthState'] = '_abc123'; $t->data['formURL'] = Module::getModuleURL('core/loginuserpass'); - $getContent = function (): string { - /** @var \SimpleSAML\XHTML\Template $this */ - return $this->getContents(); - }; - $html = $getContent->call($t); - + $html = $t->getContents(); $this->assertStringContainsString('value="h.c oersted"', $html); } @@ -94,12 +84,7 @@ public function testCoreLogoutIframeTemplate(): void ], ]; - $getContent = function (): string { - /** @var \SimpleSAML\XHTML\Template $this */ - return $this->getContents(); - }; - $html = $getContent->call($t); - + $html = $t->getContents(); $this->assertStringContainsString('You are now successfully logged out from ze testing service.', $html); $this->assertStringContainsString('ze missing service', $html); } @@ -116,12 +101,7 @@ public function testAuthStatusTemplate(): void $t->data['trackid'] = ''; $t->data['authData'] = false; - $getContent = function (): string { - /** @var \SimpleSAML\XHTML\Template $this */ - return $this->getContents(); - }; - $html = $getContent->call($t); - + $html = $t->getContents(); $this->assertStringContainsString( 'Your session is valid for ' . $t->data['remaining'] . ' seconds from now.', $html, diff --git a/tests/src/SimpleSAML/XML/ParserTest.php b/tests/src/SimpleSAML/XML/ParserTest.php index 7a5f5c309a..e37dace2b5 100644 --- a/tests/src/SimpleSAML/XML/ParserTest.php +++ b/tests/src/SimpleSAML/XML/ParserTest.php @@ -36,7 +36,7 @@ class ParserTest extends TestCase */ protected function setUp(): void { - $this->xml = new Parser(static::XMLDOC); + $this->xml = new Parser(self::XMLDOC); } From 4fa1f56120faca0df988feced587844ac9bc1ffe Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 2 Mar 2026 22:58:18 +0100 Subject: [PATCH 450/532] Fix version constraint --- composer.json | 2 +- composer.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index a62c95f7eb..34c11e5716 100644 --- a/composer.json +++ b/composer.json @@ -62,7 +62,7 @@ "phpmailer/phpmailer": "~6.10", "psr/event-dispatcher": "~1.0", "psr/log": "~3.0", - "simplesamlphp/assert": "~1.9 || ~2.0", + "simplesamlphp/assert": "~2.0", "simplesamlphp/composer-module-installer": "~1.7", "simplesamlphp/saml2": "~6.1", "simplesamlphp/saml2-legacy": "~4.20", diff --git a/composer.lock b/composer.lock index d9e09ae561..431f72cedc 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "b1ebb044acd8f304370624c7df7796b3", + "content-hash": "6e9eecb9fcc5f4823e0960884216a4bd", "packages": [ { "name": "gettext/gettext", From d9054d5a8772adf02c13e93d4a315ae1715c1dd8 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 3 Mar 2026 09:31:52 +0100 Subject: [PATCH 451/532] Bump actions from test-framework --- .github/workflows/php.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index e60aa3ab74..4cadfce9b3 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -20,7 +20,7 @@ jobs: matrix: php-version: ['8.3', '8.4', '8.5'] - uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml@v1.10.6 + uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml@v1.11.0 with: php-version: ${{ matrix.php-version }} @@ -29,7 +29,7 @@ jobs: strategy: fail-fast: false - uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml@v1.10.6 + uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml@v1.11.0 with: enable_eslinter: true enable_jsonlinter: true From 692a6e453d5ed3bec57b4b87829a23b6c95bc8df Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 3 Mar 2026 21:17:40 +0100 Subject: [PATCH 452/532] Release v2.5.0-rc6 --- composer.json | 2 +- extra/simplesamlphp.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 34c11e5716..a400788739 100644 --- a/composer.json +++ b/composer.json @@ -144,5 +144,5 @@ "echo 'Post-install tasks completed!'" ] }, - "version": "v2.5.0-rc5" + "version": "v2.5.0-rc6" } diff --git a/extra/simplesamlphp.spec b/extra/simplesamlphp.spec index 215acd2ecd..470a87b9a0 100644 --- a/extra/simplesamlphp.spec +++ b/extra/simplesamlphp.spec @@ -1,6 +1,6 @@ %define name simplesamlphp %define summary SAML IDP/SP written in PHP -%define version 2.4.2 +%define version 2.5.0 %define release 1 %define license LGPL 2.1 %define group Networking/WWW From 0292be073504072290b4e4c417741a53a3829828 Mon Sep 17 00:00:00 2001 From: Dick Visser Date: Wed, 4 Mar 2026 17:00:26 +0100 Subject: [PATCH 453/532] Fix stray spaces in templates (#2606) * remove stray whitespace * remove stray whitespace --- templates/_table.twig | 1 - templates/auth_status.twig | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/templates/_table.twig b/templates/_table.twig index 763d447260..c963b9ce6f 100644 --- a/templates/_table.twig +++ b/templates/_table.twig @@ -1,6 +1,5 @@ - {% for name, values in items %} {%~ block namecol -%} diff --git a/templates/auth_status.twig b/templates/auth_status.twig index 1d3e3f43dd..20353f4637 100644 --- a/templates/auth_status.twig +++ b/templates/auth_status.twig @@ -20,7 +20,7 @@ {% block namecol %} {% set translated = name|trans %} - + {% endblock %} From 70262455ba2f50e22de5f20f6623a61723ed480e Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 4 Mar 2026 17:02:10 +0100 Subject: [PATCH 454/532] Feature/http client (#2574) * Fix lock-file * Migrate version-check to http-client * Deprecate proxy-settings * Remove duplicate parenthesis * Move instantiation of the HttpClient to the HTTP-utility * Add deprecation notice for HTTP::fetch * Migrate MDQ to use httpClient * Improve error handling * Migrate XML storage handler to use a httpClient * Fix deprecation-attributes * Add a service for the HTTP-utility * reference to docs for options * a first attempt to move these to using symfony httpclient as well * Fix case where proxy does not require auth * Fix codesniffer-issues * Add reference to the symfony docs --------- Co-authored-by: Ben Martin --- composer.json | 2 + composer.lock | 261 +++++++++++++++++- config/config.php.dist | 3 + modules/admin/src/Controller/Config.php | 69 ++--- routing/services/simplesamlphp.yml | 3 + .../Metadata/MetaDataStorageHandlerXML.php | 24 +- src/SimpleSAML/Metadata/SAMLParser.php | 21 +- src/SimpleSAML/Metadata/Sources/MDQ.php | 35 +-- src/SimpleSAML/Utils/HTTP.php | 87 +++--- 9 files changed, 396 insertions(+), 109 deletions(-) diff --git a/composer.json b/composer.json index a400788739..2a4e9900f1 100644 --- a/composer.json +++ b/composer.json @@ -78,6 +78,8 @@ "symfony/filesystem": "~7.4", "symfony/finder": "~7.4", "symfony/framework-bundle": "~7.4", + "symfony/http-client": "~7.4", + "symfony/http-client-contracts": "~3.5", "symfony/http-foundation": "~7.4", "symfony/http-kernel": "~7.4", "symfony/intl": "~7.4", diff --git a/composer.lock b/composer.lock index 431f72cedc..51be171209 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6e9eecb9fcc5f4823e0960884216a4bd", + "content-hash": "db383a8aef9883bc32fa0bfc50049339", "packages": [ { "name": "gettext/gettext", @@ -2562,6 +2562,185 @@ ], "time": "2026-02-25T16:50:00+00:00" }, + { + "name": "symfony/http-client", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "2bde8afd5ab2fe0b05a9c2d4c3c0e28ceb98a154" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/2bde8afd5ab2fe0b05a9c2d4c3c0e28ceb98a154", + "reference": "2bde8afd5ab2fe0b05a9c2d4c3c0e28ceb98a154", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "amphp/amp": "<2.5", + "amphp/socket": "<1.1", + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.4" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-18T09:46:18+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "75d7043853a42837e68111812f4d964b01e5101c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-04-29T11:18:49+00:00" + }, { "name": "symfony/http-foundation", "version": "v7.4.6", @@ -3352,6 +3531,86 @@ ], "time": "2024-12-23T08:48:59+00:00" }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, { "name": "symfony/polyfill-php85", "version": "v1.33.0", diff --git a/config/config.php.dist b/config/config.php.dist index a93d3f993e..47c9923c42 100644 --- a/config/config.php.dist +++ b/config/config.php.dist @@ -462,6 +462,9 @@ $config = [ ***********************/ /* + * @DEPRECATED: set your proxy using environment variables. + * @see: https://symfony.com/doc/current/http_client.html#http-proxies + * * Proxy to use for retrieving URLs. * * Example: diff --git a/modules/admin/src/Controller/Config.php b/modules/admin/src/Controller/Config.php index e12237e487..f227805411 100644 --- a/modules/admin/src/Controller/Config.php +++ b/modules/admin/src/Controller/Config.php @@ -7,6 +7,7 @@ use SimpleSAML\Configuration; use SimpleSAML\Event\Dispatcher\ModuleEventDispatcherFactory; use SimpleSAML\Locale\Translate; +use SimpleSAML\Logger; use SimpleSAML\Module; use SimpleSAML\Module\admin\Event\ConfigPageEvent; use SimpleSAML\Module\admin\Event\SanityCheckEvent; @@ -15,15 +16,10 @@ use SimpleSAML\XHTML\Template; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\StreamedResponse; +use Symfony\Contracts\HttpClient\Exception\ExceptionInterface; -use function curl_close; -use function curl_exec; -use function curl_getinfo; -use function curl_init; -use function curl_setopt; use function explode; use function function_exists; -use function json_decode; use function ltrim; use function phpversion; use function version_compare; @@ -37,7 +33,7 @@ */ class Config { - public const string LATEST_VERSION_STATE_KEY = 'core:latest_simplesamlphp_version'; + public const string LATEST_VERSION_STATE_KEY = 'admin:latest_simplesamlphp_version'; public const string RELEASES_API = 'https://api.github.com/repos/simplesamlphp/simplesamlphp/releases/latest'; @@ -453,47 +449,38 @@ protected function getWarnings(): array ); } - /* + /** * Check for updates. Store the remote result in the session so we don't need to fetch it on every access to * this page. */ $checkforupdates = $this->config->getOptionalBoolean('admin.checkforupdates', true); if (($checkforupdates === true) && $this->config->getVersion() !== 'master') { - if (!function_exists('curl_init')) { - $warnings[] = Translate::noop( - 'The cURL PHP extension is missing. Cannot check for SimpleSAMLphp updates.', - ); - } else { - $latest = $this->session->getData(self::LATEST_VERSION_STATE_KEY, "version"); - - if (!$latest) { - $ch = curl_init(self::RELEASES_API); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_USERAGENT, 'SimpleSAMLphp'); - curl_setopt($ch, CURLOPT_TIMEOUT, 2); - curl_setopt($ch, CURLOPT_PROXY, $this->config->getOptionalString('proxy', null)); - curl_setopt($ch, CURLOPT_PROXYUSERPWD, $this->config->getOptionalValue('proxy.auth', null)); - $response = curl_exec($ch); - - if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) === 200) { - /** @psalm-var string $response */ - $latest = json_decode($response, true); - $this->session->setData(self::LATEST_VERSION_STATE_KEY, 'version', $latest); - } - curl_close($ch); + $latest = $this->session->getData(self::LATEST_VERSION_STATE_KEY, "version"); + + if (!$latest) { + $client = $this->httpUtils->createHttpClient(['timeout' => 3]); + $response = $client->request('GET', self::RELEASES_API); + + try { + $latest = $response->toArray(); + $this->session->setData(self::LATEST_VERSION_STATE_KEY, 'version', $latest); + } catch (ExceptionInterface $e) { + $message = sprintf("Unable to check for updates; %s", $e->getMessage()); + Logger::warning($message); + $warnings[] = Translate::noop($message); } + } - if ($latest && version_compare($this->config->getVersion(), ltrim($latest['tag_name'], 'v'), 'lt')) { - $warnings[] = [ - Translate::noop( - 'You are running an outdated version of SimpleSAMLphp. Please update to the latest version as soon as possible.', - ), - [ - '%latest%' => $latest['html_url'], - ], - ]; - } + if ($latest && version_compare($this->config->getVersion(), ltrim($latest['tag_name'], 'v'), 'lt')) { + $warnings[] = [ + Translate::noop( + 'You are running an outdated version of SimpleSAMLphp. Please update to the latest version as soon as possible.', + ), + [ + '%latest%' => $latest['html_url'], + ], + ]; } } diff --git a/routing/services/simplesamlphp.yml b/routing/services/simplesamlphp.yml index 80c1fe9062..27a81a0d2c 100644 --- a/routing/services/simplesamlphp.yml +++ b/routing/services/simplesamlphp.yml @@ -16,3 +16,6 @@ services: arguments: - '@SimpleSAML\Configuration' - '@SimpleSAML\Session' + + SimpleSAML\Utils\HTTP: + class: SimpleSAML\Utils\HTTP diff --git a/src/SimpleSAML/Metadata/MetaDataStorageHandlerXML.php b/src/SimpleSAML/Metadata/MetaDataStorageHandlerXML.php index ba5ebf7566..dd29bd04b4 100644 --- a/src/SimpleSAML/Metadata/MetaDataStorageHandlerXML.php +++ b/src/SimpleSAML/Metadata/MetaDataStorageHandlerXML.php @@ -4,8 +4,11 @@ namespace SimpleSAML\Metadata; +use Exception; use SimpleSAML\Assert\Assert; use SimpleSAML\Configuration; +use SimpleSAML\Utils; +use Symfony\Contracts\HttpClient\Exception\ExceptionInterface; /** * This class implements a metadata source which loads metadata from XML files. @@ -43,30 +46,33 @@ protected function __construct(array $config) // get the configuration $globalConfig = Configuration::getInstance(); $src = $globalConfig->resolvePath($config['file']); + $srcXml = file_get_contents($src); } elseif (array_key_exists('url', $config)) { $src = $config['url']; if (array_key_exists('context', $config)) { Assert::isArray($config['context']); $context = $config['context']; } + $httpUtils = new Utils\HTTP(); + $client = $httpUtils->createHttpClient($context); + $response = $client->request('GET', $src); + + try { + $response->getHeaders(); + $srcXML = $response->getContent(); + } catch (ExceptionInterface $e) { + } } elseif (array_key_exists('xml', $config)) { $srcXml = $config['xml']; } else { - throw new \Exception("Missing one of 'file', 'url' and 'xml' in XML metadata source configuration."); + throw new Exception("Missing one of 'file', 'url' and 'xml' in XML metadata source configuration."); } - $SP20 = []; $IdP20 = []; $AAD = []; - if (isset($src)) { - $entities = SAMLParser::parseDescriptorsFile($src, $context); - } elseif (isset($srcXml)) { - $entities = SAMLParser::parseDescriptorsString($srcXml); - } else { - throw new \Exception("Neither source file path/URI nor string data provided"); - } + $entities = SAMLParser::parseDescriptorsString($srcXml); foreach ($entities as $entityId => $entity) { $md = $entity->getMetadata20SP(); if ($md !== null) { diff --git a/src/SimpleSAML/Metadata/SAMLParser.php b/src/SimpleSAML/Metadata/SAMLParser.php index f5196a61b9..736350d4ff 100644 --- a/src/SimpleSAML/Metadata/SAMLParser.php +++ b/src/SimpleSAML/Metadata/SAMLParser.php @@ -38,6 +38,7 @@ use SimpleSAML\Utils; use SimpleSAML\XML\DOMDocumentFactory; use Symfony\Component\Filesystem\Filesystem; +use Symfony\Contracts\HttpClient\Exception\ExceptionInterface; use function array_diff; use function array_intersect; @@ -229,14 +230,20 @@ private function __construct( * @return \SimpleSAML\Metadata\SAMLParser An instance of this class with the metadata loaded. * @throws \Exception If the file does not parse as XML. */ + #[\Deprecated('Will be removed in 3.0. No replacement was suggested', '16-12-2025')] public static function parseFile(string $file): SAMLParser { $httpUtils = new Utils\HTTP(); - /** @var string $data */ - $data = $httpUtils->fetch($file); + $client = $httpUtils->createHttpClient(); + $response = $client->request('GET', $file); try { + $response->getHeaders(); + /** @var string $data */ + $data = $response->getContent(); $doc = DOMDocumentFactory::fromString($data); + } catch (ExceptionInterface $e) { + throw new Exception('Failed to read XML from file: ' . $file); } catch (Exception $e) { throw new Exception('Failed to read XML from file: ' . $file); } @@ -306,6 +313,7 @@ public static function parseElement(EntityDescriptor $entityElement): SAMLParser * @return \SimpleSAML\Metadata\SAMLParser[] An array of SAMLParser instances. * @throws \Exception If the file does not parse as XML. */ + #[\Deprecated('Will be removed in 3.0. No replacement was suggested', '16-12-2025')] public static function parseDescriptorsFile(string $file, array $context = []): array { if (empty($file)) { @@ -313,11 +321,16 @@ public static function parseDescriptorsFile(string $file, array $context = []): } $httpUtils = new Utils\HTTP(); - /** @var string $data */ - $data = $httpUtils->fetch($file, $context); + $client = $httpUtils->createHttpClient($context); + $response = $client->request('GET', $file); try { + $response->getHeaders(); + /** @var string $data */ + $data = $response->getContent(); $doc = DOMDocumentFactory::fromString($data); + } catch (ExceptionInterface $e) { + throw new Exception('Failed to read XML from file: ' . $file); } catch (Exception $e) { throw new Exception('Failed to read XML from file: ' . $file); } diff --git a/src/SimpleSAML/Metadata/Sources/MDQ.php b/src/SimpleSAML/Metadata/Sources/MDQ.php index 88effee3a7..76f8ccb8b3 100644 --- a/src/SimpleSAML/Metadata/Sources/MDQ.php +++ b/src/SimpleSAML/Metadata/Sources/MDQ.php @@ -12,6 +12,7 @@ use SimpleSAML\Metadata\SAMLParser; use SimpleSAML\Utils; use Symfony\Component\HttpFoundation\File\File; +use Symfony\Contracts\HttpClient\Exception\ExceptionInterface; use function array_key_exists; use function error_get_last; @@ -297,31 +298,25 @@ public function getMetaData(string $entityId, string $set): ?array // look at Metadata Query Protocol: https://github.com/iay/md-query/blob/master/draft-young-md-query.txt $mdq_url = $this->server . '/entities/' . urlencode($entityId); - Logger::debug(sprintf('%s: downloading metadata for "%s" from [%s]', __CLASS__, $entityId, $mdq_url)); $httpUtils = new Utils\HTTP(); - $context = [ - 'http' => [ - 'header' => 'Accept: application/samlmetadata+xml', - ], - ]; - try { - $xmldata = $httpUtils->fetch($mdq_url, $context); - } catch (Exception $e) { - // Avoid propagating the exception, make sure we can handle the error later - $xmldata = false; - } + $client = $httpUtils->createHttpClient([ + 'headers' => ['Accept', 'application/samlmetadata+xml'], + ]); - if (empty($xmldata)) { - $error = error_get_last(); - Logger::info(sprintf( - 'Unable to fetch metadata for "%s" from %s: %s', - $entityId, - $mdq_url, - (is_array($error) ? $error['message'] : 'no error available'), - )); + Logger::debug(sprintf('%s: downloading metadata for "%s" from [%s]', __CLASS__, $entityId, $mdq_url)); + $response = $client->request('GET', $mdq_url); + + try { + $response->getHeaders(); + } catch (ExceptionInterface $e) { + Logger::info( + sprintf('Unable to fetch metadata for "%s" from %s: %s', $entityId, $mdq_url, $e->getMessage()), + ); return null; } + $xmldata = $response->getContent(); + /** @var string $xmldata */ $entity = SAMLParser::parseString($xmldata); Logger::debug(sprintf('%s: completed parsing of [%s]', __CLASS__, $mdq_url)); diff --git a/src/SimpleSAML/Utils/HTTP.php b/src/SimpleSAML/Utils/HTTP.php index c463d3b8e1..0cf39c7578 100644 --- a/src/SimpleSAML/Utils/HTTP.php +++ b/src/SimpleSAML/Utils/HTTP.php @@ -4,6 +4,7 @@ namespace SimpleSAML\Utils; +use Exception; use SimpleSAML\Configuration; use SimpleSAML\Error; use SimpleSAML\Logger; @@ -13,6 +14,12 @@ use SimpleSAML\XMLSecurity\Alg\Encryption\AES; use SimpleSAML\XMLSecurity\Constants as C; use SimpleSAML\XMLSecurity\Key\SymmetricKey; +use Symfony\Component\HttpClient\HttpClient; +use Symfony\Contracts\HttpClient\HttpClientInterface; + +use function array_merge; +use function parse_url; +use function str_replace; /** * HTTP-related utility methods. @@ -21,6 +28,37 @@ */ class HTTP { + protected Configuration $config; + + + /** + * Instantiate an HTTP Client + * + * https://github.com/symfony/symfony/blob/d1ebc450128b626d4b9822f6baf97f530eb3b4d1/src/Symfony/Contracts/HttpClient/HttpClientInterface.php#L26 + * + * @param array $options See Symfony\Contracts\HttpClient\HttpClientInterface::OPTIONS_DEFAULTS for possible values + */ + public function createHttpClient(array $options = []): HttpClientInterface + { + $config = Configuration::getInstance(); + $proxy = $config->getOptionalString('proxy', null); + + if ($proxy !== null) { + $proxyAuth = $config->getOptionalString('proxy.auth', null); + $scheme = parse_url($proxy, PHP_URL_SCHEME); + + if ($proxyAuth !== null) { + $proxy = ['proxy' => str_replace($scheme . '://', $scheme . '://' . $proxyAuth . '@', $proxy)]; + } elseif ($proxy !== null) { + $proxy = ['proxy' => str_replace($scheme . '://', 'http://', $proxy)]; + } + $options = array_merge($proxy, $options); + } + + return HttpClient::create($options); + } + + /** * Determine if the user agent can support cookies being sent with SameSite equal to "None". * Browsers without support may drop the cookie and or treat it as stricter setting @@ -456,8 +494,8 @@ public function checkURLAllowed(string $url, ?array $trustedSites = null): strin * otherwise. * @throws \InvalidArgumentException If the input parameters are invalid. * @throws \SimpleSAML\Error\Exception If the file or URL cannot be retrieved. - * */ + #[\Deprecated('Use an HTTP client instead (see createHttpClient method)', '16-12-2025')] public function fetch(string $url, array $context = [], bool $getHeaders = false) { $config = Configuration::getInstance(); @@ -500,42 +538,23 @@ public function fetch(string $url, array $context = [], bool $getHeaders = false } } - $context = stream_context_create($context); - $data = @file_get_contents($url, false, $context); - if ($data === false) { - $error = error_get_last(); - throw new Error\Exception('Error fetching ' . var_export($url, true) . ':' . - (is_array($error) ? $error['message'] : 'no error available')); - } + $client = $this->createHttpClient($context); + $response = $client->request('GET', $url); - // data and headers - if ($getHeaders) { - if (PHP_VERSION_ID > 80500) { - $http_response_headers = http_get_last_response_headers(); - } else { - $http_response_headers = $http_response_header; - } - if (!empty($http_response_headers)) { - $headers = []; - foreach ($http_response_headers as $h) { - if (preg_match('@^HTTP/1\.[01]\s+\d{3}\s+@', $h)) { - $headers = []; // reset - $headers[0] = $h; - continue; - } - $bits = explode(':', $h, 2); - if (count($bits) === 2) { - $headers[strtolower($bits[0])] = trim($bits[1]); - } - } - } else { - // no HTTP headers, probably a different protocol, e.g. file - $headers = null; + try { + $headers = $response->getHeaders(); + /** @var string $data */ + $data = $response->getContent(); + + // data and headers + if ($getHeaders) { + return [$data, $headers]; } - return [$data, $headers]; - } - return $data; + return $data; + } catch (Exception $e) { + throw new Error\Exception('Error fetching ' . var_export($url, true) . ':' . $e->getMessage()); + } } From 0e453819c33d4b8387db165c5b3fa603db7f5d08 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 4 Mar 2026 17:03:15 +0100 Subject: [PATCH 455/532] Fix lock-file --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index 51be171209..06330c4b6b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "db383a8aef9883bc32fa0bfc50049339", + "content-hash": "3ebe6e9c76b1db9ea31aff5fc1bf76ea", "packages": [ { "name": "gettext/gettext", From 76cee4a02cc240691c752ec0c746699b3fcb4f7c Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 5 Mar 2026 02:40:03 +0100 Subject: [PATCH 456/532] Bugfix/nameid policy (#2603) * Bugfix: don't set illegal combination of AllowCreate/Format * Force allowCreate to false if format is TRANSIENT I also kept a reference to the errata 05 page/line here in a comment * allowCreate is true by default and contained for TRANSIENT As the default was true for this before it is now that way again. If the format is NAMEID_TRANSIENT it will be set to respect the Errata 05. * The persistent default is back to having allowCreate=true --------- Co-authored-by: Ben Martin --- modules/saml/src/Auth/Source/SP.php | 3 +++ src/SimpleSAML/Utils/Config/Metadata.php | 14 +++++++++++--- tests/modules/saml/src/Auth/Source/SPTest.php | 2 +- tests/src/SimpleSAML/Utils/Config/MetadataTest.php | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/modules/saml/src/Auth/Source/SP.php b/modules/saml/src/Auth/Source/SP.php index d6be02e221..12efdc3231 100644 --- a/modules/saml/src/Auth/Source/SP.php +++ b/modules/saml/src/Auth/Source/SP.php @@ -593,8 +593,11 @@ private function startSSO2(Configuration $idpMetadata, array $state): void if (!empty($state['saml:NameIDPolicy'])) { $ar->setNameIdPolicy($state['saml:NameIDPolicy']); + } else { + $ar->setNameIdPolicy($this->metadata->getOptionalArray('NameIDPolicy', [])); } + $requesterID = []; /* Only check for real info for Scoping element if we are going to send Scoping element */ diff --git a/src/SimpleSAML/Utils/Config/Metadata.php b/src/SimpleSAML/Utils/Config/Metadata.php index b66769d346..021ad5b60e 100644 --- a/src/SimpleSAML/Utils/Config/Metadata.php +++ b/src/SimpleSAML/Utils/Config/Metadata.php @@ -248,7 +248,7 @@ public static function parseNameIdPolicy(?array $nameIdPolicy = null): array { if ($nameIdPolicy === null) { // when NameIDPolicy is unset or set to null, default to transient - return ['Format' => Constants::NAMEID_TRANSIENT, 'AllowCreate' => true]; + return ['Format' => Constants::NAMEID_TRANSIENT, 'AllowCreate' => false]; } if ($nameIdPolicy === []) { @@ -258,9 +258,17 @@ public static function parseNameIdPolicy(?array $nameIdPolicy = null): array // handle configurations specifying an array in the NameIDPolicy config option $nameIdPolicy_cf = Configuration::loadFromArray($nameIdPolicy); + $format = $nameIdPolicy_cf->getOptionalString('Format', Constants::NAMEID_TRANSIENT); + $allowCreate = $nameIdPolicy_cf->getOptionalBoolean('AllowCreate', true); + // SAML Version 2.0 Errata 05 lines 252-255 (pg 12) + if ($format === Constants::NAMEID_TRANSIENT) { + if ($allowCreate) { + $allowCreate = false; + } + } $policy = [ - 'Format' => $nameIdPolicy_cf->getOptionalString('Format', Constants::NAMEID_TRANSIENT), - 'AllowCreate' => $nameIdPolicy_cf->getOptionalBoolean('AllowCreate', true), + 'Format' => $format, + 'AllowCreate' => $allowCreate, ]; $spNameQualifier = $nameIdPolicy_cf->getOptionalString('SPNameQualifier', null); if ($spNameQualifier !== null) { diff --git a/tests/modules/saml/src/Auth/Source/SPTest.php b/tests/modules/saml/src/Auth/Source/SPTest.php index 08b7a353d1..cf1fe67d72 100644 --- a/tests/modules/saml/src/Auth/Source/SPTest.php +++ b/tests/modules/saml/src/Auth/Source/SPTest.php @@ -164,7 +164,7 @@ private function createLogoutRequest(array $state = []): LogoutRequest */ public function testAuthnRequest(): void { - $ar = $this->createAuthnRequest(); + $ar = $this->createAuthnRequest(['NameIDPolicy' => ['AllowCreate' => false]]); $xml = $ar->toSignedXML(); diff --git a/tests/src/SimpleSAML/Utils/Config/MetadataTest.php b/tests/src/SimpleSAML/Utils/Config/MetadataTest.php index 18a6ed61e2..f9084a81ae 100644 --- a/tests/src/SimpleSAML/Utils/Config/MetadataTest.php +++ b/tests/src/SimpleSAML/Utils/Config/MetadataTest.php @@ -257,7 +257,7 @@ public function testParseNameIdPolicyDefaults(): void $nameIdPolicy = null; $this->assertEquals([ 'Format' => Constants::NAMEID_TRANSIENT, - 'AllowCreate' => true, + 'AllowCreate' => false, ], Metadata::parseNameIdPolicy($nameIdPolicy)); $nameIdPolicy = [ From 77151593272d48ed1affb7d15ebcc2336048b402 Mon Sep 17 00:00:00 2001 From: Nathan Robertson Date: Thu, 5 Mar 2026 12:47:32 +1100 Subject: [PATCH 457/532] Improve debugging of authproc configuration - AttributeDump authproc (#2601) * Implement AttributeDump authproc * Fix phpcs nitpicks --- modules/core/docs/authproc_attributedump.md | 90 +++++++ .../core/src/Auth/Process/AttributeDump.php | 133 ++++++++++ .../src/Auth/Process/AttributeDumpTest.php | 240 ++++++++++++++++++ 3 files changed, 463 insertions(+) create mode 100644 modules/core/docs/authproc_attributedump.md create mode 100644 modules/core/src/Auth/Process/AttributeDump.php create mode 100644 tests/modules/core/src/Auth/Process/AttributeDumpTest.php diff --git a/modules/core/docs/authproc_attributedump.md b/modules/core/docs/authproc_attributedump.md new file mode 100644 index 0000000000..35ae957662 --- /dev/null +++ b/modules/core/docs/authproc_attributedump.md @@ -0,0 +1,90 @@ +`core:AttributeDump` +=================== + +Filter that outputs to the system log file attributes and their values that match a given criteria. + +This is particularly useful for adding debug points in your list of authproc filters as you are configuring your SimpleSAMLphp. + +Parameters +---------- + +`class` (required) +: This is the name of the filter. + It must be `core:AttributeDump`. + +`attributes` +: An array of attribute names that are to be output to the SimpleSAMLphp logs. + If not specified, and `attributesRegex` is not specified, all attributes will be output. + +`attributesRegex` +: An array of regular expressions. Any attribute name that matches any of the regular expressions + in this list are to be output to the SimpleSAMLphp logs. + If not specified, and `attributes` is also not specified, all attributes will be output. + +`prefix` +: A string to prefix each log line to be outputted. + Defaults to "AttributeDump". + +`logLevel` +: The level to log at. For the message to appear in the SimpleSAMLphp log files it needs to be at a level + equal to or higher than the log value you've configured in your `config.php`. + Valid values are: "emergency", "critical", "alert", "error", "warning", "notice", "info" or "debug". + +Examples +-------- + +If no attribute list or list of attribute regular expressions is provided, it will simply dump all attributes: + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeDump', + ], + ], + +This will output the `uid` and `groups` attributes only to the logs: + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeDump', + 'attributes' => ['uid', 'groups'], + ], + ], + +This will output any attribute that ends in the letter `n` (eg. `fn`, `sn`, `cn`): + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeDump', + 'attributesRegex' => ['/n$/'], + ], + ], + +This will output the `uid` and `groups` attributes, as well as any attribute that ends in the letter `n` (eg. `fn`, `sn`, `cn`) to the logs: + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeDump', + 'attributes' => ['uid', 'groups'], + 'attributesRegex' => ['/n$/'], + ], + ], + +Optionally, you can specify a prefix to the log message and a log level to log at: + + 'authproc' => [ + 49 => [ + 'class' => 'core:AttributeAdd', + [...] + ], + + 50 => [ + 'class' => 'core:AttributeDump', + 'prefix' => 'After running AttributeAdd but before applying AttributeLimit filter', + 'logLevel' => 'debug', + ], + + 51 => [ + 'class' => 'core:AttributeLimit', + [...] + ], + ], diff --git a/modules/core/src/Auth/Process/AttributeDump.php b/modules/core/src/Auth/Process/AttributeDump.php new file mode 100644 index 0000000000..0bfbcc0788 --- /dev/null +++ b/modules/core/src/Auth/Process/AttributeDump.php @@ -0,0 +1,133 @@ + $values) { + if ($name === 'attributes') { + if (!is_array($values)) { + throw new Exception('The "attributes" configuration option must be an array of strings.'); + } + foreach ($values as $attribute) { + if (!is_string($attribute)) { + throw new Exception('Attribute name must be a string: ' . var_export($attribute, true)); + } + $this->attributes[] = $attribute; + } + } elseif ($name === 'attributesRegex') { + if (!is_array($values)) { + throw new Exception('The "attributesRegex" configuration option must be an array.'); + } + foreach ($values as $regex) { + if (!is_string($regex)) { + throw new Exception('Attribute regex must be a string: ' . var_export($regex, true)); + } + $this->attributesRegex[] = $regex; + } + } elseif ($name === 'logLevel') { + if (!is_string($values) || !method_exists(Logger::class, $values)) { + throw new Exception( + 'The "logLevel" configuration option must be a string (eg. "debug", "info", "notice", etc).', + ); + } + $this->logLevel = $values; + } elseif ($name === 'logPrefix') { + if (!is_string($values)) { + throw new Exception('The "logPrefix" configuration option must be a string.'); + } + $this->logPrefix = $values; + } else { + throw new Exception('Unknown configuration option: ' . var_export($name, true)); + } + } + } + + /** + * Process the attributes. + * + * @param array &$state The state array containing the attributes to process. + */ + #[\Override] + public function process(array &$state): void + { + Assert::keyExists($state, 'Attributes'); + $attributesPassedIn = &$state['Attributes']; + + $matches = []; + + if (empty($this->attributes) && empty($this->attributesRegex)) { + $matches = $attributesPassedIn; + } else { + foreach ($attributesPassedIn as $attribute => $values) { + foreach ($this->attributes as $attributeToMatch) { + if ($attribute === $attributeToMatch) { + $matches[$attribute] = $values; + continue 2; + } + } + foreach ($this->attributesRegex as $regex) { + if (preg_match($regex, $attribute)) { + $matches[$attribute] = $values; + continue 2; + } + } + } + } + + Logger::{$this->logLevel}($this->logPrefix . ': ' . var_export($matches, true)); + } +} diff --git a/tests/modules/core/src/Auth/Process/AttributeDumpTest.php b/tests/modules/core/src/Auth/Process/AttributeDumpTest.php new file mode 100644 index 0000000000..8a7f9a0c22 --- /dev/null +++ b/tests/modules/core/src/Auth/Process/AttributeDumpTest.php @@ -0,0 +1,240 @@ + ArrayLogger::class, + 'errorreporting' => false, + 'module.enable' => ['core' => true], + ], + '[ARRAY]', + 'simplesaml', + ); + + Configuration::setPreLoadedConfig(self::$config, 'config.php'); + } + + + /** + * Clean up after each test + */ + #[\Override] + protected function tearDown(): void + { + Logger::clearCapturedLog(); + } + + + /** + * Helper function to run the filter with a given configuration. + * + * @param array $config The filter configuration. + * @param array $request The request state. + * @return array The state array after processing. + */ + private function processFilter(array $config, array $request, string $expected): array + { + Logger::setCaptureLog(); + $filter = new AttributeDump($config, null); + $filter->process($request); + Logger::setCaptureLog(false); + + // Strip off the timestamp from the beginning of the log message, since those are not deterministic. + $log = preg_replace('~^\S+\s~', '', Logger::getCapturedLog()[0]); + $this->assertEquals($expected, $log); + + return $request; + } + + + /** + * Test the most basic functionality. + */ + public function testBasic(): void + { + $authProcConfig = [ + ]; + $request = [ + 'Attributes' => [ + 'test' => ['value1', 'value2'], + ], + ]; + + $expectedLog = 'AttributeDump: ' . var_export(['test' => ['value1', 'value2']], true); + + $this->processFilter( + $authProcConfig, + $request, + $expectedLog, + ); + } + + + /** + * Test the most basic functionality. + */ + public function testSingleAttribute(): void + { + $authProcConfig = [ + // ArrayLogger doesn't actually do anything with the log level, + // but we want to test that it is accepted in the configuration. + 'logLevel' => 'debug', + 'logPrefix' => 'TestPrefix', + 'attributes' => ['test'], + ]; + $request = [ + 'Attributes' => [ + 'test' => ['value1', 'value2'], + 'test_drop' => ['value3'], + ], + ]; + + $expectedLog = 'TestPrefix: ' . var_export(['test' => ['value1', 'value2']], true); + + $this->processFilter( + $authProcConfig, + $request, + $expectedLog, + ); + } + + + /** + * Test the most basic functionality. + */ + public function testMultipleAttributes(): void + { + $authProcConfig = [ + 'logPrefix' => 'TestPrefix', + 'attributes' => ['test', 'test_include'], + ]; + $request = [ + 'Attributes' => [ + 'test' => ['value1', 'value2'], + 'test_drop' => ['value3'], + 'test_include' => ['value4'], + ], + ]; + + $expectedLog = 'TestPrefix: ' . + var_export(['test' => ['value1', 'value2'], 'test_include' => ['value4']], true); + + $this->processFilter( + $authProcConfig, + $request, + $expectedLog, + ); + } + + + /** + * Test the most basic functionality. + */ + public function testSingleRegex(): void + { + $authProcConfig = [ + 'attributesRegex' => ['/^test_/'], + ]; + $request = [ + 'Attributes' => [ + 'test' => ['value1', 'value2'], + 'test_next' => ['value3'], + 'test_include' => ['value4'], + ], + ]; + + $expectedLog = 'AttributeDump: ' . + var_export(['test_next' => ['value3'], 'test_include' => ['value4']], true); + + $this->processFilter( + $authProcConfig, + $request, + $expectedLog, + ); + } + + + /** + * Test the most basic functionality. + */ + public function testMultipleRegex(): void + { + $authProcConfig = [ + 'attributesRegex' => ['/^test_o/', '/^test_i/'], + ]; + $request = [ + 'Attributes' => [ + 'test' => ['value1', 'value2'], + 'test_drop' => ['value3'], + 'test_other' => ['value5'], + 'test_include' => ['value4'], + ], + ]; + + $expectedLog = 'AttributeDump: ' . + var_export(['test_other' => ['value5'], 'test_include' => ['value4']], true); + + $this->processFilter( + $authProcConfig, + $request, + $expectedLog, + ); + } + + + /** + * Test the most basic functionality. + */ + public function testAttributeAndRegex(): void + { + $authProcConfig = [ + 'attributes' => ['test'], + 'attributesRegex' => ['/^test_i/'], + ]; + $request = [ + 'Attributes' => [ + 'test' => ['value1', 'value2'], + 'test_drop' => ['value3'], + 'test_other' => ['value5'], + 'test_include' => ['value4'], + ], + ]; + + $expectedLog = 'AttributeDump: ' . + var_export(['test' => ['value1', 'value2'], 'test_include' => ['value4']], true); + + $this->processFilter( + $authProcConfig, + $request, + $expectedLog, + ); + } +} From 597bfae9ae745411ef68e9ab8691d47b2f7fb173 Mon Sep 17 00:00:00 2001 From: Nathan Robertson Date: Fri, 6 Mar 2026 11:26:55 +1100 Subject: [PATCH 458/532] authproc: Support conditionally adding attributes declaratively (#2579) * Implement conditional add authproc * Test plain string handling is compatible with old AttributeAdd authproc module * Add documentation for AttributeConditionalAdd authproc * Fix markdown linting --- .../docs/authproc_attributeconditionaladd.md | 312 +++ .../Auth/Process/AttributeConditionalAdd.php | 574 ++++++ .../Process/AttributeConditionalAddTest.php | 1739 +++++++++++++++++ 3 files changed, 2625 insertions(+) create mode 100644 modules/core/docs/authproc_attributeconditionaladd.md create mode 100644 modules/core/src/Auth/Process/AttributeConditionalAdd.php create mode 100644 tests/modules/core/src/Auth/Process/AttributeConditionalAddTest.php diff --git a/modules/core/docs/authproc_attributeconditionaladd.md b/modules/core/docs/authproc_attributeconditionaladd.md new file mode 100644 index 0000000000..d74d561a2d --- /dev/null +++ b/modules/core/docs/authproc_attributeconditionaladd.md @@ -0,0 +1,312 @@ +# `core:AttributeConditionalAdd` + +Filter that adds attributes to the user, optionally only doing so if certain attributes and values already exist the attribute list. + +## Configuration Format + +: `class` + declares that this block will configure an AttributeConditionalAdd authproc. It is required. + +: `%` +allows for optional (zero or more) flags to be specified. These start with a "%" character (eg `%replace`). See the **Flags** section below for more details. + +: `attributes` +defines a list of one or more attributes to add. It is required. + +: `conditions` +is optional. If it is specified, it contains a list of conditions that determine whether the `attributes` will be added or not. If the `conditions` section is not specified (or is an empty list), the `attributes` will be added. See the **Conditions** section below for more details. + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + '%', + 'attributes' => [ + 'attribute' => ['value'], + [...], + ], + 'conditions' => [], + ], + ], + +## Conditions + +Conditions are optional. If there are one or more conditions specified, the attributes will only be added if all of the conditions evaluate to true. By default, all `conditions` must evaluate to true, unless the `%anycondition` flag is specified, in which case the attributes will be added if any of the `conditions` are true. + +### attrExistsAny + +If the current attributes includes any of the listed attribute names, the new attributes in the `attributes` section will be added. + +In the below example, if there is an attribute named **either** `customerId` OR `supplierId` (or both), then the `isExternalUser => ['true']` attribute will be added. + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + 'conditions' => [ + 'attrExistsAny' => [ + 'customerId', + 'supplierId', + ], + ], + 'attributes' => [ + 'isExternalUser' => ['true'], + ], + ], + ], + +### attrExistsAll + +If the current attributes includes all of the listed attribute names, the new attributes in the `attributes` section will be added. + +In the below example, if there is an attribute named `customerId` AND there is an attribute named `companyName`, then the `isCompanyUser => ['true']` attribute will be added. + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + 'conditions' => [ + 'attrExistsAll' => [ + 'customerId', + 'companyName', + ], + ], + 'attributes' => [ + 'isCompanyUser' => ['true'], + ], + ], + ], + +### attrExistsRegexAny + +If the current attributes includes any attribute names that match any of the regular expressions listed, the new attributes in the `attributes` section will be added. + +In the below example, if there is an attribute named **either** starting with `cust` OR ending with `PhoneNumber`, then the `isCustomer => ['true']` attribute will be added. + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + 'conditions' => [ + 'attrExistsRegexAny' => [ + '/^cust/', + '/PhoneNumber$/', + ], + ], + 'attributes' => [ + 'isCustomer' => ['true'], + ], + ], + ], + +### attrExistsRegexAll + +If each of the regular expressions listed matches at least one of the current attributes, the new attributes in the `attributes` section will be added. + +In the below example, if there is an attribute name starting with `email` AND there is an attribute name starting with `member`, then the `isCustomer => ['true']` attribute will be added. + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + 'conditions' => [ + 'attrExistsRegexAll' => [ + '/^email/', + '/^member/', + ], + ], + 'attributes' => [ + 'isCustomer' => ['true'], + ], + ], + ], + +### attrValueIsAny + +If the current attributes includes any of the listed attribute names, and at least one of those has any of the listed values for that attribute, the new attributes in the `attributes` section will be added. + +In the below example, if the user has the `departmentName` attribute set, and one of the values of that attribute is `Physics` or `Chemistry`, or they have a `managementRole` attribute set, and that attribute includes the value of `Vice Chancellor`, then the `newSystemPilotUser => ['true']` attribute will be added. + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + 'conditions' => [ + 'attrValueIsAny' => [ // any of the attributes listed below has any of the values listed + 'departmentName' => ['Physics', Chemistry], + 'managementRole' => ['Vice Chancellor'], + ], + ], + 'attributes' => [ + 'newSystemPilotUser' => ['true'], + ], + ], + ], + +### attrValueIsAll + +If the current attributes includes all of the listed attribute names, and each of those attributes include all of the listed values for that attribute, the new attributes in the `attributes` section will be added. + +Note: this does not mean the values listed are the only values present. They are a subset of the values present. + +In the below example, only the Dean of the Physics department will have the `newSystemPilotUser => ['true']` attribute added. + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + 'conditions' => [ + 'attrValueIsAll' => [ // all of the attributes listed below has all of the values listed + 'departmentName' => ['Physics'], + 'managementRole' => ['Dean'], + ], + ], + 'attributes' => [ + 'newSystemPilotUser' => ['true'], + ], + ], + ], + +### attrValueIsRegexAny + +If the current attributes includes any of the listed attribute names, and has at least one existing value for those attributes that matches any of the listed regular expressions for that attribute, the new attributes in the `attributes` section will be added. + +In the below example, if the user has the `qualifications` attribute set, and one of the values of that attributes starts with `Certified` or ends with `Assessor`, then the `qualifiedTradie => ['true']` attribute will be added. + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + 'conditions' => [ + 'attrValueIsRegexAny' => [ // any of the attributes listed below has a value that matches any of the regex values listed + 'qualifications' => ['/^Certfied/', '/Assessor$/'], + ], + ], + 'attributes' => [ + 'qualifiedTradie' => ['true'], + ], + ], + ], + +### attrValueIsRegexAll + +If the current attributes includes all of the listed attribute names, and all of the existing values for those attributes matches any of the listed regular expressions for that attribute, the new attributes in the `attributes` section will be added. + +In the below example, if the user has the `email` attribute set, and all email addresses listed as values in that attribue end with either `/@staff.example.edu$/` OR `/@student.example.edu$/`, then the `'internalUser' => ['true']` attribute will be added. + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + 'conditions' => [ + 'attrValueIsRegexAll' => [ // all of the attributes listed below, every value matches one of the regex values listed + 'email' => ['/@staff.example.edu$/', '/@student.example.edu$/'], + ], + ], + 'attributes' => [ + 'internalUser' => ['true'], + ], + ], + ], + +## Flags + +`%replace` +: can be used to replace all existing values in target with new ones (any existing values will be lost) + +`%nodupe` +: removes all duplicate values from the `attributes` being added. Without this flag being specified, the default behaviour is that if a value already exists that we're appending to the attribute, a duplicate is added. Note that if there are pre-existing duplicate values in the attributes being added to, those values will also be de-duplicated. + +`%anycondition` +: if there are multiple `conditions`, any of those conditions evaluating to true will cause the `attributes` to be added. Without this flag being specified, the default behaviour is that all those conditions must be true for the values in the `attributes` section to be added. + +## Examples + +The most basic case - unconditionally add a SAML attribute named `source`: + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + 'attributes' => [ + 'source' => ['myidp'], + ], + ], + ], + +You can specify multiple attributes, and attributes can have multiple values: + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + 'attributes' => [ + 'eduPersonPrimaryAffiliation' => 'student', + 'eduPersonAffiliation' => ['student', 'employee', 'members'], + ], + ], + ], + +Append to an existing attribute if a condition is satisfied, removing duplicate values (if they already have the 'management' value in the 'groups' attribute, don't add it again): + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + '%nodupe', + 'conditions' => [ + 'attrValueIsAny' => [ + 'role' => ['Manager', 'Director'] + ], + ], + 'attributes' => [ + 'groups' => ['management'], + ], + ], + ], + +Replace an existing attribute if a given attribute satisfies a condition: + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + '%replace', + 'conditions' => [ + 'attrValueIsAll' => [ + 'userType' => ['Customer'], + 'onStopSupply' => ['true'], + ], + ], + 'attributes' => [ + 'uid' => ['guest'], + ], + ], + ], + +Multiple conditions, where all must be true: + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + 'conditions' => [ + 'attrExistsAny' => [ + 'staffId', + ], + 'attrValueIsAny' => [ + 'departmentName' => ['Physics'], + ], + ], + 'attributes' => [ + 'groups' => ['StaffPhysics'], + ], + ], + ], + +Multiple conditions, where any can be true. In the below case, the user must either have a `supplierId` attribute, or have the "staff" role and be in the "Procurement" department to receive the `'allowedSystems' => ['procurement']` attribute: + + 'authproc' => [ + 50 => [ + 'class' => 'core:AttributeConditionalAdd', + '%anycondition', + 'conditions' => [ + 'attrExistsAny' => [ + 'supplierId', + ], + 'attrValueIsAll' => [ + 'role' => ['Staff'], + 'departmentName' => ['Procurement'], + ], + ], + 'attributes' => [ + 'allowedSystems' => ['procurement'], + ], + ], + ], diff --git a/modules/core/src/Auth/Process/AttributeConditionalAdd.php b/modules/core/src/Auth/Process/AttributeConditionalAdd.php new file mode 100644 index 0000000000..db2f1a5c7d --- /dev/null +++ b/modules/core/src/Auth/Process/AttributeConditionalAdd.php @@ -0,0 +1,574 @@ + $topLevelValues) { + if (is_int($topLevelName)) { + if ($topLevelValues === '%replace') { + $this->replace = true; + } elseif ($topLevelValues === '%nodupe') { + $this->nodupe = true; + } elseif ($topLevelValues === '%anycondition') { + $this->anycondition = true; + } else { + throw new Exception('Unknown flag: ' . var_export($topLevelValues, true)); + } + continue; + } + + if ($topLevelName === 'attributes') { + $this->attributes = $this->constructAttributes($topLevelValues); + } elseif ($topLevelName === "conditions") { + if (!is_array($topLevelValues)) { + throw new Exception('Configuration for "conditions" must be array.'); + } + + foreach ($topLevelValues as $conditionName => $conditionValues) { + // We'll call a function called set for each condition found. + $setterToCall = 'set' . ucfirst($conditionName); + if (!method_exists($this, $setterToCall)) { + throw new Exception('Unknown condition option: ' . var_export($conditionName, true)); + } + $this->$setterToCall($conditionValues); + } + } else { + throw new Exception('Unknown configuration option: ' . var_export($topLevelName, true)); + } + } + + if ($this->attributes === []) { + throw new Exception('No attributes specified to add.'); + } + } + + + private function constructAttributes(array $attributesConfig): array + { + $attributes = []; + + foreach ($attributesConfig as $name => $value) { + if (is_int($name)) { + throw new Exception( + 'Invalid value for "attributes": value must be an associative array of "name"=> ["value", ...].', + ); + } + if (is_string($value)) { + $attributes[$name] = [$value]; + } elseif ( + is_array($value) && + array_is_list($value) && + count($value) === count(array_filter($value, 'is_string')) + ) { + $attributes[$name] = $value; + } else { + throw new Exception( + 'Invalid value for attribute "' . $name . '": value must be a string or an array of strings.', + ); + } + } + + return $attributes; + } + + + private function setAttrExistsAny(array $attrExistsAny): void + { + if (!array_is_list($attrExistsAny)) { + throw new Exception( + 'Invalid value for "attrExistsAny": value must be a list of attribute names.', + ); + } + $this->attrExistsAny = $attrExistsAny; + } + + + private function isConfiguredAttrExistsAny(): bool + { + return $this->attrExistsAny !== []; + } + + + private function processConditionalAttrExistsAny(array $attributes): bool + { + // No attributes to check, so condition is met. + if ($this->attrExistsAny === []) { + return true; + } + + foreach ($this->attrExistsAny as $attrName) { + if (array_key_exists($attrName, $attributes)) { + return true; + } + } + + return false; + } + + + private function setAttrExistsAll(array $attrExistsAll): void + { + if (!array_is_list($attrExistsAll)) { + throw new Exception( + 'Invalid value for "attrExistsAll": value must be a list of attribute names.', + ); + } + $this->attrExistsAll = $attrExistsAll; + } + + + private function isConfiguredAttrExistsAll(): bool + { + return $this->attrExistsAll !== []; + } + + + private function processConditionalAttrExistsAll(array $attributes): bool + { + // No attributes to check, so condition is met. + if ($this->attrExistsAll === []) { + return true; + } + + foreach ($this->attrExistsAll as $attrName) { + if (!array_key_exists($attrName, $attributes)) { + return false; + } + } + + return true; + } + + + private function setAttrExistsRegexAny(array $attrExistsRegexAny): void + { + if (!array_is_list($attrExistsRegexAny)) { + throw new Exception( + 'Invalid value for "attrExistsRegexAny": value must be a list of regular expressions.', + ); + } + $this->attrExistsRegexAny = $attrExistsRegexAny; + } + + + private function isConfiguredAttrExistsRegexAny(): bool + { + return $this->attrExistsRegexAny !== []; + } + + + private function processConditionalAttrExistsRegexAny(array $attributes): bool + { + // No attributes to check, so condition is met. + if ($this->attrExistsRegexAny === []) { + return true; + } + + foreach ($this->attrExistsRegexAny as $attrNameRegex) { + foreach (array_keys($attributes) as $attrName) { + if (preg_match($attrNameRegex, $attrName) === 1) { + return true; + } + } + } + + return false; + } + + + private function setAttrExistsRegexAll(array $attrExistsRegexAll): void + { + if (!array_is_list($attrExistsRegexAll)) { + throw new Exception( + 'Invalid value for "attrExistsRegexAll": value must be a list of regular expressions.', + ); + } + $this->attrExistsRegexAll = $attrExistsRegexAll; + } + + + private function isConfiguredAttrExistsRegexAll(): bool + { + return $this->attrExistsRegexAll !== []; + } + + + private function processConditionalAttrExistsRegexAll(array $attributes): bool + { + // No attributes to check, so condition is met. + if ($this->attrExistsRegexAll === []) { + return true; + } + + foreach ($this->attrExistsRegexAll as $attrNameRegex) { + $found = false; + foreach (array_keys($attributes) as $attrName) { + if (preg_match($attrNameRegex, $attrName) === 1) { + $found = true; + break; + } + } + if (!$found) { + return false; + } + } + + return true; + } + + + private function validateValueConditional(array $attrValue, string $conditionalName): void + { + // Validate that the input is an associative array + if (array_is_list($attrValue)) { + throw new Exception( + 'Invalid value for "' . + $conditionalName . + '": value must be an associative array of "attribute_name" => "attribute_value".', + ); + } + + // Validate that each value in the associative array is a string or an array of strings + foreach ($attrValue as $attrName => $attrValue) { + // Throw an exception if the $attrValue is not a string or an array of strings + if ( + !is_array($attrValue) || + !array_is_list($attrValue) || + count(array_filter($attrValue, 'is_string')) !== count($attrValue) + ) { + throw new Exception( + 'Invalid attribute value in "' . + $conditionalName . + '" for attribute "' . + $attrName . + '": value must be an array of strings.', + ); + } + } + } + + + private function setAttrValueIsAny(array $attrValueIsAny): void + { + $this->validateValueConditional($attrValueIsAny, 'attrValueIsAny'); + $this->attrValueIsAny = $attrValueIsAny; + } + + + private function isConfiguredAttrValueIsAny(): bool + { + return $this->attrValueIsAny !== []; + } + + + private function processConditionalAttrValueIsAny(array $attributes): bool + { + // No attributes to check, so condition is met. + if ($this->attrValueIsAny === []) { + return true; + } + + foreach ($this->attrValueIsAny as $attrName => $attrValue) { + if (array_key_exists($attrName, $attributes)) { + if (is_array($attrValue)) { + foreach ($attrValue as $singleAttrValue) { + if (in_array($singleAttrValue, $attributes[$attrName], true)) { + return true; + } + } + } elseif (in_array($attrValue, $attributes[$attrName], true)) { + return true; + } + } + } + + return false; + } + + + private function setAttrValueIsAll(array $attrValueIsAll): void + { + $this->validateValueConditional($attrValueIsAll, 'attrValueIsAll'); + $this->attrValueIsAll = $attrValueIsAll; + } + + + private function isConfiguredAttrValueIsAll(): bool + { + return $this->attrValueIsAll !== []; + } + + + private function processConditionalAttrValueIsAll(array $attributes): bool + { + // No attributes to check, so condition is met. + if ($this->attrValueIsAll === []) { + return true; + } + + foreach ($this->attrValueIsAll as $attrName => $attrValue) { + if (!array_key_exists($attrName, $attributes)) { + return false; + } + foreach ($attrValue as $singleAttrValue) { + if (!in_array($singleAttrValue, $attributes[$attrName], true)) { + return false; + } + } + } + + return true; + } + + + private function setAttrValueIsRegexAny(array $attrValueIsRegexAny): void + { + $this->validateValueConditional($attrValueIsRegexAny, 'attrValueIsRegexAny'); + $this->attrValueIsRegexAny = $attrValueIsRegexAny; + } + + + private function isConfiguredAttrValueIsRegexAny(): bool + { + return $this->attrValueIsRegexAny !== []; + } + + + private function processConditionalAttrValueIsRegexAny(array $attributes): bool + { + // No attributes to check, so condition is met. + if ($this->attrValueIsRegexAny === []) { + return true; + } + + foreach ($this->attrValueIsRegexAny as $attrName => $attrValueRegexList) { + if (array_key_exists($attrName, $attributes)) { + foreach ($attributes[$attrName] as $attrValue) { + foreach ($attrValueRegexList as $attrValueRegex) { + if (preg_match($attrValueRegex, $attrValue) === 1) { + return true; + } + } + } + } + } + + return false; + } + + + private function setAttrValueIsRegexAll(array $attrValueIsRegexAll): void + { + $this->validateValueConditional($attrValueIsRegexAll, 'attrValueIsRegexAll'); + $this->attrValueIsRegexAll = $attrValueIsRegexAll; + } + + + private function isConfiguredAttrValueIsRegexAll(): bool + { + return $this->attrValueIsRegexAll !== []; + } + + + private function processConditionalAttrValueIsRegexAll(array $attributes): bool + { + // No attributes to check, so condition is met. + if ($this->attrValueIsRegexAll === []) { + return true; + } + + // foreach attribute to check we need to ensure that all regexes match at least one value + foreach ($this->attrValueIsRegexAll as $attrName => $attrValueRegexList) { + if (!array_key_exists($attrName, $attributes)) { + return false; + } + + // Foreach existing attribute value, ensure it matches at least one regex + foreach ($attributes[$attrName] as $existingAttrValue) { + $matched = false; + foreach ($attrValueRegexList as $attrValueRegex) { + if (preg_match($attrValueRegex, $existingAttrValue) === 1) { + $matched = true; + break; + } + } + if (!$matched) { + return false; + } + } + } + + return true; + } + + + /** + * Apply filter to add or replace attributes. + * + * Add or replace existing attributes with the configured values. + * + * @param array &$state The current request + */ + #[\Override] + public function process(array &$state): void + { + Assert::keyExists($state, 'Attributes'); + + $attributes = &$state['Attributes']; + + // Check conditions first. If all conditions succeed, add/append the attributes. + $numConditionsConfigured = 0; + $numConditionsMet = 0; + foreach (get_class_methods($this) as $methodName) { + if (str_starts_with($methodName, 'processConditional')) { + // Only process conditions that are configured. + $isConfiguredMethod = 'isConfigured' . substr($methodName, strlen('processConditional')); + if ($this->$isConfiguredMethod()) { + $numConditionsConfigured++; + if ($this->$methodName($attributes) === true) { + $numConditionsMet++; + } + } + } + } + + // If there are conditions configured, and they are not met, return without adding attributes. + // The anycondition flag indicates whether any condition being met is sufficient. The default is + // that all conditions must be met. + // Note that if no conditions are configured, we always add the attributes. + if ( + $numConditionsConfigured > 0 && (($this->anycondition === true && $numConditionsMet === 0) || + ($this->anycondition === false && $numConditionsMet < $numConditionsConfigured)) + ) { + return; + } + + foreach ($this->attributes as $name => $values) { + if ($this->replace === true || !array_key_exists($name, $attributes)) { + $attributes[$name] = $values; + } elseif ($this->nodupe === true) { + $attributes[$name] = array_unique(array_merge($attributes[$name], $values)); + } else { + $attributes[$name] = array_merge($attributes[$name], $values); + } + } + } +} diff --git a/tests/modules/core/src/Auth/Process/AttributeConditionalAddTest.php b/tests/modules/core/src/Auth/Process/AttributeConditionalAddTest.php new file mode 100644 index 0000000000..a172113716 --- /dev/null +++ b/tests/modules/core/src/Auth/Process/AttributeConditionalAddTest.php @@ -0,0 +1,1739 @@ +process($request); + return $request; + } + + + /** + * Test the most basic functionality - no conditions at all (unconditional add) + */ + public function testUnconditionalAdd(): void + { + $config = [ + 'attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $request = [ + 'Attributes' => [ + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + } + + + /** + * Test single string as attribute value. + */ + public function testStringValue(): void + { + $config = [ + 'attributes' => [ + 'test' => 'value', + ], + ]; + $request = [ + 'Attributes' => [], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('test', $attributes); + $this->assertEquals($attributes['test'], ['value']); + } + + + /** + * Test no conditions at all on existing attributes (unconditional append) + */ + public function testUnconditionalAppend(): void + { + $config = [ + 'attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['admins', 'users']); + } + + + /** + * Test appending an existing value creates duplicates without %nodupe (duplicates allowed) + */ + public function testUnconditionalAppendExistingElement(): void + { + $config = [ + 'attributes' => [ + 'memberOf' => ['users'], + 'anotherAttribute' => ['value1'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'users']); + $this->assertArrayHasKey('anotherAttribute', $attributes); + $this->assertEquals($attributes['anotherAttribute'], ['value1']); + } + + + /** + * Test appending an existing value suppresses duplicates with %nodupe enabled + */ + public function testUnconditionalNoDupeAppendExistingElement(): void + { + $config = [ + '%nodupe', + 'attributes' => [ + 'memberOf' => ['users'], + 'anotherAttribute' => ['value1'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('anotherAttribute', $attributes); + $this->assertEquals($attributes['anotherAttribute'], ['value1']); + } + + + /** + * Test no conditions at all on existing attributes (unconditional replace) + */ + public function testUnconditionalReplace(): void + { + $config = [ + '%replace', + 'attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + } + + + /** + * Test no attributes specified (should error) + */ + public function testNoAttributesSpecified(): void + { + $config = [ + '%replace', + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * Test attributes in configuration not being an associative array (should error) + */ + public function testAttibuteArrayNotAssociative(): void + { + $config = [ + '%replace', + 'attributes' => [ + 'users', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * Test attributes value not being a string or array of strings (should error) + */ + public function testAttibuteArrayValueTypeIncorrect(): void + { + $config = [ + '%replace', + 'attributes' => [ + 'memberOf' => 1, + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * Test attributes value not being a string or array of strings (should error) + */ + public function testAttibuteArrayValueTypeIncorrect2(): void + { + $config = [ + '%replace', + 'attributes' => [ + 'memberOf' => ['test', 1], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * Test AttrExistsAny single attribute add + */ + public function testAttrExistsAnySingleAdd(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAny' => ['memberOf'], + ], + 'attributes' => [ + 'newAttribute' => 'testValue', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('newAttribute', $attributes); + $this->assertEquals($attributes['newAttribute'], ['testValue']); + } + + + /** + * Test AttrExistsAny single attribute append + */ + public function testAttrExistsAnySingleAppend(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAny' => ['memberOf'], + ], + 'attributes' => [ + 'memberOf' => 'admins', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + } + + + /** + * Test AttrExistsAny single attribute type error handling + */ + public function testAttrExistsAnySingleAddWrongType(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAny' => ['memberOf'], + ], + 'attributes' => [ + 'newAttribute' => 1, + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * Test AttrExistsAny where test attribute does not exist + */ + public function testAttrExistsAnyAttributeDoesNotExist(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAny' => ['nonExistentAttribute'], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + } + + + /** + * Test AttrExistsAny where one of the test attributes exists + */ + public function testAttrExistsAnyOneOfManyAttributesExists(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAny' => ['nonExistentAttribute', 'memberOf'], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + } + + + /** + * Test attrExistsAll single attribute add + */ + public function testAttrExistsAllSingleAdd(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAll' => ['memberOf'], + ], + 'attributes' => [ + 'newAttribute' => 'testValue', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('newAttribute', $attributes); + $this->assertEquals($attributes['newAttribute'], ['testValue']); + } + + + /** + * Test attrExistsAll single attribute append + */ + public function testAttrExistsAllSingleAppend(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAll' => ['memberOf'], + ], + 'attributes' => [ + 'memberOf' => 'admins', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + } + + + /** + * Test attrExistsAll single attribute type error handling + */ + public function testAttrExistsAllSingleAddWrongType(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAll' => ['memberOf'], + ], + 'attributes' => [ + 'newAttribute' => 1, + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * Test attrExistsAll where test attribute does not exist + */ + public function testAttrExistsAllAttributeDoesNotExist(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAll' => ['nonExistentAttribute'], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + } + + + /** + * Test attrExistsAll where one of the test attributes exists + */ + public function testAttrExistsAllOneOfManyAttributesExists(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAll' => ['nonExistentAttribute', 'memberOf'], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + } + + + /** + * Test attrExistsAll where one of the test attributes exists + */ + public function testAttrExistsAllAttributesExists(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAll' => ['email', 'memberOf'], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com']); + } + + /////// + /** + * Test attrExistsRegexAny single attribute add + */ + public function testAttrExistsRegexAnySingleAdd(): void + { + $config = [ + 'conditions' => [ + 'attrExistsRegexAny' => ['/^member/'], + ], + 'attributes' => [ + 'newAttribute' => 'testValue', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('newAttribute', $attributes); + $this->assertEquals($attributes['newAttribute'], ['testValue']); + } + + + /** + * Test attrExistsRegexAny single attribute append + */ + public function testAttrExistsRegexAnySingleAppend(): void + { + $config = [ + 'conditions' => [ + 'attrExistsRegexAny' => ['/^member/'], + ], + 'attributes' => [ + 'memberOf' => 'admins', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + } + + + /** + * Test attrExistsRegexAny single attribute type error handling + */ + public function testAttrExistsRegexAnySingleAddWrongType(): void + { + $config = [ + 'conditions' => [ + 'attrExistsRegexAny' => ['/^member/'], + ], + 'attributes' => [ + 'newAttribute' => 1, + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * Test attrExistsRegexAny where test attribute does not exist + */ + public function testAttrExistsRegexAnyAttributeDoesNotExist(): void + { + $config = [ + 'conditions' => [ + 'attrExistsRegexAny' => ['/^nonExistentAttribute/'], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + } + + + /** + * Test attrExistsRegexAny where one of the test attributes exists + */ + public function testAttrExistsRegexAnyOneOfManyAttributesExists(): void + { + $config = [ + 'conditions' => [ + 'attrExistsRegexAny' => ['/^nonExistentAttribute/', '/^member/'], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + } + + + /** + * Test attrExistsRegexAll single attribute add + */ + public function testAttrExistsRegexAllSingleAdd(): void + { + $config = [ + 'conditions' => [ + 'attrExistsRegexAll' => ['/^member/'], + ], + 'attributes' => [ + 'newAttribute' => 'testValue', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('newAttribute', $attributes); + $this->assertEquals($attributes['newAttribute'], ['testValue']); + } + + + /** + * Test attrExistsRegexAll single attribute append + */ + public function testAttrExistsRegexAllSingleAppend(): void + { + $config = [ + 'conditions' => [ + 'attrExistsRegexAll' => ['/^member/'], + ], + 'attributes' => [ + 'memberOf' => 'admins', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + } + + + /** + * Test attrExistsRegexAll single attribute type error handling + */ + public function testAttrExistsRegexAllSingleAddWrongType(): void + { + $config = [ + 'conditions' => [ + 'attrExistsRegexAll' => ['/^member/'], + ], + 'attributes' => [ + 'newAttribute' => 1, + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * Test attrExistsRegexAll where test attribute does not exist + */ + public function testAttrExistsRegexAllAttributeDoesNotExist(): void + { + $config = [ + 'conditions' => [ + 'attrExistsRegexAll' => ['/^nonExistentAttribute/'], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + } + + + /** + * Test attrExistsRegexAll where one of the test attributes exists + */ + public function testAttrExistsRegexAllOneOfManyAttributesExists(): void + { + $config = [ + 'conditions' => [ + 'attrExistsRegexAll' => ['/^nonExistentAttribute/', '/^member/'], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + } + + + /** + * Test attrExistsRegexAll where one of the test attributes exists + */ + public function testAttrExistsRegexAllAttributesExists(): void + { + $config = [ + 'conditions' => [ + 'attrExistsRegexAll' => ['/^email/', '/^member/'], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com']); + } + + + /** + * attrValueIsAny test cases where at least one attribute value exists + */ + public function testAttrValueIsAnyAttributesExists(): void + { + // All of these test cases should pass + $tests = [ + [ + // Single value in array + 'email' => ['bob@example.com'], + ], + [ + // Multiple values, one passes + 'email' => ['bob@example.com', 'alice@example.com'], + ], + [ + // memberOf passes + 'email' => ['alice@example.com'], + 'memberOf' => ['users'], + ], + [ + // one of the emails passes + 'email' => ['alice@example.com', 'bob@example.com'], + 'memberOf' => ['nogroup'], + ], + ]; + + foreach ($tests as $test) { + $config = [ + 'conditions' => [ + 'attrValueIsAny' => $test, + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com']); + } + } + + + /** + * attrValueIsAny multiple values, all exist + */ + public function testAttrValueIsAnyMultipleAttributesExists(): void + { + $config = [ + 'conditions' => [ + 'attrValueIsAny' => [ + 'email' => ['alice@example.com', 'bob@example.com'], + ], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@example.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com', 'alice@example.com']); + } + + + /** + * attrValueIsAny test cases where no attribute values exist + */ + public function testAttrValueIsAnyNoAttributesExist(): void + { + // All of these test cases should fail + $tests = [ + [ + 'email' => ['trudy@example.com'], + ], + [ + 'email' => ['trudy@example.com', 'dennis@example.com'], + ], + [ + 'email' => ['trudy@example.com'], + 'memberOf' => ['nogroup'], + ], + [ + 'email' => ['trudy@example.com', 'dennis@example.com'], + 'memberOf' => ['nogroup'], + ], + ]; + + foreach ($tests as $test) { + $config = [ + 'conditions' => [ + 'attrValueIsAny' => $test, + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@example.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com', 'alice@example.com']); + $this->assertArrayNotHasKey('admins', $attributes['memberOf']); + } + } + + + /** + * attrValueIsAny value is a plain string, not an array + */ + public function testAttrValueIsAnyValueNotInArray(): void + { + $config = [ + 'conditions' => [ + 'attrValueIsAny' => [ + 'email' => 'bob@example.com', + ], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@example.com'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * attrValueIsAny test cases where attribute values are of the wrong type + */ + public function testAttrValueIsAnyValueOfWrongTypeArray(): void + { + $config = [ + 'conditions' => [ + 'attrValueIsAny' => [ + 'email' => [1], + ], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@example.com'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * attrValueIsAny test cases where attribute values are of the wrong type + */ + public function testAttrValueIsAnyOneValueOfWrongType(): void + { + $config = [ + 'conditions' => [ + 'attrValueIsAny' => [ + 'email' => ['trudy@example.com'], + 'memberOf' => [1], + ], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@example.com'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * attrValueIsAll test cases where all attribute values exist + */ + public function testAttrValueIsAllAttributesExists(): void + { + // All of these test cases should pass + $tests = [ + [ + // Single value in array + 'email' => ['bob@example.com'], + ], + [ + // memberOf passes + 'email' => ['bob@example.com'], + 'memberOf' => ['users'], + ], + ]; + + foreach ($tests as $test) { + $config = [ + 'conditions' => [ + 'attrValueIsAll' => $test, + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com']); + } + } + + + /** + * attrValueIsAll multiple values, all exist + */ + public function testAttrValueIsAllMultipleAttributesExists(): void + { + // All of these test cases should pass + $tests = [ + [ + // Single value in array + 'email' => ['bob@example.com'], + ], + [ + // Single value in array + 'email' => ['bob@example.com', 'alice@example.com'], + ], + [ + // memberOf passes + 'email' => ['bob@example.com'], + 'memberOf' => ['users'], + ], + [ + // memberOf passes + 'email' => ['bob@example.com', 'alice@example.com'], + 'memberOf' => ['users'], + ], + ]; + + foreach ($tests as $test) { + $config = [ + 'conditions' => [ + 'attrValueIsAll' => $test, + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@example.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com', 'alice@example.com']); + } + } + + + /** + * attrValueIsAny test cases which should fail + */ + public function testAttrValueIsAllFailCases(): void + { + // All of these test cases should fail + $tests = [ + [ + 'email' => ['trudy@example.com'], + ], + [ + 'email' => ['trudy@example.com', 'bob@example.com'], + ], + [ + 'email' => ['trudy@example.com'], + 'memberOf' => ['users'], + ], + [ + 'email' => ['alice@example.com', 'bob@example.com'], + 'memberOf' => ['nogroup'], + ], + ]; + + foreach ($tests as $test) { + $config = [ + 'conditions' => [ + 'attrValueIsAll' => $test, + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@example.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com', 'alice@example.com']); + $this->assertArrayNotHasKey('admins', $attributes['memberOf']); + } + } + + + /** + * attrValueIsAll value is a plain string, not an array + */ + public function testAttrValueIsAllValueNotInArray(): void + { + $config = [ + 'conditions' => [ + 'attrValueIsAll' => [ + 'email' => 'bob@example.com', + ], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * attrValueIsAll test cases where attribute values are of the wrong type + */ + public function testAttrValueIsAllValueOfWrongTypeSingleValue(): void + { + $config = [ + 'conditions' => [ + 'attrValueIsAll' => [ + 'email' => 1, + ], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@example.com'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * attrValueIsAll test cases where attribute values are of the wrong type + */ + public function testAttrValueIsAllValueOfWrongTypeArray(): void + { + $config = [ + 'conditions' => [ + 'attrValueIsAll' => [ + 'email' => [1], + ], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@example.com'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * attrValueIsAll test cases where attribute values are of the wrong type + */ + public function testAttrValueIsAllValueOfWrongType(): void + { + $config = [ + 'conditions' => [ + 'attrValueIsAll' => [ + 'email' => ['trudy@example.com'], + 'memberOf' => [1], + ], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@example.com'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * attrValueIsRegexAny test cases that should pass + */ + public function testAttrValueIsRegexAnySuccessful(): void + { + // All of these test cases should pass + $tests = [ + [ + 'email' => ['/@example.com$/'], + ], + [ + 'email' => ['/@example.com$/', '/@something.com$/'], + ], + [ + 'email' => ['/@example.com$/'], + 'memberOf' => ['/^nogroup$/'], + ], + [ + 'email' => ['/@something.com$/', '/@example.com$/'], + 'memberOf' => ['/^nogroup$/'], + ], + [ + 'email' => ['/@something.com$/', '/@example.com$/'], + 'memberOf' => ['/^nogroup$/'], + 'noneExistentAttr' => ['/^somevalue$/'], + ], + ]; + + foreach ($tests as $test) { + $config = [ + 'conditions' => [ + 'attrValueIsRegexAny' => $test, + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@anotherdomain.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com', 'alice@anotherdomain.com']); + } + } + + + /** + * attrValueIsRegexAny test cases that should fail + */ + public function testAttrValueIsRegexAnyFail(): void + { + // All of these test cases should fail + $tests = [ + [ + 'email' => ['/@example.net$/'], + ], + [ + 'email' => ['/@example.net$/', '/@something.com$/'], + ], + [ + 'email' => ['/@example.net$/'], + 'memberOf' => ['/^nogroup$/'], + ], + [ + 'email' => ['/@something.com$/', '/@example.net$/'], + 'memberOf' => ['/^nogroup$/'], + ], + [ + 'email' => ['/@something.com$/', '/@example.net$/'], + 'memberOf' => ['/^nogroup$/'], + 'noneExistentAttr' => ['/^somevalue$/'], + ], + ]; + + foreach ($tests as $test) { + $config = [ + 'conditions' => [ + 'attrValueIsRegexAny' => $test, + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@anotherdomain.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com', 'alice@anotherdomain.com']); + $this->assertArrayNotHasKey('admins', $attributes['memberOf']); + } + } + + + /** + * attrValueIsRegexAny value is a plain regex, not in an array + */ + public function testAttrValueIsRegexAnyValueNotArray(): void + { + $config = [ + 'conditions' => [ + 'attrValueIsRegexAny' => [ + // should be an array of regex strings + 'email' => '/@example.com$/', + ], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * attrValueIsRegexAny value is an array, but one item is not a regex + */ + public function testAttrValueIsRegexAnyValueNotRegex(): void + { + $config = [ + 'conditions' => [ + 'attrValueIsRegexAny' => [ + // should be an array of regex strings + 'email' => ['/@example.com$/', 1], + ], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * attrValueIsRegexAll test cases that should pass + */ + public function testAttrValueIsRegexAllSuccessful(): void + { + // All of these test cases should pass + $tests = [ + [ + 'email' => ['/@example.com$/', '/@anotherdomain.com$/'], + ], + [ + 'email' => ['/@example.com$/', '/@anotherdomain.com$/', '/@yetanother.com$/'], + ], + [ + 'email' => ['/@example.com$/', '/@anotherdomain.com$/'], + 'memberOf' => ['/^users$/'], + ], + ]; + + foreach ($tests as $test) { + $config = [ + 'conditions' => [ + 'attrValueIsRegexAll' => $test, + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@anotherdomain.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users', 'admins']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com', 'alice@anotherdomain.com']); + } + } + + + /** + * attrValueIsRegexAll test cases that should fail + */ + public function testAttrValueIsRegexAllFail(): void + { + // All of these test cases should fail + $tests = [ + [ + 'email' => ['/@example.com$/'], + ], + [ + 'email' => ['/@example.com$/', '/@something.com$/'], + ], + [ + 'email' => ['/@example.com$/', '/@anotherdomain.com$/'], + 'memberOf' => ['/^nogroup$/'], + ], + [ + 'email' => ['/@something.com$/', '/@example.net$/'], + 'memberOf' => ['/^users$/'], + ], + [ + 'email' => ['/@example.com$/', '/@anotherdomain.com$/'], + 'noneExistentAttr' => ['/^somevalue$/'], + ], + ]; + + foreach ($tests as $test) { + $config = [ + 'conditions' => [ + 'attrValueIsRegexAll' => $test, + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com', 'alice@anotherdomain.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com', 'alice@anotherdomain.com']); + $this->assertArrayNotHasKey('admins', $attributes['memberOf']); + } + } + + + /** + * attrValueIsRegexAll value is a plain regex, not in an array + */ + public function testAttrValueIsRegexAllValueNotArray(): void + { + $config = [ + 'conditions' => [ + 'attrValueIsRegexAll' => [ + // should be an array of regex strings + 'email' => '/@example.com$/', + ], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * attrValueIsRegexAll value is an array, but one item is not a regex + */ + public function testAttrValueIsRegexAllValueNotRegex(): void + { + $config = [ + 'conditions' => [ + 'attrValueIsRegexAll' => [ + // should be an array of regex strings + 'email' => ['/@example.com$/', 1], + ], + ], + 'attributes' => [ + 'memberOf' => ['admins'], + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $this->expectException(Exception::class); + self::processFilter($config, $request); + $this->fail('Expected exception was not thrown.'); + } + + + /** + * Test multiple conditions being met (no %anycondition) + */ + public function testMultipleConditionsSuccess(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAny' => ['memberOf'], + 'attrValueIsRegexAll' => [ + 'email' => ['/@example.com$/'], + ], + ], + 'attributes' => [ + 'newAttribute' => 'testValue', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com']); + $this->assertArrayHasKey('newAttribute', $attributes); + $this->assertEquals($attributes['newAttribute'], ['testValue']); + } + + + /** + * Test multiple conditions being met (no %anycondition) + */ + public function testMultipleConditionsFailure(): void + { + $config = [ + 'conditions' => [ + 'attrExistsAny' => ['memberOf'], + 'attrValueIsRegexAll' => [ + 'email' => ['/@example.org$/'], + ], + ], + 'attributes' => [ + 'newAttribute' => 'testValue', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com']); + $this->assertArrayNotHasKey('newAttribute', $attributes); + } + + + /** + * Test multiple conditions being met (with %anycondition) + */ + public function testMultipleConditionsAnyConditionSuccess(): void + { + $testConditions = [ + [ + 'attrExistsAny' => ['memberOf'], + 'attrValueIsRegexAll' => [ + 'email' => ['/@example.com$/'], + ], + ], + [ + 'attrExistsAny' => ['memberOf'], + 'attrValueIsRegexAll' => [ + 'email' => ['/@wrongdomain.com$/'], + ], + ], + ]; + + foreach ($testConditions as $conditions) { + $config = [ + '%anycondition', + 'conditions' => $conditions, + 'attributes' => [ + 'newAttribute' => 'testValue', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com']); + $this->assertArrayHasKey('newAttribute', $attributes); + $this->assertEquals($attributes['newAttribute'], ['testValue']); + } + } + + + /** + * Test multiple conditions being met (with %anycondition) + */ + public function testMultipleConditionsAnyConditionFailure(): void + { + $config = [ + '%anycondition', + 'conditions' => [ + 'attrExistsAny' => ['nonExistentAttribute'], + 'attrValueIsRegexAll' => [ + 'email' => ['/@wrongdomain.com$/'], + ], + ], + 'attributes' => [ + 'newAttribute' => 'testValue', + ], + ]; + $request = [ + 'Attributes' => [ + 'memberOf' => ['users'], + 'email' => ['bob@example.com'], + ], + ]; + $result = self::processFilter($config, $request); + $attributes = $result['Attributes']; + $this->assertArrayHasKey('memberOf', $attributes); + $this->assertEquals($attributes['memberOf'], ['users']); + $this->assertArrayHasKey('email', $attributes); + $this->assertEquals($attributes['email'], ['bob@example.com']); + $this->assertArrayNotHasKey('newAttribute', $attributes); + } +} From 907485f5697a2382ec6a8fb10c4d771c2014fe2e Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 8 Mar 2026 14:51:25 +0100 Subject: [PATCH 459/532] Restore trackID for debugSP-module --- modules/debugsp/templates/status.twig | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/debugsp/templates/status.twig b/modules/debugsp/templates/status.twig index d56608be29..f2f516deda 100644 --- a/modules/debugsp/templates/status.twig +++ b/modules/debugsp/templates/status.twig @@ -1,5 +1,4 @@ {% set pagetitle = 'SimpleSAMLphp installation page'|trans %} {% set frontpage_section = 'test' %} -{% set trackid = '' %} {%- include "auth_status.twig" %} From 46e58cab8822038ba398dd4c3d4a6f76a411e81f Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 8 Mar 2026 14:55:48 +0100 Subject: [PATCH 460/532] docs: Bump minimum required PHP-version --- docs/simplesamlphp-install.md | 2 +- modules/admin/src/Controller/Config.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/simplesamlphp-install.md b/docs/simplesamlphp-install.md index 64372c3b25..48fbc1f0ae 100644 --- a/docs/simplesamlphp-install.md +++ b/docs/simplesamlphp-install.md @@ -14,7 +14,7 @@ repository](simplesamlphp-install-repo). ## Prerequisites * A web server capable of executing PHP scripts. -* PHP version >= 8.1.0. +* PHP version >= 8.3.0. * Support for the following PHP extensions: * Always required: `date`, `dom`, `fileinfo`, `filter`, `hash`, `json`, `libxml`, `mbstring`, `openssl`, `pcre`, `session`, `simplexml`, `sodium`, `SPL` and `zlib` diff --git a/modules/admin/src/Controller/Config.php b/modules/admin/src/Controller/Config.php index f227805411..56c684beb5 100644 --- a/modules/admin/src/Controller/Config.php +++ b/modules/admin/src/Controller/Config.php @@ -210,11 +210,11 @@ protected function getPrerequisiteChecks(): array 'descr' => [ Translate::noop('PHP %minimum% or newer is needed. You are running: %current%'), [ - '%minimum%' => '8.2', + '%minimum%' => '8.3', '%current%' => explode('-', phpversion())[0], ], ], - 'enabled' => version_compare(phpversion(), '8.2', '>='), + 'enabled' => version_compare(phpversion(), '8.3', '>='), ], ]; $store = $this->config->getOptionalString('store.type', null); From 57d12860e4f97cb5a346043d9f447b495f25b506 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 8 Mar 2026 15:39:34 +0100 Subject: [PATCH 461/532] Thanks Jetbrain! --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 78a9c89c62..33f04bcfa8 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,10 @@ [![Type coverage](https://shepherd.dev/github/simplesamlphp/simplesamlphp/coverage.svg)](https://shepherd.dev/github/simplesamlphp/simplesamlphp) [![BrowserStack Status](https://automate.browserstack.com/badge.svg?badge_key=LzlCL29sZEVDRXJpdGtxZUdITFA3YjYyUFBBYkVVZDVDcG1YZXRaN2pvTT0tLVhCNzkwVUNGVFVjVFVicUg0R1BNR0E9PQ==--f9efb6f330bd98dd6e3c7b816ac2f0982275a872)](https://automate.browserstack.com/public-build/LzlCL29sZEVDRXJpdGtxZUdITFA3YjYyUFBBYkVVZDVDcG1YZXRaN2pvTT0tLVhCNzkwVUNGVFVjVFVicUg0R1BNR0E9PQ==--f9efb6f330bd98dd6e3c7b816ac2f0982275a872) +## Developed using JetBrains IDEs + +[![JetBrains logo.](https://resources.jetbrains.com/storage/products/company/brand/logos/jetbrains.svg)](https://jb.gg/OpenSource) + This is the official repository of the SimpleSAMLphp software. * [SimpleSAMLphp homepage](https://simplesamlphp.org) From 70fe639f29519c8eec2c370532bd85d2e6eb2ab4 Mon Sep 17 00:00:00 2001 From: Nathan Robertson Date: Tue, 10 Mar 2026 10:04:51 +1100 Subject: [PATCH 462/532] Add missing authproc index listing for AttributeDump and AttributeConditionalAdd (#2607) --- docs/simplesamlphp-authproc.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/simplesamlphp-authproc.md b/docs/simplesamlphp-authproc.md index 78f2f28fa8..682c459f23 100644 --- a/docs/simplesamlphp-authproc.md +++ b/docs/simplesamlphp-authproc.md @@ -130,7 +130,9 @@ The code must return either `true` to run the filter, or `false` to skip it. The following filters are included in the SimpleSAMLphp distribution: * [`core:AttributeAdd`](./core:authproc_attributeadd): Add attributes to the response. +* [`core:AttributeConditionalAdd`](./core:authproc_attributeconditionaladd): Add attributes to the response if certain conditions are met. * [`core:AttributeCopy`](./core:authproc_attributecopy): Copy existing attributes to the response. +* [`core:AttributeDump`](./core:authproc_attributedump): Dump attribute values to the log file. * [`core:AttributeAlter`](./core:authproc_attributealter): Do search-and-replace on attributevalues. * [`core:AttributeLimit`](./core:authproc_attributelimit): Limit the attributes in the response. * [`core:AttributeMap`](./core:authproc_attributemap): Change the name of the attributes. From 44479d827b7cae4b553e62d2d2c3afa96a3532ac Mon Sep 17 00:00:00 2001 From: Nathan Robertson Date: Tue, 10 Mar 2026 19:05:53 +1100 Subject: [PATCH 463/532] Docs fix: core:AttributeDump configuration key "prefix" should be "logPrefix" (#2608) --- modules/core/docs/authproc_attributedump.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/docs/authproc_attributedump.md b/modules/core/docs/authproc_attributedump.md index 35ae957662..36596831a4 100644 --- a/modules/core/docs/authproc_attributedump.md +++ b/modules/core/docs/authproc_attributedump.md @@ -21,7 +21,7 @@ Parameters in this list are to be output to the SimpleSAMLphp logs. If not specified, and `attributes` is also not specified, all attributes will be output. -`prefix` +`logPrefix` : A string to prefix each log line to be outputted. Defaults to "AttributeDump". @@ -79,7 +79,7 @@ Optionally, you can specify a prefix to the log message and a log level to log a 50 => [ 'class' => 'core:AttributeDump', - 'prefix' => 'After running AttributeAdd but before applying AttributeLimit filter', + 'logPrefix' => 'After running AttributeAdd but before applying AttributeLimit filter', 'logLevel' => 'debug', ], From 0ec718751bbeca44cadc9aa7c1b8a45fe65e6993 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 10 Mar 2026 12:21:02 +0100 Subject: [PATCH 464/532] Bugfix: call sources directly instead of their parents; this allows for overriding the handleLogin-method --- modules/core/src/Controller/Login.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/core/src/Controller/Login.php b/modules/core/src/Controller/Login.php index cba5327921..4bb708883b 100644 --- a/modules/core/src/Controller/Login.php +++ b/modules/core/src/Controller/Login.php @@ -155,7 +155,7 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou $organizations = $organization = null; if ($source instanceof UserPassOrgBase) { - $organizations = UserPassOrgBase::listOrganizations($authStateId); + $organizations = $source::listOrganizations($authStateId); $organization = $this->getOrganizationFromRequest($request, $source, $state); } @@ -209,7 +209,7 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou if (($source instanceof UserPassBase) && $source->isRememberMeEnabled()) { if ($request->request->has('remember_me') && ($request->request->get('remember_me') === 'Yes')) { $state['RememberMe'] = true; - $authStateId = Auth\State::saveState($state, UserPassBase::STAGEID); + $authStateId = Auth\State::saveState($state, $source::STAGEID); } } @@ -238,9 +238,9 @@ private function handleLogin(Request $request, UserPassBase|UserPassOrgBase $sou try { if ($source instanceof UserPassOrgBase) { - UserPassOrgBase::handleLogin($authStateId, $username, $password, $organization); + $source::handleLogin($authStateId, $username, $password, $organization); } else { - UserPassBase::handleLogin($authStateId, $username, $password); + $source::handleLogin($authStateId, $username, $password); } } catch (Error\Error $e) { // Login failed. Extract error code and parameters, to display the error From 3fd3dfd5810114eedbbd3f294e69e7450f482466 Mon Sep 17 00:00:00 2001 From: Devon McCarty Date: Tue, 10 Mar 2026 15:32:55 -0400 Subject: [PATCH 465/532] SAML2: Add support for additional sp login hints (#2610) * Add support from SPs for login_hint & LoginHint https://github.com/simplesamlphp/simplesamlphp/issues/2609 * docs: Add changelog for login_hint & LoginHint HTTP parameters --- docs/simplesamlphp-changelog.md | 1 + modules/saml/src/IdP/SAML2.php | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 4249e2f176..673b61508e 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -29,6 +29,7 @@ Released TBD * Fix override over errorURL * Introduced a new assets.salt to allow cache busting without leaking version information (#2490) * If session.check_function is set and can not be called an error is raised (#2498) +* Add 'login_hint' and 'LoginHint' as additional supported username hints from SPs in HTTP parameters (#2609) `authorize` diff --git a/modules/saml/src/IdP/SAML2.php b/modules/saml/src/IdP/SAML2.php index 81c6a57eba..dbab0a355e 100644 --- a/modules/saml/src/IdP/SAML2.php +++ b/modules/saml/src/IdP/SAML2.php @@ -399,6 +399,10 @@ public static function receiveAuthnRequest(IdP $idp): void if (isset($_REQUEST['username'])) { $username = (string) $_REQUEST['username']; + } elseif (isset($_REQUEST['login_hint'])) { + $username = (string) $_REQUEST['login_hint']; + } elseif (isset($_REQUEST['LoginHint'])) { + $username = (string) $_REQUEST['LoginHint']; } $issuer = $request->getIssuer(); From 380c8016b8c4916f1bfd3842f8d24e5da80e2fc9 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Fri, 13 Mar 2026 06:33:36 +1000 Subject: [PATCH 466/532] docs: a word about what to expect if you change secretsalt. (#2611) --- config/config.php.dist | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config/config.php.dist b/config/config.php.dist index 47c9923c42..077540583a 100644 --- a/config/config.php.dist +++ b/config/config.php.dist @@ -188,6 +188,11 @@ $config = [ * * A possible way to generate a random salt is by running the following command from a unix shell: * LC_ALL=C tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' /dev/null;echo + * + * If you alter this value on a live system then your old admin-password will + * no longer work if you have a hashed password. If you use persistent NameIDs + * they will be different and also subject-id / pairwise-id will change. + * It will also invalidate all sessions. */ 'secretsalt' => 'defaultsecretsalt', From 20f3d3342d895bc40385442b918f323f71ba7084 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 14 Mar 2026 12:11:14 +0100 Subject: [PATCH 467/532] Release 2.5.0 --- .github/build/full.json | 16 +- .github/workflows/build-release.yml | 2 +- composer.json | 2 +- composer.lock | 290 +++++++++--------- docs/simplesamlphp-changelog.md | 26 +- modules/admin/src/Controller/Config.php | 5 +- .../UnusedTranslatableStringsCommand.php | 12 +- .../UpdateTranslatableStringsCommand.php | 2 +- 8 files changed, 193 insertions(+), 162 deletions(-) diff --git a/.github/build/full.json b/.github/build/full.json index 28353fc1bb..dcb97c4a57 100644 --- a/.github/build/full.json +++ b/.github/build/full.json @@ -2,35 +2,35 @@ "modules": { "authorize": { "repository": "simplesamlphp/simplesamlphp-module-authorize", - "version": "~1.7.0" + "version": "~1.8.0" }, "consent": { "repository": "simplesamlphp/simplesamlphp-module-consent", - "version": "~1.4.1" + "version": "~1.5.0" }, "consentadmin": { "repository": "simplesamlphp/simplesamlphp-module-consentadmin", - "version": "~1.1.0" + "version": "~1.2.1" }, "discopower": { "repository": "simplesamlphp/simplesamlphp-module-discopower", - "version": "~1.5.1" + "version": "~1.6.0" }, "ldap": { "repository": "simplesamlphp/simplesamlphp-module-ldap", - "version": "~2.4.3" + "version": "~2.5.2" }, "metarefresh": { "repository": "simplesamlphp/simplesamlphp-module-metarefresh", - "version": "~1.2.4" + "version": "~1.3.0" }, "radius": { "repository": "simplesamlphp/simplesamlphp-module-radius", - "version": "~2.0.3" + "version": "~2.1.1" }, "sqlauth": { "repository": "simplesamlphp/simplesamlphp-module-sqlauth", - "version": "~1.3.1" + "version": "~1.4.0" } } } diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index d8bf605419..55ef1a7486 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -23,7 +23,7 @@ jobs: uses: shivammathur/setup-php@v2 with: # Should match the minimum required version for SimpleSAMLphp - php-version: '8.1' + php-version: '8.3' tools: composer:v2, phive extensions: mbstring, xml coverage: none diff --git a/composer.json b/composer.json index 2a4e9900f1..509d55829b 100644 --- a/composer.json +++ b/composer.json @@ -146,5 +146,5 @@ "echo 'Post-install tasks completed!'" ] }, - "version": "v2.5.0-rc6" + "version": "v2.5.0" } diff --git a/composer.lock b/composer.lock index 06330c4b6b..257fd3d763 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3ebe6e9c76b1db9ea31aff5fc1bf76ea", + "content-hash": "4f6e880f7a30af56e681689c4fd70209", "packages": [ { "name": "gettext/gettext", @@ -231,16 +231,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.8.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", "shasum": "" }, "require": { @@ -256,6 +256,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", + "jshttp/mime-db": "1.54.0.1", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { @@ -327,7 +328,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" + "source": "https://github.com/guzzle/psr7/tree/2.9.0" }, "funding": [ { @@ -343,7 +344,7 @@ "type": "tidelift" } ], - "time": "2025-08-23T21:21:41+00:00" + "time": "2026-03-10T16:41:02+00:00" }, { "name": "nyholm/psr7", @@ -908,16 +909,16 @@ }, { "name": "robrichards/xmlseclibs", - "version": "3.1.4", + "version": "3.1.5", "source": { "type": "git", "url": "https://github.com/robrichards/xmlseclibs.git", - "reference": "bc87389224c6de95802b505e5265b0ec2c5bcdbd" + "reference": "03062be78178cbb5e8f605cd255dc32a14981f92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/bc87389224c6de95802b505e5265b0ec2c5bcdbd", - "reference": "bc87389224c6de95802b505e5265b0ec2c5bcdbd", + "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/03062be78178cbb5e8f605cd255dc32a14981f92", + "reference": "03062be78178cbb5e8f605cd255dc32a14981f92", "shasum": "" }, "require": { @@ -944,22 +945,22 @@ ], "support": { "issues": "https://github.com/robrichards/xmlseclibs/issues", - "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.4" + "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.5" }, - "time": "2025-12-08T11:57:53+00:00" + "time": "2026-03-13T10:31:56+00:00" }, { "name": "simplesamlphp/assert", - "version": "v2.0.1", + "version": "v2.0.2", "source": { "type": "git", "url": "https://github.com/simplesamlphp/assert.git", - "reference": "86b10121d5620aaa89f7448a9c8a401380c71f51" + "reference": "9e08dc5525a2259d75e6f6d0ae6754a7b4c13470" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/86b10121d5620aaa89f7448a9c8a401380c71f51", - "reference": "86b10121d5620aaa89f7448a9c8a401380c71f51", + "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/9e08dc5525a2259d75e6f6d0ae6754a7b4c13470", + "reference": "9e08dc5525a2259d75e6f6d0ae6754a7b4c13470", "shasum": "" }, "require": { @@ -1003,9 +1004,9 @@ "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments", "support": { "issues": "https://github.com/simplesamlphp/assert/issues", - "source": "https://github.com/simplesamlphp/assert/tree/v2.0.1" + "source": "https://github.com/simplesamlphp/assert/tree/v2.0.2" }, - "time": "2026-03-02T19:58:46+00:00" + "time": "2026-03-06T18:04:32+00:00" }, { "name": "simplesamlphp/composer-module-installer", @@ -1095,16 +1096,16 @@ }, { "name": "simplesamlphp/saml2", - "version": "v6.1.1", + "version": "v6.1.2", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "c0143cc4a9cb524eeb6f0441854d636153baa738" + "reference": "2a2c3bc9801f26ca2b2905d699dc0b7cff382b22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/c0143cc4a9cb524eeb6f0441854d636153baa738", - "reference": "c0143cc4a9cb524eeb6f0441854d636153baa738", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/2a2c3bc9801f26ca2b2905d699dc0b7cff382b22", + "reference": "2a2c3bc9801f26ca2b2905d699dc0b7cff382b22", "shasum": "" }, "require": { @@ -1165,22 +1166,22 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.1" + "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.2" }, - "time": "2026-02-28T21:51:25+00:00" + "time": "2026-03-14T09:33:34+00:00" }, { "name": "simplesamlphp/saml2-legacy", - "version": "v4.20.0", + "version": "v4.20.1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2-legacy.git", - "reference": "255cd5b9492b19bac7c2a5c5acc89dd80641b2a1" + "reference": "ac325057307cc8765e190fae20f7721d5f7b9f69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/255cd5b9492b19bac7c2a5c5acc89dd80641b2a1", - "reference": "255cd5b9492b19bac7c2a5c5acc89dd80641b2a1", + "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/ac325057307cc8765e190fae20f7721d5f7b9f69", + "reference": "ac325057307cc8765e190fae20f7721d5f7b9f69", "shasum": "" }, "require": { @@ -1189,7 +1190,7 @@ "ext-zlib": "*", "php": "^8.3", "psr/log": "^2.0 || ^3.0", - "robrichards/xmlseclibs": "^3.1.4", + "robrichards/xmlseclibs": "^3.1.5", "simplesamlphp/xml-common": "^2.7", "webmozart/assert": "^2.0" }, @@ -1223,22 +1224,22 @@ ], "description": "SAML2 PHP library from SimpleSAMLphp", "support": { - "source": "https://github.com/simplesamlphp/saml2-legacy/tree/v4.20.0" + "source": "https://github.com/simplesamlphp/saml2-legacy/tree/v4.20.1" }, - "time": "2026-03-01T20:58:16+00:00" + "time": "2026-03-13T12:39:43+00:00" }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.5.12", + "version": "v2.5.13", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "16399d5da8ce8c6c99664265a180c7f9fe3941e1" + "reference": "b59015c77c52e477bcfb2452f8c0f8755c13be1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/16399d5da8ce8c6c99664265a180c7f9fe3941e1", - "reference": "16399d5da8ce8c6c99664265a180c7f9fe3941e1", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/b59015c77c52e477bcfb2452f8c0f8755c13be1d", + "reference": "b59015c77c52e477bcfb2452f8c0f8755c13be1d", "shasum": "" }, "require": { @@ -1259,22 +1260,22 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.12" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.13" }, - "time": "2026-02-20T21:18:30+00:00" + "time": "2026-03-04T16:48:40+00:00" }, { "name": "simplesamlphp/xml-common", - "version": "v2.7.1", + "version": "v2.7.2", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "1adc0d66f9fa15ccca7c525916b02969feb782e2" + "reference": "219b76fc2189ea36f26ff2ed642afd19e12143ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/1adc0d66f9fa15ccca7c525916b02969feb782e2", - "reference": "1adc0d66f9fa15ccca7c525916b02969feb782e2", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/219b76fc2189ea36f26ff2ed642afd19e12143ea", + "reference": "219b76fc2189ea36f26ff2ed642afd19e12143ea", "shasum": "" }, "require": { @@ -1328,20 +1329,20 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2026-02-28T17:37:31+00:00" + "time": "2026-03-11T16:16:22+00:00" }, { "name": "simplesamlphp/xml-security", - "version": "v2.3.0", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-security.git", - "reference": "161123dcdce0a31fdc34c582bf9c73aadde829ed" + "reference": "ded07df15a53ee87a179e8bff79870ffea31e716" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/161123dcdce0a31fdc34c582bf9c73aadde829ed", - "reference": "161123dcdce0a31fdc34c582bf9c73aadde829ed", + "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/ded07df15a53ee87a179e8bff79870ffea31e716", + "reference": "ded07df15a53ee87a179e8bff79870ffea31e716", "shasum": "" }, "require": { @@ -1390,9 +1391,9 @@ ], "support": { "issues": "https://github.com/simplesamlphp/xml-security/issues", - "source": "https://github.com/simplesamlphp/xml-security/tree/v2.3.0" + "source": "https://github.com/simplesamlphp/xml-security/tree/v2.3.1" }, - "time": "2026-02-17T20:20:13+00:00" + "time": "2026-03-13T16:57:53+00:00" }, { "name": "simplesamlphp/xml-soap", @@ -1449,16 +1450,16 @@ }, { "name": "symfony/cache", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "1d06192e8f164e2729b0031e6807d72a6195b8bb" + "reference": "665522ec357540e66c294c08583b40ee576574f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/1d06192e8f164e2729b0031e6807d72a6195b8bb", - "reference": "1d06192e8f164e2729b0031e6807d72a6195b8bb", + "url": "https://api.github.com/repos/symfony/cache/zipball/665522ec357540e66c294c08583b40ee576574f0", + "reference": "665522ec357540e66c294c08583b40ee576574f0", "shasum": "" }, "require": { @@ -1529,7 +1530,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.4.6" + "source": "https://github.com/symfony/cache/tree/v7.4.7" }, "funding": [ { @@ -1549,7 +1550,7 @@ "type": "tidelift" } ], - "time": "2026-02-21T23:29:27+00:00" + "time": "2026-03-06T08:14:57+00:00" }, { "name": "symfony/cache-contracts", @@ -1629,16 +1630,16 @@ }, { "name": "symfony/config", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "9400e2f9226b3b64ebb0a8ae967ae84e54e39640" + "reference": "6c17162555bfb58957a55bb0e43e00035b6ae3d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/9400e2f9226b3b64ebb0a8ae967ae84e54e39640", - "reference": "9400e2f9226b3b64ebb0a8ae967ae84e54e39640", + "url": "https://api.github.com/repos/symfony/config/zipball/6c17162555bfb58957a55bb0e43e00035b6ae3d5", + "reference": "6c17162555bfb58957a55bb0e43e00035b6ae3d5", "shasum": "" }, "require": { @@ -1684,7 +1685,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.4.6" + "source": "https://github.com/symfony/config/tree/v7.4.7" }, "funding": [ { @@ -1704,20 +1705,20 @@ "type": "tidelift" } ], - "time": "2026-02-25T16:50:00+00:00" + "time": "2026-03-06T10:41:14+00:00" }, { "name": "symfony/console", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "6d643a93b47398599124022eb24d97c153c12f27" + "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/6d643a93b47398599124022eb24d97c153c12f27", - "reference": "6d643a93b47398599124022eb24d97c153c12f27", + "url": "https://api.github.com/repos/symfony/console/zipball/e1e6770440fb9c9b0cf725f81d1361ad1835329d", + "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d", "shasum": "" }, "require": { @@ -1782,7 +1783,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.6" + "source": "https://github.com/symfony/console/tree/v7.4.7" }, "funding": [ { @@ -1802,20 +1803,20 @@ "type": "tidelift" } ], - "time": "2026-02-25T17:02:47+00:00" + "time": "2026-03-06T14:06:20+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "a3f7d594ca53a34a7d39ae683fbca09408b0c598" + "reference": "0f651e58f4917fb0e2cd261ccbfe3d71e6e0f5db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a3f7d594ca53a34a7d39ae683fbca09408b0c598", - "reference": "a3f7d594ca53a34a7d39ae683fbca09408b0c598", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/0f651e58f4917fb0e2cd261ccbfe3d71e6e0f5db", + "reference": "0f651e58f4917fb0e2cd261ccbfe3d71e6e0f5db", "shasum": "" }, "require": { @@ -1866,7 +1867,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.4.6" + "source": "https://github.com/symfony/dependency-injection/tree/v7.4.7" }, "funding": [ { @@ -1886,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2026-02-25T16:50:00+00:00" + "time": "2026-03-03T07:48:48+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2406,16 +2407,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "a4022da7530f794aa64cea34b388439afb6323a3" + "reference": "c94bc78c85d76af67918404a95d44940f66a7c2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/a4022da7530f794aa64cea34b388439afb6323a3", - "reference": "a4022da7530f794aa64cea34b388439afb6323a3", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c94bc78c85d76af67918404a95d44940f66a7c2f", + "reference": "c94bc78c85d76af67918404a95d44940f66a7c2f", "shasum": "" }, "require": { @@ -2540,7 +2541,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.4.6" + "source": "https://github.com/symfony/framework-bundle/tree/v7.4.7" }, "funding": [ { @@ -2560,20 +2561,20 @@ "type": "tidelift" } ], - "time": "2026-02-25T16:50:00+00:00" + "time": "2026-03-06T15:39:55+00:00" }, { "name": "symfony/http-client", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "2bde8afd5ab2fe0b05a9c2d4c3c0e28ceb98a154" + "reference": "1010624285470eb60e88ed10035102c75b4ea6af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/2bde8afd5ab2fe0b05a9c2d4c3c0e28ceb98a154", - "reference": "2bde8afd5ab2fe0b05a9c2d4c3c0e28ceb98a154", + "url": "https://api.github.com/repos/symfony/http-client/zipball/1010624285470eb60e88ed10035102c75b4ea6af", + "reference": "1010624285470eb60e88ed10035102c75b4ea6af", "shasum": "" }, "require": { @@ -2641,7 +2642,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.4.6" + "source": "https://github.com/symfony/http-client/tree/v7.4.7" }, "funding": [ { @@ -2661,7 +2662,7 @@ "type": "tidelift" } ], - "time": "2026-02-18T09:46:18+00:00" + "time": "2026-03-05T11:16:58+00:00" }, { "name": "symfony/http-client-contracts", @@ -2743,16 +2744,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "fd97d5e926e988a363cef56fbbf88c5c528e9065" + "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/fd97d5e926e988a363cef56fbbf88c5c528e9065", - "reference": "fd97d5e926e988a363cef56fbbf88c5c528e9065", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f94b3e7b7dafd40e666f0c9ff2084133bae41e81", + "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81", "shasum": "" }, "require": { @@ -2801,7 +2802,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.6" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.7" }, "funding": [ { @@ -2821,20 +2822,20 @@ "type": "tidelift" } ], - "time": "2026-02-21T16:25:55+00:00" + "time": "2026-03-06T13:15:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "002ac0cf4cd972a7fd0912dcd513a95e8a81ce83" + "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/002ac0cf4cd972a7fd0912dcd513a95e8a81ce83", - "reference": "002ac0cf4cd972a7fd0912dcd513a95e8a81ce83", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3b3fcf386c809be990c922e10e4c620d6367cab1", + "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1", "shasum": "" }, "require": { @@ -2920,7 +2921,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.6" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.7" }, "funding": [ { @@ -2940,7 +2941,7 @@ "type": "tidelift" } ], - "time": "2026-02-26T08:30:57+00:00" + "time": "2026-03-06T16:33:18+00:00" }, { "name": "symfony/intl", @@ -4038,16 +4039,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "8903bc9a64cf624ffe522893f3626d5a0b97175c" + "reference": "c67219ca6b79a57b64e36bbb2cd8ba741286587e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/8903bc9a64cf624ffe522893f3626d5a0b97175c", - "reference": "8903bc9a64cf624ffe522893f3626d5a0b97175c", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/c67219ca6b79a57b64e36bbb2cd8ba741286587e", + "reference": "c67219ca6b79a57b64e36bbb2cd8ba741286587e", "shasum": "" }, "require": { @@ -4129,7 +4130,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.4.6" + "source": "https://github.com/symfony/twig-bridge/tree/v7.4.7" }, "funding": [ { @@ -4149,7 +4150,7 @@ "type": "tidelift" } ], - "time": "2026-02-25T16:50:00+00:00" + "time": "2026-03-04T15:37:05+00:00" }, { "name": "symfony/var-dumper", @@ -6356,16 +6357,16 @@ }, { "name": "predis/predis", - "version": "v3.4.1", + "version": "v3.4.2", "source": { "type": "git", "url": "https://github.com/predis/predis.git", - "reference": "0850f2f36ee179f0ff96c92c750e1366c6cd754c" + "reference": "2033429520d8997a7815a2485f56abe6d2d0e075" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/predis/predis/zipball/0850f2f36ee179f0ff96c92c750e1366c6cd754c", - "reference": "0850f2f36ee179f0ff96c92c750e1366c6cd754c", + "url": "https://api.github.com/repos/predis/predis/zipball/2033429520d8997a7815a2485f56abe6d2d0e075", + "reference": "2033429520d8997a7815a2485f56abe6d2d0e075", "shasum": "" }, "require": { @@ -6407,7 +6408,7 @@ ], "support": { "issues": "https://github.com/predis/predis/issues", - "source": "https://github.com/predis/predis/tree/v3.4.1" + "source": "https://github.com/predis/predis/tree/v3.4.2" }, "funding": [ { @@ -6415,7 +6416,7 @@ "type": "github" } ], - "time": "2026-02-23T19:51:21+00:00" + "time": "2026-03-09T20:33:04+00:00" }, { "name": "revolt/event-loop", @@ -7388,16 +7389,16 @@ }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.11.0", + "version": "v1.11.2", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "c63076afb619d950f30958aa551eb7b548f9fc84" + "reference": "3d0a3e2972284148331bdb7acac5daeb95f84bd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/c63076afb619d950f30958aa551eb7b548f9fc84", - "reference": "c63076afb619d950f30958aa551eb7b548f9fc84", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/3d0a3e2972284148331bdb7acac5daeb95f84bd6", + "reference": "3d0a3e2972284148331bdb7acac5daeb95f84bd6", "shasum": "" }, "require": { @@ -7409,19 +7410,18 @@ "phpstan/phpstan": "^2.1", "phpstan/phpstan-mockery": "^2.0", "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^12.3", + "phpunit/phpunit": "^12.3 || ^13.0", "psr/log": "^3.0", + "simplesamlphp/simplesamlphp": "^2.5@dev", "slevomat/coding-standard": "^8.25", "squizlabs/php_codesniffer": "^4.0", - "symfony/phpunit-bridge": "^8.0" - }, - "require-dev": { - "simplesamlphp/simplesamlphp": "^2.5@dev" + "symfony/phpunit-bridge": "^8.0", + "twig/twig": "~3.23" }, "type": "project", "autoload": { "psr-4": { - "SimpleSAML\\TestUtils\\": "lib/" + "SimpleSAML\\TestUtils\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -7442,7 +7442,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2025-12-16T19:55:18+00:00" + "time": "2026-03-14T11:44:58+00:00" }, { "name": "slevomat/coding-standard", @@ -7642,16 +7642,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v8.0.3", + "version": "v8.0.7", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "3c59b07980df5d4ae4a2620287016209802261ea" + "reference": "f95d88d54e34b13ee220a81133261a3c8a6a287a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/3c59b07980df5d4ae4a2620287016209802261ea", - "reference": "3c59b07980df5d4ae4a2620287016209802261ea", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/f95d88d54e34b13ee220a81133261a3c8a6a287a", + "reference": "f95d88d54e34b13ee220a81133261a3c8a6a287a", "shasum": "" }, "require": { @@ -7703,7 +7703,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.3" + "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.7" }, "funding": [ { @@ -7723,7 +7723,7 @@ "type": "tidelift" } ], - "time": "2025-12-10T13:10:54+00:00" + "time": "2026-03-04T13:55:34+00:00" }, { "name": "symfony/polyfill-php84", @@ -7888,23 +7888,23 @@ }, { "name": "symfony/property-info", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "6396b28f44d7c28b209a1bd73acf0dd985a0a4ef" + "reference": "02501d75fd834345da3ecdd8e3200ced39e370f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/6396b28f44d7c28b209a1bd73acf0dd985a0a4ef", - "reference": "6396b28f44d7c28b209a1bd73acf0dd985a0a4ef", + "url": "https://api.github.com/repos/symfony/property-info/zipball/02501d75fd834345da3ecdd8e3200ced39e370f8", + "reference": "02501d75fd834345da3ecdd8e3200ced39e370f8", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/string": "^6.4|^7.0|^8.0", - "symfony/type-info": "~7.3.10|^7.4.4|^8.0.4" + "symfony/type-info": "^7.4.7|^8.0.7" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2|>=7", @@ -7954,7 +7954,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.4.6" + "source": "https://github.com/symfony/property-info/tree/v7.4.7" }, "funding": [ { @@ -7974,20 +7974,20 @@ "type": "tidelift" } ], - "time": "2026-02-13T11:51:31+00:00" + "time": "2026-03-04T15:53:26+00:00" }, { "name": "symfony/serializer", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "83c3cbd6dcb96c1dbe197499a0714f8dceb0f274" + "reference": "bd395bbc6fabd136a48e1a6f91b09f88b5050b0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/83c3cbd6dcb96c1dbe197499a0714f8dceb0f274", - "reference": "83c3cbd6dcb96c1dbe197499a0714f8dceb0f274", + "url": "https://api.github.com/repos/symfony/serializer/zipball/bd395bbc6fabd136a48e1a6f91b09f88b5050b0b", + "reference": "bd395bbc6fabd136a48e1a6f91b09f88b5050b0b", "shasum": "" }, "require": { @@ -8058,7 +8058,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.4.6" + "source": "https://github.com/symfony/serializer/tree/v7.4.7" }, "funding": [ { @@ -8078,7 +8078,7 @@ "type": "tidelift" } ], - "time": "2026-02-25T16:50:00+00:00" + "time": "2026-03-06T13:15:18+00:00" }, { "name": "symfony/translation", @@ -8182,16 +8182,16 @@ }, { "name": "symfony/type-info", - "version": "v7.4.6", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "4855ceea609b2c09e48ff76e12a97a3955531735" + "reference": "31f1e40cbf7851c7354281c90eb1b352c4cb8269" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/4855ceea609b2c09e48ff76e12a97a3955531735", - "reference": "4855ceea609b2c09e48ff76e12a97a3955531735", + "url": "https://api.github.com/repos/symfony/type-info/zipball/31f1e40cbf7851c7354281c90eb1b352c4cb8269", + "reference": "31f1e40cbf7851c7354281c90eb1b352c4cb8269", "shasum": "" }, "require": { @@ -8241,7 +8241,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.4.6" + "source": "https://github.com/symfony/type-info/tree/v7.4.7" }, "funding": [ { @@ -8261,7 +8261,7 @@ "type": "tidelift" } ], - "time": "2026-02-17T14:00:31+00:00" + "time": "2026-03-04T12:49:16+00:00" }, { "name": "theseer/tokenizer", diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 673b61508e..1ec7670201 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -5,14 +5,38 @@ This document lists the changes between versions of SimpleSAMLphp. See the [upgrade notes](https://simplesamlphp.org/docs/stable/simplesamlphp-upgrade-notes.html) for specific information about upgrading. +## Version 2.5.1 + +Released TBD + ## Version 2.5.0 -Released TBD - November 2025 - as soon as Symfony 7.4 is released +Released 2026-03-14 + +* Add ProfileAuth authsource (#2499) +* Ukrainian translation for simplesamlphp (#2501) +* Use PSR-14 events to replace hook infrastructure (#2560) +* Add regular expression support to AttributeValueMap authproc filter (#2558) +* Replaced several uses of guzzlehttp and curl with Symfony's HTTP-client (#2574) +* Many small improvements to code and documentation `authorize` * Add entityID based filtering (simplesamlphp/simplesamlphp-module-authorize#30) (v1.7.0) +`discopower` + +* Add Italian translations (simplesamlphp/simplesamlphp-module-discopower#22) (v1.5.0) +* Make tab-names case-insensitive (v1.5.1) + +`ldap` + +* Verify attribute value is a string before calling strlen (simplesamlphp/simplesamlphp-module-ldap#64) (v2.5.2) + +`radius` + +* Always set the NAS identifier; if not set fall back to the hostname (simplesamlphp/simplesamlphp-module-radius#28) (v2.1.1) + ## Version 2.4.3 Released TBD diff --git a/modules/admin/src/Controller/Config.php b/modules/admin/src/Controller/Config.php index 56c684beb5..09b26c031b 100644 --- a/modules/admin/src/Controller/Config.php +++ b/modules/admin/src/Controller/Config.php @@ -465,9 +465,8 @@ protected function getWarnings(): array $latest = $response->toArray(); $this->session->setData(self::LATEST_VERSION_STATE_KEY, 'version', $latest); } catch (ExceptionInterface $e) { - $message = sprintf("Unable to check for updates; %s", $e->getMessage()); - Logger::warning($message); - $warnings[] = Translate::noop($message); + Logger::warning(sprintf("Unable to check for updates; %s", $e->getMessage())); + $warnings[] = Translate::noop("Unable to check for updates; see logs for details."); } } diff --git a/src/SimpleSAML/Command/UnusedTranslatableStringsCommand.php b/src/SimpleSAML/Command/UnusedTranslatableStringsCommand.php index 3f0a4ae3f4..46f3884cd0 100644 --- a/src/SimpleSAML/Command/UnusedTranslatableStringsCommand.php +++ b/src/SimpleSAML/Command/UnusedTranslatableStringsCommand.php @@ -17,6 +17,7 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Finder\Exception\DirectoryNotFoundException; use Symfony\Component\Finder\Finder; use function array_diff; @@ -85,7 +86,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if (in_array('all', $inputModules) || $inputModules === []) { $modules = array_merge([''], $registeredModules); } elseif (in_array('main', $inputModules)) { - $modules = array_merge([''], ['core', 'admin', 'cron', 'exampleauth', 'multiauth', 'saml']); + $modules = array_merge([''], ['core', 'admin', 'cron', 'debugsp', 'exampleauth', 'multiauth', 'saml']); } else { $known = array_intersect($registeredModules, $inputModules); $unknown = array_diff($inputModules, $registeredModules); @@ -172,7 +173,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int $domain = $domain ?: 'messages'; $finder = new Finder(); - foreach ($finder->files()->in($moduleLocalesDir . '**/LC_MESSAGES/')->name("{$domain}.po") as $poFile) { + try { + $poFiles = $finder->files()->in($moduleLocalesDir . '**/LC_MESSAGES/')->name("{$domain}.po"); + } catch (DirectoryNotFoundException $e) { + $output->writeln($e->getMessage() . "; skipping."); + continue; + } + + foreach ($poFiles as $poFile) { $current = $loader->loadFile($poFile->getPathName()); foreach ($current->getTranslations() as $t) { if (!$template->find(null, $t->getOriginal())) { diff --git a/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php b/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php index 04b842851c..7f44f7018c 100644 --- a/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php +++ b/src/SimpleSAML/Command/UpdateTranslatableStringsCommand.php @@ -112,7 +112,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if (in_array('all', $inputModules) || $inputModules === []) { $modules = array_merge([''], $registeredModules); } elseif (in_array('main', $inputModules)) { - $modules = array_merge([''], ['core', 'admin', 'cron', 'exampleauth', 'multiauth', 'saml']); + $modules = array_merge([''], ['core', 'admin', 'cron', 'debugsp', 'exampleauth', 'multiauth', 'saml']); } else { $known = array_intersect($registeredModules, $inputModules); $unknown = array_diff($inputModules, $registeredModules); From 1b8171b406fb9dfeba0e39cd193019c63b5eaa5e Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 14 Mar 2026 17:20:04 +0100 Subject: [PATCH 468/532] Repurpose branch as master --- .github/build/full.json | 16 ++++++++-------- composer.json | 5 ++--- composer.lock | 2 +- extra/simplesamlphp.spec | 2 +- src/SimpleSAML/Configuration.php | 2 +- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/.github/build/full.json b/.github/build/full.json index dcb97c4a57..eca2e1c587 100644 --- a/.github/build/full.json +++ b/.github/build/full.json @@ -2,35 +2,35 @@ "modules": { "authorize": { "repository": "simplesamlphp/simplesamlphp-module-authorize", - "version": "~1.8.0" + "version": "dev-master" }, "consent": { "repository": "simplesamlphp/simplesamlphp-module-consent", - "version": "~1.5.0" + "version": "dev-master" }, "consentadmin": { "repository": "simplesamlphp/simplesamlphp-module-consentadmin", - "version": "~1.2.1" + "version": "dev-master" }, "discopower": { "repository": "simplesamlphp/simplesamlphp-module-discopower", - "version": "~1.6.0" + "version": "dev-master" }, "ldap": { "repository": "simplesamlphp/simplesamlphp-module-ldap", - "version": "~2.5.2" + "version": "dev-master" }, "metarefresh": { "repository": "simplesamlphp/simplesamlphp-module-metarefresh", - "version": "~1.3.0" + "version": "dev-master" }, "radius": { "repository": "simplesamlphp/simplesamlphp-module-radius", - "version": "~2.1.1" + "version": "dev-master" }, "sqlauth": { "repository": "simplesamlphp/simplesamlphp-module-sqlauth", - "version": "~1.4.0" + "version": "dev-master" } } } diff --git a/composer.json b/composer.json index 509d55829b..7e885c4fc2 100644 --- a/composer.json +++ b/composer.json @@ -129,7 +129,7 @@ }, "extra": { "branch-alias": { - "dev-master": "2.5.0.x-dev" + "dev-master": "2.6.0.x-dev" } }, "scripts": { @@ -145,6 +145,5 @@ "post-install-cmd": [ "echo 'Post-install tasks completed!'" ] - }, - "version": "v2.5.0" + } } diff --git a/composer.lock b/composer.lock index 257fd3d763..6b45b674ad 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4f6e880f7a30af56e681689c4fd70209", + "content-hash": "1058980d977f1c12e3df50080efd4c45", "packages": [ { "name": "gettext/gettext", diff --git a/extra/simplesamlphp.spec b/extra/simplesamlphp.spec index 470a87b9a0..c36b11ae98 100644 --- a/extra/simplesamlphp.spec +++ b/extra/simplesamlphp.spec @@ -1,6 +1,6 @@ %define name simplesamlphp %define summary SAML IDP/SP written in PHP -%define version 2.5.0 +%define version master %define release 1 %define license LGPL 2.1 %define group Networking/WWW diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index 887a555c0f..21827e2ebf 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -41,7 +41,7 @@ class Configuration implements Utils\ClearableState /** * The release version of this package */ - public const string VERSION = '2.5.0'; + public const string VERSION = 'dev-master'; /** * A default value which means that the given option is required. From 90db149ccce7f63404a02d447092dcbe211d907b Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 15 Mar 2026 00:38:02 +0100 Subject: [PATCH 469/532] Fix lock-file --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index 6b45b674ad..2c6d991e54 100644 --- a/composer.lock +++ b/composer.lock @@ -7393,12 +7393,12 @@ "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "3d0a3e2972284148331bdb7acac5daeb95f84bd6" + "reference": "ed52c9077af1965c832c749e7ed062408722f6f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/3d0a3e2972284148331bdb7acac5daeb95f84bd6", - "reference": "3d0a3e2972284148331bdb7acac5daeb95f84bd6", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/ed52c9077af1965c832c749e7ed062408722f6f7", + "reference": "ed52c9077af1965c832c749e7ed062408722f6f7", "shasum": "" }, "require": { @@ -7412,7 +7412,7 @@ "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^12.3 || ^13.0", "psr/log": "^3.0", - "simplesamlphp/simplesamlphp": "^2.5@dev", + "simplesamlphp/simplesamlphp": "^2.5", "slevomat/coding-standard": "^8.25", "squizlabs/php_codesniffer": "^4.0", "symfony/phpunit-bridge": "^8.0", @@ -7442,7 +7442,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2026-03-14T11:44:58+00:00" + "time": "2026-03-14T20:43:16+00:00" }, { "name": "slevomat/coding-standard", From a21e4f6bd67e41c6bc5ef2b69e1cd1ed42f41e28 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 15 Mar 2026 00:42:11 +0100 Subject: [PATCH 470/532] Fix lock-file --- composer.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index 257fd3d763..99557f63fa 100644 --- a/composer.lock +++ b/composer.lock @@ -7393,12 +7393,12 @@ "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "3d0a3e2972284148331bdb7acac5daeb95f84bd6" + "reference": "ed52c9077af1965c832c749e7ed062408722f6f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/3d0a3e2972284148331bdb7acac5daeb95f84bd6", - "reference": "3d0a3e2972284148331bdb7acac5daeb95f84bd6", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/ed52c9077af1965c832c749e7ed062408722f6f7", + "reference": "ed52c9077af1965c832c749e7ed062408722f6f7", "shasum": "" }, "require": { @@ -7412,7 +7412,7 @@ "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^12.3 || ^13.0", "psr/log": "^3.0", - "simplesamlphp/simplesamlphp": "^2.5@dev", + "simplesamlphp/simplesamlphp": "^2.5", "slevomat/coding-standard": "^8.25", "squizlabs/php_codesniffer": "^4.0", "symfony/phpunit-bridge": "^8.0", @@ -7442,7 +7442,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2026-03-14T11:44:58+00:00" + "time": "2026-03-14T20:43:16+00:00" }, { "name": "slevomat/coding-standard", From ca82b5dbfc93bc4dac309f92c845e09927ebde1a Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 15 Mar 2026 16:08:30 +0100 Subject: [PATCH 471/532] Remove unnecessary code Anything proxy-related is already handled by the createHttpClient-method --- src/SimpleSAML/Utils/HTTP.php | 40 ----------------------------------- 1 file changed, 40 deletions(-) diff --git a/src/SimpleSAML/Utils/HTTP.php b/src/SimpleSAML/Utils/HTTP.php index 0cf39c7578..f443b8fa60 100644 --- a/src/SimpleSAML/Utils/HTTP.php +++ b/src/SimpleSAML/Utils/HTTP.php @@ -498,46 +498,6 @@ public function checkURLAllowed(string $url, ?array $trustedSites = null): strin #[\Deprecated('Use an HTTP client instead (see createHttpClient method)', '16-12-2025')] public function fetch(string $url, array $context = [], bool $getHeaders = false) { - $config = Configuration::getInstance(); - - $proxy = $config->getOptionalString('proxy', null); - if ($proxy !== null) { - if (!isset($context['http']['proxy'])) { - $context['http']['proxy'] = $proxy; - } - $proxy_auth = $config->getOptionalString('proxy.auth', null); - if ($proxy_auth !== null) { - $context['http']['header'] = "Proxy-Authorization: Basic " . base64_encode($proxy_auth); - } - if (!isset($context['http']['request_fulluri'])) { - $context['http']['request_fulluri'] = true; - } - /* - * If the remote endpoint over HTTPS uses the SNI extension (Server Name Indication RFC 4366), the proxy - * could introduce a mismatch between the names in the Host: HTTP header and the SNI_server_name in TLS - * negotiation (thanks to Cristiano Valli @ GARR-IDEM to have pointed this problem). - * See: https://bugs.php.net/bug.php?id=63519 - * These controls will force the same value for both fields. - * Marco Ferrante (marco@csita.unige.it), Nov 2012 - */ - if ( - preg_match('#^https#i', $url) - && defined('OPENSSL_TLSEXT_SERVER_NAME') - && OPENSSL_TLSEXT_SERVER_NAME - ) { - // extract the hostname - $hostname = parse_url($url, PHP_URL_HOST); - if (!empty($hostname)) { - $context['ssl'] = [ - 'SNI_server_name' => $hostname, - 'SNI_enabled' => true, - ]; - } else { - Logger::warning('Invalid URL format or local URL used through a proxy'); - } - } - } - $client = $this->createHttpClient($context); $response = $client->request('GET', $url); From 7cc587bbcd95e201f199ae29637482b89fa92c25 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sun, 15 Mar 2026 16:08:30 +0100 Subject: [PATCH 472/532] Remove unnecessary code Anything proxy-related is already handled by the createHttpClient-method --- src/SimpleSAML/Utils/HTTP.php | 40 ----------------------------------- 1 file changed, 40 deletions(-) diff --git a/src/SimpleSAML/Utils/HTTP.php b/src/SimpleSAML/Utils/HTTP.php index 0cf39c7578..f443b8fa60 100644 --- a/src/SimpleSAML/Utils/HTTP.php +++ b/src/SimpleSAML/Utils/HTTP.php @@ -498,46 +498,6 @@ public function checkURLAllowed(string $url, ?array $trustedSites = null): strin #[\Deprecated('Use an HTTP client instead (see createHttpClient method)', '16-12-2025')] public function fetch(string $url, array $context = [], bool $getHeaders = false) { - $config = Configuration::getInstance(); - - $proxy = $config->getOptionalString('proxy', null); - if ($proxy !== null) { - if (!isset($context['http']['proxy'])) { - $context['http']['proxy'] = $proxy; - } - $proxy_auth = $config->getOptionalString('proxy.auth', null); - if ($proxy_auth !== null) { - $context['http']['header'] = "Proxy-Authorization: Basic " . base64_encode($proxy_auth); - } - if (!isset($context['http']['request_fulluri'])) { - $context['http']['request_fulluri'] = true; - } - /* - * If the remote endpoint over HTTPS uses the SNI extension (Server Name Indication RFC 4366), the proxy - * could introduce a mismatch between the names in the Host: HTTP header and the SNI_server_name in TLS - * negotiation (thanks to Cristiano Valli @ GARR-IDEM to have pointed this problem). - * See: https://bugs.php.net/bug.php?id=63519 - * These controls will force the same value for both fields. - * Marco Ferrante (marco@csita.unige.it), Nov 2012 - */ - if ( - preg_match('#^https#i', $url) - && defined('OPENSSL_TLSEXT_SERVER_NAME') - && OPENSSL_TLSEXT_SERVER_NAME - ) { - // extract the hostname - $hostname = parse_url($url, PHP_URL_HOST); - if (!empty($hostname)) { - $context['ssl'] = [ - 'SNI_server_name' => $hostname, - 'SNI_enabled' => true, - ]; - } else { - Logger::warning('Invalid URL format or local URL used through a proxy'); - } - } - } - $client = $this->createHttpClient($context); $response = $client->request('GET', $url); From 7f74d5ef8900f3b22a30f0a407d0f7557b976486 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 16 Mar 2026 12:45:04 +0100 Subject: [PATCH 473/532] bugfix: Set undefined trackid --- docs/simplesamlphp-changelog.md | 2 ++ modules/debugsp/src/Controller/Test.php | 1 + 2 files changed, 3 insertions(+) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 1ec7670201..d526054092 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -9,6 +9,8 @@ See the [upgrade notes](https://simplesamlphp.org/docs/stable/simplesamlphp-upgr Released TBD +* Fix missing trackid error in debugsp-module + ## Version 2.5.0 Released 2026-03-14 diff --git a/modules/debugsp/src/Controller/Test.php b/modules/debugsp/src/Controller/Test.php index 9d3dc3cf11..17ec7e7b03 100644 --- a/modules/debugsp/src/Controller/Test.php +++ b/modules/debugsp/src/Controller/Test.php @@ -159,6 +159,7 @@ public function main(Request $request, ?string $as = null): Response 'authData' => $authData, 'remaining' => isset($authData['Expire']) ? $authData['Expire'] - time() : null, 'nameid' => $nameId, + 'trackId' => $this->session->getTrackID(), 'logouturl' => $httpUtils->getSelfURLNoQuery() . '?as=' . urlencode($as) . '&logout', ]; } From 5bf936ffae61f451ece42f6b1ae97d3982bf03e6 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 16 Mar 2026 12:47:23 +0100 Subject: [PATCH 474/532] Improvement: redirect / to /test --- modules/debugsp/routing/routes/routes.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/debugsp/routing/routes/routes.yml b/modules/debugsp/routing/routes/routes.yml index b4a93294d2..e8e78c8c8f 100644 --- a/modules/debugsp/routing/routes/routes.yml +++ b/modules/debugsp/routing/routes/routes.yml @@ -1,5 +1,14 @@ --- +debugsp-shortcut: + path: / + defaults: { + _controller: 'SimpleSAML\Module\debugsp\Controller\Test::main', + path: /test, + permanent: true + } + methods: [GET] + debugsp-test: path: /test/{as} defaults: { From 16748b03daba7672b5b0a7595a7f4821d7b96c77 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 16 Mar 2026 12:45:04 +0100 Subject: [PATCH 475/532] bugfix: Set undefined trackid --- docs/simplesamlphp-changelog.md | 2 ++ modules/debugsp/src/Controller/Test.php | 1 + 2 files changed, 3 insertions(+) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 1ec7670201..d526054092 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -9,6 +9,8 @@ See the [upgrade notes](https://simplesamlphp.org/docs/stable/simplesamlphp-upgr Released TBD +* Fix missing trackid error in debugsp-module + ## Version 2.5.0 Released 2026-03-14 diff --git a/modules/debugsp/src/Controller/Test.php b/modules/debugsp/src/Controller/Test.php index 9d3dc3cf11..17ec7e7b03 100644 --- a/modules/debugsp/src/Controller/Test.php +++ b/modules/debugsp/src/Controller/Test.php @@ -159,6 +159,7 @@ public function main(Request $request, ?string $as = null): Response 'authData' => $authData, 'remaining' => isset($authData['Expire']) ? $authData['Expire'] - time() : null, 'nameid' => $nameId, + 'trackId' => $this->session->getTrackID(), 'logouturl' => $httpUtils->getSelfURLNoQuery() . '?as=' . urlencode($as) . '&logout', ]; } From 64dc9bd8920a790a5d0e5de564ed7d67276d0ac6 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 16 Mar 2026 12:47:23 +0100 Subject: [PATCH 476/532] Improvement: redirect / to /test --- modules/debugsp/routing/routes/routes.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/debugsp/routing/routes/routes.yml b/modules/debugsp/routing/routes/routes.yml index b4a93294d2..e8e78c8c8f 100644 --- a/modules/debugsp/routing/routes/routes.yml +++ b/modules/debugsp/routing/routes/routes.yml @@ -1,5 +1,14 @@ --- +debugsp-shortcut: + path: / + defaults: { + _controller: 'SimpleSAML\Module\debugsp\Controller\Test::main', + path: /test, + permanent: true + } + methods: [GET] + debugsp-test: path: /test/{as} defaults: { From e07d2e9e91c698092123f1eea6e04627b7dba22f Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 17 Mar 2026 00:11:04 +0100 Subject: [PATCH 477/532] Bump saml2-library and test-framework --- composer.lock | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/composer.lock b/composer.lock index 99557f63fa..7fcdc5a1e1 100644 --- a/composer.lock +++ b/composer.lock @@ -1096,16 +1096,16 @@ }, { "name": "simplesamlphp/saml2", - "version": "v6.1.2", + "version": "v6.1.3", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "2a2c3bc9801f26ca2b2905d699dc0b7cff382b22" + "reference": "dc37bd320d1a7d36688cb2549cd3b5163c1f4ff9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/2a2c3bc9801f26ca2b2905d699dc0b7cff382b22", - "reference": "2a2c3bc9801f26ca2b2905d699dc0b7cff382b22", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/dc37bd320d1a7d36688cb2549cd3b5163c1f4ff9", + "reference": "dc37bd320d1a7d36688cb2549cd3b5163c1f4ff9", "shasum": "" }, "require": { @@ -1166,9 +1166,9 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.2" + "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.3" }, - "time": "2026-03-14T09:33:34+00:00" + "time": "2026-03-16T20:18:24+00:00" }, { "name": "simplesamlphp/saml2-legacy", @@ -5747,11 +5747,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.40", + "version": "2.1.41", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", - "reference": "9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a2eae8f20856b3afe74bf1f9726ce8c11438e300", + "reference": "a2eae8f20856b3afe74bf1f9726ce8c11438e300", "shasum": "" }, "require": { @@ -5796,7 +5796,7 @@ "type": "github" } ], - "time": "2026-02-23T15:04:35+00:00" + "time": "2026-03-16T18:24:10+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -6778,16 +6778,16 @@ }, { "name": "sebastian/environment", - "version": "8.0.3", + "version": "8.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" + "reference": "7b8842c2d8e85d0c3a5831236bf5869af6ab2a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/7b8842c2d8e85d0c3a5831236bf5869af6ab2a11", + "reference": "7b8842c2d8e85d0c3a5831236bf5869af6ab2a11", "shasum": "" }, "require": { @@ -6830,7 +6830,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.4" }, "funding": [ { @@ -6850,7 +6850,7 @@ "type": "tidelift" } ], - "time": "2025-08-12T14:11:56+00:00" + "time": "2026-03-15T07:05:40+00:00" }, { "name": "sebastian/exporter", @@ -7389,16 +7389,16 @@ }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.11.2", + "version": "v1.11.4", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "ed52c9077af1965c832c749e7ed062408722f6f7" + "reference": "cda30b7d010cb101596738940d417c383140665e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/ed52c9077af1965c832c749e7ed062408722f6f7", - "reference": "ed52c9077af1965c832c749e7ed062408722f6f7", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/cda30b7d010cb101596738940d417c383140665e", + "reference": "cda30b7d010cb101596738940d417c383140665e", "shasum": "" }, "require": { @@ -7442,7 +7442,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2026-03-14T20:43:16+00:00" + "time": "2026-03-16T19:13:09+00:00" }, { "name": "slevomat/coding-standard", From a4fc9e530f50e61b7e79e3ebf9bae53877cc2b82 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Tue, 17 Mar 2026 00:10:49 +0100 Subject: [PATCH 478/532] Bump saml2-library and test-framework --- composer.json | 2 +- composer.lock | 50 ++++++++++++++++++++++++++------------------------ 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/composer.json b/composer.json index 7e885c4fc2..6c15959e26 100644 --- a/composer.json +++ b/composer.json @@ -100,7 +100,7 @@ "gettext/php-scanner": "~2.0", "mikey179/vfsstream": "~1.6", "predis/predis": "~3.3", - "simplesamlphp/simplesamlphp-test-framework": "~1.11", + "simplesamlphp/simplesamlphp-test-framework": "~1.11 || dev-master", "symfony/translation": "~7.4" }, "suggest": { diff --git a/composer.lock b/composer.lock index 2c6d991e54..5ac50fa08c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1058980d977f1c12e3df50080efd4c45", + "content-hash": "6ef358ecdb5a5022aee766afddb8af5d", "packages": [ { "name": "gettext/gettext", @@ -1096,16 +1096,16 @@ }, { "name": "simplesamlphp/saml2", - "version": "v6.1.2", + "version": "v6.1.3", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "2a2c3bc9801f26ca2b2905d699dc0b7cff382b22" + "reference": "dc37bd320d1a7d36688cb2549cd3b5163c1f4ff9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/2a2c3bc9801f26ca2b2905d699dc0b7cff382b22", - "reference": "2a2c3bc9801f26ca2b2905d699dc0b7cff382b22", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/dc37bd320d1a7d36688cb2549cd3b5163c1f4ff9", + "reference": "dc37bd320d1a7d36688cb2549cd3b5163c1f4ff9", "shasum": "" }, "require": { @@ -1166,9 +1166,9 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.2" + "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.3" }, - "time": "2026-03-14T09:33:34+00:00" + "time": "2026-03-16T20:18:24+00:00" }, { "name": "simplesamlphp/saml2-legacy", @@ -5747,11 +5747,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.40", + "version": "2.1.41", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", - "reference": "9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a2eae8f20856b3afe74bf1f9726ce8c11438e300", + "reference": "a2eae8f20856b3afe74bf1f9726ce8c11438e300", "shasum": "" }, "require": { @@ -5796,7 +5796,7 @@ "type": "github" } ], - "time": "2026-02-23T15:04:35+00:00" + "time": "2026-03-16T18:24:10+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -6778,16 +6778,16 @@ }, { "name": "sebastian/environment", - "version": "8.0.3", + "version": "8.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68" + "reference": "7b8842c2d8e85d0c3a5831236bf5869af6ab2a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/24a711b5c916efc6d6e62aa65aa2ec98fef77f68", - "reference": "24a711b5c916efc6d6e62aa65aa2ec98fef77f68", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/7b8842c2d8e85d0c3a5831236bf5869af6ab2a11", + "reference": "7b8842c2d8e85d0c3a5831236bf5869af6ab2a11", "shasum": "" }, "require": { @@ -6830,7 +6830,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.3" + "source": "https://github.com/sebastianbergmann/environment/tree/8.0.4" }, "funding": [ { @@ -6850,7 +6850,7 @@ "type": "tidelift" } ], - "time": "2025-08-12T14:11:56+00:00" + "time": "2026-03-15T07:05:40+00:00" }, { "name": "sebastian/exporter", @@ -7389,16 +7389,16 @@ }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.11.2", + "version": "v1.11.4", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "ed52c9077af1965c832c749e7ed062408722f6f7" + "reference": "0d8c956f70f6f694db4e4e11c298e5507ef9652d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/ed52c9077af1965c832c749e7ed062408722f6f7", - "reference": "ed52c9077af1965c832c749e7ed062408722f6f7", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/0d8c956f70f6f694db4e4e11c298e5507ef9652d", + "reference": "0d8c956f70f6f694db4e4e11c298e5507ef9652d", "shasum": "" }, "require": { @@ -7412,7 +7412,7 @@ "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^12.3 || ^13.0", "psr/log": "^3.0", - "simplesamlphp/simplesamlphp": "^2.5", + "simplesamlphp/simplesamlphp": "^2.5 || dev-master", "slevomat/coding-standard": "^8.25", "squizlabs/php_codesniffer": "^4.0", "symfony/phpunit-bridge": "^8.0", @@ -7442,7 +7442,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2026-03-14T20:43:16+00:00" + "time": "2026-03-16T23:23:07+00:00" }, { "name": "slevomat/coding-standard", @@ -8365,7 +8365,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": { + "simplesamlphp/simplesamlphp-test-framework": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { From 36e01ce2fbaa7f9090825bbf56d3cf3149bcb75d Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 18 Mar 2026 14:21:52 +0100 Subject: [PATCH 479/532] Fix phpdoc: it's an array in SSP-format, not an array of actual AttributeAuthorityDescriptors --- src/SimpleSAML/Metadata/SAMLParser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SimpleSAML/Metadata/SAMLParser.php b/src/SimpleSAML/Metadata/SAMLParser.php index 736350d4ff..5d449bd732 100644 --- a/src/SimpleSAML/Metadata/SAMLParser.php +++ b/src/SimpleSAML/Metadata/SAMLParser.php @@ -708,7 +708,7 @@ public function getMetadata20IdP(): ?array /** * Retrieve AttributeAuthorities from the metadata. * - * @return \SAML2\XML\md\AttributeAuthorityDescriptor[] Array of AttributeAuthorityDescriptor entries. + * @return array Array of AttributeAuthorityDescriptor entries. */ public function getAttributeAuthorities(): array { From f10b7017c3d9d255caabe70f39ccfff9a2086590 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 18 Mar 2026 14:21:52 +0100 Subject: [PATCH 480/532] Fix phpdoc: it's an array in SSP-format, not an array of actual AttributeAuthorityDescriptors --- src/SimpleSAML/Metadata/SAMLParser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SimpleSAML/Metadata/SAMLParser.php b/src/SimpleSAML/Metadata/SAMLParser.php index 736350d4ff..5d449bd732 100644 --- a/src/SimpleSAML/Metadata/SAMLParser.php +++ b/src/SimpleSAML/Metadata/SAMLParser.php @@ -708,7 +708,7 @@ public function getMetadata20IdP(): ?array /** * Retrieve AttributeAuthorities from the metadata. * - * @return \SAML2\XML\md\AttributeAuthorityDescriptor[] Array of AttributeAuthorityDescriptor entries. + * @return array Array of AttributeAuthorityDescriptor entries. */ public function getAttributeAuthorities(): array { From da9762e0ddd65ddc3a94661c339ee72eb9c730c3 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 18 Mar 2026 16:04:46 +0100 Subject: [PATCH 481/532] Bump metarefresh-module --- .github/build/full.json | 2 +- docs/simplesamlphp-changelog.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/build/full.json b/.github/build/full.json index dcb97c4a57..f9c96cb9f0 100644 --- a/.github/build/full.json +++ b/.github/build/full.json @@ -22,7 +22,7 @@ }, "metarefresh": { "repository": "simplesamlphp/simplesamlphp-module-metarefresh", - "version": "~1.3.0" + "version": "~1.3.1" }, "radius": { "repository": "simplesamlphp/simplesamlphp-module-radius", diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index d526054092..1c887999df 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -11,6 +11,10 @@ Released TBD * Fix missing trackid error in debugsp-module +`metarefresh` + +* Fix compatibility with SSP 2.5 (v1.3.1) + ## Version 2.5.0 Released 2026-03-14 From c97fcf79f39ce8587a5e6821c348be214ac05462 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 18 Mar 2026 22:40:21 +0100 Subject: [PATCH 482/532] Remove .phive directory from tarball --- .gitattributes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index f26a230f4b..42cc7243f5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -22,4 +22,4 @@ phpunit.xml export-ignore .markdownlint.yml export-ignore .markdownlintrc export-ignore *.php.dist linguist-language=php -.phive +.phive export-ignore From 01d3b1e110289ce15f0bb02ce42aad7435501191 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 18 Mar 2026 22:44:48 +0100 Subject: [PATCH 483/532] Bump test-framework --- composer.lock | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/composer.lock b/composer.lock index 5ac50fa08c..c70e978be0 100644 --- a/composer.lock +++ b/composer.lock @@ -4398,7 +4398,7 @@ }, { "name": "twig/intl-extra", - "version": "v3.23.0", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", @@ -4446,7 +4446,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.23.0" + "source": "https://github.com/twigphp/intl-extra/tree/v3.24.0" }, "funding": [ { @@ -4462,16 +4462,16 @@ }, { "name": "twig/twig", - "version": "v3.23.0", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9" + "reference": "a6769aefb305efef849dc25c9fd1653358c148f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", - "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a6769aefb305efef849dc25c9fd1653358c148f0", + "reference": "a6769aefb305efef849dc25c9fd1653358c148f0", "shasum": "" }, "require": { @@ -4481,7 +4481,8 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "phpstan/phpstan": "^2.0", + "php-cs-fixer/shim": "^3.0@stable", + "phpstan/phpstan": "^2.0@stable", "psr/container": "^1.0|^2.0", "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, @@ -4525,7 +4526,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.23.0" + "source": "https://github.com/twigphp/Twig/tree/v3.24.0" }, "funding": [ { @@ -4537,7 +4538,7 @@ "type": "tidelift" } ], - "time": "2026-01-23T21:00:41+00:00" + "time": "2026-03-17T21:31:11+00:00" }, { "name": "webmozart/assert", @@ -4608,12 +4609,12 @@ "version": "4.3.0", "source": { "type": "git", - "url": "https://github.com/azjezz/psl.git", + "url": "https://github.com/php-standard-library/php-standard-library.git", "reference": "74c95be0214eb7ea39146ed00ac4eb71b45d787b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/azjezz/psl/zipball/74c95be0214eb7ea39146ed00ac4eb71b45d787b", + "url": "https://api.github.com/repos/php-standard-library/php-standard-library/zipball/74c95be0214eb7ea39146ed00ac4eb71b45d787b", "reference": "74c95be0214eb7ea39146ed00ac4eb71b45d787b", "shasum": "" }, @@ -4664,8 +4665,8 @@ ], "description": "PHP Standard Library", "support": { - "issues": "https://github.com/azjezz/psl/issues", - "source": "https://github.com/azjezz/psl/tree/4.3.0" + "issues": "https://github.com/php-standard-library/php-standard-library/issues", + "source": "https://github.com/php-standard-library/php-standard-library/tree/4.3.0" }, "funding": [ { @@ -4677,6 +4678,7 @@ "type": "github" } ], + "abandoned": "php-standard-library/php-standard-library", "time": "2026-02-24T01:58:53+00:00" }, { @@ -5747,11 +5749,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.41", + "version": "2.1.42", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a2eae8f20856b3afe74bf1f9726ce8c11438e300", - "reference": "a2eae8f20856b3afe74bf1f9726ce8c11438e300", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1279e1ce86ba768f0780c9d889852b4e02ff40d0", + "reference": "1279e1ce86ba768f0780c9d889852b4e02ff40d0", "shasum": "" }, "require": { @@ -5796,7 +5798,7 @@ "type": "github" } ], - "time": "2026-03-16T18:24:10+00:00" + "time": "2026-03-17T14:58:32+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -7393,12 +7395,12 @@ "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "0d8c956f70f6f694db4e4e11c298e5507ef9652d" + "reference": "5e6e205126f6e9857ac9b4fda148c090a31b7b30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/0d8c956f70f6f694db4e4e11c298e5507ef9652d", - "reference": "0d8c956f70f6f694db4e4e11c298e5507ef9652d", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/5e6e205126f6e9857ac9b4fda148c090a31b7b30", + "reference": "5e6e205126f6e9857ac9b4fda148c090a31b7b30", "shasum": "" }, "require": { @@ -7412,7 +7414,7 @@ "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^12.3 || ^13.0", "psr/log": "^3.0", - "simplesamlphp/simplesamlphp": "^2.5 || dev-master", + "simplesamlphp/simplesamlphp": "*", "slevomat/coding-standard": "^8.25", "squizlabs/php_codesniffer": "^4.0", "symfony/phpunit-bridge": "^8.0", @@ -7442,7 +7444,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2026-03-16T23:23:07+00:00" + "time": "2026-03-18T21:36:42+00:00" }, { "name": "slevomat/coding-standard", From f73f1cb231d5543bdeda2b173d9a48ab7788d4c4 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 18 Mar 2026 23:30:17 +0100 Subject: [PATCH 484/532] Fix inconsistency with the sp-configuration --- docs/simplesamlphp-reference-idp-hosted.md | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/simplesamlphp-reference-idp-hosted.md b/docs/simplesamlphp-reference-idp-hosted.md index e21c52a49a..b17e1d2e10 100644 --- a/docs/simplesamlphp-reference-idp-hosted.md +++ b/docs/simplesamlphp-reference-idp-hosted.md @@ -60,12 +60,12 @@ in the advanced features page. ```php 'contacts' => [ [ - 'ContactType' => 'support', - 'EmailAddress' => 'support@example.org', - 'GivenName' => 'John', - 'SurName' => 'Doe', - 'TelephoneNumber' => '+31(0)12345678', - 'Company' => 'Example Inc.', + 'contactType' => 'support', + 'emailAddress' => 'support@example.org', + 'givenName' => 'John', + 'surName' => 'Doe', + 'telephoneNumber' => '+31(0)12345678', + 'company' => 'Example Inc.', ], ], ``` @@ -75,12 +75,12 @@ in the advanced features page. ```php 'contacts' => [ [ - 'ContactType' => 'other', - 'EmailAddress' => 'mailto:abuse@example.org', - 'GivenName' => 'John', - 'SurName' => 'Doe', - 'TelephoneNumber' => '+31(0)12345678', - 'Company' => 'Example Inc.', + 'contactType' => 'other', + 'emailAddress' => 'mailto:abuse@example.org', + 'givenName' => 'John', + 'surName' => 'Doe', + 'telephoneNumber' => '+31(0)12345678', + 'company' => 'Example Inc.', 'attributes' => [ [ 'namespaceURI' => 'http://refeds.org/metadata', From ff5692e0149a345e60ea89ef033d09f0d18e72fd Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 18 Mar 2026 23:30:17 +0100 Subject: [PATCH 485/532] Fix inconsistency with the sp-configuration --- docs/simplesamlphp-reference-idp-hosted.md | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/simplesamlphp-reference-idp-hosted.md b/docs/simplesamlphp-reference-idp-hosted.md index e21c52a49a..b17e1d2e10 100644 --- a/docs/simplesamlphp-reference-idp-hosted.md +++ b/docs/simplesamlphp-reference-idp-hosted.md @@ -60,12 +60,12 @@ in the advanced features page. ```php 'contacts' => [ [ - 'ContactType' => 'support', - 'EmailAddress' => 'support@example.org', - 'GivenName' => 'John', - 'SurName' => 'Doe', - 'TelephoneNumber' => '+31(0)12345678', - 'Company' => 'Example Inc.', + 'contactType' => 'support', + 'emailAddress' => 'support@example.org', + 'givenName' => 'John', + 'surName' => 'Doe', + 'telephoneNumber' => '+31(0)12345678', + 'company' => 'Example Inc.', ], ], ``` @@ -75,12 +75,12 @@ in the advanced features page. ```php 'contacts' => [ [ - 'ContactType' => 'other', - 'EmailAddress' => 'mailto:abuse@example.org', - 'GivenName' => 'John', - 'SurName' => 'Doe', - 'TelephoneNumber' => '+31(0)12345678', - 'Company' => 'Example Inc.', + 'contactType' => 'other', + 'emailAddress' => 'mailto:abuse@example.org', + 'givenName' => 'John', + 'surName' => 'Doe', + 'telephoneNumber' => '+31(0)12345678', + 'company' => 'Example Inc.', 'attributes' => [ [ 'namespaceURI' => 'http://refeds.org/metadata', From 5bee5527c10a5923f82877628392dc0fd9014e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Menrath?= <99024746+Menrath@users.noreply.github.com> Date: Thu, 19 Mar 2026 01:02:34 +0100 Subject: [PATCH 486/532] SAML: Make FilterScopes handling of non-scoped values configurable (#2615) --- .../saml/src/Auth/Process/FilterScopes.php | 19 +++++++++++-- .../src/Auth/Process/FilterScopesTest.php | 28 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/modules/saml/src/Auth/Process/FilterScopes.php b/modules/saml/src/Auth/Process/FilterScopes.php index 7a32f0aae0..9dce60d520 100644 --- a/modules/saml/src/Auth/Process/FilterScopes.php +++ b/modules/saml/src/Auth/Process/FilterScopes.php @@ -24,6 +24,15 @@ class FilterScopes extends ProcessingFilter 'eduPersonPrincipalName', ]; + /** + * Whether to allow values without a scope. + * + * - true = keep non-scoped values (backwards-compatible default) + * - false = remove non-scoped values + * + * @var bool + */ + private bool $allowNonScoped = true; /** * Constructor for the processing filter. @@ -38,6 +47,10 @@ public function __construct(array &$config, $reserved) if (array_key_exists('attributes', $config) && !empty($config['attributes'])) { $this->scopedAttributes = $config['attributes']; } + + if (\array_key_exists('allowNonScoped', $config) && \is_bool($config['allowNonScoped'])) { + $this->allowNonScoped = $config['allowNonScoped']; + } } @@ -69,8 +82,10 @@ public function process(array &$state): void foreach ($values as $value) { @list(, $scope) = explode('@', $value, 2); if ($scope === null) { - $newValues[] = $value; - continue; // there's no scope + if ($this->allowNonScoped) { + $newValues[] = $value; // there's no scope, but keep as-is + } + continue; } if (in_array($scope, $validScopes, true)) { diff --git a/tests/modules/saml/src/Auth/Process/FilterScopesTest.php b/tests/modules/saml/src/Auth/Process/FilterScopesTest.php index ebe3b9319b..73a02725e1 100644 --- a/tests/modules/saml/src/Auth/Process/FilterScopesTest.php +++ b/tests/modules/saml/src/Auth/Process/FilterScopesTest.php @@ -222,4 +222,32 @@ public function testAttributeValueMultipleAt(): void $result = $this->processFilter($config, $request); $this->assertEquals($request['Attributes'], $result['Attributes']); } + + /** + * Test that non-scoped values pass or not depending on default or filter config setting. + */ + public function testNonScopedValuesRemovedWhenDisallowed(): void + { + $config = [ + // Explicitly disallow non-scoped values + 'allowNonScoped' => false, + ]; + + $request = [ + 'Source' => [ + 'SingleSignOnService' => [ + [ + 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', + 'Location' => 'https://example.org/saml2/idp/SSOService.php', + ], + ], + ], + 'Attributes' => [ + 'eduPersonPrincipalName' => ['jdoe'], // no scope part + ], + ]; + + $result = $this->processFilter($config, $request); + $this->assertEquals([], $result['Attributes']); + } } From 1993139f817af61f1b58969e0a2baedc8793a32c Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Thu, 19 Mar 2026 10:11:12 +1000 Subject: [PATCH 487/532] docs: information on allowNonScoped for FilterScopes (#2616) --- modules/saml/docs/filterscopes.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/saml/docs/filterscopes.md b/modules/saml/docs/filterscopes.md index 06e661ca94..05c6f5339b 100644 --- a/modules/saml/docs/filterscopes.md +++ b/modules/saml/docs/filterscopes.md @@ -31,6 +31,9 @@ Here are the options available for the filter: : An array containing a list of attributes that are scoped and therefore should be evaluated. Defaults to _eduPersonPrincipalName_ and _eduPersonScopedAffiliation_. +`allowNonScoped` +: Boolean defaults to true. Set to false to avoid copying attributes without a scope. + Examples -------- From 69a168c9552c4e76147458d66ddeca1eb3502ebf Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Fri, 20 Mar 2026 10:07:30 +0100 Subject: [PATCH 488/532] Start using `composer` to get SSP version (#2617) * Use composer to get SSP version * Apply phpcbf fixes --- modules/saml/src/Auth/Process/FilterScopes.php | 1 + src/SimpleSAML/Configuration.php | 14 ++++++++------ .../saml/src/Auth/Process/FilterScopesTest.php | 3 ++- tests/src/SimpleSAML/ConfigurationTest.php | 6 +++++- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/modules/saml/src/Auth/Process/FilterScopes.php b/modules/saml/src/Auth/Process/FilterScopes.php index 9dce60d520..9daf43cf93 100644 --- a/modules/saml/src/Auth/Process/FilterScopes.php +++ b/modules/saml/src/Auth/Process/FilterScopes.php @@ -34,6 +34,7 @@ class FilterScopes extends ProcessingFilter */ private bool $allowNonScoped = true; + /** * Constructor for the processing filter. * diff --git a/src/SimpleSAML/Configuration.php b/src/SimpleSAML/Configuration.php index 21827e2ebf..7566484df8 100644 --- a/src/SimpleSAML/Configuration.php +++ b/src/SimpleSAML/Configuration.php @@ -38,11 +38,6 @@ */ class Configuration implements Utils\ClearableState { - /** - * The release version of this package - */ - public const string VERSION = 'dev-master'; - /** * A default value which means that the given option is required. */ @@ -384,7 +379,14 @@ public static function getInstance(string $instancename = 'simplesaml'): Configu */ public function getVersion(): string { - return self::VERSION; + $version = \Composer\InstalledVersions::getRootPackage()['pretty_version']; + // If the returned version is in format `vX.Y.Z`, remove leading + // `v` to keep the compatibility with the previously used + // format `X.Y.Z`. + if (preg_match('/^v\d+\.\d+\.\d+/', $version)) { + return substr($version, 1); + } + return $version; } diff --git a/tests/modules/saml/src/Auth/Process/FilterScopesTest.php b/tests/modules/saml/src/Auth/Process/FilterScopesTest.php index 73a02725e1..7e25ad1c7b 100644 --- a/tests/modules/saml/src/Auth/Process/FilterScopesTest.php +++ b/tests/modules/saml/src/Auth/Process/FilterScopesTest.php @@ -223,10 +223,11 @@ public function testAttributeValueMultipleAt(): void $this->assertEquals($request['Attributes'], $result['Attributes']); } + /** * Test that non-scoped values pass or not depending on default or filter config setting. */ - public function testNonScopedValuesRemovedWhenDisallowed(): void + public function testNonScopedValuesRemovedWhenDisallowed(): void { $config = [ // Explicitly disallow non-scoped values diff --git a/tests/src/SimpleSAML/ConfigurationTest.php b/tests/src/SimpleSAML/ConfigurationTest.php index e43d0f98d3..ad01cf7e81 100644 --- a/tests/src/SimpleSAML/ConfigurationTest.php +++ b/tests/src/SimpleSAML/ConfigurationTest.php @@ -24,7 +24,11 @@ class ConfigurationTest extends ClearStateTestCase public function testGetVersion(): void { $c = Configuration::getOptionalConfig(); - $this->assertEquals($c->getVersion(), Configuration::VERSION); + $version = \Composer\InstalledVersions::getRootPackage()['pretty_version']; + if (preg_match('/^v\d+\.\d+\.\d+/', $version)) { + $version = substr($version, 1); + } + $this->assertEquals($c->getVersion(), $version); } From d8af6a933911e818f8a3028ecea17dc321fc8058 Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Fri, 20 Mar 2026 11:14:46 +0100 Subject: [PATCH 489/532] Sync full.json with current release (#2618) --- .github/build/full.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/build/full.json b/.github/build/full.json index eca2e1c587..f9c96cb9f0 100644 --- a/.github/build/full.json +++ b/.github/build/full.json @@ -2,35 +2,35 @@ "modules": { "authorize": { "repository": "simplesamlphp/simplesamlphp-module-authorize", - "version": "dev-master" + "version": "~1.8.0" }, "consent": { "repository": "simplesamlphp/simplesamlphp-module-consent", - "version": "dev-master" + "version": "~1.5.0" }, "consentadmin": { "repository": "simplesamlphp/simplesamlphp-module-consentadmin", - "version": "dev-master" + "version": "~1.2.1" }, "discopower": { "repository": "simplesamlphp/simplesamlphp-module-discopower", - "version": "dev-master" + "version": "~1.6.0" }, "ldap": { "repository": "simplesamlphp/simplesamlphp-module-ldap", - "version": "dev-master" + "version": "~2.5.2" }, "metarefresh": { "repository": "simplesamlphp/simplesamlphp-module-metarefresh", - "version": "dev-master" + "version": "~1.3.1" }, "radius": { "repository": "simplesamlphp/simplesamlphp-module-radius", - "version": "dev-master" + "version": "~2.1.1" }, "sqlauth": { "repository": "simplesamlphp/simplesamlphp-module-sqlauth", - "version": "dev-master" + "version": "~1.4.0" } } } From def18ef8bbc38493b57bdb9674e05f7cc7004ca1 Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Fri, 20 Mar 2026 16:33:23 +0100 Subject: [PATCH 490/532] Sync with ssp-2.5 branch (#2619) * Sync with ssp-2.5 branch * composer update --lock --- composer.json | 2 +- composer.lock | 2 +- docs/simplesamlphp-changelog.md | 4 ++++ extra/simplesamlphp.spec | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 6c15959e26..8c7a6db92c 100644 --- a/composer.json +++ b/composer.json @@ -129,7 +129,7 @@ }, "extra": { "branch-alias": { - "dev-master": "2.6.0.x-dev" + "dev-master": "2.5.0.x-dev" } }, "scripts": { diff --git a/composer.lock b/composer.lock index c70e978be0..a36fce9ed7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6ef358ecdb5a5022aee766afddb8af5d", + "content-hash": "f865710c3bd2c9b9691b36df27f71d07", "packages": [ { "name": "gettext/gettext", diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index d526054092..1c887999df 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -11,6 +11,10 @@ Released TBD * Fix missing trackid error in debugsp-module +`metarefresh` + +* Fix compatibility with SSP 2.5 (v1.3.1) + ## Version 2.5.0 Released 2026-03-14 diff --git a/extra/simplesamlphp.spec b/extra/simplesamlphp.spec index c36b11ae98..470a87b9a0 100644 --- a/extra/simplesamlphp.spec +++ b/extra/simplesamlphp.spec @@ -1,6 +1,6 @@ %define name simplesamlphp %define summary SAML IDP/SP written in PHP -%define version master +%define version 2.5.0 %define release 1 %define license LGPL 2.1 %define group Networking/WWW From 5ab37d125e641c775e9ea9607957d35a12fee639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ivan=C4=8Di=C4=87?= Date: Fri, 20 Mar 2026 17:05:51 +0100 Subject: [PATCH 491/532] Update missing release dates in changelog --- docs/simplesamlphp-changelog.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/simplesamlphp-changelog.md b/docs/simplesamlphp-changelog.md index 1c887999df..cf4716af04 100644 --- a/docs/simplesamlphp-changelog.md +++ b/docs/simplesamlphp-changelog.md @@ -45,7 +45,7 @@ Released 2026-03-14 ## Version 2.4.3 -Released TBD +Released 2025-10-06 * Update and improve Indonesian translations (#2462) * Update and improve Thai translations (#2464) @@ -144,7 +144,7 @@ Released 2025-04-16 ## Version 2.3.7 -Released TBD +Released 2025-03-11 * Fixed loading translations for themes where there is no explicit X-Domain set in the po file. From efea4571ff2693b625a74b3a6507cf69a7a9c4e0 Mon Sep 17 00:00:00 2001 From: monkeyiq Date: Mon, 23 Mar 2026 11:50:01 +1000 Subject: [PATCH 492/532] docs: update developer does with info from slack (#2621) * docs: update developer does with info from slack Thanks @cicnavi for the info and original text that this PR is based on. * lint --- docs/simplesamlphp-developer-information.md | 65 +++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/docs/simplesamlphp-developer-information.md b/docs/simplesamlphp-developer-information.md index 31b22c344b..ba084594ec 100644 --- a/docs/simplesamlphp-developer-information.md +++ b/docs/simplesamlphp-developer-information.md @@ -154,6 +154,71 @@ cd ./node_modules/.bin You will probably want to make a script or alias to the above command and apply it before pushing documentation changes to github. +## Branches + +There will be a `master` branch, a `current-release-branch`, and a +`next-release-branch`. As at March 2026 these might be `2.5` and `2.6` +for current and next release. + +New code will mostly go into the `master` branch. This can then be +replicated into the `current-release-branch` with the following +(assuming 2.5 is the current release). + +```bash +# After some commits have been added to master intended for v2.5.*... +git checkout simplesamlphp-2.5 +git merge master +``` + +New code that the project does not want in the +`current-release-branch` should be committed directly into the +`next-release-branch`. In this example the 2.6 release will be the +target of that merge or PR. + +Periodically the `next-release-branch` will want to bring in changes +from `master` (and thus from the `current-release-branch`). This can +be done by merging master into the `next-release-branch` as shown +below. This might require conflicts between master and the new code in +`next-release-branch` to be resolved. The more frequently the merge is +performed the less work will be required each time. + +```bash +# After some commits have been added to master and "next-release-branch" separately... +git checkout simplesamlphp-2.6 +git merge master +# This might have conflicts, but those should be easy to resolve, since we know what did we do for next release ... +``` + +When we want to make the `next-release-branch` the current branch (for +example, releasing 2.6.0 in this running example) then the branch is +merged back into master. Firstly, merge `master` into +`next-release-branch` as shown above. Then the `next-release-branch` +can be made the `current-release-branch` by running the following +merge. + +```bash +# When we are ready to make "next-release-branch" the current release +git checkout master +git merge simplesamlphp-2.6 +# This should go without any conflicts, since we kept merging the "next-release-branch" with master +``` + +The following script will merge master into the current and next +release branches. Only when a next release branch becomes the current +branch is anything needing to be merged back into master. + +```bash +git checkout master +git pull +git checkout simplesamlphp-2.5 +git merge master +git push + +git checkout simplesamlphp-2.6 +git merge master +git push +``` + ## Making a release The release process is documented on the wiki From 03092b86d0c369159b5edcbcb8256d3340bd1326 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 10:27:28 +0100 Subject: [PATCH 493/532] Fix HTTP-client when using a proxy (#2622) * Fix HTTP-client when using a proxy * Add upgrade note on web-proxies * Add index for 2.5-release * Note about env-vars * Fix bare url --- docs/simplesamlphp-upgrade-notes-2.5.md | 11 +++++++++++ docs/simplesamlphp-upgrade-notes.md | 1 + src/SimpleSAML/Utils/HTTP.php | 3 +-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/docs/simplesamlphp-upgrade-notes-2.5.md b/docs/simplesamlphp-upgrade-notes-2.5.md index 6e65c6a7e4..131e08ea5c 100644 --- a/docs/simplesamlphp-upgrade-notes-2.5.md +++ b/docs/simplesamlphp-upgrade-notes-2.5.md @@ -8,6 +8,17 @@ The following changes are relevant for installers and/or developers. - The minimum PHP version required is now PHP 8.3. - Symfony was upgraded to 7.4 (LTS). +## Web-proxy + +- This release replaces several cases of `file_get_contents()` and direct use of + `curl_`-functions with the Symfony HTTP-client. If you have a proxy set in `config.php`, + please ensure that is has `http://` or `https://` as a scheme, appropriate to + your use-case. The old `tcp://` scheme may no longer work correctly for all use-cases. + + To be even more future-proof, set the proxy-configuration to `null` and use environment- + variables instead. See the [Symfony documentation](https://symfony.com/doc/current/http_client.html#http-proxies) + for more information + ## General Upgrade Advice When updating SimpleSAMLphp you might like to run the following to diff --git a/docs/simplesamlphp-upgrade-notes.md b/docs/simplesamlphp-upgrade-notes.md index b5959b9d50..676f06b352 100644 --- a/docs/simplesamlphp-upgrade-notes.md +++ b/docs/simplesamlphp-upgrade-notes.md @@ -3,6 +3,7 @@ See the following pages for important information for users upgrading from older versions of SimpleSAMLphp: +* [Upgrade notes for version 2.5](simplesamlphp-upgrade-notes-2.5) * [Upgrade notes for version 2.4](simplesamlphp-upgrade-notes-2.4) * [Upgrade notes for version 2.3](simplesamlphp-upgrade-notes-2.3) * [Upgrade notes for version 2.2](simplesamlphp-upgrade-notes-2.2) diff --git a/src/SimpleSAML/Utils/HTTP.php b/src/SimpleSAML/Utils/HTTP.php index f443b8fa60..6627279879 100644 --- a/src/SimpleSAML/Utils/HTTP.php +++ b/src/SimpleSAML/Utils/HTTP.php @@ -44,13 +44,12 @@ public function createHttpClient(array $options = []): HttpClientInterface $proxy = $config->getOptionalString('proxy', null); if ($proxy !== null) { + $proxy = preg_replace('/^(tcp:\/\/)+/i', 'http://', $proxy); $proxyAuth = $config->getOptionalString('proxy.auth', null); $scheme = parse_url($proxy, PHP_URL_SCHEME); if ($proxyAuth !== null) { $proxy = ['proxy' => str_replace($scheme . '://', $scheme . '://' . $proxyAuth . '@', $proxy)]; - } elseif ($proxy !== null) { - $proxy = ['proxy' => str_replace($scheme . '://', 'http://', $proxy)]; } $options = array_merge($proxy, $options); } From b3bd1ec7b385df5991136aefe0f088ebc9fe1539 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 11:48:49 +0100 Subject: [PATCH 494/532] Fix case --- modules/debugsp/src/Controller/Test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/debugsp/src/Controller/Test.php b/modules/debugsp/src/Controller/Test.php index 17ec7e7b03..444318271b 100644 --- a/modules/debugsp/src/Controller/Test.php +++ b/modules/debugsp/src/Controller/Test.php @@ -159,7 +159,7 @@ public function main(Request $request, ?string $as = null): Response 'authData' => $authData, 'remaining' => isset($authData['Expire']) ? $authData['Expire'] - time() : null, 'nameid' => $nameId, - 'trackId' => $this->session->getTrackID(), + 'trackid' => $this->session->getTrackID(), 'logouturl' => $httpUtils->getSelfURLNoQuery() . '?as=' . urlencode($as) . '&logout', ]; } From c62f805b6288c37833b2754bd4a28b52a97f5103 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 18:13:59 +0100 Subject: [PATCH 495/532] Bump linter-actions --- .github/workflows/php.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 4cadfce9b3..7f71b26464 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -20,7 +20,7 @@ jobs: matrix: php-version: ['8.3', '8.4', '8.5'] - uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml@v1.11.0 + uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_phplinter.yml@v1.11.5 with: php-version: ${{ matrix.php-version }} @@ -29,7 +29,7 @@ jobs: strategy: fail-fast: false - uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml@v1.11.0 + uses: simplesamlphp/simplesamlphp-test-framework/.github/workflows/reusable_linter.yml@v1.11.5 with: enable_eslinter: true enable_jsonlinter: true From a38a9a9e93e5558d2cb623045d7e71b670e3c3cc Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 18:16:06 +0100 Subject: [PATCH 496/532] Use composer-require-checker from GHA instead of installing it --- .github/workflows/php.yml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 7f71b26464..84000c6387 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -166,7 +166,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: '8.5' - tools: composer + tools: composer, composer-require-checker extensions: mbstring, soap, xml coverage: none @@ -195,22 +195,16 @@ jobs: run: composer validate - name: Install Composer dependencies - run: | - composer install \ - --no-progress \ - --prefer-dist --optimize-autoloader \ - --ignore-platform-req=maglnet/composer-require-checker + run: composer install --no-progress --prefer-dist --optimize-autoloader - name: PHP Code Sniffer run: vendor/bin/phpcs - name: PHPStan - run: | - vendor/bin/phpstan analyze -c phpstan.neon + run: vendor/bin/phpstan analyze -c phpstan.neon - name: PHPStan (testsuite) - run: | - vendor/bin/phpstan analyze -c phpstan-dev.neon + run: vendor/bin/phpstan analyze -c phpstan-dev.neon - name: Check for unused translations continue-on-error: true From 151fcb538491c6ac4532b44d5796f128bc7ead61 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 18:17:01 +0100 Subject: [PATCH 497/532] Bump dependencies --- composer.json | 2 +- composer.lock | 264 +++----------------------------------------------- 2 files changed, 15 insertions(+), 251 deletions(-) diff --git a/composer.json b/composer.json index 8c7a6db92c..5f24f3f84e 100644 --- a/composer.json +++ b/composer.json @@ -100,7 +100,7 @@ "gettext/php-scanner": "~2.0", "mikey179/vfsstream": "~1.6", "predis/predis": "~3.3", - "simplesamlphp/simplesamlphp-test-framework": "~1.11 || dev-master", + "simplesamlphp/simplesamlphp-test-framework": "~1.11.5 || dev-master", "symfony/translation": "~7.4" }, "suggest": { diff --git a/composer.lock b/composer.lock index a36fce9ed7..2ed7a3bb37 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f865710c3bd2c9b9691b36df27f71d07", + "content-hash": "930ac3f65e18ca6b78d8c65ec1c40331", "packages": [ { "name": "gettext/gettext", @@ -4604,83 +4604,6 @@ } ], "packages-dev": [ - { - "name": "azjezz/psl", - "version": "4.3.0", - "source": { - "type": "git", - "url": "https://github.com/php-standard-library/php-standard-library.git", - "reference": "74c95be0214eb7ea39146ed00ac4eb71b45d787b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-standard-library/php-standard-library/zipball/74c95be0214eb7ea39146ed00ac4eb71b45d787b", - "reference": "74c95be0214eb7ea39146ed00ac4eb71b45d787b", - "shasum": "" - }, - "require": { - "ext-bcmath": "*", - "ext-intl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "ext-sodium": "*", - "php": "~8.3.0 || ~8.4.0 || ~8.5.0", - "revolt/event-loop": "^1.0.7" - }, - "require-dev": { - "carthage-software/mago": "^1.6.0", - "infection/infection": "^0.31.2", - "php-coveralls/php-coveralls": "^2.7.0", - "phpbench/phpbench": "^1.4.0", - "phpunit/phpunit": "^9.6.22" - }, - "suggest": { - "php-standard-library/phpstan-extension": "PHPStan integration", - "php-standard-library/psalm-plugin": "Psalm integration" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/hhvm/hsl", - "name": "hhvm/hsl" - } - }, - "autoload": { - "files": [ - "src/bootstrap.php" - ], - "psr-4": { - "Psl\\": "src/Psl" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "azjezz", - "email": "azjezz@protonmail.com" - } - ], - "description": "PHP Standard Library", - "support": { - "issues": "https://github.com/php-standard-library/php-standard-library/issues", - "source": "https://github.com/php-standard-library/php-standard-library/tree/4.3.0" - }, - "funding": [ - { - "url": "https://github.com/azjezz", - "type": "github" - }, - { - "url": "https://github.com/veewee", - "type": "github" - } - ], - "abandoned": "php-standard-library/php-standard-library", - "time": "2026-02-24T01:58:53+00:00" - }, { "name": "composer-unused/contracts", "version": "0.3.0", @@ -5200,92 +5123,6 @@ ], "time": "2026-01-30T05:52:24+00:00" }, - { - "name": "maglnet/composer-require-checker", - "version": "4.20.0", - "source": { - "type": "git", - "url": "https://github.com/maglnet/ComposerRequireChecker.git", - "reference": "c62d517ef5ac2d347dd9b3d02c1cc16c0f1091e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/maglnet/ComposerRequireChecker/zipball/c62d517ef5ac2d347dd9b3d02c1cc16c0f1091e2", - "reference": "c62d517ef5ac2d347dd9b3d02c1cc16c0f1091e2", - "shasum": "" - }, - "require": { - "azjezz/psl": "^4.2.0", - "composer-runtime-api": "^2.0.0", - "ext-phar": "*", - "nikic/php-parser": "^5.7.0", - "php": "~8.3.0 || ~8.4.0 || ~8.5.0", - "symfony/console": "^7.4.1", - "webmozart/glob": "^4.7.0" - }, - "conflict": { - "revolt/event-loop": "< 1.0.8" - }, - "require-dev": { - "doctrine/coding-standard": "^14.0.0", - "ext-zend-opcache": "*", - "phing/phing": "^3.1.1", - "php-standard-library/phpstan-extension": "^2.0.2", - "php-standard-library/psalm-plugin": "^2.3", - "phpstan/phpstan": "^2.1.33", - "phpunit/phpunit": "^12.5.4", - "psalm/plugin-phpunit": "^0.19.5", - "roave/infection-static-analysis-plugin": "^1.42.0", - "spatie/temporary-directory": "^2.3.0", - "vimeo/psalm": "^6.14.3" - }, - "bin": [ - "bin/composer-require-checker" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "psr-4": { - "ComposerRequireChecker\\": "src/ComposerRequireChecker" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.io/" - }, - { - "name": "Matthias Glaub", - "email": "magl@magl.net", - "homepage": "http://magl.net" - } - ], - "description": "CLI tool to analyze composer dependencies and verify that no unknown symbols are used in the sources of a package", - "homepage": "https://github.com/maglnet/ComposerRequireChecker", - "keywords": [ - "cli", - "composer", - "dependency", - "imports", - "require", - "requirements", - "static analysis" - ], - "support": { - "issues": "https://github.com/maglnet/ComposerRequireChecker/issues", - "source": "https://github.com/maglnet/ComposerRequireChecker/tree/4.20.0" - }, - "time": "2025-12-29T11:34:42+00:00" - }, { "name": "mikey179/vfsstream", "version": "v1.6.12", @@ -6420,78 +6257,6 @@ ], "time": "2026-03-09T20:33:04+00:00" }, - { - "name": "revolt/event-loop", - "version": "v1.0.8", - "source": { - "type": "git", - "url": "https://github.com/revoltphp/event-loop.git", - "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/revoltphp/event-loop/zipball/b6fc06dce8e9b523c9946138fa5e62181934f91c", - "reference": "b6fc06dce8e9b523c9946138fa5e62181934f91c", - "shasum": "" - }, - "require": { - "php": ">=8.1" - }, - "require-dev": { - "ext-json": "*", - "jetbrains/phpstorm-stubs": "^2019.3", - "phpunit/phpunit": "^9", - "psalm/phar": "^5.15" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Revolt\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Piotrowski", - "email": "aaron@trowski.com" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "ceesjank@gmail.com" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - }, - { - "name": "Niklas Keller", - "email": "me@kelunik.com" - } - ], - "description": "Rock-solid event loop for concurrent PHP applications.", - "keywords": [ - "async", - "asynchronous", - "concurrency", - "event", - "event-loop", - "non-blocking", - "scheduler" - ], - "support": { - "issues": "https://github.com/revoltphp/event-loop/issues", - "source": "https://github.com/revoltphp/event-loop/tree/v1.0.8" - }, - "time": "2025-08-27T21:33:23+00:00" - }, { "name": "sebastian/cli-parser", "version": "4.2.0", @@ -7391,22 +7156,21 @@ }, { "name": "simplesamlphp/simplesamlphp-test-framework", - "version": "v1.11.4", + "version": "v1.11.5", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "5e6e205126f6e9857ac9b4fda148c090a31b7b30" + "reference": "0293a93cbe64d95f7f901c5ef5b0c498fb19fd67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/5e6e205126f6e9857ac9b4fda148c090a31b7b30", - "reference": "5e6e205126f6e9857ac9b4fda148c090a31b7b30", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/0293a93cbe64d95f7f901c5ef5b0c498fb19fd67", + "reference": "0293a93cbe64d95f7f901c5ef5b0c498fb19fd67", "shasum": "" }, "require": { "ext-curl": "*", "icanhazstring/composer-unused": "^0.9", - "maglnet/composer-require-checker": "^4.19", "php": "^8.3", "phpstan/extension-installer": "^1.4", "phpstan/phpstan": "^2.1", @@ -7414,7 +7178,7 @@ "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^12.3 || ^13.0", "psr/log": "^3.0", - "simplesamlphp/simplesamlphp": "*", + "simplesamlphp/simplesamlphp": "^2.5", "slevomat/coding-standard": "^8.25", "squizlabs/php_codesniffer": "^4.0", "symfony/phpunit-bridge": "^8.0", @@ -7444,20 +7208,20 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2026-03-18T21:36:42+00:00" + "time": "2026-03-20T20:07:58+00:00" }, { "name": "slevomat/coding-standard", - "version": "8.28.0", + "version": "8.28.1", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "0cd4b30cc1037eca54091c188d260d570e61770c" + "reference": "66151cfbd25b50e8becd9f809fb704f01fd4d6f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/0cd4b30cc1037eca54091c188d260d570e61770c", - "reference": "0cd4b30cc1037eca54091c188d260d570e61770c", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/66151cfbd25b50e8becd9f809fb704f01fd4d6f2", + "reference": "66151cfbd25b50e8becd9f809fb704f01fd4d6f2", "shasum": "" }, "require": { @@ -7469,7 +7233,7 @@ "require-dev": { "phing/phing": "3.0.1|3.1.2", "php-parallel-lint/php-parallel-lint": "1.4.0", - "phpstan/phpstan": "2.1.40", + "phpstan/phpstan": "2.1.42", "phpstan/phpstan-deprecation-rules": "2.0.4", "phpstan/phpstan-phpunit": "2.0.16", "phpstan/phpstan-strict-rules": "2.0.10", @@ -7497,7 +7261,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.28.0" + "source": "https://github.com/slevomat/coding-standard/tree/8.28.1" }, "funding": [ { @@ -7509,7 +7273,7 @@ "type": "tidelift" } ], - "time": "2026-02-23T21:35:24+00:00" + "time": "2026-03-22T17:22:38+00:00" }, { "name": "squizlabs/php_codesniffer", From c611307f6c96ac4cf4e887c15b1ac686b3346621 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 18:18:05 +0100 Subject: [PATCH 498/532] Add missing quality-checks --- .github/workflows/php.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 84000c6387..d98335b757 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -166,7 +166,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: '8.5' - tools: composer, composer-require-checker + tools: composer, composer-require-checker, composer-unused extensions: mbstring, soap, xml coverage: none @@ -197,6 +197,12 @@ jobs: - name: Install Composer dependencies run: composer install --no-progress --prefer-dist --optimize-autoloader + - name: Check code for hard dependencies missing in composer.json + run: composer-require-checker check composer.json + + - name: Check code for unused dependencies in composer.json + run: composer-unused + - name: PHP Code Sniffer run: vendor/bin/phpcs From c0e4bb1ffeff89ddcc301feb5035f5741861da6c Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 18:24:12 +0100 Subject: [PATCH 499/532] Bump actions --- .github/workflows/build-release.yml | 4 ++-- .github/workflows/documentation.yml | 2 +- .github/workflows/php.yml | 24 ++++++++++++------------ .github/workflows/translations.yml | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 55ef1a7486..8fb4dfc33c 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -31,7 +31,7 @@ jobs: - name: Setup problem matchers for PHP run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 # Store the version, stripping any v-prefix - name: Write release version @@ -88,7 +88,7 @@ jobs: rm -rf "simplesamlphp-$VERSION" - name: Save tarball - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: release-${{ matrix.version }} path: "/tmp/simplesamlphp-${{ env.VERSION }}-${{ matrix.version }}.tar.gz" diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index fb6e2c5760..1c626b3558 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -19,7 +19,7 @@ jobs: runs-on: [ubuntu-latest] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Lint markdown files uses: nosborn/github-action-markdown-cli@v3 diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index d98335b757..25dda16e9a 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -68,7 +68,7 @@ jobs: git config --global core.autocrlf false git config --global core.eol lf - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Copy config.php.dist to config.php run: cp config/config.php.dist config/config.php @@ -80,7 +80,7 @@ jobs: run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$GITHUB_ENV" - name: Cache composer dependencies - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ${{ env.COMPOSER_CACHE }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} @@ -99,7 +99,7 @@ jobs: - name: Save coverage data if: ${{ matrix.php-versions == '8.5' }} - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: coverage-data path: ${{ github.workspace }}/build @@ -136,13 +136,13 @@ jobs: git config --global core.autocrlf false git config --global core.eol lf - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Get composer cache directory run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$env:GITHUB_ENV" - name: Cache composer dependencies - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ${{ env.COMPOSER_CACHE }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} @@ -173,7 +173,7 @@ jobs: - name: Setup problem matchers for PHP run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Copy config.php.dist to config.php run: cp config/config.php.dist config/config.php @@ -185,7 +185,7 @@ jobs: run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$GITHUB_ENV" - name: Cache composer dependencies - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ${{ env.COMPOSER_CACHE }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} @@ -233,7 +233,7 @@ jobs: - name: Setup problem matchers for PHP run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Copy config.php.dist to config.php run: cp config/config.php.dist config/config.php @@ -245,7 +245,7 @@ jobs: run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$GITHUB_ENV" - name: Cache composer dependencies - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ${{ env.COMPOSER_CACHE }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} @@ -268,13 +268,13 @@ jobs: runs-on: [ubuntu-latest] needs: [unit-tests-linux] steps: - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v8 with: name: coverage-data path: ${{ github.workspace }}/build - name: Codecov - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true @@ -290,6 +290,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/.github/workflows/translations.yml b/.github/workflows/translations.yml index 3b7f8d8545..6deafb9f32 100644 --- a/.github/workflows/translations.yml +++ b/.github/workflows/translations.yml @@ -28,10 +28,10 @@ jobs: uses: shivammathur/setup-php@v2 with: # Should be the higest supported version, so we can use the newest tools - php-version: '8.2' + php-version: '8.5' coverage: none - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: # token: ${{ secrets.PAT_TOKEN }} repository: ${{ github.event.pull_request.head.repo.full_name }} @@ -68,7 +68,7 @@ jobs: if: steps.changes.outputs.files_changed == 'true' || steps.changes.outputs.packages_changed run: zip build.zip -r . - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 if: steps.changes.outputs.files_changed == 'true' || steps.changes.outputs.packages_changed with: name: build @@ -82,7 +82,7 @@ jobs: runs-on: [ubuntu-latest] steps: - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v8 with: name: build @@ -135,7 +135,7 @@ jobs: (needs.build.result == 'success' && needs.commit.result == 'skipped') steps: - - uses: geekyeggo/delete-artifact@v4 + - uses: geekyeggo/delete-artifact@v6 with: name: | build From 3f0e5dfb3820d331c6e3105358e17b563f21e4bb Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 18:31:49 +0100 Subject: [PATCH 500/532] Fix missing hard dependencies --- composer.json | 4 ++++ composer.lock | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 5f24f3f84e..2c0925dd68 100644 --- a/composer.json +++ b/composer.json @@ -47,8 +47,11 @@ "php": "^8.3", "ext-date": "*", "ext-dom": "*", + "ext-fileinfo": "*", + "ext-filter": "*", "ext-hash": "*", "ext-json": "*", + "ext-libxml": "*", "ext-mbstring": "*", "ext-openssl": "*", "ext-pcre": "*", @@ -62,6 +65,7 @@ "phpmailer/phpmailer": "~6.10", "psr/event-dispatcher": "~1.0", "psr/log": "~3.0", + "robrichards/xmlseclibs": "^3.1.5", "simplesamlphp/assert": "~2.0", "simplesamlphp/composer-module-installer": "~1.7", "simplesamlphp/saml2": "~6.1", diff --git a/composer.lock b/composer.lock index 2ed7a3bb37..2288e7b8cb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "930ac3f65e18ca6b78d8c65ec1c40331", + "content-hash": "eb3ff5d78f6a82ff1d1ec6d826c9c84a", "packages": [ { "name": "gettext/gettext", @@ -8140,8 +8140,11 @@ "php": "^8.3", "ext-date": "*", "ext-dom": "*", + "ext-fileinfo": "*", + "ext-filter": "*", "ext-hash": "*", "ext-json": "*", + "ext-libxml": "*", "ext-mbstring": "*", "ext-openssl": "*", "ext-pcre": "*", From ff0261ee303035347b39f749365b4f587c00565b Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 18:35:23 +0100 Subject: [PATCH 501/532] Whitelist symbols that are for optional depenencies (= suggest-section of composer.json) --- .github/workflows/php.yml | 2 +- tools/composer-require-checker.json | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 tools/composer-require-checker.json diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 25dda16e9a..9b9562ff48 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -198,7 +198,7 @@ jobs: run: composer install --no-progress --prefer-dist --optimize-autoloader - name: Check code for hard dependencies missing in composer.json - run: composer-require-checker check composer.json + run: composer-require-checker check --config-file=tools/composer-require-checker.json composer.json - name: Check code for unused dependencies in composer.json run: composer-unused diff --git a/tools/composer-require-checker.json b/tools/composer-require-checker.json new file mode 100644 index 0000000000..f1a5ce0a55 --- /dev/null +++ b/tools/composer-require-checker.json @@ -0,0 +1,11 @@ +{ + "symbol-whitelist": [ + "Memcached", + "opcache_invalidate", + "PDO", + "PDOException", + "PDOStatement", + "posix_getuid", + "Predis\Client" + ] +} From 17b8976c6d10fe7f1863d349c9773b7117d2db17 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 18:36:51 +0100 Subject: [PATCH 502/532] Add missing gettext/php-scanner dependency --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index 2c0925dd68..fded182e22 100644 --- a/composer.json +++ b/composer.json @@ -61,6 +61,7 @@ "ext-zlib": "*", "gettext/gettext": "~5.7", + "gettext/php-scanner": "^2.0", "gettext/translator": "~1.2", "phpmailer/phpmailer": "~6.10", "psr/event-dispatcher": "~1.0", From f75f050a091340a13b0c13676a81e69622ee5dd5 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 18:40:31 +0100 Subject: [PATCH 503/532] Add missing composer-runtime-api dependency --- composer.json | 1 + composer.lock | 239 +++++++++++++++++++++++++------------------------- 2 files changed, 121 insertions(+), 119 deletions(-) diff --git a/composer.json b/composer.json index fded182e22..a3a30f94cf 100644 --- a/composer.json +++ b/composer.json @@ -60,6 +60,7 @@ "ext-SPL": "*", "ext-zlib": "*", + "composer-runtime-api": "^2.2", "gettext/gettext": "~5.7", "gettext/php-scanner": "^2.0", "gettext/translator": "~1.2", diff --git a/composer.lock b/composer.lock index 2288e7b8cb..2152622442 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "eb3ff5d78f6a82ff1d1ec6d826c9c84a", + "content-hash": "dfa7c06bf4b26dbfb1247ee018bb4cfb", "packages": [ { "name": "gettext/gettext", @@ -155,6 +155,65 @@ ], "time": "2026-02-23T14:05:50+00:00" }, + { + "name": "gettext/php-scanner", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-gettext/PHP-Scanner.git", + "reference": "43f53b6e0d5f9ac5ea165d8202c18267d6bd5dfd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-gettext/PHP-Scanner/zipball/43f53b6e0d5f9ac5ea165d8202c18267d6bd5dfd", + "reference": "43f53b6e0d5f9ac5ea165d8202c18267d6bd5dfd", + "shasum": "" + }, + "require": { + "gettext/gettext": "^5.5.0", + "nikic/php-parser": "^5", + "php": ">=7.4" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3", + "oscarotero/php-cs-fixer-config": "^2", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Gettext\\Scanner\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oscar Otero", + "email": "oom@oscarotero.com", + "homepage": "http://oscarotero.com", + "role": "Developer" + } + ], + "description": "PHP scanner for gettext", + "homepage": "https://github.com/php-gettext/PHP-Scanner", + "keywords": [ + "gettext", + "i18n", + "php", + "scanner", + "translation" + ], + "support": { + "email": "oom@oscarotero.com", + "issues": "https://github.com/php-gettext/PHP-Scanner/issues", + "source": "https://github.com/php-gettext/PHP-Scanner/tree/v2.0.1" + }, + "time": "2024-11-29T20:14:52+00:00" + }, { "name": "gettext/translator", "version": "v1.2.1", @@ -346,6 +405,64 @@ ], "time": "2026-03-10T16:41:02+00:00" }, + { + "name": "nikic/php-parser", + "version": "v5.7.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + }, + "time": "2025-12-06T11:56:16+00:00" + }, { "name": "nyholm/psr7", "version": "1.8.2", @@ -4963,65 +5080,6 @@ ], "time": "2025-11-11T04:32:07+00:00" }, - { - "name": "gettext/php-scanner", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-gettext/PHP-Scanner.git", - "reference": "43f53b6e0d5f9ac5ea165d8202c18267d6bd5dfd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-gettext/PHP-Scanner/zipball/43f53b6e0d5f9ac5ea165d8202c18267d6bd5dfd", - "reference": "43f53b6e0d5f9ac5ea165d8202c18267d6bd5dfd", - "shasum": "" - }, - "require": { - "gettext/gettext": "^5.5.0", - "nikic/php-parser": "^5", - "php": ">=7.4" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3", - "oscarotero/php-cs-fixer-config": "^2", - "phpunit/phpunit": "^9", - "squizlabs/php_codesniffer": "^3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Gettext\\Scanner\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Oscar Otero", - "email": "oom@oscarotero.com", - "homepage": "http://oscarotero.com", - "role": "Developer" - } - ], - "description": "PHP scanner for gettext", - "homepage": "https://github.com/php-gettext/PHP-Scanner", - "keywords": [ - "gettext", - "i18n", - "php", - "scanner", - "translation" - ], - "support": { - "email": "oom@oscarotero.com", - "issues": "https://github.com/php-gettext/PHP-Scanner/issues", - "source": "https://github.com/php-gettext/PHP-Scanner/tree/v2.0.1" - }, - "time": "2024-11-29T20:14:52+00:00" - }, { "name": "icanhazstring/composer-unused", "version": "0.9.6", @@ -5235,64 +5293,6 @@ ], "time": "2025-08-01T08:46:24+00:00" }, - { - "name": "nikic/php-parser", - "version": "v5.7.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" - }, - "time": "2025-12-06T11:56:16+00:00" - }, { "name": "ondram/ci-detector", "version": "4.2.0", @@ -8151,7 +8151,8 @@ "ext-session": "*", "ext-simplexml": "*", "ext-spl": "*", - "ext-zlib": "*" + "ext-zlib": "*", + "composer-runtime-api": "^2.2" }, "platform-dev": { "ext-curl": "*", From 612e2e2b029ccfa30401bd360370dc7944e597eb Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 18:44:35 +0100 Subject: [PATCH 504/532] Add ext-fileinfo to Windows-build --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 9b9562ff48..942ac447b6 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -120,7 +120,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-versions }} - extensions: intl, mbstring, mysql, pdo, pdo_sqlite, soap, sodium, xml + extensions: fileinfo, intl, mbstring, mysql, pdo, pdo_sqlite, soap, sodium, xml tools: composer:v2 ini-values: error_reporting=E_ALL coverage: none From 95d859c233c9cdd3c81977376d8277ed058ac4f9 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 18:50:42 +0100 Subject: [PATCH 505/532] Fix syntax error --- .github/workflows/php.yml | 2 +- tools/composer-require-checker.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 942ac447b6..8ca9681460 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -198,7 +198,7 @@ jobs: run: composer install --no-progress --prefer-dist --optimize-autoloader - name: Check code for hard dependencies missing in composer.json - run: composer-require-checker check --config-file=tools/composer-require-checker.json composer.json + run: composer-require-checker check --config-file=tools/composer-require-checker.json composer.json - name: Check code for unused dependencies in composer.json run: composer-unused diff --git a/tools/composer-require-checker.json b/tools/composer-require-checker.json index f1a5ce0a55..c25b5bedb7 100644 --- a/tools/composer-require-checker.json +++ b/tools/composer-require-checker.json @@ -6,6 +6,6 @@ "PDOException", "PDOStatement", "posix_getuid", - "Predis\Client" + "Predis\\Client" ] } From 42186617022215110b4e8d10c1c7e2885508a3dd Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 20:24:20 +0100 Subject: [PATCH 506/532] Add missing dependency for symfony/translation --- composer.json | 1 + composer.lock | 202 +++++++++++++++++++++++++------------------------- 2 files changed, 102 insertions(+), 101 deletions(-) diff --git a/composer.json b/composer.json index a3a30f94cf..1b61de156c 100644 --- a/composer.json +++ b/composer.json @@ -92,6 +92,7 @@ "symfony/password-hasher": "~7.4", "symfony/polyfill-intl-icu": "~1.33", "symfony/routing": "~7.4", + "symfony/translation": "~7.4", "symfony/translation-contracts": "~3.6", "symfony/twig-bridge": "~7.4", "symfony/var-exporter": "~7.4", diff --git a/composer.lock b/composer.lock index 2152622442..d0a032601d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "dfa7c06bf4b26dbfb1247ee018bb4cfb", + "content-hash": "ec1f41a75aca426bf06c09ac7eff707b", "packages": [ { "name": "gettext/gettext", @@ -4072,6 +4072,106 @@ ], "time": "2026-02-09T09:33:46+00:00" }, + { + "name": "symfony/translation", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "1888cf064399868af3784b9e043240f1d89d25ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/1888cf064399868af3784b9e043240f1d89d25ce", + "reference": "1888cf064399868af3784b9e043240f1d89d25ce", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5.3|^3.3" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-17T07:53:42+00:00" + }, { "name": "symfony/translation-contracts", "version": "v3.6.1", @@ -7846,106 +7946,6 @@ ], "time": "2026-03-06T13:15:18+00:00" }, - { - "name": "symfony/translation", - "version": "v7.4.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "1888cf064399868af3784b9e043240f1d89d25ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/1888cf064399868af3784b9e043240f1d89d25ce", - "reference": "1888cf064399868af3784b9e043240f1d89d25ce", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5.3|^3.3" - }, - "conflict": { - "nikic/php-parser": "<5.0", - "symfony/config": "<6.4", - "symfony/console": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<6.4", - "symfony/yaml": "<6.4" - }, - "provide": { - "symfony/translation-implementation": "2.3|3.0" - }, - "require-dev": { - "nikic/php-parser": "^5.0", - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/finder": "^6.4|^7.0|^8.0", - "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/intl": "^6.4|^7.0|^8.0", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^6.4|^7.0|^8.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0|^8.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides tools to internationalize your application", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/translation/tree/v7.4.6" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-02-17T07:53:42+00:00" - }, { "name": "symfony/type-info", "version": "v7.4.7", From 16a8fb17a4f7210799e647ad8b5687937787c388 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 20:27:29 +0100 Subject: [PATCH 507/532] Fix incomplete namespace --- modules/saml/src/Auth/Process/PairwiseID.php | 2 +- modules/saml/src/Auth/Process/ScopedIssuer.php | 2 +- modules/saml/src/Auth/Process/SubjectID.php | 4 ++-- modules/saml/src/Auth/Source/SP.php | 10 +++++----- tests/modules/saml/src/Auth/Process/PairwiseIDTest.php | 4 ++-- .../modules/saml/src/Auth/Process/ScopedIssuerTest.php | 2 +- tests/modules/saml/src/Auth/Process/SubjectIDTest.php | 4 ++-- tests/modules/saml/src/Auth/Source/SPTest.php | 6 +++--- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/modules/saml/src/Auth/Process/PairwiseID.php b/modules/saml/src/Auth/Process/PairwiseID.php index 166bc01684..fad9818f3c 100644 --- a/modules/saml/src/Auth/Process/PairwiseID.php +++ b/modules/saml/src/Auth/Process/PairwiseID.php @@ -4,7 +4,7 @@ namespace SimpleSAML\Module\saml\Auth\Process; -use SAML2\Constants; +use SimpleSAML\SAML2\Constants; use function strtolower; diff --git a/modules/saml/src/Auth/Process/ScopedIssuer.php b/modules/saml/src/Auth/Process/ScopedIssuer.php index c101b8ee54..17d68306ac 100644 --- a/modules/saml/src/Auth/Process/ScopedIssuer.php +++ b/modules/saml/src/Auth/Process/ScopedIssuer.php @@ -4,9 +4,9 @@ namespace SimpleSAML\Module\saml\Auth\Process; -use SAML2\Exception\ProtocolViolationException; use SimpleSAML\Assert\Assert; use SimpleSAML\Auth; +use SimpleSAML\SAML2\Exception\ProtocolViolationException; use function array_key_exists; use function explode; diff --git a/modules/saml/src/Auth/Process/SubjectID.php b/modules/saml/src/Auth/Process/SubjectID.php index 3122d32b10..118211ae94 100644 --- a/modules/saml/src/Auth/Process/SubjectID.php +++ b/modules/saml/src/Auth/Process/SubjectID.php @@ -4,11 +4,11 @@ namespace SimpleSAML\Module\saml\Auth\Process; -use SAML2\Constants; -use SAML2\Exception\ProtocolViolationException; use SimpleSAML\Assert\Assert; use SimpleSAML\Auth; use SimpleSAML\Logger; +use SimpleSAML\SAML2\Constants; +use SimpleSAML\SAML2\Exception\ProtocolViolationException; use SimpleSAML\Utils; use function array_key_exists; diff --git a/modules/saml/src/Auth/Source/SP.php b/modules/saml/src/Auth/Source/SP.php index 12efdc3231..fb3997f374 100644 --- a/modules/saml/src/Auth/Source/SP.php +++ b/modules/saml/src/Auth/Source/SP.php @@ -6,11 +6,6 @@ use SAML2\AuthnRequest; use SAML2\Binding; -use SAML2\Constants; -use SAML2\Exception\Protocol\NoAvailableIDPException; -use SAML2\Exception\Protocol\NoPassiveException; -use SAML2\Exception\Protocol\NoSupportedIDPException; -use SAML2\Exception\Protocol\ProtocolViolationException; use SAML2\LogoutRequest; use SAML2\XML\saml\NameID; use SimpleSAML\Assert\Assert; @@ -22,6 +17,11 @@ use SimpleSAML\Metadata\MetaDataStorageHandler; use SimpleSAML\Module; use SimpleSAML\Module\saml\Error\ProxyCountExceeded; +use SimpleSAML\SAML2\Constants; +use SimpleSAML\SAML2\Exception\Protocol\NoAvailableIDPException; +use SimpleSAML\SAML2\Exception\Protocol\NoPassiveException; +use SimpleSAML\SAML2\Exception\Protocol\NoSupportedIDPException; +use SimpleSAML\SAML2\Exception\ProtocolViolationException; use SimpleSAML\SAML2\XML\samlp\AuthnContextComparisonTypeEnum; use SimpleSAML\Session; use SimpleSAML\Store; diff --git a/tests/modules/saml/src/Auth/Process/PairwiseIDTest.php b/tests/modules/saml/src/Auth/Process/PairwiseIDTest.php index 41a61ee87d..8ab0e995d7 100644 --- a/tests/modules/saml/src/Auth/Process/PairwiseIDTest.php +++ b/tests/modules/saml/src/Auth/Process/PairwiseIDTest.php @@ -7,11 +7,11 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; use RuntimeException; -use SAML2\Constants as C; -use SAML2\Exception\ProtocolViolationException; use SimpleSAML\Configuration; use SimpleSAML\Logger; use SimpleSAML\Module\saml\Auth\Process\PairwiseID; +use SimpleSAML\SAML2\Constants as C; +use SimpleSAML\SAML2\Exception\ProtocolViolationException; use SimpleSAML\Utils; /** diff --git a/tests/modules/saml/src/Auth/Process/ScopedIssuerTest.php b/tests/modules/saml/src/Auth/Process/ScopedIssuerTest.php index 65bfcd0b8a..b8bc719f00 100644 --- a/tests/modules/saml/src/Auth/Process/ScopedIssuerTest.php +++ b/tests/modules/saml/src/Auth/Process/ScopedIssuerTest.php @@ -6,9 +6,9 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; -use SAML2\Exception\ProtocolViolationException; use SimpleSAML\Assert\AssertionFailedException; use SimpleSAML\Module\saml\Auth\Process\ScopedIssuer; +use SimpleSAML\SAML2\Exception\ProtocolViolationException; /** * Test for the saml:ScopedIssuer filter. diff --git a/tests/modules/saml/src/Auth/Process/SubjectIDTest.php b/tests/modules/saml/src/Auth/Process/SubjectIDTest.php index 961514655d..eb1eb50bb0 100644 --- a/tests/modules/saml/src/Auth/Process/SubjectIDTest.php +++ b/tests/modules/saml/src/Auth/Process/SubjectIDTest.php @@ -7,11 +7,11 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; use RuntimeException; -use SAML2\Constants as C; -use SAML2\Exception\ProtocolViolationException; use SimpleSAML\Configuration; use SimpleSAML\Logger; use SimpleSAML\Module\saml\Auth\Process\SubjectID; +use SimpleSAML\SAML2\Constants as C; +use SimpleSAML\SAML2\Exception\ProtocolViolationException; use SimpleSAML\Utils; /** diff --git a/tests/modules/saml/src/Auth/Source/SPTest.php b/tests/modules/saml/src/Auth/Source/SPTest.php index cf1fe67d72..af8be43090 100644 --- a/tests/modules/saml/src/Auth/Source/SPTest.php +++ b/tests/modules/saml/src/Auth/Source/SPTest.php @@ -8,9 +8,6 @@ use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\DataProvider; use SAML2\AuthnRequest; -use SAML2\Constants; -use SAML2\Exception\Protocol\NoAvailableIDPException; -use SAML2\Exception\Protocol\NoSupportedIDPException; use SAML2\LogoutRequest; use SAML2\Utils; use SAML2\XML\saml\NameID; @@ -18,6 +15,9 @@ use SimpleSAML\Configuration; use SimpleSAML\Error\Exception; use SimpleSAML\Module\saml\Auth\Source\SP; +use SimpleSAML\SAML2\Constants; +use SimpleSAML\SAML2\Exception\Protocol\NoAvailableIDPException; +use SimpleSAML\SAML2\Exception\Protocol\NoSupportedIDPException; use SimpleSAML\Test\Metadata\MetaDataStorageSourceTest; use SimpleSAML\Test\Utils\ExitTestException; use SimpleSAML\Test\Utils\SpTester; From feef671d0ba2231a6a366c86f3bbc14b28634f19 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 21:31:09 +0100 Subject: [PATCH 508/532] Ignore the remainder of missing dependencies for now --- tools/composer-require-checker.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/composer-require-checker.json b/tools/composer-require-checker.json index c25b5bedb7..70e9387287 100644 --- a/tools/composer-require-checker.json +++ b/tools/composer-require-checker.json @@ -6,6 +6,8 @@ "PDOException", "PDOStatement", "posix_getuid", - "Predis\\Client" + "Predis\\Client", + "SimpleSAML\\Module\\adfs\\IdP\\ADFS", + "SimpleSAML\\TestUtils\\ArrayLogger" ] } From 8d47ade8bb8c36ab93fe4aadb32433d1c713d80e Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 21:34:30 +0100 Subject: [PATCH 509/532] Remove unnecessary use of a constant --- .../src/Event/Listener/SamlSanityCheckListener.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/saml/src/Event/Listener/SamlSanityCheckListener.php b/modules/saml/src/Event/Listener/SamlSanityCheckListener.php index 94f006c356..27e3559163 100644 --- a/modules/saml/src/Event/Listener/SamlSanityCheckListener.php +++ b/modules/saml/src/Event/Listener/SamlSanityCheckListener.php @@ -15,7 +15,7 @@ class SamlSanityCheckListener { public function __invoke(SanityCheckEvent $event): void { - define('MODID', '[saml] '); + $prefix = '[saml] '; $config = Configuration::getInstance(); $cryptoUtils = new Utils\Crypto(); @@ -25,7 +25,7 @@ public function __invoke(SanityCheckEvent $event): void try { $metadata = $handler->getMetaDataCurrent('saml20-idp-hosted'); } catch (Exception $e) { - $event->addError(MODID . Translate::noop('Hosted IdP metadata present')); + $event->addError($prefix . Translate::noop('Hosted IdP metadata present')); } if (isset($metadata)) { @@ -34,7 +34,7 @@ public function __invoke(SanityCheckEvent $event): void $public = $cryptoUtils->loadPublicKey($metadata_config, false); $matches = $this->matchingKeyPair($public['PEM'], $private['PEM'], $private['password']); - $message = MODID . + $message = $prefix . Translate::noop('Matching key-pair for signing assertions'); if ($matches) { $event->addInfo($message); @@ -46,8 +46,7 @@ public function __invoke(SanityCheckEvent $event): void if ($private !== null) { $public = $cryptoUtils->loadPublicKey($metadata_config, false, 'new_'); $matches = $this->matchingKeyPair($public['PEM'], $private['PEM'], $private['password']); - $message = MODID . - Translate::noop('Matching key-pair for signing assertions (rollover key)'); + $message = $prefix . Translate::noop('Matching key-pair for signing assertions (rollover key)'); if ($matches) { $event->addInfo($message); } else { @@ -61,7 +60,7 @@ public function __invoke(SanityCheckEvent $event): void $private = $cryptoUtils->loadPrivateKey($config, true, 'metadata.sign.'); $public = $cryptoUtils->loadPublicKey($config, true, 'metadata.sign.'); $matches = $this->matchingKeyPair($public['PEM'], $private['PEM'], $private['password']); - $message = MODID . Translate::noop('Matching key-pair for signing metadata'); + $message = $prefix . Translate::noop('Matching key-pair for signing metadata'); if ($matches) { $event->addInfo($message); } else { From 42bd6186cf430889e27285bfbf00418af6d0357c Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 21:51:28 +0100 Subject: [PATCH 510/532] Exclude packages from composer-unused that are used 'invisibly' --- .github/workflows/php.yml | 6 ++- composer.json | 2 - composer.lock | 78 +-------------------------------------- 3 files changed, 6 insertions(+), 80 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 8ca9681460..b7f109443d 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -201,7 +201,11 @@ jobs: run: composer-require-checker check --config-file=tools/composer-require-checker.json composer.json - name: Check code for unused dependencies in composer.json - run: composer-unused + run: | + composer-unused \ + --excludePackage=simplesamlphp/simplesamlphp-assets-base \ + --excludePackage=symfony/expression-language \ + --excludePackage=symfony/polyfill-intl-icu - name: PHP Code Sniffer run: vendor/bin/phpcs diff --git a/composer.json b/composer.json index 1b61de156c..f9d4622a8d 100644 --- a/composer.json +++ b/composer.json @@ -69,7 +69,6 @@ "psr/log": "~3.0", "robrichards/xmlseclibs": "^3.1.5", "simplesamlphp/assert": "~2.0", - "simplesamlphp/composer-module-installer": "~1.7", "simplesamlphp/saml2": "~6.1", "simplesamlphp/saml2-legacy": "~4.20", "simplesamlphp/simplesamlphp-assets-base": "~2.5.0", @@ -96,7 +95,6 @@ "symfony/translation-contracts": "~3.6", "symfony/twig-bridge": "~7.4", "symfony/var-exporter": "~7.4", - "symfony/yaml": "~7.4", "twig/intl-extra": "~3.21", "twig/twig": "~3.21" }, diff --git a/composer.lock b/composer.lock index d0a032601d..dc2e7fd1c3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ec1f41a75aca426bf06c09ac7eff707b", + "content-hash": "e6ce0e055248d7e74f928647f69b3630", "packages": [ { "name": "gettext/gettext", @@ -4537,82 +4537,6 @@ ], "time": "2025-09-11T10:15:23+00:00" }, - { - "name": "symfony/yaml", - "version": "v7.4.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "58751048de17bae71c5aa0d13cb19d79bca26391" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/58751048de17bae71c5aa0d13cb19d79bca26391", - "reference": "58751048de17bae71c5aa0d13cb19d79bca26391", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<6.4" - }, - "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.6" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-02-09T09:33:46+00:00" - }, { "name": "twig/intl-extra", "version": "v3.24.0", From 4dd709ee195477007b36428d39ff3482658e23ba Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 23 Mar 2026 22:02:30 +0100 Subject: [PATCH 511/532] Fix code coverage reports --- .github/workflows/php.yml | 10 ++++++---- composer.json | 2 ++ phpunit.xml | 4 +--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index b7f109443d..86ee13436d 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -54,8 +54,8 @@ jobs: php-version: ${{ matrix.php-versions }} extensions: intl, mbstring, mysql, pdo, pdo_sqlite, soap, sodium, xml tools: composer:v2 - ini-values: error_reporting=E_ALL - coverage: xdebug + ini-values: error_reporting=E_ALL, pcov.directory=${{ github.workspace }} + coverage: pcov - name: Setup problem matchers for PHP run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" @@ -91,11 +91,11 @@ jobs: - name: Run unit tests with coverage if: ${{ matrix.php-versions == '8.5' }} - run: ./vendor/bin/phpunit + run: vendor/bin/phpunit - name: Run unit tests (no coverage) if: ${{ matrix.php-versions != '8.5' }} - run: ./vendor/bin/phpunit --no-coverage + run: vendor/bin/phpunit --no-coverage - name: Save coverage data if: ${{ matrix.php-versions == '8.5' }} @@ -272,6 +272,8 @@ jobs: runs-on: [ubuntu-latest] needs: [unit-tests-linux] steps: + - uses: actions/checkout@v6 + - uses: actions/download-artifact@v8 with: name: coverage-data diff --git a/composer.json b/composer.json index f9d4622a8d..3b37ab4a49 100644 --- a/composer.json +++ b/composer.json @@ -25,6 +25,7 @@ "SimpleSAML\\Module\\admin\\": "modules/admin/src", "SimpleSAML\\Module\\core\\": "modules/core/src", "SimpleSAML\\Module\\cron\\": "modules/cron/src", + "SimpleSAML\\Module\\debugsp\\": "modules/debugsp/src", "SimpleSAML\\Module\\exampleauth\\": "modules/exampleauth/src", "SimpleSAML\\Module\\multiauth\\": "modules/multiauth/src", "SimpleSAML\\Module\\saml\\": "modules/saml/src" @@ -37,6 +38,7 @@ "SimpleSAML\\Test\\Module\\admin\\": ["tests//modules/admin/src"], "SimpleSAML\\Test\\Module\\core\\": ["tests/modules/core/src"], "SimpleSAML\\Test\\Module\\cron\\": ["tests/modules/cron/src"], + "SimpleSAML\\Test\\Module\\debugsp\\": ["tests/modules/debugsp/src"], "SimpleSAML\\Test\\Module\\exampleauth\\": ["tests/modules/exampleauth/src"], "SimpleSAML\\Test\\Module\\multiauth\\": ["tests/modules/multiauth/src"], "SimpleSAML\\Test\\Module\\saml\\": ["tests/modules/saml/src"] diff --git a/phpunit.xml b/phpunit.xml index 010a78f022..3544a2443f 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -3,8 +3,6 @@ - - @@ -16,7 +14,7 @@ - ./modules/*/src + ./modules ./src From c52682fd1a2c5b740ecef2177ed7afb7b521d8a8 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 25 Mar 2026 07:31:22 +0100 Subject: [PATCH 512/532] Bump dependencies --- composer.lock | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/composer.lock b/composer.lock index dc2e7fd1c3..453dbec774 100644 --- a/composer.lock +++ b/composer.lock @@ -1383,16 +1383,16 @@ }, { "name": "simplesamlphp/xml-common", - "version": "v2.7.2", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "219b76fc2189ea36f26ff2ed642afd19e12143ea" + "reference": "61ec392b5fd7a1d14889912f05b3033b1806a763" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/219b76fc2189ea36f26ff2ed642afd19e12143ea", - "reference": "219b76fc2189ea36f26ff2ed642afd19e12143ea", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/61ec392b5fd7a1d14889912f05b3033b1806a763", + "reference": "61ec392b5fd7a1d14889912f05b3033b1806a763", "shasum": "" }, "require": { @@ -1413,6 +1413,11 @@ "simplesamlphp/simplesamlphp-test-framework": "~1.11" }, "type": "simplesamlphp-xmlprovider", + "extra": { + "branch-alias": { + "dev-master": "v2.8.x-dev" + } + }, "autoload": { "psr-4": { "SimpleSAML\\XML\\": "src/XML/", @@ -1446,7 +1451,7 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2026-03-11T16:16:22+00:00" + "time": "2026-03-24T22:01:04+00:00" }, { "name": "simplesamlphp/xml-security", @@ -5610,11 +5615,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.42", + "version": "2.1.43", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1279e1ce86ba768f0780c9d889852b4e02ff40d0", - "reference": "1279e1ce86ba768f0780c9d889852b4e02ff40d0", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d01bebe3edfd4d49b9666ee5b8271ddca561042f", + "reference": "d01bebe3edfd4d49b9666ee5b8271ddca561042f", "shasum": "" }, "require": { @@ -5659,7 +5664,7 @@ "type": "github" } ], - "time": "2026-03-17T14:58:32+00:00" + "time": "2026-03-24T20:40:50+00:00" }, { "name": "phpstan/phpstan-mockery", From 6f9871609009f69b25b139e8d589fd3a7117a89f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ivan=C4=8Di=C4=87?= Date: Wed, 25 Mar 2026 09:14:27 +0100 Subject: [PATCH 513/532] Update branch aliases --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 3b37ab4a49..686872c4ea 100644 --- a/composer.json +++ b/composer.json @@ -136,7 +136,8 @@ }, "extra": { "branch-alias": { - "dev-master": "2.5.0.x-dev" + "dev-master": "2.5.x-dev", + "dev-simplesamlphp-2.5": "2.5.x-dev" } }, "scripts": { From bab1a70ce071a1d578a13fb3e34d8cd62c9cf3d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ivan=C4=8Di=C4=87?= Date: Wed, 25 Mar 2026 09:15:09 +0100 Subject: [PATCH 514/532] Do composer update --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index 453dbec774..2fa055e6fa 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e6ce0e055248d7e74f928647f69b3630", + "content-hash": "1082c9567137ac6d6b94d6a200485668", "packages": [ { "name": "gettext/gettext", From fc85222239fa2227026739402bee06957982b351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ivan=C4=8Di=C4=87?= Date: Wed, 25 Mar 2026 10:03:18 +0100 Subject: [PATCH 515/532] Introduce replace in composer.json --- composer.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/composer.json b/composer.json index 686872c4ea..0fdc241fdf 100644 --- a/composer.json +++ b/composer.json @@ -140,6 +140,9 @@ "dev-simplesamlphp-2.5": "2.5.x-dev" } }, + "replace": { + "simplesamlphp/simplesamlphp": "self.version" + }, "scripts": { "translations:unused": "./bin/translations translations:unused", "translations:update:translatable": "./bin/translations translations:update:translatable", From e2aa7315eb5228ebb44b0bded53d1a5c8df361c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ivan=C4=8Di=C4=87?= Date: Wed, 25 Mar 2026 10:22:04 +0100 Subject: [PATCH 516/532] Try provide instead --- composer.json | 4 ++-- composer.lock | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 0fdc241fdf..513c4e1621 100644 --- a/composer.json +++ b/composer.json @@ -140,8 +140,8 @@ "dev-simplesamlphp-2.5": "2.5.x-dev" } }, - "replace": { - "simplesamlphp/simplesamlphp": "self.version" + "provide": { + "simplesamlphp/simplesamlphp": "2.5.x-dev" }, "scripts": { "translations:unused": "./bin/translations translations:unused", diff --git a/composer.lock b/composer.lock index 2fa055e6fa..e74666c10c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1082c9567137ac6d6b94d6a200485668", + "content-hash": "103b0948724858857d952e24091e077b", "packages": [ { "name": "gettext/gettext", From e62b337ea68917ccb43a8e80fe7f9eb4dabd5066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ivan=C4=8Di=C4=87?= Date: Wed, 25 Mar 2026 10:28:34 +0100 Subject: [PATCH 517/532] Revert "Try provide instead" This reverts commit e2aa7315eb5228ebb44b0bded53d1a5c8df361c7. --- composer.json | 4 ++-- composer.lock | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 513c4e1621..0fdc241fdf 100644 --- a/composer.json +++ b/composer.json @@ -140,8 +140,8 @@ "dev-simplesamlphp-2.5": "2.5.x-dev" } }, - "provide": { - "simplesamlphp/simplesamlphp": "2.5.x-dev" + "replace": { + "simplesamlphp/simplesamlphp": "self.version" }, "scripts": { "translations:unused": "./bin/translations translations:unused", diff --git a/composer.lock b/composer.lock index e74666c10c..2fa055e6fa 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "103b0948724858857d952e24091e077b", + "content-hash": "1082c9567137ac6d6b94d6a200485668", "packages": [ { "name": "gettext/gettext", From a71606c761dcaf49b925b6e214cfef74f4c53e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ivan=C4=8Di=C4=87?= Date: Wed, 25 Mar 2026 10:28:39 +0100 Subject: [PATCH 518/532] Revert "Introduce replace in composer.json" This reverts commit fc85222239fa2227026739402bee06957982b351. --- composer.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/composer.json b/composer.json index 0fdc241fdf..686872c4ea 100644 --- a/composer.json +++ b/composer.json @@ -140,9 +140,6 @@ "dev-simplesamlphp-2.5": "2.5.x-dev" } }, - "replace": { - "simplesamlphp/simplesamlphp": "self.version" - }, "scripts": { "translations:unused": "./bin/translations translations:unused", "translations:update:translatable": "./bin/translations translations:update:translatable", From 8730eed96aeb6ada64e7552c5128a9c3952a022b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ivan=C4=8Di=C4=87?= Date: Wed, 25 Mar 2026 11:52:57 +0100 Subject: [PATCH 519/532] Get root version for composer --- .github/workflows/php.yml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 86ee13436d..e416041dcc 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -79,6 +79,15 @@ jobs: - name: Get composer cache directory run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$GITHUB_ENV" + - name: Get COMPOSER_ROOT_VERSION from composer.json branch alias + run: | + ROOT_VERSION=$(composer config extra.branch-alias.dev-master) + if [ -z "$ROOT_VERSION" ]; then + echo "Could not read extra.branch-alias.dev-master from composer.json" >&2 + exit 1 + fi + echo "COMPOSER_ROOT_VERSION=$ROOT_VERSION" >> "$GITHUB_ENV" + - name: Cache composer dependencies uses: actions/cache@v5 with: @@ -141,6 +150,15 @@ jobs: - name: Get composer cache directory run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$env:GITHUB_ENV" + - name: Get COMPOSER_ROOT_VERSION from composer.json branch alias + run: | + ROOT_VERSION=$(composer config extra.branch-alias.dev-master) + if [ -z "$ROOT_VERSION" ]; then + echo "Could not read extra.branch-alias.dev-master from composer.json" >&2 + exit 1 + fi + echo "COMPOSER_ROOT_VERSION=$ROOT_VERSION" >> "$GITHUB_ENV" + - name: Cache composer dependencies uses: actions/cache@v5 with: @@ -184,6 +202,15 @@ jobs: - name: Get composer cache directory run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$GITHUB_ENV" + - name: Get COMPOSER_ROOT_VERSION from composer.json branch alias + run: | + ROOT_VERSION=$(composer config extra.branch-alias.dev-master) + if [ -z "$ROOT_VERSION" ]; then + echo "Could not read extra.branch-alias.dev-master from composer.json" >&2 + exit 1 + fi + echo "COMPOSER_ROOT_VERSION=$ROOT_VERSION" >> "$GITHUB_ENV" + - name: Cache composer dependencies uses: actions/cache@v5 with: @@ -248,6 +275,15 @@ jobs: - name: Get composer cache directory run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$GITHUB_ENV" + - name: Get COMPOSER_ROOT_VERSION from composer.json branch alias + run: | + ROOT_VERSION=$(composer config extra.branch-alias.dev-master) + if [ -z "$ROOT_VERSION" ]; then + echo "Could not read extra.branch-alias.dev-master from composer.json" >&2 + exit 1 + fi + echo "COMPOSER_ROOT_VERSION=$ROOT_VERSION" >> "$GITHUB_ENV" + - name: Cache composer dependencies uses: actions/cache@v5 with: From 0731420b1c1339e5516fbff5391568c0e94e6660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Ivan=C4=8Di=C4=87?= Date: Wed, 25 Mar 2026 12:02:14 +0100 Subject: [PATCH 520/532] Use bash shell on Windows run --- .github/workflows/php.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index e416041dcc..32734de970 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -151,6 +151,7 @@ jobs: run: echo COMPOSER_CACHE="$(composer config cache-files-dir)" >> "$env:GITHUB_ENV" - name: Get COMPOSER_ROOT_VERSION from composer.json branch alias + shell: bash run: | ROOT_VERSION=$(composer config extra.branch-alias.dev-master) if [ -z "$ROOT_VERSION" ]; then From 9f39c78b418f4edfe51b64fecbb235fce866d952 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Fri, 27 Mar 2026 15:38:14 +0100 Subject: [PATCH 521/532] Restore symfony/yaml dependency --- .github/workflows/php.yml | 3 +- composer.json | 1 + composer.lock | 96 +++++++++++++++++++++++++++++++++++---- 3 files changed, 89 insertions(+), 11 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 32734de970..3da3205ac0 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -233,7 +233,8 @@ jobs: composer-unused \ --excludePackage=simplesamlphp/simplesamlphp-assets-base \ --excludePackage=symfony/expression-language \ - --excludePackage=symfony/polyfill-intl-icu + --excludePackage=symfony/polyfill-intl-icu \ + --excludePackage=symfony/yaml - name: PHP Code Sniffer run: vendor/bin/phpcs diff --git a/composer.json b/composer.json index 686872c4ea..ba360ef282 100644 --- a/composer.json +++ b/composer.json @@ -97,6 +97,7 @@ "symfony/translation-contracts": "~3.6", "symfony/twig-bridge": "~7.4", "symfony/var-exporter": "~7.4", + "symfony/yaml": "~7.4", "twig/intl-extra": "~3.21", "twig/twig": "~3.21" }, diff --git a/composer.lock b/composer.lock index 2fa055e6fa..9f6467588a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1082c9567137ac6d6b94d6a200485668", + "content-hash": "581c7c926d95c11b0e24aeaf59217592", "packages": [ { "name": "gettext/gettext", @@ -1383,16 +1383,16 @@ }, { "name": "simplesamlphp/xml-common", - "version": "v2.7.3", + "version": "v2.7.4", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "61ec392b5fd7a1d14889912f05b3033b1806a763" + "reference": "d55d6f855945b65043905fae5b9e1bd6adad8326" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/61ec392b5fd7a1d14889912f05b3033b1806a763", - "reference": "61ec392b5fd7a1d14889912f05b3033b1806a763", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/d55d6f855945b65043905fae5b9e1bd6adad8326", + "reference": "d55d6f855945b65043905fae5b9e1bd6adad8326", "shasum": "" }, "require": { @@ -1451,7 +1451,7 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2026-03-24T22:01:04+00:00" + "time": "2026-03-26T19:12:30+00:00" }, { "name": "simplesamlphp/xml-security", @@ -4542,6 +4542,82 @@ ], "time": "2025-09-11T10:15:23+00:00" }, + { + "name": "symfony/yaml", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/58751048de17bae71c5aa0d13cb19d79bca26391", + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-09T09:33:46+00:00" + }, { "name": "twig/intl-extra", "version": "v3.24.0", @@ -5615,11 +5691,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.43", + "version": "2.1.44", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d01bebe3edfd4d49b9666ee5b8271ddca561042f", - "reference": "d01bebe3edfd4d49b9666ee5b8271ddca561042f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/4a88c083c668b2c364a425c9b3171b2d9ea5d218", + "reference": "4a88c083c668b2c364a425c9b3171b2d9ea5d218", "shasum": "" }, "require": { @@ -5664,7 +5740,7 @@ "type": "github" } ], - "time": "2026-03-24T20:40:50+00:00" + "time": "2026-03-25T17:34:21+00:00" }, { "name": "phpstan/phpstan-mockery", From 23666888970862d830f6cde154723adf2f548c7c Mon Sep 17 00:00:00 2001 From: Thijs Kinkhorst Date: Fri, 27 Mar 2026 19:54:32 +0100 Subject: [PATCH 522/532] Restore functionality to specify email from of outgoing messages. (#2625) The variable 'sendmail_from' that is unused is not restored, instead an extra option added to the options array; this is both cleaner and transport-agnostic. --- config/config.php.dist | 11 +++-------- src/SimpleSAML/Utils/EMail.php | 17 ++++++++++++++--- tests/src/SimpleSAML/Utils/EMailTest.php | 23 +++++++++++++++++++++++ 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/config/config.php.dist b/config/config.php.dist index 077540583a..3fb78ff2d1 100644 --- a/config/config.php.dist +++ b/config/config.php.dist @@ -149,23 +149,18 @@ $config = [ 'username' => 'user@example.org', // optional: if set, enables smtp authentication 'password' => 'password', // optional: if set, enables smtp authentication 'security' => 'tls', // optional: defaults to no smtp security + 'sender' => 'no-reply@example.org', // optional: (envelope) from address 'smtpOptions' => [], // optional: passed to stream_context_create when connecting via SMTP ], // sendmail mail transport options /* 'mail.transport.options' => [ - 'path' => '/usr/sbin/sendmail' // optional: defaults to php.ini path + 'path' => '/usr/sbin/sendmail', // optional: defaults to php.ini path + 'sender' => 'no-reply@example.org' // optional: (envelope) from address ], */ - /* - * The envelope from address for outgoing emails. - * This should be in a domain that has your application's IP addresses in its SPF record - * to prevent it from being rejected by mail filters. - */ - //'sendmail_from' => 'no-reply@example.org', - /* * The timezone of the server. This option should be set to the timezone you want * SimpleSAMLphp to report the time in. The default is to guess the timezone based diff --git a/src/SimpleSAML/Utils/EMail.php b/src/SimpleSAML/Utils/EMail.php index a10872105f..5ffd1837f0 100644 --- a/src/SimpleSAML/Utils/EMail.php +++ b/src/SimpleSAML/Utils/EMail.php @@ -50,7 +50,7 @@ public function __construct( ) { $this->mail = new PHPMailer(true); $this->mail->Subject = $subject; - $this->mail->setFrom($from ?: $this->getDefaultMailAddress()); + $this->mail->setFrom($from ?: $this->getMailSenderAddress() ?: $this->getDefaultMailAddress()); $this->mail->addAddress($to ?: $this->getDefaultMailAddress()); $this->initFromConfig($this); @@ -59,8 +59,6 @@ public function __construct( /** * Get the default e-mail address from the configuration - * This is used both as source and destination address - * unless something else is provided at the constructor. * * It will refuse to return the SimpleSAMLphp default address, * which is na@example.org. @@ -79,6 +77,19 @@ public function getDefaultMailAddress(): string } + /** + * Get the envelope sender address from the configuration + * + * @return string Default mail address + */ + public function getMailSenderAddress(): ?string + { + $config = Configuration::getInstance(); + $options = $config->getOptionalArray('mail.transport.options', []); + return $options['sender'] ?: null; + } + + /** * Set the data that should be embedded in the e-mail body * diff --git a/tests/src/SimpleSAML/Utils/EMailTest.php b/tests/src/SimpleSAML/Utils/EMailTest.php index 2fd3e88a4e..4731eec814 100644 --- a/tests/src/SimpleSAML/Utils/EMailTest.php +++ b/tests/src/SimpleSAML/Utils/EMailTest.php @@ -154,4 +154,27 @@ public function testGetDefaultMailAddress(): void $mail = new EMail('test', null, 'phpunit@simplesamlphp.org'); $this->assertEquals('gamaarna@example.org', $mail->getDefaultMailAddress()); } + + + /** + * Test setting configuration of (envelope) sender. + * + */ + public function testGetSenderMailAddress(): void + { + Configuration::loadFromArray([ + 'technicalcontact_email' => 'gamaarna@example.org', + 'mail.transport.options' => ['sender' => 'noreply@example.org'], + ], '[ARRAY]', 'simplesaml'); + + $mail = new EMail('test'); + $this->assertEquals('noreply@example.org', $mail->getMailSenderAddress()); + + Configuration::loadFromArray([ + 'technicalcontact_email' => 'gamaarna@example.org', + ], '[ARRAY]', 'simplesaml'); + + $mail = new EMail('test', null, 'phpunit@simplesamlphp.org'); + $this->assertNull($mail->getMailSenderAddress()); + } } From 5a340b5d4c5848db14a338f9dbebf7a108c9baaa Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Sun, 29 Mar 2026 11:03:32 +0200 Subject: [PATCH 523/532] Allow admin menu to wrap (#2623) --- modules/admin/public/assets/css/admin.css | 9 +++++++++ modules/admin/templates/authsource_list.twig | 4 ++++ modules/admin/templates/includes/menu.twig | 4 ++-- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/modules/admin/public/assets/css/admin.css b/modules/admin/public/assets/css/admin.css index 1d7e76980f..d3765b9e2d 100644 --- a/modules/admin/public/assets/css/admin.css +++ b/modules/admin/public/assets/css/admin.css @@ -54,3 +54,12 @@ ul.modulelist { div.code-box-content { padding: 0; } + +.wrapping-menu { + white-space: normal; +} + +.wrapping-menu .pure-menu-list { + display: flex; + flex-wrap: wrap; +} diff --git a/modules/admin/templates/authsource_list.twig b/modules/admin/templates/authsource_list.twig index a5e731ab21..1df1499bc2 100644 --- a/modules/admin/templates/authsource_list.twig +++ b/modules/admin/templates/authsource_list.twig @@ -2,6 +2,10 @@ {% set frontpage_section = 'test' %} {% extends "base.twig" %} +{% block preload %} + +{% endblock %} + {% block content %} {%- include "@admin/includes/menu.twig" %} diff --git a/modules/admin/templates/includes/menu.twig b/modules/admin/templates/includes/menu.twig index fda00d6e6a..a6c7167ea8 100644 --- a/modules/admin/templates/includes/menu.twig +++ b/modules/admin/templates/includes/menu.twig @@ -1,6 +1,6 @@
-
-
+
+
    {%- for id,option in menu %} From 31cd0cacfdb61336655085458fb33222bb809d65 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Mon, 30 Mar 2026 19:52:40 +0200 Subject: [PATCH 524/532] Restore composer-module-installer as a dependency --- .github/workflows/php.yml | 1 + composer.json | 1 + composer.lock | 34 +++++++++++++++++----------------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 3da3205ac0..0804d7a373 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -231,6 +231,7 @@ jobs: - name: Check code for unused dependencies in composer.json run: | composer-unused \ + --excludePackage=simplesamlphp/composer-module-installer \ --excludePackage=simplesamlphp/simplesamlphp-assets-base \ --excludePackage=symfony/expression-language \ --excludePackage=symfony/polyfill-intl-icu \ diff --git a/composer.json b/composer.json index ba360ef282..ba161e6fc5 100644 --- a/composer.json +++ b/composer.json @@ -71,6 +71,7 @@ "psr/log": "~3.0", "robrichards/xmlseclibs": "^3.1.5", "simplesamlphp/assert": "~2.0", + "simplesamlphp/composer-module-installer": "~1.7", "simplesamlphp/saml2": "~6.1", "simplesamlphp/saml2-legacy": "~4.20", "simplesamlphp/simplesamlphp-assets-base": "~2.5.0", diff --git a/composer.lock b/composer.lock index 9f6467588a..3ac9ee9bc7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "581c7c926d95c11b0e24aeaf59217592", + "content-hash": "81e3ad9b7b5476148def7dc7054dd2ee", "packages": [ { "name": "gettext/gettext", @@ -1213,16 +1213,16 @@ }, { "name": "simplesamlphp/saml2", - "version": "v6.1.3", + "version": "v6.1.4", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "dc37bd320d1a7d36688cb2549cd3b5163c1f4ff9" + "reference": "45aaa2f946b7964188fd139dd384cbe6d38c7eb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/dc37bd320d1a7d36688cb2549cd3b5163c1f4ff9", - "reference": "dc37bd320d1a7d36688cb2549cd3b5163c1f4ff9", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/45aaa2f946b7964188fd139dd384cbe6d38c7eb7", + "reference": "45aaa2f946b7964188fd139dd384cbe6d38c7eb7", "shasum": "" }, "require": { @@ -1283,9 +1283,9 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.3" + "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.4" }, - "time": "2026-03-16T20:18:24+00:00" + "time": "2026-03-30T16:23:58+00:00" }, { "name": "simplesamlphp/saml2-legacy", @@ -1347,16 +1347,16 @@ }, { "name": "simplesamlphp/simplesamlphp-assets-base", - "version": "v2.5.13", + "version": "v2.5.14", "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git", - "reference": "b59015c77c52e477bcfb2452f8c0f8755c13be1d" + "reference": "0b9185712983e55ac461dc433172bc8efbbc2782" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/b59015c77c52e477bcfb2452f8c0f8755c13be1d", - "reference": "b59015c77c52e477bcfb2452f8c0f8755c13be1d", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/0b9185712983e55ac461dc433172bc8efbbc2782", + "reference": "0b9185712983e55ac461dc433172bc8efbbc2782", "shasum": "" }, "require": { @@ -1377,9 +1377,9 @@ "description": "Assets for the SimpleSAMLphp main repository", "support": { "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues", - "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.13" + "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.5.14" }, - "time": "2026-03-04T16:48:40+00:00" + "time": "2026-03-29T02:09:37+00:00" }, { "name": "simplesamlphp/xml-common", @@ -5691,11 +5691,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.44", + "version": "2.1.45", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/4a88c083c668b2c364a425c9b3171b2d9ea5d218", - "reference": "4a88c083c668b2c364a425c9b3171b2d9ea5d218", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f8cdfd9421b7edb7686a2d150a234870464eac70", + "reference": "f8cdfd9421b7edb7686a2d150a234870464eac70", "shasum": "" }, "require": { @@ -5740,7 +5740,7 @@ "type": "github" } ], - "time": "2026-03-25T17:34:21+00:00" + "time": "2026-03-30T13:22:02+00:00" }, { "name": "phpstan/phpstan-mockery", From 8b40b74565af382346bff2eee90de8036df14473 Mon Sep 17 00:00:00 2001 From: Luke Leber <105240977+lal65@users.noreply.github.com> Date: Thu, 2 Apr 2026 12:13:47 -0400 Subject: [PATCH 525/532] Expand support range (#2627) --- composer.json | 2 +- composer.lock | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/composer.json b/composer.json index ba161e6fc5..b3f4350613 100644 --- a/composer.json +++ b/composer.json @@ -66,7 +66,7 @@ "gettext/gettext": "~5.7", "gettext/php-scanner": "^2.0", "gettext/translator": "~1.2", - "phpmailer/phpmailer": "~6.10", + "phpmailer/phpmailer": "~6.10 || ~7.0", "psr/event-dispatcher": "~1.0", "psr/log": "~3.0", "robrichards/xmlseclibs": "^3.1.5", diff --git a/composer.lock b/composer.lock index 3ac9ee9bc7..c0490707e0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "81e3ad9b7b5476148def7dc7054dd2ee", + "content-hash": "41060b1b63ef4090b2328f8899248310", "packages": [ { "name": "gettext/gettext", @@ -543,16 +543,16 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.12.0", + "version": "v7.0.2", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12" + "reference": "ebf1655bd5b99b3f97e1a3ec0a69e5f4cd7ea088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/d1ac35d784bf9f5e61b424901d5a014967f15b12", - "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/ebf1655bd5b99b3f97e1a3ec0a69e5f4cd7ea088", + "reference": "ebf1655bd5b99b3f97e1a3ec0a69e5f4cd7ea088", "shasum": "" }, "require": { @@ -566,13 +566,14 @@ "doctrine/annotations": "^1.2.6 || ^1.13.3", "php-parallel-lint/php-console-highlighter": "^1.0.0", "php-parallel-lint/php-parallel-lint": "^1.3.2", - "phpcompatibility/php-compatibility": "^9.3.5", - "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.7.2", + "phpcompatibility/php-compatibility": "^10.0.0@dev", + "squizlabs/php_codesniffer": "^3.13.5", "yoast/phpunit-polyfills": "^1.0.4" }, "suggest": { "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", + "directorytree/imapengine": "For uploading sent messages via IMAP, see gmail example", + "ext-imap": "Needed to support advanced email address parsing according to RFC822", "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", "ext-openssl": "Needed for secure SMTP sending and DKIM signing", "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", @@ -612,7 +613,7 @@ "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.12.0" + "source": "https://github.com/PHPMailer/PHPMailer/tree/v7.0.2" }, "funding": [ { @@ -620,7 +621,7 @@ "type": "github" } ], - "time": "2025-10-15T16:49:08+00:00" + "time": "2026-01-09T18:02:33+00:00" }, { "name": "psr/cache", From 85cd5b2a0045bda402b3dcc644e3459ebe943fd7 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 2 Apr 2026 19:53:26 +0200 Subject: [PATCH 526/532] Fix Windows-build --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 0804d7a373..58970e6e2b 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -158,7 +158,7 @@ jobs: echo "Could not read extra.branch-alias.dev-master from composer.json" >&2 exit 1 fi - echo "COMPOSER_ROOT_VERSION=$ROOT_VERSION" >> "$GITHUB_ENV" + echo "COMPOSER_ROOT_VERSION=$ROOT_VERSION" >> "$env:GITHUB_ENV" - name: Cache composer dependencies uses: actions/cache@v5 From 19ae42766271bdf19c5dfdcda8bd0ca883268ac5 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 4 Apr 2026 17:33:53 +0200 Subject: [PATCH 527/532] Fix Windows-cache --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 58970e6e2b..2a7d065803 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -164,7 +164,7 @@ jobs: uses: actions/cache@v5 with: path: ${{ env.COMPOSER_CACHE }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + key: ${{ runner.os }}-composer-${{ hashFiles('**\composer.lock') }} restore-keys: ${{ runner.os }}-composer- - name: Install Composer dependencies From 847eb78cc40e90b1478babc7b5228fcb1626b395 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Sat, 4 Apr 2026 17:34:24 +0200 Subject: [PATCH 528/532] Add 1-3 merge-files to .gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index a7b41cc710..7264898ed0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +1 +2 +3 cert/* config/* metadata/* @@ -7,6 +10,7 @@ metadata/* !/metadata/*.dist !/public/assets/.gitkeep /public/assets/* +.phplint.cache/ .phpunit.cache/ .phpunit.result.cache phpunit.xml.bak From 892077dfbb23b734ea989818cbcdc8824f1649f0 Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Thu, 9 Apr 2026 22:27:06 +0200 Subject: [PATCH 529/532] Merge commit from fork --- modules/saml/templates/proxy/invalid_session.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/saml/templates/proxy/invalid_session.twig b/modules/saml/templates/proxy/invalid_session.twig index a198a96599..9d90533cd4 100644 --- a/modules/saml/templates/proxy/invalid_session.twig +++ b/modules/saml/templates/proxy/invalid_session.twig @@ -3,7 +3,7 @@ {% block content %}

    {{ 'Invalid Identity Provider'|trans }}

    -

    {{ 'You already have a valid session with an identity provider (%IDP%) that is not accepted by %SP%. Would you like to log out from your existing session and log in again with another identity provider?'|trans({"%IDP%": entity_idp|entityDisplayName, "%SP%": entity_sp|entityDisplayName})|raw }}

    +

    {{ 'You already have a valid session with an identity provider (%IDP%) that is not accepted by %SP%. Would you like to log out from your existing session and log in again with another identity provider?'|trans({"%IDP%": entity_idp|entityDisplayName|escape('html'), "%SP%": entity_sp|entityDisplayName|escape('html')})|raw }}

    From 0c2a37c619fb49e1ce6a70e77062b10fdae40dfa Mon Sep 17 00:00:00 2001 From: Tim van Dijen Date: Wed, 15 Apr 2026 17:30:43 +0200 Subject: [PATCH 530/532] Fix 4x PHPStan-issue Fixes "is not subtype of native type PHPUnit\Framework\MockObject\MockObject" --- tests/modules/core/src/Auth/UserPassBaseTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/modules/core/src/Auth/UserPassBaseTest.php b/tests/modules/core/src/Auth/UserPassBaseTest.php index 2d13591e53..2ab4b6197d 100644 --- a/tests/modules/core/src/Auth/UserPassBaseTest.php +++ b/tests/modules/core/src/Auth/UserPassBaseTest.php @@ -38,7 +38,7 @@ public function testAuthenticateECPCallsLoginAndSetsAttributes(): void ->with($username, $password) ->willReturn($attributes); - /** @var \SimpleSAML\Module\core\Auth\UserPassBase $stub */ + /** @var \SimpleSAML\Module\core\Auth\UserPassBase&\PHPUnit\Framework\MockObject\MockObject $stub */ $stub->authenticate($state); $this->assertSame($attributes, $state['Attributes']); @@ -64,7 +64,7 @@ public function testAuthenticateECPMissingUsername(): void ->onlyMethods(['login']) ->getMock(); - /** @var \SimpleSAML\Module\core\Auth\UserPassBase $stub */ + /** @var \SimpleSAML\Module\core\Auth\UserPassBase&\PHPUnit\Framework\MockObject\MockObject $stub */ $stub->authenticate($state); } @@ -88,7 +88,7 @@ public function testAuthenticateECPMissingPassword(): void ->onlyMethods(['login']) ->getMock(); - /** @var \SimpleSAML\Module\core\Auth\UserPassBase $stub */ + /** @var \SimpleSAML\Module\core\Auth\UserPassBase&\PHPUnit\Framework\MockObject\MockObject $stub */ $stub->authenticate($state); } @@ -117,7 +117,7 @@ public function testAuthenticateECPCallsLoginWithForcedUsername(): void ->with($forcedUsername, $password) ->willReturn($attributes); - /** @var \SimpleSAML\Module\core\Auth\UserPassBase $stub */ + /** @var \SimpleSAML\Module\core\Auth\UserPassBase&\PHPUnit\Framework\MockObject\MockObject $stub */ $stub->setForcedUsername($forcedUsername); $stub->authenticate($state); } From dba9e9465f1be27d6e7ee87988f8e239c8eb0dfc Mon Sep 17 00:00:00 2001 From: Marko Ivancic Date: Thu, 16 Apr 2026 09:40:03 +0200 Subject: [PATCH 531/532] Duplicate requirement in composer.json (#2629) * Remove duplicate package requirement * composer update --- composer.json | 4 +- composer.lock | 553 ++++++++++++++++++++++++-------------------------- 2 files changed, 270 insertions(+), 287 deletions(-) diff --git a/composer.json b/composer.json index b3f4350613..a10aaf9097 100644 --- a/composer.json +++ b/composer.json @@ -106,11 +106,9 @@ "ext-curl": "*", "ext-pdo_sqlite": "*", - "gettext/php-scanner": "~2.0", "mikey179/vfsstream": "~1.6", "predis/predis": "~3.3", - "simplesamlphp/simplesamlphp-test-framework": "~1.11.5 || dev-master", - "symfony/translation": "~7.4" + "simplesamlphp/simplesamlphp-test-framework": "~1.11.5 || dev-master" }, "suggest": { "predis/predis": "Needed if a Redis server is used to store session information", diff --git a/composer.lock b/composer.lock index c0490707e0..6993dc45eb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "41060b1b63ef4090b2328f8899248310", + "content-hash": "dd74def800ca59ced894e5550a73997c", "packages": [ { "name": "gettext/gettext", @@ -1214,16 +1214,16 @@ }, { "name": "simplesamlphp/saml2", - "version": "v6.1.4", + "version": "v6.1.5", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "45aaa2f946b7964188fd139dd384cbe6d38c7eb7" + "reference": "939564f276598b71e5162243dae9deaacbe5440e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/45aaa2f946b7964188fd139dd384cbe6d38c7eb7", - "reference": "45aaa2f946b7964188fd139dd384cbe6d38c7eb7", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/939564f276598b71e5162243dae9deaacbe5440e", + "reference": "939564f276598b71e5162243dae9deaacbe5440e", "shasum": "" }, "require": { @@ -1284,9 +1284,9 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.4" + "source": "https://github.com/simplesamlphp/saml2/tree/v6.1.5" }, - "time": "2026-03-30T16:23:58+00:00" + "time": "2026-04-10T11:04:51+00:00" }, { "name": "simplesamlphp/saml2-legacy", @@ -1384,16 +1384,16 @@ }, { "name": "simplesamlphp/xml-common", - "version": "v2.7.4", + "version": "v2.8.0", "source": { "type": "git", "url": "https://github.com/simplesamlphp/xml-common.git", - "reference": "d55d6f855945b65043905fae5b9e1bd6adad8326" + "reference": "d3207b41e0e042ccbdfd0d0620f631e94c39d4ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/d55d6f855945b65043905fae5b9e1bd6adad8326", - "reference": "d55d6f855945b65043905fae5b9e1bd6adad8326", + "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/d3207b41e0e042ccbdfd0d0620f631e94c39d4ba", + "reference": "d3207b41e0e042ccbdfd0d0620f631e94c39d4ba", "shasum": "" }, "require": { @@ -1408,7 +1408,7 @@ "php": "^8.3", "psr/clock": "~1.0", "simplesamlphp/assert": "~2.0", - "simplesamlphp/composer-xmlprovider-installer": "~1.2" + "simplesamlphp/composer-xmlprovider-installer": "~1.3" }, "require-dev": { "simplesamlphp/simplesamlphp-test-framework": "~1.11" @@ -1416,7 +1416,7 @@ "type": "simplesamlphp-xmlprovider", "extra": { "branch-alias": { - "dev-master": "v2.8.x-dev" + "dev-master": "v2.7.x-dev" } }, "autoload": { @@ -1452,7 +1452,7 @@ "issues": "https://github.com/simplesamlphp/xml-common/issues", "source": "https://github.com/simplesamlphp/xml-common" }, - "time": "2026-03-26T19:12:30+00:00" + "time": "2026-04-13T20:34:07+00:00" }, { "name": "simplesamlphp/xml-security", @@ -1573,16 +1573,16 @@ }, { "name": "symfony/cache", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "665522ec357540e66c294c08583b40ee576574f0" + "reference": "467464da294734b0fb17e853e5712abc8470f819" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/665522ec357540e66c294c08583b40ee576574f0", - "reference": "665522ec357540e66c294c08583b40ee576574f0", + "url": "https://api.github.com/repos/symfony/cache/zipball/467464da294734b0fb17e853e5712abc8470f819", + "reference": "467464da294734b0fb17e853e5712abc8470f819", "shasum": "" }, "require": { @@ -1653,7 +1653,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.4.7" + "source": "https://github.com/symfony/cache/tree/v7.4.8" }, "funding": [ { @@ -1673,7 +1673,7 @@ "type": "tidelift" } ], - "time": "2026-03-06T08:14:57+00:00" + "time": "2026-03-30T15:15:47+00:00" }, { "name": "symfony/cache-contracts", @@ -1753,16 +1753,16 @@ }, { "name": "symfony/config", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "6c17162555bfb58957a55bb0e43e00035b6ae3d5" + "reference": "2d19dde43fa2ff720b9a40763ace7226594f503b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/6c17162555bfb58957a55bb0e43e00035b6ae3d5", - "reference": "6c17162555bfb58957a55bb0e43e00035b6ae3d5", + "url": "https://api.github.com/repos/symfony/config/zipball/2d19dde43fa2ff720b9a40763ace7226594f503b", + "reference": "2d19dde43fa2ff720b9a40763ace7226594f503b", "shasum": "" }, "require": { @@ -1808,7 +1808,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.4.7" + "source": "https://github.com/symfony/config/tree/v7.4.8" }, "funding": [ { @@ -1828,20 +1828,20 @@ "type": "tidelift" } ], - "time": "2026-03-06T10:41:14+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/console", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d" + "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e1e6770440fb9c9b0cf725f81d1361ad1835329d", - "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d", + "url": "https://api.github.com/repos/symfony/console/zipball/1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", + "reference": "1e92e39c51f95b88e3d66fa2d9f06d1fb45dd707", "shasum": "" }, "require": { @@ -1906,7 +1906,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.7" + "source": "https://github.com/symfony/console/tree/v7.4.8" }, "funding": [ { @@ -1926,20 +1926,20 @@ "type": "tidelift" } ], - "time": "2026-03-06T14:06:20+00:00" + "time": "2026-03-30T13:54:39+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "0f651e58f4917fb0e2cd261ccbfe3d71e6e0f5db" + "reference": "f7025fd7b687c240426562f86ada06a93b1e771d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/0f651e58f4917fb0e2cd261ccbfe3d71e6e0f5db", - "reference": "0f651e58f4917fb0e2cd261ccbfe3d71e6e0f5db", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f7025fd7b687c240426562f86ada06a93b1e771d", + "reference": "f7025fd7b687c240426562f86ada06a93b1e771d", "shasum": "" }, "require": { @@ -1990,7 +1990,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.4.7" + "source": "https://github.com/symfony/dependency-injection/tree/v7.4.8" }, "funding": [ { @@ -2010,7 +2010,7 @@ "type": "tidelift" } ], - "time": "2026-03-03T07:48:48+00:00" + "time": "2026-03-31T06:50:29+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2081,16 +2081,16 @@ }, { "name": "symfony/error-handler", - "version": "v7.4.4", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8" + "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8da531f364ddfee53e36092a7eebbbd0b775f6b8", - "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", + "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", "shasum": "" }, "require": { @@ -2139,7 +2139,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.4.4" + "source": "https://github.com/symfony/error-handler/tree/v7.4.8" }, "funding": [ { @@ -2159,20 +2159,20 @@ "type": "tidelift" } ], - "time": "2026-01-20T16:42:42+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.4.4", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "dc2c0eba1af673e736bb851d747d266108aea746" + "reference": "f57b899fa736fd71121168ef268f23c206083f0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dc2c0eba1af673e736bb851d747d266108aea746", - "reference": "dc2c0eba1af673e736bb851d747d266108aea746", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f57b899fa736fd71121168ef268f23c206083f0a", + "reference": "f57b899fa736fd71121168ef268f23c206083f0a", "shasum": "" }, "require": { @@ -2224,7 +2224,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.4" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.8" }, "funding": [ { @@ -2244,7 +2244,7 @@ "type": "tidelift" } ], - "time": "2026-01-05T11:45:34+00:00" + "time": "2026-03-30T13:54:39+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -2324,16 +2324,16 @@ }, { "name": "symfony/expression-language", - "version": "v7.4.4", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "f3a6497eb6573e185f2ec41cd3b3f0cd68ddf667" + "reference": "87ff95687748f4af65e4d5a6e917d448ec52aa83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/f3a6497eb6573e185f2ec41cd3b3f0cd68ddf667", - "reference": "f3a6497eb6573e185f2ec41cd3b3f0cd68ddf667", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/87ff95687748f4af65e4d5a6e917d448ec52aa83", + "reference": "87ff95687748f4af65e4d5a6e917d448ec52aa83", "shasum": "" }, "require": { @@ -2368,7 +2368,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v7.4.4" + "source": "https://github.com/symfony/expression-language/tree/v7.4.8" }, "funding": [ { @@ -2388,20 +2388,20 @@ "type": "tidelift" } ], - "time": "2026-01-05T08:47:25+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/filesystem", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "3ebc794fa5315e59fd122561623c2e2e4280538e" + "reference": "58b9790d12f9670b7f53a1c1738febd3108970a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3ebc794fa5315e59fd122561623c2e2e4280538e", - "reference": "3ebc794fa5315e59fd122561623c2e2e4280538e", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/58b9790d12f9670b7f53a1c1738febd3108970a5", + "reference": "58b9790d12f9670b7f53a1c1738febd3108970a5", "shasum": "" }, "require": { @@ -2438,7 +2438,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.4.6" + "source": "https://github.com/symfony/filesystem/tree/v7.4.8" }, "funding": [ { @@ -2458,20 +2458,20 @@ "type": "tidelift" } ], - "time": "2026-02-25T16:50:00+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/finder", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf" + "reference": "e0be088d22278583a82da281886e8c3592fbf149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf", - "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "url": "https://api.github.com/repos/symfony/finder/zipball/e0be088d22278583a82da281886e8c3592fbf149", + "reference": "e0be088d22278583a82da281886e8c3592fbf149", "shasum": "" }, "require": { @@ -2506,7 +2506,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.6" + "source": "https://github.com/symfony/finder/tree/v7.4.8" }, "funding": [ { @@ -2526,20 +2526,20 @@ "type": "tidelift" } ], - "time": "2026-01-29T09:40:50+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "c94bc78c85d76af67918404a95d44940f66a7c2f" + "reference": "180533cfbac2144349044267db31d5d3df9957cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c94bc78c85d76af67918404a95d44940f66a7c2f", - "reference": "c94bc78c85d76af67918404a95d44940f66a7c2f", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/180533cfbac2144349044267db31d5d3df9957cb", + "reference": "180533cfbac2144349044267db31d5d3df9957cb", "shasum": "" }, "require": { @@ -2664,7 +2664,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.4.7" + "source": "https://github.com/symfony/framework-bundle/tree/v7.4.8" }, "funding": [ { @@ -2684,20 +2684,20 @@ "type": "tidelift" } ], - "time": "2026-03-06T15:39:55+00:00" + "time": "2026-03-30T12:55:43+00:00" }, { "name": "symfony/http-client", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "1010624285470eb60e88ed10035102c75b4ea6af" + "reference": "01933e626c3de76bea1e22641e205e78f6a34342" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/1010624285470eb60e88ed10035102c75b4ea6af", - "reference": "1010624285470eb60e88ed10035102c75b4ea6af", + "url": "https://api.github.com/repos/symfony/http-client/zipball/01933e626c3de76bea1e22641e205e78f6a34342", + "reference": "01933e626c3de76bea1e22641e205e78f6a34342", "shasum": "" }, "require": { @@ -2765,7 +2765,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.4.7" + "source": "https://github.com/symfony/http-client/tree/v7.4.8" }, "funding": [ { @@ -2785,7 +2785,7 @@ "type": "tidelift" } ], - "time": "2026-03-05T11:16:58+00:00" + "time": "2026-03-30T12:55:43+00:00" }, { "name": "symfony/http-client-contracts", @@ -2867,16 +2867,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81" + "reference": "9381209597ec66c25be154cbf2289076e64d1eab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f94b3e7b7dafd40e666f0c9ff2084133bae41e81", - "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9381209597ec66c25be154cbf2289076e64d1eab", + "reference": "9381209597ec66c25be154cbf2289076e64d1eab", "shasum": "" }, "require": { @@ -2925,7 +2925,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.7" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.8" }, "funding": [ { @@ -2945,20 +2945,20 @@ "type": "tidelift" } ], - "time": "2026-03-06T13:15:18+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1" + "reference": "017e76ad089bac281553389269e259e155935e1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3b3fcf386c809be990c922e10e4c620d6367cab1", - "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/017e76ad089bac281553389269e259e155935e1a", + "reference": "017e76ad089bac281553389269e259e155935e1a", "shasum": "" }, "require": { @@ -3044,7 +3044,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.7" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.8" }, "funding": [ { @@ -3064,20 +3064,20 @@ "type": "tidelift" } ], - "time": "2026-03-06T16:33:18+00:00" + "time": "2026-03-31T20:57:01+00:00" }, { "name": "symfony/intl", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "6d6a398b18f73b3110140dbb030dcee2ae4ea81f" + "reference": "7cfb7792d580dea833647420afd5f2f98df8457b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/6d6a398b18f73b3110140dbb030dcee2ae4ea81f", - "reference": "6d6a398b18f73b3110140dbb030dcee2ae4ea81f", + "url": "https://api.github.com/repos/symfony/intl/zipball/7cfb7792d580dea833647420afd5f2f98df8457b", + "reference": "7cfb7792d580dea833647420afd5f2f98df8457b", "shasum": "" }, "require": { @@ -3134,7 +3134,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.4.6" + "source": "https://github.com/symfony/intl/tree/v7.4.8" }, "funding": [ { @@ -3154,20 +3154,20 @@ "type": "tidelift" } ], - "time": "2026-02-09T09:33:46+00:00" + "time": "2026-03-30T12:55:43+00:00" }, { "name": "symfony/password-hasher", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "376755eb9c9857d78aedb68341ad2f46d1908b29" + "reference": "18a7d92126c95962f7efbcc9e421ba710a366847" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/376755eb9c9857d78aedb68341ad2f46d1908b29", - "reference": "376755eb9c9857d78aedb68341ad2f46d1908b29", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/18a7d92126c95962f7efbcc9e421ba710a366847", + "reference": "18a7d92126c95962f7efbcc9e421ba710a366847", "shasum": "" }, "require": { @@ -3210,7 +3210,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.4.6" + "source": "https://github.com/symfony/password-hasher/tree/v7.4.8" }, "funding": [ { @@ -3230,20 +3230,20 @@ "type": "tidelift" } ], - "time": "2026-02-11T16:03:16+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.33.0", + "version": "v1.35.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", - "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { @@ -3293,7 +3293,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.35.0" }, "funding": [ { @@ -3313,20 +3313,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.33.0", + "version": "v1.35.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", - "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/ad1b7b9092976d6c948b8a187cec9faaea9ec1df", + "reference": "ad1b7b9092976d6c948b8a187cec9faaea9ec1df", "shasum": "" }, "require": { @@ -3375,7 +3375,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.35.0" }, "funding": [ { @@ -3395,20 +3395,20 @@ "type": "tidelift" } ], - "time": "2025-06-27T09:58:17+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.33.0", + "version": "v1.35.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c" + "reference": "3510b63d07376b04e57e27e82607d468bb134f78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/3510b63d07376b04e57e27e82607d468bb134f78", + "reference": "3510b63d07376b04e57e27e82607d468bb134f78", "shasum": "" }, "require": { @@ -3463,7 +3463,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.35.0" }, "funding": [ { @@ -3483,11 +3483,11 @@ "type": "tidelift" } ], - "time": "2025-06-20T22:24:30+00:00" + "time": "2026-04-10T16:50:15+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.35.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -3548,7 +3548,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.35.0" }, "funding": [ { @@ -3572,16 +3572,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "version": "v1.35.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", + "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", "shasum": "" }, "require": { @@ -3633,7 +3633,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.35.0" }, "funding": [ { @@ -3653,20 +3653,20 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" + "time": "2026-04-10T17:25:58+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.33.0", + "version": "v1.35.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/3600c2cb22399e25bb226e4a135ce91eeb2a6149", + "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149", "shasum": "" }, "require": { @@ -3713,7 +3713,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.35.0" }, "funding": [ { @@ -3733,20 +3733,20 @@ "type": "tidelift" } ], - "time": "2025-07-08T02:45:35+00:00" + "time": "2026-04-10T17:25:58+00:00" }, { "name": "symfony/polyfill-php85", - "version": "v1.33.0", + "version": "v1.35.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + "reference": "2c408a6bb0313e6001a83628dc5506100474254e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", - "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/2c408a6bb0313e6001a83628dc5506100474254e", + "reference": "2c408a6bb0313e6001a83628dc5506100474254e", "shasum": "" }, "require": { @@ -3793,7 +3793,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.35.0" }, "funding": [ { @@ -3813,20 +3813,20 @@ "type": "tidelift" } ], - "time": "2025-06-23T16:12:55+00:00" + "time": "2026-04-10T16:50:15+00:00" }, { "name": "symfony/routing", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "238d749c56b804b31a9bf3e26519d93b65a60938" + "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/238d749c56b804b31a9bf3e26519d93b65a60938", - "reference": "238d749c56b804b31a9bf3e26519d93b65a60938", + "url": "https://api.github.com/repos/symfony/routing/zipball/9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b", + "reference": "9608de9873ec86e754fb6c0a0fa7e5f1a960eb6b", "shasum": "" }, "require": { @@ -3878,7 +3878,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.6" + "source": "https://github.com/symfony/routing/tree/v7.4.8" }, "funding": [ { @@ -3898,7 +3898,7 @@ "type": "tidelift" } ], - "time": "2026-02-25T16:50:00+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/service-contracts", @@ -3989,16 +3989,16 @@ }, { "name": "symfony/string", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "9f209231affa85aa930a5e46e6eb03381424b30b" + "reference": "114ac57257d75df748eda23dd003878080b8e688" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/9f209231affa85aa930a5e46e6eb03381424b30b", - "reference": "9f209231affa85aa930a5e46e6eb03381424b30b", + "url": "https://api.github.com/repos/symfony/string/zipball/114ac57257d75df748eda23dd003878080b8e688", + "reference": "114ac57257d75df748eda23dd003878080b8e688", "shasum": "" }, "require": { @@ -4056,7 +4056,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.4.6" + "source": "https://github.com/symfony/string/tree/v7.4.8" }, "funding": [ { @@ -4076,20 +4076,20 @@ "type": "tidelift" } ], - "time": "2026-02-09T09:33:46+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/translation", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "1888cf064399868af3784b9e043240f1d89d25ce" + "reference": "33600f8489485425bfcddd0d983391038d3422e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/1888cf064399868af3784b9e043240f1d89d25ce", - "reference": "1888cf064399868af3784b9e043240f1d89d25ce", + "url": "https://api.github.com/repos/symfony/translation/zipball/33600f8489485425bfcddd0d983391038d3422e7", + "reference": "33600f8489485425bfcddd0d983391038d3422e7", "shasum": "" }, "require": { @@ -4156,7 +4156,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.4.6" + "source": "https://github.com/symfony/translation/tree/v7.4.8" }, "funding": [ { @@ -4176,7 +4176,7 @@ "type": "tidelift" } ], - "time": "2026-02-17T07:53:42+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/translation-contracts", @@ -4262,16 +4262,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "c67219ca6b79a57b64e36bbb2cd8ba741286587e" + "reference": "ac43e7e59298ed1ce98c8d228b651d46e907d02c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/c67219ca6b79a57b64e36bbb2cd8ba741286587e", - "reference": "c67219ca6b79a57b64e36bbb2cd8ba741286587e", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/ac43e7e59298ed1ce98c8d228b651d46e907d02c", + "reference": "ac43e7e59298ed1ce98c8d228b651d46e907d02c", "shasum": "" }, "require": { @@ -4287,7 +4287,7 @@ "symfony/form": "<6.4.32|>7,<7.3.10|>7.4,<7.4.4|>8.0,<8.0.4", "symfony/http-foundation": "<6.4", "symfony/http-kernel": "<6.4", - "symfony/mime": "<6.4", + "symfony/mime": "<6.4.36|>7,<7.4.8|>8.0,<8.0.8", "symfony/serializer": "<6.4", "symfony/translation": "<6.4", "symfony/workflow": "<6.4" @@ -4308,7 +4308,7 @@ "symfony/http-foundation": "^7.3|^8.0", "symfony/http-kernel": "^6.4|^7.0|^8.0", "symfony/intl": "^6.4|^7.0|^8.0", - "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4.36|^7.4.8|^8.0.8", "symfony/polyfill-intl-icu": "~1.0", "symfony/property-info": "^6.4|^7.0|^8.0", "symfony/routing": "^6.4|^7.0|^8.0", @@ -4353,7 +4353,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.4.7" + "source": "https://github.com/symfony/twig-bridge/tree/v7.4.8" }, "funding": [ { @@ -4373,20 +4373,20 @@ "type": "tidelift" } ], - "time": "2026-03-04T15:37:05+00:00" + "time": "2026-03-30T15:17:09+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291" + "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/045321c440ac18347b136c63d2e9bf28a2dc0291", - "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9510c3966f749a1d1ff0059e1eabef6cc621e7fd", + "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd", "shasum": "" }, "require": { @@ -4440,7 +4440,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.6" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.8" }, "funding": [ { @@ -4460,20 +4460,20 @@ "type": "tidelift" } ], - "time": "2026-02-15T10:53:20+00:00" + "time": "2026-03-30T13:44:50+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.4.0", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "03a60f169c79a28513a78c967316fbc8bf17816f" + "reference": "398907e89a2a56fe426f7955c6fa943ec0c77225" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/03a60f169c79a28513a78c967316fbc8bf17816f", - "reference": "03a60f169c79a28513a78c967316fbc8bf17816f", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/398907e89a2a56fe426f7955c6fa943ec0c77225", + "reference": "398907e89a2a56fe426f7955c6fa943ec0c77225", "shasum": "" }, "require": { @@ -4521,7 +4521,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.4.0" + "source": "https://github.com/symfony/var-exporter/tree/v7.4.8" }, "funding": [ { @@ -4541,20 +4541,20 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:15:23+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/yaml", - "version": "v7.4.6", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "58751048de17bae71c5aa0d13cb19d79bca26391" + "reference": "c58fdf7b3d6c2995368264c49e4e8b05bcff2883" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/58751048de17bae71c5aa0d13cb19d79bca26391", - "reference": "58751048de17bae71c5aa0d13cb19d79bca26391", + "url": "https://api.github.com/repos/symfony/yaml/zipball/c58fdf7b3d6c2995368264c49e4e8b05bcff2883", + "reference": "c58fdf7b3d6c2995368264c49e4e8b05bcff2883", "shasum": "" }, "require": { @@ -4597,7 +4597,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.6" + "source": "https://github.com/symfony/yaml/tree/v7.4.8" }, "funding": [ { @@ -4617,7 +4617,7 @@ "type": "tidelift" } ], - "time": "2026-02-09T09:33:46+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "twig/intl-extra", @@ -4765,16 +4765,16 @@ }, { "name": "webmozart/assert", - "version": "2.1.6", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8" + "reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/ff31ad6efc62e66e518fbab1cde3453d389bcdc8", - "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/eb0d790f735ba6cff25c683a85a1da0eadeff9e4", + "reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4", "shasum": "" }, "require": { @@ -4821,9 +4821,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.1.6" + "source": "https://github.com/webmozarts/assert/tree/2.3.0" }, - "time": "2026-02-27T10:28:38+00:00" + "time": "2026-04-11T10:33:05+00:00" } ], "packages-dev": [ @@ -5692,11 +5692,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.45", + "version": "2.1.47", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f8cdfd9421b7edb7686a2d150a234870464eac70", - "reference": "f8cdfd9421b7edb7686a2d150a234870464eac70", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/79015445d8bd79e62b29140f12e5bfced1dcca65", + "reference": "79015445d8bd79e62b29140f12e5bfced1dcca65", "shasum": "" }, "require": { @@ -5741,7 +5741,7 @@ "type": "github" } ], - "time": "2026-03-30T13:22:02+00:00" + "time": "2026-04-13T15:49:08+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -5850,16 +5850,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "12.5.3", + "version": "12.5.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d" + "reference": "876099a072646c7745f673d7aeab5382c4439691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b015312f28dd75b75d3422ca37dff2cd1a565e8d", - "reference": "b015312f28dd75b75d3422ca37dff2cd1a565e8d", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/876099a072646c7745f673d7aeab5382c4439691", + "reference": "876099a072646c7745f673d7aeab5382c4439691", "shasum": "" }, "require": { @@ -5868,7 +5868,6 @@ "ext-xmlwriter": "*", "nikic/php-parser": "^5.7.0", "php": ">=8.3", - "phpunit/php-file-iterator": "^6.0", "phpunit/php-text-template": "^5.0", "sebastian/complexity": "^5.0", "sebastian/environment": "^8.0.3", @@ -5915,7 +5914,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.3" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.6" }, "funding": [ { @@ -5935,7 +5934,7 @@ "type": "tidelift" } ], - "time": "2026-02-06T06:01:44+00:00" + "time": "2026-04-15T08:23:17+00:00" }, { "name": "phpunit/php-file-iterator", @@ -6196,16 +6195,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.14", + "version": "12.5.20", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "47283cfd98d553edcb1353591f4e255dc1bb61f0" + "reference": "c2364520611caa03567a8a020f2d59f3f90b115a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/47283cfd98d553edcb1353591f4e255dc1bb61f0", - "reference": "47283cfd98d553edcb1353591f4e255dc1bb61f0", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c2364520611caa03567a8a020f2d59f3f90b115a", + "reference": "c2364520611caa03567a8a020f2d59f3f90b115a", "shasum": "" }, "require": { @@ -6219,15 +6218,15 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.5.3", + "phpunit/php-code-coverage": "^12.5.5", "phpunit/php-file-iterator": "^6.0.1", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", "phpunit/php-timer": "^8.0.0", "sebastian/cli-parser": "^4.2.0", - "sebastian/comparator": "^7.1.4", + "sebastian/comparator": "^7.1.6", "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.3", + "sebastian/environment": "^8.0.4", "sebastian/exporter": "^7.0.2", "sebastian/global-state": "^8.0.2", "sebastian/object-enumerator": "^7.0.0", @@ -6274,31 +6273,15 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.14" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.20" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" + "url": "https://phpunit.de/sponsoring.html", + "type": "other" } ], - "time": "2026-02-18T12:38:40+00:00" + "time": "2026-04-15T05:05:59+00:00" }, { "name": "predis/predis", @@ -6434,16 +6417,16 @@ }, { "name": "sebastian/comparator", - "version": "7.1.4", + "version": "7.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6" + "reference": "c769009dee98f494e0edc3fd4f4087501688f11e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a7de5df2e094f9a80b40a522391a7e6022df5f6", - "reference": "6a7de5df2e094f9a80b40a522391a7e6022df5f6", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c769009dee98f494e0edc3fd4f4087501688f11e", + "reference": "c769009dee98f494e0edc3fd4f4087501688f11e", "shasum": "" }, "require": { @@ -6502,7 +6485,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.4" + "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.6" }, "funding": [ { @@ -6522,7 +6505,7 @@ "type": "tidelift" } ], - "time": "2026-01-24T09:28:48+00:00" + "time": "2026-04-14T08:23:15+00:00" }, { "name": "sebastian/complexity", @@ -6651,16 +6634,16 @@ }, { "name": "sebastian/environment", - "version": "8.0.4", + "version": "8.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "7b8842c2d8e85d0c3a5831236bf5869af6ab2a11" + "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/7b8842c2d8e85d0c3a5831236bf5869af6ab2a11", - "reference": "7b8842c2d8e85d0c3a5831236bf5869af6ab2a11", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/b121608b28a13f721e76ffbbd386d08eff58f3f6", + "reference": "b121608b28a13f721e76ffbbd386d08eff58f3f6", "shasum": "" }, "require": { @@ -6675,7 +6658,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -6703,7 +6686,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/8.0.4" + "source": "https://github.com/sebastianbergmann/environment/tree/8.1.0" }, "funding": [ { @@ -6723,7 +6706,7 @@ "type": "tidelift" } ], - "time": "2026-03-15T07:05:40+00:00" + "time": "2026-04-15T12:13:01+00:00" }, { "name": "sebastian/exporter", @@ -7266,12 +7249,12 @@ "source": { "type": "git", "url": "https://github.com/simplesamlphp/simplesamlphp-test-framework.git", - "reference": "0293a93cbe64d95f7f901c5ef5b0c498fb19fd67" + "reference": "ff0f2e0cc856fc8b5ef7a427c7caead772740c1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/0293a93cbe64d95f7f901c5ef5b0c498fb19fd67", - "reference": "0293a93cbe64d95f7f901c5ef5b0c498fb19fd67", + "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-test-framework/zipball/ff0f2e0cc856fc8b5ef7a427c7caead772740c1a", + "reference": "ff0f2e0cc856fc8b5ef7a427c7caead772740c1a", "shasum": "" }, "require": { @@ -7284,12 +7267,14 @@ "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^12.3 || ^13.0", "psr/log": "^3.0", - "simplesamlphp/simplesamlphp": "^2.5", "slevomat/coding-standard": "^8.25", "squizlabs/php_codesniffer": "^4.0", "symfony/phpunit-bridge": "^8.0", "twig/twig": "~3.23" }, + "require-dev": { + "simplesamlphp/simplesamlphp": "^2.5" + }, "type": "project", "autoload": { "psr-4": { @@ -7314,7 +7299,7 @@ "issues": "https://github.com/simplesamlphp/simplesamlphp-test-framework/issues", "source": "https://github.com/simplesamlphp/simplesamlphp-test-framework" }, - "time": "2026-03-20T20:07:58+00:00" + "time": "2026-04-10T08:17:57+00:00" }, { "name": "slevomat/coding-standard", @@ -7514,16 +7499,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v8.0.7", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "f95d88d54e34b13ee220a81133261a3c8a6a287a" + "reference": "723ea96810135e776110bddb25aeb32b462134c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/f95d88d54e34b13ee220a81133261a3c8a6a287a", - "reference": "f95d88d54e34b13ee220a81133261a3c8a6a287a", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/723ea96810135e776110bddb25aeb32b462134c8", + "reference": "723ea96810135e776110bddb25aeb32b462134c8", "shasum": "" }, "require": { @@ -7575,7 +7560,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.7" + "source": "https://github.com/symfony/phpunit-bridge/tree/v8.0.8" }, "funding": [ { @@ -7595,20 +7580,20 @@ "type": "tidelift" } ], - "time": "2026-03-04T13:55:34+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/polyfill-php84", - "version": "v1.33.0", + "version": "v1.35.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", + "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", "shasum": "" }, "require": { @@ -7655,7 +7640,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.35.0" }, "funding": [ { @@ -7675,20 +7660,20 @@ "type": "tidelift" } ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2026-04-10T18:47:49+00:00" }, { "name": "symfony/property-access", - "version": "v7.4.4", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "fa49bf1ca8fce1ba0e2dba4e4658554cfb9364b1" + "reference": "b7dad9dae8b8a47ef7ecc76c8569e7d8c7d90cfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/fa49bf1ca8fce1ba0e2dba4e4658554cfb9364b1", - "reference": "fa49bf1ca8fce1ba0e2dba4e4658554cfb9364b1", + "url": "https://api.github.com/repos/symfony/property-access/zipball/b7dad9dae8b8a47ef7ecc76c8569e7d8c7d90cfc", + "reference": "b7dad9dae8b8a47ef7ecc76c8569e7d8c7d90cfc", "shasum": "" }, "require": { @@ -7736,7 +7721,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.4.4" + "source": "https://github.com/symfony/property-access/tree/v7.4.8" }, "funding": [ { @@ -7756,20 +7741,20 @@ "type": "tidelift" } ], - "time": "2026-01-05T08:47:25+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/property-info", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "02501d75fd834345da3ecdd8e3200ced39e370f8" + "reference": "ac5e82528b986c4f7cfccbf7764b5d2e824d6175" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/02501d75fd834345da3ecdd8e3200ced39e370f8", - "reference": "02501d75fd834345da3ecdd8e3200ced39e370f8", + "url": "https://api.github.com/repos/symfony/property-info/zipball/ac5e82528b986c4f7cfccbf7764b5d2e824d6175", + "reference": "ac5e82528b986c4f7cfccbf7764b5d2e824d6175", "shasum": "" }, "require": { @@ -7826,7 +7811,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.4.7" + "source": "https://github.com/symfony/property-info/tree/v7.4.8" }, "funding": [ { @@ -7846,20 +7831,20 @@ "type": "tidelift" } ], - "time": "2026-03-04T15:53:26+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "symfony/serializer", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "bd395bbc6fabd136a48e1a6f91b09f88b5050b0b" + "reference": "006fd51717addf2df2bd1a64dafef6b7fab6b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/bd395bbc6fabd136a48e1a6f91b09f88b5050b0b", - "reference": "bd395bbc6fabd136a48e1a6f91b09f88b5050b0b", + "url": "https://api.github.com/repos/symfony/serializer/zipball/006fd51717addf2df2bd1a64dafef6b7fab6b455", + "reference": "006fd51717addf2df2bd1a64dafef6b7fab6b455", "shasum": "" }, "require": { @@ -7930,7 +7915,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.4.7" + "source": "https://github.com/symfony/serializer/tree/v7.4.8" }, "funding": [ { @@ -7950,20 +7935,20 @@ "type": "tidelift" } ], - "time": "2026-03-06T13:15:18+00:00" + "time": "2026-03-30T21:34:42+00:00" }, { "name": "symfony/type-info", - "version": "v7.4.7", + "version": "v7.4.8", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "31f1e40cbf7851c7354281c90eb1b352c4cb8269" + "reference": "6bf34da885ff5143a3dfd8f1b863bb8ab95f50bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/31f1e40cbf7851c7354281c90eb1b352c4cb8269", - "reference": "31f1e40cbf7851c7354281c90eb1b352c4cb8269", + "url": "https://api.github.com/repos/symfony/type-info/zipball/6bf34da885ff5143a3dfd8f1b863bb8ab95f50bd", + "reference": "6bf34da885ff5143a3dfd8f1b863bb8ab95f50bd", "shasum": "" }, "require": { @@ -8013,7 +7998,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.4.7" + "source": "https://github.com/symfony/type-info/tree/v7.4.8" }, "funding": [ { @@ -8033,7 +8018,7 @@ "type": "tidelift" } ], - "time": "2026-03-04T12:49:16+00:00" + "time": "2026-03-24T13:12:05+00:00" }, { "name": "theseer/tokenizer", From ad8d5eba08d168f4de6f3c86b3c9594833c6191d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 14:35:10 +0200 Subject: [PATCH 532/532] Bump phpunit/phpunit from 12.5.20 to 12.5.23 (#2631) Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 12.5.20 to 12.5.23. - [Release notes](https://github.com/sebastianbergmann/phpunit/releases) - [Changelog](https://github.com/sebastianbergmann/phpunit/blob/12.5.23/ChangeLog-12.5.md) - [Commits](https://github.com/sebastianbergmann/phpunit/compare/12.5.20...12.5.23) --- updated-dependencies: - dependency-name: phpunit/phpunit dependency-version: 12.5.23 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.lock b/composer.lock index 6993dc45eb..c65a42b8be 100644 --- a/composer.lock +++ b/composer.lock @@ -6195,16 +6195,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.20", + "version": "12.5.23", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c2364520611caa03567a8a020f2d59f3f90b115a" + "reference": "c54fcf3d6bcb6e96ac2f7e40097dc37b5f139969" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c2364520611caa03567a8a020f2d59f3f90b115a", - "reference": "c2364520611caa03567a8a020f2d59f3f90b115a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c54fcf3d6bcb6e96ac2f7e40097dc37b5f139969", + "reference": "c54fcf3d6bcb6e96ac2f7e40097dc37b5f139969", "shasum": "" }, "require": { @@ -6218,7 +6218,7 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.5.5", + "phpunit/php-code-coverage": "^12.5.6", "phpunit/php-file-iterator": "^6.0.1", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", @@ -6226,7 +6226,7 @@ "sebastian/cli-parser": "^4.2.0", "sebastian/comparator": "^7.1.6", "sebastian/diff": "^7.0.0", - "sebastian/environment": "^8.0.4", + "sebastian/environment": "^8.1.0", "sebastian/exporter": "^7.0.2", "sebastian/global-state": "^8.0.2", "sebastian/object-enumerator": "^7.0.0", @@ -6273,7 +6273,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.20" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.23" }, "funding": [ { @@ -6281,7 +6281,7 @@ "type": "other" } ], - "time": "2026-04-15T05:05:59+00:00" + "time": "2026-04-18T06:12:49+00:00" }, { "name": "predis/predis",
{% if translated != name %} {{ translated }}
{% endif %}{{ name }}
{% if translated != name %}{{ translated }}
{% endif %}{{ name }}