Compare commits

...

48 Commits

Author SHA1 Message Date
Matthieu Lamalle 075be9b0df Merge pull request 'recherche login lower dans requête de connexion' (#48) from issue-47 into develop
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Reviewed-on: #48
2024-11-06 11:13:10 +01:00
Rudy Masson 4e4c5d8e7b recherche login lower dans requête de connexion
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit Details
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
2024-11-06 10:22:48 +01:00
Matthieu Lamalle 7032787d8c Merge pull request 'fix login sql : ajout d'un retry sur le login, suppression des options' (#45) from retour-43 into develop
Cadoles/hydra-sql/pipeline/head This commit was not built Details
Reviewed-on: #45
2024-10-14 10:40:12 +02:00
Rudy Masson 999e708ff7 modification gestion des exceptions
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit Details
2024-10-11 15:09:52 +02:00
Rudy Masson cb8361e7d1 optimisation appel pdo, retry consent
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit Details
2024-10-11 13:25:21 +02:00
Rudy Masson e3f406a8bb fix resultat null vaut login inconnu
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit Details
2024-10-10 16:32:46 +02:00
Rudy Masson d6d9e81df6 fix login sql : ajout d'un retry sur le login, suppression des options
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit Details
2024-10-10 12:01:15 +02:00
Matthieu Lamalle 8e56433216 Merge pull request 'feat: ajout du packet xdebug à l'image' (#42) from xdebug into develop
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Reviewed-on: #42
2024-10-10 10:26:21 +02:00
Matthieu Lamalle 19178bbe3b fix typo
Cadoles/hydra-sql/pipeline/pr-develop Build started... Details
2024-10-10 10:25:34 +02:00
Matthieu Lamalle 14668150cb Merge pull request 'modification requete de fetch à la bdd #43' (#44) from issue-43 into develop
Cadoles/hydra-sql/pipeline/head This commit was not built Details
Reviewed-on: #44
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2024-10-10 10:01:29 +02:00
Rudy Masson 0903151f27 chore (authenticator) #43 : fix isset variable
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit Details
2024-10-09 11:57:10 +02:00
Rudy Masson f378751f7a chore (maj) #43 : ajout package debug, révision docker-compose pour environnement standalone
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit Details
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
2024-10-08 14:38:19 +02:00
Rudy Masson d707a91694 chore (login) #43 : remaniement connexion sql, passage à 1 requête au lieu de 2 pour performances 2024-10-08 14:36:12 +02:00
Valentin Carroy f39ab1626e feat: ajout du packet xdebug à l'image
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit Details
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
2024-10-07 11:22:17 +02:00
Matthieu Lamalle fe4d683c20 Merge pull request 'fix code quality, typage, php-csfixer' (#41) from fix-code-quality into develop
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Reviewed-on: #41
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2024-09-24 13:00:50 +02:00
Rudy Masson f36a675d22 fix code quality, typage, php-csfixer
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit Details
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
2024-09-24 11:47:52 +02:00
Matthieu Lamalle 27f957124b Merge pull request 'chore (fetch datas) #39 : fermeture connexion sql après login$' (#40) from issue-39 into develop
Cadoles/hydra-sql/pipeline/head This commit was not built Details
Reviewed-on: #40
2024-09-24 10:37:15 +02:00
Rudy Masson a1049a55a2 issue-39 : close cursor pour requête password
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit Details
2024-09-24 10:32:05 +02:00
Rudy Masson 085533b299 chore (fetch datas) #39 : fermeture connexion sql après login$
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit Details
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
2024-09-23 17:02:01 +02:00
Matthieu Lamalle 5bfd8991ee update symfony-container ref
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
2024-07-25 10:26:33 +02:00
Matthieu Lamalle 18c0edbe5b Merge pull request 'feat : Ajout expression de réecriture du subject paramétrable' (#38) from rewrite_sub_expression into develop
Cadoles/hydra-sql/pipeline/head This commit was not built Details
Reviewed-on: #38
2024-07-25 10:25:10 +02:00
Valentin Carroy fa77278c55 Fix : retrait de l'expression dans la config d'exemple
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable Details
2024-07-25 09:48:20 +02:00
Valentin Carroy daa5eaaa63 feat : Ajout expression de réecriture du subject paramétrable
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable Details
2024-07-24 16:41:22 +02:00
Matthieu Lamalle 769e7ed59e Merge pull request 'fix: vérification du mdp en cas de mdp non défini' (#37) from issue-mse-3699 into develop
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Reviewed-on: #37
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2024-06-06 13:43:13 +02:00
Valentin Carroy abe212c7ad fix: vérification du mdp en cas de mdp non défini
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable Details
2024-06-06 10:36:21 +02:00
Matthieu Lamalle 890c44da0c Merge pull request 'chore (multi lanque) #35: correction twig yaml pour langues acceptées' (#36) from issue-35 into develop
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Reviewed-on: #36
2024-05-21 10:50:19 +02:00
Rudy Masson 4465d0097e chore (multi lanque) #35: correction twig yaml pour langues acceptées
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable Details
2024-05-17 11:32:51 +02:00
Matthieu Lamalle f9d7e94420 fix: update symfony-containers ref
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
2024-04-29 14:16:47 +02:00
Matthieu Lamalle e03312be7d update symofny-containers
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
2024-04-29 11:47:26 +02:00
Matthieu Lamalle 69f0a607a3 Merge pull request 'complément logs et exceptions' (#20) from issue-19 into develop
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Reviewed-on: #20
2024-04-29 11:33:16 +02:00
Rudy Masson 51c92a0dba feat (gestion exception) #19: modification fetchPassword
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable Details
2024-04-29 11:09:58 +02:00
Rudy Masson 0791727694 feat (gestion exceptions) #19: traitement retour: typage, un seul message pour erreur login ou mdp
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable Details
2024-04-29 10:44:38 +02:00
Rudy Masson 3e45119684 issue-19: séparation des exceptions pour éviter les erreurs génériques, message personalisé par type d'erreur 2024-04-29 10:08:41 +02:00
Rudy Masson 5aacd981b4 issue-19: ajout de logs des exceptions PDOExceptions 2024-04-29 10:07:44 +02:00
Matthieu Lamalle fc4cecf106 Merge pull request 'Mise à jour des traductions' (#34) from issue-33 into develop
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Reviewed-on: #34
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2024-04-25 11:27:23 +02:00
Matthieu Lamalle d26920695f Merge pull request 'Vérification challenge dans la session #31' (#32) from issue-31 into develop
Cadoles/hydra-sql/pipeline/head Something is wrong with the build of this commit Details
Reviewed-on: #32
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2024-04-25 11:27:00 +02:00
Valentin Carroy fc348943c8 feat (compose): maj des volumes de docker-compose
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable Details
2024-04-23 12:06:51 +02:00
Valentin Carroy afd5349a7c chore (translations) : Suppression des fichiers traduction yaml 2024-04-23 12:06:06 +02:00
Valentin Carroy 562c7cb7b7 fix (translations): Ajout des traductions manquantes 2024-04-23 12:05:40 +02:00
Rudy Masson bcc91a17b4 fix (oidc timeout) #31: ajout d'une règle de redirection en cas de donnée de session perdue
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable Details
2024-04-18 17:13:42 +02:00
Rudy Masson cd888d2080 chore (images) #31: maj droits et env 2024-04-18 17:12:28 +02:00
Rudy Masson 0cdb4c3a36 chore (composer update) #31: maj composer update 2024-04-18 17:11:23 +02:00
cmsassot fc87b24c4e Merge pull request 'chore(caddy): passage à caddy' (#30) from cmsassot-caddy into develop
Cadoles/hydra-sql/pipeline/head This commit looks good Details
Reviewed-on: #30
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2024-04-02 09:53:55 +02:00
cmsassot d1847289bd feat(Dockefile): modification ref tag
Cadoles/hydra-sql/pipeline/pr-develop This commit looks good Details
2024-03-29 11:20:28 +01:00
cmsassot d5718e0a39 feat(node): updated depencies
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable Details
2024-03-29 09:44:38 +01:00
cmsassot 8cde31fc9c chore(caddy): passage à caddy
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable Details
2024-03-28 11:13:41 +01:00
Matthieu Lamalle 9420354ec0 Merge pull request 'ajout url_link pour personnalisation theme' (#29) from url_link into develop
Cadoles/hydra-sql/pipeline/head This commit is unstable Details
Reviewed-on: #29
2024-01-16 11:46:33 +01:00
Matthieu Lamalle e320d288cc ajout url_link pour personnalisation theme
Cadoles/hydra-sql/pipeline/head Build started... Details
Cadoles/hydra-sql/pipeline/pr-develop Build started... Details
2024-01-16 11:45:59 +01:00
48 changed files with 4208 additions and 6285 deletions

2
.env
View File

@ -16,7 +16,7 @@
###> symfony/framework-bundle ### ###> symfony/framework-bundle ###
APP_ENV=dev APP_ENV=dev
APP_SECRET=406ccaa0c76a451fdcc2307ea146cbef APP_SECRET=406ccaa0c76a451fdcc2307ea146cbef
###< symfony/framework-bundle ### URL_LINK="http://localhost"
# configuration bdd # configuration bdd
DSN_REMOTE_DATABASE="pgsql:host='postgres';port=5432;dbname=lasql" DSN_REMOTE_DATABASE="pgsql:host='postgres';port=5432;dbname=lasql"

17
.gitignore vendored
View File

@ -21,3 +21,20 @@ composer.phar
/tools /tools
/.trivy /.trivy
.mktools/ .mktools/
###> symfony/framework-bundle ###
/.env.local
/.env.local.php
/.env.*.local
/config/secrets/prod/prod.decrypt.private.php
/public/bundles/
/var/
/vendor/
###< symfony/framework-bundle ###
###> symfony/webpack-encore-bundle ###
/node_modules/
/public/build/
npm-debug.log
yarn-error.log
###< symfony/webpack-encore-bundle ###

1
.nvmrc Normal file
View File

@ -0,0 +1 @@
lts/iron

View File

@ -15,6 +15,7 @@
"symfony/console": "5.4.*", "symfony/console": "5.4.*",
"symfony/dependency-injection": "5.4.*", "symfony/dependency-injection": "5.4.*",
"symfony/dotenv": "5.4.*", "symfony/dotenv": "5.4.*",
"symfony/expression-language": "5.4.*",
"symfony/flex": "^1.17|^2", "symfony/flex": "^1.17|^2",
"symfony/form": "5.4.*", "symfony/form": "5.4.*",
"symfony/framework-bundle": "5.4.*", "symfony/framework-bundle": "5.4.*",
@ -77,5 +78,8 @@
"allow-contrib": true, "allow-contrib": true,
"require": "5.4.*" "require": "5.4.*"
} }
},
"require-dev": {
"symfony/debug-bundle": "5.4.*"
} }
} }

1079
composer.lock generated
View File

@ -4,27 +4,27 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "7dce269ca449b7de7e1bd2e23df94eab", "content-hash": "203398b3a4f3ff689ff3341c02460f23",
"packages": [ "packages": [
{ {
"name": "clue/stream-filter", "name": "clue/stream-filter",
"version": "v1.6.0", "version": "v1.7.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/clue/stream-filter.git", "url": "https://github.com/clue/stream-filter.git",
"reference": "d6169430c7731d8509da7aecd0af756a5747b78e" "reference": "049509fef80032cb3f051595029ab75b49a3c2f7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7",
"reference": "d6169430c7731d8509da7aecd0af756a5747b78e", "reference": "049509fef80032cb3f051595029ab75b49a3c2f7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.3" "php": ">=5.3"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -46,7 +46,7 @@
} }
], ],
"description": "A simple and modern approach to stream filtering in PHP", "description": "A simple and modern approach to stream filtering in PHP",
"homepage": "https://github.com/clue/php-stream-filter", "homepage": "https://github.com/clue/stream-filter",
"keywords": [ "keywords": [
"bucket brigade", "bucket brigade",
"callback", "callback",
@ -58,7 +58,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/clue/stream-filter/issues", "issues": "https://github.com/clue/stream-filter/issues",
"source": "https://github.com/clue/stream-filter/tree/v1.6.0" "source": "https://github.com/clue/stream-filter/tree/v1.7.0"
}, },
"funding": [ "funding": [
{ {
@ -70,20 +70,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-02-21T13:15:14+00:00" "time": "2023-12-20T15:40:13+00:00"
}, },
{ {
"name": "doctrine/annotations", "name": "doctrine/annotations",
"version": "1.14.3", "version": "1.14.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/annotations.git", "url": "https://github.com/doctrine/annotations.git",
"reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af" "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", "url": "https://api.github.com/repos/doctrine/annotations/zipball/253dca476f70808a5aeed3a47cc2cc88c5cab915",
"reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af", "reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -94,11 +94,11 @@
}, },
"require-dev": { "require-dev": {
"doctrine/cache": "^1.11 || ^2.0", "doctrine/cache": "^1.11 || ^2.0",
"doctrine/coding-standard": "^9 || ^10", "doctrine/coding-standard": "^9 || ^12",
"phpstan/phpstan": "~1.4.10 || ^1.8.0", "phpstan/phpstan": "~1.4.10 || ^1.10.28",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"symfony/cache": "^4.4 || ^5.4 || ^6", "symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7",
"vimeo/psalm": "^4.10" "vimeo/psalm": "^4.30 || ^5.14"
}, },
"suggest": { "suggest": {
"php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
@ -144,22 +144,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/annotations/issues", "issues": "https://github.com/doctrine/annotations/issues",
"source": "https://github.com/doctrine/annotations/tree/1.14.3" "source": "https://github.com/doctrine/annotations/tree/1.14.4"
}, },
"time": "2023-02-01T09:20:38+00:00" "time": "2024-09-05T10:15:52+00:00"
}, },
{ {
"name": "doctrine/deprecations", "name": "doctrine/deprecations",
"version": "1.1.2", "version": "1.1.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/deprecations.git", "url": "https://github.com/doctrine/deprecations.git",
"reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab",
"reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -191,22 +191,22 @@
"homepage": "https://www.doctrine-project.org/", "homepage": "https://www.doctrine-project.org/",
"support": { "support": {
"issues": "https://github.com/doctrine/deprecations/issues", "issues": "https://github.com/doctrine/deprecations/issues",
"source": "https://github.com/doctrine/deprecations/tree/1.1.2" "source": "https://github.com/doctrine/deprecations/tree/1.1.3"
}, },
"time": "2023-09-27T20:04:15+00:00" "time": "2024-01-30T19:34:25+00:00"
}, },
{ {
"name": "doctrine/lexer", "name": "doctrine/lexer",
"version": "2.1.0", "version": "2.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/lexer.git", "url": "https://github.com/doctrine/lexer.git",
"reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124" "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", "url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6",
"reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124", "reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -214,11 +214,11 @@
"php": "^7.1 || ^8.0" "php": "^7.1 || ^8.0"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^9 || ^10", "doctrine/coding-standard": "^9 || ^12",
"phpstan/phpstan": "^1.3", "phpstan/phpstan": "^1.3",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6",
"psalm/plugin-phpunit": "^0.18.3", "psalm/plugin-phpunit": "^0.18.3",
"vimeo/psalm": "^4.11 || ^5.0" "vimeo/psalm": "^4.11 || ^5.21"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -255,7 +255,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/doctrine/lexer/issues", "issues": "https://github.com/doctrine/lexer/issues",
"source": "https://github.com/doctrine/lexer/tree/2.1.0" "source": "https://github.com/doctrine/lexer/tree/2.1.1"
}, },
"funding": [ "funding": [
{ {
@ -271,20 +271,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-12-14T08:49:07+00:00" "time": "2024-02-05T11:35:39+00:00"
}, },
{ {
"name": "guzzlehttp/promises", "name": "guzzlehttp/promises",
"version": "2.0.2", "version": "2.0.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/promises.git", "url": "https://github.com/guzzle/promises.git",
"reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
"reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -292,7 +292,7 @@
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2", "bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.36 || ^9.6.15" "phpunit/phpunit": "^8.5.39 || ^9.6.20"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -338,7 +338,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/promises/issues", "issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/2.0.2" "source": "https://github.com/guzzle/promises/tree/2.0.3"
}, },
"funding": [ "funding": [
{ {
@ -354,20 +354,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-12-03T20:19:20+00:00" "time": "2024-07-18T10:29:17+00:00"
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
"version": "2.6.2", "version": "2.7.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/psr7.git", "url": "https://github.com/guzzle/psr7.git",
"reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
"reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -382,8 +382,8 @@
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2", "bamarni/composer-bin-plugin": "^1.8.2",
"http-interop/http-factory-tests": "^0.9", "http-interop/http-factory-tests": "0.9.0",
"phpunit/phpunit": "^8.5.36 || ^9.6.15" "phpunit/phpunit": "^8.5.39 || ^9.6.20"
}, },
"suggest": { "suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
@ -454,7 +454,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/psr7/issues", "issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.6.2" "source": "https://github.com/guzzle/psr7/tree/2.7.0"
}, },
"funding": [ "funding": [
{ {
@ -470,7 +470,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-12-03T20:05:35+00:00" "time": "2024-07-18T11:15:46+00:00"
}, },
{ {
"name": "http-interop/http-factory-guzzle", "name": "http-interop/http-factory-guzzle",
@ -532,16 +532,16 @@
}, },
{ {
"name": "jean85/pretty-package-versions", "name": "jean85/pretty-package-versions",
"version": "2.0.5", "version": "2.0.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/Jean85/pretty-package-versions.git", "url": "https://github.com/Jean85/pretty-package-versions.git",
"reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af" "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/ae547e455a3d8babd07b96966b17d7fd21d9c6af", "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4",
"reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af", "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -549,9 +549,9 @@
"php": "^7.1|^8.0" "php": "^7.1|^8.0"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^2.17", "friendsofphp/php-cs-fixer": "^3.2",
"jean85/composer-provided-replaced-stub-package": "^1.0", "jean85/composer-provided-replaced-stub-package": "^1.0",
"phpstan/phpstan": "^0.12.66", "phpstan/phpstan": "^1.4",
"phpunit/phpunit": "^7.5|^8.5|^9.4", "phpunit/phpunit": "^7.5|^8.5|^9.4",
"vimeo/psalm": "^4.3" "vimeo/psalm": "^4.3"
}, },
@ -585,22 +585,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/Jean85/pretty-package-versions/issues", "issues": "https://github.com/Jean85/pretty-package-versions/issues",
"source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.5" "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6"
}, },
"time": "2021-10-08T21:21:46+00:00" "time": "2024-03-08T09:58:59+00:00"
}, },
{ {
"name": "php-http/client-common", "name": "php-http/client-common",
"version": "2.7.1", "version": "2.7.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-http/client-common.git", "url": "https://github.com/php-http/client-common.git",
"reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612" "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-http/client-common/zipball/1e19c059b0e4d5f717bf5d524d616165aeab0612", "url": "https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46",
"reference": "1e19c059b0e4d5f717bf5d524d616165aeab0612", "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -654,22 +654,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/php-http/client-common/issues", "issues": "https://github.com/php-http/client-common/issues",
"source": "https://github.com/php-http/client-common/tree/2.7.1" "source": "https://github.com/php-http/client-common/tree/2.7.2"
}, },
"time": "2023-11-30T10:31:25+00:00" "time": "2024-09-24T06:21:48+00:00"
}, },
{ {
"name": "php-http/discovery", "name": "php-http/discovery",
"version": "1.19.2", "version": "1.20.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-http/discovery.git", "url": "https://github.com/php-http/discovery.git",
"reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb" "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-http/discovery/zipball/61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d",
"reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -693,7 +693,8 @@
"php-http/httplug": "^1.0 || ^2.0", "php-http/httplug": "^1.0 || ^2.0",
"php-http/message-factory": "^1.0", "php-http/message-factory": "^1.0",
"phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
"symfony/phpunit-bridge": "^6.2" "sebastian/comparator": "^3.0.5 || ^4.0.8",
"symfony/phpunit-bridge": "^6.4.4 || ^7.0.1"
}, },
"type": "composer-plugin", "type": "composer-plugin",
"extra": { "extra": {
@ -732,22 +733,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/php-http/discovery/issues", "issues": "https://github.com/php-http/discovery/issues",
"source": "https://github.com/php-http/discovery/tree/1.19.2" "source": "https://github.com/php-http/discovery/tree/1.20.0"
}, },
"time": "2023-11-30T16:49:05+00:00" "time": "2024-10-02T11:20:13+00:00"
}, },
{ {
"name": "php-http/httplug", "name": "php-http/httplug",
"version": "2.4.0", "version": "2.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-http/httplug.git", "url": "https://github.com/php-http/httplug.git",
"reference": "625ad742c360c8ac580fcc647a1541d29e257f67" "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67", "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4",
"reference": "625ad742c360c8ac580fcc647a1541d29e257f67", "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -789,22 +790,22 @@
], ],
"support": { "support": {
"issues": "https://github.com/php-http/httplug/issues", "issues": "https://github.com/php-http/httplug/issues",
"source": "https://github.com/php-http/httplug/tree/2.4.0" "source": "https://github.com/php-http/httplug/tree/2.4.1"
}, },
"time": "2023-04-14T15:10:03+00:00" "time": "2024-09-23T11:39:58+00:00"
}, },
{ {
"name": "php-http/message", "name": "php-http/message",
"version": "1.16.0", "version": "1.16.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-http/message.git", "url": "https://github.com/php-http/message.git",
"reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", "url": "https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a",
"reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -858,9 +859,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/php-http/message/issues", "issues": "https://github.com/php-http/message/issues",
"source": "https://github.com/php-http/message/tree/1.16.0" "source": "https://github.com/php-http/message/tree/1.16.2"
}, },
"time": "2023-05-17T06:43:38+00:00" "time": "2024-10-02T11:34:13+00:00"
}, },
{ {
"name": "php-http/message-factory", "name": "php-http/message-factory",
@ -919,16 +920,16 @@
}, },
{ {
"name": "php-http/promise", "name": "php-http/promise",
"version": "1.2.1", "version": "1.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-http/promise.git", "url": "https://github.com/php-http/promise.git",
"reference": "44a67cb59f708f826f3bec35f22030b3edb90119" "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-http/promise/zipball/44a67cb59f708f826f3bec35f22030b3edb90119", "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
"reference": "44a67cb59f708f826f3bec35f22030b3edb90119", "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -965,9 +966,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/php-http/promise/issues", "issues": "https://github.com/php-http/promise/issues",
"source": "https://github.com/php-http/promise/tree/1.2.1" "source": "https://github.com/php-http/promise/tree/1.3.1"
}, },
"time": "2023-11-08T12:57:08+00:00" "time": "2024-03-15T13:55:21+00:00"
}, },
{ {
"name": "predis/predis", "name": "predis/predis",
@ -1231,20 +1232,20 @@
}, },
{ {
"name": "psr/http-factory", "name": "psr/http-factory",
"version": "1.0.2", "version": "1.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-fig/http-factory.git", "url": "https://github.com/php-fig/http-factory.git",
"reference": "e616d01114759c4c489f93b099585439f795fe35" "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
"reference": "e616d01114759c4c489f93b099585439f795fe35", "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.0.0", "php": ">=7.1",
"psr/http-message": "^1.0 || ^2.0" "psr/http-message": "^1.0 || ^2.0"
}, },
"type": "library", "type": "library",
@ -1268,7 +1269,7 @@
"homepage": "https://www.php-fig.org/" "homepage": "https://www.php-fig.org/"
} }
], ],
"description": "Common interfaces for PSR-7 HTTP message factories", "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
"keywords": [ "keywords": [
"factory", "factory",
"http", "http",
@ -1280,9 +1281,9 @@
"response" "response"
], ],
"support": { "support": {
"source": "https://github.com/php-fig/http-factory/tree/1.0.2" "source": "https://github.com/php-fig/http-factory"
}, },
"time": "2023-04-10T20:10:41+00:00" "time": "2024-04-15T12:06:14+00:00"
}, },
{ {
"name": "psr/http-message", "name": "psr/http-message",
@ -1590,16 +1591,16 @@
}, },
{ {
"name": "sentry/sentry-symfony", "name": "sentry/sentry-symfony",
"version": "4.13.1", "version": "4.14.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/getsentry/sentry-symfony.git", "url": "https://github.com/getsentry/sentry-symfony.git",
"reference": "e8102da84841b33c0237b81479377d1cbaea9aa4" "reference": "001c4cfd8fe93cbb00edaca903ffbfac28259170"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/e8102da84841b33c0237b81479377d1cbaea9aa4", "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/001c4cfd8fe93cbb00edaca903ffbfac28259170",
"reference": "e8102da84841b33c0237b81479377d1cbaea9aa4", "reference": "001c4cfd8fe93cbb00edaca903ffbfac28259170",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1620,8 +1621,8 @@
"symfony/security-http": "^4.4.20||^5.0.11||^6.0||^7.0" "symfony/security-http": "^4.4.20||^5.0.11||^6.0||^7.0"
}, },
"require-dev": { "require-dev": {
"doctrine/dbal": "^2.13||^3.0", "doctrine/dbal": "^2.13||^3.3||^4.0",
"doctrine/doctrine-bundle": "^1.12||^2.5", "doctrine/doctrine-bundle": "^2.6",
"friendsofphp/php-cs-fixer": "^2.19||^3.40", "friendsofphp/php-cs-fixer": "^2.19||^3.40",
"masterminds/html5": "^2.8", "masterminds/html5": "^2.8",
"phpstan/extension-installer": "^1.0", "phpstan/extension-installer": "^1.0",
@ -1688,7 +1689,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/getsentry/sentry-symfony/issues", "issues": "https://github.com/getsentry/sentry-symfony/issues",
"source": "https://github.com/getsentry/sentry-symfony/tree/4.13.1" "source": "https://github.com/getsentry/sentry-symfony/tree/4.14.0"
}, },
"funding": [ "funding": [
{ {
@ -1700,7 +1701,7 @@
"type": "custom" "type": "custom"
} }
], ],
"time": "2023-12-06T16:02:30+00:00" "time": "2024-02-26T09:27:19+00:00"
}, },
{ {
"name": "symfony/apache-pack", "name": "symfony/apache-pack",
@ -1730,16 +1731,16 @@
}, },
{ {
"name": "symfony/asset", "name": "symfony/asset",
"version": "v5.4.31", "version": "v5.4.40",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/asset.git", "url": "https://github.com/symfony/asset.git",
"reference": "edb2457a0ef615d420d2319851f679a4cc3b3635" "reference": "e5aa241b4914257164b39c3c2678b2c41b7671e3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/asset/zipball/edb2457a0ef615d420d2319851f679a4cc3b3635", "url": "https://api.github.com/repos/symfony/asset/zipball/e5aa241b4914257164b39c3c2678b2c41b7671e3",
"reference": "edb2457a0ef615d420d2319851f679a4cc3b3635", "reference": "e5aa241b4914257164b39c3c2678b2c41b7671e3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1784,7 +1785,7 @@
"description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/asset/tree/v5.4.31" "source": "https://github.com/symfony/asset/tree/v5.4.40"
}, },
"funding": [ "funding": [
{ {
@ -1800,20 +1801,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-10-31T07:58:33+00:00" "time": "2024-05-31T14:33:22+00:00"
}, },
{ {
"name": "symfony/cache", "name": "symfony/cache",
"version": "v5.4.32", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/cache.git", "url": "https://github.com/symfony/cache.git",
"reference": "2553faca77502a4f68dc93cd2f3b9ec650751e40" "reference": "4b3e7bf157b8b5a010865701d9106b5f0a9c99a8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/cache/zipball/2553faca77502a4f68dc93cd2f3b9ec650751e40", "url": "https://api.github.com/repos/symfony/cache/zipball/4b3e7bf157b8b5a010865701d9106b5f0a9c99a8",
"reference": "2553faca77502a4f68dc93cd2f3b9ec650751e40", "reference": "4b3e7bf157b8b5a010865701d9106b5f0a9c99a8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1842,7 +1843,7 @@
"cache/integration-tests": "dev-master", "cache/integration-tests": "dev-master",
"doctrine/cache": "^1.6|^2.0", "doctrine/cache": "^1.6|^2.0",
"doctrine/dbal": "^2.13.1|^3|^4", "doctrine/dbal": "^2.13.1|^3|^4",
"predis/predis": "^1.1", "predis/predis": "^1.1|^2.0",
"psr/simple-cache": "^1.0|^2.0", "psr/simple-cache": "^1.0|^2.0",
"symfony/config": "^4.4|^5.0|^6.0", "symfony/config": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0",
@ -1881,7 +1882,7 @@
"psr6" "psr6"
], ],
"support": { "support": {
"source": "https://github.com/symfony/cache/tree/v5.4.32" "source": "https://github.com/symfony/cache/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -1897,20 +1898,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-24T13:04:07+00:00" "time": "2024-09-13T16:57:39+00:00"
}, },
{ {
"name": "symfony/cache-contracts", "name": "symfony/cache-contracts",
"version": "v2.5.2", "version": "v2.5.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/cache-contracts.git", "url": "https://github.com/symfony/cache-contracts.git",
"reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" "reference": "fee6db04d913094e2fb55ff8e7db5685a8134463"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/fee6db04d913094e2fb55ff8e7db5685a8134463",
"reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", "reference": "fee6db04d913094e2fb55ff8e7db5685a8134463",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1960,7 +1961,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" "source": "https://github.com/symfony/cache-contracts/tree/v2.5.3"
}, },
"funding": [ "funding": [
{ {
@ -1976,20 +1977,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-01-02T09:53:40+00:00" "time": "2024-01-23T13:51:25+00:00"
}, },
{ {
"name": "symfony/config", "name": "symfony/config",
"version": "v5.4.31", "version": "v5.4.40",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/config.git", "url": "https://github.com/symfony/config.git",
"reference": "dd5ea39de228813aba0c23c3a4153da2a4cf3cd9" "reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/config/zipball/dd5ea39de228813aba0c23c3a4153da2a4cf3cd9", "url": "https://api.github.com/repos/symfony/config/zipball/d4e1db78421163b98dd9971d247fd0df4a57ee5e",
"reference": "dd5ea39de228813aba0c23c3a4153da2a4cf3cd9", "reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2039,7 +2040,7 @@
"description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/config/tree/v5.4.31" "source": "https://github.com/symfony/config/tree/v5.4.40"
}, },
"funding": [ "funding": [
{ {
@ -2055,20 +2056,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-09T08:22:43+00:00" "time": "2024-05-31T14:33:22+00:00"
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v5.4.32", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "c70df1ffaf23a8d340bded3cfab1b86752ad6ed7" "reference": "5b5a0aa66e3296e303e22490f90f521551835a83"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/c70df1ffaf23a8d340bded3cfab1b86752ad6ed7", "url": "https://api.github.com/repos/symfony/console/zipball/5b5a0aa66e3296e303e22490f90f521551835a83",
"reference": "c70df1ffaf23a8d340bded3cfab1b86752ad6ed7", "reference": "5b5a0aa66e3296e303e22490f90f521551835a83",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2138,7 +2139,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v5.4.32" "source": "https://github.com/symfony/console/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -2154,20 +2155,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-18T18:23:04+00:00" "time": "2024-09-20T07:56:40+00:00"
}, },
{ {
"name": "symfony/dependency-injection", "name": "symfony/dependency-injection",
"version": "v5.4.33", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/dependency-injection.git", "url": "https://github.com/symfony/dependency-injection.git",
"reference": "14969a558cd6382b2a12b14b20ef9a851a02da79" "reference": "23eb9f3803a931aef16a65f362a9aeb0640a1374"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/14969a558cd6382b2a12b14b20ef9a851a02da79", "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/23eb9f3803a931aef16a65f362a9aeb0640a1374",
"reference": "14969a558cd6382b2a12b14b20ef9a851a02da79", "reference": "23eb9f3803a931aef16a65f362a9aeb0640a1374",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2227,7 +2228,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application", "description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/dependency-injection/tree/v5.4.33" "source": "https://github.com/symfony/dependency-injection/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -2243,20 +2244,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-30T08:15:37+00:00" "time": "2024-09-12T20:01:35+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v3.4.0", "version": "v3.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2265,7 +2266,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.4-dev" "dev-main": "3.5-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",
@ -2294,7 +2295,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
}, },
"funding": [ "funding": [
{ {
@ -2310,20 +2311,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-05-23T14:45:45+00:00" "time": "2024-04-18T09:32:20+00:00"
}, },
{ {
"name": "symfony/dotenv", "name": "symfony/dotenv",
"version": "v5.4.30", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/dotenv.git", "url": "https://github.com/symfony/dotenv.git",
"reference": "ceed2cd28442adcf3679a9a82dacd45baeefc458" "reference": "bb4fef2bf035a50170fd95e5b146152834126008"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/dotenv/zipball/ceed2cd28442adcf3679a9a82dacd45baeefc458", "url": "https://api.github.com/repos/symfony/dotenv/zipball/bb4fef2bf035a50170fd95e5b146152834126008",
"reference": "ceed2cd28442adcf3679a9a82dacd45baeefc458", "reference": "bb4fef2bf035a50170fd95e5b146152834126008",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2365,7 +2366,7 @@
"environment" "environment"
], ],
"support": { "support": {
"source": "https://github.com/symfony/dotenv/tree/v5.4.30" "source": "https://github.com/symfony/dotenv/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -2381,20 +2382,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-10-26T16:37:39+00:00" "time": "2024-09-16T09:39:25+00:00"
}, },
{ {
"name": "symfony/error-handler", "name": "symfony/error-handler",
"version": "v5.4.29", "version": "v5.4.42",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/error-handler.git", "url": "https://github.com/symfony/error-handler.git",
"reference": "328c6fcfd2f90b64c16efaf0ea67a311d672f078" "reference": "db15ba0fd50890156ed40087ccedc7851a1f5b76"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/328c6fcfd2f90b64c16efaf0ea67a311d672f078", "url": "https://api.github.com/repos/symfony/error-handler/zipball/db15ba0fd50890156ed40087ccedc7851a1f5b76",
"reference": "328c6fcfd2f90b64c16efaf0ea67a311d672f078", "reference": "db15ba0fd50890156ed40087ccedc7851a1f5b76",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2436,7 +2437,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code", "description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/error-handler/tree/v5.4.29" "source": "https://github.com/symfony/error-handler/tree/v5.4.42"
}, },
"funding": [ "funding": [
{ {
@ -2452,20 +2453,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-09-06T21:54:06+00:00" "time": "2024-07-23T12:34:05+00:00"
}, },
{ {
"name": "symfony/event-dispatcher", "name": "symfony/event-dispatcher",
"version": "v5.4.26", "version": "v5.4.40",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/event-dispatcher.git", "url": "https://github.com/symfony/event-dispatcher.git",
"reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac" "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5dcc00e03413f05c1e7900090927bb7247cb0aac", "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a54e2a8a114065f31020d6a89ede83e34c3b27a4",
"reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac", "reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2521,7 +2522,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v5.4.26" "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.40"
}, },
"funding": [ "funding": [
{ {
@ -2537,20 +2538,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-07-06T06:34:20+00:00" "time": "2024-05-31T14:33:22+00:00"
}, },
{ {
"name": "symfony/event-dispatcher-contracts", "name": "symfony/event-dispatcher-contracts",
"version": "v3.4.0", "version": "v3.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git", "url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "a76aed96a42d2b521153fb382d418e30d18b59df" "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50",
"reference": "a76aed96a42d2b521153fb382d418e30d18b59df", "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2560,7 +2561,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "3.4-dev" "dev-main": "3.5-dev"
}, },
"thanks": { "thanks": {
"name": "symfony/contracts", "name": "symfony/contracts",
@ -2597,7 +2598,7 @@
"standards" "standards"
], ],
"support": { "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": [ "funding": [
{ {
@ -2613,20 +2614,83 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-05-23T14:45:45+00:00" "time": "2024-04-18T09:32:20+00:00"
}, },
{ {
"name": "symfony/filesystem", "name": "symfony/expression-language",
"version": "v5.4.25", "version": "v5.4.43",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/filesystem.git", "url": "https://github.com/symfony/expression-language.git",
"reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364" "reference": "9d23f7bfd1d602fddc6d6520decedc99739497dd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", "url": "https://api.github.com/repos/symfony/expression-language/zipball/9d23f7bfd1d602fddc6d6520decedc99739497dd",
"reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", "reference": "9d23f7bfd1d602fddc6d6520decedc99739497dd",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/cache": "^4.4|^5.0|^6.0",
"symfony/service-contracts": "^1.1|^2|^3"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\ExpressionLanguage\\": ""
},
"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 an engine that can compile and evaluate expressions",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/expression-language/tree/v5.4.43"
},
"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-08-09T07:10:35+00:00"
},
{
"name": "symfony/filesystem",
"version": "v5.4.44",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "76c3818964e9d32be3862c9318ae3ba9aa280ddc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/76c3818964e9d32be3862c9318ae3ba9aa280ddc",
"reference": "76c3818964e9d32be3862c9318ae3ba9aa280ddc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2635,6 +2699,9 @@
"symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-mbstring": "~1.8",
"symfony/polyfill-php80": "^1.16" "symfony/polyfill-php80": "^1.16"
}, },
"require-dev": {
"symfony/process": "^5.4|^6.4"
},
"type": "library", "type": "library",
"autoload": { "autoload": {
"psr-4": { "psr-4": {
@ -2661,7 +2728,7 @@
"description": "Provides basic utilities for the filesystem", "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/filesystem/tree/v5.4.25" "source": "https://github.com/symfony/filesystem/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -2677,20 +2744,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-05-31T13:04:02+00:00" "time": "2024-09-16T14:52:48+00:00"
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
"version": "v5.4.27", "version": "v5.4.43",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/finder.git", "url": "https://github.com/symfony/finder.git",
"reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" "reference": "ae25a9145a900764158d439653d5630191155ca0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", "url": "https://api.github.com/repos/symfony/finder/zipball/ae25a9145a900764158d439653d5630191155ca0",
"reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", "reference": "ae25a9145a900764158d439653d5630191155ca0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2724,7 +2791,7 @@
"description": "Finds files and directories via an intuitive fluent interface", "description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/finder/tree/v5.4.27" "source": "https://github.com/symfony/finder/tree/v5.4.43"
}, },
"funding": [ "funding": [
{ {
@ -2740,26 +2807,29 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-07-31T08:02:31+00:00" "time": "2024-08-13T14:03:51+00:00"
}, },
{ {
"name": "symfony/flex", "name": "symfony/flex",
"version": "v2.4.2", "version": "v2.4.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/flex.git", "url": "https://github.com/symfony/flex.git",
"reference": "67ee785f1aedada76461de7a7ec10cd7f8ff8d36" "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/flex/zipball/67ee785f1aedada76461de7a7ec10cd7f8ff8d36", "url": "https://api.github.com/repos/symfony/flex/zipball/92f4fba342161ff36072bd3b8e0b3c6c23160402",
"reference": "67ee785f1aedada76461de7a7ec10cd7f8ff8d36", "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"composer-plugin-api": "^2.1", "composer-plugin-api": "^2.1",
"php": ">=8.0" "php": ">=8.0"
}, },
"conflict": {
"composer/semver": "<1.7.2"
},
"require-dev": { "require-dev": {
"composer/composer": "^2.1", "composer/composer": "^2.1",
"symfony/dotenv": "^5.4|^6.0", "symfony/dotenv": "^5.4|^6.0",
@ -2789,7 +2859,7 @@
"description": "Composer plugin for Symfony", "description": "Composer plugin for Symfony",
"support": { "support": {
"issues": "https://github.com/symfony/flex/issues", "issues": "https://github.com/symfony/flex/issues",
"source": "https://github.com/symfony/flex/tree/v2.4.2" "source": "https://github.com/symfony/flex/tree/v2.4.7"
}, },
"funding": [ "funding": [
{ {
@ -2805,20 +2875,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-12-05T14:09:35+00:00" "time": "2024-10-07T08:51:54+00:00"
}, },
{ {
"name": "symfony/form", "name": "symfony/form",
"version": "v5.4.33", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/form.git", "url": "https://github.com/symfony/form.git",
"reference": "9c13bf53e728d3f75ce7a36046ffc2cd0e7d25ec" "reference": "4f3d91f8a7626e3cab9e3d2952321df10013a6eb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/form/zipball/9c13bf53e728d3f75ce7a36046ffc2cd0e7d25ec", "url": "https://api.github.com/repos/symfony/form/zipball/4f3d91f8a7626e3cab9e3d2952321df10013a6eb",
"reference": "9c13bf53e728d3f75ce7a36046ffc2cd0e7d25ec", "reference": "4f3d91f8a7626e3cab9e3d2952321df10013a6eb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2841,7 +2911,7 @@
"symfony/error-handler": "<4.4.5", "symfony/error-handler": "<4.4.5",
"symfony/framework-bundle": "<4.4", "symfony/framework-bundle": "<4.4",
"symfony/http-kernel": "<4.4", "symfony/http-kernel": "<4.4",
"symfony/translation": "<4.4", "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3",
"symfony/translation-contracts": "<1.1.7", "symfony/translation-contracts": "<1.1.7",
"symfony/twig-bridge": "<5.4.21|>=6,<6.2.7" "symfony/twig-bridge": "<5.4.21|>=6,<6.2.7"
}, },
@ -2855,7 +2925,7 @@
"symfony/http-kernel": "^4.4|^5.0|^6.0", "symfony/http-kernel": "^4.4|^5.0|^6.0",
"symfony/intl": "^4.4|^5.0|^6.0", "symfony/intl": "^4.4|^5.0|^6.0",
"symfony/security-csrf": "^4.4|^5.0|^6.0", "symfony/security-csrf": "^4.4|^5.0|^6.0",
"symfony/translation": "^4.4|^5.0|^6.0", "symfony/translation": "^5.4.35|~6.3.12|^6.4.3",
"symfony/uid": "^5.1|^6.0", "symfony/uid": "^5.1|^6.0",
"symfony/validator": "^4.4.17|^5.1.9|^6.0", "symfony/validator": "^4.4.17|^5.1.9|^6.0",
"symfony/var-dumper": "^4.4|^5.0|^6.0" "symfony/var-dumper": "^4.4|^5.0|^6.0"
@ -2891,7 +2961,7 @@
"description": "Allows to easily create, process and reuse HTML forms", "description": "Allows to easily create, process and reuse HTML forms",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/form/tree/v5.4.33" "source": "https://github.com/symfony/form/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -2907,20 +2977,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-30T10:45:54+00:00" "time": "2024-09-20T07:56:40+00:00"
}, },
{ {
"name": "symfony/framework-bundle", "name": "symfony/framework-bundle",
"version": "v5.4.32", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/framework-bundle.git", "url": "https://github.com/symfony/framework-bundle.git",
"reference": "14597eccde5051368918bce92393be9ba941db14" "reference": "9ae1957fb817c0fec6d171931f675895a434d988"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/14597eccde5051368918bce92393be9ba941db14", "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/9ae1957fb817c0fec6d171931f675895a434d988",
"reference": "14597eccde5051368918bce92393be9ba941db14", "reference": "9ae1957fb817c0fec6d171931f675895a434d988",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2928,7 +2998,7 @@
"php": ">=7.2.5", "php": ">=7.2.5",
"symfony/cache": "^5.2|^6.0", "symfony/cache": "^5.2|^6.0",
"symfony/config": "^5.3|^6.0", "symfony/config": "^5.3|^6.0",
"symfony/dependency-injection": "^5.4.5|^6.0.5", "symfony/dependency-injection": "^5.4.44|^6.0.5",
"symfony/deprecation-contracts": "^2.1|^3", "symfony/deprecation-contracts": "^2.1|^3",
"symfony/error-handler": "^4.4.1|^5.0.1|^6.0", "symfony/error-handler": "^4.4.1|^5.0.1|^6.0",
"symfony/event-dispatcher": "^5.1|^6.0", "symfony/event-dispatcher": "^5.1|^6.0",
@ -2948,7 +3018,7 @@
"phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/reflection-docblock": "<3.2.2",
"phpdocumentor/type-resolver": "<1.4.0", "phpdocumentor/type-resolver": "<1.4.0",
"symfony/asset": "<5.3", "symfony/asset": "<5.3",
"symfony/console": "<5.2.5", "symfony/console": "<5.2.5|>=7.0",
"symfony/dom-crawler": "<4.4", "symfony/dom-crawler": "<4.4",
"symfony/dotenv": "<5.1", "symfony/dotenv": "<5.1",
"symfony/form": "<5.2", "symfony/form": "<5.2",
@ -3003,7 +3073,7 @@
"symfony/web-link": "^4.4|^5.0|^6.0", "symfony/web-link": "^4.4|^5.0|^6.0",
"symfony/workflow": "^5.2|^6.0", "symfony/workflow": "^5.2|^6.0",
"symfony/yaml": "^4.4|^5.0|^6.0", "symfony/yaml": "^4.4|^5.0|^6.0",
"twig/twig": "^2.10|^3.0" "twig/twig": "^2.10|^3.0.4"
}, },
"suggest": { "suggest": {
"ext-apcu": "For best performance of the system caches", "ext-apcu": "For best performance of the system caches",
@ -3041,7 +3111,7 @@
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/framework-bundle/tree/v5.4.32" "source": "https://github.com/symfony/framework-bundle/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -3057,27 +3127,27 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-23T15:18:29+00:00" "time": "2024-09-20T08:11:35+00:00"
}, },
{ {
"name": "symfony/http-client", "name": "symfony/http-client",
"version": "v5.4.31", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-client.git", "url": "https://github.com/symfony/http-client.git",
"reference": "6cdf6cdf48101454f014a9ab4e0905f0b902389d" "reference": "58d3dc6bfa5fb37137e32d52ddc202ba4d1cea04"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-client/zipball/6cdf6cdf48101454f014a9ab4e0905f0b902389d", "url": "https://api.github.com/repos/symfony/http-client/zipball/58d3dc6bfa5fb37137e32d52ddc202ba4d1cea04",
"reference": "6cdf6cdf48101454f014a9ab4e0905f0b902389d", "reference": "58d3dc6bfa5fb37137e32d52ddc202ba4d1cea04",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.2.5", "php": ">=7.2.5",
"psr/log": "^1|^2|^3", "psr/log": "^1|^2|^3",
"symfony/deprecation-contracts": "^2.1|^3", "symfony/deprecation-contracts": "^2.1|^3",
"symfony/http-client-contracts": "^2.4", "symfony/http-client-contracts": "^2.5.3",
"symfony/polyfill-php73": "^1.11", "symfony/polyfill-php73": "^1.11",
"symfony/polyfill-php80": "^1.16", "symfony/polyfill-php80": "^1.16",
"symfony/service-contracts": "^1.0|^2|^3" "symfony/service-contracts": "^1.0|^2|^3"
@ -3093,7 +3163,7 @@
"amphp/http-client": "^4.2.1", "amphp/http-client": "^4.2.1",
"amphp/http-tunnel": "^1.0", "amphp/http-tunnel": "^1.0",
"amphp/socket": "^1.1", "amphp/socket": "^1.1",
"guzzlehttp/promises": "^1.4", "guzzlehttp/promises": "^1.4|^2.0",
"nyholm/psr7": "^1.0", "nyholm/psr7": "^1.0",
"php-http/httplug": "^1.0|^2.0", "php-http/httplug": "^1.0|^2.0",
"php-http/message-factory": "^1.0", "php-http/message-factory": "^1.0",
@ -3132,7 +3202,7 @@
"http" "http"
], ],
"support": { "support": {
"source": "https://github.com/symfony/http-client/tree/v5.4.31" "source": "https://github.com/symfony/http-client/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -3148,20 +3218,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-10-29T12:33:05+00:00" "time": "2024-09-16T14:04:28+00:00"
}, },
{ {
"name": "symfony/http-client-contracts", "name": "symfony/http-client-contracts",
"version": "v2.5.2", "version": "v2.5.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-client-contracts.git", "url": "https://github.com/symfony/http-client-contracts.git",
"reference": "ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70" "reference": "e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70", "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1",
"reference": "ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70", "reference": "e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3210,7 +3280,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/http-client-contracts/tree/v2.5.2" "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.3"
}, },
"funding": [ "funding": [
{ {
@ -3226,20 +3296,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-04-12T15:48:08+00:00" "time": "2024-03-26T19:42:53+00:00"
}, },
{ {
"name": "symfony/http-foundation", "name": "symfony/http-foundation",
"version": "v5.4.32", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-foundation.git", "url": "https://github.com/symfony/http-foundation.git",
"reference": "cbcd80a4c36f59772d62860fdb0cb6a38da63fd2" "reference": "ae0d217e5932aa0b70ddb4cf7822cc76d48aee53"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/cbcd80a4c36f59772d62860fdb0cb6a38da63fd2", "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ae0d217e5932aa0b70ddb4cf7822cc76d48aee53",
"reference": "cbcd80a4c36f59772d62860fdb0cb6a38da63fd2", "reference": "ae0d217e5932aa0b70ddb4cf7822cc76d48aee53",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3249,7 +3319,7 @@
"symfony/polyfill-php80": "^1.16" "symfony/polyfill-php80": "^1.16"
}, },
"require-dev": { "require-dev": {
"predis/predis": "~1.0", "predis/predis": "^1.0|^2.0",
"symfony/cache": "^4.4|^5.0|^6.0", "symfony/cache": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0", "symfony/expression-language": "^4.4|^5.0|^6.0",
@ -3286,7 +3356,7 @@
"description": "Defines an object-oriented layer for the HTTP specification", "description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-foundation/tree/v5.4.32" "source": "https://github.com/symfony/http-foundation/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -3302,20 +3372,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-20T15:40:25+00:00" "time": "2024-09-15T07:55:06+00:00"
}, },
{ {
"name": "symfony/http-kernel", "name": "symfony/http-kernel",
"version": "v5.4.33", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-kernel.git", "url": "https://github.com/symfony/http-kernel.git",
"reference": "892636f9279f953dc266dc088f900b03eecb4ffa" "reference": "788dcf72d9af7432a886aa3b0c5904d68087ba13"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/892636f9279f953dc266dc088f900b03eecb4ffa", "url": "https://api.github.com/repos/symfony/http-kernel/zipball/788dcf72d9af7432a886aa3b0c5904d68087ba13",
"reference": "892636f9279f953dc266dc088f900b03eecb4ffa", "reference": "788dcf72d9af7432a886aa3b0c5904d68087ba13",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3364,6 +3434,7 @@
"symfony/stopwatch": "^4.4|^5.0|^6.0", "symfony/stopwatch": "^4.4|^5.0|^6.0",
"symfony/translation": "^4.4|^5.0|^6.0", "symfony/translation": "^4.4|^5.0|^6.0",
"symfony/translation-contracts": "^1.1|^2|^3", "symfony/translation-contracts": "^1.1|^2|^3",
"symfony/var-dumper": "^4.4.31|^5.4",
"twig/twig": "^2.13|^3.0.4" "twig/twig": "^2.13|^3.0.4"
}, },
"suggest": { "suggest": {
@ -3398,7 +3469,7 @@
"description": "Provides a structured process for converting a Request into a Response", "description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-kernel/tree/v5.4.33" "source": "https://github.com/symfony/http-kernel/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -3414,20 +3485,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-12-01T16:51:11+00:00" "time": "2024-09-21T05:47:58+00:00"
}, },
{ {
"name": "symfony/lock", "name": "symfony/lock",
"version": "v5.4.32", "version": "v5.4.40",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/lock.git", "url": "https://github.com/symfony/lock.git",
"reference": "a6d7d829f4907134775a0e1b162780e61f80ed87" "reference": "d96955c9919fa8609b193ba76e9f527776b70176"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/lock/zipball/a6d7d829f4907134775a0e1b162780e61f80ed87", "url": "https://api.github.com/repos/symfony/lock/zipball/d96955c9919fa8609b193ba76e9f527776b70176",
"reference": "a6d7d829f4907134775a0e1b162780e61f80ed87", "reference": "d96955c9919fa8609b193ba76e9f527776b70176",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3441,7 +3512,7 @@
}, },
"require-dev": { "require-dev": {
"doctrine/dbal": "^2.13|^3|^4", "doctrine/dbal": "^2.13|^3|^4",
"predis/predis": "~1.0" "predis/predis": "^1.0|^2.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -3477,7 +3548,7 @@
"semaphore" "semaphore"
], ],
"support": { "support": {
"source": "https://github.com/symfony/lock/tree/v5.4.32" "source": "https://github.com/symfony/lock/tree/v5.4.40"
}, },
"funding": [ "funding": [
{ {
@ -3493,20 +3564,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-20T15:40:25+00:00" "time": "2024-05-31T14:33:22+00:00"
}, },
{ {
"name": "symfony/options-resolver", "name": "symfony/options-resolver",
"version": "v5.4.21", "version": "v5.4.40",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/options-resolver.git", "url": "https://github.com/symfony/options-resolver.git",
"reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9" "reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", "url": "https://api.github.com/repos/symfony/options-resolver/zipball/bd1afbde6613a8d6b956115e0e14b196191fd0c4",
"reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9", "reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3546,7 +3617,7 @@
"options" "options"
], ],
"support": { "support": {
"source": "https://github.com/symfony/options-resolver/tree/v5.4.21" "source": "https://github.com/symfony/options-resolver/tree/v5.4.40"
}, },
"funding": [ "funding": [
{ {
@ -3562,20 +3633,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-02-14T08:03:56+00:00" "time": "2024-05-31T14:33:22+00:00"
}, },
{ {
"name": "symfony/password-hasher", "name": "symfony/password-hasher",
"version": "v5.4.31", "version": "v5.4.40",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/password-hasher.git", "url": "https://github.com/symfony/password-hasher.git",
"reference": "f1a07181f3442836b0aadfd4c65841804d4173c4" "reference": "21b98178ab2024e6c7d8ab72cca9ba16015c6093"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/password-hasher/zipball/f1a07181f3442836b0aadfd4c65841804d4173c4", "url": "https://api.github.com/repos/symfony/password-hasher/zipball/21b98178ab2024e6c7d8ab72cca9ba16015c6093",
"reference": "f1a07181f3442836b0aadfd4c65841804d4173c4", "reference": "21b98178ab2024e6c7d8ab72cca9ba16015c6093",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3620,7 +3691,7 @@
"password" "password"
], ],
"support": { "support": {
"source": "https://github.com/symfony/password-hasher/tree/v5.4.31" "source": "https://github.com/symfony/password-hasher/tree/v5.4.40"
}, },
"funding": [ "funding": [
{ {
@ -3636,33 +3707,30 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-02T10:18:11+00:00" "time": "2024-05-31T14:33:22+00:00"
}, },
{ {
"name": "symfony/polyfill-intl-grapheme", "name": "symfony/polyfill-intl-grapheme",
"version": "v1.28.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
"reference": "875e90aeea2777b6f135677f618529449334a612" "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
"reference": "875e90aeea2777b6f135677f618529449334a612", "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"suggest": { "suggest": {
"ext-intl": "For best performance" "ext-intl": "For best performance"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@ -3701,7 +3769,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -3717,33 +3785,30 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-26T09:26:14+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{ {
"name": "symfony/polyfill-intl-icu", "name": "symfony/polyfill-intl-icu",
"version": "v1.28.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-icu.git", "url": "https://github.com/symfony/polyfill-intl-icu.git",
"reference": "e46b4da57951a16053cd751f63f4a24292788157" "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/e46b4da57951a16053cd751f63f4a24292788157", "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78",
"reference": "e46b4da57951a16053cd751f63f4a24292788157", "reference": "d80a05e9904d2c2b9b95929f3e4b5d3a8f418d78",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"suggest": { "suggest": {
"ext-intl": "For best performance and support of other locales than \"en\"" "ext-intl": "For best performance and support of other locales than \"en\""
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@ -3788,7 +3853,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -3804,33 +3869,30 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-03-21T17:27:24+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{ {
"name": "symfony/polyfill-intl-normalizer", "name": "symfony/polyfill-intl-normalizer",
"version": "v1.28.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" "reference": "3833d7255cc303546435cb650316bff708a1c75c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
"reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"suggest": { "suggest": {
"ext-intl": "For best performance" "ext-intl": "For best performance"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@ -3872,7 +3934,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -3888,24 +3950,24 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-26T09:26:14+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.28.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "42292d99c55abe617799667f454222c54c60e229" "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
"reference": "42292d99c55abe617799667f454222c54c60e229", "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"provide": { "provide": {
"ext-mbstring": "*" "ext-mbstring": "*"
@ -3915,9 +3977,6 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@ -3955,7 +4014,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -3971,30 +4030,27 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-07-28T09:04:16+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{ {
"name": "symfony/polyfill-php73", "name": "symfony/polyfill-php73",
"version": "v1.28.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php73.git", "url": "https://github.com/symfony/polyfill-php73.git",
"reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb",
"reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@ -4034,7 +4090,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -4050,30 +4106,27 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-26T09:26:14+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{ {
"name": "symfony/polyfill-php80", "name": "symfony/polyfill-php80",
"version": "v1.28.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php80.git", "url": "https://github.com/symfony/polyfill-php80.git",
"reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
"reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@ -4117,7 +4170,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -4133,30 +4186,27 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-26T09:26:14+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{ {
"name": "symfony/polyfill-php81", "name": "symfony/polyfill-php81",
"version": "v1.28.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php81.git", "url": "https://github.com/symfony/polyfill-php81.git",
"reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
"reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": {
"dev-main": "1.28-dev"
},
"thanks": { "thanks": {
"name": "symfony/polyfill", "name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "url": "https://github.com/symfony/polyfill"
@ -4196,7 +4246,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -4212,20 +4262,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-26T09:26:14+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{ {
"name": "symfony/property-access", "name": "symfony/property-access",
"version": "v5.4.26", "version": "v5.4.43",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/property-access.git", "url": "https://github.com/symfony/property-access.git",
"reference": "0249e46f69e92049a488f39fcf531cb42c50caaa" "reference": "2d751866b976a02e22743359733edc55cd20e9fd"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/property-access/zipball/0249e46f69e92049a488f39fcf531cb42c50caaa", "url": "https://api.github.com/repos/symfony/property-access/zipball/2d751866b976a02e22743359733edc55cd20e9fd",
"reference": "0249e46f69e92049a488f39fcf531cb42c50caaa", "reference": "2d751866b976a02e22743359733edc55cd20e9fd",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4277,7 +4327,7 @@
"reflection" "reflection"
], ],
"support": { "support": {
"source": "https://github.com/symfony/property-access/tree/v5.4.26" "source": "https://github.com/symfony/property-access/tree/v5.4.43"
}, },
"funding": [ "funding": [
{ {
@ -4293,20 +4343,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-07-13T15:20:41+00:00" "time": "2024-08-29T08:50:14+00:00"
}, },
{ {
"name": "symfony/property-info", "name": "symfony/property-info",
"version": "v5.4.24", "version": "v5.4.42",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/property-info.git", "url": "https://github.com/symfony/property-info.git",
"reference": "d43b85b00699b4484964c297575b5c6f9dc5f6e1" "reference": "825aa937f6e8cd63dcc118d0af84d7d4979cddf4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/property-info/zipball/d43b85b00699b4484964c297575b5c6f9dc5f6e1", "url": "https://api.github.com/repos/symfony/property-info/zipball/825aa937f6e8cd63dcc118d0af84d7d4979cddf4",
"reference": "d43b85b00699b4484964c297575b5c6f9dc5f6e1", "reference": "825aa937f6e8cd63dcc118d0af84d7d4979cddf4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4368,7 +4418,7 @@
"validator" "validator"
], ],
"support": { "support": {
"source": "https://github.com/symfony/property-info/tree/v5.4.24" "source": "https://github.com/symfony/property-info/tree/v5.4.42"
}, },
"funding": [ "funding": [
{ {
@ -4384,7 +4434,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-05-15T20:11:03+00:00" "time": "2024-07-22T18:03:36+00:00"
}, },
{ {
"name": "symfony/psr-http-message-bridge", "name": "symfony/psr-http-message-bridge",
@ -4477,16 +4527,16 @@
}, },
{ {
"name": "symfony/rate-limiter", "name": "symfony/rate-limiter",
"version": "v5.4.30", "version": "v5.4.40",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/rate-limiter.git", "url": "https://github.com/symfony/rate-limiter.git",
"reference": "10c8064e57ae1bb6dee152d44d737a1a799f8386" "reference": "b3de902fc83923b9121169ade2453c41d0819110"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/rate-limiter/zipball/10c8064e57ae1bb6dee152d44d737a1a799f8386", "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/b3de902fc83923b9121169ade2453c41d0819110",
"reference": "10c8064e57ae1bb6dee152d44d737a1a799f8386", "reference": "b3de902fc83923b9121169ade2453c41d0819110",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4527,7 +4577,7 @@
"rate-limiter" "rate-limiter"
], ],
"support": { "support": {
"source": "https://github.com/symfony/rate-limiter/tree/v5.4.30" "source": "https://github.com/symfony/rate-limiter/tree/v5.4.40"
}, },
"funding": [ "funding": [
{ {
@ -4543,20 +4593,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-10-10T05:34:18+00:00" "time": "2024-05-31T14:33:22+00:00"
}, },
{ {
"name": "symfony/routing", "name": "symfony/routing",
"version": "v5.4.33", "version": "v5.4.43",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/routing.git", "url": "https://github.com/symfony/routing.git",
"reference": "5b5b86670f947db92ab54cdcff585e76064d0b04" "reference": "b6f71780bbdd5e93e1c5638671cf0ba42aa8c6d8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/routing/zipball/5b5b86670f947db92ab54cdcff585e76064d0b04", "url": "https://api.github.com/repos/symfony/routing/zipball/b6f71780bbdd5e93e1c5638671cf0ba42aa8c6d8",
"reference": "5b5b86670f947db92ab54cdcff585e76064d0b04", "reference": "b6f71780bbdd5e93e1c5638671cf0ba42aa8c6d8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4617,7 +4667,7 @@
"url" "url"
], ],
"support": { "support": {
"source": "https://github.com/symfony/routing/tree/v5.4.33" "source": "https://github.com/symfony/routing/tree/v5.4.43"
}, },
"funding": [ "funding": [
{ {
@ -4633,20 +4683,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-12-01T09:28:00+00:00" "time": "2024-08-27T06:36:52+00:00"
}, },
{ {
"name": "symfony/runtime", "name": "symfony/runtime",
"version": "v5.4.26", "version": "v5.4.40",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/runtime.git", "url": "https://github.com/symfony/runtime.git",
"reference": "4659b552bc9f2380986e3f4b7e2bd4e512470e0d" "reference": "50096d4ebebb4f9c41b87695868a6e34bdbf7cde"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/runtime/zipball/4659b552bc9f2380986e3f4b7e2bd4e512470e0d", "url": "https://api.github.com/repos/symfony/runtime/zipball/50096d4ebebb4f9c41b87695868a6e34bdbf7cde",
"reference": "4659b552bc9f2380986e3f4b7e2bd4e512470e0d", "reference": "50096d4ebebb4f9c41b87695868a6e34bdbf7cde",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4697,7 +4747,7 @@
"runtime" "runtime"
], ],
"support": { "support": {
"source": "https://github.com/symfony/runtime/tree/v5.4.26" "source": "https://github.com/symfony/runtime/tree/v5.4.40"
}, },
"funding": [ "funding": [
{ {
@ -4713,27 +4763,27 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-07-16T16:48:57+00:00" "time": "2024-05-31T14:33:22+00:00"
}, },
{ {
"name": "symfony/security-bundle", "name": "symfony/security-bundle",
"version": "v5.4.31", "version": "v5.4.43",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-bundle.git", "url": "https://github.com/symfony/security-bundle.git",
"reference": "92e24de1759b6a502896d87c5e0997973ef47ac4" "reference": "f14a15c6c7bb37879d59c129d96c4c07c7d5db32"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-bundle/zipball/92e24de1759b6a502896d87c5e0997973ef47ac4", "url": "https://api.github.com/repos/symfony/security-bundle/zipball/f14a15c6c7bb37879d59c129d96c4c07c7d5db32",
"reference": "92e24de1759b6a502896d87c5e0997973ef47ac4", "reference": "f14a15c6c7bb37879d59c129d96c4c07c7d5db32",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-xml": "*", "ext-xml": "*",
"php": ">=7.2.5", "php": ">=7.2.5",
"symfony/config": "^4.4|^5.0|^6.0", "symfony/config": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^5.3|^6.0", "symfony/dependency-injection": "^5.4.43|^6.4.11",
"symfony/deprecation-contracts": "^2.1|^3", "symfony/deprecation-contracts": "^2.1|^3",
"symfony/event-dispatcher": "^5.1|^6.0", "symfony/event-dispatcher": "^5.1|^6.0",
"symfony/http-foundation": "^5.3|^6.0", "symfony/http-foundation": "^5.3|^6.0",
@ -4800,7 +4850,7 @@
"description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "description": "Provides a tight integration of the Security component into the Symfony full-stack framework",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-bundle/tree/v5.4.31" "source": "https://github.com/symfony/security-bundle/tree/v5.4.43"
}, },
"funding": [ "funding": [
{ {
@ -4816,20 +4866,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-09T09:26:13+00:00" "time": "2024-08-19T09:13:19+00:00"
}, },
{ {
"name": "symfony/security-core", "name": "symfony/security-core",
"version": "v5.4.30", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-core.git", "url": "https://github.com/symfony/security-core.git",
"reference": "3908c54da30dd68c2fe31915d82a1c81809d1928" "reference": "8089509e8c92e884fa27af56596576320c3b310d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-core/zipball/3908c54da30dd68c2fe31915d82a1c81809d1928", "url": "https://api.github.com/repos/symfony/security-core/zipball/8089509e8c92e884fa27af56596576320c3b310d",
"reference": "3908c54da30dd68c2fe31915d82a1c81809d1928", "reference": "8089509e8c92e884fa27af56596576320c3b310d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4845,6 +4895,7 @@
"symfony/http-foundation": "<5.3", "symfony/http-foundation": "<5.3",
"symfony/ldap": "<4.4", "symfony/ldap": "<4.4",
"symfony/security-guard": "<4.4", "symfony/security-guard": "<4.4",
"symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3",
"symfony/validator": "<5.2" "symfony/validator": "<5.2"
}, },
"require-dev": { "require-dev": {
@ -4856,7 +4907,7 @@
"symfony/expression-language": "^4.4|^5.0|^6.0", "symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/http-foundation": "^5.3|^6.0", "symfony/http-foundation": "^5.3|^6.0",
"symfony/ldap": "^4.4|^5.0|^6.0", "symfony/ldap": "^4.4|^5.0|^6.0",
"symfony/translation": "^4.4|^5.0|^6.0", "symfony/translation": "^5.4.35|~6.3.12|^6.4.3",
"symfony/validator": "^5.2|^6.0" "symfony/validator": "^5.2|^6.0"
}, },
"suggest": { "suggest": {
@ -4893,7 +4944,7 @@
"description": "Symfony Security Component - Core Library", "description": "Symfony Security Component - Core Library",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-core/tree/v5.4.30" "source": "https://github.com/symfony/security-core/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -4909,20 +4960,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-10-27T07:38:28+00:00" "time": "2024-09-01T10:41:54+00:00"
}, },
{ {
"name": "symfony/security-csrf", "name": "symfony/security-csrf",
"version": "v5.4.27", "version": "v5.4.40",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-csrf.git", "url": "https://github.com/symfony/security-csrf.git",
"reference": "995fcfcc5a3be09df157b4960668f61cceb86611" "reference": "9058d522c1c33d7ba13f4b3c79555cc2c4c16028"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-csrf/zipball/995fcfcc5a3be09df157b4960668f61cceb86611", "url": "https://api.github.com/repos/symfony/security-csrf/zipball/9058d522c1c33d7ba13f4b3c79555cc2c4c16028",
"reference": "995fcfcc5a3be09df157b4960668f61cceb86611", "reference": "9058d522c1c33d7ba13f4b3c79555cc2c4c16028",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4966,7 +5017,7 @@
"description": "Symfony Security Component - CSRF Library", "description": "Symfony Security Component - CSRF Library",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-csrf/tree/v5.4.27" "source": "https://github.com/symfony/security-csrf/tree/v5.4.40"
}, },
"funding": [ "funding": [
{ {
@ -4982,20 +5033,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-07-28T14:44:35+00:00" "time": "2024-05-31T14:33:22+00:00"
}, },
{ {
"name": "symfony/security-guard", "name": "symfony/security-guard",
"version": "v5.4.27", "version": "v5.4.40",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-guard.git", "url": "https://github.com/symfony/security-guard.git",
"reference": "72c53142533462fc6fda4a429c2a21c2b944a8cc" "reference": "d930fd327c290f451c9d8dd7889169195d4484e9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-guard/zipball/72c53142533462fc6fda4a429c2a21c2b944a8cc", "url": "https://api.github.com/repos/symfony/security-guard/zipball/d930fd327c290f451c9d8dd7889169195d4484e9",
"reference": "72c53142533462fc6fda4a429c2a21c2b944a8cc", "reference": "d930fd327c290f451c9d8dd7889169195d4484e9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5034,7 +5085,7 @@
"description": "Symfony Security Component - Guard", "description": "Symfony Security Component - Guard",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-guard/tree/v5.4.27" "source": "https://github.com/symfony/security-guard/tree/v5.4.40"
}, },
"funding": [ "funding": [
{ {
@ -5050,20 +5101,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-07-28T14:44:35+00:00" "time": "2024-05-31T14:33:22+00:00"
}, },
{ {
"name": "symfony/security-http", "name": "symfony/security-http",
"version": "v5.4.31", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-http.git", "url": "https://github.com/symfony/security-http.git",
"reference": "6d3cd5a4deee9697738db8d24258890ca4140ae9" "reference": "c0f81598425c170807f19b9a5413ad05323f317b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-http/zipball/6d3cd5a4deee9697738db8d24258890ca4140ae9", "url": "https://api.github.com/repos/symfony/security-http/zipball/c0f81598425c170807f19b9a5413ad05323f317b",
"reference": "6d3cd5a4deee9697738db8d24258890ca4140ae9", "reference": "c0f81598425c170807f19b9a5413ad05323f317b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5120,7 +5171,7 @@
"description": "Symfony Security Component - HTTP Integration", "description": "Symfony Security Component - HTTP Integration",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-http/tree/v5.4.31" "source": "https://github.com/symfony/security-http/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -5136,20 +5187,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-03T16:13:08+00:00" "time": "2024-09-11T06:50:28+00:00"
}, },
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",
"version": "v2.5.2", "version": "v2.5.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/service-contracts.git", "url": "https://github.com/symfony/service-contracts.git",
"reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3",
"reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5203,7 +5254,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/service-contracts/tree/v2.5.2" "source": "https://github.com/symfony/service-contracts/tree/v2.5.3"
}, },
"funding": [ "funding": [
{ {
@ -5219,20 +5270,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-05-30T19:17:29+00:00" "time": "2023-04-21T15:04:16+00:00"
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v5.4.32", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "91bf4453d65d8231688a04376c3a40efe0770f04" "reference": "832caa16b6d9aac6bf11747315225f5aba384c24"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/91bf4453d65d8231688a04376c3a40efe0770f04", "url": "https://api.github.com/repos/symfony/string/zipball/832caa16b6d9aac6bf11747315225f5aba384c24",
"reference": "91bf4453d65d8231688a04376c3a40efe0770f04", "reference": "832caa16b6d9aac6bf11747315225f5aba384c24",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5289,7 +5340,7 @@
"utf8" "utf8"
], ],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v5.4.32" "source": "https://github.com/symfony/string/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -5305,20 +5356,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-26T13:43:46+00:00" "time": "2024-09-20T07:56:40+00:00"
}, },
{ {
"name": "symfony/translation", "name": "symfony/translation",
"version": "v5.4.31", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/translation.git", "url": "https://github.com/symfony/translation.git",
"reference": "ba72f72fceddf36f00bd495966b5873f2d17ad8f" "reference": "6fed3a20b5b87ee9cdd9dacf545922b8fd475921"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/ba72f72fceddf36f00bd495966b5873f2d17ad8f", "url": "https://api.github.com/repos/symfony/translation/zipball/6fed3a20b5b87ee9cdd9dacf545922b8fd475921",
"reference": "ba72f72fceddf36f00bd495966b5873f2d17ad8f", "reference": "6fed3a20b5b87ee9cdd9dacf545922b8fd475921",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5386,7 +5437,7 @@
"description": "Provides tools to internationalize your application", "description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/translation/tree/v5.4.31" "source": "https://github.com/symfony/translation/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -5402,20 +5453,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-03T16:16:43+00:00" "time": "2024-09-15T08:12:35+00:00"
}, },
{ {
"name": "symfony/translation-contracts", "name": "symfony/translation-contracts",
"version": "v2.5.2", "version": "v2.5.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/translation-contracts.git", "url": "https://github.com/symfony/translation-contracts.git",
"reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" "reference": "b0073a77ac0b7ea55131020e87b1e3af540f4664"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b0073a77ac0b7ea55131020e87b1e3af540f4664",
"reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", "reference": "b0073a77ac0b7ea55131020e87b1e3af540f4664",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5464,7 +5515,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" "source": "https://github.com/symfony/translation-contracts/tree/v2.5.3"
}, },
"funding": [ "funding": [
{ {
@ -5480,20 +5531,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-06-27T16:58:25+00:00" "time": "2024-01-23T13:51:25+00:00"
}, },
{ {
"name": "symfony/twig-bridge", "name": "symfony/twig-bridge",
"version": "v5.4.31", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/twig-bridge.git", "url": "https://github.com/symfony/twig-bridge.git",
"reference": "fc6ee0a3b672ea12ca1f26592d257bfc7f4ee942" "reference": "d049fbe0e5ba0ad758f647fa8f99e840bca43f6f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/twig-bridge/zipball/fc6ee0a3b672ea12ca1f26592d257bfc7f4ee942", "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d049fbe0e5ba0ad758f647fa8f99e840bca43f6f",
"reference": "fc6ee0a3b672ea12ca1f26592d257bfc7f4ee942", "reference": "d049fbe0e5ba0ad758f647fa8f99e840bca43f6f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5533,7 +5584,7 @@
"symfony/security-core": "^4.4|^5.0|^6.0", "symfony/security-core": "^4.4|^5.0|^6.0",
"symfony/security-csrf": "^4.4|^5.0|^6.0", "symfony/security-csrf": "^4.4|^5.0|^6.0",
"symfony/security-http": "^4.4|^5.0|^6.0", "symfony/security-http": "^4.4|^5.0|^6.0",
"symfony/serializer": "^5.2|^6.0", "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3",
"symfony/stopwatch": "^4.4|^5.0|^6.0", "symfony/stopwatch": "^4.4|^5.0|^6.0",
"symfony/translation": "^5.2|^6.0", "symfony/translation": "^5.2|^6.0",
"symfony/web-link": "^4.4|^5.0|^6.0", "symfony/web-link": "^4.4|^5.0|^6.0",
@ -5585,7 +5636,7 @@
"description": "Provides integration for Twig with various Symfony components", "description": "Provides integration for Twig with various Symfony components",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/twig-bridge/tree/v5.4.31" "source": "https://github.com/symfony/twig-bridge/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -5601,20 +5652,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-09T21:19:08+00:00" "time": "2024-09-11T13:27:43+00:00"
}, },
{ {
"name": "symfony/twig-bundle", "name": "symfony/twig-bundle",
"version": "v5.4.31", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/twig-bundle.git", "url": "https://github.com/symfony/twig-bundle.git",
"reference": "62e3505a62f482a577f55ba08747dc6a3b7463b3" "reference": "b94414b3b9e0c523677c0bf31e8975231b55f18a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/twig-bundle/zipball/62e3505a62f482a577f55ba08747dc6a3b7463b3", "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/b94414b3b9e0c523677c0bf31e8975231b55f18a",
"reference": "62e3505a62f482a577f55ba08747dc6a3b7463b3", "reference": "b94414b3b9e0c523677c0bf31e8975231b55f18a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5675,7 +5726,7 @@
"description": "Provides a tight integration of Twig into the Symfony full-stack framework", "description": "Provides a tight integration of Twig into the Symfony full-stack framework",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/twig-bundle/tree/v5.4.31" "source": "https://github.com/symfony/twig-bundle/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -5691,20 +5742,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-10-31T07:58:33+00:00" "time": "2024-09-07T13:25:07+00:00"
}, },
{ {
"name": "symfony/validator", "name": "symfony/validator",
"version": "v5.4.32", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/validator.git", "url": "https://github.com/symfony/validator.git",
"reference": "d205d071c4a7ef5b6b43349c7e41d47d1b227636" "reference": "5b061420daf15b58e1599cd2191b0780ddcd2157"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/validator/zipball/d205d071c4a7ef5b6b43349c7e41d47d1b227636", "url": "https://api.github.com/repos/symfony/validator/zipball/5b061420daf15b58e1599cd2191b0780ddcd2157",
"reference": "d205d071c4a7ef5b6b43349c7e41d47d1b227636", "reference": "5b061420daf15b58e1599cd2191b0780ddcd2157",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5726,7 +5777,7 @@
"symfony/http-kernel": "<4.4", "symfony/http-kernel": "<4.4",
"symfony/intl": "<4.4", "symfony/intl": "<4.4",
"symfony/property-info": "<5.3", "symfony/property-info": "<5.3",
"symfony/translation": "<4.4", "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3",
"symfony/yaml": "<4.4" "symfony/yaml": "<4.4"
}, },
"require-dev": { "require-dev": {
@ -5744,9 +5795,9 @@
"symfony/http-kernel": "^4.4|^5.0|^6.0", "symfony/http-kernel": "^4.4|^5.0|^6.0",
"symfony/intl": "^4.4|^5.0|^6.0", "symfony/intl": "^4.4|^5.0|^6.0",
"symfony/mime": "^4.4|^5.0|^6.0", "symfony/mime": "^4.4|^5.0|^6.0",
"symfony/property-access": "^4.4|^5.0|^6.0", "symfony/property-access": "^5.4|^6.0",
"symfony/property-info": "^5.3|^6.0", "symfony/property-info": "^5.3|^6.0",
"symfony/translation": "^4.4|^5.0|^6.0", "symfony/translation": "^5.4.35|~6.3.12|^6.4.3",
"symfony/yaml": "^4.4|^5.0|^6.0" "symfony/yaml": "^4.4|^5.0|^6.0"
}, },
"suggest": { "suggest": {
@ -5767,7 +5818,8 @@
"Symfony\\Component\\Validator\\": "" "Symfony\\Component\\Validator\\": ""
}, },
"exclude-from-classmap": [ "exclude-from-classmap": [
"/Tests/" "/Tests/",
"/Resources/bin/"
] ]
}, },
"notification-url": "https://packagist.org/downloads/", "notification-url": "https://packagist.org/downloads/",
@ -5787,7 +5839,7 @@
"description": "Provides tools to validate values", "description": "Provides tools to validate values",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/validator/tree/v5.4.32" "source": "https://github.com/symfony/validator/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -5803,20 +5855,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-29T07:42:18+00:00" "time": "2024-09-19T08:27:53+00:00"
}, },
{ {
"name": "symfony/var-dumper", "name": "symfony/var-dumper",
"version": "v5.4.29", "version": "v5.4.43",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/var-dumper.git", "url": "https://github.com/symfony/var-dumper.git",
"reference": "6172e4ae3534d25ee9e07eb487c20be7760fcc65" "reference": "6be6a6a8af4818564e3726fc65cf936f34743cef"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/6172e4ae3534d25ee9e07eb487c20be7760fcc65", "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6be6a6a8af4818564e3726fc65cf936f34743cef",
"reference": "6172e4ae3534d25ee9e07eb487c20be7760fcc65", "reference": "6be6a6a8af4818564e3726fc65cf936f34743cef",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5876,7 +5928,7 @@
"dump" "dump"
], ],
"support": { "support": {
"source": "https://github.com/symfony/var-dumper/tree/v5.4.29" "source": "https://github.com/symfony/var-dumper/tree/v5.4.43"
}, },
"funding": [ "funding": [
{ {
@ -5892,20 +5944,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-09-12T10:09:58+00:00" "time": "2024-08-30T16:01:46+00:00"
}, },
{ {
"name": "symfony/var-exporter", "name": "symfony/var-exporter",
"version": "v6.4.1", "version": "v6.4.9",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/var-exporter.git", "url": "https://github.com/symfony/var-exporter.git",
"reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9" "reference": "f9a060622e0d93777b7f8687ec4860191e16802e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/var-exporter/zipball/2d08ca6b9cc704dce525615d1e6d1788734f36d9", "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9a060622e0d93777b7f8687ec4860191e16802e",
"reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9", "reference": "f9a060622e0d93777b7f8687ec4860191e16802e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5913,6 +5965,8 @@
"symfony/deprecation-contracts": "^2.5|^3" "symfony/deprecation-contracts": "^2.5|^3"
}, },
"require-dev": { "require-dev": {
"symfony/property-access": "^6.4|^7.0",
"symfony/serializer": "^6.4|^7.0",
"symfony/var-dumper": "^5.4|^6.0|^7.0" "symfony/var-dumper": "^5.4|^6.0|^7.0"
}, },
"type": "library", "type": "library",
@ -5951,7 +6005,7 @@
"serialize" "serialize"
], ],
"support": { "support": {
"source": "https://github.com/symfony/var-exporter/tree/v6.4.1" "source": "https://github.com/symfony/var-exporter/tree/v6.4.9"
}, },
"funding": [ "funding": [
{ {
@ -5967,20 +6021,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-30T10:32:10+00:00" "time": "2024-06-24T15:53:56+00:00"
}, },
{ {
"name": "symfony/web-profiler-bundle", "name": "symfony/web-profiler-bundle",
"version": "v5.4.31", "version": "v5.4.43",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/web-profiler-bundle.git", "url": "https://github.com/symfony/web-profiler-bundle.git",
"reference": "c3e04e0ad13df22acad1157a5b66404a85c3c538" "reference": "8f1628f1361e4623a6c2b373c3594845d6aacb79"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/c3e04e0ad13df22acad1157a5b66404a85c3c538", "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/8f1628f1361e4623a6c2b373c3594845d6aacb79",
"reference": "c3e04e0ad13df22acad1157a5b66404a85c3c538", "reference": "8f1628f1361e4623a6c2b373c3594845d6aacb79",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6031,7 +6085,7 @@
"description": "Provides a development tool that gives detailed information about the execution of any request", "description": "Provides a development tool that gives detailed information about the execution of any request",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.31" "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.43"
}, },
"funding": [ "funding": [
{ {
@ -6047,7 +6101,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-10-31T14:39:57+00:00" "time": "2024-08-08T09:11:47+00:00"
}, },
{ {
"name": "symfony/webpack-encore-bundle", "name": "symfony/webpack-encore-bundle",
@ -6124,16 +6178,16 @@
}, },
{ {
"name": "symfony/yaml", "name": "symfony/yaml",
"version": "v5.4.31", "version": "v5.4.44",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/yaml.git", "url": "https://github.com/symfony/yaml.git",
"reference": "f387675d7f5fc4231f7554baa70681f222f73563" "reference": "7025b964f123bbf1896d7563db6ec7f1f63e918a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/f387675d7f5fc4231f7554baa70681f222f73563", "url": "https://api.github.com/repos/symfony/yaml/zipball/7025b964f123bbf1896d7563db6ec7f1f63e918a",
"reference": "f387675d7f5fc4231f7554baa70681f222f73563", "reference": "7025b964f123bbf1896d7563db6ec7f1f63e918a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6179,7 +6233,7 @@
"description": "Loads and dumps YAML files", "description": "Loads and dumps YAML files",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/yaml/tree/v5.4.31" "source": "https://github.com/symfony/yaml/tree/v5.4.44"
}, },
"funding": [ "funding": [
{ {
@ -6195,34 +6249,41 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-03T14:41:28+00:00" "time": "2024-09-16T14:36:56+00:00"
}, },
{ {
"name": "twig/twig", "name": "twig/twig",
"version": "v3.8.0", "version": "v3.14.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/twigphp/Twig.git", "url": "https://github.com/twigphp/Twig.git",
"reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", "url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72",
"reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", "reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.2.5", "php": ">=8.0.2",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-ctype": "^1.8", "symfony/polyfill-ctype": "^1.8",
"symfony/polyfill-mbstring": "^1.3", "symfony/polyfill-mbstring": "^1.3",
"symfony/polyfill-php80": "^1.22" "symfony/polyfill-php81": "^1.29"
}, },
"require-dev": { "require-dev": {
"psr/container": "^1.0|^2.0", "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", "type": "library",
"autoload": { "autoload": {
"files": [
"src/Resources/core.php",
"src/Resources/debug.php",
"src/Resources/escaper.php",
"src/Resources/string_loader.php"
],
"psr-4": { "psr-4": {
"Twig\\": "src/" "Twig\\": "src/"
} }
@ -6255,7 +6316,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/twigphp/Twig/issues", "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.14.0"
}, },
"funding": [ "funding": [
{ {
@ -6267,10 +6328,90 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-11-21T18:54:41+00:00" "time": "2024-09-09T17:55:12+00:00"
}
],
"packages-dev": [
{
"name": "symfony/debug-bundle",
"version": "v5.4.40",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug-bundle.git",
"reference": "177f79296705823eee0d7dd79773f3a9df884fe0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/debug-bundle/zipball/177f79296705823eee0d7dd79773f3a9df884fe0",
"reference": "177f79296705823eee0d7dd79773f3a9df884fe0",
"shasum": ""
},
"require": {
"ext-xml": "*",
"php": ">=7.2.5",
"symfony/http-kernel": "^4.4|^5.0|^6.0",
"symfony/polyfill-php80": "^1.16",
"symfony/twig-bridge": "^4.4|^5.0|^6.0",
"symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"conflict": {
"symfony/config": "<4.4",
"symfony/dependency-injection": "<5.2"
},
"require-dev": {
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/web-profiler-bundle": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/config": "For service container configuration",
"symfony/dependency-injection": "For using as a service from the container"
},
"type": "symfony-bundle",
"autoload": {
"psr-4": {
"Symfony\\Bundle\\DebugBundle\\": ""
},
"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 a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/debug-bundle/tree/v5.4.40"
},
"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-31T14:33:22+00:00"
} }
], ],
"packages-dev": [],
"aliases": [], "aliases": [],
"minimum-stability": "stable", "minimum-stability": "stable",
"stability-flags": [], "stability-flags": [],

View File

@ -7,4 +7,5 @@ return [
Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true],
Sentry\SentryBundle\SentryBundle::class => ['all' => true], Sentry\SentryBundle\SentryBundle::class => ['all' => true],
Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true],
]; ];

View File

@ -0,0 +1,5 @@
when@dev:
debug:
# Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser.
# See the "server:dump" command to start a new server.
dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%"

View File

@ -0,0 +1,10 @@
services:
Psr\Http\Message\RequestFactoryInterface: '@http_discovery.psr17_factory'
Psr\Http\Message\ResponseFactoryInterface: '@http_discovery.psr17_factory'
Psr\Http\Message\ServerRequestFactoryInterface: '@http_discovery.psr17_factory'
Psr\Http\Message\StreamFactoryInterface: '@http_discovery.psr17_factory'
Psr\Http\Message\UploadedFileFactoryInterface: '@http_discovery.psr17_factory'
Psr\Http\Message\UriFactoryInterface: '@http_discovery.psr17_factory'
http_discovery.psr17_factory:
class: Http\Discovery\Psr17Factory

View File

@ -1,9 +1,10 @@
twig: twig:
globals: globals:
locales: "%locales%" locales: "%app.supported_locales%"
default_path: '%kernel.project_dir%/templates' url_link: "%env(URL_LINK)%"
default_path: "%kernel.project_dir%/templates"
form_themes: form_themes:
- 'bootstrap_5_layout.html.twig' - "bootstrap_5_layout.html.twig"
when@test: when@test:
twig: twig:
strict_variables: true strict_variables: true

View File

@ -11,12 +11,9 @@ services:
- http_proxy=${http_proxy} - http_proxy=${http_proxy}
- https_proxy=${https_proxy} - https_proxy=${https_proxy}
ports: ports:
- 8082:8080 - 8082:8071
volumes: volumes:
- ./src:/app/src - .:/app
- ./config:/app/config
- /etc/localtime:/etc/localtime:ro
- $HOME/.ssh:/root/.host-ssh:ro
tmpfs: tmpfs:
- /var/www/var/logs:uid=${FIXUID:-1000},gid=${FIXGID:-1000} - /var/www/var/logs:uid=${FIXUID:-1000},gid=${FIXGID:-1000}
- /var/www/var/cache:uid=${FIXUID:-1000},gid=${FIXGID:-1000} - /var/www/var/cache:uid=${FIXUID:-1000},gid=${FIXGID:-1000}
@ -29,8 +26,8 @@ services:
- "localhost:host-gateway" - "localhost:host-gateway"
- "host.docker.internal:host-gateway" - "host.docker.internal:host-gateway"
environment: environment:
- PHP_FPM_MEMORY_LIMIT=128m
- APP_ENV=dev - APP_ENV=dev
- PHP_FPM_MEMORY_LIMIT=128m
- APP_LOCALES=fr,en - APP_LOCALES=fr,en
- HYDRA_ADMIN_BASE_URL=http://hydra:4445 - HYDRA_ADMIN_BASE_URL=http://hydra:4445
- TRUSTED_PROXIES=127.0.0.1,REMOTE_ADDR,localhost - TRUSTED_PROXIES=127.0.0.1,REMOTE_ADDR,localhost
@ -42,7 +39,7 @@ services:
- DSN_REMOTE_DATABASE=pgsql:host='postgres';port=5432;dbname=lasql; - DSN_REMOTE_DATABASE=pgsql:host='postgres';port=5432;dbname=lasql;
- HASH_ALGO_LEGACY="sha256" - HASH_ALGO_LEGACY="sha256"
- SECURITY_PATTERN=password,salt,pepper - SECURITY_PATTERN=password,salt,pepper
- CADDY_HTTP_PORT=8071
oidc-test: oidc-test:
image: bornholm/oidc-test:v0.0.0-1-g936a77e image: bornholm/oidc-test:v0.0.0-1-g936a77e
@ -82,7 +79,14 @@ services:
links: links:
- postgres - postgres
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:4444/.well-known/openid-configuration"] test:
[
"CMD",
"wget",
"--spider",
"-q",
"http://127.0.0.1:4444/.well-known/openid-configuration",
]
interval: 10s interval: 10s
timeout: 10s timeout: 10s
retries: 10 retries: 10

View File

@ -10,7 +10,8 @@ ARG ADDITIONAL_PACKAGES="bash=5.2.15-r0 \
php81-soap=${PHP_PKG_VERSION} \ php81-soap=${PHP_PKG_VERSION} \
php81-ldap=${PHP_PKG_VERSION} \ php81-ldap=${PHP_PKG_VERSION} \
php81-pdo_mysql=${PHP_PKG_VERSION} \ php81-pdo_mysql=${PHP_PKG_VERSION} \
php81-bcmath=${PHP_PKG_VERSION}" php81-bcmath=${PHP_PKG_VERSION} \
php81-pecl-xdebug"
FROM reg.cadoles.com/cadoles/symfony:alpine-php-8.1-standalone-2023.11.16-stable.1541.eec311d
FROM reg.cadoles.com/cadoles/symfony:alpine-php-8.1-base-2024.10.4-stable.1529.b630c69
RUN chown 1000:www-data -R /app

View File

@ -10,7 +10,9 @@ ARG ADDITIONAL_PACKAGES="bash=5.2.15-r0 \
php81-soap=${PHP_PKG_VERSION} \ php81-soap=${PHP_PKG_VERSION} \
php81-ldap=${PHP_PKG_VERSION} \ php81-ldap=${PHP_PKG_VERSION} \
php81-pdo_mysql=${PHP_PKG_VERSION} \ php81-pdo_mysql=${PHP_PKG_VERSION} \
php81-bcmath=${PHP_PKG_VERSION}" php81-bcmath=${PHP_PKG_VERSION} \
php81-pecl-xdebug"
FROM reg.cadoles.com/cadoles/symfony:alpine-php-8.1-standalone-2023.11.16-stable.1541.eec311d
FROM reg.cadoles.com/cadoles/symfony:alpine-php-8.1-standalone-2024.10.4-stable.1529.b630c69
RUN chown 1000:www-data -R /app
USER www-data

7827
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@
"@symfony/webpack-encore": "^4.1.2", "@symfony/webpack-encore": "^4.1.2",
"core-js": "^3.23.0", "core-js": "^3.23.0",
"regenerator-runtime": "^0.13.9", "regenerator-runtime": "^0.13.9",
"webpack": "^5.74.0", "webpack": "^5.91.0",
"webpack-cli": "^4.10.0", "webpack-cli": "^4.10.0",
"webpack-notifier": "^1.15.0" "webpack-notifier": "^1.15.0"
}, },

View File

@ -3,15 +3,19 @@
Une [LoginApp](https://www.ory.sh/docs/hydra/concepts/login) pour le serveur OpenID Connect [Ory/Hydra](https://github.com/ory/hydra). Une [LoginApp](https://www.ory.sh/docs/hydra/concepts/login) pour le serveur OpenID Connect [Ory/Hydra](https://github.com/ory/hydra).
Elle permet de se connecter à une base de donnée et de vérifier un mot de passe donné sur une mire locale puis d'aller chercher des données demandées Elle permet de se connecter à une base de donnée et de vérifier un mot de passe donné sur une mire locale puis d'aller chercher des données demandées
## Image
- L'image standalone est construite en utilisant l'utilisateur `www-data` pour lancer supervisor (qui va lancer le process php-fpm et caddy, avec ce même user)
- C'est pour cela qu'on fini par "USER www-data" à la fin de `misc/images/hydra-oidc-standalone/Dockerfile`, sinon le conteneur `hydra-sql` ne tournera pas
## Configuration ## Configuration
### Variables d'environnement ### Variables d'environnement
| Variable | Description | Valeur par défaut | Utilisation | | Variable | Description | Valeur par défaut | Utilisation |
|--------|-----------|-----------------|-----------| | ----------------------------------- | ------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ----------- |
| `APP_ENV` | Environnement symfony | prod | dev:prod | | `APP_ENV` | Environnement symfony | prod | dev:prod |
| `APP_DEBUG` | Console de debug symofny | false | true:false | | `APP_DEBUG` | Console de debug symofny | false | true:false |
|`PHP_FPM_MEMORY_LIMIT`|php-fpm memory limit|128mo||
|`NGINX_APP_SERVER_LISTEN`|Port d'écoute de l'application|8080||
| `HYDRA_ADMIN_BASE_URL` | Url d'admin Hydra ou dispatcher | http://hydra:4445 | obligatoire | | `HYDRA_ADMIN_BASE_URL` | Url d'admin Hydra ou dispatcher | http://hydra:4445 | obligatoire |
| `BASE_URL` | Url d'accès | http://localhost:8080 | obligatoire | | `BASE_URL` | Url d'accès | http://localhost:8080 | obligatoire |
| `DSN_REMOTE_DATABASE` | DSN de la BDD | postgresql://lasql:lasql@postgres:5432/lasql?serverVersion=15&chartset=utf8 | | | `DSN_REMOTE_DATABASE` | DSN de la BDD | postgresql://lasql:lasql@postgres:5432/lasql?serverVersion=15&chartset=utf8 | |
@ -22,16 +26,38 @@ Elle permet de se connecter à une base de donnée et de vérifier un mot de pas
| `SECURITY_PATTERN` | Séquence à employer pour le hashage du mot de passe | password,salt,pepper | obligatoire | | `SECURITY_PATTERN` | Séquence à employer pour le hashage du mot de passe | password,salt,pepper | obligatoire |
| `PEPPER` | Pepper utilisé pour le Hashage | | | | `PEPPER` | Pepper utilisé pour le Hashage | | |
| `REDIS_DSN` | DSN du serveur Redis | redis://redis:6379 | obligatoire | | `REDIS_DSN` | DSN du serveur Redis | redis://redis:6379 | obligatoire |
| `URL_LINK` | Url pouvant être utilisée dans les liens des templates | | |
| `CADDY_HTTP_PORT` | Port d'écoute de l'application | 8080 | |
| `CADDY_HTTPS_PORT` | Port d'écoute de l'application | 8443 | |
| `CADDY_DATA_FS` | Chemin vers le répertoire utilisé pour le stockage de caddy | /tmp/caddy | |
| `CADDY_APP_ROOT_PUBLIC` | Chemin vers le répertoire utilisé pour servire les fichiers | /app/public | |
| `CADDY_PHP_INDEX` | Nom du fichier a utiliser pour servir l'application | index.php | |
| `CADDY_APP_UPSTREAM_BACKEND_SERVER` | Adresse du serveur backend FastCGI PHP vers lequel doit être diriger les requêtes PHP. | unix//tmp/php-fpm.sock | |
| `CADDY_TRUSTED_PROXIES` | Spécification des adresses IP /plage IP étant sur pour transmettre les requetes HTTP | private_ranges | |
| `CADDY_LOG_FORMAT` | Spécification du format des logs | console | |
| `CADDY_LOG_LEVEL` | Spécification du niveau de verbosité des logs | INFO | |
| `PHP_FPM_MEMORY_LIMIT` | Spécification de la mémoire limite maximale alloué au processus PHP-FPM | 128M | |
| `PHP_FPM_DISPLAY_ERRORS` | Afficahge des erreurs dans la sortie du serveur web. | off | |
| `PHP_FPM_LISTEN` | Spécification du serveur sur lequel PHP FPM écoute les connexion. | /tmp/php-fpm.sock | |
| `PHP_FPM_LOG_LEVEL` | Spécification du niveau de verbosité des logs PHP-FPM | notice | |
| `PHP_FPM_PM` | Définition du mode de gestion des processus PHP-FPM | dynamic | |
| `PHP_FPM_PM_MAX_CHILDREN` | Définition du nombre maximum de processus enfants que PHP-FPM peut générer | 5 | |
| `PHP_FPM_PM_START_SERVERS` | Définition du nombre de processus enfants que PHP-FPM va démarrer au lancement de PHP-FPM | 2 | |
| `PHP_FPM_PM_MIN_SPARE_SERVERS` | Définition du nombre minimum de processus enfants inactifs que PHP-FPM doit conserver en réserve. | 1 | |
| `PHP_FPM_PM_MAX_SPARE_SERVERS` | Définition du nombre maximum de processus enfants inactifs que PHP-FPM peut conserver en réserve. | 3 | |
| `XDG_DATA_HOME` | Définition du répertoire de base pour le stockage des données spécifiques à l'utilisateur. | /tmp/data | |
### Algorithmes de hashage compatibles ### Algorithmes de hashage compatibles
La login app est compatible par défaut avec toutes les méthodes de hashage de PHP et avec SSHA. Aucune configuration supplémentaire n'est nécessaire. La login app est compatible par défaut avec toutes les méthodes de hashage de PHP et avec SSHA. Aucune configuration supplémentaire n'est nécessaire.
### Pattern de hashage ### Pattern de hashage
Définir dans la variable `SECURITY_PATTERN` le pattern utilisé avec les mots clés: password | salt | pepper séparé par des virgules pour représenter la séquence à employer pour le hashage du mot de passe. Définir dans la variable `SECURITY_PATTERN` le pattern utilisé avec les mots clés: password | salt | pepper séparé par des virgules pour représenter la séquence à employer pour le hashage du mot de passe.
Exemple : `SECURITY_PATTERN="salt,password,pepper"` Exemple : `SECURITY_PATTERN="salt,password,pepper"`
### Schéma de base de donnée ### Schéma de base de donnée
Permet d'adapter les requetes SQL à la base de donnée utilisée en indiquant les noms de colonnes de celle-ci. Permet d'adapter les requetes SQL à la base de donnée utilisée en indiquant les noms de colonnes de celle-ci.
```yaml ```yaml
@ -45,11 +71,13 @@ sql_login:
- email - email
- lastname - lastname
- firstname - firstname
subject_rewrite_expression: 'firstname~"."~lastname~"@exemple.com"'
``` ```
## Environnement de développement ## Environnement de développement
### Tester ### Tester
Se rendre sur [http://localhost:8000/](http://localhost:8000/) et cliquer `Login` pour commencer une nouvelle connexion. Se rendre sur [http://localhost:8000/](http://localhost:8000/) et cliquer `Login` pour commencer une nouvelle connexion.
3 utilisateurs d'exemple sont disponible pour les tests: 3 utilisateurs d'exemple sont disponible pour les tests:
| Login | Mot de passe | Algorithme | | Login | Mot de passe | Algorithme |
@ -59,8 +87,10 @@ Se rendre sur [http://localhost:8000/](http://localhost:8000/) et cliquer `Login
| test3@test.com | 123456 | SSHA | | test3@test.com | 123456 | SSHA |
### Base de donnée ### Base de donnée
2 bases de données différentes sont disponible pour les tests. 2 bases de données différentes sont disponible pour les tests.
Pour choisir la base de donnée à utiliser, modifier les d'environnement relatives à la base de donnée. Pour choisir la base de donnée à utiliser, modifier les d'environnement relatives à la base de donnée.
- **URL Postgres**: `postgresql://lasql:lasql@mariadb:3306/lasql?serverVersion=15&chartset=utf8` - **URL Postgres**: `postgresql://lasql:lasql@mariadb:3306/lasql?serverVersion=15&chartset=utf8`
- **URL Mariadb**: `mysql://lasql:lasql@postgres:5432/lasql` - **URL Mariadb**: `mysql://lasql:lasql@postgres:5432/lasql`
@ -72,10 +102,10 @@ ex : `'redis:?host[redis1:26379]&host[redis2:26379]&host[redis3:26379]&redis_sen
### Liste des ports ### Liste des ports
| Nom | Description | Port(s) hôte utilisé(s) | | Nom | Description | Port(s) hôte utilisé(s) |
|---|-----------|------------------| | ----------- | -------------------------------------------------------------------------- | ----------------------- |
| `oidc-test` | Application factice permettant de tester l'authentification OpenID Connect | `8080` | | `oidc-test` | Application factice permettant de tester l'authentification OpenID Connect | `8080` |
| `hydra` | Serveur Ory/Hydra | `8081` | | `hydra` | Serveur Ory/Hydra | `8081` |
| `hydra-sql` | Login/Consent/Logout App (ce projet) | `8082` | | `hydra-sql` | Login/Consent/Logout App (ce projet) | `8082` |
|`postgres`| Base de donnée postgres support du test et pour hydra|`5432` | `postgres` | Base de donnée postgres support du test et pour hydra | `5432` |
|`mariadb`| Base de donnée mariadb support du test|`3306` | `mariadb` | Base de donnée mariadb support du test | `3306` |
|`pgadmin`| pour administrer la base de donnée |`8085` | `pgadmin` | pour administrer la base de donnée | `8085` |

View File

@ -4,12 +4,13 @@ namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ErrorHandler\Exception\FlattenException; use Symfony\Component\ErrorHandler\Exception\FlattenException;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
class CustomErrorController extends AbstractController class CustomErrorController extends AbstractController
{ {
#[Route(path: '/error', name: 'custom_error_controller')] #[Route(path: '/error', name: 'custom_error_controller')]
public function show(FlattenException $exception) public function show(FlattenException $exception): Response
{ {
$statusCode = $exception->getStatusCode(); $statusCode = $exception->getStatusCode();
$message = $exception->getMessage(); $message = $exception->getMessage();

View File

@ -4,6 +4,7 @@ namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
@ -17,7 +18,7 @@ class LocaleController extends AbstractController
} }
#[Route(path: 'locale/{locale?}', name: 'locale_change')] #[Route(path: 'locale/{locale?}', name: 'locale_change')]
public function changeLocal(?string $locale, Request $request) public function changeLocal(?string $locale, Request $request): RedirectResponse
{ {
if (empty($locale)) { if (empty($locale)) {
$locale = $this->params->get('default_locale'); $locale = $this->params->get('default_locale');

View File

@ -5,7 +5,10 @@ namespace App\Controller;
use App\Entity\User; use App\Entity\User;
use App\Hydra\Client; use App\Hydra\Client;
use App\Hydra\HydraService; use App\Hydra\HydraService;
use App\SQLLogin\SQLLoginRequest;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\Finder\Exception\AccessDeniedException;
use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
@ -14,9 +17,9 @@ use Symfony\Component\Routing\Annotation\Route;
class MainController extends AbstractController class MainController extends AbstractController
{ {
public HydraService $hydra; private HydraService $hydra;
public Client $client; private Client $client;
public SessionInterface $session; private SessionInterface $session;
public function __construct(SessionInterface $session, HydraService $hydra, Client $client) public function __construct(SessionInterface $session, HydraService $hydra, Client $client)
{ {
@ -26,26 +29,44 @@ class MainController extends AbstractController
} }
#[Route('/', name: 'app_home')] #[Route('/', name: 'app_home')]
public function home(Request $request) public function home(Request $request): RedirectResponse
{ {
return $this->hydra->handleLoginRequest($request); return $this->hydra->handleLoginRequest($request);
} }
/* /*
* Route de Healthcheck (notament pour kubernetes) * Route de Healthcheck (notament pour kubernetes)
*/ */
#[Route('/health', name: 'health')] #[Route('/health', name: 'health')]
public function health(Request $request) public function health(Request $request): Response
{ {
return new Response('healthy', 200); return new Response('healthy', 200);
} }
#[Route('/connect/login-accept', name: 'app_login_accept')] #[Route('/connect/login-accept', name: 'app_login_accept', methods: ['GET'])]
public function loginAccept(Request $request) public function loginAccept(SQLLoginRequest $sqlLoginRequest): RedirectResponse
{ {
/** @var User */
$user = $this->getUser(); $user = $this->getUser();
$loginAcceptRes = $this->client->acceptLoginRequest($this->session->get('challenge'), [
'subject' => $user->getLogin(), if (!$user instanceof User) {
throw new AccessDeniedException();
}
$challenge = $this->session->get('challenge');
if (!$challenge) {
return new RedirectResponse($this->getParameter('issuer_url'));
}
$subject = $user->getLogin();
$subjectRewriteExpression = $sqlLoginRequest->getSubjectRewriteExpression();
if (null != $subjectRewriteExpression) {
$expressionLanguage = new ExpressionLanguage();
$subject = $expressionLanguage->evaluate($subjectRewriteExpression, $user->getAttributes());
}
$loginAcceptRes = $this->client->acceptLoginRequest($challenge, [
'subject' => $subject,
'remember' => true, 'remember' => true,
])->toArray(); ])->toArray();
@ -53,7 +74,7 @@ class MainController extends AbstractController
} }
#[Route('/connect/consent', name: 'app_consent')] #[Route('/connect/consent', name: 'app_consent')]
public function consent(Request $request) public function consent(Request $request): RedirectResponse
{ {
return $this->hydra->handleConsentRequest($request); return $this->hydra->handleConsentRequest($request);
} }

View File

@ -17,7 +17,7 @@ use Symfony\Contracts\Translation\TranslatorInterface;
class SecurityController extends AbstractController class SecurityController extends AbstractController
{ {
#[Route('/login', name: 'app_login')] #[Route('/login', name: 'app_login')]
public function login(ParameterBagInterface $params, AuthenticationUtils $authenticationUtils, Request $request, TranslatorInterface $trans): Response public function login(ParameterBagInterface $params, AuthenticationUtils $authenticationUtils, Request $request, TranslatorInterface $trans): Response|RedirectResponse
{ {
// Si l'utilisateur est déjà connecté on le renvoie sur la page du site demandeur // Si l'utilisateur est déjà connecté on le renvoie sur la page du site demandeur
if ($this->getUser()) { if ($this->getUser()) {
@ -29,16 +29,12 @@ class SecurityController extends AbstractController
$error = $authenticationUtils->getLastAuthenticationError(); $error = $authenticationUtils->getLastAuthenticationError();
if ($error) { if ($error) {
if ($request->getSession()->has(SQLLoginUserAuthenticator::ERROR_LOGIN)) { if ($request->getSession()->has(SQLLoginUserAuthenticator::ERROR_LOGIN)) {
$loginForm->get('login')->addError(new FormError($trans->trans('error.login', [], 'messages'))); $loginForm->addError(new FormError($trans->trans('error.login', [], 'messages')));
$request->getSession()->remove(SQLLoginUserAuthenticator::ERROR_LOGIN); $request->getSession()->remove(SQLLoginUserAuthenticator::ERROR_LOGIN);
} }
if ($request->getSession()->has(SQLLoginUserAuthenticator::ERROR_PASSWORD)) { if ($request->getSession()->has(SQLLoginUserAuthenticator::TECHNICAL_ERROR)) {
$loginForm->get('password')->addError(new FormError($trans->trans('error.password', [], 'messages'))); $loginForm->addError(new FormError($trans->trans('error.technical', [], 'messages')));
$request->getSession()->remove(SQLLoginUserAuthenticator::ERROR_PASSWORD); $request->getSession()->remove(SQLLoginUserAuthenticator::TECHNICAL_ERROR);
}
if ($request->getSession()->has(SQLLoginUserAuthenticator::ERROR_SQL_LOGIN)) {
$loginForm->addError(new FormError($trans->trans('error.sql_login', [], 'messages')));
$request->getSession()->remove(SQLLoginUserAuthenticator::ERROR_SQL_LOGIN);
} }
} }
@ -48,7 +44,7 @@ class SecurityController extends AbstractController
} }
#[Route('/logout', name: 'logout')] #[Route('/logout', name: 'logout')]
public function logout(Request $request) public function logout(Request $request): void
{ {
} }
} }

View File

@ -19,6 +19,7 @@ class SQLLoginConfiguration implements ConfigurationInterface
->arrayNode(SQLLoginRequest::DATA_TO_FETCH) ->arrayNode(SQLLoginRequest::DATA_TO_FETCH)
->scalarPrototype()->end() ->scalarPrototype()->end()
->end() ->end()
->scalarNode(SQLLoginRequest::SUBJECT_REWRITE_EXPRESSION)->defaultNull()->end()
->end(); ->end();
return $treeBuilder; return $treeBuilder;

View File

@ -6,7 +6,7 @@ use Symfony\Component\Security\Core\User\UserInterface;
class User implements UserInterface class User implements UserInterface
{ {
protected array $attributes = []; private array $attributes = [];
private string $login; private string $login;
private string $password; private string $password;
private bool $rememberMe; private bool $rememberMe;

View File

@ -16,7 +16,7 @@ class LocaleSubscriber implements EventSubscriberInterface
$this->defaultLocale = $defaultLocale; $this->defaultLocale = $defaultLocale;
} }
public function onKernelRequest(RequestEvent $event) public function onKernelRequest(RequestEvent $event): void
{ {
$request = $event->getRequest(); $request = $event->getRequest();
if (!$request->hasPreviousSession()) { if (!$request->hasPreviousSession()) {
@ -32,7 +32,7 @@ class LocaleSubscriber implements EventSubscriberInterface
} }
} }
public static function getSubscribedEvents() public static function getSubscribedEvents(): array
{ {
return [ return [
KernelEvents::REQUEST => [['onKernelRequest', 20]], KernelEvents::REQUEST => [['onKernelRequest', 20]],

View File

@ -3,14 +3,20 @@
namespace App\Hydra; namespace App\Hydra;
use App\Hydra\Exception\InvalidChallengeException; use App\Hydra\Exception\InvalidChallengeException;
use Exception;
use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Contracts\HttpClient\ResponseInterface; use Symfony\Contracts\HttpClient\ResponseInterface;
class Client class Client
{ {
protected $client; private HttpClientInterface $client;
private const MAX_RETRY = 3;
protected $hydraAdminBaseUrl; private const SLEEP_TIME = [
5,
500,
5000,
];
private string $hydraAdminBaseUrl;
public function __construct(HttpClientInterface $client, string $hydraAdminBaseUrl) public function __construct(HttpClientInterface $client, string $hydraAdminBaseUrl)
{ {
@ -26,7 +32,7 @@ class Client
[ [
'query' => [ 'query' => [
'login_challenge' => $loginChallenge, 'login_challenge' => $loginChallenge,
] ],
] ]
); );
@ -35,7 +41,6 @@ class Client
throw new InvalidChallengeException(); throw new InvalidChallengeException();
} }
return $response; return $response;
} }
@ -47,7 +52,7 @@ class Client
[ [
'query' => [ 'query' => [
'logout_challenge' => $logoutChallenge, 'logout_challenge' => $logoutChallenge,
] ],
] ]
); );
@ -56,27 +61,38 @@ class Client
throw new InvalidChallengeException(); throw new InvalidChallengeException();
} }
return $response; return $response;
} }
public function fetchConsentRequestInfo(string $consentChallenge): ResponseInterface public function fetchConsentRequestInfo(string $consentChallenge): ResponseInterface
{ {
$attempt = 0;
while ($attempt < self::MAX_RETRY) {
$response = $this->client->request( $response = $this->client->request(
'GET', 'GET',
$this->hydraAdminBaseUrl.'/oauth2/auth/requests/consent', $this->hydraAdminBaseUrl.'/oauth2/auth/requests/consent',
[ [
'query' => [ 'query' => [
'consent_challenge' => $consentChallenge, 'consent_challenge' => $consentChallenge,
] ],
] ]
); );
switch ($response->getStatusCode()) { $status = $response->getStatusCode();
if (503 === $status) {
++$attempt;
usleep(1000 * self::SLEEP_TIME[$attempt] + rand(1, 5) * 1000);
continue;
}
switch ($status) {
case 404: case 404:
throw new InvalidChallengeException(); throw new InvalidChallengeException();
} }
break;
}
if (self::MAX_RETRY === $attempt) {
throw new Exception(sprintf('Fetch consent a rencontré une erreur %s après %s tentatives', $response->getStatusCode(), self::MAX_RETRY));
}
return $response; return $response;
} }
@ -91,7 +107,7 @@ class Client
'login_challenge' => $loginChallenge, 'login_challenge' => $loginChallenge,
], ],
'headers' => [ 'headers' => [
'Content-Type' => 'application/json' 'Content-Type' => 'application/json',
], ],
'body' => json_encode($payload), 'body' => json_encode($payload),
] ]
@ -110,7 +126,7 @@ class Client
'consent_challenge' => $consentChallenge, 'consent_challenge' => $consentChallenge,
], ],
'headers' => [ 'headers' => [
'Content-Type' => 'application/json' 'Content-Type' => 'application/json',
], ],
'body' => json_encode($payload), 'body' => json_encode($payload),
] ]
@ -129,7 +145,7 @@ class Client
'logout_challenge' => $logoutChallenge, 'logout_challenge' => $logoutChallenge,
], ],
'headers' => [ 'headers' => [
'Content-Type' => 'application/json' 'Content-Type' => 'application/json',
], ],
] ]
); );

View File

@ -2,6 +2,7 @@
namespace App\Hydra; namespace App\Hydra;
use App\Entity\User;
use App\Hydra\Exception\InvalidChallengeException; use App\Hydra\Exception\InvalidChallengeException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Exception\BadRequestException; use Symfony\Component\HttpFoundation\Exception\BadRequestException;
@ -9,13 +10,14 @@ use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
class HydraService extends AbstractController class HydraService extends AbstractController
{ {
public SessionInterface $session; private SessionInterface $session;
public Client $client; private Client $client;
public TokenStorageInterface $tokenStorage; private TokenStorageInterface $tokenStorage;
public string $baseUrl; private string $baseUrl;
public function __construct(Client $client, SessionInterface $session, TokenStorageInterface $tokenStorage, string $baseUrl) public function __construct(Client $client, SessionInterface $session, TokenStorageInterface $tokenStorage, string $baseUrl)
{ {
@ -25,7 +27,7 @@ class HydraService extends AbstractController
$this->baseUrl = $baseUrl; $this->baseUrl = $baseUrl;
} }
public function handleLoginRequest(Request $request) public function handleLoginRequest(Request $request): RedirectResponse
{ {
$challenge = $request->query->get('login_challenge'); $challenge = $request->query->get('login_challenge');
// S'il n'y a pas de challenge, on déclenche une bad request // S'il n'y a pas de challenge, on déclenche une bad request
@ -37,7 +39,7 @@ class HydraService extends AbstractController
$loginRequestInfo = $res->toArray(); $loginRequestInfo = $res->toArray();
if (200 !== $res->getStatusCode()) { if (200 !== $res->getStatusCode()) {
$this->session->clear(); $this->session->clear();
throw new BadRequestException('pas de code 200'); throw new BadRequestException();
} }
// si le challenge est validé par hydra, on le stocke en session pour l'utiliser par la suite et on redirige vers une route interne protégée qui va déclencher l'identification FranceConnect // si le challenge est validé par hydra, on le stocke en session pour l'utiliser par la suite et on redirige vers une route interne protégée qui va déclencher l'identification FranceConnect
$this->session->set('challenge', $loginRequestInfo['challenge']); $this->session->set('challenge', $loginRequestInfo['challenge']);
@ -45,7 +47,7 @@ class HydraService extends AbstractController
return new RedirectResponse($this->baseUrl . '/connect/login-accept'); return new RedirectResponse($this->baseUrl . '/connect/login-accept');
} }
public function handleConsentRequest(Request $request) public function handleConsentRequest(Request $request): RedirectResponse
{ {
$challenge = $request->query->get('consent_challenge'); $challenge = $request->query->get('consent_challenge');
if (!$challenge) { if (!$challenge) {
@ -53,8 +55,10 @@ class HydraService extends AbstractController
} }
$consentRequestInfo = $this->client->fetchConsentRequestInfo($challenge)->toArray(); $consentRequestInfo = $this->client->fetchConsentRequestInfo($challenge)->toArray();
/** @var User */
$user = $this->getUser(); $user = $this->getUser();
if (!$user instanceof User) {
throw new AccessDeniedException('Utilisateur non autorisé.');
}
$consentAcceptResponse = $this->client->acceptConsentRequest($consentRequestInfo['challenge'], [ $consentAcceptResponse = $this->client->acceptConsentRequest($consentRequestInfo['challenge'], [
'grant_scope' => $consentRequestInfo['requested_scope'], 'grant_scope' => $consentRequestInfo['requested_scope'],
'session' => [ 'session' => [
@ -65,7 +69,7 @@ class HydraService extends AbstractController
return new RedirectResponse($consentAcceptResponse['redirect_to']); return new RedirectResponse($consentAcceptResponse['redirect_to']);
} }
public function handleLogoutRequest(Request $request) public function handleLogoutRequest(Request $request): RedirectResponse
{ {
$logoutChallenge = $request->get('logout_challenge'); $logoutChallenge = $request->get('logout_challenge');
if (empty($logoutChallenge)) { if (empty($logoutChallenge)) {

View File

@ -4,6 +4,6 @@ namespace App\SQLLogin\Exception;
use Exception; use Exception;
class InvalidSQLLoginConfigurationException extends Exception class DataToFetchConfigurationException extends Exception
{ {
} }

View File

@ -4,6 +4,6 @@ namespace App\SQLLogin\Exception;
use Exception; use Exception;
class InvalidSQLLoginException extends Exception class EmptyResultException extends Exception
{ {
} }

View File

@ -4,6 +4,6 @@ namespace App\SQLLogin\Exception;
use Exception; use Exception;
class InvalidSQLLoginAlgoException extends Exception class NullDataToFetchException extends Exception
{ {
} }

View File

@ -0,0 +1,9 @@
<?php
namespace App\SQLLogin\Exception;
use Exception;
class SecurityPatternConfigurationException extends Exception
{
}

View File

@ -12,10 +12,8 @@ class SQLLoginConnect extends AbstractController
/** /**
* Méthode qui crée l'unique instance de la classe * Méthode qui crée l'unique instance de la classe
* si elle n'existe pas encore puis la retourne. * si elle n'existe pas encore puis la retourne.
*
* @return SQLLoginConnect
*/ */
public static function getInstance() public static function getInstance(): SQLLoginConnect
{ {
if (is_null(self::$_instance)) { if (is_null(self::$_instance)) {
self::$_instance = new SQLLoginConnect(); self::$_instance = new SQLLoginConnect();
@ -24,7 +22,7 @@ class SQLLoginConnect extends AbstractController
return self::$_instance; return self::$_instance;
} }
public function connect($urlDatabase, $dbUser, $dbPassword) public function connect($urlDatabase, $dbUser, $dbPassword): PDO
{ {
return new PDO($urlDatabase, $dbUser, $dbPassword); return new PDO($urlDatabase, $dbUser, $dbPassword);
} }

View File

@ -2,6 +2,8 @@
namespace App\SQLLogin; namespace App\SQLLogin;
use App\SQLLogin\Exception\NullDataToFetchException;
class SQLLoginRequest class SQLLoginRequest
{ {
public const DATA_TO_FETCH = 'data_to_fetch'; public const DATA_TO_FETCH = 'data_to_fetch';
@ -10,11 +12,12 @@ class SQLLoginRequest
public const PASSWORD_COLUMN_NAME = 'password_column_name'; public const PASSWORD_COLUMN_NAME = 'password_column_name';
public const PASSWORD_NEED_UPGRADE = 'password_need_upgrade'; public const PASSWORD_NEED_UPGRADE = 'password_need_upgrade';
public const TABLE_NAME = 'table_name'; public const TABLE_NAME = 'table_name';
public const SUBJECT_REWRITE_EXPRESSION = 'subject_rewrite_expression';
protected array $config; private array $config;
protected string $dsn; private string $dsn;
protected string $user; private string $user;
protected string $password; private string $password;
public function __construct(string $dsn, string $user, string $password, array $config = []) public function __construct(string $dsn, string $user, string $password, array $config = [])
{ {
@ -64,28 +67,42 @@ class SQLLoginRequest
return $this->config[self::DATA_TO_FETCH]; return $this->config[self::DATA_TO_FETCH];
} }
public function getRequestScope() public function getSubjectRewriteExpression(): ?string
{ {
$scope = ''; return $this->config[self::SUBJECT_REWRITE_EXPRESSION];
foreach ($this->config[self::DATA_TO_FETCH] as $data) {
$scope .= $data.',';
} }
$scope = substr($scope, 0, -1);
return 'SELECT '.$scope.' FROM '.$this->getTableName().' WHERE '.$this->getLoginColumnName().' = :'.$this->getLoginColumnName().';'; private function getDataFields(): array
{
if (!$this->config[self::DATA_TO_FETCH]) {
throw new NullDataToFetchException();
}
return $this->config[self::DATA_TO_FETCH];
} }
/** /**
* Construction de la string pour la requête préparée selon la configuration yaml * Construction de la string pour la requête préparée selon la configuration yaml
* intègre la récupération du mot de passe hashé, du salt et de besoin d'upgrade de la méthode de hashage * intègre la récupération du mot de passe hashé, du salt et de besoin d'upgrade de la méthode de hashage
*/ */
public function getRequestPassword() private function getPasswordFields(): array
{ {
$fields = $this->getPasswordColumnName(); $fields[] = $this->getPasswordColumnName();
if (!empty($this->getSaltColumnName())) { if (!empty($this->getSaltColumnName())) {
$fields .= ', '.$this->getSaltColumnName(); $fields[] = $this->getSaltColumnName();
} }
return 'SELECT '.$fields.' FROM '.$this->getTableName().' WHERE '.$this->getLoginColumnName().' = :'.$this->getLoginColumnName().';'; return $fields;
}
/**
* Construction de la string pour la requête préparée selon la configuration yaml
* intègre la récupération du mot de passe hashé, du salt et de besoin d'upgrade de la méthode de hashage
*/
public function getDatasRequest(): string
{
$fields = join(',', array_merge($this->getPasswordFields(), $this->getDataFields()));
return 'SELECT '.$fields.' FROM '.$this->getTableName().' WHERE LOWER('.$this->getLoginColumnName().') = LOWER(:'.$this->getLoginColumnName().');';
} }
} }

View File

@ -2,8 +2,9 @@
namespace App\Security\Hasher; namespace App\Security\Hasher;
use App\SQLLogin\Exception\InvalidSQLLoginConfigurationException;
use App\SQLLogin\Exception\InvalidSQLPasswordException; use App\SQLLogin\Exception\InvalidSQLPasswordException;
use App\SQLLogin\Exception\SecurityPatternConfigurationException;
use Psr\Log\LoggerInterface;
use Symfony\Component\PasswordHasher\Exception\InvalidPasswordException; use Symfony\Component\PasswordHasher\Exception\InvalidPasswordException;
use Symfony\Component\PasswordHasher\Hasher\CheckPasswordLengthTrait; use Symfony\Component\PasswordHasher\Hasher\CheckPasswordLengthTrait;
use Symfony\Component\PasswordHasher\LegacyPasswordHasherInterface; use Symfony\Component\PasswordHasher\LegacyPasswordHasherInterface;
@ -19,7 +20,7 @@ class PasswordEncoder implements LegacyPasswordHasherInterface
protected array $hashAlgoLegacy; protected array $hashAlgoLegacy;
protected array $securityPattern; protected array $securityPattern;
public function __construct(?string $pepper, string $hashAlgoLegacy, string $securityPattern) public function __construct(?string $pepper, string $hashAlgoLegacy, string $securityPattern, private LoggerInterface $loggerInterface)
{ {
$this->pepper = $pepper; $this->pepper = $pepper;
$this->hashAlgoLegacy = explode(',', $hashAlgoLegacy); $this->hashAlgoLegacy = explode(',', $hashAlgoLegacy);
@ -29,7 +30,7 @@ class PasswordEncoder implements LegacyPasswordHasherInterface
/** /**
* Pas utilisé, mais on doit le garder pour le implements * Pas utilisé, mais on doit le garder pour le implements
*/ */
public function hash(string $plainPassword, string $salt = null): string public function hash(string $plainPassword, ?string $salt = null): string
{ {
if ($this->isPasswordTooLong($plainPassword)) { if ($this->isPasswordTooLong($plainPassword)) {
throw new InvalidPasswordException(); throw new InvalidPasswordException();
@ -38,7 +39,7 @@ class PasswordEncoder implements LegacyPasswordHasherInterface
return hash($plainPassword.$salt, $this->hashAlgoLegacy[0]); return hash($plainPassword.$salt, $this->hashAlgoLegacy[0]);
} }
public function verify(string $hashedPassword, string $plainPassword, string $salt = null): bool public function verify(string $hashedPassword, string $plainPassword, ?string $salt = null): bool
{ {
if ('' === $plainPassword || $this->isPasswordTooLong($plainPassword)) { if ('' === $plainPassword || $this->isPasswordTooLong($plainPassword)) {
return false; return false;
@ -75,10 +76,8 @@ class PasswordEncoder implements LegacyPasswordHasherInterface
/** /**
* Retourne la string à hasher en fonction du pattern indiqué * Retourne la string à hasher en fonction du pattern indiqué
*
* @return string
*/ */
protected function getPasswordToHash($plainTextPassword, $salt) protected function getPasswordToHash(string $plainTextPassword, ?string $salt = null): string
{ {
$arrayRef = [ $arrayRef = [
self::PASSWORD_PATTERN => $plainTextPassword, self::PASSWORD_PATTERN => $plainTextPassword,
@ -88,7 +87,8 @@ class PasswordEncoder implements LegacyPasswordHasherInterface
foreach ($this->securityPattern as $term) { foreach ($this->securityPattern as $term) {
if (self::PEPPER_PATTERN !== $term && self::PASSWORD_PATTERN !== $term && self::SALT_PATTERN !== $term) { if (self::PEPPER_PATTERN !== $term && self::PASSWORD_PATTERN !== $term && self::SALT_PATTERN !== $term) {
throw new InvalidSQLLoginConfigurationException(); $this->loggerInterface->critical('La configuration du security pattern est invalide, les termes autorisés sont : '.self::PASSWORD_PATTERN.', '.self::SALT_PATTERN.' et '.self::PEPPER_PATTERN);
throw new SecurityPatternConfigurationException('La configuration du security pattern est invalide, les termes autorisés sont : '.self::PASSWORD_PATTERN.', '.self::SALT_PATTERN.' et '.self::PEPPER_PATTERN);
} }
} }
$completedPlainPassword = ''; $completedPlainPassword = '';
@ -99,7 +99,7 @@ class PasswordEncoder implements LegacyPasswordHasherInterface
return $completedPlainPassword; return $completedPlainPassword;
} }
protected function compareSsha($hashPassword, $plainPassword) protected function compareSsha(string $hashPassword, string $plainPassword): bool
{ {
$base_64_hash_with_salt = substr($hashPassword, 6); $base_64_hash_with_salt = substr($hashPassword, 6);
$hash_with_salt = base64_decode($base_64_hash_with_salt); $hash_with_salt = base64_decode($base_64_hash_with_salt);

View File

@ -5,36 +5,40 @@ namespace App\Security;
use App\Entity\User; use App\Entity\User;
use App\Security\Hasher\PasswordEncoder; use App\Security\Hasher\PasswordEncoder;
use App\Service\SQLLoginService; use App\Service\SQLLoginService;
use App\SQLLogin\Exception\DataToFetchConfigurationException;
use App\SQLLogin\Exception\EmptyResultException;
use App\SQLLogin\Exception\InvalidSQLPasswordException; use App\SQLLogin\Exception\InvalidSQLPasswordException;
use App\SQLLogin\Exception\SecurityPatternConfigurationException;
use App\SQLLogin\SQLLoginRequest;
use PDOException; use PDOException;
use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator; use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\RememberMeBadge; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\RememberMeBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge; use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport; use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
class SQLLoginUserAuthenticator extends AbstractLoginFormAuthenticator class SQLLoginUserAuthenticator extends AbstractLoginFormAuthenticator
{ {
public const LOGIN_ROUTE = 'app_login'; public const LOGIN_ROUTE = 'app_login';
public const ERROR_LOGIN = 'error_login'; public const ERROR_LOGIN = 'error_login';
public const ERROR_PASSWORD = 'error_password'; public const TECHNICAL_ERROR = 'technical_error';
public const ERROR_SQL_LOGIN = 'error_sql_login';
protected string $baseUrl; private string $baseUrl;
private SQLLoginService $sqlLoginService;
private PasswordEncoder $passwordHasher;
public function __construct(string $baseUrl, SQLLoginService $sqlLoginService, PasswordEncoder $passwordHasher) public function __construct(
{ string $baseUrl,
private SQLLoginService $sqlLoginService,
private PasswordEncoder $passwordHasher,
private SQLLoginRequest $sqlLoginRequest
) {
$this->baseUrl = $baseUrl; $this->baseUrl = $baseUrl;
$this->sqlLoginService = $sqlLoginService; $this->sqlLoginService = $sqlLoginService;
$this->passwordHasher = $passwordHasher; $this->passwordHasher = $passwordHasher;
$this->sqlLoginRequest = $sqlLoginRequest;
} }
/** /**
@ -47,38 +51,57 @@ class SQLLoginUserAuthenticator extends AbstractLoginFormAuthenticator
return self::LOGIN_ROUTE === $request->attributes->get('_route') && $request->isMethod('POST'); return self::LOGIN_ROUTE === $request->attributes->get('_route') && $request->isMethod('POST');
} }
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey): ?Response public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey): RedirectResponse
{ {
return new RedirectResponse($this->baseUrl.'/connect/login-accept'); return new RedirectResponse($this->baseUrl.'/connect/login-accept');
} }
public function onAuthenticationFailure(Request $request, AuthenticationException $exception): Response public function onAuthenticationFailure(Request $request, AuthenticationException $exception): RedirectResponse
{ {
$request->getSession()->set(Security::AUTHENTICATION_ERROR, $exception); $request->getSession()->set(Security::AUTHENTICATION_ERROR, $exception);
return new RedirectResponse($this->baseUrl.'/login'); return new RedirectResponse($this->baseUrl.'/login');
} }
public function authenticate(Request $request): Passport public function authenticate(Request $request): SelfValidatingPassport
{ {
$form = $request->request->get('login'); $form = $request->request->get('login');
$login = $form['login']; $login = $form['login'];
$plaintextPassword = $form['password']; $plaintextPassword = $form['password'];
$rememberMe = isset($form['_remember_me']) ? true : false; $rememberMe = isset($form['_remember_me']) ? true : false;
$session = $request->getSession();
try { try {
// requête préparée $datas = $this->sqlLoginService->fetchPasswordAndDatas($login);
list($remoteHashedPassword, $remoteSalt) = $this->sqlLoginService->fetchPassword($login); } catch (EmptyResultException $e) {
} catch (PDOException $e) { $session->set(self::ERROR_LOGIN, true);
$request->getSession()->set(self::ERROR_SQL_LOGIN, true); throw new AuthenticationException();
} catch (DataToFetchConfigurationException|PDOException $e) {
\Sentry\captureException($e);
$session->set(self::TECHNICAL_ERROR, true);
throw new AuthenticationException(); throw new AuthenticationException();
} }
if ($remoteHashedPassword) { $remoteHashedPassword = $datas[$this->sqlLoginRequest->getPasswordColumnName()];
unset($datas[$this->sqlLoginRequest->getPasswordColumnName()]);
$remoteSalt = null;
if ($this->sqlLoginRequest->getSaltColumnName() && isset($datas[$this->sqlLoginRequest->getSaltColumnName()])) {
$remoteSalt = $datas[$this->sqlLoginRequest->getSaltColumnName()];
unset($datas[$this->sqlLoginRequest->getSaltColumnName()]);
}
if (null === $remoteHashedPassword) {
$remoteHashedPassword = '';
}
try { try {
// Comparaison remote hash et hash du input password + salt // Comparaison remote hash et hash du input password + salt
$this->passwordHasher->verify($remoteHashedPassword, $plaintextPassword, $remoteSalt); $this->passwordHasher->verify($remoteHashedPassword, $plaintextPassword, $remoteSalt);
$attributes = $this->sqlLoginService->fetchDatas($login); } catch (InvalidSQLPasswordException $e) {
$user = new User($login, $remoteHashedPassword, $attributes, $rememberMe); $session->set(self::ERROR_LOGIN, true);
throw new AuthenticationException();
} catch (SecurityPatternConfigurationException $e) {
\Sentry\captureException($e);
$session->set(self::TECHNICAL_ERROR, true);
throw new AuthenticationException();
}
$user = new User($login, $remoteHashedPassword, $datas, $rememberMe);
$loader = function (string $userIdentifier) use ($user) { $loader = function (string $userIdentifier) use ($user) {
return $user->getLogin() == $userIdentifier ? $user : null; return $user->getLogin() == $userIdentifier ? $user : null;
}; };
@ -89,16 +112,6 @@ class SQLLoginUserAuthenticator extends AbstractLoginFormAuthenticator
$passport->setAttribute('attributes', $user->getAttributes()); $passport->setAttribute('attributes', $user->getAttributes());
return $passport; return $passport;
} catch (InvalidSQLPasswordException $e) {
$request->getSession()->set(self::ERROR_PASSWORD, true);
throw new AuthenticationException();
} catch (PDOException $e) {
$request->getSession()->set(self::ERROR_SQL_LOGIN, true);
throw new AuthenticationException();
}
}
$request->getSession()->set(self::ERROR_LOGIN, true);
throw new AuthenticationException();
} }
protected function getLoginUrl(Request $request): string protected function getLoginUrl(Request $request): string

View File

@ -31,7 +31,7 @@ class SQLLoginUserProvider implements UserProviderInterface
return $this->loadUserByIdentifier($username, null); return $this->loadUserByIdentifier($username, null);
} }
public function refreshUser(UserInterface $user) public function refreshUser(UserInterface $user): UserInterface|null
{ {
if (!$user instanceof User) { if (!$user instanceof User) {
throw new UnsupportedUserException(sprintf('Invalid user class "%s".', get_class($user))); throw new UnsupportedUserException(sprintf('Invalid user class "%s".', get_class($user)));
@ -40,7 +40,7 @@ class SQLLoginUserProvider implements UserProviderInterface
return $this->loadUserByIdentifier($user->getUserIdentifier(), $user); return $this->loadUserByIdentifier($user->getUserIdentifier(), $user);
} }
public function supportsClass(string $class) public function supportsClass(string $class): bool
{ {
return User::class === $class || is_subclass_of($class, User::class); return User::class === $class || is_subclass_of($class, User::class);
} }

View File

@ -2,72 +2,62 @@
namespace App\Service; namespace App\Service;
use App\SQLLogin\Exception\EmptyResultException;
use App\SQLLogin\SQLLoginConnect; use App\SQLLogin\SQLLoginConnect;
use App\SQLLogin\SQLLoginRequest; use App\SQLLogin\SQLLoginRequest;
use PDO; use PDO;
use PDOException; use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class SQLLoginService extends AbstractController class SQLLoginService extends AbstractController
{ {
public SQLLoginRequest $sqlLoginRequest; public const MAX_RETRY = 3;
public function __construct(SQLLoginRequest $sqlLoginRequest) public function __construct(
{ private SQLLoginRequest $sqlLoginRequest,
private LoggerInterface $loggerInterface
) {
$this->sqlLoginRequest = $sqlLoginRequest; $this->sqlLoginRequest = $sqlLoginRequest;
$this->loggerInterface = $loggerInterface;
} }
public function fetchDatas($login) public function fetchPasswordAndDatas(string $login): array
{ {
try { $dataRequest = $this->sqlLoginRequest->getDatasRequest();
$dbh = $this->getConnection(); $datas = $this->executeRequestWithLogin($dataRequest, $login);
// forge de la requête
$request = $this->sqlLoginRequest->getRequestScope(); return $datas;
// Préparation de la requête }
$query = $dbh->prepare($request);
private function executeRequestWithLogin(string $request, string $login): array
{
$attempt = 0;
while ($attempt < self::MAX_RETRY) {
$pdo = $this->getConnection();
$query = $pdo->prepare($request);
$query->execute([$this->sqlLoginRequest->getLoginColumnName() => $login]); $query->execute([$this->sqlLoginRequest->getLoginColumnName() => $login]);
$datas = $query->fetch(PDO::FETCH_ASSOC); $datas = $query->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) { $query->closeCursor();
\Sentry\captureException($e); if (false === $datas) {
usleep(3000);
throw new PDOException(); ++$attempt;
} else {
break;
}
}
if (self::MAX_RETRY === $attempt) {
throw new EmptyResultException();
} }
return $datas; return $datas;
} }
/** private function getConnection(): PDO
* @param mixed $login
*
* @return bool
*/
public function fetchPassword($login)
{
try {
$dbh = $this->getConnection();
$request = $this->sqlLoginRequest->getRequestPassword();
$query = $dbh->prepare($request);
$query->execute([$this->sqlLoginRequest->getLoginColumnName() => $login]);
$password = $query->fetch(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
\Sentry\captureException($e);
throw new PDOException();
}
if ($password) {
return [
$password[$this->sqlLoginRequest->getPasswordColumnName()],
isset($password[$this->sqlLoginRequest->getSaltColumnName()]) ? $password[$this->sqlLoginRequest->getSaltColumnName()] : null,
];
}
return false;
}
public function getConnection()
{ {
// Appel du singleton // Appel du singleton
$sqlLogin = SQLLoginConnect::getInstance(); $sqlLogin = SQLLoginConnect::getInstance();
// Connection bdd $pdo = $sqlLogin->connect($this->sqlLoginRequest->getDatabaseDsn(), $this->sqlLoginRequest->getDbUser(), $this->sqlLoginRequest->getDbPassword());
return $sqlLogin->connect($this->sqlLoginRequest->getDatabaseDsn(), $this->sqlLoginRequest->getDbUser(), $this->sqlLoginRequest->getDbPassword());
return $pdo;
} }
} }

212
symfony.lock Normal file
View File

@ -0,0 +1,212 @@
{
"doctrine/annotations": {
"version": "1.14",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "1.0",
"ref": "a2759dd6123694c8d901d0ec80006e044c2e6457"
},
"files": [
"config/routes/annotations.yaml"
]
},
"php-http/discovery": {
"version": "1.19",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "1.18",
"ref": "f45b5dd173a27873ab19f5e3180b2f661c21de02"
},
"files": [
"config/packages/http_discovery.yaml"
]
},
"sentry/sentry-symfony": {
"version": "4.14",
"recipe": {
"repo": "github.com/symfony/recipes-contrib",
"branch": "main",
"version": "4.6",
"ref": "153de5f041f7e8a9c19f3674b800b76be0e6fd90"
},
"files": [
"config/packages/sentry.yaml"
]
},
"symfony/apache-pack": {
"version": "1.0",
"recipe": {
"repo": "github.com/symfony/recipes-contrib",
"branch": "main",
"version": "1.0",
"ref": "0f18b4decdf5695d692c1d0dfd65516a07a6adf1"
},
"files": [
"public/.htaccess"
]
},
"symfony/console": {
"version": "5.4",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "5.3",
"ref": "1781ff40d8a17d87cf53f8d4cf0c8346ed2bb461"
},
"files": [
"bin/console"
]
},
"symfony/debug-bundle": {
"version": "5.4",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "5.3",
"ref": "5aa8aa48234c8eb6dbdd7b3cd5d791485d2cec4b"
},
"files": [
"config/packages/debug.yaml"
]
},
"symfony/flex": {
"version": "1.21",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "1.0",
"ref": "146251ae39e06a95be0fe3d13c807bcf3938b172"
},
"files": [
".env"
]
},
"symfony/framework-bundle": {
"version": "5.4",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "5.4",
"ref": "3cd216a4d007b78d8554d44a5b1c0a446dab24fb"
},
"files": [
"config/packages/cache.yaml",
"config/packages/framework.yaml",
"config/preload.php",
"config/routes/framework.yaml",
"config/services.yaml",
"public/index.php",
"src/Controller/.gitignore",
"src/Kernel.php"
]
},
"symfony/lock": {
"version": "5.4",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "5.2",
"ref": "8e937ff2b4735d110af1770f242c1107fdab4c8e"
},
"files": [
"config/packages/lock.yaml"
]
},
"symfony/routing": {
"version": "5.4",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "5.3",
"ref": "85de1d8ae45b284c3c84b668171d2615049e698f"
},
"files": [
"config/packages/routing.yaml",
"config/routes.yaml"
]
},
"symfony/security-bundle": {
"version": "5.4",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "5.3",
"ref": "98f1f2b0d635908c2b40f3675da2d23b1a069d30"
},
"files": [
"config/packages/security.yaml"
]
},
"symfony/translation": {
"version": "5.4",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "5.3",
"ref": "e28e27f53663cc34f0be2837aba18e3a1bef8e7b"
},
"files": [
"config/packages/translation.yaml",
"translations/.gitignore"
]
},
"symfony/twig-bundle": {
"version": "5.4",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "5.4",
"ref": "bb2178c57eee79e6be0b297aa96fc0c0def81387"
},
"files": [
"config/packages/twig.yaml",
"templates/base.html.twig"
]
},
"symfony/validator": {
"version": "5.4",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "5.3",
"ref": "c32cfd98f714894c4f128bb99aa2530c1227603c"
},
"files": [
"config/packages/validator.yaml"
]
},
"symfony/web-profiler-bundle": {
"version": "5.4",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "5.3",
"ref": "24bbc3d84ef2f427f82104f766014e799eefcc3e"
},
"files": [
"config/packages/web_profiler.yaml",
"config/routes/web_profiler.yaml"
]
},
"symfony/webpack-encore-bundle": {
"version": "1.17",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "1.10",
"ref": "eff2e505d4557c967b6710fe06bd947ba555cae5"
},
"files": [
"assets/app.js",
"assets/bootstrap.js",
"assets/controllers.json",
"assets/controllers/hello_controller.js",
"assets/styles/app.css",
"config/packages/webpack_encore.yaml",
"package.json",
"webpack.config.js"
]
}
}

View File

@ -12,7 +12,7 @@
</div> </div>
{% endif %} {% endif %}
<div class="lang"> <div class="lang">
{% for locale in locales|split(',') %} {% for locale in locales %}
<a href="{{ path('locale_change', {'locale':locale }) }}" title="{{locale}}" aria-label="{{locale}}" class="flag"><img class="w-10" src="{{ asset('flags/'~ locale ~'.svg') }}"/></a> <a href="{{ path('locale_change', {'locale':locale }) }}" title="{{locale}}" aria-label="{{locale}}" class="flag"><img class="w-10" src="{{ asset('flags/'~ locale ~'.svg') }}"/></a>
{% endfor %} {% endfor %}
</div> </div>

View File

@ -1,5 +0,0 @@
form:
label:
login: login
password: Password
remember_me: Remember me

View File

@ -1,5 +0,0 @@
form:
label:
login: Login
password: Mot de passe
remember_me: Se souvenir de moi

View File

@ -7,15 +7,11 @@
<body> <body>
<trans-unit id="fXVg5Zq" resname="error.login"> <trans-unit id="fXVg5Zq" resname="error.login">
<source>error.login</source> <source>error.login</source>
<target>Incorrect login</target> <target>Incorrect login or password</target>
</trans-unit> </trans-unit>
<trans-unit id="8VJKwdK" resname="error.password"> <trans-unit id="1QRR4uA" resname="error.technical">
<source>error.password</source> <source>error.technical</source>
<target>Incorrect password</target> <target>A technical error happened, try again later</target>
</trans-unit>
<trans-unit id="lBole_G" resname="error.pdo">
<source>error.pdo</source>
<target>Connection to database encountered a problem</target>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -1,4 +0,0 @@
error:
login: 'Incorrect login'
password: 'Incorrect password'
sql_login: 'Connection to database encountered a problem'

View File

@ -7,15 +7,11 @@
<body> <body>
<trans-unit id="fXVg5Zq" resname="error.login"> <trans-unit id="fXVg5Zq" resname="error.login">
<source>error.login</source> <source>error.login</source>
<target>Login incorrect ou inconnu</target> <target>Login ou mot de passe inconnu</target>
</trans-unit> </trans-unit>
<trans-unit id="8VJKwdK" resname="error.password"> <trans-unit id="1QRR4uA" resname="error.technical">
<source>error.password</source> <source>error.technical</source>
<target>Mot de passe incorrect</target> <target>Une erreur technique s'est produite, rééssayez plus tard</target>
</trans-unit>
<trans-unit id="lBole_G" resname="error.pdo">
<source>error.pdo</source>
<target>La connexion à la base de déonnées à rencontré un problème</target>
</trans-unit> </trans-unit>
</body> </body>
</file> </file>

View File

@ -1,4 +0,0 @@
error:
login: 'Login incorrect ou inconnu'
password: 'Mot de passe incorrect'
sql_login: 'La connexion à la base de données a rencontré un problème'

View File

@ -405,6 +405,30 @@
<source>The value of the netmask should be between {{ min }} and {{ max }}.</source> <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
<target>The value of the netmask should be between {{ min }} and {{ max }}.</target> <target>The value of the netmask should be between {{ min }} and {{ max }}.</target>
</trans-unit> </trans-unit>
<trans-unit id="O5pay9e" resname="The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.">
<source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
<target>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</target>
</trans-unit>
<trans-unit id="f_lviDt" resname="The password strength is too low. Please use a stronger password.">
<source>The password strength is too low. Please use a stronger password.</source>
<target>The password strength is too low. Please use a stronger password.</target>
</trans-unit>
<trans-unit id="xfCh6.k" resname="This value contains characters that are not allowed by the current restriction-level.">
<source>This value contains characters that are not allowed by the current restriction-level.</source>
<target>This value contains characters that are not allowed by the current restriction-level.</target>
</trans-unit>
<trans-unit id="x15dlan" resname="Using invisible characters is not allowed.">
<source>Using invisible characters is not allowed.</source>
<target>Using invisible characters is not allowed.</target>
</trans-unit>
<trans-unit id="2NiS4YC" resname="Mixing numbers from different scripts is not allowed.">
<source>Mixing numbers from different scripts is not allowed.</source>
<target>Mixing numbers from different scripts is not allowed.</target>
</trans-unit>
<trans-unit id="W8N1HuG" resname="Using hidden overlay characters is not allowed.">
<source>Using hidden overlay characters is not allowed.</source>
<target>Using hidden overlay characters is not allowed.</target>
</trans-unit>
<trans-unit id=".SEaaBa" resname="This form should not contain extra fields."> <trans-unit id=".SEaaBa" resname="This form should not contain extra fields.">
<source>This form should not contain extra fields.</source> <source>This form should not contain extra fields.</source>
<target>This form should not contain extra fields.</target> <target>This form should not contain extra fields.</target>

View File

@ -405,6 +405,30 @@
<source>The value of the netmask should be between {{ min }} and {{ max }}.</source> <source>The value of the netmask should be between {{ min }} and {{ max }}.</source>
<target>La valeur du masque de réseau doit être comprise entre {{ min }} et {{ max }}.</target> <target>La valeur du masque de réseau doit être comprise entre {{ min }} et {{ max }}.</target>
</trans-unit> </trans-unit>
<trans-unit id="O5pay9e" resname="The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.">
<source>The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less.</source>
<target>Le nom du fichier est trop long. Il doit contenir au maximum {{ filename_max_length }} caractère.|Le nom de fichier est trop long. Il doit contenir au maximum {{ filename_max_length }} caractères.</target>
</trans-unit>
<trans-unit id="f_lviDt" resname="The password strength is too low. Please use a stronger password.">
<source>The password strength is too low. Please use a stronger password.</source>
<target>La force du mot de passe est trop faible. Veuillez utiliser un mot de passe plus fort.</target>
</trans-unit>
<trans-unit id="xfCh6.k" resname="This value contains characters that are not allowed by the current restriction-level.">
<source>This value contains characters that are not allowed by the current restriction-level.</source>
<target>Cette valeur contient des caractères qui ne sont pas autorisés par le niveau de restriction actuel.</target>
</trans-unit>
<trans-unit id="x15dlan" resname="Using invisible characters is not allowed.">
<source>Using invisible characters is not allowed.</source>
<target>Utiliser des caractères invisibles n'est pas autorisé.</target>
</trans-unit>
<trans-unit id="2NiS4YC" resname="Mixing numbers from different scripts is not allowed.">
<source>Mixing numbers from different scripts is not allowed.</source>
<target>Mélanger des chiffres provenant de différents scripts n'est pas autorisé.</target>
</trans-unit>
<trans-unit id="W8N1HuG" resname="Using hidden overlay characters is not allowed.">
<source>Using hidden overlay characters is not allowed.</source>
<target>Utiliser des caractères de superposition cachés n'est pas autorisé.</target>
</trans-unit>
<trans-unit id=".SEaaBa" resname="This form should not contain extra fields."> <trans-unit id=".SEaaBa" resname="This form should not contain extra fields.">
<source>This form should not contain extra fields.</source> <source>This form should not contain extra fields.</source>
<target>Ce formulaire ne doit pas contenir de champs supplémentaires.</target> <target>Ce formulaire ne doit pas contenir de champs supplémentaires.</target>

View File

@ -13,6 +13,22 @@
<source>submit</source> <source>submit</source>
<target>Submit</target> <target>Submit</target>
</trans-unit> </trans-unit>
<trans-unit id="LpHwdkN" resname="view.base.title">
<source>view.base.title</source>
<target>Hydra SQL</target>
</trans-unit>
<trans-unit id="DjhkdFJ" resname="view.login.title">
<source>view.login.title</source>
<target>Sign in</target>
</trans-unit>
<trans-unit id="UkVIwCA" resname="view.error.title">
<source>view.error.title</source>
<target>Error</target>
</trans-unit>
<trans-unit id="bmlMAb9" resname="view.error.text">
<source>view.error.text</source>
<target>Error</target>
</trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>

View File

@ -1,2 +0,0 @@
sign_in: Please, sign in
submit: Submit

View File

@ -13,6 +13,22 @@
<source>submit</source> <source>submit</source>
<target>Valider</target> <target>Valider</target>
</trans-unit> </trans-unit>
<trans-unit id="LpHwdkN" resname="view.base.title">
<source>view.base.title</source>
<target>Hydra SQL</target>
</trans-unit>
<trans-unit id="DjhkdFJ" resname="view.login.title">
<source>view.login.title</source>
<target>Identifiez-vous</target>
</trans-unit>
<trans-unit id="UkVIwCA" resname="view.error.title">
<source>view.error.title</source>
<target>Erreur</target>
</trans-unit>
<trans-unit id="bmlMAb9" resname="view.error.text">
<source>view.error.text</source>
<target>Erreur</target>
</trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>

View File

@ -1,2 +0,0 @@
sign_in: Connectez-vous
submit: Valider