mse#4543 - Add altcha to login form and its feature flag to disable it #52

Merged
mlamalle merged 2 commits from 4543-add-altcha-to-login into develop 2025-04-10 16:12:22 +02:00
51 changed files with 6456 additions and 2728 deletions

9
.env
View File

@ -41,3 +41,12 @@ LOCK_DSN=flock
SENTRY_DSN= SENTRY_DSN=
###< sentry/sentry-symfony ### ###< sentry/sentry-symfony ###
REDIS_DSN=redis://redis:6379 REDIS_DSN=redis://redis:6379
### Altcha
ALTCHA_HOST='http://altcha:3333'
ALTCHA_BASE_URL='/altcha'
ALTCHA_DEBUG=false
ALTCHA_WORKERS=8
ALTCHA_DELAY=100
ALTCHA_MOCK_ERROR=false
ALTCHA_ENABLED=true

1
.gitignore vendored
View File

@ -21,6 +21,7 @@ composer.phar
/tools /tools
/.trivy /.trivy
.mktools/ .mktools/
.php-cs-fixer.cache
###> symfony/framework-bundle ### ###> symfony/framework-bundle ###
/.env.local /.env.local

View File

@ -5,6 +5,9 @@ IMAGES := $(foreach file, $(wildcard $(IMAGES_DIR)/*), $(basename $(notdir $(fil
TRIVY_ARGS ?= TRIVY_ARGS ?=
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)) build-image: $(foreach image, $(IMAGES), build-image-$(image))
build-image-%: build-image-%:

View File

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

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';
}
}

722
assets/styles/theme.css Normal file
View File

@ -0,0 +1,722 @@
input[type="radio"]:checked ~ .app-item {
--tw-shadow: 0 10px 15px -3px rgb(22 78 99 / 0.3),
0 4px 6px -4px rgb(22 78 99 / 0.3);
background-color: rgb(76 233 14 / 0.15);
}
.header {
background-color: rgb(75, 207, 158);
width: 100%;
color: white;
}
section.header-logo a {
display: flex;
align-items: baseline;
width: auto;
float: left;
letter-spacing: -1px;
font-size: 30px;
text-decoration: none;
color: inherit;
color: #2c3e50;
line-height: 30px;
font-family: fontpvebold;
}
section.header-logo a span {
color: #4bcf9e;
font-size: 50px;
}
section.header-logo a svg {
width: 300px;
}
.header-logo {
margin-bottom: 15px;
padding: 25px 0;
}
@font-face {
font-family: "fontpve";
src: url("../fonts/oswald-regular-webfont.eot");
src: url("../fonts/oswald-regular-webfont.eot?#iefix")
format("embedded-opentype"),
url("../fonts/oswald-regular-webfont.woff2") format("woff2"),
url("../fonts/oswald-regular-webfont.woff") format("woff"),
url("../fonts/oswald-regular-webfont.ttf") format("truetype"),
url("../fonts/oswald-regular-webfont.svg#oswaldregular") format("svg");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "fontpvebold";
src: url("../fonts/oswald-bold-webfont.eot");
src: url("../fonts/oswald-bold-webfont.eot?#iefix")
format("embedded-opentype"),
url("../fonts/oswald-bold-webfont.woff2") format("woff2"),
url("../fonts/oswald-bold-webfont.woff") format("woff"),
url("../fonts/oswald-bold-webfont.ttf") format("truetype"),
url("../fonts/oswald-bold-webfont.svg#oswaldbold") format("svg");
font-weight: normal;
font-style: normal;
}
a,
a:visited,
a:hover {
color: #fff;
text-decoration: none;
cursor: pointer;
}
.row {
margin: 0px;
}
.logo-france-connect-fr:hover {
content: url("../images/franceconnect-fr-hover.png");
min-height: 58px;
}
.logo-france-connect-en:hover {
content: url("../images/franceconnect-en-hover.png");
min-height: 58px;
}
.logo-mse-connect-fr:hover {
content: url("../images/MSEConnect-hover-fr.png");
min-height: 56px;
}
.logo-mse-connect-en:hover {
content: url("../images/MSEConnect-hover-en.png");
min-height: 56px;
}
.facebook, .x, .instagram {
height:24px;
width:24px;
}
.facebook:hover{
content: url('../images/facebook-hover.png');
}
.x:hover{
content: url('../images/x-hover.png');
}
.instagram:hover{
content: url('../images/instagram-hover.png');
}
.form-control:focus {
border-color: #66afe9;
outline: 1em;
}
#mesr {
width: 150px;
}
body {
font-family: "fontpve", "Source Sans Pro", "Helvetica Neue", Helvetica, Arial,
sans-serif;
font-size: 14px;
color: #fff;
background-color: #fff;
min-width: 320px;
}
#wrapper {
max-width: 1007px;
margin: 15px auto 30px auto;
}
#logo-mse {
padding: 80px;
}
#header {
vertical-align: top;
color: #fff;
font-family: "fontpve", arial;
}
.pvetools .dropdown .dropdown-toggle {
text-decoration: none;
}
#pvemenu {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-weight: bold;
background-color: #1c856aff;
height: 35px;
color: #fff;
display: flex;
justify-content: space-between;
}
#pvelink {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
padding: 5px 0 0 1rem;
display: inline-block;
color: #fff;
}
#pvelink ul {
list-style: none;
float: left;
padding-left: 0;
}
#pvelink ul li {
list-style: none;
display: inline-block;
}
#pvelink a {
color: #fff !important;
text-decoration: none;
}
#pvelink span {
float: left;
margin-right: 5px;
}
.header-nav nav {
display: inline-block;
color: #2c3e50;
min-height: 35px;
padding: 0;
display: flex;
flex-direction: row;
justify-content: center;
transition: background 0.2s;
}
.header-nav nav ul {
margin: 0;
}
.header-nav nav a {
line-height: 35px;
padding: 0 20px;
color: #2c3e50;
}
.header-nav nav:hover {
background: #125444;
}
.header-nav nav:hover a {
color: #ffffff;
}
.language-flag {
height: 20px;
margin-right: 10px;
}
.pvetools .dropdown-menu {
background: #1c856aff;
min-width: 0px;
border: 0px;
box-shadow: none;
border-radius: 0;
margin: 0;
}
.dropdown-menu li a {
color: #ffffff;
background: #1c856aff;
}
.dropdown-menu li a:hover {
background: #125444;
}
.link-fc {
text-align: center;
margin-top: 8px;
text-decoration: underline;
}
.link-fc a {
color: white;
letter-spacing: 1px;
text-decoration: none;
}
.link-fc a:hover {
color: white;
text-decoration: underline;
}
#logo {
z-index: 10;
margin-left: 50px;
width: 280px;
display: inline-block;
vertical-align: bottom;
margin-bottom: 5px;
}
#pvename {
display: block;
}
#pvename a {
display: flex;
align-items: baseline;
width: auto;
text-decoration: none;
letter-spacing: -1px;
font-size: 30px;
color: #2c3e50;
line-height: 30px;
font-family: "fontpvebold";
padding: 3.4rem 0;
}
#pvename a > svg {
width: 280px;
}
#pvename a > span {
color: #1c856aff;
font-size: 50px;
}
@media (min-width: 992px) {
#pvename a {
padding: 3.4rem 0 3.4rem 1.5rem;
}
}
@media (max-width: 768px) {
#pvename {
text-align: center;
display: block;
overflow: hidden;
}
#footer ul {
text-align: center;
margin-bottom: 30px;
}
#pvename a {
display: block;
width: 100%;
margin: 10px auto;
}
#pvename a > svg {
padding-bottom: 10px;
}
#pvename a > span {
display: block;
line-height: 40px;
}
}
#boxlogin-wrapper {
padding: 0 18px;
width: 66%;
margin: auto;
}
#boxlogin {
background-color: #2d3e50;
color: #fff;
font-family: arial;
font-size: 13px;
padding: 15px 30px 30px 30px;
}
#boxlogin > * + * {
margin-top: 15px;
}
#boxlogin-title {
margin: 0;
text-transform: uppercase;
text-align: center;
color: #fff;
background-color: #1d2730;
font-family: "fontpvebold", aroam;
}
#boxlogin-title h1 {
font-size: 33px;
padding: 10px;
margin: 0;
}
label {
display: inline-block;
max-width: 100%;
margin-bottom: 5px;
font-weight: bold;
}
label[for="login_login"] {
padding-top: 10px;
}
#boxlogin .loginapp {
text-align: center;
padding: 30px;
}
.loginapp-button img {
border-radius: 2px;
height: 100%;
width: 100%;
object-fit: contain;
min-height: 56px;
}
.loginapp-button:hover {
cursor: pointer;
}
.separateur {
align-items: center;
display: flex;
text-align: center;
padding: 0 2rem 1.3rem 2rem;
}
#choixFC {
width: 2.5rem;
font-size: 1.2rem;
}
.text-right {
text-align: right;
}
.separateur::after,
.separateur::before {
content: "";
flex: 1;
border-bottom: 2px solid #e8e8e8;
}
#boxlogin .encart-erreur {
color: #2d3e50;
text-transform: uppercase;
text-align: center;
background-color: #fff;
padding: 10px 2px;
font-family: "fontpve", aroam;
font-size: 15px;
margin-top: 20px;
margin-bottom: 10px;
}
#boxlogin h2 {
font-size: 25px;
text-transform: uppercase;
font-family: "fontpvebold", aroam;
}
#boxlogin h3 {
color: #fff;
text-transform: uppercase;
text-align: center;
background-color: #4bcf9e;
padding: 10px 2px;
font-family: "fontpve", aroam;
font-size: 15px;
}
#boxlogin h4 {
color: #fff;
text-align: center;
background-color: red;
padding: 10px 2px;
font-family: arial;
font-size: 15px;
margin: 10px;
}
#pvelogin,
#pvedescription {
/* padding: 30px 15px 10px 15px; */
margin: 0;
}
#pvelogin input {
font-size: 20px;
height: 45px;
}
#pvelogin input:-webkit-autofil {
background-color: #fff;
}
#pvelogin button {
background-color: rgba(0, 0, 0, 0);
border-color: #fff;
display: block;
width: 100%;
padding: 10px 16px;
font-size: 18px;
line-height: 1.33;
border-radius: 6px;
}
#pvelogin a {
color: #fff;
padding-top: 10px;
text-decoration: underline;
}
#pvelogininfo a {
text-decoration: underline;
color: #2c3e50;
font-family: arial;
font-size: 13px;
}
#pvelogininfo {
font-family: arial;
font-size: 13px;
background-color: #fff;
color: #2c3e50;
padding: 15px;
}
#pvelogininfo ul {
margin-bottom: 0;
}
#footer {
clear: both;
padding-top: 100px;
text-transform: none;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 15px;
font-weight: normal;
}
#footer > nav.navbar.navbar-inverse  {
min-height: 0;
}
#footer-copyright {
text-align: center;
color: #fff;
padding-top: 30px;
padding-bottom: 30px;
font-family: Arial;
font-size: 12px;
text-transform: initial;
}
#footer-copyright img {
padding-left: 10px;
padding-right: 10px;
}
#footerli01 {
margin-left: 150px;
}
#footer ul.nav.navbar-nav.navbar-left {
margin-top: 0;
}
#footer ul.nav.navbar-nav > li > a {
color: #ffffff;
background-color: transparent;
position: relative;
display: block;
padding-top: 0px;
padding-bottom: 0px;
padding-left: 0px;
padding-right: 0px;
font-size: 15px;
font-weight: normal;
text-transform: none;
}
#footer ul.nav.navbar-nav > li > a:before {
content: "/";
padding-left: 10px;
padding-right: 10px;
display: inline-block;
}
#footer ul.nav.navbar-nav.navbar-left > li:hover > a {
color: #fff;
text-decoration: underline;
}
#footer ul.nav.navbar-nav.navbar-left > li:hover > a:before {
color: #fff;
text-decoration: none !important;
}
#footer-editor {
text-align: right;
color: #ffffff;
}
@media (max-width: 1007px) {
#wrapper {
margin-top: 0px;
}
#boxlogin-wrapper {
width: 100%;
}
#header {
margin-top: 0px;
}
#pveuser {
font-size: 15px;
top: 10px;
}
#pveuser small {
font-size: 12px;
top: -2px;
}
#logo {
margin-left: 0px;
}
}
@media (max-width: 700px) {
#footerli01 {
margin-left: 0px;
}
#boxlogin .loginapp {
flex-direction: column;
justify-content: center;
align-items: center;
}
}
@media (max-width: 550px) {
#pvemenu {
font-size: 80%;
}
}
@media (max-width: 400px) {
#pvelink {
display: none;
}
#logo {
max-width: 46%;
height: auto;
}
#boxlogin-wrapper {
padding: 0 15px;
}
}
/* dispatcher error page */
.alert-danger {
background-color: #ff0000 !important;
border-color: #ff0000 !important;
color: #fff !important;
font-size: 15px;
}
.alert-danger a {
text-decoration: underline;
}
.alert-danger a:hover {
color: unset;
}
.alert {
padding: 15px !important;
margin-bottom: 21px !important;
border: 1px solid transparent !important;
border-radius: 0 !important;
}
.alert-danger p {
margin: 0 !important;
}
.footer-link {
text-decoration: none;
}
#loader {
display: -webkit-box;
display: -ms-flexbox;
display: none;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
position: absolute;
height: 120%;
width: 100%;
background-color: #efefef;
opacity: 0.9;
z-index: 10;
flex-flow: column;
align-items: center;
justify-content: center;
}
#nb-spinner {
width: 75px;
height: 75px;
margin: 0;
background: transparent;
border-top: 4px solid #1c856a;
border-right: 4px solid transparent;
border-radius: 50%;
-webkit-animation: 1s spin linear infinite;
animation: 1s spin linear infinite;
}
#loader-wrapper {
position: relative;
display: flex;
justify-content: center;
align-items: center;
height: 100%;
width: 100%;
}
#loader-content {
width: 300px;
height: 300px;
-webkit-box-flex: 0;
-ms-flex: 0 0 25%;
flex: 0 0 25%;
border: 1px solid rgba(255, 255, 255, 0.1);
-webkit-box-sizing: border-box;
box-sizing: border-box;
margin: 0;
position: relative;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
overflow: hidden;
position: absolute;
top: 200px;
display: flex;
flex-direction: column;
}
@keyframes spin {
from {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
to {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}

View File

@ -0,0 +1,6 @@
import './styles/theme.css'
import 'altcha';
import theme from './theme';
theme();

52
assets/theme.js Normal file
View File

@ -0,0 +1,52 @@
export default function theme() {
document.addEventListener("DOMContentLoaded", function() {
[].forEach.call(document.querySelectorAll('.language-change'), function(el) {
el.addEventListener('click', function(e) {
e.preventDefault();
var lang = el.getAttribute('data-lang');
if(getCookie('mselang') != lang) {
setCookie('mselang', lang, false);
location.reload();
}
return false;
})
});
// Empécher le double clic
const form = document.forms['login']
const loader = document.getElementById('loader');
form.addEventListener('submit', function(event) {
loader.style.display = 'flex';
});
});
function setCookie(name,value,days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days*24*60*60*1000));
expires = "; expires=" + date.toUTCString();
}
var temp = window.location.hostname.split('.').reverse();
var root_domain = '';
for(var i=temp.length - 1;i >= 0;i--){
root_domain += temp[i];
if(i > 0){
root_domain += '.';
}
}
document.cookie = name + "=" + (value || "") + expires + "; path=/; domain=" + root_domain;
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
}

755
composer.lock generated
View File

@ -150,29 +150,30 @@
}, },
{ {
"name": "doctrine/deprecations", "name": "doctrine/deprecations",
"version": "1.1.3", "version": "1.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/deprecations.git", "url": "https://github.com/doctrine/deprecations.git",
"reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
"reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.1 || ^8.0" "php": "^7.1 || ^8.0"
}, },
"conflict": {
"phpunit/phpunit": "<=7.5 || >=13"
},
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^9", "doctrine/coding-standard": "^9 || ^12 || ^13",
"phpstan/phpstan": "1.4.10 || 1.10.15", "phpstan/phpstan": "1.4.10 || 2.1.11",
"phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-phpunit": "^1.0 || ^2",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12",
"psalm/plugin-phpunit": "0.18.4", "psr/log": "^1 || ^2 || ^3"
"psr/log": "^1 || ^2 || ^3",
"vimeo/psalm": "4.30.0 || 5.12.0"
}, },
"suggest": { "suggest": {
"psr/log": "Allows logging deprecations via PSR-3 logger implementation" "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
@ -180,7 +181,7 @@
"type": "library", "type": "library",
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" "Doctrine\\Deprecations\\": "src"
} }
}, },
"notification-url": "https://packagist.org/downloads/", "notification-url": "https://packagist.org/downloads/",
@ -191,9 +192,9 @@
"homepage": "https://www.doctrine-project.org/", "homepage": "https://www.doctrine-project.org/",
"support": { "support": {
"issues": "https://github.com/doctrine/deprecations/issues", "issues": "https://github.com/doctrine/deprecations/issues",
"source": "https://github.com/doctrine/deprecations/tree/1.1.3" "source": "https://github.com/doctrine/deprecations/tree/1.1.5"
}, },
"time": "2024-01-30T19:34:25+00:00" "time": "2025-04-07T20:06:18+00:00"
}, },
{ {
"name": "doctrine/lexer", "name": "doctrine/lexer",
@ -275,16 +276,16 @@
}, },
{ {
"name": "guzzlehttp/promises", "name": "guzzlehttp/promises",
"version": "2.0.3", "version": "2.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/promises.git", "url": "https://github.com/guzzle/promises.git",
"reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", "url": "https://api.github.com/repos/guzzle/promises/zipball/7c69f28996b0a6920945dd20b3857e499d9ca96c",
"reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", "reference": "7c69f28996b0a6920945dd20b3857e499d9ca96c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -338,7 +339,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/promises/issues", "issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/2.0.3" "source": "https://github.com/guzzle/promises/tree/2.2.0"
}, },
"funding": [ "funding": [
{ {
@ -354,20 +355,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-07-18T10:29:17+00:00" "time": "2025-03-27T13:27:01+00:00"
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
"version": "2.7.0", "version": "2.7.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/psr7.git", "url": "https://github.com/guzzle/psr7.git",
"reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16",
"reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -454,7 +455,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/psr7/issues", "issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.7.0" "source": "https://github.com/guzzle/psr7/tree/2.7.1"
}, },
"funding": [ "funding": [
{ {
@ -470,7 +471,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-07-18T11:15:46+00:00" "time": "2025-03-27T12:30:47+00:00"
}, },
{ {
"name": "http-interop/http-factory-guzzle", "name": "http-interop/http-factory-guzzle",
@ -532,28 +533,29 @@
}, },
{ {
"name": "jean85/pretty-package-versions", "name": "jean85/pretty-package-versions",
"version": "2.0.6", "version": "2.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/Jean85/pretty-package-versions.git", "url": "https://github.com/Jean85/pretty-package-versions.git",
"reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4" "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4", "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a",
"reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4", "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"composer-runtime-api": "^2.0.0", "composer-runtime-api": "^2.1.0",
"php": "^7.1|^8.0" "php": "^7.4|^8.0"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^3.2", "friendsofphp/php-cs-fixer": "^3.2",
"jean85/composer-provided-replaced-stub-package": "^1.0", "jean85/composer-provided-replaced-stub-package": "^1.0",
"phpstan/phpstan": "^1.4", "phpstan/phpstan": "^2.0",
"phpunit/phpunit": "^7.5|^8.5|^9.4", "phpunit/phpunit": "^7.5|^8.5|^9.6",
"vimeo/psalm": "^4.3" "rector/rector": "^2.0",
"vimeo/psalm": "^4.3 || ^5.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -585,9 +587,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/Jean85/pretty-package-versions/issues", "issues": "https://github.com/Jean85/pretty-package-versions/issues",
"source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6" "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1"
}, },
"time": "2024-03-08T09:58:59+00:00" "time": "2025-03-19T14:43:43+00:00"
}, },
{ {
"name": "php-http/client-common", "name": "php-http/client-common",
@ -972,16 +974,16 @@
}, },
{ {
"name": "predis/predis", "name": "predis/predis",
"version": "v2.2.2", "version": "v2.3.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/predis/predis.git", "url": "https://github.com/predis/predis.git",
"reference": "b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1" "reference": "bac46bfdb78cd6e9c7926c697012aae740cb9ec9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/predis/predis/zipball/b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1", "url": "https://api.github.com/repos/predis/predis/zipball/bac46bfdb78cd6e9c7926c697012aae740cb9ec9",
"reference": "b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1", "reference": "bac46bfdb78cd6e9c7926c697012aae740cb9ec9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -990,7 +992,7 @@
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^3.3", "friendsofphp/php-cs-fixer": "^3.3",
"phpstan/phpstan": "^1.9", "phpstan/phpstan": "^1.9",
"phpunit/phpunit": "^8.0 || ~9.4.4" "phpunit/phpunit": "^8.0 || ^9.4"
}, },
"suggest": { "suggest": {
"ext-relay": "Faster connection with in-memory caching (>=0.6.2)" "ext-relay": "Faster connection with in-memory caching (>=0.6.2)"
@ -1021,7 +1023,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/predis/predis/issues", "issues": "https://github.com/predis/predis/issues",
"source": "https://github.com/predis/predis/tree/v2.2.2" "source": "https://github.com/predis/predis/tree/v2.3.0"
}, },
"funding": [ "funding": [
{ {
@ -1029,7 +1031,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-09-13T16:42:03+00:00" "time": "2024-11-21T20:00:02+00:00"
}, },
{ {
"name": "psr/cache", "name": "psr/cache",
@ -1652,9 +1654,9 @@
"type": "symfony-bundle", "type": "symfony-bundle",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"releases/3.2.x": "3.2.x-dev", "releases/1.x": "1.x-dev",
"releases/2.x": "2.x-dev", "releases/2.x": "2.x-dev",
"releases/1.x": "1.x-dev" "releases/3.2.x": "3.2.x-dev"
} }
}, },
"autoload": { "autoload": {
@ -1731,16 +1733,16 @@
}, },
{ {
"name": "symfony/asset", "name": "symfony/asset",
"version": "v5.4.40", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/asset.git", "url": "https://github.com/symfony/asset.git",
"reference": "e5aa241b4914257164b39c3c2678b2c41b7671e3" "reference": "b7a18eaff1d717c321b4f13403413f8815bf9cb0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/asset/zipball/e5aa241b4914257164b39c3c2678b2c41b7671e3", "url": "https://api.github.com/repos/symfony/asset/zipball/b7a18eaff1d717c321b4f13403413f8815bf9cb0",
"reference": "e5aa241b4914257164b39c3c2678b2c41b7671e3", "reference": "b7a18eaff1d717c321b4f13403413f8815bf9cb0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1785,7 +1787,7 @@
"description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/asset/tree/v5.4.40" "source": "https://github.com/symfony/asset/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -1801,20 +1803,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-31T14:33:22+00:00" "time": "2024-10-22T13:05:35+00:00"
}, },
{ {
"name": "symfony/cache", "name": "symfony/cache",
"version": "v5.4.44", "version": "v5.4.46",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/cache.git", "url": "https://github.com/symfony/cache.git",
"reference": "4b3e7bf157b8b5a010865701d9106b5f0a9c99a8" "reference": "0fe08ee32cec2748fbfea10c52d3ee02049e0f6b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/cache/zipball/4b3e7bf157b8b5a010865701d9106b5f0a9c99a8", "url": "https://api.github.com/repos/symfony/cache/zipball/0fe08ee32cec2748fbfea10c52d3ee02049e0f6b",
"reference": "4b3e7bf157b8b5a010865701d9106b5f0a9c99a8", "reference": "0fe08ee32cec2748fbfea10c52d3ee02049e0f6b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1882,7 +1884,7 @@
"psr6" "psr6"
], ],
"support": { "support": {
"source": "https://github.com/symfony/cache/tree/v5.4.44" "source": "https://github.com/symfony/cache/tree/v5.4.46"
}, },
"funding": [ "funding": [
{ {
@ -1898,20 +1900,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-13T16:57:39+00:00" "time": "2024-11-04T11:43:55+00:00"
}, },
{ {
"name": "symfony/cache-contracts", "name": "symfony/cache-contracts",
"version": "v2.5.3", "version": "v2.5.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/cache-contracts.git", "url": "https://github.com/symfony/cache-contracts.git",
"reference": "fee6db04d913094e2fb55ff8e7db5685a8134463" "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/cache-contracts/zipball/fee6db04d913094e2fb55ff8e7db5685a8134463", "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/517c3a3619dadfa6952c4651767fcadffb4df65e",
"reference": "fee6db04d913094e2fb55ff8e7db5685a8134463", "reference": "517c3a3619dadfa6952c4651767fcadffb4df65e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1923,12 +1925,12 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": { "branch-alias": {
"dev-main": "2.5-dev" "dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
} }
}, },
"autoload": { "autoload": {
@ -1961,7 +1963,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/cache-contracts/tree/v2.5.3" "source": "https://github.com/symfony/cache-contracts/tree/v2.5.4"
}, },
"funding": [ "funding": [
{ {
@ -1977,20 +1979,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-23T13:51:25+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/config", "name": "symfony/config",
"version": "v5.4.40", "version": "v5.4.46",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/config.git", "url": "https://github.com/symfony/config.git",
"reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e" "reference": "977c88a02d7d3f16904a81907531b19666a08e78"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/config/zipball/d4e1db78421163b98dd9971d247fd0df4a57ee5e", "url": "https://api.github.com/repos/symfony/config/zipball/977c88a02d7d3f16904a81907531b19666a08e78",
"reference": "d4e1db78421163b98dd9971d247fd0df4a57ee5e", "reference": "977c88a02d7d3f16904a81907531b19666a08e78",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2040,7 +2042,7 @@
"description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/config/tree/v5.4.40" "source": "https://github.com/symfony/config/tree/v5.4.46"
}, },
"funding": [ "funding": [
{ {
@ -2056,20 +2058,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-31T14:33:22+00:00" "time": "2024-10-30T07:58:02+00:00"
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v5.4.44", "version": "v5.4.47",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "5b5a0aa66e3296e303e22490f90f521551835a83" "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/5b5a0aa66e3296e303e22490f90f521551835a83", "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
"reference": "5b5a0aa66e3296e303e22490f90f521551835a83", "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2139,7 +2141,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v5.4.44" "source": "https://github.com/symfony/console/tree/v5.4.47"
}, },
"funding": [ "funding": [
{ {
@ -2155,20 +2157,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-20T07:56:40+00:00" "time": "2024-11-06T11:30:55+00:00"
}, },
{ {
"name": "symfony/dependency-injection", "name": "symfony/dependency-injection",
"version": "v5.4.44", "version": "v5.4.48",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/dependency-injection.git", "url": "https://github.com/symfony/dependency-injection.git",
"reference": "23eb9f3803a931aef16a65f362a9aeb0640a1374" "reference": "e5ca16dee39ef7d63e552ff0bf0a2526a1142c92"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/23eb9f3803a931aef16a65f362a9aeb0640a1374", "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/e5ca16dee39ef7d63e552ff0bf0a2526a1142c92",
"reference": "23eb9f3803a931aef16a65f362a9aeb0640a1374", "reference": "e5ca16dee39ef7d63e552ff0bf0a2526a1142c92",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2228,7 +2230,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application", "description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/dependency-injection/tree/v5.4.44" "source": "https://github.com/symfony/dependency-injection/tree/v5.4.48"
}, },
"funding": [ "funding": [
{ {
@ -2244,20 +2246,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-12T20:01:35+00:00" "time": "2024-11-20T10:51:57+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v3.5.0", "version": "v3.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
"reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2265,12 +2267,12 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": { "branch-alias": {
"dev-main": "3.5-dev" "dev-main": "3.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
} }
}, },
"autoload": { "autoload": {
@ -2295,7 +2297,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1"
}, },
"funding": [ "funding": [
{ {
@ -2311,20 +2313,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:32:20+00:00" "time": "2024-09-25T14:20:29+00:00"
}, },
{ {
"name": "symfony/dotenv", "name": "symfony/dotenv",
"version": "v5.4.44", "version": "v5.4.48",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/dotenv.git", "url": "https://github.com/symfony/dotenv.git",
"reference": "bb4fef2bf035a50170fd95e5b146152834126008" "reference": "08013403089c8a126c968179179b817a552841ab"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/dotenv/zipball/bb4fef2bf035a50170fd95e5b146152834126008", "url": "https://api.github.com/repos/symfony/dotenv/zipball/08013403089c8a126c968179179b817a552841ab",
"reference": "bb4fef2bf035a50170fd95e5b146152834126008", "reference": "08013403089c8a126c968179179b817a552841ab",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2366,7 +2368,7 @@
"environment" "environment"
], ],
"support": { "support": {
"source": "https://github.com/symfony/dotenv/tree/v5.4.44" "source": "https://github.com/symfony/dotenv/tree/v5.4.48"
}, },
"funding": [ "funding": [
{ {
@ -2382,20 +2384,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-16T09:39:25+00:00" "time": "2024-11-27T09:33:00+00:00"
}, },
{ {
"name": "symfony/error-handler", "name": "symfony/error-handler",
"version": "v5.4.42", "version": "v5.4.46",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/error-handler.git", "url": "https://github.com/symfony/error-handler.git",
"reference": "db15ba0fd50890156ed40087ccedc7851a1f5b76" "reference": "d19ede7a2cafb386be9486c580649d0f9e3d0363"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/db15ba0fd50890156ed40087ccedc7851a1f5b76", "url": "https://api.github.com/repos/symfony/error-handler/zipball/d19ede7a2cafb386be9486c580649d0f9e3d0363",
"reference": "db15ba0fd50890156ed40087ccedc7851a1f5b76", "reference": "d19ede7a2cafb386be9486c580649d0f9e3d0363",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2437,7 +2439,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code", "description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/error-handler/tree/v5.4.42" "source": "https://github.com/symfony/error-handler/tree/v5.4.46"
}, },
"funding": [ "funding": [
{ {
@ -2453,20 +2455,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-07-23T12:34:05+00:00" "time": "2024-11-05T14:17:06+00:00"
}, },
{ {
"name": "symfony/event-dispatcher", "name": "symfony/event-dispatcher",
"version": "v5.4.40", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/event-dispatcher.git", "url": "https://github.com/symfony/event-dispatcher.git",
"reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4" "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a54e2a8a114065f31020d6a89ede83e34c3b27a4", "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9",
"reference": "a54e2a8a114065f31020d6a89ede83e34c3b27a4", "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2522,7 +2524,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v5.4.40" "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -2538,20 +2540,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-31T14:33:22+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/event-dispatcher-contracts", "name": "symfony/event-dispatcher-contracts",
"version": "v3.5.0", "version": "v3.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git", "url": "https://github.com/symfony/event-dispatcher-contracts.git",
"reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f",
"reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2560,12 +2562,12 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": { "branch-alias": {
"dev-main": "3.5-dev" "dev-main": "3.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
} }
}, },
"autoload": { "autoload": {
@ -2598,7 +2600,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1"
}, },
"funding": [ "funding": [
{ {
@ -2614,20 +2616,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:32:20+00:00" "time": "2024-09-25T14:20:29+00:00"
}, },
{ {
"name": "symfony/expression-language", "name": "symfony/expression-language",
"version": "v5.4.43", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/expression-language.git", "url": "https://github.com/symfony/expression-language.git",
"reference": "9d23f7bfd1d602fddc6d6520decedc99739497dd" "reference": "a784b66edc4c151eb05076d04707906ee2c209a9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/expression-language/zipball/9d23f7bfd1d602fddc6d6520decedc99739497dd", "url": "https://api.github.com/repos/symfony/expression-language/zipball/a784b66edc4c151eb05076d04707906ee2c209a9",
"reference": "9d23f7bfd1d602fddc6d6520decedc99739497dd", "reference": "a784b66edc4c151eb05076d04707906ee2c209a9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2661,7 +2663,7 @@
"description": "Provides an engine that can compile and evaluate expressions", "description": "Provides an engine that can compile and evaluate expressions",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/expression-language/tree/v5.4.43" "source": "https://github.com/symfony/expression-language/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -2677,20 +2679,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-08-09T07:10:35+00:00" "time": "2024-10-04T14:55:40+00:00"
}, },
{ {
"name": "symfony/filesystem", "name": "symfony/filesystem",
"version": "v5.4.44", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/filesystem.git", "url": "https://github.com/symfony/filesystem.git",
"reference": "76c3818964e9d32be3862c9318ae3ba9aa280ddc" "reference": "57c8294ed37d4a055b77057827c67f9558c95c54"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/76c3818964e9d32be3862c9318ae3ba9aa280ddc", "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54",
"reference": "76c3818964e9d32be3862c9318ae3ba9aa280ddc", "reference": "57c8294ed37d4a055b77057827c67f9558c95c54",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2728,7 +2730,7 @@
"description": "Provides basic utilities for the filesystem", "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/filesystem/tree/v5.4.44" "source": "https://github.com/symfony/filesystem/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -2744,20 +2746,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-16T14:52:48+00:00" "time": "2024-10-22T13:05:35+00:00"
}, },
{ {
"name": "symfony/finder", "name": "symfony/finder",
"version": "v5.4.43", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/finder.git", "url": "https://github.com/symfony/finder.git",
"reference": "ae25a9145a900764158d439653d5630191155ca0" "reference": "63741784cd7b9967975eec610b256eed3ede022b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/ae25a9145a900764158d439653d5630191155ca0", "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b",
"reference": "ae25a9145a900764158d439653d5630191155ca0", "reference": "63741784cd7b9967975eec610b256eed3ede022b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2791,7 +2793,7 @@
"description": "Finds files and directories via an intuitive fluent interface", "description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/finder/tree/v5.4.43" "source": "https://github.com/symfony/finder/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -2807,20 +2809,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-08-13T14:03:51+00:00" "time": "2024-09-28T13:32:08+00:00"
}, },
{ {
"name": "symfony/flex", "name": "symfony/flex",
"version": "v2.4.7", "version": "v2.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/flex.git", "url": "https://github.com/symfony/flex.git",
"reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402" "reference": "8ce1acd9842abe0e9b4c4a0bd3f259859516c018"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/flex/zipball/92f4fba342161ff36072bd3b8e0b3c6c23160402", "url": "https://api.github.com/repos/symfony/flex/zipball/8ce1acd9842abe0e9b4c4a0bd3f259859516c018",
"reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402", "reference": "8ce1acd9842abe0e9b4c4a0bd3f259859516c018",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2859,7 +2861,7 @@
"description": "Composer plugin for Symfony", "description": "Composer plugin for Symfony",
"support": { "support": {
"issues": "https://github.com/symfony/flex/issues", "issues": "https://github.com/symfony/flex/issues",
"source": "https://github.com/symfony/flex/tree/v2.4.7" "source": "https://github.com/symfony/flex/tree/v2.5.0"
}, },
"funding": [ "funding": [
{ {
@ -2875,20 +2877,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-10-07T08:51:54+00:00" "time": "2025-03-03T07:50:46+00:00"
}, },
{ {
"name": "symfony/form", "name": "symfony/form",
"version": "v5.4.44", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/form.git", "url": "https://github.com/symfony/form.git",
"reference": "4f3d91f8a7626e3cab9e3d2952321df10013a6eb" "reference": "c1974a723cdee8a273cb49ce13fada5c1667706a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/form/zipball/4f3d91f8a7626e3cab9e3d2952321df10013a6eb", "url": "https://api.github.com/repos/symfony/form/zipball/c1974a723cdee8a273cb49ce13fada5c1667706a",
"reference": "4f3d91f8a7626e3cab9e3d2952321df10013a6eb", "reference": "c1974a723cdee8a273cb49ce13fada5c1667706a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2961,7 +2963,7 @@
"description": "Allows to easily create, process and reuse HTML forms", "description": "Allows to easily create, process and reuse HTML forms",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/form/tree/v5.4.44" "source": "https://github.com/symfony/form/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -2977,20 +2979,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-20T07:56:40+00:00" "time": "2024-10-08T07:27:17+00:00"
}, },
{ {
"name": "symfony/framework-bundle", "name": "symfony/framework-bundle",
"version": "v5.4.44", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/framework-bundle.git", "url": "https://github.com/symfony/framework-bundle.git",
"reference": "9ae1957fb817c0fec6d171931f675895a434d988" "reference": "3d70f14176422d4d8ee400b6acae4e21f7c25ca2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/9ae1957fb817c0fec6d171931f675895a434d988", "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/3d70f14176422d4d8ee400b6acae4e21f7c25ca2",
"reference": "9ae1957fb817c0fec6d171931f675895a434d988", "reference": "3d70f14176422d4d8ee400b6acae4e21f7c25ca2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3029,6 +3031,7 @@
"symfony/mime": "<4.4", "symfony/mime": "<4.4",
"symfony/property-access": "<5.3", "symfony/property-access": "<5.3",
"symfony/property-info": "<4.4", "symfony/property-info": "<4.4",
"symfony/runtime": "<5.4.45|>=6.0,<6.4.13|>=7.0,<7.1.6",
"symfony/security-csrf": "<5.3", "symfony/security-csrf": "<5.3",
"symfony/serializer": "<5.2", "symfony/serializer": "<5.2",
"symfony/service-contracts": ">=3.0", "symfony/service-contracts": ">=3.0",
@ -3111,7 +3114,7 @@
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/framework-bundle/tree/v5.4.44" "source": "https://github.com/symfony/framework-bundle/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -3127,27 +3130,27 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-20T08:11:35+00:00" "time": "2024-10-22T13:05:35+00:00"
}, },
{ {
"name": "symfony/http-client", "name": "symfony/http-client",
"version": "v5.4.44", "version": "v5.4.49",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-client.git", "url": "https://github.com/symfony/http-client.git",
"reference": "58d3dc6bfa5fb37137e32d52ddc202ba4d1cea04" "reference": "d77d8e212cde7b5c4a64142bf431522f19487c28"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-client/zipball/58d3dc6bfa5fb37137e32d52ddc202ba4d1cea04", "url": "https://api.github.com/repos/symfony/http-client/zipball/d77d8e212cde7b5c4a64142bf431522f19487c28",
"reference": "58d3dc6bfa5fb37137e32d52ddc202ba4d1cea04", "reference": "d77d8e212cde7b5c4a64142bf431522f19487c28",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.2.5", "php": ">=7.2.5",
"psr/log": "^1|^2|^3", "psr/log": "^1|^2|^3",
"symfony/deprecation-contracts": "^2.1|^3", "symfony/deprecation-contracts": "^2.1|^3",
"symfony/http-client-contracts": "^2.5.3", "symfony/http-client-contracts": "^2.5.4",
"symfony/polyfill-php73": "^1.11", "symfony/polyfill-php73": "^1.11",
"symfony/polyfill-php80": "^1.16", "symfony/polyfill-php80": "^1.16",
"symfony/service-contracts": "^1.0|^2|^3" "symfony/service-contracts": "^1.0|^2|^3"
@ -3202,7 +3205,7 @@
"http" "http"
], ],
"support": { "support": {
"source": "https://github.com/symfony/http-client/tree/v5.4.44" "source": "https://github.com/symfony/http-client/tree/v5.4.49"
}, },
"funding": [ "funding": [
{ {
@ -3218,20 +3221,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-16T14:04:28+00:00" "time": "2024-11-28T08:37:04+00:00"
}, },
{ {
"name": "symfony/http-client-contracts", "name": "symfony/http-client-contracts",
"version": "v2.5.3", "version": "v2.5.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-client-contracts.git", "url": "https://github.com/symfony/http-client-contracts.git",
"reference": "e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1" "reference": "48ef1d0a082885877b664332b9427662065a360c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1", "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/48ef1d0a082885877b664332b9427662065a360c",
"reference": "e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1", "reference": "48ef1d0a082885877b664332b9427662065a360c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3242,12 +3245,12 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": { "branch-alias": {
"dev-main": "2.5-dev" "dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
} }
}, },
"autoload": { "autoload": {
@ -3280,7 +3283,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/http-client-contracts/tree/v2.5.3" "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.5"
}, },
"funding": [ "funding": [
{ {
@ -3296,20 +3299,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-03-26T19:42:53+00:00" "time": "2024-11-28T08:37:04+00:00"
}, },
{ {
"name": "symfony/http-foundation", "name": "symfony/http-foundation",
"version": "v5.4.44", "version": "v5.4.48",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-foundation.git", "url": "https://github.com/symfony/http-foundation.git",
"reference": "ae0d217e5932aa0b70ddb4cf7822cc76d48aee53" "reference": "3f38b8af283b830e1363acd79e5bc3412d055341"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/ae0d217e5932aa0b70ddb4cf7822cc76d48aee53", "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3f38b8af283b830e1363acd79e5bc3412d055341",
"reference": "ae0d217e5932aa0b70ddb4cf7822cc76d48aee53", "reference": "3f38b8af283b830e1363acd79e5bc3412d055341",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3356,7 +3359,7 @@
"description": "Defines an object-oriented layer for the HTTP specification", "description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-foundation/tree/v5.4.44" "source": "https://github.com/symfony/http-foundation/tree/v5.4.48"
}, },
"funding": [ "funding": [
{ {
@ -3372,20 +3375,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-15T07:55:06+00:00" "time": "2024-11-13T18:58:02+00:00"
}, },
{ {
"name": "symfony/http-kernel", "name": "symfony/http-kernel",
"version": "v5.4.44", "version": "v5.4.48",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-kernel.git", "url": "https://github.com/symfony/http-kernel.git",
"reference": "788dcf72d9af7432a886aa3b0c5904d68087ba13" "reference": "c2dbfc92b851404567160d1ecf3fb7d9b7bde9b0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/788dcf72d9af7432a886aa3b0c5904d68087ba13", "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c2dbfc92b851404567160d1ecf3fb7d9b7bde9b0",
"reference": "788dcf72d9af7432a886aa3b0c5904d68087ba13", "reference": "c2dbfc92b851404567160d1ecf3fb7d9b7bde9b0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3469,7 +3472,7 @@
"description": "Provides a structured process for converting a Request into a Response", "description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-kernel/tree/v5.4.44" "source": "https://github.com/symfony/http-kernel/tree/v5.4.48"
}, },
"funding": [ "funding": [
{ {
@ -3485,20 +3488,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-21T05:47:58+00:00" "time": "2024-11-27T12:43:17+00:00"
}, },
{ {
"name": "symfony/lock", "name": "symfony/lock",
"version": "v5.4.40", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/lock.git", "url": "https://github.com/symfony/lock.git",
"reference": "d96955c9919fa8609b193ba76e9f527776b70176" "reference": "f85ebc5346a2f0e4f9e347e9154922a6d4665c65"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/lock/zipball/d96955c9919fa8609b193ba76e9f527776b70176", "url": "https://api.github.com/repos/symfony/lock/zipball/f85ebc5346a2f0e4f9e347e9154922a6d4665c65",
"reference": "d96955c9919fa8609b193ba76e9f527776b70176", "reference": "f85ebc5346a2f0e4f9e347e9154922a6d4665c65",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3548,7 +3551,7 @@
"semaphore" "semaphore"
], ],
"support": { "support": {
"source": "https://github.com/symfony/lock/tree/v5.4.40" "source": "https://github.com/symfony/lock/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -3564,20 +3567,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-31T14:33:22+00:00" "time": "2024-10-21T20:36:41+00:00"
}, },
{ {
"name": "symfony/options-resolver", "name": "symfony/options-resolver",
"version": "v5.4.40", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/options-resolver.git", "url": "https://github.com/symfony/options-resolver.git",
"reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4" "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/bd1afbde6613a8d6b956115e0e14b196191fd0c4", "url": "https://api.github.com/repos/symfony/options-resolver/zipball/74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6",
"reference": "bd1afbde6613a8d6b956115e0e14b196191fd0c4", "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3617,7 +3620,7 @@
"options" "options"
], ],
"support": { "support": {
"source": "https://github.com/symfony/options-resolver/tree/v5.4.40" "source": "https://github.com/symfony/options-resolver/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -3633,20 +3636,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-31T14:33:22+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/password-hasher", "name": "symfony/password-hasher",
"version": "v5.4.40", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/password-hasher.git", "url": "https://github.com/symfony/password-hasher.git",
"reference": "21b98178ab2024e6c7d8ab72cca9ba16015c6093" "reference": "6c5993b24505f98b90ca4896448012bbec54c7c8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/password-hasher/zipball/21b98178ab2024e6c7d8ab72cca9ba16015c6093", "url": "https://api.github.com/repos/symfony/password-hasher/zipball/6c5993b24505f98b90ca4896448012bbec54c7c8",
"reference": "21b98178ab2024e6c7d8ab72cca9ba16015c6093", "reference": "6c5993b24505f98b90ca4896448012bbec54c7c8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3691,7 +3694,7 @@
"password" "password"
], ],
"support": { "support": {
"source": "https://github.com/symfony/password-hasher/tree/v5.4.40" "source": "https://github.com/symfony/password-hasher/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -3707,7 +3710,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-31T14:33:22+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/polyfill-intl-grapheme", "name": "symfony/polyfill-intl-grapheme",
@ -3732,8 +3735,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -3810,8 +3813,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -3894,8 +3897,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -3978,8 +3981,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -4052,8 +4055,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -4128,8 +4131,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -4208,8 +4211,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -4266,16 +4269,16 @@
}, },
{ {
"name": "symfony/property-access", "name": "symfony/property-access",
"version": "v5.4.43", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/property-access.git", "url": "https://github.com/symfony/property-access.git",
"reference": "2d751866b976a02e22743359733edc55cd20e9fd" "reference": "111e7ed617509f1a9139686055d234aad6e388e0"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/property-access/zipball/2d751866b976a02e22743359733edc55cd20e9fd", "url": "https://api.github.com/repos/symfony/property-access/zipball/111e7ed617509f1a9139686055d234aad6e388e0",
"reference": "2d751866b976a02e22743359733edc55cd20e9fd", "reference": "111e7ed617509f1a9139686055d234aad6e388e0",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4327,7 +4330,7 @@
"reflection" "reflection"
], ],
"support": { "support": {
"source": "https://github.com/symfony/property-access/tree/v5.4.43" "source": "https://github.com/symfony/property-access/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -4343,20 +4346,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-08-29T08:50:14+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/property-info", "name": "symfony/property-info",
"version": "v5.4.42", "version": "v5.4.48",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/property-info.git", "url": "https://github.com/symfony/property-info.git",
"reference": "825aa937f6e8cd63dcc118d0af84d7d4979cddf4" "reference": "a0396295ad585f95fccd690bc6a281e5bd303902"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/property-info/zipball/825aa937f6e8cd63dcc118d0af84d7d4979cddf4", "url": "https://api.github.com/repos/symfony/property-info/zipball/a0396295ad585f95fccd690bc6a281e5bd303902",
"reference": "825aa937f6e8cd63dcc118d0af84d7d4979cddf4", "reference": "a0396295ad585f95fccd690bc6a281e5bd303902",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4373,7 +4376,7 @@
"require-dev": { "require-dev": {
"doctrine/annotations": "^1.10.4|^2", "doctrine/annotations": "^1.10.4|^2",
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
"phpstan/phpdoc-parser": "^1.0", "phpstan/phpdoc-parser": "^1.0|^2.0",
"symfony/cache": "^4.4|^5.0|^6.0", "symfony/cache": "^4.4|^5.0|^6.0",
"symfony/dependency-injection": "^4.4|^5.0|^6.0", "symfony/dependency-injection": "^4.4|^5.0|^6.0",
"symfony/serializer": "^4.4|^5.0|^6.0" "symfony/serializer": "^4.4|^5.0|^6.0"
@ -4418,7 +4421,7 @@
"validator" "validator"
], ],
"support": { "support": {
"source": "https://github.com/symfony/property-info/tree/v5.4.42" "source": "https://github.com/symfony/property-info/tree/v5.4.48"
}, },
"funding": [ "funding": [
{ {
@ -4434,7 +4437,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-07-22T18:03:36+00:00" "time": "2024-11-25T16:14:41+00:00"
}, },
{ {
"name": "symfony/psr-http-message-bridge", "name": "symfony/psr-http-message-bridge",
@ -4527,16 +4530,16 @@
}, },
{ {
"name": "symfony/rate-limiter", "name": "symfony/rate-limiter",
"version": "v5.4.40", "version": "v5.4.47",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/rate-limiter.git", "url": "https://github.com/symfony/rate-limiter.git",
"reference": "b3de902fc83923b9121169ade2453c41d0819110" "reference": "c902bf796ca6c9656c3cc8185b53afb9acbb7c72"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/rate-limiter/zipball/b3de902fc83923b9121169ade2453c41d0819110", "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/c902bf796ca6c9656c3cc8185b53afb9acbb7c72",
"reference": "b3de902fc83923b9121169ade2453c41d0819110", "reference": "c902bf796ca6c9656c3cc8185b53afb9acbb7c72",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4577,7 +4580,7 @@
"rate-limiter" "rate-limiter"
], ],
"support": { "support": {
"source": "https://github.com/symfony/rate-limiter/tree/v5.4.40" "source": "https://github.com/symfony/rate-limiter/tree/v5.4.47"
}, },
"funding": [ "funding": [
{ {
@ -4593,20 +4596,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-31T14:33:22+00:00" "time": "2024-11-07T11:51:21+00:00"
}, },
{ {
"name": "symfony/routing", "name": "symfony/routing",
"version": "v5.4.43", "version": "v5.4.48",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/routing.git", "url": "https://github.com/symfony/routing.git",
"reference": "b6f71780bbdd5e93e1c5638671cf0ba42aa8c6d8" "reference": "dd08c19879a9b37ff14fd30dcbdf99a4cf045db1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/routing/zipball/b6f71780bbdd5e93e1c5638671cf0ba42aa8c6d8", "url": "https://api.github.com/repos/symfony/routing/zipball/dd08c19879a9b37ff14fd30dcbdf99a4cf045db1",
"reference": "b6f71780bbdd5e93e1c5638671cf0ba42aa8c6d8", "reference": "dd08c19879a9b37ff14fd30dcbdf99a4cf045db1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4667,7 +4670,7 @@
"url" "url"
], ],
"support": { "support": {
"source": "https://github.com/symfony/routing/tree/v5.4.43" "source": "https://github.com/symfony/routing/tree/v5.4.48"
}, },
"funding": [ "funding": [
{ {
@ -4683,20 +4686,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-08-27T06:36:52+00:00" "time": "2024-11-12T18:20:21+00:00"
}, },
{ {
"name": "symfony/runtime", "name": "symfony/runtime",
"version": "v5.4.40", "version": "v5.4.46",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/runtime.git", "url": "https://github.com/symfony/runtime.git",
"reference": "50096d4ebebb4f9c41b87695868a6e34bdbf7cde" "reference": "242b4d773c004fa258e1b412f3f49fc2ac78353a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/runtime/zipball/50096d4ebebb4f9c41b87695868a6e34bdbf7cde", "url": "https://api.github.com/repos/symfony/runtime/zipball/242b4d773c004fa258e1b412f3f49fc2ac78353a",
"reference": "50096d4ebebb4f9c41b87695868a6e34bdbf7cde", "reference": "242b4d773c004fa258e1b412f3f49fc2ac78353a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4747,7 +4750,7 @@
"runtime" "runtime"
], ],
"support": { "support": {
"source": "https://github.com/symfony/runtime/tree/v5.4.40" "source": "https://github.com/symfony/runtime/tree/v5.4.46"
}, },
"funding": [ "funding": [
{ {
@ -4763,20 +4766,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-31T14:33:22+00:00" "time": "2024-11-06T08:58:41+00:00"
}, },
{ {
"name": "symfony/security-bundle", "name": "symfony/security-bundle",
"version": "v5.4.43", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-bundle.git", "url": "https://github.com/symfony/security-bundle.git",
"reference": "f14a15c6c7bb37879d59c129d96c4c07c7d5db32" "reference": "d6081d1b9118f944df90bb77444a8617eba01542"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-bundle/zipball/f14a15c6c7bb37879d59c129d96c4c07c7d5db32", "url": "https://api.github.com/repos/symfony/security-bundle/zipball/d6081d1b9118f944df90bb77444a8617eba01542",
"reference": "f14a15c6c7bb37879d59c129d96c4c07c7d5db32", "reference": "d6081d1b9118f944df90bb77444a8617eba01542",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4850,7 +4853,7 @@
"description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "description": "Provides a tight integration of the Security component into the Symfony full-stack framework",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-bundle/tree/v5.4.43" "source": "https://github.com/symfony/security-bundle/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -4866,20 +4869,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-08-19T09:13:19+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/security-core", "name": "symfony/security-core",
"version": "v5.4.44", "version": "v5.4.48",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-core.git", "url": "https://github.com/symfony/security-core.git",
"reference": "8089509e8c92e884fa27af56596576320c3b310d" "reference": "cca947b1a74bdbc21c4d6288a4abb938d9a7eaba"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-core/zipball/8089509e8c92e884fa27af56596576320c3b310d", "url": "https://api.github.com/repos/symfony/security-core/zipball/cca947b1a74bdbc21c4d6288a4abb938d9a7eaba",
"reference": "8089509e8c92e884fa27af56596576320c3b310d", "reference": "cca947b1a74bdbc21c4d6288a4abb938d9a7eaba",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4944,7 +4947,7 @@
"description": "Symfony Security Component - Core Library", "description": "Symfony Security Component - Core Library",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-core/tree/v5.4.44" "source": "https://github.com/symfony/security-core/tree/v5.4.48"
}, },
"funding": [ "funding": [
{ {
@ -4960,20 +4963,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-01T10:41:54+00:00" "time": "2024-11-27T08:58:20+00:00"
}, },
{ {
"name": "symfony/security-csrf", "name": "symfony/security-csrf",
"version": "v5.4.40", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-csrf.git", "url": "https://github.com/symfony/security-csrf.git",
"reference": "9058d522c1c33d7ba13f4b3c79555cc2c4c16028" "reference": "28dcafc3220f12264bb2aabe2389a2163458c1f4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-csrf/zipball/9058d522c1c33d7ba13f4b3c79555cc2c4c16028", "url": "https://api.github.com/repos/symfony/security-csrf/zipball/28dcafc3220f12264bb2aabe2389a2163458c1f4",
"reference": "9058d522c1c33d7ba13f4b3c79555cc2c4c16028", "reference": "28dcafc3220f12264bb2aabe2389a2163458c1f4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5017,7 +5020,7 @@
"description": "Symfony Security Component - CSRF Library", "description": "Symfony Security Component - CSRF Library",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-csrf/tree/v5.4.40" "source": "https://github.com/symfony/security-csrf/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -5033,20 +5036,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-31T14:33:22+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/security-guard", "name": "symfony/security-guard",
"version": "v5.4.40", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-guard.git", "url": "https://github.com/symfony/security-guard.git",
"reference": "d930fd327c290f451c9d8dd7889169195d4484e9" "reference": "f3da3dbec38aaedaf287ffeb4e3a90994af37faa"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-guard/zipball/d930fd327c290f451c9d8dd7889169195d4484e9", "url": "https://api.github.com/repos/symfony/security-guard/zipball/f3da3dbec38aaedaf287ffeb4e3a90994af37faa",
"reference": "d930fd327c290f451c9d8dd7889169195d4484e9", "reference": "f3da3dbec38aaedaf287ffeb4e3a90994af37faa",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5085,7 +5088,7 @@
"description": "Symfony Security Component - Guard", "description": "Symfony Security Component - Guard",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-guard/tree/v5.4.40" "source": "https://github.com/symfony/security-guard/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -5101,20 +5104,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-31T14:33:22+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/security-http", "name": "symfony/security-http",
"version": "v5.4.44", "version": "v5.4.47",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/security-http.git", "url": "https://github.com/symfony/security-http.git",
"reference": "c0f81598425c170807f19b9a5413ad05323f317b" "reference": "cde02b002e0447075430e6a84482e38f2fd9268d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/security-http/zipball/c0f81598425c170807f19b9a5413ad05323f317b", "url": "https://api.github.com/repos/symfony/security-http/zipball/cde02b002e0447075430e6a84482e38f2fd9268d",
"reference": "c0f81598425c170807f19b9a5413ad05323f317b", "reference": "cde02b002e0447075430e6a84482e38f2fd9268d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5171,7 +5174,7 @@
"description": "Symfony Security Component - HTTP Integration", "description": "Symfony Security Component - HTTP Integration",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/security-http/tree/v5.4.44" "source": "https://github.com/symfony/security-http/tree/v5.4.47"
}, },
"funding": [ "funding": [
{ {
@ -5187,20 +5190,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-11T06:50:28+00:00" "time": "2024-11-07T14:12:41+00:00"
}, },
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",
"version": "v2.5.3", "version": "v2.5.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/service-contracts.git", "url": "https://github.com/symfony/service-contracts.git",
"reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3" "reference": "f37b419f7aea2e9abf10abd261832cace12e3300"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/a2329596ddc8fd568900e3fc76cba42489ecc7f3", "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300",
"reference": "a2329596ddc8fd568900e3fc76cba42489ecc7f3", "reference": "f37b419f7aea2e9abf10abd261832cace12e3300",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5216,12 +5219,12 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": { "branch-alias": {
"dev-main": "2.5-dev" "dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
} }
}, },
"autoload": { "autoload": {
@ -5254,7 +5257,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/service-contracts/tree/v2.5.3" "source": "https://github.com/symfony/service-contracts/tree/v2.5.4"
}, },
"funding": [ "funding": [
{ {
@ -5270,20 +5273,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-04-21T15:04:16+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v5.4.44", "version": "v5.4.47",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "832caa16b6d9aac6bf11747315225f5aba384c24" "reference": "136ca7d72f72b599f2631aca474a4f8e26719799"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/832caa16b6d9aac6bf11747315225f5aba384c24", "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799",
"reference": "832caa16b6d9aac6bf11747315225f5aba384c24", "reference": "136ca7d72f72b599f2631aca474a4f8e26719799",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5340,7 +5343,7 @@
"utf8" "utf8"
], ],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v5.4.44" "source": "https://github.com/symfony/string/tree/v5.4.47"
}, },
"funding": [ "funding": [
{ {
@ -5356,20 +5359,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-20T07:56:40+00:00" "time": "2024-11-10T20:33:58+00:00"
}, },
{ {
"name": "symfony/translation", "name": "symfony/translation",
"version": "v5.4.44", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/translation.git", "url": "https://github.com/symfony/translation.git",
"reference": "6fed3a20b5b87ee9cdd9dacf545922b8fd475921" "reference": "98f26acc99341ca4bab345fb14d7b1d7cb825bed"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/6fed3a20b5b87ee9cdd9dacf545922b8fd475921", "url": "https://api.github.com/repos/symfony/translation/zipball/98f26acc99341ca4bab345fb14d7b1d7cb825bed",
"reference": "6fed3a20b5b87ee9cdd9dacf545922b8fd475921", "reference": "98f26acc99341ca4bab345fb14d7b1d7cb825bed",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5437,7 +5440,7 @@
"description": "Provides tools to internationalize your application", "description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/translation/tree/v5.4.44" "source": "https://github.com/symfony/translation/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -5453,20 +5456,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-15T08:12:35+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/translation-contracts", "name": "symfony/translation-contracts",
"version": "v2.5.3", "version": "v2.5.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/translation-contracts.git", "url": "https://github.com/symfony/translation-contracts.git",
"reference": "b0073a77ac0b7ea55131020e87b1e3af540f4664" "reference": "450d4172653f38818657022252f9d81be89ee9a8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b0073a77ac0b7ea55131020e87b1e3af540f4664", "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/450d4172653f38818657022252f9d81be89ee9a8",
"reference": "b0073a77ac0b7ea55131020e87b1e3af540f4664", "reference": "450d4172653f38818657022252f9d81be89ee9a8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5477,12 +5480,12 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": { "branch-alias": {
"dev-main": "2.5-dev" "dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
} }
}, },
"autoload": { "autoload": {
@ -5515,7 +5518,7 @@
"standards" "standards"
], ],
"support": { "support": {
"source": "https://github.com/symfony/translation-contracts/tree/v2.5.3" "source": "https://github.com/symfony/translation-contracts/tree/v2.5.4"
}, },
"funding": [ "funding": [
{ {
@ -5531,20 +5534,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-23T13:51:25+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/twig-bridge", "name": "symfony/twig-bridge",
"version": "v5.4.44", "version": "v5.4.48",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/twig-bridge.git", "url": "https://github.com/symfony/twig-bridge.git",
"reference": "d049fbe0e5ba0ad758f647fa8f99e840bca43f6f" "reference": "853a0c9aa40123a9feeb335c865b659d94e49e5d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d049fbe0e5ba0ad758f647fa8f99e840bca43f6f", "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/853a0c9aa40123a9feeb335c865b659d94e49e5d",
"reference": "d049fbe0e5ba0ad758f647fa8f99e840bca43f6f", "reference": "853a0c9aa40123a9feeb335c865b659d94e49e5d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5636,7 +5639,7 @@
"description": "Provides integration for Twig with various Symfony components", "description": "Provides integration for Twig with various Symfony components",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/twig-bridge/tree/v5.4.44" "source": "https://github.com/symfony/twig-bridge/tree/v5.4.48"
}, },
"funding": [ "funding": [
{ {
@ -5652,20 +5655,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-11T13:27:43+00:00" "time": "2024-11-22T08:19:51+00:00"
}, },
{ {
"name": "symfony/twig-bundle", "name": "symfony/twig-bundle",
"version": "v5.4.44", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/twig-bundle.git", "url": "https://github.com/symfony/twig-bundle.git",
"reference": "b94414b3b9e0c523677c0bf31e8975231b55f18a" "reference": "e1ca56e1dc7791eb19f0aff71d3d94e6a91cc8f9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/twig-bundle/zipball/b94414b3b9e0c523677c0bf31e8975231b55f18a", "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/e1ca56e1dc7791eb19f0aff71d3d94e6a91cc8f9",
"reference": "b94414b3b9e0c523677c0bf31e8975231b55f18a", "reference": "e1ca56e1dc7791eb19f0aff71d3d94e6a91cc8f9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5726,7 +5729,7 @@
"description": "Provides a tight integration of Twig into the Symfony full-stack framework", "description": "Provides a tight integration of Twig into the Symfony full-stack framework",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/twig-bundle/tree/v5.4.44" "source": "https://github.com/symfony/twig-bundle/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -5742,20 +5745,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-07T13:25:07+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/validator", "name": "symfony/validator",
"version": "v5.4.44", "version": "v5.4.48",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/validator.git", "url": "https://github.com/symfony/validator.git",
"reference": "5b061420daf15b58e1599cd2191b0780ddcd2157" "reference": "883667679d93d6c30f1b7490d669801712d3be2f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/validator/zipball/5b061420daf15b58e1599cd2191b0780ddcd2157", "url": "https://api.github.com/repos/symfony/validator/zipball/883667679d93d6c30f1b7490d669801712d3be2f",
"reference": "5b061420daf15b58e1599cd2191b0780ddcd2157", "reference": "883667679d93d6c30f1b7490d669801712d3be2f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5839,7 +5842,7 @@
"description": "Provides tools to validate values", "description": "Provides tools to validate values",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/validator/tree/v5.4.44" "source": "https://github.com/symfony/validator/tree/v5.4.48"
}, },
"funding": [ "funding": [
{ {
@ -5855,20 +5858,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-19T08:27:53+00:00" "time": "2024-11-27T08:58:20+00:00"
}, },
{ {
"name": "symfony/var-dumper", "name": "symfony/var-dumper",
"version": "v5.4.43", "version": "v5.4.48",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/var-dumper.git", "url": "https://github.com/symfony/var-dumper.git",
"reference": "6be6a6a8af4818564e3726fc65cf936f34743cef" "reference": "42f18f170aa86d612c3559cfb3bd11a375df32c8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/6be6a6a8af4818564e3726fc65cf936f34743cef", "url": "https://api.github.com/repos/symfony/var-dumper/zipball/42f18f170aa86d612c3559cfb3bd11a375df32c8",
"reference": "6be6a6a8af4818564e3726fc65cf936f34743cef", "reference": "42f18f170aa86d612c3559cfb3bd11a375df32c8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5928,7 +5931,7 @@
"dump" "dump"
], ],
"support": { "support": {
"source": "https://github.com/symfony/var-dumper/tree/v5.4.43" "source": "https://github.com/symfony/var-dumper/tree/v5.4.48"
}, },
"funding": [ "funding": [
{ {
@ -5944,20 +5947,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-08-30T16:01:46+00:00" "time": "2024-11-08T15:21:10+00:00"
}, },
{ {
"name": "symfony/var-exporter", "name": "symfony/var-exporter",
"version": "v6.4.9", "version": "v6.4.20",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/var-exporter.git", "url": "https://github.com/symfony/var-exporter.git",
"reference": "f9a060622e0d93777b7f8687ec4860191e16802e" "reference": "998df255e9e6a15a36ae35e9c6cd818c17cf92a2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9a060622e0d93777b7f8687ec4860191e16802e", "url": "https://api.github.com/repos/symfony/var-exporter/zipball/998df255e9e6a15a36ae35e9c6cd818c17cf92a2",
"reference": "f9a060622e0d93777b7f8687ec4860191e16802e", "reference": "998df255e9e6a15a36ae35e9c6cd818c17cf92a2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6005,7 +6008,7 @@
"serialize" "serialize"
], ],
"support": { "support": {
"source": "https://github.com/symfony/var-exporter/tree/v6.4.9" "source": "https://github.com/symfony/var-exporter/tree/v6.4.20"
}, },
"funding": [ "funding": [
{ {
@ -6021,20 +6024,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-06-24T15:53:56+00:00" "time": "2025-03-13T09:55:08+00:00"
}, },
{ {
"name": "symfony/web-profiler-bundle", "name": "symfony/web-profiler-bundle",
"version": "v5.4.43", "version": "v5.4.48",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/web-profiler-bundle.git", "url": "https://github.com/symfony/web-profiler-bundle.git",
"reference": "8f1628f1361e4623a6c2b373c3594845d6aacb79" "reference": "4afb0399456b966be92410d2bbd6146cc3ce2174"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/8f1628f1361e4623a6c2b373c3594845d6aacb79", "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/4afb0399456b966be92410d2bbd6146cc3ce2174",
"reference": "8f1628f1361e4623a6c2b373c3594845d6aacb79", "reference": "4afb0399456b966be92410d2bbd6146cc3ce2174",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6085,7 +6088,7 @@
"description": "Provides a development tool that gives detailed information about the execution of any request", "description": "Provides a development tool that gives detailed information about the execution of any request",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.43" "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.48"
}, },
"funding": [ "funding": [
{ {
@ -6101,7 +6104,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-08-08T09:11:47+00:00" "time": "2024-11-19T09:26:40+00:00"
}, },
{ {
"name": "symfony/webpack-encore-bundle", "name": "symfony/webpack-encore-bundle",
@ -6136,8 +6139,8 @@
"type": "symfony-bundle", "type": "symfony-bundle",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/webpack-encore", "url": "https://github.com/symfony/webpack-encore",
"url": "https://github.com/symfony/webpack-encore" "name": "symfony/webpack-encore"
} }
}, },
"autoload": { "autoload": {
@ -6178,16 +6181,16 @@
}, },
{ {
"name": "symfony/yaml", "name": "symfony/yaml",
"version": "v5.4.44", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/yaml.git", "url": "https://github.com/symfony/yaml.git",
"reference": "7025b964f123bbf1896d7563db6ec7f1f63e918a" "reference": "a454d47278cc16a5db371fe73ae66a78a633371e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/7025b964f123bbf1896d7563db6ec7f1f63e918a", "url": "https://api.github.com/repos/symfony/yaml/zipball/a454d47278cc16a5db371fe73ae66a78a633371e",
"reference": "7025b964f123bbf1896d7563db6ec7f1f63e918a", "reference": "a454d47278cc16a5db371fe73ae66a78a633371e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6233,7 +6236,7 @@
"description": "Loads and dumps YAML files", "description": "Loads and dumps YAML files",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/yaml/tree/v5.4.44" "source": "https://github.com/symfony/yaml/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -6249,30 +6252,30 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-16T14:36:56+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "twig/twig", "name": "twig/twig",
"version": "v3.14.0", "version": "v3.20.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/twigphp/Twig.git", "url": "https://github.com/twigphp/Twig.git",
"reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72" "reference": "3468920399451a384bef53cf7996965f7cd40183"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/126b2c97818dbff0cdf3fbfc881aedb3d40aae72", "url": "https://api.github.com/repos/twigphp/Twig/zipball/3468920399451a384bef53cf7996965f7cd40183",
"reference": "126b2c97818dbff0cdf3fbfc881aedb3d40aae72", "reference": "3468920399451a384bef53cf7996965f7cd40183",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.0.2", "php": ">=8.1.0",
"symfony/deprecation-contracts": "^2.5|^3", "symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-ctype": "^1.8", "symfony/polyfill-ctype": "^1.8",
"symfony/polyfill-mbstring": "^1.3", "symfony/polyfill-mbstring": "^1.3"
"symfony/polyfill-php81": "^1.29"
}, },
"require-dev": { "require-dev": {
"phpstan/phpstan": "^2.0",
"psr/container": "^1.0|^2.0", "psr/container": "^1.0|^2.0",
"symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0"
}, },
@ -6316,7 +6319,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/twigphp/Twig/issues", "issues": "https://github.com/twigphp/Twig/issues",
"source": "https://github.com/twigphp/Twig/tree/v3.14.0" "source": "https://github.com/twigphp/Twig/tree/v3.20.0"
}, },
"funding": [ "funding": [
{ {
@ -6328,22 +6331,22 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-09-09T17:55:12+00:00" "time": "2025-02-13T08:34:43+00:00"
} }
], ],
"packages-dev": [ "packages-dev": [
{ {
"name": "symfony/debug-bundle", "name": "symfony/debug-bundle",
"version": "v5.4.40", "version": "v5.4.45",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/debug-bundle.git", "url": "https://github.com/symfony/debug-bundle.git",
"reference": "177f79296705823eee0d7dd79773f3a9df884fe0" "reference": "653c7629d036ef24ac5de54a157aecdc400d2570"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/debug-bundle/zipball/177f79296705823eee0d7dd79773f3a9df884fe0", "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/653c7629d036ef24ac5de54a157aecdc400d2570",
"reference": "177f79296705823eee0d7dd79773f3a9df884fe0", "reference": "653c7629d036ef24ac5de54a157aecdc400d2570",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6393,7 +6396,7 @@
"description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "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", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/debug-bundle/tree/v5.4.40" "source": "https://github.com/symfony/debug-bundle/tree/v5.4.45"
}, },
"funding": [ "funding": [
{ {
@ -6409,12 +6412,12 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-05-31T14:33:22+00:00" "time": "2024-09-25T14:11:13+00:00"
} }
], ],
"aliases": [], "aliases": [],
"minimum-stability": "stable", "minimum-stability": "stable",
"stability-flags": [], "stability-flags": {},
"prefer-stable": true, "prefer-stable": true,
"prefer-lowest": false, "prefer-lowest": false,
"platform": { "platform": {
@ -6422,6 +6425,6 @@
"ext-ctype": "*", "ext-ctype": "*",
"ext-iconv": "*" "ext-iconv": "*"
}, },
"platform-dev": [], "platform-dev": {},
"plugin-api-version": "2.3.0" "plugin-api-version": "2.6.0"
} }

View File

@ -5,6 +5,7 @@ twig:
default_path: "%kernel.project_dir%/templates" default_path: "%kernel.project_dir%/templates"
form_themes: form_themes:
- "bootstrap_5_layout.html.twig" - "bootstrap_5_layout.html.twig"
- "altcha.html.twig"
when@test: when@test:
twig: twig:
strict_variables: true strict_variables: true

View File

@ -2,6 +2,10 @@ controllers:
resource: ../../src/Controller/ resource: ../../src/Controller/
type: annotation type: annotation
controllers_flag:
resource: ../../src/Flag/Controller/
type: annotation
kernel: kernel:
resource: ../../src/Kernel.php resource: ../../src/Kernel.php
type: annotation type: annotation

View File

@ -75,3 +75,23 @@ services:
$securityPattern: '%security_pattern%' $securityPattern: '%security_pattern%'
# add more service definitions when explicit configuration is needed # add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones # 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

@ -21,6 +21,8 @@ services:
- /tmp - /tmp
links: links:
- hydra - hydra
depends_on:
- redis
extra_hosts: extra_hosts:
- "localhost:127.0.0.1" - "localhost:127.0.0.1"
- "localhost:host-gateway" - "localhost:host-gateway"
@ -134,6 +136,11 @@ services:
- TZ=Europe/Paris - TZ=Europe/Paris
volumes: volumes:
- /etc/localtime:/etc/localtime:ro - /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: volumes:
postgres: postgres:
mariadb: mariadb:

6972
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -2,13 +2,12 @@
"devDependencies": { "devDependencies": {
"@babel/core": "^7.17.0", "@babel/core": "^7.17.0",
"@babel/preset-env": "^7.16.0", "@babel/preset-env": "^7.16.0",
"@hotwired/stimulus": "^3.0.0",
"@symfony/stimulus-bridge": "^3.2.0",
"@symfony/webpack-encore": "^4.1.2", "@symfony/webpack-encore": "^4.1.2",
"core-js": "^3.23.0", "core-js": "^3.23.0",
"regenerator-runtime": "^0.13.9", "regenerator-runtime": "^0.13.9",
"webpack": "^5.91.0", "webpack": "^5.94.0",
"webpack-cli": "^4.10.0", "webpack-cli": "^4.10.0",
"file-loader": "^6.2.0",
"webpack-notifier": "^1.15.0" "webpack-notifier": "^1.15.0"
}, },
"license": "UNLICENSED", "license": "UNLICENSED",
@ -26,6 +25,7 @@
"jquery": "^3.6.1", "jquery": "^3.6.1",
"postcss-loader": "^7.0.2", "postcss-loader": "^7.0.2",
"sass": "^1.56.2", "sass": "^1.56.2",
"sass-loader": "^13.2.0" "sass-loader": "^13.2.0",
"altcha": "^1.0.0"
} }
} }

File diff suppressed because one or more lines are too long

View File

@ -1,30 +0,0 @@
/*!
* Bootstrap v5.2.3 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
/*!
* Sizzle CSS Selector Engine v2.3.9
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2022-12-19
*/
/*!
* jQuery JavaScript Library v3.6.3
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2022-12-20T21:28Z
*/

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(self.webpackChunk=self.webpackChunk||[]).push([[143],{4180:(t,e,r)=>{var n={"./hello_controller.js":4695};function o(t){var e=i(t);return r(e)}function i(t){if(!r.o(n,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return n[t]}o.keys=function(){return Object.keys(n)},o.resolve=i,t.exports=o,o.id=4180},8205:(t,e,r)=>{"use strict";r.d(e,{Z:()=>n});const n={}},4695:(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>s});r(8304),r(4812),r(489),r(1539),r(2419),r(8011),r(9070),r(6649),r(6078),r(2526),r(1817),r(9653),r(2165),r(6992),r(8783),r(3948);function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){for(var r=0;r<e.length;r++){var o=e[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,(i=o.key,u=void 0,u=function(t,e){if("object"!==n(t)||null===t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var o=r.call(t,e||"default");if("object"!==n(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(i,"string"),"symbol"===n(u)?u:String(u)),o)}var i,u}function u(t,e){return u=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},u(t,e)}function c(t){var e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}();return function(){var r,n=l(t);if(e){var o=l(this).constructor;r=Reflect.construct(n,arguments,o)}else r=n.apply(this,arguments);return f(this,r)}}function f(t,e){if(e&&("object"===n(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}function l(t){return l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},l(t)}var s=function(t){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&u(t,e)}(l,t);var e,r,n,f=c(l);function l(){return o(this,l),f.apply(this,arguments)}return e=l,(r=[{key:"connect",value:function(){this.element.textContent="Hello Stimulus! Edit me in assets/controllers/hello_controller.js"}}])&&i(e.prototype,r),n&&i(e,n),Object.defineProperty(e,"prototype",{writable:!1}),l}(r(6599).Qr)},9437:(t,e,r)=>{"use strict";(0,r(2192).x)(r(4180))}},t=>{t.O(0,[3],(()=>{return e=9437,t(t.s=e);var e}));t.O()}]); "use strict";(self.webpackChunk=self.webpackChunk||[]).push([[524],{28:(e,s,u)=>{u(953)}},e=>{e.O(0,[953],(()=>{return s=28,e(e.s=s);var s}));e.O()}]);

View File

@ -1 +1 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[113],{9218:()=>{}},s=>{var e;e=9218,s(s.s=e)}]); "use strict";(self.webpackChunk=self.webpackChunk||[]).push([[505],{843:()=>{}},s=>{var e;e=843,s(s.s=e)}]);

View File

@ -1 +1 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[144],{2576:(e,s,u)=>{u(3138)}},e=>{e.O(0,[138],(()=>{return s=2576,e(e.s=s);var s}));e.O()}]); "use strict";(self.webpackChunk=self.webpackChunk||[]).push([[513],{675:(e,s,u)=>{u(336)}},e=>{e.O(0,[336],(()=>{return s=675,e(e.s=s);var s}));e.O()}]);

View File

@ -3,7 +3,7 @@
"app": { "app": {
"js": [ "js": [
"/build/app/runtime.js", "/build/app/runtime.js",
"/build/app/3.js", "/build/app/953.js",
"/build/app/app.js" "/build/app/app.js"
], ],
"css": [ "css": [
@ -22,7 +22,7 @@
"bootstrap-js": { "bootstrap-js": {
"js": [ "js": [
"/build/app/runtime.js", "/build/app/runtime.js",
"/build/app/138.js", "/build/app/336.js",
"/build/app/bootstrap-js.js" "/build/app/bootstrap-js.js"
] ]
} }

View File

@ -5,6 +5,6 @@
"build/app/bootstrap-css.js": "/build/app/bootstrap-css.js", "build/app/bootstrap-css.js": "/build/app/bootstrap-css.js",
"build/app/bootstrap-js.js": "/build/app/bootstrap-js.js", "build/app/bootstrap-js.js": "/build/app/bootstrap-js.js",
"build/app/runtime.js": "/build/app/runtime.js", "build/app/runtime.js": "/build/app/runtime.js",
"build/app/3.js": "/build/app/3.js", "build/app/336.js": "/build/app/336.js",
"build/app/138.js": "/build/app/138.js" "build/app/953.js": "/build/app/953.js"
} }

View File

@ -1 +1 @@
(()=>{"use strict";var e,r={},t={};function o(e){var n=t[e];if(void 0!==n)return n.exports;var i=t[e]={exports:{}};return r[e].call(i.exports,i,i.exports,o),i.exports}o.m=r,e=[],o.O=(r,t,n,i)=>{if(!t){var l=1/0;for(s=0;s<e.length;s++){for(var[t,n,i]=e[s],a=!0,u=0;u<t.length;u++)(!1&i||l>=i)&&Object.keys(o.O).every((e=>o.O[e](t[u])))?t.splice(u--,1):(a=!1,i<l&&(l=i));if(a){e.splice(s--,1);var f=n();void 0!==f&&(r=f)}}return r}i=i||0;for(var s=e.length;s>0&&e[s-1][2]>i;s--)e[s]=e[s-1];e[s]=[t,n,i]},o.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return o.d(r,{a:r}),r},o.d=(e,r)=>{for(var t in r)o.o(r,t)&&!o.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={666:0};o.O.j=r=>0===e[r];var r=(r,t)=>{var n,i,[l,a,u]=t,f=0;if(l.some((r=>0!==e[r]))){for(n in a)o.o(a,n)&&(o.m[n]=a[n]);if(u)var s=u(o)}for(r&&r(t);f<l.length;f++)i=l[f],o.o(e,i)&&e[i]&&e[i][0](),e[i]=0;return o.O(s)},t=self.webpackChunk=self.webpackChunk||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})()})(); (()=>{"use strict";var e,r={},o={};function t(e){var n=o[e];if(void 0!==n)return n.exports;var l=o[e]={exports:{}};return r[e].call(l.exports,l,l.exports,t),l.exports}t.m=r,e=[],t.O=(r,o,n,l)=>{if(!o){var a=1/0;for(u=0;u<e.length;u++){for(var[o,n,l]=e[u],i=!0,f=0;f<o.length;f++)(!1&l||a>=l)&&Object.keys(t.O).every((e=>t.O[e](o[f])))?o.splice(f--,1):(i=!1,l<a&&(a=l));if(i){e.splice(u--,1);var p=n();void 0!==p&&(r=p)}}return r}l=l||0;for(var u=e.length;u>0&&e[u-1][2]>l;u--)e[u]=e[u-1];e[u]=[o,n,l]},t.d=(e,r)=>{for(var o in r)t.o(r,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},t.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={121:0};t.O.j=r=>0===e[r];var r=(r,o)=>{var n,l,[a,i,f]=o,p=0;if(a.some((r=>0!==e[r]))){for(n in i)t.o(i,n)&&(t.m[n]=i[n]);if(f)var u=f(t)}for(r&&r(o);p<a.length;p++)l=a[p],t.o(e,l)&&e[l]&&e[l][0](),e[l]=0;return t.O(u)},o=self.webpackChunk=self.webpackChunk||[];o.forEach(r.bind(null,0)),o.push=r.bind(null,o.push.bind(o))})()})();

View File

@ -3,11 +3,28 @@
"theme": { "theme": {
"js": [ "js": [
"/build/theme/runtime.js", "/build/theme/runtime.js",
"/build/theme/869.js",
"/build/theme/theme.js" "/build/theme/theme.js"
], ],
"css": [ "css": [
"/build/theme/theme.css" "/build/theme/theme.css"
] ]
},
"bootstrap-css": {
"js": [
"/build/theme/runtime.js",
"/build/theme/bootstrap-css.js"
],
"css": [
"/build/theme/bootstrap-css.css"
]
},
"bootstrap-js": {
"js": [
"/build/theme/runtime.js",
"/build/theme/336.js",
"/build/theme/bootstrap-js.js"
]
} }
} }
} }

View File

@ -1,5 +1,27 @@
{ {
"build/theme/theme.css": "/build/theme/theme.css", "build/theme/theme.css": "/build/theme/theme.css",
"build/theme/theme.js": "/build/theme/theme.js", "build/theme/theme.js": "/build/theme/theme.js",
"build/theme/runtime.js": "/build/theme/runtime.js" "build/theme/bootstrap-css.css": "/build/theme/bootstrap-css.css",
"build/theme/bootstrap-css.js": "/build/theme/bootstrap-css.js",
"build/theme/bootstrap-js.js": "/build/theme/bootstrap-js.js",
"build/theme/runtime.js": "/build/theme/runtime.js",
"build/theme/869.js": "/build/theme/869.js",
"build/theme/336.js": "/build/theme/336.js",
"build/theme/images/oswald-regular-webfont.svg": "/build/theme/images/oswald-regular-webfont.03cdd684.svg",
"build/theme/images/oswald-bold-webfont.svg": "/build/theme/images/oswald-bold-webfont.9a1ed0ec.svg",
"build/theme/fonts/oswald-regular-webfont.ttf": "/build/theme/fonts/oswald-regular-webfont.c8502113.ttf",
"build/theme/fonts/oswald-bold-webfont.ttf": "/build/theme/fonts/oswald-bold-webfont.53c08c7b.ttf",
"build/theme/fonts/oswald-regular-webfont.woff": "/build/theme/fonts/oswald-regular-webfont.9e86c28e.woff",
"build/theme/fonts/oswald-bold-webfont.woff": "/build/theme/fonts/oswald-bold-webfont.fec2b538.woff",
"build/theme/fonts/oswald-regular-webfont.eot": "/build/theme/fonts/oswald-regular-webfont.edc12574.eot",
"build/theme/fonts/oswald-bold-webfont.eot": "/build/theme/fonts/oswald-bold-webfont.8f109a09.eot",
"build/theme/fonts/oswald-regular-webfont.woff2": "/build/theme/fonts/oswald-regular-webfont.009d0db9.woff2",
"build/theme/fonts/oswald-bold-webfont.woff2": "/build/theme/fonts/oswald-bold-webfont.6747e0fa.woff2",
"build/theme/images/franceconnect-fr-hover.png": "/build/theme/images/franceconnect-fr-hover.c0795590.png",
"build/theme/images/franceconnect-en-hover.png": "/build/theme/images/franceconnect-en-hover.bcc1e2f3.png",
"build/theme/images/MSEConnect-hover-fr.png": "/build/theme/images/MSEConnect-hover-fr.81c82e3e.png",
"build/theme/images/MSEConnect-hover-en.png": "/build/theme/images/MSEConnect-hover-en.32a6d3eb.png",
"build/theme/images/instagram-hover.png": "/build/theme/images/instagram-hover.5965b4e3.png",
"build/theme/images/x-hover.png": "/build/theme/images/x-hover.759179b7.png",
"build/theme/images/facebook-hover.png": "/build/theme/images/facebook-hover.4a346412.png"
} }

View File

@ -1 +1 @@
(()=>{"use strict";var e,r={},o={};function t(e){var n=o[e];if(void 0!==n)return n.exports;var l=o[e]={exports:{}};return r[e](l,l.exports,t),l.exports}t.m=r,e=[],t.O=(r,o,n,l)=>{if(!o){var a=1/0;for(p=0;p<e.length;p++){for(var[o,n,l]=e[p],i=!0,f=0;f<o.length;f++)(!1&l||a>=l)&&Object.keys(t.O).every((e=>t.O[e](o[f])))?o.splice(f--,1):(i=!1,l<a&&(a=l));if(i){e.splice(p--,1);var u=n();void 0!==u&&(r=u)}}return r}l=l||0;for(var p=e.length;p>0&&e[p-1][2]>l;p--)e[p]=e[p-1];e[p]=[o,n,l]},t.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={666:0};t.O.j=r=>0===e[r];var r=(r,o)=>{var n,l,[a,i,f]=o,u=0;if(a.some((r=>0!==e[r]))){for(n in i)t.o(i,n)&&(t.m[n]=i[n]);if(f)var p=f(t)}for(r&&r(o);u<a.length;u++)l=a[u],t.o(e,l)&&e[l]&&e[l][0](),e[l]=0;return t.O(p)},o=self.webpackChunk=self.webpackChunk||[];o.forEach(r.bind(null,0)),o.push=r.bind(null,o.push.bind(o))})()})(); (()=>{"use strict";var e,r={},t={};function o(e){var n=t[e];if(void 0!==n)return n.exports;var i=t[e]={exports:{}};return r[e](i,i.exports,o),i.exports}o.m=r,e=[],o.O=(r,t,n,i)=>{if(!t){var l=1/0;for(s=0;s<e.length;s++){for(var[t,n,i]=e[s],a=!0,f=0;f<t.length;f++)(!1&i||l>=i)&&Object.keys(o.O).every((e=>o.O[e](t[f])))?t.splice(f--,1):(a=!1,i<l&&(l=i));if(a){e.splice(s--,1);var u=n();void 0!==u&&(r=u)}}return r}i=i||0;for(var s=e.length;s>0&&e[s-1][2]>i;s--)e[s]=e[s-1];e[s]=[t,n,i]},o.d=(e,r)=>{for(var t in r)o.o(r,t)&&!o.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={121:0};o.O.j=r=>0===e[r];var r=(r,t)=>{var n,i,[l,a,f]=t,u=0;if(l.some((r=>0!==e[r]))){for(n in a)o.o(a,n)&&(o.m[n]=a[n]);if(f)var s=f(o)}for(r&&r(t);u<l.length;u++)i=l[u],o.o(e,i)&&e[i]&&e[i][0](),e[i]=0;return o.O(s)},t=self.webpackChunk=self.webpackChunk||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})()})();

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(self.webpackChunk=self.webpackChunk||[]).push([[505],{755:(s,e,k)=>{k(634),k(681)},634:()=>{},681:(s,e,k)=>{"use strict";k.r(e)}},s=>{var e;e=755,s(s.s=e)}]); "use strict";(self.webpackChunk=self.webpackChunk||[]).push([[694],{5895:(e,t,n)=>{n(8953),n(8476),n(5086),n(9389),n(557),n(9693);document.addEventListener("DOMContentLoaded",(function(){[].forEach.call(document.querySelectorAll(".language-change"),(function(e){e.addEventListener("click",(function(t){t.preventDefault();var n=e.getAttribute("data-lang");return function(e){for(var t=e+"=",n=document.cookie.split(";"),r=0;r<n.length;r++){for(var a=n[r];" "==a.charAt(0);)a=a.substring(1,a.length);if(0==a.indexOf(t))return a.substring(t.length,a.length)}return null}("mselang")!=n&&(function(e,t,n){var r="";if(n){var a=new Date;a.setTime(a.getTime()+24*n*60*60*1e3),r="; expires="+a.toUTCString()}for(var o=window.location.hostname.split(".").reverse(),i="",l=o.length-1;l>=0;l--)i+=o[l],l>0&&(i+=".");document.cookie=e+"="+(t||"")+r+"; path=/; domain="+i}("mselang",n,!1),location.reload()),!1}))}));var e=document.forms.login,t=document.getElementById("loader");e.addEventListener("submit",(function(e){t.style.display="flex"}))}))}},e=>{e.O(0,[869],(()=>{return t=5895,e(e.s=t);var t}));e.O()}]);

View File

@ -109,3 +109,24 @@ ex : `'redis:?host[redis1:26379]&host[redis2:26379]&host[redis3:26379]&redis_sen
| `postgres` | Base de donnée postgres support du test et pour hydra | `5432` | | `postgres` | Base de donnée postgres support du test et pour hydra | `5432` |
| `mariadb` | Base de donnée mariadb support du test | `3306` | | `mariadb` | Base de donnée mariadb support du test | `3306` |
| `pgadmin` | pour administrer la base de donnée | `8085` | | `pgadmin` | pour administrer la base de donnée | `8085` |
### Configuration d'Altcha
Altcha est activable/désactivable par un feature flag disponible à la route /flag/altcha (port 8082 par défaut).
La valeur de ce flag est stockée dans Redis (clé `altcha`) afin de pouvoir la modifier à la volée. Par sécurité, un fallback sur la variable d'environnement `ALTCHA_ENABLED` est effectué si la clé n'existe pas dans Redis.
Exemple de désactivation:
```shell
curl --request PUT \
--url https://dev.mse.local/auth/sql/flag/altcha \
--header 'Content-Type: application/json' \
--data '{"flagValue": false}'
```
### 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`

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,37 @@
<?php
namespace App\Flag\Controller;
use App\Flag\FlagAccessor;
use App\Flag\FlagEnum;
use Psr\Cache\CacheItemPoolInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Exception\JsonException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class FlagController extends AbstractController
{
#[Route('/flag/{flagName}', name: 'flag_update', methods: ['PUT'])]
public function updateFlag(CacheItemPoolInterface $cache, Request $request, string $flagName): Response
{
try {
FlagEnum::from($flagName);
$flagValue = \json_decode($request->getContent(), true, flags: JSON_THROW_ON_ERROR)[FlagAccessor::FLAG_VALUE];
} catch (\ValueError $e) {
throw new \InvalidArgumentException('invalid flag name provided');
} catch (JsonException $e) {
throw new \InvalidArgumentException('invalid json format');
}
$flag = $cache->getItem($flagName);
$flag->set($flagValue);
$cache->save($flag);
return new JsonResponse(
[\sprintf('flag %s has been %s.', $flagName, $flagValue ? 'enabled' : 'disabled')]
);
}
}

26
src/Flag/FlagAccessor.php Normal file
View File

@ -0,0 +1,26 @@
<?php
namespace App\Flag;
use Psr\Cache\CacheItemPoolInterface;
class FlagAccessor
{
public const FLAG_VALUE = 'flagValue';
public function __construct(
private readonly CacheItemPoolInterface $cache
) {
}
public function isFlagEnabled(FlagEnum $flagName, bool $fallbackValue = false): bool
{
$flagValue = $this->cache->getItem($flagName->value)->get();
if (null === $flagValue) {
return $fallbackValue;
}
return (bool) $flagValue;
}
}

8
src/Flag/FlagEnum.php Normal file
View File

@ -0,0 +1,8 @@
<?php
namespace App\Flag;
enum FlagEnum: string
{
case Altcha = 'altcha';
}

View File

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

View File

@ -3,25 +3,22 @@
namespace App\Hydra; namespace App\Hydra;
use App\Hydra\Exception\InvalidChallengeException; use App\Hydra\Exception\InvalidChallengeException;
use Exception;
use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Contracts\HttpClient\ResponseInterface; use Symfony\Contracts\HttpClient\ResponseInterface;
class Client class Client
{ {
private HttpClientInterface $client;
private const MAX_RETRY = 3; private const MAX_RETRY = 3;
private const SLEEP_TIME = [ private const SLEEP_TIME = [
5, 5,
500, 500,
5000, 5000,
]; ];
private string $hydraAdminBaseUrl;
public function __construct(HttpClientInterface $client, string $hydraAdminBaseUrl) public function __construct(
{ private readonly HttpClientInterface $client,
$this->client = $client; private readonly string $hydraAdminBaseUrl
$this->hydraAdminBaseUrl = $hydraAdminBaseUrl; ) {
} }
public function fetchLoginRequestInfo(string $loginChallenge): ResponseInterface public function fetchLoginRequestInfo(string $loginChallenge): ResponseInterface
@ -91,7 +88,7 @@ class Client
break; break;
} }
if (self::MAX_RETRY === $attempt) { 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)); throw new \Exception(sprintf('Fetch consent a rencontré une erreur %s après %s tentatives', $response->getStatusCode(), self::MAX_RETRY));
} }
return $response; return $response;

View File

@ -44,7 +44,7 @@ class HydraService extends AbstractController
// si le challenge est validé par hydra, on le stocke en session pour l'utiliser par la suite et on redirige vers une route interne protégée qui va déclencher l'identification FranceConnect // si le challenge est validé par hydra, on le stocke en session pour l'utiliser par la suite et on redirige vers une route interne protégée qui va déclencher l'identification FranceConnect
$this->session->set('challenge', $loginRequestInfo['challenge']); $this->session->set('challenge', $loginRequestInfo['challenge']);
return new RedirectResponse($this->baseUrl . '/connect/login-accept'); return new RedirectResponse($this->baseUrl.'/connect/login-accept');
} }
public function handleConsentRequest(Request $request): RedirectResponse public function handleConsentRequest(Request $request): RedirectResponse

View File

@ -0,0 +1,13 @@
{% block altcha_widget %}
<altcha-widget
challengejson={{challengeJson}}
name='altcha'
strings="{{translations}}"
hidelogo
hidefooter
workers= {{ workers }}
delay={{ delay }}
{{ debug ? 'debug' : ''}}
{{ mockError ? 'mockerror' : ''}}
></altcha-widget>
{% endblock %}

View File

@ -6,7 +6,6 @@
{% block stylesheets %} {% block stylesheets %}
{{ encore_entry_link_tags('app', null, 'appConfig') }} {{ encore_entry_link_tags('app', null, 'appConfig') }}
{{ encore_entry_link_tags('bootstrap-css', null, 'appConfig') }} {{ encore_entry_link_tags('bootstrap-css', null, 'appConfig') }}
{{ encore_entry_link_tags('theme', null, 'themeConfig') }}
{% endblock %} {% endblock %}
</head> </head>
@ -15,7 +14,6 @@
{% block javascripts %} {% block javascripts %}
{{ encore_entry_script_tags('app', null, 'appConfig') }} {{ encore_entry_script_tags('app', null, 'appConfig') }}
{{ encore_entry_script_tags('bootstrap-js', null, 'appConfig') }} {{ encore_entry_script_tags('bootstrap-js', null, 'appConfig') }}
{{ encore_entry_script_tags('theme', null, 'themeConfig') }}
{% endblock %} {% endblock %}
</body> </body>
</html> </html>

View File

@ -6,23 +6,23 @@
{% block body %} {% block body %}
<div class="login-wrapper"> <div class="login-wrapper">
<div class="login"> <div class="login">
{% if app.user %} {% if app.user %}
<div class="mb-3"> <div class="mb-3">
You are logged in as {{ app.user.login }} You are logged in as {{ app.user.login }}
</div>
{% endif %}
<div class="lang">
{% for locale in locales %}
<a href="{{ path('locale_change', {'locale':locale }) }}" title="{{locale}}" aria-label="{{locale}}" class="flag"><img class="w-10" src="{{ asset('flags/'~ locale ~'.svg') }}"/></a>
{% endfor %}
</div> </div>
<h1 class="h3 mb-3 font-weight-normal">{% trans from 'view' %} sign_in {% endtrans %}</h1> {% endif %}
{{form_start(loginForm)}} <div class="lang">
{{form_widget(loginForm)}} {% for locale in locales %}
<a href="{{ path('locale_change', {'locale':locale }) }}" title="{{locale}}" aria-label="{{locale}}" class="flag"><img class="w-10" src="{{ asset('flags/'~ locale ~'.svg') }}"/></a>
{% endfor %}
</div>
<h1 class="h3 mb-3 font-weight-normal">{% trans from 'view' %} sign_in {% endtrans %}</h1>
{{form_start(loginForm)}}
{{form_widget(loginForm)}}
<button class="btn btn-lg btn-primary" type="submit"> <button class="btn btn-lg btn-primary" type="submit">
{% trans from 'view' %} submit {% endtrans %} {% trans from 'view' %} submit {% endtrans %}
</button> </button>
{{form_end(loginForm)}} {{form_end(loginForm)}}
</div> </div>
</div> </div>

3
tools/php-cs-fixer/.php-cs-fixer.dist.php Normal file → Executable file
View File

@ -5,8 +5,6 @@ $finder = PhpCsFixer\Finder::create()
->name('*.php') ->name('*.php')
; ;
// TODO: Définir les règles de style communes
// spécifiques au projet
return (new PhpCsFixer\Config()) return (new PhpCsFixer\Config())
->setRules([ ->setRules([
'@Symfony' => true, '@Symfony' => true,
@ -22,6 +20,7 @@ return (new PhpCsFixer\Config())
'ternary_operator_spaces' => true, 'ternary_operator_spaces' => true,
'class_definition' => ['single_line' => true], 'class_definition' => ['single_line' => true],
'whitespace_after_comma_in_array' => true, 'whitespace_after_comma_in_array' => true,
'trailing_comma_in_multiline' => true,
// phpdoc // phpdoc
'phpdoc_add_missing_param_annotation' => ['only_untyped' => true], 'phpdoc_add_missing_param_annotation' => ['only_untyped' => true],

View File

@ -7,16 +7,52 @@
<body> <body>
<trans-unit id="4Lw8Y4y" resname="form.label.login"> <trans-unit id="4Lw8Y4y" resname="form.label.login">
<source>form.label.login</source> <source>form.label.login</source>
<target>login</target> <target>Email address *</target>
</trans-unit> </trans-unit>
<trans-unit id="RmsDr53" resname="form.label.password"> <trans-unit id="RmsDr53" resname="form.label.password">
<source>form.label.password</source> <source>form.label.password</source>
<target>Password</target> <target>Password *</target>
</trans-unit> </trans-unit>
<trans-unit id="t17Vcvs" resname="form.label.remember_me"> <trans-unit id="t17Vcvs" resname="form.label.remember_me">
<source>form.label.remember_me</source> <source>form.label.remember_me</source>
<target>Remember me</target> <target>Remember me</target>
</trans-unit> </trans-unit>
<trans-unit id="4kfMq14" resname="altcha.validator.server_validation_error">
<source>altcha.validator.server_validation_error</source>
<target>Verification failed. Try again later.</target>
</trans-unit>
<trans-unit id="7mZdXx_" resname="altcha.widget.error">
<source>altcha.widget.error</source>
<target>Verification failed. Try again later.</target>
</trans-unit>
<trans-unit id="Yg33QZt" resname="altcha.widget.expired">
<source>altcha.widget.expired</source>
<target>Verification expired. Try again.</target>
</trans-unit>
<trans-unit id="3y0.Bhb" resname="altcha.widget.label">
<source>altcha.widget.label</source>
<target>I'm not a robot</target>
</trans-unit>
<trans-unit id="QFBWtGD" resname="altcha.widget.verified">
<source>altcha.widget.verified</source>
<target>Verified</target>
</trans-unit>
<trans-unit id="SfOrgtj" resname="altcha.widget.verifying">
<source>altcha.widget.verifying</source>
<target>Verifying...</target>
</trans-unit>
<trans-unit id="9dhbPuz" resname="altcha.widget.waitalert">
<source>altcha.widget.waitalert</source>
<target>Verifying... please wait.</target>
</trans-unit>
<trans-unit id="9k5hI.D" resname="altcha.widget.title">
<source>altcha.widget.title</source>
<target>Verification *</target>
</trans-unit>
<trans-unit id="vGcy2C3" resname="altcha.widget.info">
<source>altcha.widget.info</source>
<target>Please check the box above to validate that you are not a robot. If you encounter any problem while doing this, please update your browser.</target>
</trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>

View File

@ -7,16 +7,52 @@
<body> <body>
<trans-unit id="4Lw8Y4y" resname="form.label.login"> <trans-unit id="4Lw8Y4y" resname="form.label.login">
<source>form.label.login</source> <source>form.label.login</source>
<target>login</target> <target>Adresse courriel *</target>
</trans-unit> </trans-unit>
<trans-unit id="RmsDr53" resname="form.label.password"> <trans-unit id="RmsDr53" resname="form.label.password">
<source>form.label.password</source> <source>form.label.password</source>
<target>Mot de passe</target> <target>Mot de passe *</target>
</trans-unit> </trans-unit>
<trans-unit id="t17Vcvs" resname="form.label.remember_me"> <trans-unit id="t17Vcvs" resname="form.label.remember_me">
<source>form.label.remember_me</source> <source>form.label.remember_me</source>
<target>Se souvenir de moi</target> <target>Se souvenir de moi</target>
</trans-unit> </trans-unit>
<trans-unit id="4kfMq14" resname="altcha.validator.server_validation_error">
<source>altcha.validator.server_validation_error</source>
<target>Échec de la vérification. Réessayez plus tard.</target>
</trans-unit>
<trans-unit id="7mZdXx_" resname="altcha.widget.error">
<source>altcha.widget.error</source>
<target>Échec de la vérification. Réesayez plus tard.</target>
</trans-unit>
<trans-unit id="Yg33QZt" resname="altcha.widget.expired">
<source>altcha.widget.expired</source>
<target>Vérification expirée. Réessayez.</target>
</trans-unit>
<trans-unit id="3y0.Bhb" resname="altcha.widget.label">
<source>altcha.widget.label</source>
<target>Je ne suis pas un robot</target>
</trans-unit>
<trans-unit id="QFBWtGD" resname="altcha.widget.verified">
<source>altcha.widget.verified</source>
<target>Vérifié</target>
</trans-unit>
<trans-unit id="SfOrgtj" resname="altcha.widget.verifying">
<source>altcha.widget.verifying</source>
<target>Vérification en cours...</target>
</trans-unit>
<trans-unit id="9dhbPuz" resname="altcha.widget.waitalert">
<source>altcha.widget.waitalert</source>
<target>Vérification en cours... veuillez patienter.</target>
</trans-unit>
<trans-unit id="9k5hI.D" resname="altcha.widget.title">
<source>altcha.widget.title</source>
<target>Vérification *</target>
</trans-unit>
<trans-unit id="vGcy2C3" resname="altcha.widget.info">
<source>altcha.widget.info</source>
<target>Veuillez cocher la case ci dessus afin de valider que vous n'êtes pas un robot. Si vous rencontrez un problème lors de cette action, mettez à jour votre navigateur.</target>
</trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>

View File

@ -25,9 +25,6 @@ Encore
.addEntry('bootstrap-css', './assets/styles/bootstrap.scss') .addEntry('bootstrap-css', './assets/styles/bootstrap.scss')
.addEntry('bootstrap-js', './assets/app-bootstrap.js') .addEntry('bootstrap-js', './assets/app-bootstrap.js')
// enables the Symfony UX Stimulus bridge (used in assets/bootstrap.js)
.enableStimulusBridge('./assets/controllers.json')
// When enabled, Webpack "splits" your files into smaller pieces for greater optimization. // When enabled, Webpack "splits" your files into smaller pieces for greater optimization.
.splitEntryChunks() .splitEntryChunks()
@ -75,14 +72,27 @@ Encore
.setOutputPath('public/build/theme/') .setOutputPath('public/build/theme/')
// public path used by the web server to access the output path // public path used by the web server to access the output path
.setPublicPath('/build/theme') .setPublicPath('/build/theme')
.addEntry('theme','./public/theme-entrypoint.js') .addEntry('theme','./assets/theme-entrypoint.js')
.addEntry('bootstrap-css', './assets/styles/bootstrap.scss')
.addEntry('bootstrap-js', './assets/app-bootstrap.js')
.splitEntryChunks() .splitEntryChunks()
.enableSingleRuntimeChunk() .enableSingleRuntimeChunk()
.cleanupOutputBeforeBuild()
.enableBuildNotifications() .enableBuildNotifications()
.enableSourceMaps(false) .enableSourceMaps(false)
.enableVersioning(false) .enableVersioning(false)
.configureBabel((config) => {
config.plugins.push('@babel/plugin-proposal-class-properties');
})
// enables @babel/preset-env polyfills
.configureBabelPresetEnv((config) => {
config.useBuiltIns = 'usage';
config.corejs = 3;
})
.enablePostCssLoader() .enablePostCssLoader()
.enableSassLoader()
; ;
// build the second configuration // build the second configuration