diff --git a/composer.lock b/composer.lock index 49f607c8ab938bb25311187cf7d9682bfd92beab..8cb9d327edc5891640e19808a8f8b4bbfe10a7a9 100644 --- a/composer.lock +++ b/composer.lock @@ -4146,16 +4146,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.20.3", + "version": "1.20.4", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "6c04009f6cae6eda2f040745b6b846080ef069c2" + "reference": "7d568c87a9df9c5f7e8b5f075fc469aa8cb0a4cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6c04009f6cae6eda2f040745b6b846080ef069c2", - "reference": "6c04009f6cae6eda2f040745b6b846080ef069c2", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/7d568c87a9df9c5f7e8b5f075fc469aa8cb0a4cd", + "reference": "7d568c87a9df9c5f7e8b5f075fc469aa8cb0a4cd", "shasum": "" }, "require": { @@ -4185,9 +4185,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.20.3" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.20.4" }, - "time": "2023-04-25T09:01:03+00:00" + "time": "2023-05-02T09:19:37+00:00" }, { "name": "phpunit/php-code-coverage", @@ -4970,23 +4970,23 @@ }, { "name": "react/promise", - "version": "v2.9.0", + "version": "v2.10.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -5030,19 +5030,15 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" + "source": "https://github.com/reactphp/promise/tree/v2.10.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-02-11T10:27:51+00:00" + "time": "2023-05-02T15:15:43+00:00" }, { "name": "robrichards/xmlseclibs", @@ -5386,16 +5382,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -5440,7 +5436,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -5448,7 +5444,7 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", @@ -6225,16 +6221,16 @@ }, { "name": "simplesamlphp/saml2", - "version": "v4.6.6", + "version": "v4.6.8", "source": { "type": "git", "url": "https://github.com/simplesamlphp/saml2.git", - "reference": "717c0adc4877ebd58428637e5626345e59fa0109" + "reference": "dea19260955a863f6a347e8479a2049d99b5cd18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/717c0adc4877ebd58428637e5626345e59fa0109", - "reference": "717c0adc4877ebd58428637e5626345e59fa0109", + "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/dea19260955a863f6a347e8479a2049d99b5cd18", + "reference": "dea19260955a863f6a347e8479a2049d99b5cd18", "shasum": "" }, "require": { @@ -6277,9 +6273,9 @@ "description": "SAML2 PHP library from SimpleSAMLphp", "support": { "issues": "https://github.com/simplesamlphp/saml2/issues", - "source": "https://github.com/simplesamlphp/saml2/tree/v4.6.6" + "source": "https://github.com/simplesamlphp/saml2/tree/v4.6.8" }, - "time": "2023-03-08T19:32:49+00:00" + "time": "2023-05-05T11:55:46+00:00" }, { "name": "simplesamlphp/simplesamlphp", @@ -6871,16 +6867,16 @@ }, { "name": "symfony/cache", - "version": "v5.4.22", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "5ed986c4ef65f0dea5e9753630b5cb1f07f847d6" + "reference": "983c79ff28612cdfd66d8e44e1a06e5afc87e107" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/5ed986c4ef65f0dea5e9753630b5cb1f07f847d6", - "reference": "5ed986c4ef65f0dea5e9753630b5cb1f07f847d6", + "url": "https://api.github.com/repos/symfony/cache/zipball/983c79ff28612cdfd66d8e44e1a06e5afc87e107", + "reference": "983c79ff28612cdfd66d8e44e1a06e5afc87e107", "shasum": "" }, "require": { @@ -6948,7 +6944,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.22" + "source": "https://github.com/symfony/cache/tree/v5.4.23" }, "funding": [ { @@ -6964,7 +6960,7 @@ "type": "tidelift" } ], - "time": "2023-03-29T20:01:08+00:00" + "time": "2023-04-21T15:38:51+00:00" }, { "name": "symfony/cache-contracts", @@ -7126,16 +7122,16 @@ }, { "name": "symfony/console", - "version": "v5.4.22", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8" + "reference": "90f21e27d0d88ce38720556dd164d4a1e4c3934c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3cd51fd2e6c461ca678f84d419461281bd87a0a8", - "reference": "3cd51fd2e6c461ca678f84d419461281bd87a0a8", + "url": "https://api.github.com/repos/symfony/console/zipball/90f21e27d0d88ce38720556dd164d4a1e4c3934c", + "reference": "90f21e27d0d88ce38720556dd164d4a1e4c3934c", "shasum": "" }, "require": { @@ -7205,7 +7201,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.22" + "source": "https://github.com/symfony/console/tree/v5.4.23" }, "funding": [ { @@ -7221,20 +7217,20 @@ "type": "tidelift" } ], - "time": "2023-03-25T09:27:28+00:00" + "time": "2023-04-24T18:47:29+00:00" }, { "name": "symfony/dependency-injection", - "version": "v5.4.22", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "e1b7c1432efb4ad1dd89d62906187271e2601ed9" + "reference": "bb7b7988c898c94f5338e16403c52b5a3cae1d93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e1b7c1432efb4ad1dd89d62906187271e2601ed9", - "reference": "e1b7c1432efb4ad1dd89d62906187271e2601ed9", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/bb7b7988c898c94f5338e16403c52b5a3cae1d93", + "reference": "bb7b7988c898c94f5338e16403c52b5a3cae1d93", "shasum": "" }, "require": { @@ -7294,7 +7290,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/v5.4.22" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.23" }, "funding": [ { @@ -7310,7 +7306,7 @@ "type": "tidelift" } ], - "time": "2023-03-10T10:02:45+00:00" + "time": "2023-04-21T15:04:16+00:00" }, { "name": "symfony/deprecation-contracts", @@ -7381,16 +7377,16 @@ }, { "name": "symfony/error-handler", - "version": "v5.4.21", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "56a94aa8cb5a5fbc411551d8d014a296b5456549" + "reference": "218206b4772d9f412d7d277980c020d06e9d8a4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/56a94aa8cb5a5fbc411551d8d014a296b5456549", - "reference": "56a94aa8cb5a5fbc411551d8d014a296b5456549", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/218206b4772d9f412d7d277980c020d06e9d8a4e", + "reference": "218206b4772d9f412d7d277980c020d06e9d8a4e", "shasum": "" }, "require": { @@ -7432,7 +7428,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/v5.4.21" + "source": "https://github.com/symfony/error-handler/tree/v5.4.23" }, "funding": [ { @@ -7448,7 +7444,7 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:03:56+00:00" + "time": "2023-04-17T10:03:27+00:00" }, { "name": "symfony/event-dispatcher", @@ -7616,16 +7612,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.21", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f" + "reference": "b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/e75960b1bbfd2b8c9e483e0d74811d555ca3de9f", - "reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5", + "reference": "b2f79d86cd9e7de0fff6d03baa80eaed7a5f38b5", "shasum": "" }, "require": { @@ -7660,7 +7656,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.21" + "source": "https://github.com/symfony/filesystem/tree/v5.4.23" }, "funding": [ { @@ -7676,7 +7672,7 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:03:56+00:00" + "time": "2023-03-02T11:38:35+00:00" }, { "name": "symfony/finder", @@ -7894,16 +7890,16 @@ }, { "name": "symfony/http-foundation", - "version": "v5.4.22", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "05cd1acdd0e3ce8473aaba1d86c188321d85f313" + "reference": "af9fbb378f5f956c8f29d4886644c84c193780ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/05cd1acdd0e3ce8473aaba1d86c188321d85f313", - "reference": "05cd1acdd0e3ce8473aaba1d86c188321d85f313", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/af9fbb378f5f956c8f29d4886644c84c193780ac", + "reference": "af9fbb378f5f956c8f29d4886644c84c193780ac", "shasum": "" }, "require": { @@ -7950,7 +7946,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.22" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.23" }, "funding": [ { @@ -7966,20 +7962,20 @@ "type": "tidelift" } ], - "time": "2023-03-28T07:28:17+00:00" + "time": "2023-04-18T06:30:11+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.22", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "2d3a8be2c756353627398827c409af6f126c096d" + "reference": "48ea17a7c65ef1ede0c3b2dbc35adace99071810" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2d3a8be2c756353627398827c409af6f126c096d", - "reference": "2d3a8be2c756353627398827c409af6f126c096d", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/48ea17a7c65ef1ede0c3b2dbc35adace99071810", + "reference": "48ea17a7c65ef1ede0c3b2dbc35adace99071810", "shasum": "" }, "require": { @@ -8062,7 +8058,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/v5.4.22" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.23" }, "funding": [ { @@ -8078,20 +8074,20 @@ "type": "tidelift" } ], - "time": "2023-03-31T11:54:37+00:00" + "time": "2023-04-28T13:29:52+00:00" }, { "name": "symfony/intl", - "version": "v5.4.22", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "8afe56b8472888d749ef8955acdc9d38578775d7" + "reference": "962789bbc76c82c266623321ffc24416f574b636" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/8afe56b8472888d749ef8955acdc9d38578775d7", - "reference": "8afe56b8472888d749ef8955acdc9d38578775d7", + "url": "https://api.github.com/repos/symfony/intl/zipball/962789bbc76c82c266623321ffc24416f574b636", + "reference": "962789bbc76c82c266623321ffc24416f574b636", "shasum": "" }, "require": { @@ -8150,7 +8146,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v5.4.22" + "source": "https://github.com/symfony/intl/tree/v5.4.23" }, "funding": [ { @@ -8166,7 +8162,7 @@ "type": "tidelift" } ], - "time": "2023-03-10T09:58:14+00:00" + "time": "2023-04-13T10:36:25+00:00" }, { "name": "symfony/polyfill-ctype", @@ -8741,16 +8737,16 @@ }, { "name": "symfony/process", - "version": "v5.4.22", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "4b850da0cc3a2a9181c1ed407adbca4733dc839b" + "reference": "4b842fc4b61609e0a155a114082bd94e31e98287" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/4b850da0cc3a2a9181c1ed407adbca4733dc839b", - "reference": "4b850da0cc3a2a9181c1ed407adbca4733dc839b", + "url": "https://api.github.com/repos/symfony/process/zipball/4b842fc4b61609e0a155a114082bd94e31e98287", + "reference": "4b842fc4b61609e0a155a114082bd94e31e98287", "shasum": "" }, "require": { @@ -8783,7 +8779,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.22" + "source": "https://github.com/symfony/process/tree/v5.4.23" }, "funding": [ { @@ -8799,7 +8795,7 @@ "type": "tidelift" } ], - "time": "2023-03-06T21:29:33+00:00" + "time": "2023-04-18T13:50:24+00:00" }, { "name": "symfony/routing", @@ -9261,16 +9257,16 @@ }, { "name": "symfony/var-dumper", - "version": "v5.4.22", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "e2edac9ce47e6df07e38143c7cfa6bdbc1a6dcc4" + "reference": "9a8a5b6d6508928174ded2109e29328a55342a42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e2edac9ce47e6df07e38143c7cfa6bdbc1a6dcc4", - "reference": "e2edac9ce47e6df07e38143c7cfa6bdbc1a6dcc4", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9a8a5b6d6508928174ded2109e29328a55342a42", + "reference": "9a8a5b6d6508928174ded2109e29328a55342a42", "shasum": "" }, "require": { @@ -9330,7 +9326,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.22" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.23" }, "funding": [ { @@ -9346,7 +9342,7 @@ "type": "tidelift" } ], - "time": "2023-03-25T09:27:28+00:00" + "time": "2023-04-18T09:26:27+00:00" }, { "name": "symfony/var-exporter", @@ -9423,16 +9419,16 @@ }, { "name": "symfony/yaml", - "version": "v5.4.21", + "version": "v5.4.23", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "3713e20d93e46e681e51605d213027e48dab3469" + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/3713e20d93e46e681e51605d213027e48dab3469", - "reference": "3713e20d93e46e681e51605d213027e48dab3469", + "url": "https://api.github.com/repos/symfony/yaml/zipball/4cd2e3ea301aadd76a4172756296fe552fb45b0b", + "reference": "4cd2e3ea301aadd76a4172756296fe552fb45b0b", "shasum": "" }, "require": { @@ -9478,7 +9474,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.21" + "source": "https://github.com/symfony/yaml/tree/v5.4.23" }, "funding": [ { @@ -9494,7 +9490,7 @@ "type": "tidelift" } ], - "time": "2023-02-21T19:46:44+00:00" + "time": "2023-04-23T19:33:36+00:00" }, { "name": "thecodingmachine/safe", @@ -9687,16 +9683,16 @@ }, { "name": "twig/intl-extra", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/twigphp/intl-extra.git", - "reference": "c3ebfac1624228c0556de57a34af6b7d83a1a408" + "reference": "a97c323bebfca009d02994a5a8568c0b412a49ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/c3ebfac1624228c0556de57a34af6b7d83a1a408", - "reference": "c3ebfac1624228c0556de57a34af6b7d83a1a408", + "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/a97c323bebfca009d02994a5a8568c0b412a49ab", + "reference": "a97c323bebfca009d02994a5a8568c0b412a49ab", "shasum": "" }, "require": { @@ -9708,11 +9704,6 @@ "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.5-dev" - } - }, "autoload": { "psr-4": { "Twig\\Extra\\Intl\\": "" @@ -9740,7 +9731,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/intl-extra/tree/v3.5.1" + "source": "https://github.com/twigphp/intl-extra/tree/v3.6.0" }, "funding": [ { @@ -9752,20 +9743,20 @@ "type": "tidelift" } ], - "time": "2023-02-08T07:44:55+00:00" + "time": "2023-02-09T06:45:16+00:00" }, { "name": "twig/twig", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "a6e0510cc793912b451fd40ab983a1d28f611c15" + "reference": "106c170d08e8415d78be2d16c3d057d0d108262b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/a6e0510cc793912b451fd40ab983a1d28f611c15", - "reference": "a6e0510cc793912b451fd40ab983a1d28f611c15", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/106c170d08e8415d78be2d16c3d057d0d108262b", + "reference": "106c170d08e8415d78be2d16c3d057d0d108262b", "shasum": "" }, "require": { @@ -9774,15 +9765,10 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "psr/container": "^1.0", + "psr/container": "^1.0|^2.0", "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.5-dev" - } - }, "autoload": { "psr-4": { "Twig\\": "src/" @@ -9816,7 +9802,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.5.1" + "source": "https://github.com/twigphp/Twig/tree/v3.6.0" }, "funding": [ { @@ -9828,20 +9814,20 @@ "type": "tidelift" } ], - "time": "2023-02-08T07:49:20+00:00" + "time": "2023-05-03T19:06:57+00:00" }, { "name": "vimeo/psalm", - "version": "5.9.0", + "version": "5.11.0", "source": { "type": "git", "url": "https://github.com/vimeo/psalm.git", - "reference": "8b9ad1eb9e8b7d3101f949291da2b9f7767cd163" + "reference": "c9b192ab8400fdaf04b2b13d110575adc879aa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vimeo/psalm/zipball/8b9ad1eb9e8b7d3101f949291da2b9f7767cd163", - "reference": "8b9ad1eb9e8b7d3101f949291da2b9f7767cd163", + "url": "https://api.github.com/repos/vimeo/psalm/zipball/c9b192ab8400fdaf04b2b13d110575adc879aa90", + "reference": "c9b192ab8400fdaf04b2b13d110575adc879aa90", "shasum": "" }, "require": { @@ -9932,9 +9918,9 @@ ], "support": { "issues": "https://github.com/vimeo/psalm/issues", - "source": "https://github.com/vimeo/psalm/tree/5.9.0" + "source": "https://github.com/vimeo/psalm/tree/5.11.0" }, - "time": "2023-03-29T21:38:21+00:00" + "time": "2023-05-04T21:35:44+00:00" }, { "name": "web-token/jwt-framework", diff --git a/routing/routes/routes.yml b/routing/routes/routes.yml index dcd41bc49956a6cac60dee067200cdddf49aab1e..516aec8520b9af1a987848882fb5b0cecc2aefb4 100644 --- a/routing/routes/routes.yml +++ b/routing/routes/routes.yml @@ -22,7 +22,11 @@ accounting-user-oidc-token-revoke-xhr: accounting-user-logout: path: /user/logout - controller: SimpleSAML\Module\accounting\Http\Controllers\User\Profile::logout + controller: SimpleSAML\Module\accounting\Http\Controllers\Logout::logout methods: - GET - POST + +accounting-logout: + path: /logged-out + controller: SimpleSAML\Module\accounting\Http\Controllers\Logout::loggedOut \ No newline at end of file diff --git a/src/Helpers/Routes.php b/src/Helpers/Routes.php index 70bec363a3194f6b492368b26ca072173fb9b124..fdd6632927097e1dd0e099b2cdb6ddb41f996341 100644 --- a/src/Helpers/Routes.php +++ b/src/Helpers/Routes.php @@ -16,6 +16,7 @@ class Routes public const PATH_USER_PERSONAL_DATA = 'user/personal-data'; public const PATH_USER_OIDC_TOKENS = 'user/oidc-tokens'; public const QUERY_REDIRECT_TO_PATH = 'redirectTo'; + public const PATH_LOGGED_OUT = 'logged-out'; protected HTTP $sspHttpUtils; protected Arr $arr; diff --git a/src/Http/Controllers/Logout.php b/src/Http/Controllers/Logout.php new file mode 100644 index 0000000000000000000000000000000000000000..2866d8a1d1dd271b48220a0b6d0cdcf8ec6c455b --- /dev/null +++ b/src/Http/Controllers/Logout.php @@ -0,0 +1,88 @@ +<?php + +declare(strict_types=1); + +namespace SimpleSAML\Module\accounting\Http\Controllers; + +use Psr\Log\LoggerInterface; +use SimpleSAML\Auth\Simple; +use SimpleSAML\Configuration as SspConfiguration; +use SimpleSAML\Error\ConfigurationError; +use SimpleSAML\Error\CriticalConfigurationError; +use SimpleSAML\HTTP\RunnableResponse; +use SimpleSAML\Locale\Translate; +use SimpleSAML\Metadata\MetaDataStorageHandler; +use SimpleSAML\Module\accounting\Data\Providers\Builders\DataProviderBuilder; +use SimpleSAML\Module\accounting\Data\Providers\Interfaces\ActivityInterface; +use SimpleSAML\Module\accounting\Data\Providers\Interfaces\DataProviderInterface; +use SimpleSAML\Module\accounting\Entities\Authentication\Protocol\Oidc; +use SimpleSAML\Module\accounting\Entities\ConnectedService; +use SimpleSAML\Module\accounting\Entities\User; +use SimpleSAML\Module\accounting\Exceptions\Exception; +use SimpleSAML\Module\accounting\Exceptions\InvalidConfigurationException; +use SimpleSAML\Module\accounting\Helpers\Attributes; +use SimpleSAML\Module\accounting\Helpers\ProviderResolver; +use SimpleSAML\Module\accounting\Helpers\Routes; +use SimpleSAML\Module\accounting\ModuleConfiguration; +use SimpleSAML\Module\accounting\ModuleConfiguration\ConnectionType; +use SimpleSAML\Module\accounting\Services\AlertsBag; +use SimpleSAML\Module\accounting\Services\CsrfToken; +use SimpleSAML\Module\accounting\Services\HelpersManager; +use SimpleSAML\Module\accounting\Services\MenuManager; +use SimpleSAML\Module\accounting\Services\SspModuleManager; +use SimpleSAML\Module\oidc\Services\OidcOpenIdProviderMetadataService; +use SimpleSAML\Session; +use SimpleSAML\Utils\Config\Metadata; +use SimpleSAML\XHTML\Template; +use Symfony\Component\HttpFoundation\Cookie; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\RedirectResponse; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; + +/** + * @psalm-suppress UnusedClass Used as route controller. + */ +class Logout +{ + protected string $defaultAuthenticationSource; + protected Simple $authSimple; + protected HelpersManager $helpersManager; + protected SspConfiguration $sspConfiguration; + + /** + * @param ModuleConfiguration $moduleConfiguration + * @param SspConfiguration $sspConfiguration + * @param Session $session + * @param Simple|null $authSimple + * @param HelpersManager|null $helpersManager + */ + public function __construct( + ModuleConfiguration $moduleConfiguration, + SspConfiguration $sspConfiguration, + Session $session, + Simple $authSimple = null, + HelpersManager $helpersManager = null + ) { + $this->defaultAuthenticationSource = $moduleConfiguration->getDefaultAuthenticationSource(); + $this->sspConfiguration = $sspConfiguration; + $this->authSimple = $authSimple ?? new Simple($this->defaultAuthenticationSource, $sspConfiguration, $session); + + $this->helpersManager = $helpersManager ?? new HelpersManager(); + } + + public function logout(): Response + { + return new RunnableResponse([$this->authSimple, 'logout'], [$this->getLoggedOutUrl()]); + } + + public function loggedOut(): Response + { + return new Template($this->sspConfiguration, 'accounting:logged-out.twig'); + } + + protected function getLoggedOutUrl(): string + { + return $this->helpersManager->getRoutes()->getUrl(Routes::PATH_LOGGED_OUT); + } +} diff --git a/src/Http/Controllers/User/Profile.php b/src/Http/Controllers/User/Profile.php index 09dd023332d1f9c6fba630d2cab536886382e82c..c4b029ec9001838695b03699af090080f35e6648 100644 --- a/src/Http/Controllers/User/Profile.php +++ b/src/Http/Controllers/User/Profile.php @@ -288,21 +288,6 @@ class Profile return $userIdentifier; } - public function logout(): Response - { - return new RunnableResponse([$this->authSimple, 'logout'], [$this->getLogoutUrl()]); - } - - protected function getLogoutUrl(): string - { - try { - return $this->sspConfiguration->getBasePath() . 'logout.php'; - } catch (CriticalConfigurationError $exception) { - $message = \sprintf('Could not resolve SimpleSAMLphp base path. Error was: %s', $exception->getMessage()); - throw new InvalidConfigurationException($message, $exception->getCode(), $exception); - } - } - /** * Load all attribute map files which translate attribute names to user-friendly name format. */ diff --git a/templates/logged-out.twig b/templates/logged-out.twig new file mode 100644 index 0000000000000000000000000000000000000000..5674c87849f01d96e3d37dab54bfdc67cfeaf992 --- /dev/null +++ b/templates/logged-out.twig @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html lang="{{ currentLanguage }}"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> +{# <meta name="viewport" content="initial-scale=1.0">#} +{# <meta http-equiv="X-UA-Compatible" content="IE=Edge">#} + <title>{{ pagetitle }}</title> + <link rel="stylesheet" href="{{ asset('css/src/default.css', 'accounting') }}"> + <link rel="icon" href="{{ asset("icons/favicon.ico") }}"> + <meta name="robots" content="noindex, nofollow"> +</head> +<body id="{{ templateId }}"> + +{% include '@accounting/includes/_header.twig' %} + +<section id="main"> + <h1>{{ 'Logout successful'|trans }}</h1> + + <p><a href="./user/personal-data">{{ 'Go back to Profile Page'|trans }}</a></p> +</section> + +</body> +</html> \ No newline at end of file diff --git a/tests/src/Data/Providers/Activity/DoctrineDbal/VersionedDataProviderTest.php b/tests/src/Data/Providers/Activity/DoctrineDbal/VersionedDataProviderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d505423f99cb424025b1638e4e3d1a4b87d46f69 --- /dev/null +++ b/tests/src/Data/Providers/Activity/DoctrineDbal/VersionedDataProviderTest.php @@ -0,0 +1,125 @@ +<?php + +declare(strict_types=1); + +namespace SimpleSAML\Test\Module\accounting\Data\Providers\Activity\DoctrineDbal; + +use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; +use SimpleSAML\Module\accounting\Data\Providers\Activity\DoctrineDbal\VersionedDataProvider; +use PHPUnit\Framework\TestCase; +use SimpleSAML\Module\accounting\Data\Stores\Accounting\Activity\DoctrineDbal\Versioned\Store; +use SimpleSAML\Module\accounting\Data\Trackers\Interfaces\DataTrackerInterface; +use SimpleSAML\Module\accounting\ModuleConfiguration; +use SimpleSAML\Test\Module\accounting\Constants\ConnectionParameters; + +/** + * @covers \SimpleSAML\Module\accounting\Data\Providers\Activity\DoctrineDbal\VersionedDataProvider + * @uses \SimpleSAML\Module\accounting\Data\Stores\Connections\DoctrineDbal\Migrator + * @uses \SimpleSAML\Module\accounting\Data\Stores\Connections\DoctrineDbal\Factory + * @uses \SimpleSAML\Module\accounting\Data\Stores\Connections\DoctrineDbal\Connection + * @uses \SimpleSAML\Module\accounting\Data\Stores\Connections\Bases\AbstractMigrator + * @uses \SimpleSAML\Module\accounting\Data\Stores\Bases\DoctrineDbal\AbstractStore + * @uses \SimpleSAML\Module\accounting\Data\Stores\Bases\AbstractStore + * @uses \SimpleSAML\Module\accounting\Data\Stores\Accounting\Activity\DoctrineDbal\Versioned\Store\Repository + * @uses \SimpleSAML\Module\accounting\Data\Stores\Accounting\Activity\DoctrineDbal\Versioned\Store + * @uses \SimpleSAML\Module\accounting\Data\Stores\Accounting\Bases\DoctrineDbal\Versioned\Store\Repository + * @uses \SimpleSAML\Module\accounting\Data\Stores\Accounting\Bases\DoctrineDbal\Versioned\Store + */ +class VersionedDataProviderTest extends TestCase +{ + /** + * @var MockObject + */ + protected $moduleConfigurationMock; + /** + * @var MockObject + */ + protected $loggerMock; + /** + * @var MockObject + */ + protected $storeMock; + + protected function setUp(): void + { + $this->moduleConfigurationMock = $this->createMock(ModuleConfiguration::class); + $this->loggerMock = $this->createMock(LoggerInterface::class); + $this->storeMock = $this->createMock(Store::class); + } + + protected function prepareMockedInstance(): VersionedDataProvider + { + return new VersionedDataProvider( + $this->moduleConfigurationMock, + $this->loggerMock, + ModuleConfiguration\ConnectionType::SLAVE, + $this->storeMock + ); + } + + public function testCanCreateInstance(): void + { + $this->assertInstanceOf(VersionedDataProvider::class, $this->prepareMockedInstance()); + + $connectionParams = ConnectionParameters::DBAL_SQLITE_MEMORY; + $this->moduleConfigurationMock->method('getConnectionParameters') + ->willReturn($connectionParams); + + $this->assertInstanceOf(VersionedDataProvider::class, VersionedDataProvider::build( + $this->moduleConfigurationMock, + $this->loggerMock, + )); + } + + public function testNeedsSetup(): void + { + $this->storeMock->method('needsSetup')->willReturn(true); + $this->assertTrue($this->prepareMockedInstance()->needsSetup()); + } + + public function testDoesNotNeedsSetup(): void + { + $this->storeMock->method('needsSetup')->willReturn(false); + $this->assertFalse($this->prepareMockedInstance()->needsSetup()); + } + + public function testSetupDoesNotRunWhenNotNeeded(): void + { + $this->storeMock->method('needsSetup')->willReturn(false); + $this->loggerMock->expects($this->once()) + ->method('warning'); + $this->storeMock->expects($this->never()) + ->method('runSetup'); + + $this->prepareMockedInstance()->runSetup(); + } + + public function testSetupRunsWhenNeeded(): void + { + $this->storeMock->method('needsSetup')->willReturn(true); + $this->storeMock->expects($this->once())->method('runSetup'); + $this->prepareMockedInstance()->runSetup(); + } + + public function testGetsActivityFromStore(): void + { + $this->storeMock->expects($this->once()) + ->method('getActivity') + ->with('1', 2, 3); + + $this->prepareMockedInstance()->getActivity('1', 2, 3); + } + + public function testCanGetTracker(): void + { + $connectionParams = ConnectionParameters::DBAL_SQLITE_MEMORY; + $this->moduleConfigurationMock->method('getConnectionParameters') + ->willReturn($connectionParams); + + $this->assertInstanceOf( + DataTrackerInterface::class, + $this->prepareMockedInstance()->getTracker() + ); + } +}