113 Commits

Author SHA1 Message Date
5f2654c3c4 Merge pull request 'symfony 6.4 and PHP 8.4 upgrade' (#58) from issue-57 into develop
Some checks failed
Cadoles/hydra-sql/pipeline/head There was a failure building this commit
Reviewed-on: #58
2025-07-30 11:46:02 +02:00
2e5e1e72ae chore(symfony) #57 : bump symfony to version 6.4 and fix deprecations
Some checks are pending
Cadoles/hydra-sql/pipeline/pr-develop Build started...
2025-07-30 11:37:06 +02:00
746ca35b69 chore(php) #57 : bump PHP version to 8.4 2025-07-10 11:40:56 +02:00
1f49b3f56f Merge pull request 'fix (altcha) #4827 : correction traduction' (#56) from issue-4827-fix into develop
Some checks failed
Cadoles/hydra-sql/pipeline/head There was a failure building this commit
Reviewed-on: #56
2025-06-26 15:38:15 +02:00
e0ae569e95 fix (altcha) #4827 : correction traduction
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
2025-06-26 14:57:29 +02:00
ab37dfb02e Merge pull request 'feat (altcha) #4827 upgrade d'altcha en v2' (#55) from issue-4827 into develop
Some checks failed
Cadoles/hydra-sql/pipeline/head There was a failure building this commit
Reviewed-on: #55
2025-06-20 15:16:46 +02:00
f5d3a8d83b feat (altcha) #4827 upgrade d'altcha en v2
Some checks are pending
Cadoles/hydra-sql/pipeline/pr-develop Build started...
2025-06-20 15:11:58 +02:00
646c346537 Merge pull request 'feat(caddy) #27-SC : update symfony containers image to filter caddy files' (#54) from issue-27-SC-caddy-logs into develop
Some checks failed
Cadoles/hydra-sql/pipeline/head There was a failure building this commit
Reviewed-on: #54
2025-06-13 13:32:34 +02:00
a45b9ddaec feat(caddy) #27-SC : update symfony containers image to filter caddy files
Some checks failed
Cadoles/hydra-sql/pipeline/head There was a failure building this commit
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
2025-06-12 11:22:03 +02:00
64d1c1c7a9 Merge pull request 'Sprint-6 : Update symfony containers' (#46) from symfony-container-update into develop
Some checks failed
Cadoles/hydra-sql/pipeline/head There was a failure building this commit
Reviewed-on: #46
Reviewed-by: vfebvre <vfebvre@cadoles.com>
2025-05-12 13:03:24 +02:00
d7dfdea0e2 fix(security): bump alpine version to fix vulnerabilities 2025-05-12 12:56:38 +02:00
11468596dd feat : update dev environment
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
2025-05-02 14:00:29 +02:00
0c0667fb33 fix : theme script location moved to assets 2025-05-02 14:00:29 +02:00
176a6a8e68 chore : update symfony containers ref 2025-05-02 14:00:29 +02:00
7825f5246f bump symfony containers ref 2025-05-02 14:00:29 +02:00
8589c385d6 update package-lock file 2025-05-02 14:00:29 +02:00
5e849ae6f5 chore : Simplification de la conf webpack 2025-05-02 14:00:29 +02:00
fe12b4fc69 Correctif theme 2025-05-02 14:00:29 +02:00
642f56dafa Update symfony containers 2025-05-02 14:00:29 +02:00
945a558565 Merge pull request 'remove altcha feature flag for security' (#53) from issue-4543-bis into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #53
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2025-04-15 10:07:13 +02:00
79337efef0 feat(altcha): remove feature flag for security
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2025-04-14 16:33:12 +02:00
303b0279f8 Merge pull request 'mse#4543 - Add altcha to login form and its feature flag to disable it' (#52) from 4543-add-altcha-to-login into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #52
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2025-04-10 16:12:21 +02:00
12523398f6 feat(altcha): add altcha validation layer to login
Some checks are pending
Cadoles/hydra-sql/pipeline/pr-develop Build started...
2025-04-10 16:01:22 +02:00
1cb5ae6bc3 feat(altcha): add altcha and update dependencies
Some checks failed
Cadoles/hydra-sql/pipeline/head There was a failure building this commit
2025-03-24 13:51:37 +01:00
7239d841d4 Merge pull request 'ANO - Suppresion du lower sur la colonne mail de la requête suite au login, traitement du lwoer en PHP' (#51) from fix-lower-mail into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #51
2025-03-07 14:15:40 +01:00
a5d5a18190 fix(mail): suppresion du lower sur la colonne mail de la requête suite au login, traitement du lwoer en PHP
Some checks are pending
Cadoles/hydra-sql/pipeline/head Build started...
Cadoles/hydra-sql/pipeline/pr-develop Build started...
2025-03-07 14:01:40 +01:00
075be9b0df Merge pull request 'recherche login lower dans requête de connexion' (#48) from issue-47 into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #48
2024-11-06 11:13:10 +01:00
4e4c5d8e7b recherche login lower dans requête de connexion
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
Cadoles/hydra-sql/pipeline/head This commit is unstable
2024-11-06 10:22:48 +01:00
7032787d8c Merge pull request 'fix login sql : ajout d'un retry sur le login, suppression des options' (#45) from retour-43 into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit was not built
Reviewed-on: #45
2024-10-14 10:40:12 +02:00
999e708ff7 modification gestion des exceptions
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
2024-10-11 15:09:52 +02:00
cb8361e7d1 optimisation appel pdo, retry consent
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
2024-10-11 13:25:21 +02:00
e3f406a8bb fix resultat null vaut login inconnu
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
2024-10-10 16:32:46 +02:00
d6d9e81df6 fix login sql : ajout d'un retry sur le login, suppression des options
Some checks failed
Cadoles/hydra-sql/pipeline/head This commit is unstable
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
2024-10-10 12:01:15 +02:00
8e56433216 Merge pull request 'feat: ajout du packet xdebug à l'image' (#42) from xdebug into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #42
2024-10-10 10:26:21 +02:00
19178bbe3b fix typo
Some checks are pending
Cadoles/hydra-sql/pipeline/pr-develop Build started...
2024-10-10 10:25:34 +02:00
14668150cb Merge pull request 'modification requete de fetch à la bdd #43' (#44) from issue-43 into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit was not built
Reviewed-on: #44
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2024-10-10 10:01:29 +02:00
0903151f27 chore (authenticator) #43 : fix isset variable
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
2024-10-09 11:57:10 +02:00
f378751f7a chore (maj) #43 : ajout package debug, révision docker-compose pour environnement standalone
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
Cadoles/hydra-sql/pipeline/head This commit is unstable
2024-10-08 14:38:19 +02:00
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
f39ab1626e feat: ajout du packet xdebug à l'image
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
Cadoles/hydra-sql/pipeline/head This commit is unstable
2024-10-07 11:22:17 +02:00
fe4d683c20 Merge pull request 'fix code quality, typage, php-csfixer' (#41) from fix-code-quality into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #41
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2024-09-24 13:00:50 +02:00
f36a675d22 fix code quality, typage, php-csfixer
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
Cadoles/hydra-sql/pipeline/head This commit is unstable
2024-09-24 11:47:52 +02:00
27f957124b Merge pull request 'chore (fetch datas) #39 : fermeture connexion sql après login$' (#40) from issue-39 into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit was not built
Reviewed-on: #40
2024-09-24 10:37:15 +02:00
a1049a55a2 issue-39 : close cursor pour requête password
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
2024-09-24 10:32:05 +02:00
085533b299 chore (fetch datas) #39 : fermeture connexion sql après login$
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
Cadoles/hydra-sql/pipeline/head This commit is unstable
2024-09-23 17:02:01 +02:00
5bfd8991ee update symfony-container ref
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
2024-07-25 10:26:33 +02:00
18c0edbe5b Merge pull request 'feat : Ajout expression de réecriture du subject paramétrable' (#38) from rewrite_sub_expression into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit was not built
Reviewed-on: #38
2024-07-25 10:25:10 +02:00
fa77278c55 Fix : retrait de l'expression dans la config d'exemple
Some checks reported warnings
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2024-07-25 09:48:20 +02:00
daa5eaaa63 feat : Ajout expression de réecriture du subject paramétrable
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2024-07-24 16:41:22 +02:00
769e7ed59e Merge pull request 'fix: vérification du mdp en cas de mdp non défini' (#37) from issue-mse-3699 into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #37
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2024-06-06 13:43:13 +02:00
abe212c7ad fix: vérification du mdp en cas de mdp non défini
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2024-06-06 10:36:21 +02:00
890c44da0c Merge pull request 'chore (multi lanque) #35: correction twig yaml pour langues acceptées' (#36) from issue-35 into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #36
2024-05-21 10:50:19 +02:00
4465d0097e chore (multi lanque) #35: correction twig yaml pour langues acceptées
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2024-05-17 11:32:51 +02:00
f9d7e94420 fix: update symfony-containers ref
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
2024-04-29 14:16:47 +02:00
e03312be7d update symofny-containers
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
2024-04-29 11:47:26 +02:00
69f0a607a3 Merge pull request 'complément logs et exceptions' (#20) from issue-19 into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #20
2024-04-29 11:33:16 +02:00
51c92a0dba feat (gestion exception) #19: modification fetchPassword
Some checks reported warnings
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2024-04-29 11:09:58 +02:00
0791727694 feat (gestion exceptions) #19: traitement retour: typage, un seul message pour erreur login ou mdp
Some checks reported warnings
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2024-04-29 10:44:38 +02:00
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
5aacd981b4 issue-19: ajout de logs des exceptions PDOExceptions 2024-04-29 10:07:44 +02:00
fc4cecf106 Merge pull request 'Mise à jour des traductions' (#34) from issue-33 into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #34
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2024-04-25 11:27:23 +02:00
d26920695f Merge pull request 'Vérification challenge dans la session #31' (#32) from issue-31 into develop
Some checks reported errors
Cadoles/hydra-sql/pipeline/head Something is wrong with the build of this commit
Reviewed-on: #32
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2024-04-25 11:27:00 +02:00
fc348943c8 feat (compose): maj des volumes de docker-compose
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2024-04-23 12:06:51 +02:00
afd5349a7c chore (translations) : Suppression des fichiers traduction yaml 2024-04-23 12:06:06 +02:00
562c7cb7b7 fix (translations): Ajout des traductions manquantes 2024-04-23 12:05:40 +02:00
bcc91a17b4 fix (oidc timeout) #31: ajout d'une règle de redirection en cas de donnée de session perdue
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2024-04-18 17:13:42 +02:00
cd888d2080 chore (images) #31: maj droits et env 2024-04-18 17:12:28 +02:00
0cdb4c3a36 chore (composer update) #31: maj composer update 2024-04-18 17:11:23 +02:00
fc87b24c4e Merge pull request 'chore(caddy): passage à caddy' (#30) from cmsassot-caddy into develop
All checks were successful
Cadoles/hydra-sql/pipeline/head This commit looks good
Reviewed-on: #30
Reviewed-by: Matthieu Lamalle <mlamalle@cadoles.com>
2024-04-02 09:53:55 +02:00
d1847289bd feat(Dockefile): modification ref tag
All checks were successful
Cadoles/hydra-sql/pipeline/pr-develop This commit looks good
2024-03-29 11:20:28 +01:00
d5718e0a39 feat(node): updated depencies
Some checks reported warnings
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2024-03-29 09:44:38 +01:00
8cde31fc9c chore(caddy): passage à caddy
Some checks reported warnings
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2024-03-28 11:13:41 +01:00
9420354ec0 Merge pull request 'ajout url_link pour personnalisation theme' (#29) from url_link into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #29
2024-01-16 11:46:33 +01:00
e320d288cc ajout url_link pour personnalisation theme
Some checks are pending
Cadoles/hydra-sql/pipeline/head Build started...
Cadoles/hydra-sql/pipeline/pr-develop Build started...
2024-01-16 11:45:59 +01:00
740a7569e4 Merge pull request 'issue-21: actualisation de l'environnement de dev et maj des dépendances' (#27) from issue-21 into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #27
2023-12-14 11:07:39 +01:00
6ec21e4677 maj gitignore
Some checks are pending
Cadoles/hydra-sql/pipeline/pr-develop Build started...
2023-12-14 11:07:16 +01:00
3be77eabf5 maj readme et correction env var
Some checks reported warnings
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2023-12-14 10:57:24 +01:00
b5de7ee873 correction phpstan
Some checks reported warnings
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2023-12-14 10:25:22 +01:00
341a1ecd87 issue-21: actualisation de l'env de dev et maj dépendances
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2023-12-13 15:52:43 +01:00
72e912facb Merge pull request 'Maj env et doc' (#26) from redis-sentinel into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #26
2023-12-12 08:48:57 +01:00
abb1adecb7 Maj env et doc
Some checks are pending
Cadoles/hydra-sql/pipeline/head Build started...
Cadoles/hydra-sql/pipeline/pr-develop Build started...
2023-12-12 08:47:41 +01:00
cc03fd808c Merge pull request 'Utilisation des symfony-containers, et publication sur reg.cadoles' (#25) from tech into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #25
2023-12-11 14:50:20 +01:00
56373b7725 feat: keep up with technical debt
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2023-12-11 14:41:20 +01:00
c7d1fb4ef3 feat: keep up with technical recommandations 2023-12-11 14:33:28 +01:00
3b4e0762c2 Merge pull request 'Ajout health path' (#23) from health into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #23
2023-12-11 14:18:47 +01:00
df59f29fc2 ajout commentaire
Some checks reported warnings
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2023-12-11 14:13:35 +01:00
47917abafb typo
Some checks reported warnings
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2023-12-11 14:07:40 +01:00
d2925fbd49 Ajout health path
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2023-12-11 13:57:15 +01:00
ba63c271f9 Merge pull request 'issue-12: implémentation redis pour la gestion des session' (#13) from issue-12 into develop
All checks were successful
Cadoles/hydra-sql/pipeline/head This commit looks good
Reviewed-on: #13
2023-06-14 16:08:34 +02:00
a83e8d07ef issue-12: implémentation redis pour la gestion des session
All checks were successful
Cadoles/hydra-sql/pipeline/pr-develop This commit looks good
Cadoles/hydra-sql/pipeline/head This commit looks good
2023-06-12 15:26:56 +02:00
8d52721172 Merge pull request 'fix verify password methode ssha' (#11) from themeConfig into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #11
2023-01-11 10:32:41 +01:00
39829ca6a1 fix verify password methode ssha
Some checks are pending
Cadoles/hydra-sql/pipeline/pr-develop Build started...
Cadoles/hydra-sql/pipeline/head This commit looks good
2023-01-11 10:30:24 +01:00
05a3ddd7cd Merge pull request 'maj manifest' (#10) from themeConfig into develop
All checks were successful
Cadoles/hydra-sql/pipeline/head This commit looks good
Reviewed-on: #10
2023-01-10 17:04:05 +01:00
4b360cc2a0 maj manifest
Some checks are pending
Cadoles/hydra-sql/pipeline/pr-develop Build started...
Cadoles/hydra-sql/pipeline/head This commit looks good
2023-01-10 17:03:00 +01:00
82b40aec8a Merge pull request 'modification des assets pour theme' (#9) from themeConfig into develop
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Reviewed-on: #9
2023-01-10 15:26:24 +01:00
744b3c3c06 modification des assets pour theme
Some checks are pending
Cadoles/hydra-sql/pipeline/pr-develop Build started...
Cadoles/hydra-sql/pipeline/head This commit looks good
2023-01-10 15:24:53 +01:00
d7ada479c4 Merge pull request 'prise en compte du cookie_path' (#8) from issue-cookie into develop
All checks were successful
Cadoles/hydra-sql/pipeline/head This commit looks good
Reviewed-on: #8
2023-01-09 15:10:17 +01:00
df73cede0f prise en compte du cookie_path
Some checks are pending
Cadoles/hydra-sql/pipeline/pr-develop Build started...
Cadoles/hydra-sql/pipeline/head This commit looks good
2023-01-09 15:06:49 +01:00
b9648231ba Merge pull request 'ajout d'une methode spécifique à ssha' (#7) from method-ssha into develop
All checks were successful
Cadoles/hydra-sql/pipeline/head This commit looks good
Reviewed-on: #7
2023-01-06 17:07:42 +01:00
f19d68ae93 ajout d'une methode spécifique à ssha
Some checks are pending
Cadoles/hydra-sql/pipeline/pr-develop Build started...
Cadoles/hydra-sql/pipeline/head This commit looks good
2023-01-06 17:06:29 +01:00
437a40e309 Merge pull request 'modification de l'authenticator pour former l'url de login en comprenant le baseUrl' (#6) from loginForm into develop
All checks were successful
Cadoles/hydra-sql/pipeline/head This commit looks good
Reviewed-on: #6
2023-01-06 15:27:55 +01:00
e5a27850c3 modification de l'authenticator pour former l'url de login en comprenant le baseUrl
Some checks are pending
Cadoles/hydra-sql/pipeline/pr-develop Build started...
Cadoles/hydra-sql/pipeline/head This commit looks good
2023-01-06 15:26:53 +01:00
0996ce6402 Merge pull request 'baseUrl: utilisation baseUrl en cas de failure' (#5) from baseUrl2 into develop
All checks were successful
Cadoles/hydra-sql/pipeline/head This commit looks good
Reviewed-on: #5
2023-01-06 14:32:32 +01:00
9cd3190b53 baseUrl: utilisation baseUrl en cas de failure
Some checks are pending
Cadoles/hydra-sql/pipeline/pr-develop Build started...
Cadoles/hydra-sql/pipeline/head This commit looks good
2023-01-06 14:31:43 +01:00
597485586c Merge pull request 'baseUrl: modification pour la construction de l'url après acces, utilsation de baseUrl' (#4) from baseUrl into develop
All checks were successful
Cadoles/hydra-sql/pipeline/head This commit looks good
Reviewed-on: #4
2023-01-06 14:05:19 +01:00
a21bff82bc baseUrl: modification pour la construction de l'url après acces, utilsation de baseUrl
All checks were successful
Cadoles/hydra-sql/pipeline/pr-develop This commit looks good
Cadoles/hydra-sql/pipeline/head This commit looks good
2023-01-06 14:02:20 +01:00
84b72ccf18 Merge pull request 'maj: sémantique, révision vérification password' (#3) from maj into develop
All checks were successful
Cadoles/hydra-sql/pipeline/head This commit looks good
Reviewed-on: #3
2023-01-05 14:09:41 +01:00
03e15da862 maj: correction phpstan, optional param config must be behind
Some checks reported warnings
Cadoles/hydra-sql/pipeline/pr-develop This commit looks good
Cadoles/hydra-sql/pipeline/head This commit is unstable
2023-01-05 13:22:18 +01:00
b8fb01da5c maj: suppression commentaire inutile
All checks were successful
Cadoles/hydra-sql/pipeline/pr-develop This commit looks good
2023-01-05 12:13:08 +01:00
422e97d329 supression des fonctions liées à l'update du hashage de mot de passe
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
2022-12-16 16:49:24 +01:00
906d8edf82 fix faille twig, coding standard
Some checks failed
Cadoles/hydra-sql/pipeline/pr-develop There was a failure building this commit
2022-12-16 15:39:42 +01:00
bd1b035f1e ajout de l'updatde hashage selon algo indiqué en ver env, fix typo
Some checks reported warnings
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2022-12-16 15:00:14 +01:00
441c0f563c maj: sémantique, révision vérification ppassword
Some checks reported warnings
Cadoles/hydra-sql/pipeline/head This commit is unstable
Cadoles/hydra-sql/pipeline/pr-develop This commit is unstable
2022-12-14 16:43:44 +01:00
125 changed files with 5842 additions and 15504 deletions

View File

@ -1 +0,0 @@
Deny from all

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
Deny from all

17
.dockerignore Normal file
View File

@ -0,0 +1,17 @@
*
!/assets
!/bin
!/config
!/public
!/src
!/templates
!/translations
!/.env
!/composer.json
!/composer.lock
!/package-lock.json
!/package.json
!/symfony.lock
!/webpack.config.js
/public/build

24
.env
View File

@ -14,9 +14,9 @@
# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration
###> symfony/framework-bundle ###
APP_ENV=dev
APP_ENV=prod
APP_SECRET=406ccaa0c76a451fdcc2307ea146cbef
###< symfony/framework-bundle ###
URL_LINK="http://localhost"
# configuration bdd
DSN_REMOTE_DATABASE="pgsql:host='postgres';port=5432;dbname=lasql"
@ -29,14 +29,18 @@ BASE_URL='http://localhost:8080'
# connexion hydra
HYDRA_ADMIN_BASE_URL='http://hydra:4445'
APP_LOCALES="fr,en"
###> symfony/lock ###
# Choose one of the stores below
# postgresql+advisory://db_user:db_password@localhost/db_name
LOCK_DSN=flock
###< symfony/lock ###
SECURITY_PATTERN=
HASH_ALGO_LEGACY="sha256,ssha"
###> sentry/sentry-symfony ###
SENTRY_DSN=
###< sentry/sentry-symfony ###
REDIS_DSN=redis://redis:6379
### Altcha
ALTCHA_HOST='http://altcha:3333'
ALTCHA_BASE_URL=''
ALTCHA_DEBUG=false
ALTCHA_WORKERS=8
ALTCHA_DELAY=100
ALTCHA_MOCK_ERROR=false
ALTCHA_ENABLED=true

41
.gitignore vendored
View File

@ -1,3 +1,27 @@
/.env.local
/.env.local.php
/.env.*.local
/config/secrets/prod/prod.decrypt.private.php
/public/bundles/
/var/
/vendor
/tools/php-cs-fixer/vendor
/node_modules/
npm-debug.log
yarn-error.log
supervisord.log
supervisord.pid
composer.phar
/.vscode
/.cache
/.config
/.npm
/.local
/.bash_history
/tools
/.trivy
.mktools/
.php-cs-fixer.cache
###> symfony/framework-bundle ###
/.env.local
@ -6,21 +30,16 @@
/config/secrets/prod/prod.decrypt.private.php
/public/bundles/
/var/
/vendor/
###< symfony/framework-bundle ###
supervisord.log
supervisord.pid
/vendor
/tools/php-cs-fixer/vendor
###> symfony/webpack-encore-bundle ###
/node_modules/
/public/build/
npm-debug.log
yarn-error.log
###< symfony/webpack-encore-bundle ###
/.vscode
/.cache
/.config
/.npm
/.local
supervisord.log
supervisord.pid
###> phpstan/phpstan ###
phpstan.neon
###< phpstan/phpstan ###

View File

@ -1 +0,0 @@
Deny from all

View File

@ -1,2 +0,0 @@
0edbcb2d5794fb8d3cf2402f19f25438805a970f {"key":"make-fetch-happen:request-cache:https://registry.npmjs.org/npm","integrity":"sha512-1TJYoof98S3R0ahPa565wn2XsDI+CaLbvwzx88tgsZ5DTcOmelEBX2A802NyU1UWsVXXmvHWLnEKIvBl6zWMVg==","time":1670943539811,"size":2046874,"metadata":{"time":1670943539263,"url":"https://registry.npmjs.org/npm","reqHeaders":{"accept":"application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*"},"resHeaders":{"cache-control":"public, max-age=300","content-type":"application/vnd.npm.install-v1+json","date":"Tue, 13 Dec 2022 14:58:59 GMT","etag":"\"3607fbc1a9bba44efd5bd54b34a79dd5\"","last-modified":"Wed, 07 Dec 2022 23:13:12 GMT","vary":"accept-encoding, accept"},"options":{"compress":true}}}

1
.nvmrc Normal file
View File

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

17
.trivyignore.yaml Normal file
View File

@ -0,0 +1,17 @@
vulnerabilities:
- id: CVE-2023-39325
paths:
- usr/local/bin/gomplate
statement: Not concerned
- id: CVE-2023-3978
paths:
- usr/local/bin/gomplate
statement: Not concerned
- id: CVE-2023-44487
paths:
- usr/local/bin/gomplate
statement: Not concerned
- id: GHSA-m425-mq94-257g
paths:
- usr/local/bin/gomplate
statement: Not concerned

11
.vscode/settings.json vendored
View File

@ -1,11 +0,0 @@
{
"git.ignoreLimitWarning": true,
"php-cs-fixer.executable": "tools/php-cs-fixer/vendor/bin/php-cs-fixer",
"php-cs-fixer.configFile": "tools/php-cs-fixer/.php-cs-fixer.dist.php",
"symfony-vscode.fileWatchingPatterns": [
"yml",
"yaml",
"xml"
]
}

23
Jenkinsfile vendored
View File

@ -4,4 +4,25 @@
// Utilisation du pipeline partagé pour les applications Symfony de Cadoles
// Le nom de l'image Docker passée en paramètre vous permet de préciser l'environnement de test
// de votre application Symfony
symfonyAppPipeline("ubuntu:20.04")
symfonyAppPipeline('ubuntu:25.04', [
'hooks': [
// Run docker image build, verification and publication stages
'postSymfonyAppPipeline': {
boolean isRelease = ["develop", "staging", "master"].contains(env.BRANCH_NAME)
stage('Build and publish hydra-sql standalone image') {
container.buildAndPublishImage([
'imageName': 'reg.cadoles.com/cadoles/hydra-sql-standalone',
'dockerfile': './misc/images/hydra-sql-standalone/Dockerfile',
'dryRun': !isRelease
])
}
stage('Build and publish hydra-sql base image') {
container.buildAndPublishImage([
'imageName': 'reg.cadoles.com/cadoles/hydra-sql-base',
'dockerfile': './misc/images/hydra-sql-base/Dockerfile',
'dryRun': !isRelease
])
}
}
]
])

View File

@ -1,46 +1,43 @@
CI_COMPOSE=FIXUID=$(shell id -u) FIXGID=$(shell id -g) docker-compose -f docker-compose.yml
HYDRA_SQL_SHELL_USER ?= www-data:
DOCKER_CMD ?=
DOCKER_IMAGE_NAME ?= login-app-sql_hydra-sql
up:
FIXUID=$(shell id -u) FIXGID=$(shell id -g) docker-compose up --build
down:
docker-compose down -v
IMAGE_REPO ?= reg.cadoles.com/cadoles
IMAGES_DIR := misc/images
IMAGES := $(foreach file, $(wildcard $(IMAGES_DIR)/*), $(basename $(notdir $(file))))
purge:
docker-compose down -v --remove-orphans --rmi local
TRIVY_ARGS ?=
hydra-sql-shell:
$(CI_COMPOSE) exec \
-u "$(HYDRA_SQL_SHELL_USER)" \
hydra-sql \
/bin/bash
php-cs-fixer:
PHP_CS_FIXER_IGNORE_ENV=1 tools/php-cs-fixer/vendor/bin/php-cs-fixer -v fix --config=./tools/php-cs-fixer/.php-cs-fixer.dist.php
build-image: $(foreach image, $(IMAGES), build-image-$(image))
APP_LOCALES ?= fr,en
HYDRA_ADMIN_BASE_URL ?= http://hydra:4445
TRUSTED_PROXIES ?= 127.0.0.1,REMOTE_ADDR,localhost
ISSUER_URL ?= http://localhost:8000
BASE_URL ?= http://localhost:8080
DB_USER ?= lasql
DB_PASSWORD ?= lasql
DEFAULT_LOCALE ?= fr
BDD ?= postgres
DSN_REMOTE_DATABASE=mysql:host=mariadb;port=3306;dbname=lasql
build-image-%:
docker build \
-t "${IMAGE_REPO}/$*:latest" \
-f ${IMAGES_DIR}/$*/Dockerfile \
.
up-mysql:
docker run \
-it --rm \
-p 8080:80 \
-e APP_LOCALES=$(APP_LOCALES) \
-e HYDRA_ADMIN_BASE_URL=$(HYDRA_ADMIN_BASE_URL) \
-e TRUSTED_PROXIES=$(TRUSTED_PROXIES) \
-e ISSUER_URL=$(ISSUER_URL) \
-e BASE_URL=$(BASE_URL) \
-e DB_USER=$(DB_USER) \
-e DB_PASSWORD=$(DB_PASSWORD) \
-e DEFAULT_LOCALE=$(DEFAULT_LOCALE) \
-e DSN_REMOTE_DATABASE=$(DSN_REMOTE_DATABASE) \
$(DOCKER_IMAGE_NAME):latest \
$(DOCKER_CMD)
scan-image: $(foreach image, $(IMAGES), scan-image-$(image))
scan-image-%: tools/trivy/bin/trivy
mkdir -p .trivy/.cache
tools/trivy/bin/trivy --cache-dir .trivy/.cache --ignorefile .trivyignore.yaml image $(TRIVY_ARGS) $(IMAGE_REPO)/$*:latest
release-image: $(foreach image, $(IMAGES), release-image-$(image))
release-image-%: .mktools
@[ ! -z "$(MKT_PROJECT_VERSION)" ] || ( echo "Just downloaded mktools. Please re-run command."; exit 1 )
docker tag "${IMAGE_REPO}/$*:latest" "${IMAGE_REPO}/$*:$(MKT_PROJECT_VERSION)"
docker tag "${IMAGE_REPO}/$*:latest" "${IMAGE_REPO}/$*:$(MKT_PROJECT_SHORT_VERSION)"
docker push "${IMAGE_REPO}/$*:$(MKT_PROJECT_VERSION)"
docker push "${IMAGE_REPO}/$*:$(MKT_PROJECT_SHORT_VERSION)"
docker push "${IMAGE_REPO}/$*:latest"
tools/trivy/bin/trivy:
mkdir -p tools/trivy/bin
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b ./tools/trivy/bin v0.47.0
.mktools:
rm -rf .mktools
curl -q https://forge.cadoles.com/Cadoles/mktools/raw/branch/master/install.sh | TASKS="version" $(SHELL)
-include .mktools/*.mk

View File

@ -8,5 +8,4 @@
// any CSS you import will output into a single css file (app.css in this case)
import './styles/app.scss';
// start the Stimulus application
import './bootstrap';
import 'altcha';

11
assets/bootstrap.js vendored
View File

@ -1,11 +0,0 @@
import { startStimulusApp } from '@symfony/stimulus-bridge';
// Registers Stimulus controllers from controllers.json and in the controllers/ directory
export const app = startStimulusApp(require.context(
'@symfony/stimulus-bridge/lazy-controller-loader!./controllers',
true,
/\.[jt]sx?$/
));
// register any custom, 3rd party controllers here
// app.register('some_controller_name', SomeImportedController);

View File

@ -1,4 +0,0 @@
{
"controllers": [],
"entrypoints": []
}

View File

@ -1,16 +0,0 @@
import { Controller } from '@hotwired/stimulus';
/*
* This is an example Stimulus controller!
*
* Any element with a data-controller="hello" attribute will cause
* this controller to be executed. The name "hello" comes from the filename:
* hello_controller.js -> "hello"
*
* Delete this file or adapt it for your use!
*/
export default class extends Controller {
connect() {
this.element.textContent = 'Hello Stimulus! Edit me in assets/controllers/hello_controller.js';
}
}

View File

@ -0,0 +1,5 @@
import './styles/theme.css'
import 'altcha';
import 'altcha/i18n/all';
import theme from './theme';

3
assets/theme.js Normal file
View File

@ -0,0 +1,3 @@
export default function theme() {
}

View File

@ -1,21 +1,18 @@
version: "3.8"
services:
hydra-sql:
container_name: hydra-sql
build:
context: ./containers/hydra-sql
context: .
dockerfile: ./misc/images/hydra-sql-standalone/Dockerfile
args:
- BASE_PATH=
- APP_ENV=dev
- ENCORE_MODE=dev
- HTTP_PROXY=${HTTP_PROXY}
- HTTPS_PROXY=${HTTPS_PROXY}
- http_proxy=${http_proxy}
- https_proxy=${https_proxy}
user: ${FIXUID:-1000}:${FIXGID:-1000}
ports:
- 8080:80
volumes:
- .:/var/www
- /etc/localtime:/etc/localtime:ro
- $HOME/.ssh:/root/.host-ssh:ro
- 8082:8071
tmpfs:
- /var/www/var/logs:uid=${FIXUID:-1000},gid=${FIXGID:-1000}
- /var/www/var/cache:uid=${FIXUID:-1000},gid=${FIXGID:-1000}
@ -23,21 +20,45 @@ services:
- /tmp
links:
- hydra
depends_on:
- redis
extra_hosts:
- "localhost:127.0.0.1"
- "localhost:host-gateway"
- "host.docker.internal:host-gateway"
develop:
watch:
- action: rebuild
path: ./misc/images/hydra-sql-standalone
- action: rebuild
path: ./assets
- action: sync
path: ./templates
target: /app/templates
- action: sync
path: ./translations
target: /app/translations
- action: sync
path: ./config
target: /app/config
- action: sync
path: ./src
target: /app/src
environment:
- APP_ENV=dev
- PHP_FPM_MEMORY_LIMIT=128m
- APP_LOCALES=fr,en
- HYDRA_ADMIN_BASE_URL=http://hydra:4445
- TRUSTED_PROXIES=127.0.0.1,REMOTE_ADDR,localhost
- ISSUER_URL=http://localhost:8000
- BASE_URL=http://localhost:8080
- BASE_URL=http://localhost:8082
- DB_USER=lasql
- DB_PASSWORD=lasql
- DEFAULT_LOCALE=fr
- DSN_REMOTE_DATABASE=pgsql:host='postgres';port=5432;dbname=lasql;
- HASH_ALGO_LEGACY="sha256"
- SECURITY_PATTERN=password,salt,pepper
- CADDY_HTTP_PORT=8071
oidc-test:
image: bornholm/oidc-test:v0.0.0-1-g936a77e
@ -52,20 +73,21 @@ services:
depends_on:
hydra:
condition: service_healthy
network_mode: host
network_mode: host
restart: unless-stopped
hydra:
image: docker.io/cadoles/hydra-v1:latest
image: cadoles/hydra-v1:v0.0.0-151-gc9c6fb1
volumes:
- ./containers/compose/hydra/clients.d:/etc/hydra/clients.d
- ./misc/compose/hydra/clients.d:/etc/hydra/clients.d
environment:
- LOG_LEAK_SENSITIVE_VALUES=true
- HYDRA_ALLOW_INSECURE=yes
- HYDRA_URLS_SELF_ISSUER=http://localhost:8081/
- HYDRA_URLS_LOGOUT=http://localhost:8080/logout
- HYDRA_URLS_LOGIN=http://localhost:8080/
- HYDRA_URLS_CONSENT=http://localhost:8080/connect/consent
- HYDRA_URLS_LOGOUT=http://localhost:8082/logout
- HYDRA_URLS_LOGIN=http://localhost:8082/
- HYDRA_URLS_CONSENT=http://localhost:8082/connect/consent
- HYDRA_URLS_ERROR=http://localhost:8082/error
- HYDRA_LEVEL=debug
- HYDRA_DSN=postgres://lasql:lasql@postgres:5432/hydra
- HYDRA_WAIT4X_DATABASE_DSN=postgres://lasql:lasql@postgres:5432/hydra?sslmode=disable
@ -76,7 +98,14 @@ services:
links:
- postgres
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
timeout: 10s
retries: 10
@ -91,7 +120,7 @@ services:
POSTGRES_DB: lasql
POSTGRES_PASSWORD: lasql
volumes:
- ./containers/compose/postgres/init-db.d:/docker-entrypoint-initdb.d/:ro
- ./misc/compose/postgres/init-db.d:/docker-entrypoint-initdb.d/:ro
- postgres:/var/lib/pgsql/data
- /etc/localtime:/etc/localtime:ro
@ -101,11 +130,11 @@ services:
- 8085:80
restart: always
environment:
PGADMIN_DEFAULT_EMAIL: admin@admin.com
PGADMIN_DEFAULT_PASSWORD: admin
PGADMIN_SERVER_JSON_FILE: /pgadminfile/server.json
PGADMIN_DEFAULT_EMAIL: admin@admin.com
PGADMIN_DEFAULT_PASSWORD: admin
PGADMIN_SERVER_JSON_FILE: /pgadminfile/server.json
volumes:
- ./containers/compose/pgadmin:/pgadminfile/:ro
- ./misc/compose/pgadmin:/pgadminfile/:ro
mariadb:
image: mariadb:10.10
environment:
@ -115,9 +144,20 @@ services:
MYSQL_ROOT_PASSWORD: lasql
TZ: Europe/Paris
volumes:
- ./containers/compose/mariadb/init-db.d:/docker-entrypoint-initdb.d/:ro
- ./misc/compose/mariadb/init-db.d:/docker-entrypoint-initdb.d/:ro
- mariadb:/var/lib/mysql
- /etc/localtime:/etc/localtime:ro
redis:
image: redis:7.2-rc2-alpine
environment:
- TZ=Europe/Paris
volumes:
- /etc/localtime:/etc/localtime:ro
altcha:
image: reg.cadoles.com/cadoles/altcha:2024.10.29-develop.1213.22e038b
environment:
ALTCHA_HMAC_KEY: 'change_me'
volumes:
postgres:
mariadb:
mariadb:

View File

@ -4,35 +4,37 @@
"minimum-stability": "stable",
"prefer-stable": true,
"require": {
"php": ">=7.2.5",
"php": "^8.4",
"ext-ctype": "*",
"ext-iconv": "*",
"doctrine/annotations": "^1.13",
"predis/predis": "^2.1",
"sentry/sentry-symfony": "^4.5",
"symfony/apache-pack": "^1.0",
"symfony/asset": "5.4.*",
"symfony/console": "5.4.*",
"symfony/dependency-injection": "5.4.*",
"symfony/dotenv": "5.4.*",
"symfony/asset": "6.4.*",
"symfony/console": "6.4.*",
"symfony/dependency-injection": "6.4.*",
"symfony/dotenv": "6.4.*",
"symfony/expression-language": "6.4.*",
"symfony/flex": "^1.17|^2",
"symfony/form": "5.4.*",
"symfony/framework-bundle": "5.4.*",
"symfony/http-client": "5.4.*",
"symfony/rate-limiter": "5.4.*",
"symfony/runtime": "5.4.*",
"symfony/security-bundle": "5.4.*",
"symfony/translation": "5.4.*",
"symfony/twig-bundle": "5.4.*",
"symfony/validator": "5.4.*",
"symfony/web-profiler-bundle": "5.4.*",
"symfony/form": "6.4.*",
"symfony/framework-bundle": "6.4.*",
"symfony/http-client": "6.4.*",
"symfony/rate-limiter": "6.4.*",
"symfony/runtime": "6.4.*",
"symfony/security-bundle": "6.4.*",
"symfony/translation": "6.4.*",
"symfony/twig-bundle": "6.4.*",
"symfony/validator": "6.4.*",
"symfony/webpack-encore-bundle": "^1.16",
"symfony/yaml": "5.4.*"
"symfony/yaml": "6.4.*"
},
"config": {
"allow-plugins": {
"composer/package-versions-deprecated": true,
"symfony/flex": true,
"symfony/runtime": true
"symfony/runtime": true,
"php-http/discovery": true
},
"optimize-autoloader": true,
"preferred-install": {
@ -73,7 +75,12 @@
"extra": {
"symfony": {
"allow-contrib": true,
"require": "5.4.*"
"require": "6.4.*"
}
},
"require-dev": {
"rector/rector": "^2.1",
"symfony/debug-bundle": "6.4.*",
"symfony/web-profiler-bundle": "6.4.*"
}
}

3372
composer.lock generated
View File

@ -4,27 +4,27 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "caf75620d5f1d6c42561a31c9ccf2769",
"content-hash": "8b996df8de88651b1cb94dde643d615c",
"packages": [
{
"name": "clue/stream-filter",
"version": "v1.6.0",
"version": "v1.7.0",
"source": {
"type": "git",
"url": "https://github.com/clue/stream-filter.git",
"reference": "d6169430c7731d8509da7aecd0af756a5747b78e"
"reference": "049509fef80032cb3f051595029ab75b49a3c2f7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e",
"reference": "d6169430c7731d8509da7aecd0af756a5747b78e",
"url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7",
"reference": "049509fef80032cb3f051595029ab75b49a3c2f7",
"shasum": ""
},
"require": {
"php": ">=5.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36"
"phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
},
"type": "library",
"autoload": {
@ -46,7 +46,7 @@
}
],
"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": [
"bucket brigade",
"callback",
@ -58,7 +58,7 @@
],
"support": {
"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": [
{
@ -70,34 +70,38 @@
"type": "github"
}
],
"time": "2022-02-21T13:15:14+00:00"
"time": "2023-12-20T15:40:13+00:00"
},
{
"name": "doctrine/annotations",
"version": "1.13.2",
"version": "1.14.4",
"source": {
"type": "git",
"url": "https://github.com/doctrine/annotations.git",
"reference": "5b668aef16090008790395c02c893b1ba13f7e08"
"reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08",
"reference": "5b668aef16090008790395c02c893b1ba13f7e08",
"url": "https://api.github.com/repos/doctrine/annotations/zipball/253dca476f70808a5aeed3a47cc2cc88c5cab915",
"reference": "253dca476f70808a5aeed3a47cc2cc88c5cab915",
"shasum": ""
},
"require": {
"doctrine/lexer": "1.*",
"doctrine/lexer": "^1 || ^2",
"ext-tokenizer": "*",
"php": "^7.1 || ^8.0",
"psr/cache": "^1 || ^2 || ^3"
},
"require-dev": {
"doctrine/cache": "^1.11 || ^2.0",
"doctrine/coding-standard": "^6.0 || ^8.1",
"phpstan/phpstan": "^0.12.20",
"phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5",
"symfony/cache": "^4.4 || ^5.2"
"doctrine/coding-standard": "^9 || ^12",
"phpstan/phpstan": "~1.4.10 || ^1.10.28",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"symfony/cache": "^4.4 || ^5.4 || ^6.4 || ^7",
"vimeo/psalm": "^4.30 || ^5.14"
},
"suggest": {
"php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
},
"type": "library",
"autoload": {
@ -140,37 +144,87 @@
],
"support": {
"issues": "https://github.com/doctrine/annotations/issues",
"source": "https://github.com/doctrine/annotations/tree/1.13.2"
"source": "https://github.com/doctrine/annotations/tree/1.14.4"
},
"time": "2021-08-05T19:00:23+00:00"
"time": "2024-09-05T10:15:52+00:00"
},
{
"name": "doctrine/lexer",
"version": "1.2.3",
"name": "doctrine/deprecations",
"version": "1.1.5",
"source": {
"type": "git",
"url": "https://github.com/doctrine/lexer.git",
"reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229"
"url": "https://github.com/doctrine/deprecations.git",
"reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229",
"reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
"reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"conflict": {
"phpunit/phpunit": "<=7.5 || >=13"
},
"require-dev": {
"doctrine/coding-standard": "^9.0",
"phpstan/phpstan": "^1.3",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
"vimeo/psalm": "^4.11"
"doctrine/coding-standard": "^9 || ^12 || ^13",
"phpstan/phpstan": "1.4.10 || 2.1.11",
"phpstan/phpstan-phpunit": "^1.0 || ^2",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12",
"psr/log": "^1 || ^2 || ^3"
},
"suggest": {
"psr/log": "Allows logging deprecations via PSR-3 logger implementation"
},
"type": "library",
"autoload": {
"psr-4": {
"Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
"Doctrine\\Deprecations\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
"homepage": "https://www.doctrine-project.org/",
"support": {
"issues": "https://github.com/doctrine/deprecations/issues",
"source": "https://github.com/doctrine/deprecations/tree/1.1.5"
},
"time": "2025-04-07T20:06:18+00:00"
},
{
"name": "doctrine/lexer",
"version": "2.1.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/lexer.git",
"reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/lexer/zipball/861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6",
"reference": "861c870e8b75f7c8f69c146c7f89cc1c0f1b49b6",
"shasum": ""
},
"require": {
"doctrine/deprecations": "^1.0",
"php": "^7.1 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^9 || ^12",
"phpstan/phpstan": "^1.3",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.6",
"psalm/plugin-phpunit": "^0.18.3",
"vimeo/psalm": "^4.11 || ^5.21"
},
"type": "library",
"autoload": {
"psr-4": {
"Doctrine\\Common\\Lexer\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@ -202,7 +256,7 @@
],
"support": {
"issues": "https://github.com/doctrine/lexer/issues",
"source": "https://github.com/doctrine/lexer/tree/1.2.3"
"source": "https://github.com/doctrine/lexer/tree/2.1.1"
},
"funding": [
{
@ -218,38 +272,37 @@
"type": "tidelift"
}
],
"time": "2022-02-28T11:07:21+00:00"
"time": "2024-02-05T11:35:39+00:00"
},
{
"name": "guzzlehttp/promises",
"version": "1.5.2",
"version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "b94b2807d85443f9719887892882d0329d1e2598"
"reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598",
"reference": "b94b2807d85443f9719887892882d0329d1e2598",
"url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c",
"reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c",
"shasum": ""
},
"require": {
"php": ">=5.5"
"php": "^7.2.5 || ^8.0"
},
"require-dev": {
"symfony/phpunit-bridge": "^4.4 || ^5.1"
"bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.39 || ^9.6.20"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.5-dev"
"bamarni-bin": {
"bin-links": true,
"forward-command": false
}
},
"autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": {
"GuzzleHttp\\Promise\\": "src/"
}
@ -286,7 +339,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/1.5.2"
"source": "https://github.com/guzzle/promises/tree/2.2.0"
},
"funding": [
{
@ -302,26 +355,26 @@
"type": "tidelift"
}
],
"time": "2022-08-28T14:55:35+00:00"
"time": "2025-03-27T13:27:01+00:00"
},
{
"name": "guzzlehttp/psr7",
"version": "2.4.3",
"version": "2.7.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "67c26b443f348a51926030c83481b85718457d3d"
"reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d",
"reference": "67c26b443f348a51926030c83481b85718457d3d",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16",
"reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.0",
"psr/http-message": "^1.1 || ^2.0",
"ralouphie/getallheaders": "^3.0"
},
"provide": {
@ -329,9 +382,9 @@
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.8.1",
"http-interop/http-factory-tests": "^0.9",
"phpunit/phpunit": "^8.5.29 || ^9.5.23"
"bamarni/composer-bin-plugin": "^1.8.2",
"http-interop/http-factory-tests": "0.9.0",
"phpunit/phpunit": "^8.5.39 || ^9.6.20"
},
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
@ -341,9 +394,6 @@
"bamarni-bin": {
"bin-links": true,
"forward-command": false
},
"branch-alias": {
"dev-master": "2.4-dev"
}
},
"autoload": {
@ -405,7 +455,7 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.4.3"
"source": "https://github.com/guzzle/psr7/tree/2.7.1"
},
"funding": [
{
@ -421,7 +471,7 @@
"type": "tidelift"
}
],
"time": "2022-10-26T14:07:24+00:00"
"time": "2025-03-27T12:30:47+00:00"
},
{
"name": "http-interop/http-factory-guzzle",
@ -483,28 +533,29 @@
},
{
"name": "jean85/pretty-package-versions",
"version": "2.0.5",
"version": "2.1.1",
"source": {
"type": "git",
"url": "https://github.com/Jean85/pretty-package-versions.git",
"reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af"
"reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/ae547e455a3d8babd07b96966b17d7fd21d9c6af",
"reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af",
"url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a",
"reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a",
"shasum": ""
},
"require": {
"composer-runtime-api": "^2.0.0",
"php": "^7.1|^8.0"
"composer-runtime-api": "^2.1.0",
"php": "^7.4|^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.17",
"friendsofphp/php-cs-fixer": "^3.2",
"jean85/composer-provided-replaced-stub-package": "^1.0",
"phpstan/phpstan": "^0.12.66",
"phpunit/phpunit": "^7.5|^8.5|^9.4",
"vimeo/psalm": "^4.3"
"phpstan/phpstan": "^2.0",
"phpunit/phpunit": "^7.5|^8.5|^9.6",
"rector/rector": "^2.0",
"vimeo/psalm": "^4.3 || ^5.0"
},
"type": "library",
"extra": {
@ -536,33 +587,32 @@
],
"support": {
"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.1.1"
},
"time": "2021-10-08T21:21:46+00:00"
"time": "2025-03-19T14:43:43+00:00"
},
{
"name": "php-http/client-common",
"version": "2.6.0",
"version": "2.7.2",
"source": {
"type": "git",
"url": "https://github.com/php-http/client-common.git",
"reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0"
"reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/client-common/zipball/45db684cd4e186dcdc2b9c06b22970fe123796c0",
"reference": "45db684cd4e186dcdc2b9c06b22970fe123796c0",
"url": "https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46",
"reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0",
"php-http/httplug": "^2.0",
"php-http/message": "^1.6",
"php-http/message-factory": "^1.0",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.0",
"symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0",
"psr/http-message": "^1.0 || ^2.0",
"symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0",
"symfony/polyfill-php80": "^1.17"
},
"require-dev": {
@ -571,7 +621,7 @@
"nyholm/psr7": "^1.2",
"phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
"phpspec/prophecy": "^1.10.2",
"phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3"
"phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7"
},
"suggest": {
"ext-json": "To detect JSON responses with the ContentTypePlugin",
@ -581,11 +631,6 @@
"php-http/stopwatch-plugin": "Symfony Stopwatch plugin"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.3.x-dev"
}
},
"autoload": {
"psr-4": {
"Http\\Client\\Common\\": "src/"
@ -611,49 +656,60 @@
],
"support": {
"issues": "https://github.com/php-http/client-common/issues",
"source": "https://github.com/php-http/client-common/tree/2.6.0"
"source": "https://github.com/php-http/client-common/tree/2.7.2"
},
"time": "2022-09-29T09:59:43+00:00"
"time": "2024-09-24T06:21:48+00:00"
},
{
"name": "php-http/discovery",
"version": "1.14.3",
"version": "1.20.0",
"source": {
"type": "git",
"url": "https://github.com/php-http/discovery.git",
"reference": "31d8ee46d0215108df16a8527c7438e96a4d7735"
"reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/discovery/zipball/31d8ee46d0215108df16a8527c7438e96a4d7735",
"reference": "31d8ee46d0215108df16a8527c7438e96a4d7735",
"url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d",
"reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d",
"shasum": ""
},
"require": {
"composer-plugin-api": "^1.0|^2.0",
"php": "^7.1 || ^8.0"
},
"conflict": {
"nyholm/psr7": "<1.0"
"nyholm/psr7": "<1.0",
"zendframework/zend-diactoros": "*"
},
"provide": {
"php-http/async-client-implementation": "*",
"php-http/client-implementation": "*",
"psr/http-client-implementation": "*",
"psr/http-factory-implementation": "*",
"psr/http-message-implementation": "*"
},
"require-dev": {
"composer/composer": "^1.0.2|^2.0",
"graham-campbell/phpspec-skip-example-extension": "^5.0",
"php-http/httplug": "^1.0 || ^2.0",
"php-http/message-factory": "^1.0",
"phpspec/phpspec": "^5.1 || ^6.1"
"phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
"sebastian/comparator": "^3.0.5 || ^4.0.8",
"symfony/phpunit-bridge": "^6.4.4 || ^7.0.1"
},
"suggest": {
"php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories"
},
"type": "library",
"type": "composer-plugin",
"extra": {
"branch-alias": {
"dev-master": "1.9-dev"
}
"class": "Http\\Discovery\\Composer\\Plugin",
"plugin-optional": true
},
"autoload": {
"psr-4": {
"Http\\Discovery\\": "src/"
}
},
"exclude-from-classmap": [
"src/Composer/Plugin.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@ -665,7 +721,7 @@
"email": "mark.sagikazar@gmail.com"
}
],
"description": "Finds installed HTTPlug implementations and PSR-7 message factories",
"description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
"homepage": "http://php-http.org",
"keywords": [
"adapter",
@ -674,44 +730,40 @@
"factory",
"http",
"message",
"psr17",
"psr7"
],
"support": {
"issues": "https://github.com/php-http/discovery/issues",
"source": "https://github.com/php-http/discovery/tree/1.14.3"
"source": "https://github.com/php-http/discovery/tree/1.20.0"
},
"time": "2022-07-11T14:04:40+00:00"
"time": "2024-10-02T11:20:13+00:00"
},
{
"name": "php-http/httplug",
"version": "2.3.0",
"version": "2.4.1",
"source": {
"type": "git",
"url": "https://github.com/php-http/httplug.git",
"reference": "f640739f80dfa1152533976e3c112477f69274eb"
"reference": "5cad731844891a4c282f3f3e1b582c46839d22f4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/httplug/zipball/f640739f80dfa1152533976e3c112477f69274eb",
"reference": "f640739f80dfa1152533976e3c112477f69274eb",
"url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4",
"reference": "5cad731844891a4c282f3f3e1b582c46839d22f4",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0",
"php-http/promise": "^1.1",
"psr/http-client": "^1.0",
"psr/http-message": "^1.0"
"psr/http-message": "^1.0 || ^2.0"
},
"require-dev": {
"friends-of-phpspec/phpspec-code-coverage": "^4.1",
"phpspec/phpspec": "^5.1 || ^6.0"
"friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0",
"phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.x-dev"
}
},
"autoload": {
"psr-4": {
"Http\\Client\\": "src/"
@ -740,29 +792,28 @@
],
"support": {
"issues": "https://github.com/php-http/httplug/issues",
"source": "https://github.com/php-http/httplug/tree/2.3.0"
"source": "https://github.com/php-http/httplug/tree/2.4.1"
},
"time": "2022-02-21T09:52:22+00:00"
"time": "2024-09-23T11:39:58+00:00"
},
{
"name": "php-http/message",
"version": "1.13.0",
"version": "1.16.2",
"source": {
"type": "git",
"url": "https://github.com/php-http/message.git",
"reference": "7886e647a30a966a1a8d1dad1845b71ca8678361"
"reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/message/zipball/7886e647a30a966a1a8d1dad1845b71ca8678361",
"reference": "7886e647a30a966a1a8d1dad1845b71ca8678361",
"url": "https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a",
"reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a",
"shasum": ""
},
"require": {
"clue/stream-filter": "^1.5",
"php": "^7.1 || ^8.0",
"php-http/message-factory": "^1.0.2",
"psr/http-message": "^1.0"
"php": "^7.2 || ^8.0",
"psr/http-message": "^1.1 || ^2.0"
},
"provide": {
"php-http/message-factory-implementation": "1.0"
@ -770,8 +821,9 @@
"require-dev": {
"ergebnis/composer-normalize": "^2.6",
"ext-zlib": "*",
"guzzlehttp/psr7": "^1.0",
"laminas/laminas-diactoros": "^2.0",
"guzzlehttp/psr7": "^1.0 || ^2.0",
"laminas/laminas-diactoros": "^2.0 || ^3.0",
"php-http/message-factory": "^1.0.2",
"phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
"slim/slim": "^3.0"
},
@ -782,11 +834,6 @@
"slim/slim": "Used with Slim Framework PSR-7 implementation"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.10-dev"
}
},
"autoload": {
"files": [
"src/filters.php"
@ -814,32 +861,32 @@
],
"support": {
"issues": "https://github.com/php-http/message/issues",
"source": "https://github.com/php-http/message/tree/1.13.0"
"source": "https://github.com/php-http/message/tree/1.16.2"
},
"time": "2022-02-11T13:41:14+00:00"
"time": "2024-10-02T11:34:13+00:00"
},
{
"name": "php-http/message-factory",
"version": "v1.0.2",
"version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/php-http/message-factory.git",
"reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1"
"reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1",
"reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1",
"url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57",
"reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57",
"shasum": ""
},
"require": {
"php": ">=5.4",
"psr/http-message": "^1.0"
"psr/http-message": "^1.0 || ^2.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
"dev-master": "1.x-dev"
}
},
"autoload": {
@ -868,37 +915,33 @@
],
"support": {
"issues": "https://github.com/php-http/message-factory/issues",
"source": "https://github.com/php-http/message-factory/tree/master"
"source": "https://github.com/php-http/message-factory/tree/1.1.0"
},
"time": "2015-12-19T14:08:53+00:00"
"abandoned": "psr/http-factory",
"time": "2023-04-14T14:16:17+00:00"
},
{
"name": "php-http/promise",
"version": "1.1.0",
"version": "1.3.1",
"source": {
"type": "git",
"url": "https://github.com/php-http/promise.git",
"reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88"
"reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88",
"reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88",
"url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
"reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"friends-of-phpspec/phpspec-code-coverage": "^4.3.2",
"phpspec/phpspec": "^5.1.2 || ^6.2"
"friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3",
"phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.1-dev"
}
},
"autoload": {
"psr-4": {
"Http\\Promise\\": "src/"
@ -925,26 +968,88 @@
],
"support": {
"issues": "https://github.com/php-http/promise/issues",
"source": "https://github.com/php-http/promise/tree/1.1.0"
"source": "https://github.com/php-http/promise/tree/1.3.1"
},
"time": "2020-07-07T09:29:14+00:00"
"time": "2024-03-15T13:55:21+00:00"
},
{
"name": "psr/cache",
"version": "1.0.1",
"name": "predis/predis",
"version": "v2.4.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/cache.git",
"reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
"url": "https://github.com/predis/predis.git",
"reference": "f49e13ee3a2a825631562aa0223ac922ec5d058b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
"reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
"url": "https://api.github.com/repos/predis/predis/zipball/f49e13ee3a2a825631562aa0223ac922ec5d058b",
"reference": "f49e13ee3a2a825631562aa0223ac922ec5d058b",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
"php": "^7.2 || ^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.3",
"phpstan/phpstan": "^1.9",
"phpunit/phpcov": "^6.0 || ^8.0",
"phpunit/phpunit": "^8.0 || ^9.4"
},
"suggest": {
"ext-relay": "Faster connection with in-memory caching (>=0.6.2)"
},
"type": "library",
"autoload": {
"psr-4": {
"Predis\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Till Krüss",
"homepage": "https://till.im",
"role": "Maintainer"
}
],
"description": "A flexible and feature-complete Redis/Valkey client for PHP.",
"homepage": "http://github.com/predis/predis",
"keywords": [
"nosql",
"predis",
"redis"
],
"support": {
"issues": "https://github.com/predis/predis/issues",
"source": "https://github.com/predis/predis/tree/v2.4.0"
},
"funding": [
{
"url": "https://github.com/sponsors/tillkruss",
"type": "github"
}
],
"time": "2025-04-30T15:16:02+00:00"
},
{
"name": "psr/cache",
"version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/cache.git",
"reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
"reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
"shasum": ""
},
"require": {
"php": ">=8.0.0"
},
"type": "library",
"extra": {
@ -964,7 +1069,7 @@
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for caching libraries",
@ -974,28 +1079,81 @@
"psr-6"
],
"support": {
"source": "https://github.com/php-fig/cache/tree/master"
"source": "https://github.com/php-fig/cache/tree/3.0.0"
},
"time": "2016-08-06T20:24:11+00:00"
"time": "2021-02-03T23:26:27+00:00"
},
{
"name": "psr/container",
"version": "1.1.2",
"name": "psr/clock",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
"reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
"url": "https://github.com/php-fig/clock.git",
"reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
"reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
"url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
"reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
"shasum": ""
},
"require": {
"php": "^7.0 || ^8.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Psr\\Clock\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for reading the clock.",
"homepage": "https://github.com/php-fig/clock",
"keywords": [
"clock",
"now",
"psr",
"psr-20",
"time"
],
"support": {
"issues": "https://github.com/php-fig/clock/issues",
"source": "https://github.com/php-fig/clock/tree/1.0.0"
},
"time": "2022-11-25T14:36:26+00:00"
},
{
"name": "psr/container",
"version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
"reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
"reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
"shasum": ""
},
"require": {
"php": ">=7.4.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Container\\": "src/"
@ -1022,9 +1180,9 @@
],
"support": {
"issues": "https://github.com/php-fig/container/issues",
"source": "https://github.com/php-fig/container/tree/1.1.2"
"source": "https://github.com/php-fig/container/tree/2.0.2"
},
"time": "2021-11-05T16:50:12+00:00"
"time": "2021-11-05T16:47:00+00:00"
},
{
"name": "psr/event-dispatcher",
@ -1078,21 +1236,21 @@
},
{
"name": "psr/http-client",
"version": "1.0.1",
"version": "1.0.3",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-client.git",
"reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
"reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
"reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
"url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
"reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
"shasum": ""
},
"require": {
"php": "^7.0 || ^8.0",
"psr/http-message": "^1.0"
"psr/http-message": "^1.0 || ^2.0"
},
"type": "library",
"extra": {
@ -1112,7 +1270,7 @@
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for HTTP clients",
@ -1124,27 +1282,27 @@
"psr-18"
],
"support": {
"source": "https://github.com/php-fig/http-client/tree/master"
"source": "https://github.com/php-fig/http-client"
},
"time": "2020-06-29T06:28:15+00:00"
"time": "2023-09-23T14:17:50+00:00"
},
{
"name": "psr/http-factory",
"version": "1.0.1",
"version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-factory.git",
"reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
"reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
"reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
"url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
"reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
"shasum": ""
},
"require": {
"php": ">=7.0.0",
"psr/http-message": "^1.0"
"php": ">=7.1",
"psr/http-message": "^1.0 || ^2.0"
},
"type": "library",
"extra": {
@ -1164,10 +1322,10 @@
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://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": [
"factory",
"http",
@ -1179,31 +1337,31 @@
"response"
],
"support": {
"source": "https://github.com/php-fig/http-factory/tree/master"
"source": "https://github.com/php-fig/http-factory"
},
"time": "2019-04-30T12:38:16+00:00"
"time": "2024-04-15T12:06:14+00:00"
},
{
"name": "psr/http-message",
"version": "1.0.1",
"version": "2.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
"reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
"reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
"php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
"dev-master": "2.0.x-dev"
}
},
"autoload": {
@ -1218,7 +1376,7 @@
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for HTTP messages",
@ -1232,36 +1390,36 @@
"response"
],
"support": {
"source": "https://github.com/php-fig/http-message/tree/master"
"source": "https://github.com/php-fig/http-message/tree/2.0"
},
"time": "2016-08-06T14:39:51+00:00"
"time": "2023-04-04T09:54:51+00:00"
},
{
"name": "psr/log",
"version": "1.1.4",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
"reference": "d49695b909c3b7628b6289db5479a1c204601f11"
"reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
"reference": "d49695b909c3b7628b6289db5479a1c204601f11",
"url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
"reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
"php": ">=8.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.1.x-dev"
"dev-master": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Log\\": "Psr/Log/"
"Psr\\Log\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@ -1282,9 +1440,9 @@
"psr-3"
],
"support": {
"source": "https://github.com/php-fig/log/tree/1.1.4"
"source": "https://github.com/php-fig/log/tree/3.0.2"
},
"time": "2021-05-03T11:20:27+00:00"
"time": "2024-09-11T13:17:53+00:00"
},
{
"name": "ralouphie/getallheaders",
@ -1332,22 +1490,22 @@
},
{
"name": "sentry/sdk",
"version": "3.3.0",
"version": "3.6.0",
"source": {
"type": "git",
"url": "https://github.com/getsentry/sentry-php-sdk.git",
"reference": "d0678fc7274dbb03046ed05cb24eb92945bedf8e"
"reference": "24c235ff2027401cbea099bf88689e1a1f197c7a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/d0678fc7274dbb03046ed05cb24eb92945bedf8e",
"reference": "d0678fc7274dbb03046ed05cb24eb92945bedf8e",
"url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/24c235ff2027401cbea099bf88689e1a1f197c7a",
"reference": "24c235ff2027401cbea099bf88689e1a1f197c7a",
"shasum": ""
},
"require": {
"http-interop/http-factory-guzzle": "^1.0",
"sentry/sentry": "^3.9",
"symfony/http-client": "^4.3|^5.0|^6.0"
"sentry/sentry": "^3.22",
"symfony/http-client": "^4.3|^5.0|^6.0|^7.0"
},
"type": "metapackage",
"notification-url": "https://packagist.org/downloads/",
@ -1373,7 +1531,7 @@
],
"support": {
"issues": "https://github.com/getsentry/sentry-php-sdk/issues",
"source": "https://github.com/getsentry/sentry-php-sdk/tree/3.3.0"
"source": "https://github.com/getsentry/sentry-php-sdk/tree/3.6.0"
},
"funding": [
{
@ -1385,38 +1543,38 @@
"type": "custom"
}
],
"time": "2022-10-11T09:05:00+00:00"
"time": "2023-12-04T10:49:33+00:00"
},
{
"name": "sentry/sentry",
"version": "3.12.0",
"version": "3.22.1",
"source": {
"type": "git",
"url": "https://github.com/getsentry/sentry-php.git",
"reference": "4902f43640963ed45517fd7c1da7fdd5511bb304"
"reference": "8859631ba5ab15bc1af420b0eeed19ecc6c9d81d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/getsentry/sentry-php/zipball/4902f43640963ed45517fd7c1da7fdd5511bb304",
"reference": "4902f43640963ed45517fd7c1da7fdd5511bb304",
"url": "https://api.github.com/repos/getsentry/sentry-php/zipball/8859631ba5ab15bc1af420b0eeed19ecc6c9d81d",
"reference": "8859631ba5ab15bc1af420b0eeed19ecc6c9d81d",
"shasum": ""
},
"require": {
"ext-json": "*",
"ext-mbstring": "*",
"guzzlehttp/promises": "^1.4",
"guzzlehttp/psr7": "^1.8.4|^2.1.1",
"guzzlehttp/promises": "^1.5.3|^2.0",
"jean85/pretty-package-versions": "^1.5|^2.0.4",
"php": "^7.2|^8.0",
"php-http/async-client-implementation": "^1.0",
"php-http/client-common": "^1.5|^2.0",
"php-http/discovery": "^1.11",
"php-http/discovery": "^1.15",
"php-http/httplug": "^1.1|^2.0",
"php-http/message": "^1.5",
"php-http/message-factory": "^1.1",
"psr/http-factory": "^1.0",
"psr/http-message-implementation": "^1.0",
"psr/http-factory-implementation": "^1.0",
"psr/log": "^1.0|^2.0|^3.0",
"symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0",
"symfony/options-resolver": "^3.4.43|^4.4.30|^5.0.11|^6.0|^7.0",
"symfony/polyfill-php80": "^1.17"
},
"conflict": {
@ -1425,6 +1583,7 @@
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.19|3.4.*",
"guzzlehttp/psr7": "^1.8.4|^2.1.1",
"http-interop/http-factory-guzzle": "^1.0",
"monolog/monolog": "^1.6|^2.0|^3.0",
"nikic/php-parser": "^4.10.3",
@ -1441,11 +1600,6 @@
"monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler."
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.12.x-dev"
}
},
"autoload": {
"files": [
"src/functions.php"
@ -1456,7 +1610,7 @@
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
"MIT"
],
"authors": [
{
@ -1477,7 +1631,7 @@
],
"support": {
"issues": "https://github.com/getsentry/sentry-php/issues",
"source": "https://github.com/getsentry/sentry-php/tree/3.12.0"
"source": "https://github.com/getsentry/sentry-php/tree/3.22.1"
},
"funding": [
{
@ -1489,62 +1643,61 @@
"type": "custom"
}
],
"time": "2022-11-22T10:57:08+00:00"
"time": "2023-11-13T11:47:28+00:00"
},
{
"name": "sentry/sentry-symfony",
"version": "4.5.0",
"version": "4.14.0",
"source": {
"type": "git",
"url": "https://github.com/getsentry/sentry-symfony.git",
"reference": "04e1f298a3a7ab477e09f4382189538473ad0a58"
"reference": "001c4cfd8fe93cbb00edaca903ffbfac28259170"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/04e1f298a3a7ab477e09f4382189538473ad0a58",
"reference": "04e1f298a3a7ab477e09f4382189538473ad0a58",
"url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/001c4cfd8fe93cbb00edaca903ffbfac28259170",
"reference": "001c4cfd8fe93cbb00edaca903ffbfac28259170",
"shasum": ""
},
"require": {
"guzzlehttp/psr7": "^1.7 || ^2.0",
"jean85/pretty-package-versions": "^1.5 || ^2.0",
"php": "^7.2||^8.0",
"php-http/discovery": "^1.11",
"sentry/sdk": "^3.3",
"sentry/sdk": "^3.6",
"sentry/sentry": "^3.22.1",
"symfony/cache-contracts": "^1.1||^2.4||^3.0",
"symfony/config": "^4.4.20||^5.0.11||^6.0",
"symfony/console": "^4.4.20||^5.0.11||^6.0",
"symfony/dependency-injection": "^4.4.20||^5.0.11||^6.0",
"symfony/event-dispatcher": "^4.4.20||^5.0.11||^6.0",
"symfony/http-kernel": "^4.4.20||^5.0.11||^6.0",
"symfony/config": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/console": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/dependency-injection": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/event-dispatcher": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/http-kernel": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/polyfill-php80": "^1.22",
"symfony/psr-http-message-bridge": "^1.2||^2.0",
"symfony/security-core": "^4.4.20||^5.0.11||^6.0"
"symfony/psr-http-message-bridge": "^1.2||^2.0||^6.4||^7.0",
"symfony/security-core": "^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": {
"doctrine/dbal": "^2.13||^3.0",
"doctrine/doctrine-bundle": "^1.12||^2.5",
"friendsofphp/php-cs-fixer": "^2.19||^3.6",
"jangregor/phpstan-prophecy": "^1.0",
"monolog/monolog": "^1.3||^2.0",
"phpspec/prophecy": "!=1.11.0",
"phpspec/prophecy-phpunit": "^1.1||^2.0",
"doctrine/dbal": "^2.13||^3.3||^4.0",
"doctrine/doctrine-bundle": "^2.6",
"friendsofphp/php-cs-fixer": "^2.19||^3.40",
"masterminds/html5": "^2.8",
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^1.3",
"phpstan/phpstan-phpunit": "^1.0",
"phpstan/phpstan-symfony": "^1.0",
"phpunit/phpunit": "^8.5.14||^9.3.9",
"symfony/browser-kit": "^4.4.20||^5.0.11||^6.0",
"symfony/cache": "^4.4.20||^5.0.11||^6.0",
"symfony/dom-crawler": "^4.4.20||^5.0.11||^6.0",
"symfony/framework-bundle": "^4.4.20||^5.0.11||^6.0",
"symfony/http-client": "^4.4.20||^5.0.11||^6.0",
"symfony/messenger": "^4.4.20||^5.0.11||^6.0",
"symfony/browser-kit": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/cache": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/dom-crawler": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/framework-bundle": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/http-client": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/messenger": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/monolog-bundle": "^3.4",
"symfony/phpunit-bridge": "^5.2.6||^6.0",
"symfony/process": "^4.4.20||^5.0.11||^6.0",
"symfony/twig-bundle": "^4.4.20||^5.0.11||^6.0",
"symfony/yaml": "^4.4.20||^5.0.11||^6.0",
"vimeo/psalm": "^4.3"
"symfony/phpunit-bridge": "^5.2.6||^6.0||^7.0",
"symfony/process": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/twig-bundle": "^4.4.20||^5.0.11||^6.0||^7.0",
"symfony/yaml": "^4.4.20||^5.0.11||^6.0||^7.0",
"vimeo/psalm": "^4.3||^5.16.0"
},
"suggest": {
"doctrine/doctrine-bundle": "Allow distributed tracing of database queries using Sentry.",
@ -1555,10 +1708,9 @@
"type": "symfony-bundle",
"extra": {
"branch-alias": {
"dev-master": "4.4.x-dev",
"releases/3.2.x": "3.2.x-dev",
"releases/1.x": "1.x-dev",
"releases/2.x": "2.x-dev",
"releases/1.x": "1.x-dev"
"releases/3.2.x": "3.2.x-dev"
}
},
"autoload": {
@ -1571,7 +1723,7 @@
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
"MIT"
],
"authors": [
{
@ -1593,7 +1745,7 @@
],
"support": {
"issues": "https://github.com/getsentry/sentry-symfony/issues",
"source": "https://github.com/getsentry/sentry-symfony/tree/4.5.0"
"source": "https://github.com/getsentry/sentry-symfony/tree/4.14.0"
},
"funding": [
{
@ -1605,7 +1757,7 @@
"type": "custom"
}
],
"time": "2022-11-28T12:37:44+00:00"
"time": "2024-02-26T09:27:19+00:00"
},
{
"name": "symfony/apache-pack",
@ -1635,33 +1787,28 @@
},
{
"name": "symfony/asset",
"version": "v5.4.13",
"version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/asset.git",
"reference": "9aa867206711cb6fcca51ef127ba52a018170be9"
"reference": "2466c17d61d14539cddf77e57ebb9cc971185302"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/asset/zipball/9aa867206711cb6fcca51ef127ba52a018170be9",
"reference": "9aa867206711cb6fcca51ef127ba52a018170be9",
"url": "https://api.github.com/repos/symfony/asset/zipball/2466c17d61d14539cddf77e57ebb9cc971185302",
"reference": "2466c17d61d14539cddf77e57ebb9cc971185302",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-php80": "^1.16"
"php": ">=8.1"
},
"conflict": {
"symfony/http-foundation": "<5.3"
"symfony/http-foundation": "<5.4"
},
"require-dev": {
"symfony/http-client": "^4.4|^5.0|^6.0",
"symfony/http-foundation": "^5.3|^6.0",
"symfony/http-kernel": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/http-foundation": ""
"symfony/http-client": "^5.4|^6.0|^7.0",
"symfony/http-foundation": "^5.4|^6.0|^7.0",
"symfony/http-kernel": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -1689,7 +1836,7 @@
"description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/asset/tree/v5.4.13"
"source": "https://github.com/symfony/asset/tree/v6.4.13"
},
"funding": [
{
@ -1705,62 +1852,61 @@
"type": "tidelift"
}
],
"time": "2022-08-31T08:17:19+00:00"
"time": "2024-10-25T15:07:50+00:00"
},
{
"name": "symfony/cache",
"version": "v5.4.7",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
"reference": "ba06841ed293fcaf79a592f59fdaba471f7c756c"
"reference": "c88690befb8d4a85dc321fb78d677507f5eb141b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/cache/zipball/ba06841ed293fcaf79a592f59fdaba471f7c756c",
"reference": "ba06841ed293fcaf79a592f59fdaba471f7c756c",
"url": "https://api.github.com/repos/symfony/cache/zipball/c88690befb8d4a85dc321fb78d677507f5eb141b",
"reference": "c88690befb8d4a85dc321fb78d677507f5eb141b",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"psr/cache": "^1.0|^2.0",
"php": ">=8.1",
"psr/cache": "^2.0|^3.0",
"psr/log": "^1.1|^2|^3",
"symfony/cache-contracts": "^1.1.7|^2",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-php73": "^1.9",
"symfony/polyfill-php80": "^1.16",
"symfony/service-contracts": "^1.1|^2|^3",
"symfony/var-exporter": "^4.4|^5.0|^6.0"
"symfony/cache-contracts": "^2.5|^3",
"symfony/service-contracts": "^2.5|^3",
"symfony/var-exporter": "^6.3.6|^7.0"
},
"conflict": {
"doctrine/dbal": "<2.13.1",
"symfony/dependency-injection": "<4.4",
"symfony/http-kernel": "<4.4",
"symfony/var-dumper": "<4.4"
"symfony/dependency-injection": "<5.4",
"symfony/http-kernel": "<5.4",
"symfony/var-dumper": "<5.4"
},
"provide": {
"psr/cache-implementation": "1.0|2.0",
"psr/simple-cache-implementation": "1.0|2.0",
"symfony/cache-implementation": "1.0|2.0"
"psr/cache-implementation": "2.0|3.0",
"psr/simple-cache-implementation": "1.0|2.0|3.0",
"symfony/cache-implementation": "1.1|2.0|3.0"
},
"require-dev": {
"cache/integration-tests": "dev-master",
"doctrine/cache": "^1.6|^2.0",
"doctrine/dbal": "^2.13.1|^3.0",
"predis/predis": "^1.1",
"psr/simple-cache": "^1.0|^2.0",
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/filesystem": "^4.4|^5.0|^6.0",
"symfony/http-kernel": "^4.4|^5.0|^6.0",
"symfony/messenger": "^4.4|^5.0|^6.0",
"symfony/var-dumper": "^4.4|^5.0|^6.0"
"doctrine/dbal": "^2.13.1|^3|^4",
"predis/predis": "^1.1|^2.0",
"psr/simple-cache": "^1.0|^2.0|^3.0",
"symfony/config": "^5.4|^6.0|^7.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/filesystem": "^5.4|^6.0|^7.0",
"symfony/http-kernel": "^5.4|^6.0|^7.0",
"symfony/messenger": "^5.4|^6.0|^7.0",
"symfony/var-dumper": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Cache\\": ""
},
"classmap": [
"Traits/ValueWrapper.php"
],
"exclude-from-classmap": [
"/Tests/"
]
@ -1779,14 +1925,14 @@
"homepage": "https://symfony.com/contributors"
}
],
"description": "Provides an extended PSR-6, PSR-16 (and tags) implementation",
"description": "Provides extended PSR-6, PSR-16 (and tags) implementations",
"homepage": "https://symfony.com",
"keywords": [
"caching",
"psr6"
],
"support": {
"source": "https://github.com/symfony/cache/tree/v5.4.7"
"source": "https://github.com/symfony/cache/tree/v6.4.23"
},
"funding": [
{
@ -1802,37 +1948,34 @@
"type": "tidelift"
}
],
"time": "2022-03-22T15:31:03+00:00"
"time": "2025-06-27T18:31:36+00:00"
},
{
"name": "symfony/cache-contracts",
"version": "v2.5.1",
"version": "v3.6.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache-contracts.git",
"reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc"
"reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
"reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
"url": "https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868",
"reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"psr/cache": "^1.0|^2.0|^3.0"
},
"suggest": {
"symfony/cache-implementation": ""
"php": ">=8.1",
"psr/cache": "^3.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "3.6-dev"
}
},
"autoload": {
@ -1865,7 +2008,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/cache-contracts/tree/v2.5.1"
"source": "https://github.com/symfony/cache-contracts/tree/v3.6.0"
},
"funding": [
{
@ -1881,42 +2024,112 @@
"type": "tidelift"
}
],
"time": "2022-01-02T09:53:40+00:00"
"time": "2025-03-13T15:25:07+00:00"
},
{
"name": "symfony/config",
"version": "v5.4.7",
"name": "symfony/clock",
"version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
"reference": "05624c386afa1b4ccc1357463d830fade8d9d404"
"url": "https://github.com/symfony/clock.git",
"reference": "b2bf55c4dd115003309eafa87ee7df9ed3dde81b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/config/zipball/05624c386afa1b4ccc1357463d830fade8d9d404",
"reference": "05624c386afa1b4ccc1357463d830fade8d9d404",
"url": "https://api.github.com/repos/symfony/clock/zipball/b2bf55c4dd115003309eafa87ee7df9ed3dde81b",
"reference": "b2bf55c4dd115003309eafa87ee7df9ed3dde81b",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/filesystem": "^4.4|^5.0|^6.0",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-php80": "^1.16",
"symfony/polyfill-php81": "^1.22"
"php": ">=8.1",
"psr/clock": "^1.0",
"symfony/polyfill-php83": "^1.28"
},
"provide": {
"psr/clock-implementation": "1.0"
},
"type": "library",
"autoload": {
"files": [
"Resources/now.php"
],
"psr-4": {
"Symfony\\Component\\Clock\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Decouples applications from the system clock",
"homepage": "https://symfony.com",
"keywords": [
"clock",
"psr20",
"time"
],
"support": {
"source": "https://github.com/symfony/clock/tree/v6.4.13"
},
"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-09-25T14:18:03+00:00"
},
{
"name": "symfony/config",
"version": "v6.4.22",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
"reference": "af5917a3b1571f54689e56677a3f06440d2fe4c7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/config/zipball/af5917a3b1571f54689e56677a3f06440d2fe4c7",
"reference": "af5917a3b1571f54689e56677a3f06440d2fe4c7",
"shasum": ""
},
"require": {
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/filesystem": "^5.4|^6.0|^7.0",
"symfony/polyfill-ctype": "~1.8"
},
"conflict": {
"symfony/finder": "<4.4"
"symfony/finder": "<5.4",
"symfony/service-contracts": "<2.5"
},
"require-dev": {
"symfony/event-dispatcher": "^4.4|^5.0|^6.0",
"symfony/finder": "^4.4|^5.0|^6.0",
"symfony/messenger": "^4.4|^5.0|^6.0",
"symfony/service-contracts": "^1.1|^2|^3",
"symfony/yaml": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/yaml": "To use the yaml reference dumper"
"symfony/event-dispatcher": "^5.4|^6.0|^7.0",
"symfony/finder": "^5.4|^6.0|^7.0",
"symfony/messenger": "^5.4|^6.0|^7.0",
"symfony/service-contracts": "^2.5|^3",
"symfony/yaml": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -1944,7 +2157,7 @@
"description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/config/tree/v5.4.7"
"source": "https://github.com/symfony/config/tree/v6.4.22"
},
"funding": [
{
@ -1960,56 +2173,51 @@
"type": "tidelift"
}
],
"time": "2022-03-21T13:42:03+00:00"
"time": "2025-05-14T06:00:01+00:00"
},
{
"name": "symfony/console",
"version": "v5.4.7",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "900275254f0a1a2afff1ab0e11abd5587a10e1d6"
"reference": "9056771b8eca08d026cd3280deeec3cfd99c4d93"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/900275254f0a1a2afff1ab0e11abd5587a10e1d6",
"reference": "900275254f0a1a2afff1ab0e11abd5587a10e1d6",
"url": "https://api.github.com/repos/symfony/console/zipball/9056771b8eca08d026cd3280deeec3cfd99c4d93",
"reference": "9056771b8eca08d026cd3280deeec3cfd99c4d93",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php73": "^1.9",
"symfony/polyfill-php80": "^1.16",
"symfony/service-contracts": "^1.1|^2|^3",
"symfony/string": "^5.1|^6.0"
"symfony/service-contracts": "^2.5|^3",
"symfony/string": "^5.4|^6.0|^7.0"
},
"conflict": {
"psr/log": ">=3",
"symfony/dependency-injection": "<4.4",
"symfony/dotenv": "<5.1",
"symfony/event-dispatcher": "<4.4",
"symfony/lock": "<4.4",
"symfony/process": "<4.4"
"symfony/dependency-injection": "<5.4",
"symfony/dotenv": "<5.4",
"symfony/event-dispatcher": "<5.4",
"symfony/lock": "<5.4",
"symfony/process": "<5.4"
},
"provide": {
"psr/log-implementation": "1.0|2.0"
"psr/log-implementation": "1.0|2.0|3.0"
},
"require-dev": {
"psr/log": "^1|^2",
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/event-dispatcher": "^4.4|^5.0|^6.0",
"symfony/lock": "^4.4|^5.0|^6.0",
"symfony/process": "^4.4|^5.0|^6.0",
"symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"suggest": {
"psr/log": "For using the console logger",
"symfony/event-dispatcher": "",
"symfony/lock": "",
"symfony/process": ""
"psr/log": "^1|^2|^3",
"symfony/config": "^5.4|^6.0|^7.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/event-dispatcher": "^5.4|^6.0|^7.0",
"symfony/http-foundation": "^6.4|^7.0",
"symfony/http-kernel": "^6.4|^7.0",
"symfony/lock": "^5.4|^6.0|^7.0",
"symfony/messenger": "^5.4|^6.0|^7.0",
"symfony/process": "^5.4|^6.0|^7.0",
"symfony/stopwatch": "^5.4|^6.0|^7.0",
"symfony/var-dumper": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -2038,12 +2246,12 @@
"homepage": "https://symfony.com",
"keywords": [
"cli",
"command line",
"command-line",
"console",
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v5.4.7"
"source": "https://github.com/symfony/console/tree/v6.4.23"
},
"funding": [
{
@ -2059,52 +2267,44 @@
"type": "tidelift"
}
],
"time": "2022-03-31T17:09:19+00:00"
"time": "2025-06-27T19:37:22+00:00"
},
{
"name": "symfony/dependency-injection",
"version": "v5.4.16",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
"reference": "a93e1863500940780fc1235f52d54397be2d14b3"
"reference": "0d9f24f3de0a83573fce5c9ed025d6306c6e166b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a93e1863500940780fc1235f52d54397be2d14b3",
"reference": "a93e1863500940780fc1235f52d54397be2d14b3",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/0d9f24f3de0a83573fce5c9ed025d6306c6e166b",
"reference": "0d9f24f3de0a83573fce5c9ed025d6306c6e166b",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"psr/container": "^1.1.1",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-php80": "^1.16",
"symfony/polyfill-php81": "^1.22",
"symfony/service-contracts": "^1.1.6|^2"
"php": ">=8.1",
"psr/container": "^1.1|^2.0",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/service-contracts": "^2.5|^3.0",
"symfony/var-exporter": "^6.4.20|^7.2.5"
},
"conflict": {
"ext-psr": "<1.1|>=2",
"symfony/config": "<5.3",
"symfony/finder": "<4.4",
"symfony/proxy-manager-bridge": "<4.4",
"symfony/yaml": "<4.4.26"
"symfony/config": "<6.1",
"symfony/finder": "<5.4",
"symfony/proxy-manager-bridge": "<6.3",
"symfony/yaml": "<5.4"
},
"provide": {
"psr/container-implementation": "1.0",
"symfony/service-implementation": "1.0|2.0"
"psr/container-implementation": "1.1|2.0",
"symfony/service-implementation": "1.1|2.0|3.0"
},
"require-dev": {
"symfony/config": "^5.3|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/yaml": "^4.4.26|^5.0|^6.0"
},
"suggest": {
"symfony/config": "",
"symfony/expression-language": "For using expressions in service container configuration",
"symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required",
"symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
"symfony/yaml": ""
"symfony/config": "^6.1|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/yaml": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -2132,7 +2332,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/dependency-injection/tree/v5.4.16"
"source": "https://github.com/symfony/dependency-injection/tree/v6.4.23"
},
"funding": [
{
@ -2148,33 +2348,33 @@
"type": "tidelift"
}
],
"time": "2022-11-25T07:33:13+00:00"
"time": "2025-06-23T06:49:06+00:00"
},
{
"name": "symfony/deprecation-contracts",
"version": "v2.5.1",
"version": "v3.6.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
"reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
"reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=8.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "3.6-dev"
}
},
"autoload": {
@ -2199,7 +2399,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1"
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
},
"funding": [
{
@ -2215,29 +2415,32 @@
"type": "tidelift"
}
],
"time": "2022-01-02T09:53:40+00:00"
"time": "2024-09-25T14:21:43+00:00"
},
{
"name": "symfony/dotenv",
"version": "v5.4.5",
"version": "v6.4.16",
"source": {
"type": "git",
"url": "https://github.com/symfony/dotenv.git",
"reference": "83a2310904a4f5d4f42526227b5a578ac82232a9"
"reference": "1ac5e7e7e862d4d574258daf08bd569ba926e4a5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/dotenv/zipball/83a2310904a4f5d4f42526227b5a578ac82232a9",
"reference": "83a2310904a4f5d4f42526227b5a578ac82232a9",
"url": "https://api.github.com/repos/symfony/dotenv/zipball/1ac5e7e7e862d4d574258daf08bd569ba926e4a5",
"reference": "1ac5e7e7e862d4d574258daf08bd569ba926e4a5",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3"
"php": ">=8.1"
},
"conflict": {
"symfony/console": "<5.4",
"symfony/process": "<5.4"
},
"require-dev": {
"symfony/console": "^4.4|^5.0|^6.0",
"symfony/process": "^4.4|^5.0|^6.0"
"symfony/console": "^5.4|^6.0|^7.0",
"symfony/process": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -2270,7 +2473,7 @@
"environment"
],
"support": {
"source": "https://github.com/symfony/dotenv/tree/v5.4.5"
"source": "https://github.com/symfony/dotenv/tree/v6.4.16"
},
"funding": [
{
@ -2286,31 +2489,35 @@
"type": "tidelift"
}
],
"time": "2022-02-15T17:04:12+00:00"
"time": "2024-11-27T11:08:19+00:00"
},
{
"name": "symfony/error-handler",
"version": "v5.4.7",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
"reference": "060bc01856a1846e3e4385261bc9ed11a1dd7b6a"
"reference": "b088e0b175c30b4e06d8085200fa465b586f44fa"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/060bc01856a1846e3e4385261bc9ed11a1dd7b6a",
"reference": "060bc01856a1846e3e4385261bc9ed11a1dd7b6a",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/b088e0b175c30b4e06d8085200fa465b586f44fa",
"reference": "b088e0b175c30b4e06d8085200fa465b586f44fa",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"php": ">=8.1",
"psr/log": "^1|^2|^3",
"symfony/var-dumper": "^4.4|^5.0|^6.0"
"symfony/var-dumper": "^5.4|^6.0|^7.0"
},
"conflict": {
"symfony/deprecation-contracts": "<2.5",
"symfony/http-kernel": "<6.4"
},
"require-dev": {
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/http-kernel": "^4.4|^5.0|^6.0",
"symfony/serializer": "^4.4|^5.0|^6.0"
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/http-kernel": "^6.4|^7.0",
"symfony/serializer": "^5.4|^6.0|^7.0"
},
"bin": [
"Resources/bin/patch-type-declarations"
@ -2341,7 +2548,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/error-handler/tree/v5.4.7"
"source": "https://github.com/symfony/error-handler/tree/v6.4.23"
},
"funding": [
{
@ -2357,48 +2564,43 @@
"type": "tidelift"
}
],
"time": "2022-03-18T16:21:29+00:00"
"time": "2025-06-13T07:39:48+00:00"
},
{
"name": "symfony/event-dispatcher",
"version": "v5.4.3",
"version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
"reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d"
"reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dec8a9f58d20df252b9cd89f1c6c1530f747685d",
"reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e",
"reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/event-dispatcher-contracts": "^2|^3",
"symfony/polyfill-php80": "^1.16"
"php": ">=8.1",
"symfony/event-dispatcher-contracts": "^2.5|^3"
},
"conflict": {
"symfony/dependency-injection": "<4.4"
"symfony/dependency-injection": "<5.4",
"symfony/service-contracts": "<2.5"
},
"provide": {
"psr/event-dispatcher-implementation": "1.0",
"symfony/event-dispatcher-implementation": "2.0"
"symfony/event-dispatcher-implementation": "2.0|3.0"
},
"require-dev": {
"psr/log": "^1|^2|^3",
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/error-handler": "^4.4|^5.0|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/http-foundation": "^4.4|^5.0|^6.0",
"symfony/service-contracts": "^1.1|^2|^3",
"symfony/stopwatch": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/dependency-injection": "",
"symfony/http-kernel": ""
"symfony/config": "^5.4|^6.0|^7.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/error-handler": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/http-foundation": "^5.4|^6.0|^7.0",
"symfony/service-contracts": "^2.5|^3",
"symfony/stopwatch": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -2426,7 +2628,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v5.4.3"
"source": "https://github.com/symfony/event-dispatcher/tree/v6.4.13"
},
"funding": [
{
@ -2442,37 +2644,34 @@
"type": "tidelift"
}
],
"time": "2022-01-02T09:53:40+00:00"
"time": "2024-09-25T14:18:03+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
"version": "v2.5.1",
"version": "v3.6.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "f98b54df6ad059855739db6fcbc2d36995283fe1"
"reference": "59eb412e93815df44f05f342958efa9f46b1e586"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1",
"reference": "f98b54df6ad059855739db6fcbc2d36995283fe1",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586",
"reference": "59eb412e93815df44f05f342958efa9f46b1e586",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"php": ">=8.1",
"psr/event-dispatcher": "^1"
},
"suggest": {
"symfony/event-dispatcher-implementation": ""
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "3.6-dev"
}
},
"autoload": {
@ -2505,7 +2704,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.1"
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0"
},
"funding": [
{
@ -2521,27 +2720,93 @@
"type": "tidelift"
}
],
"time": "2022-01-02T09:53:40+00:00"
"time": "2024-09-25T14:21:43+00:00"
},
{
"name": "symfony/filesystem",
"version": "v5.4.7",
"name": "symfony/expression-language",
"version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "3a4442138d80c9f7b600fb297534ac718b61d37f"
"url": "https://github.com/symfony/expression-language.git",
"reference": "3524904fb026356a5230cd197f9a4e6a61e0e7df"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/3a4442138d80c9f7b600fb297534ac718b61d37f",
"reference": "3a4442138d80c9f7b600fb297534ac718b61d37f",
"url": "https://api.github.com/repos/symfony/expression-language/zipball/3524904fb026356a5230cd197f9a4e6a61e0e7df",
"reference": "3524904fb026356a5230cd197f9a4e6a61e0e7df",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"php": ">=8.1",
"symfony/cache": "^5.4|^6.0|^7.0",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/service-contracts": "^2.5|^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/v6.4.13"
},
"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-10-09T08:40:40+00:00"
},
{
"name": "symfony/filesystem",
"version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/4856c9cf585d5a0313d8d35afd681a526f038dd3",
"reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3",
"shasum": ""
},
"require": {
"php": ">=8.1",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8",
"symfony/polyfill-php80": "^1.16"
"symfony/polyfill-mbstring": "~1.8"
},
"require-dev": {
"symfony/process": "^5.4|^6.4|^7.0"
},
"type": "library",
"autoload": {
@ -2569,7 +2834,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v5.4.7"
"source": "https://github.com/symfony/filesystem/tree/v6.4.13"
},
"funding": [
{
@ -2585,26 +2850,27 @@
"type": "tidelift"
}
],
"time": "2022-04-01T12:33:59+00:00"
"time": "2024-10-25T15:07:50+00:00"
},
{
"name": "symfony/finder",
"version": "v5.4.3",
"version": "v6.4.17",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d"
"reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/231313534dded84c7ecaa79d14bc5da4ccb69b7d",
"reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d",
"url": "https://api.github.com/repos/symfony/finder/zipball/1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7",
"reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-php80": "^1.16"
"php": ">=8.1"
},
"require-dev": {
"symfony/filesystem": "^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -2632,7 +2898,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/finder/tree/v5.4.3"
"source": "https://github.com/symfony/finder/tree/v6.4.17"
},
"funding": [
{
@ -2648,32 +2914,35 @@
"type": "tidelift"
}
],
"time": "2022-01-26T16:34:36+00:00"
"time": "2024-12-29T13:51:37+00:00"
},
{
"name": "symfony/flex",
"version": "v1.18.5",
"version": "v2.8.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/flex.git",
"reference": "10e438f53a972439675dc720706f0cd5c0ed94f1"
"reference": "423c36e369361003dc31ef11c5f15fb589e52c01"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/flex/zipball/10e438f53a972439675dc720706f0cd5c0ed94f1",
"reference": "10e438f53a972439675dc720706f0cd5c0ed94f1",
"url": "https://api.github.com/repos/symfony/flex/zipball/423c36e369361003dc31ef11c5f15fb589e52c01",
"reference": "423c36e369361003dc31ef11c5f15fb589e52c01",
"shasum": ""
},
"require": {
"composer-plugin-api": "^1.0|^2.0",
"php": ">=7.1"
"composer-plugin-api": "^2.1",
"php": ">=8.0"
},
"conflict": {
"composer/semver": "<1.7.2"
},
"require-dev": {
"composer/composer": "^1.0.2|^2.0",
"symfony/dotenv": "^4.4|^5.0|^6.0",
"symfony/filesystem": "^4.4|^5.0|^6.0",
"symfony/phpunit-bridge": "^4.4.12|^5.0|^6.0",
"symfony/process": "^4.4|^5.0|^6.0"
"composer/composer": "^2.1",
"symfony/dotenv": "^5.4|^6.0",
"symfony/filesystem": "^5.4|^6.0",
"symfony/phpunit-bridge": "^5.4|^6.0",
"symfony/process": "^5.4|^6.0"
},
"type": "composer-plugin",
"extra": {
@ -2697,7 +2966,7 @@
"description": "Composer plugin for Symfony",
"support": {
"issues": "https://github.com/symfony/flex/issues",
"source": "https://github.com/symfony/flex/tree/v1.18.5"
"source": "https://github.com/symfony/flex/tree/v2.8.1"
},
"funding": [
{
@ -2713,66 +2982,60 @@
"type": "tidelift"
}
],
"time": "2022-02-16T17:26:46+00:00"
"time": "2025-07-05T07:45:19+00:00"
},
{
"name": "symfony/form",
"version": "v5.4.8",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/form.git",
"reference": "7d1bd919be530e8071314a54bd5ae786452a81bf"
"reference": "6f60a2a9031c49fe92b8703764defa46481db155"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/form/zipball/7d1bd919be530e8071314a54bd5ae786452a81bf",
"reference": "7d1bd919be530e8071314a54bd5ae786452a81bf",
"url": "https://api.github.com/repos/symfony/form/zipball/6f60a2a9031c49fe92b8703764defa46481db155",
"reference": "6f60a2a9031c49fe92b8703764defa46481db155",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/event-dispatcher": "^4.4|^5.0|^6.0",
"symfony/options-resolver": "^5.1|^6.0",
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/event-dispatcher": "^5.4|^6.0|^7.0",
"symfony/options-resolver": "^5.4|^6.0|^7.0",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-icu": "^1.21",
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php80": "^1.16",
"symfony/polyfill-php81": "^1.23",
"symfony/property-access": "^5.0.8|^6.0",
"symfony/service-contracts": "^1.1|^2|^3"
"symfony/property-access": "^5.4|^6.0|^7.0",
"symfony/service-contracts": "^2.5|^3"
},
"conflict": {
"phpunit/phpunit": "<5.4.3",
"symfony/console": "<4.4",
"symfony/dependency-injection": "<4.4",
"symfony/doctrine-bridge": "<4.4",
"symfony/error-handler": "<4.4.5",
"symfony/framework-bundle": "<4.4",
"symfony/http-kernel": "<4.4",
"symfony/translation": "<4.4",
"symfony/translation-contracts": "<1.1.7",
"symfony/twig-bridge": "<4.4"
"symfony/console": "<5.4",
"symfony/dependency-injection": "<5.4",
"symfony/doctrine-bridge": "<5.4.21|>=6,<6.2.7",
"symfony/error-handler": "<5.4",
"symfony/framework-bundle": "<5.4",
"symfony/http-kernel": "<5.4",
"symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3",
"symfony/translation-contracts": "<2.5",
"symfony/twig-bridge": "<6.3"
},
"require-dev": {
"doctrine/collections": "~1.0",
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/console": "^5.4|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/http-foundation": "^4.4|^5.0|^6.0",
"symfony/http-kernel": "^4.4|^5.0|^6.0",
"symfony/intl": "^4.4|^5.0|^6.0",
"symfony/security-csrf": "^4.4|^5.0|^6.0",
"symfony/translation": "^4.4|^5.0|^6.0",
"symfony/uid": "^5.1|^6.0",
"symfony/validator": "^4.4.17|^5.1.9|^6.0",
"symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/security-csrf": "For protecting forms against CSRF attacks.",
"symfony/twig-bridge": "For templating with Twig.",
"symfony/validator": "For form validation."
"doctrine/collections": "^1.0|^2.0",
"symfony/config": "^5.4|^6.0|^7.0",
"symfony/console": "^5.4|^6.0|^7.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/html-sanitizer": "^6.1|^7.0",
"symfony/http-foundation": "^5.4|^6.0|^7.0",
"symfony/http-kernel": "^5.4|^6.0|^7.0",
"symfony/intl": "^5.4|^6.0|^7.0",
"symfony/security-core": "^6.2|^7.0",
"symfony/security-csrf": "^5.4|^6.0|^7.0",
"symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3",
"symfony/uid": "^5.4|^6.0|^7.0",
"symfony/validator": "^5.4|^6.0|^7.0",
"symfony/var-dumper": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -2800,7 +3063,7 @@
"description": "Allows to easily create, process and reuse HTML forms",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/form/tree/v5.4.8"
"source": "https://github.com/symfony/form/tree/v6.4.23"
},
"funding": [
{
@ -2816,114 +3079,112 @@
"type": "tidelift"
}
],
"time": "2022-04-23T15:25:10+00:00"
"time": "2025-06-05T16:22:31+00:00"
},
{
"name": "symfony/framework-bundle",
"version": "v5.4.7",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/framework-bundle.git",
"reference": "7520f553c7a7721652c1b7ac95c09dae62a1676e"
"reference": "ff892d3ab4b8aa35921bc2120a4b31d57948fe22"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/7520f553c7a7721652c1b7ac95c09dae62a1676e",
"reference": "7520f553c7a7721652c1b7ac95c09dae62a1676e",
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/ff892d3ab4b8aa35921bc2120a4b31d57948fe22",
"reference": "ff892d3ab4b8aa35921bc2120a4b31d57948fe22",
"shasum": ""
},
"require": {
"composer-runtime-api": ">=2.1",
"ext-xml": "*",
"php": ">=7.2.5",
"symfony/cache": "^5.2|^6.0",
"symfony/config": "^5.3|^6.0",
"symfony/dependency-injection": "^5.4.5|^6.0.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/error-handler": "^4.4.1|^5.0.1|^6.0",
"symfony/event-dispatcher": "^5.1|^6.0",
"symfony/filesystem": "^4.4|^5.0|^6.0",
"symfony/finder": "^4.4|^5.0|^6.0",
"symfony/http-foundation": "^5.3|^6.0",
"symfony/http-kernel": "^5.4|^6.0",
"php": ">=8.1",
"symfony/cache": "^5.4|^6.0|^7.0",
"symfony/config": "^6.1|^7.0",
"symfony/dependency-injection": "^6.4.12|^7.0",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/error-handler": "^6.1|^7.0",
"symfony/event-dispatcher": "^5.4|^6.0|^7.0",
"symfony/filesystem": "^5.4|^6.0|^7.0",
"symfony/finder": "^5.4|^6.0|^7.0",
"symfony/http-foundation": "^6.4|^7.0",
"symfony/http-kernel": "^6.4",
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php80": "^1.16",
"symfony/polyfill-php81": "^1.22",
"symfony/routing": "^5.3|^6.0"
"symfony/routing": "^6.4|^7.0"
},
"conflict": {
"doctrine/annotations": "<1.13.1",
"doctrine/cache": "<1.11",
"doctrine/persistence": "<1.3",
"phpdocumentor/reflection-docblock": "<3.2.2",
"phpdocumentor/type-resolver": "<1.4.0",
"phpunit/phpunit": "<5.4.3",
"symfony/asset": "<5.3",
"symfony/console": "<5.2.5",
"symfony/dom-crawler": "<4.4",
"symfony/dotenv": "<5.1",
"symfony/form": "<5.2",
"symfony/http-client": "<4.4",
"symfony/lock": "<4.4",
"symfony/mailer": "<5.2",
"symfony/messenger": "<5.4",
"symfony/mime": "<4.4",
"symfony/property-access": "<5.3",
"symfony/property-info": "<4.4",
"symfony/security-csrf": "<5.3",
"symfony/serializer": "<5.2",
"symfony/service-contracts": ">=3.0",
"symfony/stopwatch": "<4.4",
"symfony/translation": "<5.3",
"symfony/twig-bridge": "<4.4",
"symfony/twig-bundle": "<4.4",
"symfony/validator": "<5.2",
"symfony/web-profiler-bundle": "<4.4",
"symfony/workflow": "<5.2"
"symfony/asset": "<5.4",
"symfony/asset-mapper": "<6.4",
"symfony/clock": "<6.3",
"symfony/console": "<5.4|>=7.0",
"symfony/dom-crawler": "<6.4",
"symfony/dotenv": "<5.4",
"symfony/form": "<5.4",
"symfony/http-client": "<6.3",
"symfony/lock": "<5.4",
"symfony/mailer": "<5.4",
"symfony/messenger": "<6.3",
"symfony/mime": "<6.4",
"symfony/property-access": "<5.4",
"symfony/property-info": "<5.4",
"symfony/runtime": "<5.4.45|>=6.0,<6.4.13|>=7.0,<7.1.6",
"symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4",
"symfony/security-core": "<5.4",
"symfony/security-csrf": "<5.4",
"symfony/serializer": "<6.4",
"symfony/stopwatch": "<5.4",
"symfony/translation": "<6.4",
"symfony/twig-bridge": "<5.4",
"symfony/twig-bundle": "<5.4",
"symfony/validator": "<6.4",
"symfony/web-profiler-bundle": "<6.4",
"symfony/workflow": "<6.4"
},
"require-dev": {
"doctrine/annotations": "^1.13.1",
"doctrine/cache": "^1.11|^2.0",
"doctrine/persistence": "^1.3|^2.0",
"doctrine/annotations": "^1.13.1|^2",
"doctrine/persistence": "^1.3|^2|^3",
"dragonmantank/cron-expression": "^3.1",
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
"symfony/asset": "^5.3|^6.0",
"symfony/browser-kit": "^5.4|^6.0",
"symfony/console": "^5.4|^6.0",
"symfony/css-selector": "^4.4|^5.0|^6.0",
"symfony/dom-crawler": "^4.4.30|^5.3.7|^6.0",
"symfony/dotenv": "^5.1|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/form": "^5.2|^6.0",
"symfony/http-client": "^4.4|^5.0|^6.0",
"symfony/lock": "^4.4|^5.0|^6.0",
"symfony/mailer": "^5.2|^6.0",
"symfony/messenger": "^5.4|^6.0",
"symfony/mime": "^4.4|^5.0|^6.0",
"symfony/notifier": "^5.4|^6.0",
"seld/jsonlint": "^1.10",
"symfony/asset": "^5.4|^6.0|^7.0",
"symfony/asset-mapper": "^6.4|^7.0",
"symfony/browser-kit": "^5.4|^6.0|^7.0",
"symfony/clock": "^6.2|^7.0",
"symfony/console": "^5.4.9|^6.0.9|^7.0",
"symfony/css-selector": "^5.4|^6.0|^7.0",
"symfony/dom-crawler": "^6.4|^7.0",
"symfony/dotenv": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/form": "^5.4|^6.0|^7.0",
"symfony/html-sanitizer": "^6.1|^7.0",
"symfony/http-client": "^6.3|^7.0",
"symfony/lock": "^5.4|^6.0|^7.0",
"symfony/mailer": "^5.4|^6.0|^7.0",
"symfony/messenger": "^6.3|^7.0",
"symfony/mime": "^6.4|^7.0",
"symfony/notifier": "^5.4|^6.0|^7.0",
"symfony/polyfill-intl-icu": "~1.0",
"symfony/process": "^4.4|^5.0|^6.0",
"symfony/property-info": "^4.4|^5.0|^6.0",
"symfony/rate-limiter": "^5.2|^6.0",
"symfony/security-bundle": "^5.4|^6.0",
"symfony/serializer": "^5.4|^6.0",
"symfony/stopwatch": "^4.4|^5.0|^6.0",
"symfony/string": "^5.0|^6.0",
"symfony/translation": "^5.3|^6.0",
"symfony/twig-bundle": "^4.4|^5.0|^6.0",
"symfony/validator": "^5.2|^6.0",
"symfony/web-link": "^4.4|^5.0|^6.0",
"symfony/workflow": "^5.2|^6.0",
"symfony/yaml": "^4.4|^5.0|^6.0",
"twig/twig": "^2.10|^3.0"
},
"suggest": {
"ext-apcu": "For best performance of the system caches",
"symfony/console": "For using the console commands",
"symfony/form": "For using forms",
"symfony/property-info": "For using the property_info service",
"symfony/serializer": "For using the serializer service",
"symfony/validator": "For using validation",
"symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering",
"symfony/yaml": "For using the debug:config and lint:yaml commands"
"symfony/process": "^5.4|^6.0|^7.0",
"symfony/property-info": "^5.4|^6.0|^7.0",
"symfony/rate-limiter": "^5.4|^6.0|^7.0",
"symfony/scheduler": "^6.4.4|^7.0.4",
"symfony/security-bundle": "^5.4|^6.0|^7.0",
"symfony/semaphore": "^5.4|^6.0|^7.0",
"symfony/serializer": "^6.4|^7.0",
"symfony/stopwatch": "^5.4|^6.0|^7.0",
"symfony/string": "^5.4|^6.0|^7.0",
"symfony/translation": "^6.4|^7.0",
"symfony/twig-bundle": "^5.4|^6.0|^7.0",
"symfony/uid": "^5.4|^6.0|^7.0",
"symfony/validator": "^6.4|^7.0",
"symfony/web-link": "^5.4|^6.0|^7.0",
"symfony/workflow": "^6.4|^7.0",
"symfony/yaml": "^5.4|^6.0|^7.0",
"twig/twig": "^2.10|^3.0.4"
},
"type": "symfony-bundle",
"autoload": {
@ -2951,7 +3212,7 @@
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/framework-bundle/tree/v5.4.7"
"source": "https://github.com/symfony/framework-bundle/tree/v6.4.23"
},
"funding": [
{
@ -2967,50 +3228,53 @@
"type": "tidelift"
}
],
"time": "2022-04-01T06:09:41+00:00"
"time": "2025-06-26T21:24:02+00:00"
},
{
"name": "symfony/http-client",
"version": "v5.4.8",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client.git",
"reference": "0dabec4e3898d3e00451dd47b5ef839168f9bbf5"
"reference": "19f11e742b94dcfd968a54f5381bb9082a88cb57"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-client/zipball/0dabec4e3898d3e00451dd47b5ef839168f9bbf5",
"reference": "0dabec4e3898d3e00451dd47b5ef839168f9bbf5",
"url": "https://api.github.com/repos/symfony/http-client/zipball/19f11e742b94dcfd968a54f5381bb9082a88cb57",
"reference": "19f11e742b94dcfd968a54f5381bb9082a88cb57",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"php": ">=8.1",
"psr/log": "^1|^2|^3",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/http-client-contracts": "^2.4",
"symfony/polyfill-php73": "^1.11",
"symfony/polyfill-php80": "^1.16",
"symfony/service-contracts": "^1.0|^2|^3"
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/http-client-contracts": "~3.4.4|^3.5.2",
"symfony/service-contracts": "^2.5|^3"
},
"conflict": {
"php-http/discovery": "<1.15",
"symfony/http-foundation": "<6.3"
},
"provide": {
"php-http/async-client-implementation": "*",
"php-http/client-implementation": "*",
"psr/http-client-implementation": "1.0",
"symfony/http-client-implementation": "2.4"
"symfony/http-client-implementation": "3.0"
},
"require-dev": {
"amphp/amp": "^2.5",
"amphp/http-client": "^4.2.1",
"amphp/http-tunnel": "^1.0",
"amphp/socket": "^1.1",
"guzzlehttp/promises": "^1.4",
"guzzlehttp/promises": "^1.4|^2.0",
"nyholm/psr7": "^1.0",
"php-http/httplug": "^1.0|^2.0",
"psr/http-client": "^1.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/http-kernel": "^4.4.13|^5.1.5|^6.0",
"symfony/process": "^4.4|^5.0|^6.0",
"symfony/stopwatch": "^4.4|^5.0|^6.0"
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/http-kernel": "^5.4|^6.0|^7.0",
"symfony/messenger": "^5.4|^6.0|^7.0",
"symfony/process": "^5.4|^6.0|^7.0",
"symfony/stopwatch": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -3037,8 +3301,11 @@
],
"description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously",
"homepage": "https://symfony.com",
"keywords": [
"http"
],
"support": {
"source": "https://github.com/symfony/http-client/tree/v5.4.8"
"source": "https://github.com/symfony/http-client/tree/v6.4.23"
},
"funding": [
{
@ -3054,42 +3321,42 @@
"type": "tidelift"
}
],
"time": "2022-04-12T16:02:29+00:00"
"time": "2025-06-27T20:02:31+00:00"
},
{
"name": "symfony/http-client-contracts",
"version": "v2.5.1",
"version": "v3.6.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client-contracts.git",
"reference": "1a4f708e4e87f335d1b1be6148060739152f0bd5"
"reference": "75d7043853a42837e68111812f4d964b01e5101c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/1a4f708e4e87f335d1b1be6148060739152f0bd5",
"reference": "1a4f708e4e87f335d1b1be6148060739152f0bd5",
"url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c",
"reference": "75d7043853a42837e68111812f4d964b01e5101c",
"shasum": ""
},
"require": {
"php": ">=7.2.5"
},
"suggest": {
"symfony/http-client-implementation": ""
"php": ">=8.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "3.6-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Contracts\\HttpClient\\": ""
}
},
"exclude-from-classmap": [
"/Test/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@ -3116,7 +3383,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/http-client-contracts/tree/v2.5.1"
"source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0"
},
"funding": [
{
@ -3132,36 +3399,40 @@
"type": "tidelift"
}
],
"time": "2022-03-13T20:07:29+00:00"
"time": "2025-04-29T11:18:49+00:00"
},
{
"name": "symfony/http-foundation",
"version": "v5.4.6",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "34e89bc147633c0f9dd6caaaf56da3b806a21465"
"reference": "452d19f945ee41345fd8a50c18b60783546b7bd3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/34e89bc147633c0f9dd6caaaf56da3b806a21465",
"reference": "34e89bc147633c0f9dd6caaaf56da3b806a21465",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/452d19f945ee41345fd8a50c18b60783546b7bd3",
"reference": "452d19f945ee41345fd8a50c18b60783546b7bd3",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.1",
"symfony/polyfill-php80": "^1.16"
"symfony/polyfill-php83": "^1.27"
},
"conflict": {
"symfony/cache": "<6.4.12|>=7.0,<7.1.5"
},
"require-dev": {
"predis/predis": "~1.0",
"symfony/cache": "^4.4|^5.0|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/mime": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/mime": "To use the file extension guesser"
"doctrine/dbal": "^2.13.1|^3|^4",
"predis/predis": "^1.1|^2.0",
"symfony/cache": "^6.4.12|^7.1.5",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0",
"symfony/mime": "^5.4|^6.0|^7.0",
"symfony/rate-limiter": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -3189,7 +3460,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-foundation/tree/v5.4.6"
"source": "https://github.com/symfony/http-foundation/tree/v6.4.23"
},
"funding": [
{
@ -3205,76 +3476,78 @@
"type": "tidelift"
}
],
"time": "2022-03-05T21:03:43+00:00"
"time": "2025-05-26T09:17:58+00:00"
},
{
"name": "symfony/http-kernel",
"version": "v5.4.7",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
"reference": "509243b9b3656db966284c45dffce9316c1ecc5c"
"reference": "2bb2cba685aabd859f22cf6946554e8e7f3c329a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/509243b9b3656db966284c45dffce9316c1ecc5c",
"reference": "509243b9b3656db966284c45dffce9316c1ecc5c",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/2bb2cba685aabd859f22cf6946554e8e7f3c329a",
"reference": "2bb2cba685aabd859f22cf6946554e8e7f3c329a",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"psr/log": "^1|^2",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/error-handler": "^4.4|^5.0|^6.0",
"symfony/event-dispatcher": "^5.0|^6.0",
"symfony/http-foundation": "^5.3.7|^6.0",
"symfony/polyfill-ctype": "^1.8",
"symfony/polyfill-php73": "^1.9",
"symfony/polyfill-php80": "^1.16"
"php": ">=8.1",
"psr/log": "^1|^2|^3",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/error-handler": "^6.4|^7.0",
"symfony/event-dispatcher": "^5.4|^6.0|^7.0",
"symfony/http-foundation": "^6.4|^7.0",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
"symfony/browser-kit": "<5.4",
"symfony/cache": "<5.0",
"symfony/config": "<5.0",
"symfony/console": "<4.4",
"symfony/dependency-injection": "<5.3",
"symfony/doctrine-bridge": "<5.0",
"symfony/form": "<5.0",
"symfony/http-client": "<5.0",
"symfony/mailer": "<5.0",
"symfony/messenger": "<5.0",
"symfony/translation": "<5.0",
"symfony/twig-bridge": "<5.0",
"symfony/validator": "<5.0",
"symfony/cache": "<5.4",
"symfony/config": "<6.1",
"symfony/console": "<5.4",
"symfony/dependency-injection": "<6.4",
"symfony/doctrine-bridge": "<5.4",
"symfony/form": "<5.4",
"symfony/http-client": "<5.4",
"symfony/http-client-contracts": "<2.5",
"symfony/mailer": "<5.4",
"symfony/messenger": "<5.4",
"symfony/translation": "<5.4",
"symfony/translation-contracts": "<2.5",
"symfony/twig-bridge": "<5.4",
"symfony/validator": "<6.4",
"symfony/var-dumper": "<6.3",
"twig/twig": "<2.13"
},
"provide": {
"psr/log-implementation": "1.0|2.0"
"psr/log-implementation": "1.0|2.0|3.0"
},
"require-dev": {
"psr/cache": "^1.0|^2.0|^3.0",
"symfony/browser-kit": "^5.4|^6.0",
"symfony/config": "^5.0|^6.0",
"symfony/console": "^4.4|^5.0|^6.0",
"symfony/css-selector": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^5.3|^6.0",
"symfony/dom-crawler": "^4.4|^5.0|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/finder": "^4.4|^5.0|^6.0",
"symfony/http-client-contracts": "^1.1|^2|^3",
"symfony/process": "^4.4|^5.0|^6.0",
"symfony/routing": "^4.4|^5.0|^6.0",
"symfony/stopwatch": "^4.4|^5.0|^6.0",
"symfony/translation": "^4.4|^5.0|^6.0",
"symfony/translation-contracts": "^1.1|^2|^3",
"symfony/browser-kit": "^5.4|^6.0|^7.0",
"symfony/clock": "^6.2|^7.0",
"symfony/config": "^6.1|^7.0",
"symfony/console": "^5.4|^6.0|^7.0",
"symfony/css-selector": "^5.4|^6.0|^7.0",
"symfony/dependency-injection": "^6.4|^7.0",
"symfony/dom-crawler": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/finder": "^5.4|^6.0|^7.0",
"symfony/http-client-contracts": "^2.5|^3",
"symfony/process": "^5.4|^6.0|^7.0",
"symfony/property-access": "^5.4.5|^6.0.5|^7.0",
"symfony/routing": "^5.4|^6.0|^7.0",
"symfony/serializer": "^6.4.4|^7.0.4",
"symfony/stopwatch": "^5.4|^6.0|^7.0",
"symfony/translation": "^5.4|^6.0|^7.0",
"symfony/translation-contracts": "^2.5|^3",
"symfony/uid": "^5.4|^6.0|^7.0",
"symfony/validator": "^6.4|^7.0",
"symfony/var-dumper": "^5.4|^6.4|^7.0",
"symfony/var-exporter": "^6.2|^7.0",
"twig/twig": "^2.13|^3.0.4"
},
"suggest": {
"symfony/browser-kit": "",
"symfony/config": "",
"symfony/console": "",
"symfony/dependency-injection": ""
},
"type": "library",
"autoload": {
"psr-4": {
@ -3301,7 +3574,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-kernel/tree/v5.4.7"
"source": "https://github.com/symfony/http-kernel/tree/v6.4.23"
},
"funding": [
{
@ -3317,106 +3590,25 @@
"type": "tidelift"
}
],
"time": "2022-04-02T06:04:20+00:00"
},
{
"name": "symfony/lock",
"version": "v5.4.15",
"source": {
"type": "git",
"url": "https://github.com/symfony/lock.git",
"reference": "109a20faa6119578b46457ef8cffb9389e20e5ca"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/lock/zipball/109a20faa6119578b46457ef8cffb9389e20e5ca",
"reference": "109a20faa6119578b46457ef8cffb9389e20e5ca",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"psr/log": "^1|^2|^3",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-php80": "^1.16"
},
"conflict": {
"doctrine/dbal": "<2.13"
},
"require-dev": {
"doctrine/dbal": "^2.13|^3.0",
"predis/predis": "~1.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Lock\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jérémy Derussé",
"email": "jeremy@derusse.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Creates and manages locks, a mechanism to provide exclusive access to a shared resource",
"homepage": "https://symfony.com",
"keywords": [
"cas",
"flock",
"locking",
"mutex",
"redlock",
"semaphore"
],
"support": {
"source": "https://github.com/symfony/lock/tree/v5.4.15"
},
"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": "2022-10-27T07:55:40+00:00"
"time": "2025-06-28T08:14:51+00:00"
},
{
"name": "symfony/options-resolver",
"version": "v5.4.3",
"version": "v6.4.16",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
"reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8"
"reference": "368128ad168f20e22c32159b9f761e456cec0c78"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/cc1147cb11af1b43f503ac18f31aa3bec213aba8",
"reference": "cc1147cb11af1b43f503ac18f31aa3bec213aba8",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/368128ad168f20e22c32159b9f761e456cec0c78",
"reference": "368128ad168f20e22c32159b9f761e456cec0c78",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-php73": "~1.0",
"symfony/polyfill-php80": "^1.16"
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3"
},
"type": "library",
"autoload": {
@ -3449,7 +3641,7 @@
"options"
],
"support": {
"source": "https://github.com/symfony/options-resolver/tree/v5.4.3"
"source": "https://github.com/symfony/options-resolver/tree/v6.4.16"
},
"funding": [
{
@ -3465,32 +3657,31 @@
"type": "tidelift"
}
],
"time": "2022-01-02T09:53:40+00:00"
"time": "2024-11-20T10:57:02+00:00"
},
{
"name": "symfony/password-hasher",
"version": "v5.4.8",
"version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/password-hasher.git",
"reference": "bc9c982b25c0292aa4e009b3e9cc9835e4d1e94f"
"reference": "e97a1b31f60b8bdfc1fdedab4398538da9441d47"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/password-hasher/zipball/bc9c982b25c0292aa4e009b3e9cc9835e4d1e94f",
"reference": "bc9c982b25c0292aa4e009b3e9cc9835e4d1e94f",
"url": "https://api.github.com/repos/symfony/password-hasher/zipball/e97a1b31f60b8bdfc1fdedab4398538da9441d47",
"reference": "e97a1b31f60b8bdfc1fdedab4398538da9441d47",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/polyfill-php80": "^1.15"
"php": ">=8.1"
},
"conflict": {
"symfony/security-core": "<5.3"
"symfony/security-core": "<5.4"
},
"require-dev": {
"symfony/console": "^5.3|^6.0",
"symfony/security-core": "^5.3|^6.0"
"symfony/console": "^5.4|^6.0|^7.0",
"symfony/security-core": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -3522,7 +3713,7 @@
"password"
],
"support": {
"source": "https://github.com/symfony/password-hasher/tree/v5.4.8"
"source": "https://github.com/symfony/password-hasher/tree/v6.4.13"
},
"funding": [
{
@ -3538,36 +3729,33 @@
"type": "tidelift"
}
],
"time": "2022-04-15T13:57:25+00:00"
"time": "2024-09-25T14:18:03+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
"version": "v1.25.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
"reference": "81b86b50cf841a64252b439e738e97f4a34e2783"
"reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783",
"reference": "81b86b50cf841a64252b439e738e97f4a34e2783",
"url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
"reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -3603,7 +3791,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0"
"source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
},
"funding": [
{
@ -3619,36 +3807,33 @@
"type": "tidelift"
}
],
"time": "2021-11-23T21:10:46+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-intl-icu",
"version": "v1.25.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-icu.git",
"reference": "c023a439b8551e320cc3c8433b198e408a623af1"
"reference": "763d2a91fea5681509ca01acbc1c5e450d127811"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/c023a439b8551e320cc3c8433b198e408a623af1",
"reference": "c023a439b8551e320cc3c8433b198e408a623af1",
"url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/763d2a91fea5681509ca01acbc1c5e450d127811",
"reference": "763d2a91fea5681509ca01acbc1c5e450d127811",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance and support of other locales than \"en\""
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -3690,7 +3875,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.25.0"
"source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.32.0"
},
"funding": [
{
@ -3706,36 +3891,33 @@
"type": "tidelift"
}
],
"time": "2021-10-26T17:16:04+00:00"
"time": "2024-12-21T18:38:29+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
"version": "v1.25.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
"reference": "3833d7255cc303546435cb650316bff708a1c75c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8",
"reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
"reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -3774,7 +3956,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0"
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
},
"funding": [
{
@ -3790,24 +3972,25 @@
"type": "tidelift"
}
],
"time": "2021-02-19T12:13:01+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.25.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825"
"reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825",
"reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
"reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
"shasum": ""
},
"require": {
"php": ">=7.1"
"ext-iconv": "*",
"php": ">=7.2"
},
"provide": {
"ext-mbstring": "*"
@ -3817,12 +4000,9 @@
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -3857,7 +4037,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0"
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
},
"funding": [
{
@ -3873,112 +4053,30 @@
"type": "tidelift"
}
],
"time": "2021-11-30T18:21:41+00:00"
},
{
"name": "symfony/polyfill-php73",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
"reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5",
"reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php73\\": ""
},
"classmap": [
"Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2021-06-05T21:20:04+00:00"
"time": "2024-12-23T08:48:59+00:00"
},
{
"name": "symfony/polyfill-php80",
"version": "v1.25.0",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
"reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c"
"reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c",
"reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c",
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
"reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -4019,7 +4117,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0"
"source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0"
},
"funding": [
{
@ -4035,33 +4133,30 @@
"type": "tidelift"
}
],
"time": "2022-03-04T08:16:47+00:00"
"time": "2025-01-02T08:10:11+00:00"
},
{
"name": "symfony/polyfill-php81",
"version": "v1.25.0",
"name": "symfony/polyfill-php83",
"version": "v1.32.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php81.git",
"reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f"
"url": "https://github.com/symfony/polyfill-php83.git",
"reference": "2fb86d65e2d424369ad2905e83b236a8805ba491"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f",
"reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f",
"url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491",
"reference": "2fb86d65e2d424369ad2905e83b236a8805ba491",
"shasum": ""
},
"require": {
"php": ">=7.1"
"php": ">=7.2"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
@ -4069,7 +4164,7 @@
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php81\\": ""
"Symfony\\Polyfill\\Php83\\": ""
},
"classmap": [
"Resources/stubs"
@ -4089,7 +4184,7 @@
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
"description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
@ -4098,7 +4193,7 @@
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php81/tree/v1.25.0"
"source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0"
},
"funding": [
{
@ -4114,33 +4209,29 @@
"type": "tidelift"
}
],
"time": "2021-09-13T13:58:11+00:00"
"time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/property-access",
"version": "v5.4.8",
"version": "v6.4.18",
"source": {
"type": "git",
"url": "https://github.com/symfony/property-access.git",
"reference": "fe501d498d6ec7e9efe928c90fabedf629116495"
"reference": "80e0378f2f058b60d87dedc3c760caec882e992c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/property-access/zipball/fe501d498d6ec7e9efe928c90fabedf629116495",
"reference": "fe501d498d6ec7e9efe928c90fabedf629116495",
"url": "https://api.github.com/repos/symfony/property-access/zipball/80e0378f2f058b60d87dedc3c760caec882e992c",
"reference": "80e0378f2f058b60d87dedc3c760caec882e992c",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-php80": "^1.16",
"symfony/property-info": "^5.2|^6.0"
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/property-info": "^5.4|^6.0|^7.0"
},
"require-dev": {
"symfony/cache": "^4.4|^5.0|^6.0"
},
"suggest": {
"psr/cache-implementation": "To cache access methods."
"symfony/cache": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -4175,11 +4266,11 @@
"injection",
"object",
"property",
"property path",
"property-path",
"reflection"
],
"support": {
"source": "https://github.com/symfony/property-access/tree/v5.4.8"
"source": "https://github.com/symfony/property-access/tree/v6.4.18"
},
"funding": [
{
@ -4195,46 +4286,41 @@
"type": "tidelift"
}
],
"time": "2022-04-12T15:48:08+00:00"
"time": "2024-12-16T14:42:05+00:00"
},
{
"name": "symfony/property-info",
"version": "v5.4.7",
"version": "v6.4.18",
"source": {
"type": "git",
"url": "https://github.com/symfony/property-info.git",
"reference": "0fc07795712972b9792f203d0fe0e77c26c3281d"
"reference": "94d18e5cc11a37fd92856d38b61d9cdf72536a1e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/property-info/zipball/0fc07795712972b9792f203d0fe0e77c26c3281d",
"reference": "0fc07795712972b9792f203d0fe0e77c26c3281d",
"url": "https://api.github.com/repos/symfony/property-info/zipball/94d18e5cc11a37fd92856d38b61d9cdf72536a1e",
"reference": "94d18e5cc11a37fd92856d38b61d9cdf72536a1e",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-php80": "^1.16",
"symfony/string": "^5.1|^6.0"
"php": ">=8.1",
"symfony/string": "^5.4|^6.0|^7.0"
},
"conflict": {
"phpdocumentor/reflection-docblock": "<3.2.2",
"phpdocumentor/type-resolver": "<1.4.0",
"symfony/dependency-injection": "<4.4"
"doctrine/annotations": "<1.12",
"phpdocumentor/reflection-docblock": "<5.2",
"phpdocumentor/type-resolver": "<1.5.1",
"symfony/cache": "<5.4",
"symfony/dependency-injection": "<5.4|>=6.0,<6.4",
"symfony/serializer": "<5.4"
},
"require-dev": {
"doctrine/annotations": "^1.10.4",
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
"phpstan/phpdoc-parser": "^1.0",
"symfony/cache": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/serializer": "^4.4|^5.0|^6.0"
},
"suggest": {
"phpdocumentor/reflection-docblock": "To use the PHPDoc",
"psr/cache-implementation": "To cache results",
"symfony/doctrine-bridge": "To use Doctrine metadata",
"symfony/serializer": "To use Serializer metadata"
"doctrine/annotations": "^1.12|^2",
"phpdocumentor/reflection-docblock": "^5.2",
"phpstan/phpdoc-parser": "^1.0|^2.0",
"symfony/cache": "^5.4|^6.0|^7.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/serializer": "^5.4|^6.4|^7.0"
},
"type": "library",
"autoload": {
@ -4270,7 +4356,7 @@
"validator"
],
"support": {
"source": "https://github.com/symfony/property-info/tree/v5.4.7"
"source": "https://github.com/symfony/property-info/tree/v6.4.18"
},
"funding": [
{
@ -4286,46 +4372,42 @@
"type": "tidelift"
}
],
"time": "2022-03-30T13:40:48+00:00"
"time": "2025-01-21T10:52:27+00:00"
},
{
"name": "symfony/psr-http-message-bridge",
"version": "v2.1.4",
"version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/psr-http-message-bridge.git",
"reference": "a125b93ef378c492e274f217874906fb9babdebb"
"reference": "c9cf83326a1074f83a738fc5320945abf7fb7fec"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/a125b93ef378c492e274f217874906fb9babdebb",
"reference": "a125b93ef378c492e274f217874906fb9babdebb",
"url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/c9cf83326a1074f83a738fc5320945abf7fb7fec",
"reference": "c9cf83326a1074f83a738fc5320945abf7fb7fec",
"shasum": ""
},
"require": {
"php": ">=7.1",
"psr/http-message": "^1.0",
"symfony/http-foundation": "^4.4 || ^5.0 || ^6.0"
"php": ">=8.1",
"psr/http-message": "^1.0|^2.0",
"symfony/http-foundation": "^5.4|^6.0|^7.0"
},
"conflict": {
"php-http/discovery": "<1.15",
"symfony/http-kernel": "<6.2"
},
"require-dev": {
"nyholm/psr7": "^1.1",
"psr/log": "^1.1 || ^2 || ^3",
"symfony/browser-kit": "^4.4 || ^5.0 || ^6.0",
"symfony/config": "^4.4 || ^5.0 || ^6.0",
"symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0",
"symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0",
"symfony/http-kernel": "^4.4 || ^5.0 || ^6.0",
"symfony/phpunit-bridge": "^5.4@dev || ^6.0"
},
"suggest": {
"nyholm/psr7": "For a super lightweight PSR-7/17 implementation"
"php-http/discovery": "^1.15",
"psr/log": "^1.1.4|^2|^3",
"symfony/browser-kit": "^5.4|^6.0|^7.0",
"symfony/config": "^5.4|^6.0|^7.0",
"symfony/event-dispatcher": "^5.4|^6.0|^7.0",
"symfony/framework-bundle": "^6.2|^7.0",
"symfony/http-kernel": "^6.2|^7.0"
},
"type": "symfony-bridge",
"extra": {
"branch-alias": {
"dev-main": "2.1-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Bridge\\PsrHttpMessage\\": ""
@ -4345,11 +4427,11 @@
},
{
"name": "Symfony Community",
"homepage": "http://symfony.com/contributors"
"homepage": "https://symfony.com/contributors"
}
],
"description": "PSR HTTP message bridge",
"homepage": "http://symfony.com",
"homepage": "https://symfony.com",
"keywords": [
"http",
"http-message",
@ -4357,8 +4439,7 @@
"psr-7"
],
"support": {
"issues": "https://github.com/symfony/psr-http-message-bridge/issues",
"source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.4"
"source": "https://github.com/symfony/psr-http-message-bridge/tree/v6.4.13"
},
"funding": [
{
@ -4374,29 +4455,30 @@
"type": "tidelift"
}
],
"time": "2022-11-28T22:46:34+00:00"
"time": "2024-09-25T14:18:03+00:00"
},
{
"name": "symfony/rate-limiter",
"version": "v5.4.11",
"version": "v6.4.15",
"source": {
"type": "git",
"url": "https://github.com/symfony/rate-limiter.git",
"reference": "1a3a43eeb498290100e4a1559f4a48be14900bc2"
"reference": "e250d82fc17b277b97cbce94efef5414aff29bf9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/rate-limiter/zipball/1a3a43eeb498290100e4a1559f4a48be14900bc2",
"reference": "1a3a43eeb498290100e4a1559f4a48be14900bc2",
"url": "https://api.github.com/repos/symfony/rate-limiter/zipball/e250d82fc17b277b97cbce94efef5414aff29bf9",
"reference": "e250d82fc17b277b97cbce94efef5414aff29bf9",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/lock": "^5.2|^6.0",
"symfony/options-resolver": "^5.1|^6.0"
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/options-resolver": "^5.4|^6.0|^7.0"
},
"require-dev": {
"psr/cache": "^1.0|^2.0|^3.0"
"psr/cache": "^1.0|^2.0|^3.0",
"symfony/lock": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -4428,7 +4510,7 @@
"rate-limiter"
],
"support": {
"source": "https://github.com/symfony/rate-limiter/tree/v5.4.11"
"source": "https://github.com/symfony/rate-limiter/tree/v6.4.15"
},
"funding": [
{
@ -4444,47 +4526,40 @@
"type": "tidelift"
}
],
"time": "2022-07-20T13:00:38+00:00"
"time": "2024-11-09T07:19:24+00:00"
},
{
"name": "symfony/routing",
"version": "v5.4.3",
"version": "v6.4.22",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
"reference": "44b29c7a94e867ccde1da604792f11a469958981"
"reference": "1f5234e8457164a3a0038a4c0a4ba27876a9c670"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/routing/zipball/44b29c7a94e867ccde1da604792f11a469958981",
"reference": "44b29c7a94e867ccde1da604792f11a469958981",
"url": "https://api.github.com/repos/symfony/routing/zipball/1f5234e8457164a3a0038a4c0a4ba27876a9c670",
"reference": "1f5234e8457164a3a0038a4c0a4ba27876a9c670",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/polyfill-php80": "^1.16"
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3"
},
"conflict": {
"doctrine/annotations": "<1.12",
"symfony/config": "<5.3",
"symfony/dependency-injection": "<4.4",
"symfony/yaml": "<4.4"
"symfony/config": "<6.2",
"symfony/dependency-injection": "<5.4",
"symfony/yaml": "<5.4"
},
"require-dev": {
"doctrine/annotations": "^1.12",
"doctrine/annotations": "^1.12|^2",
"psr/log": "^1|^2|^3",
"symfony/config": "^5.3|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/http-foundation": "^4.4|^5.0|^6.0",
"symfony/yaml": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/config": "For using the all-in-one router or any loader",
"symfony/expression-language": "For using expression matching",
"symfony/http-foundation": "For using a Symfony Request object",
"symfony/yaml": "For using the YAML loader"
"symfony/config": "^6.2|^7.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/http-foundation": "^5.4|^6.0|^7.0",
"symfony/yaml": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -4518,7 +4593,7 @@
"url"
],
"support": {
"source": "https://github.com/symfony/routing/tree/v5.4.3"
"source": "https://github.com/symfony/routing/tree/v6.4.22"
},
"funding": [
{
@ -4534,36 +4609,35 @@
"type": "tidelift"
}
],
"time": "2022-01-02T09:53:40+00:00"
"time": "2025-04-27T16:08:38+00:00"
},
{
"name": "symfony/runtime",
"version": "v5.4.7",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/runtime.git",
"reference": "dc22a2876de3a3dc26b686570d9e638d443b575e"
"reference": "ef1f03c2ab1144ac4ef7744b9e026bdb06f2f88f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/runtime/zipball/dc22a2876de3a3dc26b686570d9e638d443b575e",
"reference": "dc22a2876de3a3dc26b686570d9e638d443b575e",
"url": "https://api.github.com/repos/symfony/runtime/zipball/ef1f03c2ab1144ac4ef7744b9e026bdb06f2f88f",
"reference": "ef1f03c2ab1144ac4ef7744b9e026bdb06f2f88f",
"shasum": ""
},
"require": {
"composer-plugin-api": "^1.0|^2.0",
"php": ">=7.2.5",
"symfony/polyfill-php80": "^1.15"
"php": ">=8.1"
},
"conflict": {
"symfony/dotenv": "<5.1"
"symfony/dotenv": "<5.4"
},
"require-dev": {
"composer/composer": "^1.0.2|^2.0",
"symfony/console": "^4.4.30|^5.3.7|^6.0",
"symfony/dotenv": "^5.1|^6.0",
"symfony/http-foundation": "^4.4.30|^5.3.7|^6.0",
"symfony/http-kernel": "^4.4.30|^5.3.7|^6.0"
"symfony/console": "^5.4.9|^6.0.9|^7.0",
"symfony/dotenv": "^5.4|^6.0|^7.0",
"symfony/http-foundation": "^5.4|^6.0|^7.0",
"symfony/http-kernel": "^5.4|^6.0|^7.0"
},
"type": "composer-plugin",
"extra": {
@ -4594,8 +4668,11 @@
],
"description": "Enables decoupling PHP applications from global state",
"homepage": "https://symfony.com",
"keywords": [
"runtime"
],
"support": {
"source": "https://github.com/symfony/runtime/tree/v5.4.7"
"source": "https://github.com/symfony/runtime/tree/v6.4.23"
},
"funding": [
{
@ -4611,65 +4688,75 @@
"type": "tidelift"
}
],
"time": "2022-03-08T15:36:36+00:00"
"time": "2025-06-13T07:44:14+00:00"
},
{
"name": "symfony/security-bundle",
"version": "v5.4.8",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/security-bundle.git",
"reference": "9806c9d491584e14a4444ea861a15428ab4b00be"
"reference": "3db1460f539b23e74a119981ea6b3002302250bc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/security-bundle/zipball/9806c9d491584e14a4444ea861a15428ab4b00be",
"reference": "9806c9d491584e14a4444ea861a15428ab4b00be",
"url": "https://api.github.com/repos/symfony/security-bundle/zipball/3db1460f539b23e74a119981ea6b3002302250bc",
"reference": "3db1460f539b23e74a119981ea6b3002302250bc",
"shasum": ""
},
"require": {
"composer-runtime-api": ">=2.1",
"ext-xml": "*",
"php": ">=7.2.5",
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^5.3|^6.0",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/event-dispatcher": "^5.1|^6.0",
"symfony/http-foundation": "^5.3|^6.0",
"symfony/http-kernel": "^5.3|^6.0",
"symfony/password-hasher": "^5.3|^6.0",
"symfony/polyfill-php80": "^1.16",
"symfony/security-core": "^5.4|^6.0",
"symfony/security-csrf": "^4.4|^5.0|^6.0",
"symfony/security-guard": "^5.3",
"symfony/security-http": "^5.4|^6.0"
"php": ">=8.1",
"symfony/clock": "^6.3|^7.0",
"symfony/config": "^6.1|^7.0",
"symfony/dependency-injection": "^6.4.11|^7.1.4",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/event-dispatcher": "^5.4|^6.0|^7.0",
"symfony/http-foundation": "^6.2|^7.0",
"symfony/http-kernel": "^6.2",
"symfony/password-hasher": "^5.4|^6.0|^7.0",
"symfony/security-core": "^6.2|^7.0",
"symfony/security-csrf": "^5.4|^6.0|^7.0",
"symfony/security-http": "^6.3.6|^7.0",
"symfony/service-contracts": "^2.5|^3"
},
"conflict": {
"symfony/browser-kit": "<4.4",
"symfony/console": "<4.4",
"symfony/framework-bundle": "<4.4",
"symfony/ldap": "<5.1",
"symfony/twig-bundle": "<4.4"
"symfony/browser-kit": "<5.4",
"symfony/console": "<5.4",
"symfony/framework-bundle": "<6.4",
"symfony/http-client": "<5.4",
"symfony/ldap": "<5.4",
"symfony/serializer": "<6.4",
"symfony/twig-bundle": "<5.4",
"symfony/validator": "<6.4"
},
"require-dev": {
"doctrine/annotations": "^1.10.4",
"symfony/asset": "^4.4|^5.0|^6.0",
"symfony/browser-kit": "^4.4|^5.0|^6.0",
"symfony/console": "^4.4|^5.0|^6.0",
"symfony/css-selector": "^4.4|^5.0|^6.0",
"symfony/dom-crawler": "^4.4|^5.0|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/form": "^4.4|^5.0|^6.0",
"symfony/framework-bundle": "^5.3|^6.0",
"symfony/ldap": "^5.3|^6.0",
"symfony/process": "^4.4|^5.0|^6.0",
"symfony/rate-limiter": "^5.2|^6.0",
"symfony/serializer": "^4.4|^5.0|^6.0",
"symfony/translation": "^4.4|^5.0|^6.0",
"symfony/twig-bridge": "^4.4|^5.0|^6.0",
"symfony/twig-bundle": "^4.4|^5.0|^6.0",
"symfony/validator": "^4.4|^5.0|^6.0",
"symfony/yaml": "^4.4|^5.0|^6.0",
"twig/twig": "^2.13|^3.0.4"
"symfony/asset": "^5.4|^6.0|^7.0",
"symfony/browser-kit": "^5.4|^6.0|^7.0",
"symfony/console": "^5.4|^6.0|^7.0",
"symfony/css-selector": "^5.4|^6.0|^7.0",
"symfony/dom-crawler": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/form": "^5.4|^6.0|^7.0",
"symfony/framework-bundle": "^6.4|^7.0",
"symfony/http-client": "^5.4|^6.0|^7.0",
"symfony/ldap": "^5.4|^6.0|^7.0",
"symfony/process": "^5.4|^6.0|^7.0",
"symfony/rate-limiter": "^5.4|^6.0|^7.0",
"symfony/serializer": "^6.4|^7.0",
"symfony/translation": "^5.4|^6.0|^7.0",
"symfony/twig-bridge": "^5.4|^6.0|^7.0",
"symfony/twig-bundle": "^5.4|^6.0|^7.0",
"symfony/validator": "^6.4|^7.0",
"symfony/yaml": "^5.4|^6.0|^7.0",
"twig/twig": "^2.13|^3.0.4",
"web-token/jwt-checker": "^3.1",
"web-token/jwt-signature-algorithm-ecdsa": "^3.1",
"web-token/jwt-signature-algorithm-eddsa": "^3.1",
"web-token/jwt-signature-algorithm-hmac": "^3.1",
"web-token/jwt-signature-algorithm-none": "^3.1",
"web-token/jwt-signature-algorithm-rsa": "^3.1"
},
"type": "symfony-bundle",
"autoload": {
@ -4697,7 +4784,7 @@
"description": "Provides a tight integration of the Security component into the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/security-bundle/tree/v5.4.8"
"source": "https://github.com/symfony/security-bundle/tree/v6.4.23"
},
"funding": [
{
@ -4713,56 +4800,49 @@
"type": "tidelift"
}
],
"time": "2022-04-15T11:48:31+00:00"
"time": "2025-06-23T20:18:57+00:00"
},
{
"name": "symfony/security-core",
"version": "v5.4.8",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/security-core.git",
"reference": "4540ecb8ae82cc46d9580672888597f481ff0440"
"reference": "527780a0482e592530174ca90e6189f64cdf6569"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/security-core/zipball/4540ecb8ae82cc46d9580672888597f481ff0440",
"reference": "4540ecb8ae82cc46d9580672888597f481ff0440",
"url": "https://api.github.com/repos/symfony/security-core/zipball/527780a0482e592530174ca90e6189f64cdf6569",
"reference": "527780a0482e592530174ca90e6189f64cdf6569",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/event-dispatcher-contracts": "^1.1|^2|^3",
"symfony/password-hasher": "^5.3|^6.0",
"symfony/polyfill-php80": "^1.16",
"symfony/service-contracts": "^1.1.6|^2|^3"
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/event-dispatcher-contracts": "^2.5|^3",
"symfony/password-hasher": "^5.4|^6.0|^7.0",
"symfony/service-contracts": "^2.5|^3"
},
"conflict": {
"symfony/event-dispatcher": "<4.4",
"symfony/http-foundation": "<5.3",
"symfony/ldap": "<4.4",
"symfony/security-guard": "<4.4",
"symfony/validator": "<5.2"
"symfony/event-dispatcher": "<5.4",
"symfony/http-foundation": "<5.4",
"symfony/ldap": "<5.4",
"symfony/security-guard": "<5.4",
"symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3",
"symfony/validator": "<5.4"
},
"require-dev": {
"psr/cache": "^1.0|^2.0|^3.0",
"psr/container": "^1.0|^2.0",
"psr/container": "^1.1|^2.0",
"psr/log": "^1|^2|^3",
"symfony/cache": "^4.4|^5.0|^6.0",
"symfony/event-dispatcher": "^4.4|^5.0|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/http-foundation": "^5.3|^6.0",
"symfony/ldap": "^4.4|^5.0|^6.0",
"symfony/translation": "^4.4|^5.0|^6.0",
"symfony/validator": "^5.2|^6.0"
},
"suggest": {
"psr/container-implementation": "To instantiate the Security class",
"symfony/event-dispatcher": "",
"symfony/expression-language": "For using the expression voter",
"symfony/http-foundation": "",
"symfony/ldap": "For using LDAP integration",
"symfony/validator": "For using the user password constraint"
"symfony/cache": "^5.4|^6.0|^7.0",
"symfony/event-dispatcher": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/http-foundation": "^5.4|^6.0|^7.0",
"symfony/ldap": "^5.4|^6.0|^7.0",
"symfony/string": "^5.4|^6.0|^7.0",
"symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3",
"symfony/validator": "^6.4|^7.0"
},
"type": "library",
"autoload": {
@ -4790,7 +4870,7 @@
"description": "Symfony Security Component - Core Library",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/security-core/tree/v5.4.8"
"source": "https://github.com/symfony/security-core/tree/v6.4.23"
},
"funding": [
{
@ -4806,35 +4886,31 @@
"type": "tidelift"
}
],
"time": "2022-04-15T08:07:45+00:00"
"time": "2025-05-30T08:33:44+00:00"
},
{
"name": "symfony/security-csrf",
"version": "v5.4.3",
"version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/security-csrf.git",
"reference": "57c1c252ca756289c2b61327e08fb10be3936956"
"reference": "c34421b7d34efbaef5d611ab2e646a0ec464ffe3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/security-csrf/zipball/57c1c252ca756289c2b61327e08fb10be3936956",
"reference": "57c1c252ca756289c2b61327e08fb10be3936956",
"url": "https://api.github.com/repos/symfony/security-csrf/zipball/c34421b7d34efbaef5d611ab2e646a0ec464ffe3",
"reference": "c34421b7d34efbaef5d611ab2e646a0ec464ffe3",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/polyfill-php80": "^1.16",
"symfony/security-core": "^4.4|^5.0|^6.0"
"php": ">=8.1",
"symfony/security-core": "^5.4|^6.0|^7.0"
},
"conflict": {
"symfony/http-foundation": "<5.3"
"symfony/http-foundation": "<5.4"
},
"require-dev": {
"symfony/http-foundation": "^5.3|^6.0"
},
"suggest": {
"symfony/http-foundation": "For using the class SessionTokenStorage."
"symfony/http-foundation": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -4862,7 +4938,7 @@
"description": "Symfony Security Component - CSRF Library",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/security-csrf/tree/v5.4.3"
"source": "https://github.com/symfony/security-csrf/tree/v6.4.13"
},
"funding": [
{
@ -4878,115 +4954,51 @@
"type": "tidelift"
}
],
"time": "2022-01-02T09:53:40+00:00"
},
{
"name": "symfony/security-guard",
"version": "v5.4.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/security-guard.git",
"reference": "3d68d9f8e162f6655eb0a0237b9f333a82a19da9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/security-guard/zipball/3d68d9f8e162f6655eb0a0237b9f333a82a19da9",
"reference": "3d68d9f8e162f6655eb0a0237b9f333a82a19da9",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/polyfill-php80": "^1.15",
"symfony/security-core": "^5.0",
"symfony/security-http": "^5.3"
},
"require-dev": {
"psr/log": "^1|^2|^3"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Security\\Guard\\": ""
},
"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": "Symfony Security Component - Guard",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/security-guard/tree/v5.4.3"
},
"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": "2022-01-02T09:53:40+00:00"
"time": "2024-09-25T14:18:03+00:00"
},
{
"name": "symfony/security-http",
"version": "v5.4.8",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/security-http.git",
"reference": "3d4b612da3a278285e6fd16fc2e5233820eeba0d"
"reference": "815fcda8122a7850bf6d5d842ce03c20445295bb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/security-http/zipball/3d4b612da3a278285e6fd16fc2e5233820eeba0d",
"reference": "3d4b612da3a278285e6fd16fc2e5233820eeba0d",
"url": "https://api.github.com/repos/symfony/security-http/zipball/815fcda8122a7850bf6d5d842ce03c20445295bb",
"reference": "815fcda8122a7850bf6d5d842ce03c20445295bb",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"symfony/http-foundation": "^5.3|^6.0",
"symfony/http-kernel": "^5.3|^6.0",
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/http-foundation": "^6.2|^7.0",
"symfony/http-kernel": "^6.3|^7.0",
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php80": "^1.16",
"symfony/property-access": "^4.4|^5.0|^6.0",
"symfony/security-core": "^5.4|^6.0"
"symfony/property-access": "^5.4|^6.0|^7.0",
"symfony/security-core": "^6.4|^7.0",
"symfony/service-contracts": "^2.5|^3"
},
"conflict": {
"symfony/event-dispatcher": "<4.3",
"symfony/security-bundle": "<5.3",
"symfony/security-csrf": "<4.4"
"symfony/clock": "<6.3",
"symfony/event-dispatcher": "<5.4.9|>=6,<6.0.9",
"symfony/http-client-contracts": "<3.0",
"symfony/security-bundle": "<5.4",
"symfony/security-csrf": "<5.4"
},
"require-dev": {
"psr/log": "^1|^2|^3",
"symfony/cache": "^4.4|^5.0|^6.0",
"symfony/rate-limiter": "^5.2|^6.0",
"symfony/routing": "^4.4|^5.0|^6.0",
"symfony/security-csrf": "^4.4|^5.0|^6.0",
"symfony/translation": "^4.4|^5.0|^6.0"
},
"suggest": {
"symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs",
"symfony/security-csrf": "For using tokens to protect authentication/logout attempts"
"symfony/cache": "^5.4|^6.0|^7.0",
"symfony/clock": "^6.3|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/http-client-contracts": "^3.0",
"symfony/rate-limiter": "^5.4|^6.0|^7.0",
"symfony/routing": "^5.4|^6.0|^7.0",
"symfony/security-csrf": "^5.4|^6.0|^7.0",
"symfony/translation": "^5.4|^6.0|^7.0",
"web-token/jwt-checker": "^3.1",
"web-token/jwt-signature-algorithm-ecdsa": "^3.1"
},
"type": "library",
"autoload": {
@ -5014,7 +5026,7 @@
"description": "Symfony Security Component - HTTP Integration",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/security-http/tree/v5.4.8"
"source": "https://github.com/symfony/security-http/tree/v6.4.23"
},
"funding": [
{
@ -5030,47 +5042,47 @@
"type": "tidelift"
}
],
"time": "2022-04-16T13:32:04+00:00"
"time": "2025-06-23T20:18:57+00:00"
},
{
"name": "symfony/service-contracts",
"version": "v2.5.1",
"version": "v3.6.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
"reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c"
"reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c",
"reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
"reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"psr/container": "^1.1",
"symfony/deprecation-contracts": "^2.1|^3"
"php": ">=8.1",
"psr/container": "^1.1|^2.0",
"symfony/deprecation-contracts": "^2.5|^3"
},
"conflict": {
"ext-psr": "<1.1|>=2"
},
"suggest": {
"symfony/service-implementation": ""
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "3.6-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Contracts\\Service\\": ""
}
},
"exclude-from-classmap": [
"/Test/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@ -5097,7 +5109,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/service-contracts/tree/v2.5.1"
"source": "https://github.com/symfony/service-contracts/tree/v3.6.0"
},
"funding": [
{
@ -5113,38 +5125,38 @@
"type": "tidelift"
}
],
"time": "2022-03-13T20:07:29+00:00"
"time": "2025-04-25T09:37:31+00:00"
},
{
"name": "symfony/string",
"version": "v5.4.3",
"version": "v6.4.21",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "92043b7d8383e48104e411bc9434b260dbeb5a10"
"reference": "73e2c6966a5aef1d4892873ed5322245295370c6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/92043b7d8383e48104e411bc9434b260dbeb5a10",
"reference": "92043b7d8383e48104e411bc9434b260dbeb5a10",
"url": "https://api.github.com/repos/symfony/string/zipball/73e2c6966a5aef1d4892873ed5322245295370c6",
"reference": "73e2c6966a5aef1d4892873ed5322245295370c6",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"php": ">=8.1",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-grapheme": "~1.0",
"symfony/polyfill-intl-normalizer": "~1.0",
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php80": "~1.15"
"symfony/polyfill-mbstring": "~1.0"
},
"conflict": {
"symfony/translation-contracts": ">=3.0"
"symfony/translation-contracts": "<2.5"
},
"require-dev": {
"symfony/error-handler": "^4.4|^5.0|^6.0",
"symfony/http-client": "^4.4|^5.0|^6.0",
"symfony/translation-contracts": "^1.1|^2",
"symfony/var-exporter": "^4.4|^5.0|^6.0"
"symfony/error-handler": "^5.4|^6.0|^7.0",
"symfony/http-client": "^5.4|^6.0|^7.0",
"symfony/intl": "^6.2|^7.0",
"symfony/translation-contracts": "^2.5|^3.0",
"symfony/var-exporter": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -5183,7 +5195,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v5.4.3"
"source": "https://github.com/symfony/string/tree/v6.4.21"
},
"funding": [
{
@ -5199,57 +5211,55 @@
"type": "tidelift"
}
],
"time": "2022-01-02T09:53:40+00:00"
"time": "2025-04-18T15:23:29+00:00"
},
{
"name": "symfony/translation",
"version": "v5.4.14",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
"reference": "f0ed07675863aa6e3939df8b1bc879450b585cab"
"reference": "de8afa521e04a5220e9e58a1dc99971ab7cac643"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/f0ed07675863aa6e3939df8b1bc879450b585cab",
"reference": "f0ed07675863aa6e3939df8b1bc879450b585cab",
"url": "https://api.github.com/repos/symfony/translation/zipball/de8afa521e04a5220e9e58a1dc99971ab7cac643",
"reference": "de8afa521e04a5220e9e58a1dc99971ab7cac643",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php80": "^1.16",
"symfony/translation-contracts": "^2.3"
"symfony/translation-contracts": "^2.5|^3.0"
},
"conflict": {
"symfony/config": "<4.4",
"symfony/console": "<5.3",
"symfony/dependency-injection": "<5.0",
"symfony/http-kernel": "<5.0",
"symfony/twig-bundle": "<5.0",
"symfony/yaml": "<4.4"
"symfony/config": "<5.4",
"symfony/console": "<5.4",
"symfony/dependency-injection": "<5.4",
"symfony/http-client-contracts": "<2.5",
"symfony/http-kernel": "<5.4",
"symfony/service-contracts": "<2.5",
"symfony/twig-bundle": "<5.4",
"symfony/yaml": "<5.4"
},
"provide": {
"symfony/translation-implementation": "2.3"
"symfony/translation-implementation": "2.3|3.0"
},
"require-dev": {
"nikic/php-parser": "^4.18|^5.0",
"psr/log": "^1|^2|^3",
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/console": "^5.4|^6.0",
"symfony/dependency-injection": "^5.0|^6.0",
"symfony/finder": "^4.4|^5.0|^6.0",
"symfony/http-client-contracts": "^1.1|^2.0|^3.0",
"symfony/http-kernel": "^5.0|^6.0",
"symfony/intl": "^4.4|^5.0|^6.0",
"symfony/config": "^5.4|^6.0|^7.0",
"symfony/console": "^5.4|^6.0|^7.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/finder": "^5.4|^6.0|^7.0",
"symfony/http-client-contracts": "^2.5|^3.0",
"symfony/http-kernel": "^5.4|^6.0|^7.0",
"symfony/intl": "^5.4|^6.0|^7.0",
"symfony/polyfill-intl-icu": "^1.21",
"symfony/service-contracts": "^1.1.2|^2|^3",
"symfony/yaml": "^4.4|^5.0|^6.0"
},
"suggest": {
"psr/log-implementation": "To use logging capability in translator",
"symfony/config": "",
"symfony/yaml": ""
"symfony/routing": "^5.4|^6.0|^7.0",
"symfony/service-contracts": "^2.5|^3",
"symfony/yaml": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -5280,7 +5290,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/translation/tree/v5.4.14"
"source": "https://github.com/symfony/translation/tree/v6.4.23"
},
"funding": [
{
@ -5296,42 +5306,42 @@
"type": "tidelift"
}
],
"time": "2022-10-07T08:01:20+00:00"
"time": "2025-06-26T21:24:02+00:00"
},
{
"name": "symfony/translation-contracts",
"version": "v2.5.1",
"version": "v3.6.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation-contracts.git",
"reference": "1211df0afa701e45a04253110e959d4af4ef0f07"
"reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1211df0afa701e45a04253110e959d4af4ef0f07",
"reference": "1211df0afa701e45a04253110e959d4af4ef0f07",
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d",
"reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d",
"shasum": ""
},
"require": {
"php": ">=7.2.5"
},
"suggest": {
"symfony/translation-implementation": ""
"php": ">=8.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": {
"dev-main": "3.6-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Contracts\\Translation\\": ""
}
},
"exclude-from-classmap": [
"/Test/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@ -5358,7 +5368,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/translation-contracts/tree/v2.5.1"
"source": "https://github.com/symfony/translation-contracts/tree/v3.6.0"
},
"funding": [
{
@ -5374,85 +5384,73 @@
"type": "tidelift"
}
],
"time": "2022-01-02T09:53:40+00:00"
"time": "2024-09-27T08:32:26+00:00"
},
{
"name": "symfony/twig-bridge",
"version": "v5.4.8",
"version": "v6.4.22",
"source": {
"type": "git",
"url": "https://github.com/symfony/twig-bridge.git",
"reference": "f68dbdb80c9ce425f503512dfa8c8c01cf789e43"
"reference": "04ab306a2f2c9dbd46f4363383812954f704af9d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/twig-bridge/zipball/f68dbdb80c9ce425f503512dfa8c8c01cf789e43",
"reference": "f68dbdb80c9ce425f503512dfa8c8c01cf789e43",
"url": "https://api.github.com/repos/symfony/twig-bridge/zipball/04ab306a2f2c9dbd46f4363383812954f704af9d",
"reference": "04ab306a2f2c9dbd46f4363383812954f704af9d",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/polyfill-php80": "^1.16",
"symfony/translation-contracts": "^1.1|^2|^3",
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/translation-contracts": "^2.5|^3",
"twig/twig": "^2.13|^3.0.4"
},
"conflict": {
"phpdocumentor/reflection-docblock": "<3.2.2",
"phpdocumentor/type-resolver": "<1.4.0",
"symfony/console": "<5.3",
"symfony/form": "<5.3",
"symfony/http-foundation": "<5.3",
"symfony/http-kernel": "<4.4",
"symfony/translation": "<5.2",
"symfony/workflow": "<5.2"
"symfony/console": "<5.4",
"symfony/form": "<6.3",
"symfony/http-foundation": "<5.4",
"symfony/http-kernel": "<6.4",
"symfony/mime": "<6.2",
"symfony/serializer": "<6.4",
"symfony/translation": "<5.4",
"symfony/workflow": "<5.4"
},
"require-dev": {
"doctrine/annotations": "^1.12",
"egulias/email-validator": "^2.1.10|^3",
"egulias/email-validator": "^2.1.10|^3|^4",
"league/html-to-markdown": "^5.0",
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
"symfony/asset": "^4.4|^5.0|^6.0",
"symfony/console": "^5.3|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/finder": "^4.4|^5.0|^6.0",
"symfony/form": "^5.3|^6.0",
"symfony/http-foundation": "^5.3|^6.0",
"symfony/http-kernel": "^4.4|^5.0|^6.0",
"symfony/intl": "^4.4|^5.0|^6.0",
"symfony/mime": "^5.2|^6.0",
"symfony/asset": "^5.4|^6.0|^7.0",
"symfony/asset-mapper": "^6.3|^7.0",
"symfony/console": "^5.4|^6.0|^7.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/finder": "^5.4|^6.0|^7.0",
"symfony/form": "^6.4.20|^7.2.5",
"symfony/html-sanitizer": "^6.1|^7.0",
"symfony/http-foundation": "^5.4|^6.0|^7.0",
"symfony/http-kernel": "^6.4|^7.0",
"symfony/intl": "^5.4|^6.0|^7.0",
"symfony/mime": "^6.2|^7.0",
"symfony/polyfill-intl-icu": "~1.0",
"symfony/property-info": "^4.4|^5.1|^6.0",
"symfony/routing": "^4.4|^5.0|^6.0",
"symfony/property-info": "^5.4|^6.0|^7.0",
"symfony/routing": "^5.4|^6.0|^7.0",
"symfony/security-acl": "^2.8|^3.0",
"symfony/security-core": "^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/serializer": "^5.2|^6.0",
"symfony/stopwatch": "^4.4|^5.0|^6.0",
"symfony/translation": "^5.2|^6.0",
"symfony/web-link": "^4.4|^5.0|^6.0",
"symfony/workflow": "^5.2|^6.0",
"symfony/yaml": "^4.4|^5.0|^6.0",
"symfony/security-core": "^5.4|^6.0|^7.0",
"symfony/security-csrf": "^5.4|^6.0|^7.0",
"symfony/security-http": "^5.4|^6.0|^7.0",
"symfony/serializer": "^6.4.3|^7.0.3",
"symfony/stopwatch": "^5.4|^6.0|^7.0",
"symfony/translation": "^6.1|^7.0",
"symfony/web-link": "^5.4|^6.0|^7.0",
"symfony/workflow": "^5.4|^6.0|^7.0",
"symfony/yaml": "^5.4|^6.0|^7.0",
"twig/cssinliner-extra": "^2.12|^3",
"twig/inky-extra": "^2.12|^3",
"twig/markdown-extra": "^2.12|^3"
},
"suggest": {
"symfony/asset": "For using the AssetExtension",
"symfony/expression-language": "For using the ExpressionExtension",
"symfony/finder": "",
"symfony/form": "For using the FormExtension",
"symfony/http-kernel": "For using the HttpKernelExtension",
"symfony/routing": "For using the RoutingExtension",
"symfony/security-core": "For using the SecurityExtension",
"symfony/security-csrf": "For using the CsrfExtension",
"symfony/security-http": "For using the LogoutUrlExtension",
"symfony/stopwatch": "For using the StopwatchExtension",
"symfony/translation": "For using the TranslationExtension",
"symfony/var-dumper": "For using the DumpExtension",
"symfony/web-link": "For using the WebLinkExtension",
"symfony/yaml": "For using the YamlExtension"
},
"type": "symfony-bridge",
"autoload": {
"psr-4": {
@ -5479,7 +5477,7 @@
"description": "Provides integration for Twig with various Symfony components",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/twig-bridge/tree/v5.4.8"
"source": "https://github.com/symfony/twig-bridge/tree/v6.4.22"
},
"funding": [
{
@ -5495,52 +5493,47 @@
"type": "tidelift"
}
],
"time": "2022-04-12T15:48:08+00:00"
"time": "2025-05-16T08:23:44+00:00"
},
{
"name": "symfony/twig-bundle",
"version": "v5.4.8",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/twig-bundle.git",
"reference": "c992b4474c3a31f3c40a1ca593d213833f91b818"
"reference": "ef970ed7eb9e547d21628e4c803de0943759cbcd"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/twig-bundle/zipball/c992b4474c3a31f3c40a1ca593d213833f91b818",
"reference": "c992b4474c3a31f3c40a1ca593d213833f91b818",
"url": "https://api.github.com/repos/symfony/twig-bundle/zipball/ef970ed7eb9e547d21628e4c803de0943759cbcd",
"reference": "ef970ed7eb9e547d21628e4c803de0943759cbcd",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/http-foundation": "^4.4|^5.0|^6.0",
"symfony/http-kernel": "^5.0|^6.0",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-php80": "^1.16",
"symfony/twig-bridge": "^5.3|^6.0",
"composer-runtime-api": ">=2.1",
"php": ">=8.1",
"symfony/config": "^6.1|^7.0",
"symfony/dependency-injection": "^6.1|^7.0",
"symfony/http-foundation": "^5.4|^6.0|^7.0",
"symfony/http-kernel": "^6.2",
"symfony/twig-bridge": "^6.4",
"twig/twig": "^2.13|^3.0.4"
},
"conflict": {
"symfony/dependency-injection": "<5.3",
"symfony/framework-bundle": "<5.0",
"symfony/service-contracts": ">=3.0",
"symfony/translation": "<5.0"
"symfony/framework-bundle": "<5.4",
"symfony/translation": "<5.4"
},
"require-dev": {
"doctrine/annotations": "^1.10.4",
"doctrine/cache": "^1.0|^2.0",
"symfony/asset": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^5.3|^6.0",
"symfony/expression-language": "^4.4|^5.0|^6.0",
"symfony/finder": "^4.4|^5.0|^6.0",
"symfony/form": "^4.4|^5.0|^6.0",
"symfony/framework-bundle": "^5.0|^6.0",
"symfony/routing": "^4.4|^5.0|^6.0",
"symfony/stopwatch": "^4.4|^5.0|^6.0",
"symfony/translation": "^5.0|^6.0",
"symfony/web-link": "^4.4|^5.0|^6.0",
"symfony/yaml": "^4.4|^5.0|^6.0"
"symfony/asset": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/finder": "^5.4|^6.0|^7.0",
"symfony/form": "^5.4|^6.0|^7.0",
"symfony/framework-bundle": "^5.4|^6.0|^7.0",
"symfony/routing": "^5.4|^6.0|^7.0",
"symfony/stopwatch": "^5.4|^6.0|^7.0",
"symfony/translation": "^5.4|^6.0|^7.0",
"symfony/web-link": "^5.4|^6.0|^7.0",
"symfony/yaml": "^5.4|^6.0|^7.0"
},
"type": "symfony-bundle",
"autoload": {
@ -5568,7 +5561,7 @@
"description": "Provides a tight integration of Twig into the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/twig-bundle/tree/v5.4.8"
"source": "https://github.com/symfony/twig-bundle/tree/v6.4.23"
},
"funding": [
{
@ -5584,76 +5577,59 @@
"type": "tidelift"
}
],
"time": "2022-04-03T13:03:10+00:00"
"time": "2025-06-20T20:02:07+00:00"
},
{
"name": "symfony/validator",
"version": "v5.4.8",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/validator.git",
"reference": "bdc6d04ba95c73ccbf906b4ad9b8775c738d83ad"
"reference": "6506760ab57e7cda5bde9cdaed736526162284bc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/validator/zipball/bdc6d04ba95c73ccbf906b4ad9b8775c738d83ad",
"reference": "bdc6d04ba95c73ccbf906b4ad9b8775c738d83ad",
"url": "https://api.github.com/repos/symfony/validator/zipball/6506760ab57e7cda5bde9cdaed736526162284bc",
"reference": "6506760ab57e7cda5bde9cdaed736526162284bc",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php73": "~1.0",
"symfony/polyfill-php80": "^1.16",
"symfony/polyfill-php81": "^1.22",
"symfony/translation-contracts": "^1.1|^2|^3"
"symfony/polyfill-php83": "^1.27",
"symfony/translation-contracts": "^2.5|^3"
},
"conflict": {
"doctrine/annotations": "<1.13",
"doctrine/cache": "<1.11",
"doctrine/lexer": "<1.1",
"phpunit/phpunit": "<5.4.3",
"symfony/dependency-injection": "<4.4",
"symfony/expression-language": "<5.1",
"symfony/http-kernel": "<4.4",
"symfony/intl": "<4.4",
"symfony/property-info": "<5.3",
"symfony/translation": "<4.4",
"symfony/yaml": "<4.4"
"symfony/dependency-injection": "<5.4",
"symfony/expression-language": "<5.4",
"symfony/http-kernel": "<5.4",
"symfony/intl": "<5.4",
"symfony/property-info": "<5.4",
"symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3",
"symfony/yaml": "<5.4"
},
"require-dev": {
"doctrine/annotations": "^1.13",
"doctrine/cache": "^1.11|^2.0",
"egulias/email-validator": "^2.1.10|^3",
"symfony/cache": "^4.4|^5.0|^6.0",
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/console": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/expression-language": "^5.1|^6.0",
"symfony/finder": "^4.4|^5.0|^6.0",
"symfony/http-client": "^4.4|^5.0|^6.0",
"symfony/http-foundation": "^4.4|^5.0|^6.0",
"symfony/http-kernel": "^4.4|^5.0|^6.0",
"symfony/intl": "^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-info": "^5.3|^6.0",
"symfony/translation": "^4.4|^5.0|^6.0",
"symfony/yaml": "^4.4|^5.0|^6.0"
},
"suggest": {
"egulias/email-validator": "Strict (RFC compliant) email validation",
"psr/cache-implementation": "For using the mapping cache.",
"symfony/config": "",
"symfony/expression-language": "For using the Expression validator and the ExpressionLanguageSyntax constraints",
"symfony/http-foundation": "",
"symfony/intl": "",
"symfony/property-access": "For accessing properties within comparison constraints",
"symfony/property-info": "To automatically add NotNull and Type constraints",
"symfony/translation": "For translating validation errors.",
"symfony/yaml": ""
"doctrine/annotations": "^1.13|^2",
"egulias/email-validator": "^2.1.10|^3|^4",
"symfony/cache": "^5.4|^6.0|^7.0",
"symfony/config": "^5.4|^6.0|^7.0",
"symfony/console": "^5.4|^6.0|^7.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/expression-language": "^5.4|^6.0|^7.0",
"symfony/finder": "^5.4|^6.0|^7.0",
"symfony/http-client": "^5.4|^6.0|^7.0",
"symfony/http-foundation": "^5.4|^6.0|^7.0",
"symfony/http-kernel": "^5.4|^6.0|^7.0",
"symfony/intl": "^5.4|^6.0|^7.0",
"symfony/mime": "^5.4|^6.0|^7.0",
"symfony/property-access": "^5.4|^6.0|^7.0",
"symfony/property-info": "^5.4|^6.0|^7.0",
"symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3",
"symfony/yaml": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -5661,7 +5637,8 @@
"Symfony\\Component\\Validator\\": ""
},
"exclude-from-classmap": [
"/Tests/"
"/Tests/",
"/Resources/bin/"
]
},
"notification-url": "https://packagist.org/downloads/",
@ -5681,7 +5658,7 @@
"description": "Provides tools to validate values",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/validator/tree/v5.4.8"
"source": "https://github.com/symfony/validator/tree/v6.4.23"
},
"funding": [
{
@ -5697,43 +5674,39 @@
"type": "tidelift"
}
],
"time": "2022-04-15T08:07:45+00:00"
"time": "2025-06-26T07:25:45+00:00"
},
{
"name": "symfony/var-dumper",
"version": "v5.4.6",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
"reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0"
"reference": "d55b1834cdbfcc31bc2cd7e095ba5ed9a88f6600"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/294e9da6e2e0dd404e983daa5aa74253d92c05d0",
"reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/d55b1834cdbfcc31bc2cd7e095ba5ed9a88f6600",
"reference": "d55b1834cdbfcc31bc2cd7e095ba5ed9a88f6600",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php80": "^1.16"
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0"
},
"conflict": {
"phpunit/phpunit": "<5.4.3",
"symfony/console": "<4.4"
"symfony/console": "<5.4"
},
"require-dev": {
"ext-iconv": "*",
"symfony/console": "^4.4|^5.0|^6.0",
"symfony/process": "^4.4|^5.0|^6.0",
"symfony/uid": "^5.1|^6.0",
"symfony/console": "^5.4|^6.0|^7.0",
"symfony/error-handler": "^6.3|^7.0",
"symfony/http-kernel": "^5.4|^6.0|^7.0",
"symfony/process": "^5.4|^6.0|^7.0",
"symfony/uid": "^5.4|^6.0|^7.0",
"twig/twig": "^2.13|^3.0.4"
},
"suggest": {
"ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
"ext-intl": "To show region name in time zone dump",
"symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
},
"bin": [
"Resources/bin/var-dump-server"
],
@ -5770,7 +5743,7 @@
"dump"
],
"support": {
"source": "https://github.com/symfony/var-dumper/tree/v5.4.6"
"source": "https://github.com/symfony/var-dumper/tree/v6.4.23"
},
"funding": [
{
@ -5786,28 +5759,30 @@
"type": "tidelift"
}
],
"time": "2022-03-02T12:42:23+00:00"
"time": "2025-06-27T15:05:27+00:00"
},
{
"name": "symfony/var-exporter",
"version": "v5.4.7",
"version": "v6.4.22",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-exporter.git",
"reference": "7eacaa588c9b27f2738575adb4a8457a80d9c807"
"reference": "f28cf841f5654955c9f88ceaf4b9dc29571988a9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-exporter/zipball/7eacaa588c9b27f2738575adb4a8457a80d9c807",
"reference": "7eacaa588c9b27f2738575adb4a8457a80d9c807",
"url": "https://api.github.com/repos/symfony/var-exporter/zipball/f28cf841f5654955c9f88ceaf4b9dc29571988a9",
"reference": "f28cf841f5654955c9f88ceaf4b9dc29571988a9",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/polyfill-php80": "^1.16"
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3"
},
"require-dev": {
"symfony/var-dumper": "^4.4.9|^5.0.9|^6.0"
"symfony/property-access": "^6.4|^7.0",
"symfony/serializer": "^6.4|^7.0",
"symfony/var-dumper": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
@ -5840,10 +5815,12 @@
"export",
"hydrate",
"instantiate",
"lazy-loading",
"proxy",
"serialize"
],
"support": {
"source": "https://github.com/symfony/var-exporter/tree/v5.4.7"
"source": "https://github.com/symfony/var-exporter/tree/v6.4.22"
},
"funding": [
{
@ -5859,43 +5836,42 @@
"type": "tidelift"
}
],
"time": "2022-03-31T17:09:19+00:00"
"time": "2025-05-14T13:00:13+00:00"
},
{
"name": "symfony/web-profiler-bundle",
"version": "v5.4.8",
"version": "v6.4.19",
"source": {
"type": "git",
"url": "https://github.com/symfony/web-profiler-bundle.git",
"reference": "909c6eea7815066a80d0a362ed41abd7924e376a"
"reference": "7d1026a8e950d416cb5148ae88ac23db5d264839"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/909c6eea7815066a80d0a362ed41abd7924e376a",
"reference": "909c6eea7815066a80d0a362ed41abd7924e376a",
"url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/7d1026a8e950d416cb5148ae88ac23db5d264839",
"reference": "7d1026a8e950d416cb5148ae88ac23db5d264839",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/config": "^4.4|^5.0|^6.0",
"symfony/framework-bundle": "^5.3|^6.0",
"symfony/http-kernel": "^5.3|^6.0",
"symfony/polyfill-php80": "^1.16",
"symfony/routing": "^4.4|^5.0|^6.0",
"symfony/twig-bundle": "^4.4|^5.0|^6.0",
"php": ">=8.1",
"symfony/config": "^5.4|^6.0|^7.0",
"symfony/framework-bundle": "^6.4|^7.0",
"symfony/http-kernel": "^6.4|^7.0",
"symfony/routing": "^5.4|^6.0|^7.0",
"symfony/twig-bundle": "^5.4|^6.0",
"twig/twig": "^2.13|^3.0.4"
},
"conflict": {
"symfony/dependency-injection": "<5.2",
"symfony/form": "<4.4",
"symfony/form": "<5.4",
"symfony/mailer": "<5.4",
"symfony/messenger": "<4.4"
"symfony/messenger": "<5.4",
"symfony/twig-bundle": ">=7.0"
},
"require-dev": {
"symfony/browser-kit": "^4.4|^5.0|^6.0",
"symfony/console": "^4.4|^5.0|^6.0",
"symfony/css-selector": "^4.4|^5.0|^6.0",
"symfony/stopwatch": "^4.4|^5.0|^6.0"
"symfony/browser-kit": "^5.4|^6.0|^7.0",
"symfony/console": "^5.4|^6.0|^7.0",
"symfony/css-selector": "^5.4|^6.0|^7.0",
"symfony/stopwatch": "^5.4|^6.0|^7.0"
},
"type": "symfony-bundle",
"autoload": {
@ -5922,8 +5898,11 @@
],
"description": "Provides a development tool that gives detailed information about the execution of any request",
"homepage": "https://symfony.com",
"keywords": [
"dev"
],
"support": {
"source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.8"
"source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.19"
},
"funding": [
{
@ -5939,20 +5918,20 @@
"type": "tidelift"
}
],
"time": "2022-04-22T08:14:12+00:00"
"time": "2025-02-14T12:21:59+00:00"
},
{
"name": "symfony/webpack-encore-bundle",
"version": "v1.16.0",
"version": "v1.17.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/webpack-encore-bundle.git",
"reference": "bb399930c0299866258b616a74a27b50b94c5d45"
"reference": "471ebbc03072dad6e31840dc317bc634a32785f5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/bb399930c0299866258b616a74a27b50b94c5d45",
"reference": "bb399930c0299866258b616a74a27b50b94c5d45",
"url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/471ebbc03072dad6e31840dc317bc634a32785f5",
"reference": "471ebbc03072dad6e31840dc317bc634a32785f5",
"shasum": ""
},
"require": {
@ -5974,8 +5953,8 @@
"type": "symfony-bundle",
"extra": {
"thanks": {
"name": "symfony/webpack-encore",
"url": "https://github.com/symfony/webpack-encore"
"url": "https://github.com/symfony/webpack-encore",
"name": "symfony/webpack-encore"
}
},
"autoload": {
@ -5996,7 +5975,7 @@
"description": "Integration with your Symfony app & Webpack Encore!",
"support": {
"issues": "https://github.com/symfony/webpack-encore-bundle/issues",
"source": "https://github.com/symfony/webpack-encore-bundle/tree/v1.16.0"
"source": "https://github.com/symfony/webpack-encore-bundle/tree/v1.17.2"
},
"funding": [
{
@ -6012,35 +5991,32 @@
"type": "tidelift"
}
],
"time": "2022-10-18T15:21:06+00:00"
"time": "2023-09-26T14:36:28+00:00"
},
{
"name": "symfony/yaml",
"version": "v5.4.3",
"version": "v6.4.23",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
"reference": "e80f87d2c9495966768310fc531b487ce64237a2"
"reference": "93e29e0deb5f1b2e360adfb389a20d25eb81a27b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2",
"reference": "e80f87d2c9495966768310fc531b487ce64237a2",
"url": "https://api.github.com/repos/symfony/yaml/zipball/93e29e0deb5f1b2e360adfb389a20d25eb81a27b",
"reference": "93e29e0deb5f1b2e360adfb389a20d25eb81a27b",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
"php": ">=8.1",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
"symfony/console": "<5.3"
"symfony/console": "<5.4"
},
"require-dev": {
"symfony/console": "^5.3|^6.0"
},
"suggest": {
"symfony/console": "For validating YAML files using the lint command"
"symfony/console": "^5.4|^6.0|^7.0"
},
"bin": [
"Resources/bin/yaml-lint"
@ -6071,7 +6047,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/yaml/tree/v5.4.3"
"source": "https://github.com/symfony/yaml/tree/v6.4.23"
},
"funding": [
{
@ -6087,38 +6063,41 @@
"type": "tidelift"
}
],
"time": "2022-01-26T16:32:32+00:00"
"time": "2025-06-03T06:46:12+00:00"
},
{
"name": "twig/twig",
"version": "v3.3.10",
"version": "v3.21.1",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
"reference": "8442df056c51b706793adf80a9fd363406dd3674"
"reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/8442df056c51b706793adf80a9fd363406dd3674",
"reference": "8442df056c51b706793adf80a9fd363406dd3674",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/285123877d4dd97dd7c11842ac5fb7e86e60d81d",
"reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"php": ">=8.1.0",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-ctype": "^1.8",
"symfony/polyfill-mbstring": "^1.3"
},
"require-dev": {
"psr/container": "^1.0",
"symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0"
"phpstan/phpstan": "^2.0",
"psr/container": "^1.0|^2.0",
"symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.3-dev"
}
},
"autoload": {
"files": [
"src/Resources/core.php",
"src/Resources/debug.php",
"src/Resources/escaper.php",
"src/Resources/string_loader.php"
],
"psr-4": {
"Twig\\": "src/"
}
@ -6151,7 +6130,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v3.3.10"
"source": "https://github.com/twigphp/Twig/tree/v3.21.1"
},
"funding": [
{
@ -6163,20 +6142,213 @@
"type": "tidelift"
}
],
"time": "2022-04-06T06:47:41+00:00"
"time": "2025-05-03T07:21:55+00:00"
}
],
"packages-dev": [
{
"name": "phpstan/phpstan",
"version": "2.1.17",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "89b5ef665716fa2a52ecd2633f21007a6a349053"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053",
"reference": "89b5ef665716fa2a52ecd2633f21007a6a349053",
"shasum": ""
},
"require": {
"php": "^7.4|^8.0"
},
"conflict": {
"phpstan/phpstan-shim": "*"
},
"bin": [
"phpstan",
"phpstan.phar"
],
"type": "library",
"autoload": {
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHPStan - PHP Static Analysis Tool",
"keywords": [
"dev",
"static analysis"
],
"support": {
"docs": "https://phpstan.org/user-guide/getting-started",
"forum": "https://github.com/phpstan/phpstan/discussions",
"issues": "https://github.com/phpstan/phpstan/issues",
"security": "https://github.com/phpstan/phpstan/security/policy",
"source": "https://github.com/phpstan/phpstan-src"
},
"funding": [
{
"url": "https://github.com/ondrejmirtes",
"type": "github"
},
{
"url": "https://github.com/phpstan",
"type": "github"
}
],
"time": "2025-05-21T20:55:28+00:00"
},
{
"name": "rector/rector",
"version": "2.1.1",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
"reference": "d0917c069bb0d9bb06ed111cf052510f609015a4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/rectorphp/rector/zipball/d0917c069bb0d9bb06ed111cf052510f609015a4",
"reference": "d0917c069bb0d9bb06ed111cf052510f609015a4",
"shasum": ""
},
"require": {
"php": "^7.4|^8.0",
"phpstan/phpstan": "^2.1.17"
},
"conflict": {
"rector/rector-doctrine": "*",
"rector/rector-downgrade-php": "*",
"rector/rector-phpunit": "*",
"rector/rector-symfony": "*"
},
"suggest": {
"ext-dom": "To manipulate phpunit.xml via the custom-rule command"
},
"bin": [
"bin/rector"
],
"type": "library",
"autoload": {
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Instant Upgrade and Automated Refactoring of any PHP code",
"homepage": "https://getrector.com/",
"keywords": [
"automation",
"dev",
"migration",
"refactoring"
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
"source": "https://github.com/rectorphp/rector/tree/2.1.1"
},
"funding": [
{
"url": "https://github.com/tomasvotruba",
"type": "github"
}
],
"time": "2025-07-10T11:31:31+00:00"
},
{
"name": "symfony/debug-bundle",
"version": "v6.4.13",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug-bundle.git",
"reference": "7bcfaff39e094cc09455201916d016d9b2ae08ff"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/debug-bundle/zipball/7bcfaff39e094cc09455201916d016d9b2ae08ff",
"reference": "7bcfaff39e094cc09455201916d016d9b2ae08ff",
"shasum": ""
},
"require": {
"ext-xml": "*",
"php": ">=8.1",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
"symfony/http-kernel": "^5.4|^6.0|^7.0",
"symfony/twig-bridge": "^5.4|^6.0|^7.0",
"symfony/var-dumper": "^5.4|^6.0|^7.0"
},
"conflict": {
"symfony/config": "<5.4",
"symfony/dependency-injection": "<5.4"
},
"require-dev": {
"symfony/config": "^5.4|^6.0|^7.0",
"symfony/web-profiler-bundle": "^5.4|^6.0|^7.0"
},
"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/v6.4.13"
},
"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-09-25T14:18:03+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"stability-flags": {},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": ">=7.2.5",
"php": "^8.4",
"ext-ctype": "*",
"ext-iconv": "*"
},
"platform-dev": [],
"plugin-api-version": "2.3.0"
"platform-dev": {},
"plugin-api-version": "2.6.0"
}

View File

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

View File

@ -8,8 +8,8 @@ framework:
# Other options include:
# Redis
#app: cache.adapter.redis
#default_redis_provider: redis://localhost
app: cache.adapter.redis
default_redis_provider: '%env(REDIS_DSN)%'
# APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues)
#app: cache.adapter.apcu

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

@ -1,4 +1,12 @@
# see https://symfony.com/doc/current/reference/configuration/framework.html
parameters:
base_url: '%env(BASE_URL)%'
env(BASE_URL): '//'
base_path: '%env(BASE_PATH)%'
env(BASE_PATH): '/'
cookie_path: '%env(COOKIE_PATH)%'
env(COOKIE_PATH): '/'
framework:
secret: '%env(APP_SECRET)%'
#csrf_protection: true
@ -7,15 +15,20 @@ framework:
# Enables session support. Note that the session will ONLY be started if you read or write from it.
# Remove or comment this section to explicitly disable session support.
session:
handler_id: null
handler_id: '%env(REDIS_DSN)%'
cookie_secure: auto
cookie_samesite: lax
storage_factory_id: session.storage.factory.native
cookie_path: "%cookie_path%"
assets:
json_manifest_path: '%kernel.project_dir%/public/build/manifest.json'
router:
default_uri: '%base_url%'
#esi: true
#fragments: true
php_errors:
log: true
error_controller: App\Controller\CustomErrorController::show
when@test:
framework:

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,2 +0,0 @@
framework:
lock: '%env(LOCK_DSN)%'

View File

@ -2,11 +2,16 @@ security:
enable_authenticator_manager: true
# https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
password_hashers:
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
app_hasher:
# the service ID of your custom hasher (the FQCN using the default services.yaml)
id: 'App\Security\Hasher\PasswordEncoder'
# App\Entity\User: 'sha256'
# Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface:
# algorithm: 'sha256'
# https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider
providers:
pdo_user_provider:
id: App\Security\PdoUserProvider
sql_login_provider:
id: App\Security\SQLLoginUserProvider
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
@ -14,17 +19,9 @@ security:
main:
# lazy: true
stateless: false
provider: pdo_user_provider
provider: sql_login_provider
custom_authenticators:
- App\Security\PdoUserAuthenticator
entry_point: form_login
form_login:
login_path: app_login
check_path: app_login
username_parameter: login
password_parameter: password
enable_csrf: true
- App\Security\SQLLoginUserAuthenticator
login_throttling:
max_attempts: 3
@ -40,6 +37,7 @@ security:
access_control:
- { path: ^/login, roles: PUBLIC_ACCESS }
- { path: ^/connect, roles: ROLE_USER }
- { path: ^/health, roles: PUBLIC_ACCESS }
# - { path: ^/connect, roles: [IS_AUTHENTICATED_FULLY, ROLE_USER] }
when@test:

View File

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

View File

@ -1,49 +1,11 @@
webpack_encore:
# The path where Encore is building the assets - i.e. Encore.setOutputPath()
output_path: '%kernel.project_dir%/public/build'
# If multiple builds are defined (as shown below), you can disable the default build:
# output_path: false
output_path: "%kernel.project_dir%/public/build"
# Set attributes that will be rendered on all script and link tags
script_attributes:
defer: true
# Uncomment (also under link_attributes) if using Turbo Drive
# https://turbo.hotwired.dev/handbook/drive#reloading-when-assets-change
# 'data-turbo-track': reload
# link_attributes:
# Uncomment if using Turbo Drive
# 'data-turbo-track': reload
# If using Encore.enableIntegrityHashes() and need the crossorigin attribute (default: false, or use 'anonymous' or 'use-credentials')
# crossorigin: 'anonymous'
# Preload all rendered script and link tags automatically via the HTTP/2 Link header
# preload: true
# Throw an exception if the entrypoints.json file is missing or an entry is missing from the data
# strict_mode: false
# If you have multiple builds:
# builds:
# frontend: '%kernel.project_dir%/public/frontend/build'
# pass the build name as the 3rd argument to the Twig functions
# {{ encore_entry_script_tags('entry1', null, 'frontend') }}
# Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes)
# Put in config/packages/prod/webpack_encore.yaml
# cache: true
framework:
assets:
json_manifest_path: '%kernel.project_dir%/public/build/manifest.json'
#when@prod:
# webpack_encore:
# # Cache the entrypoints.json (rebuild Symfony's cache when entrypoints.json changes)
# # Available in version 1.2
# cache: true
#when@test:
# webpack_encore:
# strict_mode: false

View File

@ -1,8 +0,0 @@
pdo:
column_login_name: email
column_password_name: password
table_name: usager
data_to_fetch:
- email
- lastname
- firstname

View File

@ -9,8 +9,9 @@ parameters:
database.user: "%env(resolve:DB_USER)%"
database.password: "%env(resolve:DB_PASSWORD)%"
# algorythme de hahshage utilisé "md5", "sha256", "haval160,4", etc.
hashAlgo: "sha256"
# algorythme de hashage utilisé "md5", "sha256", "haval160,4", etc.
env(HASH_ALGO_LEGACY): "sha256"
hashAlgoLegacy: '%env(resolve:HASH_ALGO_LEGACY)%'
# adresse du site hote
issuer_url: '%env(resolve:ISSUER_URL)%'
@ -21,9 +22,13 @@ parameters:
default_locale: '%env(DEFAULT_LOCALE)%'
env(DEFAULT_LOCALE): 'fr'
security_pattern: '%env(resolve:SECURITY_PATTERN)%'
env(APP_LOCALES): "fr,en"
locales: '%env(APP_LOCALES)%'
app.supported_locales: ~
env(PEPPER): ~
pepper: '%env(resolve:PEPPER)%'
services:
# default configuration for services in *this* file
_defaults:
@ -39,11 +44,15 @@ services:
- '../src/Entity/'
- '../src/Kernel.php'
App\Security\PdoUserAuthenticator:
App\Security\SQLLoginUserAuthenticator:
arguments:
$baseUrl: '%base_url%'
App\Pdo\PdoRequest:
App\Hydra\HydraService:
arguments:
$baseUrl: '%base_url%'
App\SQLLogin\SQLLoginRequest:
arguments:
$config: []
$dsn: "%database.dsn%"
@ -58,5 +67,31 @@ services:
App\EventListener\LocaleSubscriber:
arguments:
$defaultLocale: "%default_locale%"
App\Security\Hasher\PasswordEncoder:
arguments:
$pepper: '%pepper%'
$hashAlgoLegacy: '%hashAlgoLegacy%'
$securityPattern: '%security_pattern%'
# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
App\Altcha\Form\AltchaType:
arguments:
$altchaHost: "%env(ALTCHA_HOST)%"
$altchaBaseUrl: "%env(ALTCHA_BASE_URL)%"
$altchaDebug: "%env(bool:ALTCHA_DEBUG)%"
$altchaWorkers: "%env(ALTCHA_WORKERS)%"
$altchaDelay: "%env(ALTCHA_DELAY)%"
$altchaMockError: "%env(bool:ALTCHA_MOCK_ERROR)%"
tags:
- { name: form.type, alias: altcha}
App\Form\LoginType:
arguments:
$altchaEnabled: "%env(bool:ALTCHA_ENABLED)%"
App\Altcha\AltchaValidator:
arguments:
$altchaHost: "%env(ALTCHA_HOST)%"
$altchaBaseUrl: "%env(ALTCHA_BASE_URL)%"

View File

@ -0,0 +1,9 @@
sql_login:
login_column_name: email
password_column_name: password
salt_column_name: salt
table_name: usager
data_to_fetch:
- email
- lastname
- firstname

View File

@ -1,12 +0,0 @@
CREATE TABLE IF NOT EXISTS usager (
email VARCHAR ( 100 ) UNIQUE NOT NULL,
password VARCHAR ( 255 ) NOT NULL,
lastname VARCHAR ( 255 ) NOT NULL,
firstname VARCHAR ( 255 ) NOT NULL
);
INSERT INTO usager (email, password, lastname, firstname) VALUES
('test1@test.com', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'Sassot', 'Charles'),
('test2@test.com', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'Dubois', 'Angela'),
('test3@test.com', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'Dupont', 'Henri'),
('test4@test.com', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'Durand', 'Isabelle');
GRANT ALL PRIVILEGES ON lasql.* TO lasql@localhost identified by 'lasql';

View File

@ -1,12 +0,0 @@
CREATE TABLE IF NOT EXISTS usager (
email VARCHAR ( 100 ) UNIQUE NOT NULL,
password VARCHAR ( 255 ) NOT NULL,
lastname VARCHAR ( 255 ) NOT NULL,
firstname VARCHAR ( 255 ) NOT NULL
);
INSERT INTO usager (email, password, lastname, firstname) VALUES
('test1@test.com', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'Locke', 'John'),
('test2@test.com', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'Dubois', 'Angela'),
('test3@test.com', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'Dupont', 'Henri'),
('test4@test.com', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'Durand', 'Isabelle');
GRANT ALL PRIVILEGES ON DATABASE usager TO lasql

View File

@ -8,7 +8,7 @@
# Using SetHandler avoids issues with using ProxyPassMatch in combination
# with mod_rewrite or mod_autoindex
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://127.0.0.1:9000"
SetHandler "proxy:unix:/run/php/php8.4-fpm.sock|fcgi://127.0.0.1:9000"
# for Unix sockets, Apache 2.4.10 or higher
# SetHandler proxy:unix:/path/to/fpm.sock|fcgi://dummy
</FilesMatch>

View File

@ -7,7 +7,7 @@ ARG https_proxy=
ENV WAITFORIT_VERSION="v2.4.1"
ARG PHP_VERSION="8.1"
ARG PHP_VERSION="8.4"
ENV PHP_VERSION $PHP_VERSION
RUN export DEBIAN_FRONTEND=noninteractive && \
@ -68,14 +68,14 @@ RUN chmod +x /var/www/install-composer.sh &&\
# On active les mods d'apache nécessaires
RUN a2enmod rewrite
RUN a2enmod proxy_fcgi setenvif
RUN a2enconf php8.1-fpm
RUN a2enconf php8.4-fpm
RUN a2enmod proxy
RUN a2enmod expires
RUN a2enmod headers
# On injecte les bonnes configs apache et php-fpm
COPY 000-default.conf /etc/apache2/sites-available/000-default.conf
COPY www.conf /etc/php/8.1/fpm/pool.d/www.conf
COPY www.conf /etc/php/8.4/fpm/pool.d/www.conf
EXPOSE 5000
EXPOSE 80
@ -83,8 +83,8 @@ EXPOSE 80
WORKDIR /var/www
# On démarre php-fpm une fois pour créer les sockets
RUN service php8.1-fpm start
RUN service php8.1-fpm stop
RUN service php8.4-fpm start
RUN service php8.4-fpm stop
COPY docker-entrypoint.sh /docker-entrypoint.sh
@ -99,7 +99,7 @@ RUN sed -i '/imklog/s/^/#/' /etc/rsyslog.conf
COPY rsyslog.conf /etc/rsyslog.d/var/www.conf
COPY supervisor.ini /etc/supervisor/supervisor.ini
COPY php.ini /etc/php/8.1/fpm/php.ini
COPY php.ini /etc/php/8.4/fpm/php.ini
VOLUME /container-lifecycle

View File

@ -26,7 +26,7 @@ stderr_logfile_maxbytes=0
[program:php-fpm]
environment=HOSTNAME="%(ENV_HOSTNAME)s"
command = /usr/sbin/php-fpm8.1 -F
command = /usr/sbin/php-fpm8.4 -F
autostart = true
autorestart = true
directory = /var/www

View File

@ -6,7 +6,7 @@ error_log=/dev/stderr
user = www-data
group = www-data
listen = /run/php/php8.1-fpm.sock
listen = /run/php/php8.4-fpm.sock
listen.owner = www-data
listen.group = www-data

View File

@ -0,0 +1,15 @@
CREATE TABLE IF NOT EXISTS usager (
email VARCHAR ( 100 ) UNIQUE NOT NULL,
password VARCHAR ( 255 ) NOT NULL,
salt VARCHAR (255),
lastname VARCHAR ( 255 ) NOT NULL,
firstname VARCHAR ( 255 ) NOT NULL
);
INSERT INTO usager (email, password, salt, lastname, firstname) VALUES
/* Bcrypt */
('test1@test.com', '$2y$10$cpgbS9OkiH9tQTh0QOyAgeWhyg1GSTIzjAlb8DXNW5VGM.2TTPMgK', '','Locke', 'John'),
/* SHA256 */
('test2@test.com', '34631c8f2a3e00900c463a00d5eab046e9060ac6ff752fc88a0ce549e7a500d2', 'cesaltestunexemple', 'Durand', 'Isabelle'),
/* SSHA */
('test3@test.com', '{SSHA}xip81P5Ga8dx07WZJ0Y9lJ2RGapjZXNhbHRlc3R1bmF1dHJlZXhlbXBsZQ==', '', 'Dupont', 'Henri');
GRANT ALL PRIVILEGES ON lasql.* TO lasql@localhost identified by 'lasql';

View File

@ -0,0 +1,15 @@
CREATE TABLE IF NOT EXISTS usager (
email VARCHAR ( 100 ) UNIQUE NOT NULL,
password VARCHAR ( 255 ) NOT NULL,
salt VARCHAR (255),
lastname VARCHAR ( 255 ) NOT NULL,
firstname VARCHAR ( 255 ) NOT NULL
);
INSERT INTO usager (email, password, salt, lastname, firstname) VALUES
/* Bcrypt */
('test1@test.com', '$2y$10$cpgbS9OkiH9tQTh0QOyAgeWhyg1GSTIzjAlb8DXNW5VGM.2TTPMgK', '','Locke', 'John'),
/* SHA256 */
('test2@test.com', '34631c8f2a3e00900c463a00d5eab046e9060ac6ff752fc88a0ce549e7a500d2', 'cesaltestunexemple', 'Durand', 'Isabelle'),
/* SSHA */
('test3@test.com', '{SSHA}xip81P5Ga8dx07WZJ0Y9lJ2RGapjZXNhbHRlc3R1bmF1dHJlZXhlbXBsZQ==', '', 'Dupont', 'Henri');
GRANT ALL PRIVILEGES ON DATABASE usager TO lasql

View File

@ -0,0 +1,23 @@
ARG NODE_OPTIONS="--openssl-legacy-provider" \
PHP_PKG_VERSION="8.4.5-r0" \
ENCORE_MODE="production" \
APP_ENV="prod" \
BASE_PATH="" \
APP_LOCALES="fr,en" \
ADDITIONAL_PACKAGES=" \
php84-gd=${PHP_PKG_VERSION} \
php84-xsl=${PHP_PKG_VERSION} \
php84-pgsql=${PHP_PKG_VERSION} \
php84-pdo_pgsql=${PHP_PKG_VERSION} \
php84-soap=${PHP_PKG_VERSION} \
php84-ldap=${PHP_PKG_VERSION} \
php84-pdo_mysql=${PHP_PKG_VERSION} \
php84-bcmath=${PHP_PKG_VERSION} \
php84-xdebug" \
ADDITIONAL_ENV=" \
ENCORE_MODE=${ENCORE_MODE} \
APP_ENV=${APP_ENV} \
BASE_PATH=${BASE_PATH} \
APP_LOCALES=${APP_LOCALES}"
FROM reg.cadoles.com/cadoles/symfony:alpine-php-8.4-base-2025.6.12-stable.1038.48ea3b9

View File

@ -0,0 +1,24 @@
ARG NODE_OPTIONS="--openssl-legacy-provider" \
PHP_PKG_VERSION="8.4.5-r0" \
ENCORE_MODE="production" \
APP_ENV="prod" \
BASE_PATH="" \
APP_LOCALES="fr,en" \
ADDITIONAL_PACKAGES=" \
php84-gd=${PHP_PKG_VERSION} \
php84-xsl=${PHP_PKG_VERSION} \
php84-pgsql=${PHP_PKG_VERSION} \
php84-pdo_pgsql=${PHP_PKG_VERSION} \
php84-soap=${PHP_PKG_VERSION} \
php84-ldap=${PHP_PKG_VERSION} \
php84-pdo_mysql=${PHP_PKG_VERSION} \
php84-bcmath=${PHP_PKG_VERSION} \
php84-xdebug" \
ADDITIONAL_ENV=" \
ENCORE_MODE=${ENCORE_MODE} \
APP_ENV=${APP_ENV} \
BASE_PATH=${BASE_PATH} \
APP_LOCALES=${APP_LOCALES}"
FROM reg.cadoles.com/cadoles/symfony:alpine-php-8.4-standalone-2025.6.12-stable.1038.48ea3b9
USER www-data

10600
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -2,13 +2,12 @@
"devDependencies": {
"@babel/core": "^7.17.0",
"@babel/preset-env": "^7.16.0",
"@hotwired/stimulus": "^3.0.0",
"@symfony/stimulus-bridge": "^3.2.0",
"@symfony/webpack-encore": "^4.1.2",
"core-js": "^3.23.0",
"regenerator-runtime": "^0.13.9",
"webpack": "^5.74.0",
"webpack": "^5.94.0",
"webpack-cli": "^4.10.0",
"file-loader": "^6.2.0",
"webpack-notifier": "^1.15.0"
},
"license": "UNLICENSED",
@ -20,8 +19,13 @@
"build": "encore production --progress"
},
"dependencies": {
"autoprefixer": "^10.4.4",
"add": "^2.0.6",
"bootstrap": "^5.2.3",
"jquery": "^3.6.1",
"postcss-loader": "^7.0.2",
"sass": "^1.56.2",
"sass-loader": "^13.2.0"
"sass-loader": "^13.2.0",
"altcha": "^2.0.0"
}
}

8
phpstan.dist.neon Normal file
View File

@ -0,0 +1,8 @@
parameters:
level: 6
paths:
- bin/
- config/
- public/
- src/
- tests/

153
readme.md
View File

@ -3,80 +3,117 @@
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
## Usage
## Image
Dans le cas d'utilsation du thème pour personaliser la page de login
- 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
### Développement
## Configuration
Un environnement Docker Compose est proposé comme support de développement.
### Variables d'environnement
Afin de démarrer celui-ci:
| Variable | Description | Valeur par défaut | Utilisation |
| ----------------------------------- | ------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ----------- |
| `APP_ENV` | Environnement symfony | prod | dev:prod |
| `APP_DEBUG` | Console de debug symofny | false | true:false |
| `HYDRA_ADMIN_BASE_URL` | Url d'admin Hydra ou dispatcher | http://hydra:4445 | 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 | |
| `DB_USER` | User de connection à la BDD | lasql | obligatoire |
| `DB_PASSWORD` | PAssword de l'utilisateur de la BDD | lasql | obligatoire |
| `APP_LOCALES` | Langues disponibles dans l'application | fr,en | obligatoire |
| `HASH_ALGO_LEGACY` | ALgorythme de Hashage par défaut | sha256 | |
| `SECURITY_PATTERN` | Séquence à employer pour le hashage du mot de passe | password,salt,pepper | obligatoire |
| `PEPPER` | Pepper utilisé pour le Hashage | | |
| `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 | |
| `ALTCHA_ENABLED` | Désactivation d'altcha lors de la connexion | true | |
```bash
### Algorithmes de hashage compatibles
# Démarrer l'environnement docker-compose
make up
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.
# fermer l'environnement
make down
### 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.
Exemple : `SECURITY_PATTERN="salt,password,pepper"`
## Variables d'environnement
```
DB_USER="lasql"
DB_PASSWORD="lasql"
### Schéma de base de donnée
ISSUER_URL="http://localhost:8000"
BASE_URL='http://localhost:8080'
# connexion hydra
HYDRA_ADMIN_BASE_URL='http://hydra:4445'
DSN_REMOTE_DATABASE="pgsql:host='postgres';port=5432;dbname=lasql"
APP_LOCALES="fr,en"
```
Permet d'adapter les requetes SQL à la base de donnée utilisée en indiquant les noms de colonnes de celle-ci.
### test connexion mariadb
```
Modifier la variable d'environnement avec cette valeur
DSN_REMOTE_DATABASE="mysql:host=mariadb;port=3306;dbname=lasql;"
```
## Données de test
un base de données postgres est montée dans l'environnement pour tester la connexion:
utilisateurs disponibles au démarage:
('test1@test.com', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'Locke', 'John'),
('test2@test.com', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'Dubois', 'Angela'),
('test3@test.com', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'Dupont', 'Henri'),
('test4@test.com', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 'Durand', 'Isabelle');
Mot de passe = '123456' hashé en par sha256
## configuration
Permet d'adapter les requetes SQL en indiquant les noms de colonnes nécessaires.
pdo_configuration/pdo.yaml
```
pdo:
column_login_name: email
column_password_name: password
```yaml
# config/sql_login_configuration/sql_login.yaml
sql_login:
login_column_name: email
password_column_name: password
salt_column_name: ~
table_name: usager
data_to_fetch:
- email
- lastname
- firstname
subject_rewrite_expression: 'firstname~"."~lastname~"@exemple.com"'
```
#### Conteneurs
## Environnement de développement
|Nom|Description|Port(s) hôte utilisé(s)|
|---|-----------|------------------|
|`oidc-test`|Application factice permettant de tester l'authentification OpenID Connect|`8080`|
|`hydra`|Serveur Ory/Hydra|`8081`|
|`hydra-sql`|Login/Consent/Logout App (ce projet)|`8082`|
|`postgres`| Base de donnée postgres support du test et pour hydra|`5432`
|`mariadb`| Base de donnée mariadb support du test|`3306`
|`pgadmin`| pour administrer la base de donnée |`8085`
### Tester
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:
| Login | Mot de passe | Algorithme |
|-------|--------------|------------|
| test1@test.com | 123456 | Bcrypt |
| test2@test.com | 123456 | SHA256 |
| test3@test.com | 123456 | SSHA |
### Base de donnée
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.
- **URL Postgres**: `postgresql://lasql:lasql@mariadb:3306/lasql?serverVersion=15&chartset=utf8`
- **URL Mariadb**: `mysql://lasql:lasql@postgres:5432/lasql`
### Redis
La variable `REDIS_DSN` est obligatoire. Hydra-sql utilise dorénavant Redis pour le stockage du cache et des session. Compatible Redis Sentinel
ex : `'redis:?host[redis1:26379]&host[redis2:26379]&host[redis3:26379]&redis_sentinel=mymaster'`
### Liste des ports
| Nom | Description | Port(s) hôte utilisé(s) |
| ----------- | -------------------------------------------------------------------------- | ----------------------- |
| `oidc-test` | Application factice permettant de tester l'authentification OpenID Connect | `8080` |
| `hydra` | Serveur Ory/Hydra | `8081` |
| `hydra-sql` | Login/Consent/Logout App (ce projet) | `8082` |
| `postgres` | Base de donnée postgres support du test et pour hydra | `5432` |
| `mariadb` | Base de donnée mariadb support du test | `3306` |
| `pgadmin` | pour administrer la base de donnée | `8085` |
### build du sql theme
copier les images et les fonts dans les dossier ./assets
modifier si besoin le fichier theme-entrypoints.js
lancer un `npm run build`

28
rector.php Normal file
View File

@ -0,0 +1,28 @@
<?php
declare(strict_types=1);
use Rector\Config\RectorConfig;
use Rector\Renaming\Rector\Class_\RenameAttributeRector;
use Rector\Symfony\Set\SymfonySetList;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->paths([
__DIR__ . '/src',
]);
$rectorConfig->sets([
SymfonySetList::SYMFONY_60,
SymfonySetList::SYMFONY_61,
SymfonySetList::SYMFONY_62,
SymfonySetList::SYMFONY_63,
SymfonySetList::SYMFONY_64,
SymfonySetList::SYMFONY_CODE_QUALITY,
SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION,
]);
$rectorConfig->importShortClasses(false);
$rectorConfig->skip([
RenameAttributeRector::class
]);
};

View File

@ -0,0 +1,48 @@
<?php
namespace App\Altcha;
use App\Altcha\Form\AltchaModel;
use Symfony\Component\Form\DataTransformerInterface;
class AltchaTransformer implements DataTransformerInterface
{
/**
* {@inheritDoc}
*/
public function reverseTransform($value): AltchaModel
{
if (empty($value)) {
return new AltchaModel();
}
$decodedValue = base64_decode($value);
$data = json_decode($decodedValue);
$model = new AltchaModel();
foreach ($data as $property => $value) {
$model->{$property} = $value;
}
return $model;
}
/**
* {@inheritDoc}
*/
public function transform($value): string
{
if (empty($value)) {
return '';
}
$json = json_encode($value);
if (false === $json) {
return '';
}
return base64_encode($json);
}
}

View File

@ -0,0 +1,52 @@
<?php
namespace App\Altcha;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class AltchaValidator
{
public function __construct(
private readonly string $altchaHost,
private readonly string $altchaBaseUrl,
private readonly HttpClientInterface $httpClient,
private readonly TranslatorInterface $translator
) {
}
public function validate(FormEvent $formEvent): void
{
$form = $formEvent->getForm();
$data = $form->getData();
$response = $this->httpClient->request(
'POST',
$this->altchaHost.$this->altchaBaseUrl.'/verify',
[
'body' => json_encode($data),
'headers' => [
'Content-Type' => 'application/json',
],
],
);
if (Response::HTTP_OK !== $response->getStatusCode()) {
$form->addError(new FormError($this->translator->trans('altcha.validator.server_validation_error', [], 'form')));
return;
}
$content = $response->getContent();
$parsedResponse = json_decode($content);
if (true !== $parsedResponse->success) {
$form->addError(new FormError($this->translator->trans('altcha.validator.server_validation_error', [], 'form')));
return;
}
}
}

View File

@ -0,0 +1,39 @@
<?php
namespace App\Altcha\Form;
use Symfony\Component\Validator\Constraints as Assert;
class AltchaModel
{
/**
* @Assert\NotBlank()
* @Assert\Regex("/^(SHA-1|SHA-256|SHA-512)$/")
*/
public string $algorithm;
/**
* @Assert\NotBlank()
*/
public string $challenge;
/**
* @Assert\NotBlank()
*/
public string $salt;
/**
* @Assert\NotBlank()
*/
public int $number;
/**
* @Assert\NotBlank()
*/
public string $signature;
/**
* @Assert\NotBlank()
*/
public int $took;
}

View File

@ -0,0 +1,81 @@
<?php
namespace App\Altcha\Form;
use App\Altcha\AltchaTransformer;
use App\Altcha\AltchaValidator;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class AltchaType extends AbstractType
{
public function __construct(
private readonly string $altchaHost,
private readonly string $altchaBaseUrl,
private readonly string $altchaDebug,
private readonly string $altchaWorkers,
private readonly string $altchaDelay,
private readonly string $altchaMockError,
private readonly AltchaValidator $altchaValidator,
private readonly HttpClientInterface $httpClient,
private readonly TranslatorInterface $translator
) {
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->addModelTransformer(new AltchaTransformer());
$builder->addEventListener(FormEvents::POST_SUBMIT, [$this->altchaValidator, 'validate']);
}
public function buildView(FormView $view, FormInterface $form, array $options)
{
$translations = [
'label' => $this->translator->trans('altcha.widget.label', [], 'form'),
'verified' => $this->translator->trans('altcha.widget.verified', [], 'form'),
'verifying' => $this->translator->trans('altcha.widget.verifying', [], 'form'),
'waitAlert' => $this->translator->trans('altcha.widget.waitalert', [], 'form'),
'error' => $this->translator->trans('altcha.widget.error', [], 'form'),
'expired' => $this->translator->trans('altcha.widget.expired', [], 'form'),
];
$view->vars['translations'] = json_encode($translations);
$view->vars['challengeJson'] = $this->requestChallenge();
$view->vars['debug'] = $this->altchaDebug;
$view->vars['workers'] = $this->altchaWorkers;
$view->vars['delay'] = $this->altchaDelay;
$view->vars['mockError'] = $this->altchaMockError;
}
private function requestChallenge(): string
{
$resp = $this->httpClient->request('GET', $this->altchaHost.$this->altchaBaseUrl.'/request');
if (Response::HTTP_OK === $resp->getStatusCode()) {
return $resp->getContent();
}
return '';
}
public function getParent(): string
{
return TextType::class;
}
public function getName(): string
{
return $this->getBlockPrefix();
}
public function getBlockPrefix(): string
{
return 'altcha';
}
}

View File

@ -0,0 +1,23 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ErrorHandler\Exception\FlattenException;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class CustomErrorController extends AbstractController
{
#[Route(path: '/error', name: 'custom_error_controller')]
public function show(FlattenException $exception): Response
{
$statusCode = $exception->getStatusCode();
$message = $exception->getMessage();
return $this->render('error.html.twig', [
'statusCode' => $statusCode,
'message' => $message,
]);
}
}

View File

@ -3,14 +3,26 @@
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
class LocaleController extends AbstractController
{
#[Route(path: 'locale/{locale}', name: 'locale_change')]
public function changeLocal(string $locale, Request $request)
private ParameterBagInterface $params;
public function __construct(ParameterBagInterface $params)
{
$this->params = $params;
}
#[Route(path: 'locale/{locale?}', name: 'locale_change')]
public function changeLocal(?string $locale, Request $request): RedirectResponse
{
if (empty($locale)) {
$locale = $this->params->get('default_locale');
}
// On stocke la langue dans la session
$request->getSession()->set('_locale', $locale);

View File

@ -5,46 +5,72 @@ namespace App\Controller;
use App\Entity\User;
use App\Hydra\Client;
use App\Hydra\HydraService;
use App\SQLLogin\SQLLoginRequest;
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\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class MainController extends AbstractController
{
public HydraService $hydra;
public Client $client;
public SessionInterface $session;
public function __construct(SessionInterface $session, HydraService $hydra, Client $client)
{
$this->session = $session;
$this->client = $client;
$this->hydra = $hydra;
public function __construct(
private readonly RequestStack $requestStack,
private readonly HydraService $hydra,
private readonly Client $client
){
}
#[Route('/', name: 'app_home')]
public function home(Request $request)
public function home(Request $request): RedirectResponse
{
return $this->hydra->handleLoginRequest($request);
}
#[Route('/connect/login-accept', name: 'app_login_accept')]
public function loginAccept(Request $request)
/*
* Route de Healthcheck (notament pour kubernetes)
*/
#[Route('/health', name: 'health')]
public function health(): Response
{
return new Response('healthy', Response::HTTP_OK);
}
#[Route('/connect/login-accept', name: 'app_login_accept', methods: ['GET'])]
public function loginAccept(SQLLoginRequest $sqlLoginRequest): RedirectResponse
{
/** @var User */
$user = $this->getUser();
$loginAcceptRes = $this->client->acceptLoginRequest($this->session->get('challenge'), [
'subject' => $user->getLogin(),
'remember' => true,
])->toArray();
if (!$user instanceof User) {
throw new AccessDeniedException();
}
$challenge = $this->requestStack->getSession()->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,
])->toArray();
return new RedirectResponse($loginAcceptRes['redirect_to']);
}
#[Route('/connect/consent', name: 'app_consent')]
public function consent(Request $request)
public function consent(Request $request): RedirectResponse
{
return $this->hydra->handleConsentRequest($request);
}

View File

@ -3,7 +3,7 @@
namespace App\Controller;
use App\Form\LoginType;
use App\Security\PdoUserAuthenticator;
use App\Security\SQLLoginUserAuthenticator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Form\FormError;
@ -17,7 +17,7 @@ use Symfony\Contracts\Translation\TranslatorInterface;
class SecurityController extends AbstractController
{
#[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
if ($this->getUser()) {
@ -28,27 +28,23 @@ class SecurityController extends AbstractController
$loginForm = $this->createForm(LoginType::class, null);
$error = $authenticationUtils->getLastAuthenticationError();
if ($error) {
if ($request->getSession()->has(PdoUserAuthenticator::ERROR_LOGIN)) {
$loginForm->get('login')->addError(new FormError($trans->trans('error.login', [], 'messages')));
$request->getSession()->remove(PdoUserAuthenticator::ERROR_LOGIN);
if ($request->getSession()->has(SQLLoginUserAuthenticator::ERROR_LOGIN)) {
$loginForm->addError(new FormError($trans->trans('error.login', [], 'messages')));
$request->getSession()->remove(SQLLoginUserAuthenticator::ERROR_LOGIN);
}
if ($request->getSession()->has(PdoUserAuthenticator::ERROR_PASSWORD)) {
$loginForm->get('password')->addError(new FormError($trans->trans('error.password', [], 'messages')));
$request->getSession()->remove(PdoUserAuthenticator::ERROR_PASSWORD);
}
if ($request->getSession()->has(PdoUserAuthenticator::ERROR_PDO)) {
$loginForm->addError(new FormError($trans->trans('error.pdo', [], 'messages')));
$request->getSession()->remove(PdoUserAuthenticator::ERROR_PDO);
if ($request->getSession()->has(SQLLoginUserAuthenticator::TECHNICAL_ERROR)) {
$loginForm->addError(new FormError($trans->trans('error.technical', [], 'messages')));
$request->getSession()->remove(SQLLoginUserAuthenticator::TECHNICAL_ERROR);
}
}
return $this->render('login.html.twig', [
'loginForm' => $loginForm->createView(),
'loginForm' => $loginForm,
]);
}
#[Route('/logout', name: 'logout')]
public function logout(Request $request)
public function logout(): void
{
}
}

View File

@ -1,25 +0,0 @@
<?php
namespace App\DependencyInjection;
use App\Pdo\PdoRequest;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
class PdoConfiguration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder('pdo');
$treeBuilder->getRootNode()->children()
->scalarNode(PdoRequest::COLUMN_LOGIN_NAME)->isRequired()->cannotBeEmpty()->end()
->scalarNode(PdoRequest::COLUMN_PASSWORD_NAME)->isRequired()->cannotBeEmpty()->end()
->scalarNode(PdoRequest::TABLE_NAME)->isRequired()->cannotBeEmpty()->end()
->arrayNode(PdoRequest::DATA_TO_FETCH)
->scalarPrototype()->end()
->end()
->end();
return $treeBuilder;
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\DependencyInjection;
use App\SQLLogin\SQLLoginRequest;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
class SQLLoginConfiguration implements ConfigurationInterface
{
public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('sql_login');
$treeBuilder->getRootNode()->children()
->scalarNode(SQLLoginRequest::LOGIN_COLUMN_NAME)->isRequired()->cannotBeEmpty()->end()
->scalarNode(SQLLoginRequest::PASSWORD_COLUMN_NAME)->isRequired()->cannotBeEmpty()->end()
->scalarNode(SQLLoginRequest::SALT_COLUMN_NAME)->end()
->scalarNode(SQLLoginRequest::TABLE_NAME)->isRequired()->cannotBeEmpty()->end()
->arrayNode(SQLLoginRequest::DATA_TO_FETCH)
->scalarPrototype()->end()
->end()
->scalarNode(SQLLoginRequest::SUBJECT_REWRITE_EXPRESSION)->defaultNull()->end()
->end();
return $treeBuilder;
}
}

View File

@ -2,26 +2,26 @@
namespace App\DependencyInjection;
use App\Pdo\PdoRequest;
use App\SQLLogin\SQLLoginRequest;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
class PdoExtension extends Extension implements CompilerPassInterface
class SQLLoginExtension extends Extension implements CompilerPassInterface
{
/** @var array */
protected $pdoConfig;
protected $sqlLoginConfig;
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new PdoConfiguration();
$configuration = new SQLLoginConfiguration();
$config = $this->processConfiguration($configuration, $configs);
$this->pdoConfig = $config;
$this->sqlLoginConfig = $config;
}
public function process(ContainerBuilder $container)
{
$definition = $container->getDefinition(PdoRequest::class);
$definition->replaceArgument('$config', $this->pdoConfig);
$definition = $container->getDefinition(SQLLoginRequest::class);
$definition->replaceArgument('$config', $this->sqlLoginConfig);
}
}

View File

@ -6,18 +6,15 @@ use Symfony\Component\Security\Core\User\UserInterface;
class User implements UserInterface
{
/** @var array */
protected $attributes;
private array $attributes = [];
private string $login;
private string $password;
private bool $rememberMe;
public function __construct($login, $password, $attributes, $rememberMe = false)
public function __construct($login, $password, $attributes)
{
$this->password = $password;
$this->login = $login;
$this->attributes = $attributes;
$this->rememberMe = $rememberMe;
}
public function getLogin(): ?string
@ -35,11 +32,6 @@ class User implements UserInterface
return $this->attributes;
}
public function getRememberMe(): bool
{
return $this->rememberMe;
}
public function getRoles(): array
{
return ['ROLE_USER'];

View File

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

View File

@ -4,15 +4,16 @@ namespace App\EventListener;
use App\Hydra\HydraService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Http\Event\LogoutEvent;
class LogoutSubscriber implements EventSubscriberInterface
{
private HydraService $hydra;
public function __construct(
private UrlGeneratorInterface $urlGenerator,
private HydraService $hydra
HydraService $hydra
) {
$this->hydra = $hydra;
}
public static function getSubscribedEvents(): array

View File

@ -2,8 +2,8 @@
namespace App\Form;
use App\Altcha\Form\AltchaType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
@ -11,6 +11,11 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
class LoginType extends AbstractType
{
public function __construct(
private readonly bool $altchaEnabled
) {
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
@ -22,12 +27,15 @@ class LoginType extends AbstractType
'translation_domain' => 'form',
'label' => 'form.label.password',
])
->add('_remember_me', CheckboxType::class, [
'required' => false,
'translation_domain' => 'form',
'label' => 'form.label.remember_me',
])
;
if ($this->altchaEnabled) {
$builder->add('altcha', AltchaType::class, [
'translation_domain' => 'form',
'label' => 'altcha.widget.title',
'required' => true,
]);
}
}
public function configureOptions(OptionsResolver $resolver): void

View File

@ -8,25 +8,28 @@ use Symfony\Contracts\HttpClient\ResponseInterface;
class Client
{
protected $client;
private const int MAX_RETRY = 3;
private const array SLEEP_TIME = [
5,
500,
5000,
];
protected $hydraAdminBaseUrl;
public function __construct(HttpClientInterface $client, string $hydraAdminBaseUrl)
{
$this->client = $client;
$this->hydraAdminBaseUrl = $hydraAdminBaseUrl;
public function __construct(
private readonly HttpClientInterface $client,
private readonly string $hydraAdminBaseUrl
) {
}
public function fetchLoginRequestInfo(string $loginChallenge): ResponseInterface
{
$response = $this->client->request(
'GET',
$this->hydraAdminBaseUrl . '/oauth2/auth/requests/login',
$this->hydraAdminBaseUrl.'/oauth2/auth/requests/login',
[
'query' => [
'login_challenge' => $loginChallenge,
]
],
]
);
@ -35,7 +38,6 @@ class Client
throw new InvalidChallengeException();
}
return $response;
}
@ -43,11 +45,11 @@ class Client
{
$response = $this->client->request(
'GET',
$this->hydraAdminBaseUrl . '/oauth2/auth/requests/logout',
$this->hydraAdminBaseUrl.'/oauth2/auth/requests/logout',
[
'query' => [
'logout_challenge' => $logoutChallenge,
]
],
]
);
@ -56,27 +58,38 @@ class Client
throw new InvalidChallengeException();
}
return $response;
}
public function fetchConsentRequestInfo(string $consentChallenge): ResponseInterface
{
$response = $this->client->request(
'GET',
$this->hydraAdminBaseUrl . '/oauth2/auth/requests/consent',
[
'query' => [
'consent_challenge' => $consentChallenge,
$attempt = 0;
while ($attempt < self::MAX_RETRY) {
$response = $this->client->request(
'GET',
$this->hydraAdminBaseUrl.'/oauth2/auth/requests/consent',
[
'query' => [
'consent_challenge' => $consentChallenge,
],
]
]
);
);
switch ($response->getStatusCode()) {
case 404:
throw new InvalidChallengeException();
$status = $response->getStatusCode();
if (503 === $status) {
++$attempt;
usleep(1000 * self::SLEEP_TIME[$attempt] + random_int(1, 5) * 1000);
continue;
}
switch ($status) {
case 404:
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;
}
@ -85,18 +98,18 @@ class Client
{
$response = $this->client->request(
'PUT',
$this->hydraAdminBaseUrl . '/oauth2/auth/requests/login/accept',
$this->hydraAdminBaseUrl.'/oauth2/auth/requests/login/accept',
[
'query' => [
'login_challenge' => $loginChallenge,
],
'headers' => [
'Content-Type' => 'application/json'
'Content-Type' => 'application/json',
],
'body' => json_encode($payload),
]
);
return $response;
}
@ -104,13 +117,13 @@ class Client
{
$response = $this->client->request(
'PUT',
$this->hydraAdminBaseUrl . '/oauth2/auth/requests/consent/accept',
$this->hydraAdminBaseUrl.'/oauth2/auth/requests/consent/accept',
[
'query' => [
'consent_challenge' => $consentChallenge,
],
'headers' => [
'Content-Type' => 'application/json'
'Content-Type' => 'application/json',
],
'body' => json_encode($payload),
]
@ -123,13 +136,13 @@ class Client
{
$response = $this->client->request(
'PUT',
$this->hydraAdminBaseUrl . '/oauth2/auth/requests/logout/accept',
$this->hydraAdminBaseUrl.'/oauth2/auth/requests/logout/accept',
[
'query' => [
'logout_challenge' => $logoutChallenge,
],
'headers' => [
'Content-Type' => 'application/json'
'Content-Type' => 'application/json',
],
]
);

View File

@ -6,4 +6,4 @@ use Symfony\Component\HttpFoundation\Exception\BadRequestException;
class InvalidIssuerException extends BadRequestException
{
}
}

View File

@ -2,34 +2,27 @@
namespace App\Hydra;
use App\Entity\User;
use App\Hydra\Exception\InvalidChallengeException;
use App\Services\PdoService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Exception\BadRequestException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
class HydraService extends AbstractController
{
public SessionInterface $session;
public UrlGeneratorInterface $router;
public Client $client;
public PdoService $pdoServices;
public TokenStorageInterface $tokenStorage;
public function __construct(PdoService $pdoServices, Client $client, SessionInterface $session, UrlGeneratorInterface $router, TokenStorageInterface $tokenStorage)
{
$this->pdoServices = $pdoServices;
$this->session = $session;
$this->client = $client;
$this->router = $router;
$this->tokenStorage = $tokenStorage;
public function __construct(
private readonly Client $client,
private readonly RequestStack $requestStack,
private readonly TokenStorageInterface $tokenStorage,
private readonly string $baseUrl
){
}
public function handleLoginRequest(Request $request)
public function handleLoginRequest(Request $request): RedirectResponse
{
$challenge = $request->query->get('login_challenge');
// S'il n'y a pas de challenge, on déclenche une bad request
@ -40,16 +33,16 @@ class HydraService extends AbstractController
$res = $this->client->fetchLoginRequestInfo($challenge);
$loginRequestInfo = $res->toArray();
if (200 !== $res->getStatusCode()) {
$this->session->clear();
throw new BadRequestException('pas de code 200');
$this->requestStack->getSession()->clear();
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
$this->session->set('challenge', $loginRequestInfo['challenge']);
$this->requestStack->getSession()->set('challenge', $loginRequestInfo['challenge']);
return $this->redirectToRoute('app_login');
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');
if (!$challenge) {
@ -57,8 +50,10 @@ class HydraService extends AbstractController
}
$consentRequestInfo = $this->client->fetchConsentRequestInfo($challenge)->toArray();
/** @var User */
$user = $this->getUser();
if (!$user instanceof User) {
throw new AccessDeniedException('Utilisateur non autorisé.');
}
$consentAcceptResponse = $this->client->acceptConsentRequest($consentRequestInfo['challenge'], [
'grant_scope' => $consentRequestInfo['requested_scope'],
'session' => [
@ -69,7 +64,7 @@ class HydraService extends AbstractController
return new RedirectResponse($consentAcceptResponse['redirect_to']);
}
public function handleLogoutRequest(Request $request)
public function handleLogoutRequest(Request $request): RedirectResponse
{
$logoutChallenge = $request->get('logout_challenge');
if (empty($logoutChallenge)) {
@ -77,7 +72,7 @@ class HydraService extends AbstractController
}
$logoutRequestInfo = $this->client->fetchLogoutRequestInfo($logoutChallenge)->toArray();
$logoutAcceptRes = $this->client->acceptLogoutRequest($logoutRequestInfo['challenge'])->toArray();
$this->session->clear();
$this->requestStack->getSession()->clear();
$this->tokenStorage->setToken(null);
return new RedirectResponse($logoutAcceptRes['redirect_to']);

View File

@ -2,7 +2,7 @@
namespace App;
use App\DependencyInjection\PdoExtension;
use App\DependencyInjection\SQLLoginExtension;
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
@ -22,10 +22,10 @@ class Kernel extends BaseKernel
$this->microKernelConfigureContainer($loader);
$loader->load(function (ContainerBuilder $container) use ($loader) {
$envLanguage = \getenv('APP_LOCALES');
$envLanguage = getenv('APP_LOCALES');
$container->setParameter('app.supported_locales', explode(',', $envLanguage));
$container->registerExtension(new PdoExtension());
$loader->load($this->getConfigDir().'/pdo_configuration/*.{yml,yaml}', 'glob');
$container->registerExtension(new SQLLoginExtension());
$loader->load($this->getConfigDir().'/sql_login_configuration/*.{yml,yaml}', 'glob');
});
}
}

View File

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

View File

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

View File

@ -1,48 +0,0 @@
<?php
namespace App\Pdo;
use PDO;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class PdoConnect extends AbstractController
{
/**
* @var Singleton
* @static
*/
private static $_instance = null;
/**
* Constructeur de la classe
*
* @param void
*
* @return void
*/
private function __construct()
{
}
/**
* Méthode qui crée l'unique instance de la classe
* si elle n'existe pas encore puis la retourne.
*
* @param void
*
* @return PdoConnect
*/
public static function getInstance()
{
if (is_null(self::$_instance)) {
self::$_instance = new PdoConnect();
}
return self::$_instance;
}
public function connect($urlDatabase, $dbUser, $dbPassword)
{
return new PDO($urlDatabase, $dbUser, $dbPassword);
}
}

View File

@ -1,66 +0,0 @@
<?php
namespace App\Pdo;
class PdoRequest
{
public const DATA_TO_FETCH = 'data_to_fetch';
public const COLUMN_LOGIN_NAME = 'column_login_name';
public const COLUMN_PASSWORD_NAME = 'column_password_name';
public const TABLE_NAME = 'table_name';
protected array $config;
protected string $dsn;
protected string $user;
protected string $password;
public function __construct(array $config = [], string $dsn, string $user, string $password)
{
$this->config = $config;
$this->dsn = $dsn;
$this->user = $user;
$this->password = $password;
}
public function getDatabaseDsn()
{
return $this->dsn;
}
public function getDbUser()
{
return $this->user;
}
public function getDbPassword()
{
return $this->password;
}
public function getNameLogin()
{
return $this->config[self::COLUMN_LOGIN_NAME];
}
public function getNamePassword()
{
return $this->config[self::COLUMN_PASSWORD_NAME];
}
public function getRequestScope()
{
$scope = '';
foreach ($this->config[self::DATA_TO_FETCH] as $data) {
$scope .= $data.',';
}
$scope = substr($scope, 0, -1);
$request = 'SELECT '.$scope.' FROM '.$this->config[self::TABLE_NAME].' WHERE '.$this->config[self::COLUMN_LOGIN_NAME].' = :'.$this->config[self::COLUMN_LOGIN_NAME].';';
return $request;
}
public function getRequestLogin()
{
return 'SELECT '.$this->config[self::COLUMN_PASSWORD_NAME].' FROM '.$this->config[self::TABLE_NAME].' WHERE '.$this->config[self::COLUMN_LOGIN_NAME].' = :'.$this->config[self::COLUMN_LOGIN_NAME].';';
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,29 @@
<?php
namespace App\SQLLogin;
use PDO;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class SQLLoginConnect extends AbstractController
{
private static $_instance = null;
/**
* Méthode qui crée l'unique instance de la classe
* si elle n'existe pas encore puis la retourne.
*/
public static function getInstance(): SQLLoginConnect
{
if (is_null(self::$_instance)) {
self::$_instance = new SQLLoginConnect();
}
return self::$_instance;
}
public function connect($urlDatabase, $dbUser, $dbPassword): PDO
{
return new PDO($urlDatabase, $dbUser, $dbPassword);
}
}

View File

@ -0,0 +1,108 @@
<?php
namespace App\SQLLogin;
use App\SQLLogin\Exception\NullDataToFetchException;
class SQLLoginRequest
{
public const DATA_TO_FETCH = 'data_to_fetch';
public const LOGIN_COLUMN_NAME = 'login_column_name';
public const SALT_COLUMN_NAME = 'salt_column_name';
public const PASSWORD_COLUMN_NAME = 'password_column_name';
public const PASSWORD_NEED_UPGRADE = 'password_need_upgrade';
public const TABLE_NAME = 'table_name';
public const SUBJECT_REWRITE_EXPRESSION = 'subject_rewrite_expression';
private array $config;
private string $dsn;
private string $user;
private string $password;
public function __construct(string $dsn, string $user, string $password, array $config = [])
{
$this->config = $config;
$this->dsn = $dsn;
$this->user = $user;
$this->password = $password;
}
public function getDatabaseDsn(): string
{
return $this->dsn;
}
public function getDbUser(): string
{
return $this->user;
}
public function getDbPassword(): string
{
return $this->password;
}
public function getLoginColumnName(): string
{
return $this->config[self::LOGIN_COLUMN_NAME];
}
public function getPasswordColumnName(): string
{
return $this->config[self::PASSWORD_COLUMN_NAME];
}
public function getSaltColumnName(): ?string
{
return $this->config[self::SALT_COLUMN_NAME];
}
public function getTableName(): string
{
return $this->config[self::TABLE_NAME];
}
public function getDataToFetch(): array
{
return $this->config[self::DATA_TO_FETCH];
}
public function getSubjectRewriteExpression(): ?string
{
return $this->config[self::SUBJECT_REWRITE_EXPRESSION];
}
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
* intègre la récupération du mot de passe hashé, du salt et de besoin d'upgrade de la méthode de hashage
*/
private function getPasswordFields(): array
{
$fields[] = $this->getPasswordColumnName();
if (!empty($this->getSaltColumnName())) {
$fields[] = $this->getSaltColumnName();
}
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 '.$this->getLoginColumnName().' = :'.$this->getLoginColumnName().';';
}
}

View File

@ -0,0 +1,114 @@
<?php
namespace App\Security\Hasher;
use App\SQLLogin\Exception\InvalidSQLPasswordException;
use App\SQLLogin\Exception\SecurityPatternConfigurationException;
use Psr\Log\LoggerInterface;
use Symfony\Component\PasswordHasher\Exception\InvalidPasswordException;
use Symfony\Component\PasswordHasher\Hasher\CheckPasswordLengthTrait;
use Symfony\Component\PasswordHasher\LegacyPasswordHasherInterface;
class PasswordEncoder implements LegacyPasswordHasherInterface
{
use CheckPasswordLengthTrait;
public const PASSWORD_PATTERN = 'password';
public const SALT_PATTERN = 'salt';
public const PEPPER_PATTERN = 'pepper';
protected ?string $pepper;
protected array $hashAlgoLegacy;
protected array $securityPattern;
public function __construct(?string $pepper, string $hashAlgoLegacy, string $securityPattern, private LoggerInterface $loggerInterface)
{
$this->pepper = $pepper;
$this->hashAlgoLegacy = explode(',', $hashAlgoLegacy);
$this->securityPattern = explode(',', $securityPattern);
}
/**
* Pas utilisé, mais on doit le garder pour le implements
*/
public function hash(string $plainPassword, ?string $salt = null): string
{
if ($this->isPasswordTooLong($plainPassword)) {
throw new InvalidPasswordException();
}
return hash($plainPassword.$salt, $this->hashAlgoLegacy[0]);
}
public function verify(string $hashedPassword, string $plainPassword, ?string $salt = null): bool
{
if ('' === $plainPassword || $this->isPasswordTooLong($plainPassword)) {
return false;
}
$completedPassword = $this->getPasswordToHash($plainPassword, $salt);
if (str_starts_with($hashedPassword, '{SSHA}') && $this->compareSsha($hashedPassword, $plainPassword)) {
return true;
}
if (password_verify($completedPassword, $hashedPassword)) {
return true;
}
foreach (hash_algos() as $algo) {
if (hash_equals($hashedPassword, hash($algo, $completedPassword))) {
return true;
}
}
throw new InvalidSQLPasswordException();
}
public function needsRehash(string $hashedPassword): bool
{
return false;
}
public function isObsoleteAlgo($algo): bool
{
return in_array($algo, hash_algos());
}
/**
* Retourne la string à hasher en fonction du pattern indiqué
*/
protected function getPasswordToHash(string $plainTextPassword, ?string $salt = null): string
{
$arrayRef = [
self::PASSWORD_PATTERN => $plainTextPassword,
self::SALT_PATTERN => $salt,
self::PEPPER_PATTERN => $this->pepper,
];
foreach ($this->securityPattern as $term) {
if (self::PEPPER_PATTERN !== $term && self::PASSWORD_PATTERN !== $term && self::SALT_PATTERN !== $term) {
$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 = '';
foreach ($this->securityPattern as $term) {
$completedPlainPassword .= $arrayRef[$term];
}
return $completedPlainPassword;
}
protected function compareSsha(string $hashPassword, string $plainPassword): bool
{
$base_64_hash_with_salt = substr($hashPassword, 6);
$hash_with_salt = base64_decode($base_64_hash_with_salt);
$hash = substr($hash_with_salt, 0, 20);
$salt = substr($hash_with_salt, 20);
// hash given password
$hash_given = sha1($plainPassword.$salt, true);
return $hash == $hash_given;
}
}

View File

@ -1,103 +0,0 @@
<?php
namespace App\Security;
use App\Entity\User;
use App\Pdo\Exception\InvalidPasswordException;
use App\Services\PdoService;
use PDOException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
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\Passport;
use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
class PdoUserAuthenticator extends AbstractAuthenticator
{
public const LOGIN_ROUTE = 'app_login';
public const ERROR_LOGIN = 'error_login';
public const ERROR_PASSWORD = 'error_password';
public const ERROR_PDO = 'error_pdo';
protected string $baseUrl;
private PdoService $pdoService;
private UrlGeneratorInterface $router;
public function __construct(string $baseUrl, PdoService $pdoService, UrlGeneratorInterface $router)
{
$this->baseUrl = $baseUrl;
$this->pdoService = $pdoService;
$this->router = $router;
}
/**
* Called on every request to decide if this authenticator should be
* used for the request. Returning `false` will cause this authenticator
* to be skipped.
*/
public function supports(Request $request): bool
{
return self::LOGIN_ROUTE === $request->attributes->get('_route') && $request->isMethod('POST');
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey): ?Response
{
return new RedirectResponse($this->baseUrl.'/connect/login-accept');
}
public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response
{
$request->getSession()->set(Security::AUTHENTICATION_ERROR, $exception);
return new RedirectResponse(
$this->router->generate('app_login')
);
}
public function authenticate(Request $request): Passport
{
$form = $request->request->get('login');
$login = $form['login'];
$password = $form['password'];
$rememberMe = isset($form['_remember_me']) ? true : false;
try {
// requête préparée
$remoteHashedPassword = $this->pdoService->fetchPassword($login);
} catch (PDOException $e) {
$request->getSession()->set(self::ERROR_PDO, true);
throw new AuthenticationException();
}
if ($remoteHashedPassword) {
try {
$this->pdoService->verifyPassword($password, $remoteHashedPassword);
$attributes = $this->pdoService->fetchDatas($login);
$user = new User($login, $password, $attributes, $rememberMe);
$loader = function (string $userIdentifier) use ($user) {
return $user->getLogin() == $userIdentifier ? $user : null;
};
$passport = new SelfValidatingPassport(new UserBadge($login, $loader));
if ($rememberMe) {
$passport->addBadge(new RememberMeBadge());
}
$passport->setAttribute('attributes', $user->getAttributes());
return $passport;
} catch (InvalidPasswordException $e) {
$request->getSession()->set(self::ERROR_PASSWORD, true);
throw new AuthenticationException();
} catch (PDOException $e) {
$request->getSession()->set(self::ERROR_PDO, true);
throw new AuthenticationException();
}
}
$request->getSession()->set(self::ERROR_LOGIN, true);
throw new AuthenticationException();
}
}

View File

@ -1,49 +0,0 @@
<?php
namespace App\Security;
use App\Entity\User;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
class PdoUserProvider implements UserProviderInterface
{
protected RequestStack $requestStack;
public function __construct(RequestStack $requestStack, SessionInterface $session)
{
$this->requestStack = $requestStack;
$this->session = $session;
}
public function loadUserByIdentifier(string $identifier, ?User $user): ?UserInterface
{
if ($user->getUserIdentifier() === $identifier) {
return $user;
}
return null;
}
public function loadUserByUsername(string $username): ?UserInterface
{
return $this->loadUserByIdentifier($username, null);
}
public function refreshUser(UserInterface $user)
{
if (!$user instanceof User) {
throw new UnsupportedUserException(sprintf('Invalid user class "%s".', get_class($user)));
}
return $this->loadUserByIdentifier($user->getUserIdentifier(), $user);
}
public function supportsClass(string $class)
{
return User::class === $class || is_subclass_of($class, User::class);
}
}

View File

@ -0,0 +1,118 @@
<?php
namespace App\Security;
use App\Entity\User;
use App\Security\Hasher\PasswordEncoder;
use App\Service\SQLLoginService;
use App\SQLLogin\Exception\DataToFetchConfigurationException;
use App\SQLLogin\Exception\EmptyResultException;
use App\SQLLogin\Exception\InvalidSQLPasswordException;
use App\SQLLogin\Exception\SecurityPatternConfigurationException;
use App\SQLLogin\SQLLoginRequest;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Exception\UserNotFoundException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
use Symfony\Component\Security\Http\SecurityRequestAttributes;
class SQLLoginUserAuthenticator extends AbstractLoginFormAuthenticator
{
public const LOGIN_ROUTE = 'app_login';
public const ERROR_LOGIN = 'error_login';
public const TECHNICAL_ERROR = 'technical_error';
public function __construct(
private readonly string $baseUrl,
private readonly SQLLoginService $sqlLoginService,
private readonly PasswordEncoder $passwordHasher,
private readonly SQLLoginRequest $sqlLoginRequest
){
}
/**
* Called on every request to decide if this authenticator should be
* used for the request. Returning `false` will cause this authenticator
* to be skipped.
*/
public function supports(Request $request): bool
{
return self::LOGIN_ROUTE === $request->attributes->get('_route') && $request->isMethod('POST');
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey): RedirectResponse
{
return new RedirectResponse($this->baseUrl.'/connect/login-accept');
}
public function onAuthenticationFailure(Request $request, AuthenticationException $exception): RedirectResponse
{
$request->getSession()->set(SecurityRequestAttributes::AUTHENTICATION_ERROR, $exception);
return new RedirectResponse($this->baseUrl.'/login');
}
public function authenticate(Request $request): SelfValidatingPassport
{
$form = $request->request->all(key: 'login');
$login = $form['login'];
$plaintextPassword = $form['password'];
$session = $request->getSession();
try {
$datas = $this->sqlLoginService->fetchPasswordAndDatas($login);
} catch (EmptyResultException $e) {
$session->set(self::ERROR_LOGIN, true);
throw new AuthenticationException();
} catch (DataToFetchConfigurationException|\PDOException $e) {
\Sentry\captureException($e);
$session->set(self::TECHNICAL_ERROR, true);
throw new AuthenticationException();
}
$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 {
// Comparaison remote hash et hash du input password + salt
$this->passwordHasher->verify($remoteHashedPassword, $plaintextPassword, $remoteSalt);
} catch (InvalidSQLPasswordException $e) {
$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);
$loader = function (string $userIdentifier) use ($user): UserInterface {
if ($user->getLogin() !== $userIdentifier) {
throw new UserNotFoundException(sprintf('User "%s" not found.', $userIdentifier));
}
return $user;
};
$passport = new SelfValidatingPassport(new UserBadge($login, $loader));
$passport->setAttribute('attributes', $user->getAttributes());
return $passport;
}
protected function getLoginUrl(Request $request): string
{
return $this->baseUrl.'/login';
}
}

View File

@ -0,0 +1,50 @@
<?php
namespace App\Security;
use App\Entity\User;
use App\Service\SQLLoginService;
use App\SQLLogin\SQLLoginRequest;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\Exception\UserNotFoundException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
class SQLLoginUserProvider implements UserProviderInterface
{
public function __construct(
private readonly RequestStack $requestStack,
private readonly SQLLoginService $sqlLoginService,
private readonly SQLLoginRequest $sqlLoginRequest
){
}
public function loadUserByIdentifier(string $identifier): UserInterface
{
$user = $this->sqlLoginService->fetchPasswordAndDatas($identifier);
$attributes = $user;
unset($attributes[$this->sqlLoginRequest->getPasswordColumnName()]);
if (empty($user[$this->sqlLoginRequest->getLoginColumnName()]) || empty($user[$this->sqlLoginRequest->getPasswordColumnName()])) {
throw new UserNotFoundException('email or password not found');
}
return new User($user[$this->sqlLoginRequest->getLoginColumnName()], $user[$this->sqlLoginRequest->getPasswordColumnName()], $attributes);
}
public function refreshUser(UserInterface $user): UserInterface
{
if (!$user instanceof User) {
throw new UnsupportedUserException(sprintf('Invalid user class "%s".', get_class($user)));
}
return $this->loadUserByIdentifier($user->getUserIdentifier());
}
public function supportsClass(string $class): bool
{
return User::class === $class || \is_subclass_of($class, User::class);
}
}

View File

@ -0,0 +1,71 @@
<?php
namespace App\Service;
use App\SQLLogin\Exception\EmptyResultException;
use App\SQLLogin\SQLLoginConnect;
use App\SQLLogin\SQLLoginRequest;
use PDO;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\User\UserInterface;
class SQLLoginService extends AbstractController
{
public const MAX_RETRY = 3;
public function __construct(
private SQLLoginRequest $sqlLoginRequest,
private LoggerInterface $loggerInterface
) {
$this->sqlLoginRequest = $sqlLoginRequest;
$this->loggerInterface = $loggerInterface;
}
/**
* @return array<string,string>
*/
public function fetchPasswordAndDatas(string $login): array
{
$dataRequest = $this->sqlLoginRequest->getDatasRequest();
$login = \strtolower($login);
$datas = $this->executeRequestWithLogin($dataRequest, $login);
return $datas;
}
/**
* @return array<string,string>
*/
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]);
$datas = $query->fetch(PDO::FETCH_ASSOC);
$query->closeCursor();
if (false === $datas) {
usleep(3000);
++$attempt;
} else {
break;
}
}
if (self::MAX_RETRY === $attempt) {
throw new EmptyResultException();
}
return $datas;
}
private function getConnection(): PDO
{
// Appel du singleton
$sqlLogin = SQLLoginConnect::getInstance();
$pdo = $sqlLogin->connect($this->sqlLoginRequest->getDatabaseDsn(), $this->sqlLoginRequest->getDbUser(), $this->sqlLoginRequest->getDbPassword());
return $pdo;
}
}

Some files were not shown because too many files have changed in this diff Show More