diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6699076 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[{compose.yaml,compose.*.yaml}] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false diff --git a/.env b/.env index 57410f3..09302d5 100644 --- a/.env +++ b/.env @@ -17,3 +17,4 @@ CAS_USERNAME=uid CAS_MAIL=mail CAS_LASTNAME=lastname CAS_FIRSTNAME=firstname + diff --git a/.env.dev b/.env.dev new file mode 100644 index 0000000..b5e81da --- /dev/null +++ b/.env.dev @@ -0,0 +1,4 @@ + +###> symfony/framework-bundle ### +APP_SECRET=628790eb09e2cf96d93a21f4f43433d8 +###< symfony/framework-bundle ### diff --git a/.gitignore b/.gitignore index 2f20bc7..7373367 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,32 @@ phpstan.neon /.php-cs-fixer.php /.php-cs-fixer.cache -/volume \ No newline at end of file +/volume +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/config/secrets/prod/prod.decrypt.private.php +/public/bundles/ +/var/ +/vendor/ +###< symfony/framework-bundle ### + +###> friendsofphp/php-cs-fixer ### +/.php-cs-fixer.php +/.php-cs-fixer.cache +###< friendsofphp/php-cs-fixer ### + +###> phpstan/phpstan ### +phpstan.neon +###< phpstan/phpstan ### + +###> phpunit/phpunit ### +/phpunit.xml +.phpunit.result.cache +###< phpunit/phpunit ### + +###> symfony/phpunit-bridge ### +.phpunit.result.cache +/phpunit.xml +###< symfony/phpunit-bridge ### diff --git a/assets/bootstrap.js b/assets/bootstrap.js new file mode 100644 index 0000000..2689398 --- /dev/null +++ b/assets/bootstrap.js @@ -0,0 +1,2 @@ +// register any custom, 3rd party controllers here +// app.register('some_controller_name', SomeImportedController); diff --git a/assets/controllers.json b/assets/controllers.json new file mode 100644 index 0000000..a1c6e90 --- /dev/null +++ b/assets/controllers.json @@ -0,0 +1,4 @@ +{ + "controllers": [], + "entrypoints": [] +} diff --git a/assets/controllers/csrf_protection_controller.js b/assets/controllers/csrf_protection_controller.js new file mode 100644 index 0000000..c722f02 --- /dev/null +++ b/assets/controllers/csrf_protection_controller.js @@ -0,0 +1,79 @@ +const nameCheck = /^[-_a-zA-Z0-9]{4,22}$/; +const tokenCheck = /^[-_/+a-zA-Z0-9]{24,}$/; + +// Generate and double-submit a CSRF token in a form field and a cookie, as defined by Symfony's SameOriginCsrfTokenManager +document.addEventListener('submit', function (event) { + generateCsrfToken(event.target); +}, true); + +// When @hotwired/turbo handles form submissions, send the CSRF token in a header in addition to a cookie +// The `framework.csrf_protection.check_header` config option needs to be enabled for the header to be checked +document.addEventListener('turbo:submit-start', function (event) { + const h = generateCsrfHeaders(event.detail.formSubmission.formElement); + Object.keys(h).map(function (k) { + event.detail.formSubmission.fetchRequest.headers[k] = h[k]; + }); +}); + +// When @hotwired/turbo handles form submissions, remove the CSRF cookie once a form has been submitted +document.addEventListener('turbo:submit-end', function (event) { + removeCsrfToken(event.detail.formSubmission.formElement); +}); + +export function generateCsrfToken (formElement) { + const csrfField = formElement.querySelector('input[data-controller="csrf-protection"], input[name="_csrf_token"]'); + + if (!csrfField) { + return; + } + + let csrfCookie = csrfField.getAttribute('data-csrf-protection-cookie-value'); + let csrfToken = csrfField.value; + + if (!csrfCookie && nameCheck.test(csrfToken)) { + csrfField.setAttribute('data-csrf-protection-cookie-value', csrfCookie = csrfToken); + csrfField.defaultValue = csrfToken = btoa(String.fromCharCode.apply(null, (window.crypto || window.msCrypto).getRandomValues(new Uint8Array(18)))); + csrfField.dispatchEvent(new Event('change', { bubbles: true })); + } + + if (csrfCookie && tokenCheck.test(csrfToken)) { + const cookie = csrfCookie + '_' + csrfToken + '=' + csrfCookie + '; path=/; samesite=strict'; + document.cookie = window.location.protocol === 'https:' ? '__Host-' + cookie + '; secure' : cookie; + } +} + +export function generateCsrfHeaders (formElement) { + const headers = {}; + const csrfField = formElement.querySelector('input[data-controller="csrf-protection"], input[name="_csrf_token"]'); + + if (!csrfField) { + return headers; + } + + const csrfCookie = csrfField.getAttribute('data-csrf-protection-cookie-value'); + + if (tokenCheck.test(csrfField.value) && nameCheck.test(csrfCookie)) { + headers[csrfCookie] = csrfField.value; + } + + return headers; +} + +export function removeCsrfToken (formElement) { + const csrfField = formElement.querySelector('input[data-controller="csrf-protection"], input[name="_csrf_token"]'); + + if (!csrfField) { + return; + } + + const csrfCookie = csrfField.getAttribute('data-csrf-protection-cookie-value'); + + if (tokenCheck.test(csrfField.value) && nameCheck.test(csrfCookie)) { + const cookie = csrfCookie + '_' + csrfField.value + '=0; path=/; samesite=strict; max-age=0'; + + document.cookie = window.location.protocol === 'https:' ? '__Host-' + cookie + '; secure' : cookie; + } +} + +/* stimulusFetch: 'lazy' */ +export default 'csrf-protection-controller'; diff --git a/assets/controllers/hello_controller.js b/assets/controllers/hello_controller.js new file mode 100644 index 0000000..e847027 --- /dev/null +++ b/assets/controllers/hello_controller.js @@ -0,0 +1,16 @@ +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'; + } +} diff --git a/composer.json b/composer.json index a56a3f7..4f2469b 100644 --- a/composer.json +++ b/composer.json @@ -21,34 +21,34 @@ "phpdocumentor/reflection-docblock": "^5.4", "phpstan/phpdoc-parser": "^1.33", "ramsey/uuid": "^4.7", - "symfony/asset": "7.1.*", - "symfony/console": "7.1.*", - "symfony/doctrine-messenger": "7.1.*", - "symfony/dotenv": "7.1.*", - "symfony/expression-language": "7.1.*", + "symfony/asset": "^7.2", + "symfony/console": "^7.2", + "symfony/doctrine-messenger": "^7.2", + "symfony/dotenv": "^7.2", + "symfony/expression-language": "^7.2", "symfony/flex": "^2", - "symfony/form": "7.1.*", - "symfony/framework-bundle": "7.1.*", - "symfony/http-client": "7.1.*", - "symfony/intl": "7.1.*", - "symfony/mailer": "7.1.*", - "symfony/mime": "7.1.*", + "symfony/form": "^7.2", + "symfony/framework-bundle": "^7.2", + "symfony/http-client": "^7.2", + "symfony/intl": "^7.2", + "symfony/mailer": "^7.2", + "symfony/mime": "^7.2", "symfony/monolog-bundle": "^3.0", - "symfony/notifier": "7.1.*", - "symfony/process": "7.1.*", - "symfony/property-access": "7.1.*", - "symfony/property-info": "7.1.*", - "symfony/runtime": "7.1.*", - "symfony/security-bundle": "7.1.*", - "symfony/serializer": "7.1.*", + "symfony/notifier": "^7.2", + "symfony/process": "^7.2", + "symfony/property-access": "^7.2", + "symfony/property-info": "^7.2", + "symfony/runtime": "^7.2", + "symfony/security-bundle": "^7.2", + "symfony/serializer": "^7.2", "symfony/stimulus-bundle": "^2.21", - "symfony/string": "7.1.*", - "symfony/translation": "7.1.*", - "symfony/twig-bundle": "7.1.*", + "symfony/string": "^7.2", + "symfony/translation": "^7.2", + "symfony/twig-bundle": "^7.2", "symfony/ux-turbo": "^2.21", - "symfony/validator": "7.1.*", - "symfony/web-link": "7.1.*", - "symfony/yaml": "7.1.*", + "symfony/validator": "^7.2", + "symfony/web-link": "^7.2", + "symfony/yaml": "^7.2", "twig/extra-bundle": "^3.21", "twig/markdown-extra": "^3.21", "twig/twig": "^2.12|^3.0" @@ -99,7 +99,7 @@ "extra": { "symfony": { "allow-contrib": false, - "require": "7.1.*" + "require": "^7.2" } }, "require-dev": { @@ -108,12 +108,12 @@ "phpstan/phpstan-doctrine": "^2.0", "phpstan/phpstan-symfony": "^2.0", "phpunit/phpunit": "^9.5", - "symfony/browser-kit": "7.1.*", - "symfony/css-selector": "7.1.*", - "symfony/debug-bundle": "7.1.*", + "symfony/browser-kit": "^7.2", + "symfony/css-selector": "^7.2", + "symfony/debug-bundle": "^7.2", "symfony/maker-bundle": "^1.0", - "symfony/phpunit-bridge": "^7.1", - "symfony/stopwatch": "7.1.*", - "symfony/web-profiler-bundle": "7.1.*" + "symfony/phpunit-bridge": "^7.2", + "symfony/stopwatch": "^7.2", + "symfony/web-profiler-bundle": "^7.2" } } diff --git a/composer.lock b/composer.lock index c4e4a30..d2ee646 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2d59dc750783494ae1dbf58d9a3025c3", + "content-hash": "67e324518270930150d990299cd0b613", "packages": [ { "name": "apereo/phpcas", @@ -3377,16 +3377,16 @@ }, { "name": "symfony/asset", - "version": "v7.1.6", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "0dcd51490d7fc9fbf3c8f5aec6df182920fc0426" + "reference": "56c4d9f759247c4e07d8549e3baf7493cb9c3e4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/0dcd51490d7fc9fbf3c8f5aec6df182920fc0426", - "reference": "0dcd51490d7fc9fbf3c8f5aec6df182920fc0426", + "url": "https://api.github.com/repos/symfony/asset/zipball/56c4d9f759247c4e07d8549e3baf7493cb9c3e4b", + "reference": "56c4d9f759247c4e07d8549e3baf7493cb9c3e4b", "shasum": "" }, "require": { @@ -3426,7 +3426,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v7.1.6" + "source": "https://github.com/symfony/asset/tree/v7.3.0" }, "funding": [ { @@ -3442,27 +3442,27 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:11:02+00:00" + "time": "2025-03-05T10:15:41+00:00" }, { "name": "symfony/cache", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "3828c0375578ff3ca1ddc54cc5c6fa4cc89fb3fb" + "reference": "6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/3828c0375578ff3ca1ddc54cc5c6fa4cc89fb3fb", - "reference": "3828c0375578ff3ca1ddc54cc5c6fa4cc89fb3fb", + "url": "https://api.github.com/repos/symfony/cache/zipball/6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6", + "reference": "6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6", "shasum": "" }, "require": { "php": ">=8.2", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^2.5|^3", + "symfony/cache-contracts": "^3.6", "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/service-contracts": "^2.5|^3", "symfony/var-exporter": "^6.4|^7.0" @@ -3483,6 +3483,7 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/clock": "^6.4|^7.0", "symfony/config": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/filesystem": "^6.4|^7.0", @@ -3523,7 +3524,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.1.11" + "source": "https://github.com/symfony/cache/tree/v7.3.2" }, "funding": [ { @@ -3534,12 +3535,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2025-07-30T17:13:41+00:00" }, { "name": "symfony/cache-contracts", @@ -3619,16 +3624,16 @@ }, { "name": "symfony/clock", - "version": "v7.1.6", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "97bebc53548684c17ed696bc8af016880f0f098d" + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/97bebc53548684c17ed696bc8af016880f0f098d", - "reference": "97bebc53548684c17ed696bc8af016880f0f098d", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", "shasum": "" }, "require": { @@ -3673,7 +3678,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.1.6" + "source": "https://github.com/symfony/clock/tree/v7.3.0" }, "funding": [ { @@ -3689,20 +3694,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/config", - "version": "v7.1.7", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8" + "reference": "faef36e271bbeb74a9d733be4b56419b157762e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8", - "reference": "dc373a5cbd345354696f5dfd39c5c7a8ea23f4c8", + "url": "https://api.github.com/repos/symfony/config/zipball/faef36e271bbeb74a9d733be4b56419b157762e2", + "reference": "faef36e271bbeb74a9d733be4b56419b157762e2", "shasum": "" }, "require": { @@ -3748,7 +3753,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v7.1.7" + "source": "https://github.com/symfony/config/tree/v7.3.2" }, "funding": [ { @@ -3759,32 +3764,37 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-04T11:34:07+00:00" + "time": "2025-07-26T13:55:06+00:00" }, { "name": "symfony/console", - "version": "v7.1.10", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "bb06e2d7f8dd9dffe5eada8a5cbe0f68f1482db7" + "reference": "5f360ebc65c55265a74d23d7fe27f957870158a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/bb06e2d7f8dd9dffe5eada8a5cbe0f68f1482db7", - "reference": "bb06e2d7f8dd9dffe5eada8a5cbe0f68f1482db7", + "url": "https://api.github.com/repos/symfony/console/zipball/5f360ebc65c55265a74d23d7fe27f957870158a1", + "reference": "5f360ebc65c55265a74d23d7fe27f957870158a1", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" + "symfony/string": "^7.2" }, "conflict": { "symfony/dependency-injection": "<6.4", @@ -3841,7 +3851,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.1.10" + "source": "https://github.com/symfony/console/tree/v7.3.2" }, "funding": [ { @@ -3852,25 +3862,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-09T07:30:10+00:00" + "time": "2025-07-30T17:13:41+00:00" }, { "name": "symfony/dependency-injection", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "5ebf7d4dfda126b442450effaec421a106c010de" + "reference": "6cd2a1a77e8a0676a26e8bcddf10acfe7b0ba352" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5ebf7d4dfda126b442450effaec421a106c010de", - "reference": "5ebf7d4dfda126b442450effaec421a106c010de", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6cd2a1a77e8a0676a26e8bcddf10acfe7b0ba352", + "reference": "6cd2a1a77e8a0676a26e8bcddf10acfe7b0ba352", "shasum": "" }, "require": { @@ -3878,7 +3892,7 @@ "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^3.5", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/var-exporter": "^6.4.20|^7.2.5" }, "conflict": { "ext-psr": "<1.1|>=2", @@ -3921,7 +3935,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v7.1.11" + "source": "https://github.com/symfony/dependency-injection/tree/v7.3.2" }, "funding": [ { @@ -3932,12 +3946,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-10T09:29:52+00:00" + "time": "2025-07-30T17:31:46+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4008,16 +4026,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "b0247c25b71409c23c0cf3e090030950a86cc61b" + "reference": "a2cbc12baf9bcc5d0c125e4c0f8330b98af841ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b0247c25b71409c23c0cf3e090030950a86cc61b", - "reference": "b0247c25b71409c23c0cf3e090030950a86cc61b", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/a2cbc12baf9bcc5d0c125e4c0f8330b98af841ca", + "reference": "a2cbc12baf9bcc5d0c125e4c0f8330b98af841ca", "shasum": "" }, "require": { @@ -4030,6 +4048,7 @@ "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "doctrine/collections": "<1.8", "doctrine/dbal": "<3.6", "doctrine/lexer": "<1.1", "doctrine/orm": "<2.15", @@ -4046,7 +4065,7 @@ "symfony/validator": "<6.4" }, "require-dev": { - "doctrine/collections": "^1.0|^2.0", + "doctrine/collections": "^1.8|^2.0", "doctrine/data-fixtures": "^1.1|^2", "doctrine/dbal": "^3.6|^4", "doctrine/orm": "^2.15|^3", @@ -4065,7 +4084,7 @@ "symfony/security-core": "^6.4|^7.0", "symfony/stopwatch": "^6.4|^7.0", "symfony/translation": "^6.4|^7.0", - "symfony/type-info": "^7.1", + "symfony/type-info": "^7.1.8", "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0" @@ -4096,7 +4115,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.1.11" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.3.2" }, "funding": [ { @@ -4107,31 +4126,35 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2025-07-15T11:36:08+00:00" }, { "name": "symfony/doctrine-messenger", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "a7813f3cfc8c66bd5930f15fcf591a1dee27b089" + "reference": "31ef09fa3185c8ef9a331170b7a9dd891047f5cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/a7813f3cfc8c66bd5930f15fcf591a1dee27b089", - "reference": "a7813f3cfc8c66bd5930f15fcf591a1dee27b089", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/31ef09fa3185c8ef9a331170b7a9dd891047f5cb", + "reference": "31ef09fa3185c8ef9a331170b7a9dd891047f5cb", "shasum": "" }, "require": { "doctrine/dbal": "^3.6|^4", "php": ">=8.2", - "symfony/messenger": "^6.4|^7.0", + "symfony/messenger": "^7.2", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -4168,7 +4191,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v7.1.11" + "source": "https://github.com/symfony/doctrine-messenger/tree/v7.3.2" }, "funding": [ { @@ -4179,25 +4202,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-07T09:23:14+00:00" + "time": "2025-07-30T17:13:41+00:00" }, { "name": "symfony/dotenv", - "version": "v7.1.9", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "245d1afe223664d2276afb75177d8988c328fb78" + "reference": "2192790a11f9e22cbcf9dc705a3ff22a5503923a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/245d1afe223664d2276afb75177d8988c328fb78", - "reference": "245d1afe223664d2276afb75177d8988c328fb78", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/2192790a11f9e22cbcf9dc705a3ff22a5503923a", + "reference": "2192790a11f9e22cbcf9dc705a3ff22a5503923a", "shasum": "" }, "require": { @@ -4242,7 +4269,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v7.1.9" + "source": "https://github.com/symfony/dotenv/tree/v7.3.2" }, "funding": [ { @@ -4253,25 +4280,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-27T11:17:28+00:00" + "time": "2025-07-10T08:29:33+00:00" }, { "name": "symfony/error-handler", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "f4d1fd1bcb4bce9983d034111b7ea3edc88e1a57" + "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/f4d1fd1bcb4bce9983d034111b7ea3edc88e1a57", - "reference": "f4d1fd1bcb4bce9983d034111b7ea3edc88e1a57", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/0b31a944fcd8759ae294da4d2808cbc53aebd0c3", + "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3", "shasum": "" }, "require": { @@ -4284,9 +4315,11 @@ "symfony/http-kernel": "<6.4" }, "require-dev": { + "symfony/console": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -4317,7 +4350,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.1.11" + "source": "https://github.com/symfony/error-handler/tree/v7.3.2" }, "funding": [ { @@ -4328,25 +4361,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-07T09:23:14+00:00" + "time": "2025-07-07T08:17:57+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.1.6", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "87254c78dd50721cfd015b62277a8281c5589702" + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", - "reference": "87254c78dd50721cfd015b62277a8281c5589702", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d", + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d", "shasum": "" }, "require": { @@ -4397,7 +4434,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.0" }, "funding": [ { @@ -4413,7 +4450,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-04-22T09:11:45+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -4493,16 +4530,16 @@ }, { "name": "symfony/expression-language", - "version": "v7.1.6", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "c3a1224bc144b36cd79149b42c1aecd5f81395a5" + "reference": "32d2d19c62e58767e6552166c32fb259975d2b23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/c3a1224bc144b36cd79149b42c1aecd5f81395a5", - "reference": "c3a1224bc144b36cd79149b42c1aecd5f81395a5", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/32d2d19c62e58767e6552166c32fb259975d2b23", + "reference": "32d2d19c62e58767e6552166c32fb259975d2b23", "shasum": "" }, "require": { @@ -4537,7 +4574,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v7.1.6" + "source": "https://github.com/symfony/expression-language/tree/v7.3.2" }, "funding": [ { @@ -4548,25 +4585,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-09T08:46:59+00:00" + "time": "2025-07-10T08:29:33+00:00" }, { "name": "symfony/filesystem", - "version": "v7.1.6", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4" + "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/c835867b3c62bb05c7fe3d637c871c7ae52024d4", - "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edcbb768a186b5c3f25d0643159a787d3e63b7fd", + "reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd", "shasum": "" }, "require": { @@ -4603,7 +4644,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.1.6" + "source": "https://github.com/symfony/filesystem/tree/v7.3.2" }, "funding": [ { @@ -4614,25 +4655,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-25T15:11:02+00:00" + "time": "2025-07-07T08:17:47+00:00" }, { "name": "symfony/finder", - "version": "v7.1.10", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "b8b526e051ac0b33feabbec7893adcab96b23bf3" + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/b8b526e051ac0b33feabbec7893adcab96b23bf3", - "reference": "b8b526e051ac0b33feabbec7893adcab96b23bf3", + "url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe", + "reference": "2a6614966ba1074fa93dae0bc804227422df4dfe", "shasum": "" }, "require": { @@ -4667,7 +4712,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.1.10" + "source": "https://github.com/symfony/finder/tree/v7.3.2" }, "funding": [ { @@ -4678,12 +4723,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-30T18:59:46+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/flex", @@ -4755,23 +4804,23 @@ }, { "name": "symfony/form", - "version": "v7.1.6", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "7a48dda96fe16711fc042df38ca1a7dd4d9d6387" + "reference": "e83e898d1589f3ec647824bd4416defe3d6e3875" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/7a48dda96fe16711fc042df38ca1a7dd4d9d6387", - "reference": "7a48dda96fe16711fc042df38ca1a7dd4d9d6387", + "url": "https://api.github.com/repos/symfony/form/zipball/e83e898d1589f3ec647824bd4416defe3d6e3875", + "reference": "e83e898d1589f3ec647824bd4416defe3d6e3875", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/options-resolver": "^6.4|^7.0", + "symfony/options-resolver": "^7.3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-icu": "^1.21", "symfony/polyfill-mbstring": "~1.0", @@ -4832,7 +4881,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v7.1.6" + "source": "https://github.com/symfony/form/tree/v7.3.2" }, "funding": [ { @@ -4843,25 +4892,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-09T08:46:59+00:00" + "time": "2025-07-24T12:10:26+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "1eae7a4e095a2a3851cb41ac2aea9aa60fba1df8" + "reference": "06c0f678129f99bda8b5cf8873b3d8ef5a0029e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1eae7a4e095a2a3851cb41ac2aea9aa60fba1df8", - "reference": "1eae7a4e095a2a3851cb41ac2aea9aa60fba1df8", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/06c0f678129f99bda8b5cf8873b3d8ef5a0029e7", + "reference": "06c0f678129f99bda8b5cf8873b3d8ef5a0029e7", "shasum": "" }, "require": { @@ -4869,15 +4922,15 @@ "ext-xml": "*", "php": ">=8.2", "symfony/cache": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^7.1.5", + "symfony/config": "^7.3", + "symfony/dependency-injection": "^7.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0", + "symfony/error-handler": "^7.3", "symfony/event-dispatcher": "^6.4|^7.0", "symfony/filesystem": "^7.1", "symfony/finder": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", + "symfony/http-kernel": "^7.2", "symfony/polyfill-mbstring": "~1.0", "symfony/routing": "^6.4|^7.0" }, @@ -4893,24 +4946,27 @@ "symfony/dotenv": "<6.4", "symfony/form": "<6.4", "symfony/http-client": "<6.4", + "symfony/json-streamer": ">=7.4", "symfony/lock": "<6.4", "symfony/mailer": "<6.4", "symfony/messenger": "<6.4", "symfony/mime": "<6.4", + "symfony/object-mapper": ">=7.4", "symfony/property-access": "<6.4", "symfony/property-info": "<6.4", "symfony/runtime": "<6.4.13|>=7.0,<7.1.6", "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", "symfony/security-core": "<6.4", - "symfony/security-csrf": "<6.4", - "symfony/serializer": "<6.4", + "symfony/security-csrf": "<7.2", + "symfony/serializer": "<7.2.5", "symfony/stopwatch": "<6.4", - "symfony/translation": "<6.4", + "symfony/translation": "<7.3", "symfony/twig-bridge": "<6.4", "symfony/twig-bundle": "<6.4", "symfony/validator": "<6.4", "symfony/web-profiler-bundle": "<6.4", - "symfony/workflow": "<6.4" + "symfony/webhook": "<7.2", + "symfony/workflow": "<7.3.0-beta2" }, "require-dev": { "doctrine/persistence": "^1.3|^2|^3", @@ -4929,11 +4985,13 @@ "symfony/form": "^6.4|^7.0", "symfony/html-sanitizer": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", + "symfony/json-streamer": "7.3.*", "symfony/lock": "^6.4|^7.0", "symfony/mailer": "^6.4|^7.0", "symfony/messenger": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", "symfony/notifier": "^6.4|^7.0", + "symfony/object-mapper": "^v7.3.0-beta2", "symfony/polyfill-intl-icu": "~1.0", "symfony/process": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", @@ -4941,18 +4999,19 @@ "symfony/scheduler": "^6.4.4|^7.0.4", "symfony/security-bundle": "^6.4|^7.0", "symfony/semaphore": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", + "symfony/serializer": "^7.2.5", "symfony/stopwatch": "^6.4|^7.0", "symfony/string": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", + "symfony/translation": "^7.3", "symfony/twig-bundle": "^6.4|^7.0", - "symfony/type-info": "^7.1", + "symfony/type-info": "^7.1.8", "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/web-link": "^6.4|^7.0", - "symfony/workflow": "^6.4|^7.0", + "symfony/webhook": "^7.2", + "symfony/workflow": "^7.3", "symfony/yaml": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "type": "symfony-bundle", "autoload": { @@ -4980,7 +5039,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v7.1.11" + "source": "https://github.com/symfony/framework-bundle/tree/v7.3.2" }, "funding": [ { @@ -4991,25 +5050,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-29T07:13:42+00:00" + "time": "2025-07-30T17:13:41+00:00" }, { "name": "symfony/http-client", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "71632c1f13b36cb4c23ccdd255946dc02753afef" + "reference": "1c064a0c67749923483216b081066642751cc2c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/71632c1f13b36cb4c23ccdd255946dc02753afef", - "reference": "71632c1f13b36cb4c23ccdd255946dc02753afef", + "url": "https://api.github.com/repos/symfony/http-client/zipball/1c064a0c67749923483216b081066642751cc2c7", + "reference": "1c064a0c67749923483216b081066642751cc2c7", "shasum": "" }, "require": { @@ -5020,6 +5083,8 @@ "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "amphp/amp": "<2.5", + "amphp/socket": "<1.1", "php-http/discovery": "<1.15", "symfony/http-foundation": "<6.4" }, @@ -5030,14 +5095,13 @@ "symfony/http-client-implementation": "3.0" }, "require-dev": { - "amphp/amp": "^2.5", - "amphp/http-client": "^4.2.1", - "amphp/http-tunnel": "^1.0", - "amphp/socket": "^1.1", + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", + "symfony/amphp-http-client-meta": "^1.0|^2.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/messenger": "^6.4|^7.0", @@ -5074,7 +5138,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.1.11" + "source": "https://github.com/symfony/http-client/tree/v7.3.2" }, "funding": [ { @@ -5085,12 +5149,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-28T15:50:57+00:00" + "time": "2025-07-15T11:36:08+00:00" }, { "name": "symfony/http-client-contracts", @@ -5172,20 +5240,21 @@ }, { "name": "symfony/http-foundation", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "7ced01aa123612666a7a4fb72c627f969c01fa8d" + "reference": "6877c122b3a6cc3695849622720054f6e6fa5fa6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7ced01aa123612666a7a4fb72c627f969c01fa8d", - "reference": "7ced01aa123612666a7a4fb72c627f969c01fa8d", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6877c122b3a6cc3695849622720054f6e6fa5fa6", + "reference": "6877c122b3a6cc3695849622720054f6e6fa5fa6", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, @@ -5197,6 +5266,7 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/expression-language": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", @@ -5229,7 +5299,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.1.11" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.2" }, "funding": [ { @@ -5240,25 +5310,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-17T10:33:21+00:00" + "time": "2025-07-10T08:47:49+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "576eb3368037dd139f67b8ac71db56c3f69f7d66" + "reference": "6ecc895559ec0097e221ed2fd5eb44d5fede083c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/576eb3368037dd139f67b8ac71db56c3f69f7d66", - "reference": "576eb3368037dd139f67b8ac71db56c3f69f7d66", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6ecc895559ec0097e221ed2fd5eb44d5fede083c", + "reference": "6ecc895559ec0097e221ed2fd5eb44d5fede083c", "shasum": "" }, "require": { @@ -5266,8 +5340,8 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", + "symfony/http-foundation": "^7.3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -5287,7 +5361,7 @@ "symfony/twig-bridge": "<6.4", "symfony/validator": "<6.4", "symfony/var-dumper": "<6.4", - "twig/twig": "<3.0.4" + "twig/twig": "<3.12" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" @@ -5315,7 +5389,7 @@ "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0", "symfony/var-exporter": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "type": "library", "autoload": { @@ -5343,7 +5417,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.1.11" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.2" }, "funding": [ { @@ -5354,25 +5428,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-29T07:34:05+00:00" + "time": "2025-07-31T10:45:04+00:00" }, { "name": "symfony/intl", - "version": "v7.1.8", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "e56b243fc0afa5a12bd11dace4002ada5a7d99f8" + "reference": "d1197fb6661b05f6178ddb2dc9c6d576f6f67ec8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/e56b243fc0afa5a12bd11dace4002ada5a7d99f8", - "reference": "e56b243fc0afa5a12bd11dace4002ada5a7d99f8", + "url": "https://api.github.com/repos/symfony/intl/zipball/d1197fb6661b05f6178ddb2dc9c6d576f6f67ec8", + "reference": "d1197fb6661b05f6178ddb2dc9c6d576f6f67ec8", "shasum": "" }, "require": { @@ -5429,7 +5507,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.1.8" + "source": "https://github.com/symfony/intl/tree/v7.3.2" }, "funding": [ { @@ -5440,25 +5518,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-08T15:46:42+00:00" + "time": "2025-07-10T08:47:49+00:00" }, { "name": "symfony/mailer", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "e3790ddd7448cc6797fbd06749db70d147992321" + "reference": "d43e84d9522345f96ad6283d5dfccc8c1cfc299b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/e3790ddd7448cc6797fbd06749db70d147992321", - "reference": "e3790ddd7448cc6797fbd06749db70d147992321", + "url": "https://api.github.com/repos/symfony/mailer/zipball/d43e84d9522345f96ad6283d5dfccc8c1cfc299b", + "reference": "d43e84d9522345f96ad6283d5dfccc8c1cfc299b", "shasum": "" }, "require": { @@ -5467,7 +5549,7 @@ "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", + "symfony/mime": "^7.2", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -5509,7 +5591,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.1.11" + "source": "https://github.com/symfony/mailer/tree/v7.3.2" }, "funding": [ { @@ -5520,46 +5602,53 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2025-07-15T11:36:08+00:00" }, { "name": "symfony/messenger", - "version": "v7.1.9", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "51e2b8b6a14b78ad7db60ef5f195ae893c16b9cc" + "reference": "f990f0d09deaa45955593be6aafbafe73b0682b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/51e2b8b6a14b78ad7db60ef5f195ae893c16b9cc", - "reference": "51e2b8b6a14b78ad7db60ef5f195ae893c16b9cc", + "url": "https://api.github.com/repos/symfony/messenger/zipball/f990f0d09deaa45955593be6aafbafe73b0682b9", + "reference": "f990f0d09deaa45955593be6aafbafe73b0682b9", "shasum": "" }, "require": { "php": ">=8.2", "psr/log": "^1|^2|^3", - "symfony/clock": "^6.4|^7.0" + "symfony/clock": "^6.4|^7.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { - "symfony/console": "<6.4", + "symfony/console": "<7.2", "symfony/event-dispatcher": "<6.4", "symfony/event-dispatcher-contracts": "<2.5", "symfony/framework-bundle": "<6.4", "symfony/http-kernel": "<6.4", + "symfony/lock": "<6.4", "symfony/serializer": "<6.4" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/console": "^6.4|^7.0", + "symfony/console": "^7.2", "symfony/dependency-injection": "^6.4|^7.0", "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", "symfony/property-access": "^6.4|^7.0", "symfony/rate-limiter": "^6.4|^7.0", @@ -5595,7 +5684,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v7.1.9" + "source": "https://github.com/symfony/messenger/tree/v7.3.2" }, "funding": [ { @@ -5606,25 +5695,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-26T09:50:51+00:00" + "time": "2025-07-15T11:36:08+00:00" }, { "name": "symfony/mime", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "c252e20d1179dd35a5bfdb4a61a2084387ce97f4" + "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/c252e20d1179dd35a5bfdb4a61a2084387ce97f4", - "reference": "c252e20d1179dd35a5bfdb4a61a2084387ce97f4", + "url": "https://api.github.com/repos/symfony/mime/zipball/e0a0f859148daf1edf6c60b398eb40bfc96697d1", + "reference": "e0a0f859148daf1edf6c60b398eb40bfc96697d1", "shasum": "" }, "require": { @@ -5679,7 +5772,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.1.11" + "source": "https://github.com/symfony/mime/tree/v7.3.2" }, "funding": [ { @@ -5690,25 +5783,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2025-07-15T13:41:35+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v7.1.6", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "e1da878cf5f701df5f5c1799bdbf827acee5a76e" + "reference": "1b188c8abbbef25b111da878797514b7a8d33990" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/e1da878cf5f701df5f5c1799bdbf827acee5a76e", - "reference": "e1da878cf5f701df5f5c1799bdbf827acee5a76e", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/1b188c8abbbef25b111da878797514b7a8d33990", + "reference": "1b188c8abbbef25b111da878797514b7a8d33990", "shasum": "" }, "require": { @@ -5757,7 +5854,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v7.1.6" + "source": "https://github.com/symfony/monolog-bridge/tree/v7.3.0" }, "funding": [ { @@ -5773,7 +5870,7 @@ "type": "tidelift" } ], - "time": "2024-10-14T08:49:35+00:00" + "time": "2025-03-21T12:17:46+00:00" }, { "name": "symfony/monolog-bundle", @@ -5858,16 +5955,16 @@ }, { "name": "symfony/notifier", - "version": "v7.1.6", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/notifier.git", - "reference": "e45a3db2dd184060fa9c0d5c0b94dfa82bc0a13f" + "reference": "9e68a3266c8b0381f8756022b1c1ba3c0264416e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/notifier/zipball/e45a3db2dd184060fa9c0d5c0b94dfa82bc0a13f", - "reference": "e45a3db2dd184060fa9c0d5c0b94dfa82bc0a13f", + "url": "https://api.github.com/repos/symfony/notifier/zipball/9e68a3266c8b0381f8756022b1c1ba3c0264416e", + "reference": "9e68a3266c8b0381f8756022b1c1ba3c0264416e", "shasum": "" }, "require": { @@ -5916,7 +6013,7 @@ "notifier" ], "support": { - "source": "https://github.com/symfony/notifier/tree/v7.1.6" + "source": "https://github.com/symfony/notifier/tree/v7.3.0" }, "funding": [ { @@ -5932,20 +6029,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-05-01T12:12:53+00:00" }, { "name": "symfony/options-resolver", - "version": "v7.1.9", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "0f4099f5306a92487d13b2a4589068c36a93c447" + "reference": "119bcf13e67dbd188e5dbc74228b1686f66acd37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0f4099f5306a92487d13b2a4589068c36a93c447", - "reference": "0f4099f5306a92487d13b2a4589068c36a93c447", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/119bcf13e67dbd188e5dbc74228b1686f66acd37", + "reference": "119bcf13e67dbd188e5dbc74228b1686f66acd37", "shasum": "" }, "require": { @@ -5983,7 +6080,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.1.9" + "source": "https://github.com/symfony/options-resolver/tree/v7.3.2" }, "funding": [ { @@ -5994,25 +6091,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-20T11:08:58+00:00" + "time": "2025-07-15T11:36:08+00:00" }, { "name": "symfony/password-hasher", - "version": "v7.1.6", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "2e618d1af51805e5a1fbda326d00b77c6c1037d5" + "reference": "31fbe66af859582a20b803f38be96be8accdf2c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/2e618d1af51805e5a1fbda326d00b77c6c1037d5", - "reference": "2e618d1af51805e5a1fbda326d00b77c6c1037d5", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/31fbe66af859582a20b803f38be96be8accdf2c3", + "reference": "31fbe66af859582a20b803f38be96be8accdf2c3", "shasum": "" }, "require": { @@ -6055,7 +6156,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.1.6" + "source": "https://github.com/symfony/password-hasher/tree/v7.3.0" }, "funding": [ { @@ -6071,7 +6172,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-02-04T08:22:58+00:00" }, { "name": "symfony/polyfill-intl-grapheme", @@ -6634,16 +6735,16 @@ }, { "name": "symfony/process", - "version": "v7.1.8", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892" + "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/42783370fda6e538771f7c7a36e9fa2ee3a84892", - "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892", + "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", + "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", "shasum": "" }, "require": { @@ -6675,7 +6776,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.1.8" + "source": "https://github.com/symfony/process/tree/v7.3.0" }, "funding": [ { @@ -6691,20 +6792,20 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:23:19+00:00" + "time": "2025-04-17T09:11:12+00:00" }, { "name": "symfony/property-access", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "83e46f0266186e76929257426ddaa151248781c6" + "reference": "317916e49b2577a1908f321796f2b67984e61eab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/83e46f0266186e76929257426ddaa151248781c6", - "reference": "83e46f0266186e76929257426ddaa151248781c6", + "url": "https://api.github.com/repos/symfony/property-access/zipball/317916e49b2577a1908f321796f2b67984e61eab", + "reference": "317916e49b2577a1908f321796f2b67984e61eab", "shasum": "" }, "require": { @@ -6751,7 +6852,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.1.11" + "source": "https://github.com/symfony/property-access/tree/v7.3.2" }, "funding": [ { @@ -6762,31 +6863,36 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-10T14:50:02+00:00" + "time": "2025-07-15T17:58:03+00:00" }, { "name": "symfony/property-info", - "version": "v7.1.11", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "df9002f8381cc074300dc2bf9726075e4bf00458" + "reference": "90586acbf2a6dd13bee4f09f09111c8bd4773970" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/df9002f8381cc074300dc2bf9726075e4bf00458", - "reference": "df9002f8381cc074300dc2bf9726075e4bf00458", + "url": "https://api.github.com/repos/symfony/property-info/zipball/90586acbf2a6dd13bee4f09f09111c8bd4773970", + "reference": "90586acbf2a6dd13bee4f09f09111c8bd4773970", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/string": "^6.4|^7.0", - "symfony/type-info": "~7.1.9|^7.2.2" + "symfony/type-info": "~7.2.8|^7.3.1" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2", @@ -6836,7 +6942,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.1.11" + "source": "https://github.com/symfony/property-info/tree/v7.3.1" }, "funding": [ { @@ -6852,20 +6958,20 @@ "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2025-06-27T19:55:54+00:00" }, { "name": "symfony/routing", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "07f6463a8ff4377944222b69b126bd5495e9d44e" + "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/07f6463a8ff4377944222b69b126bd5495e9d44e", - "reference": "07f6463a8ff4377944222b69b126bd5495e9d44e", + "url": "https://api.github.com/repos/symfony/routing/zipball/7614b8ca5fa89b9cd233e21b627bfc5774f586e4", + "reference": "7614b8ca5fa89b9cd233e21b627bfc5774f586e4", "shasum": "" }, "require": { @@ -6917,7 +7023,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.1.11" + "source": "https://github.com/symfony/routing/tree/v7.3.2" }, "funding": [ { @@ -6928,25 +7034,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-17T10:33:21+00:00" + "time": "2025-07-15T11:36:08+00:00" }, { "name": "symfony/runtime", - "version": "v7.1.7", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/runtime.git", - "reference": "9889783c17e8a68fa5e88c8e8a1a85e802558dba" + "reference": "9516056d432f8acdac9458eb41b80097da7a05c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/runtime/zipball/9889783c17e8a68fa5e88c8e8a1a85e802558dba", - "reference": "9889783c17e8a68fa5e88c8e8a1a85e802558dba", + "url": "https://api.github.com/repos/symfony/runtime/zipball/9516056d432f8acdac9458eb41b80097da7a05c9", + "reference": "9516056d432f8acdac9458eb41b80097da7a05c9", "shasum": "" }, "require": { @@ -6996,7 +7106,7 @@ "runtime" ], "support": { - "source": "https://github.com/symfony/runtime/tree/v7.1.7" + "source": "https://github.com/symfony/runtime/tree/v7.3.1" }, "funding": [ { @@ -7012,20 +7122,20 @@ "type": "tidelift" } ], - "time": "2024-11-05T16:45:54+00:00" + "time": "2025-06-13T07:48:40+00:00" }, { "name": "symfony/security-bundle", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "4012dbc0884fc7cbf555615a5aaa16f7c0d3f222" + "reference": "d8278a973b305c0b79b162f265d8ce1e96703236" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/4012dbc0884fc7cbf555615a5aaa16f7c0d3f222", - "reference": "4012dbc0884fc7cbf555615a5aaa16f7c0d3f222", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/d8278a973b305c0b79b162f265d8ce1e96703236", + "reference": "d8278a973b305c0b79b162f265d8ce1e96703236", "shasum": "" }, "require": { @@ -7033,15 +7143,15 @@ "ext-xml": "*", "php": ">=8.2", "symfony/clock": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", + "symfony/config": "^7.3", "symfony/dependency-injection": "^6.4.11|^7.1.4", "symfony/event-dispatcher": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/password-hasher": "^6.4|^7.0", - "symfony/security-core": "^6.4|^7.0", + "symfony/security-core": "^7.3", "symfony/security-csrf": "^6.4|^7.0", - "symfony/security-http": "^7.1", + "symfony/security-http": "^7.3", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -7073,7 +7183,7 @@ "symfony/twig-bundle": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", - "twig/twig": "^3.0.4", + "twig/twig": "^3.12", "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "symfony-bundle", @@ -7102,7 +7212,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v7.1.11" + "source": "https://github.com/symfony/security-bundle/tree/v7.3.2" }, "funding": [ { @@ -7113,29 +7223,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-31T17:57:35+00:00" + "time": "2025-07-22T08:15:39+00:00" }, { "name": "symfony/security-core", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "0931c6bb15b696e1a4da8405c255b3a8673dcb3c" + "reference": "d8e1bb0de26266e2e4525beda0aed7f774e9c80d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/0931c6bb15b696e1a4da8405c255b3a8673dcb3c", - "reference": "0931c6bb15b696e1a4da8405c255b3a8673dcb3c", + "url": "https://api.github.com/repos/symfony/security-core/zipball/d8e1bb0de26266e2e4525beda0aed7f774e9c80d", + "reference": "d8e1bb0de26266e2e4525beda0aed7f774e9c80d", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher-contracts": "^2.5|^3", "symfony/password-hasher": "^6.4|^7.0", "symfony/service-contracts": "^2.5|^3" @@ -7188,7 +7303,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.1.11" + "source": "https://github.com/symfony/security-core/tree/v7.3.2" }, "funding": [ { @@ -7199,25 +7314,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2025-07-23T09:11:24+00:00" }, { "name": "symfony/security-csrf", - "version": "v7.1.6", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "23b460d3447fd61970e0ed5ec7a0301296a17f06" + "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/23b460d3447fd61970e0ed5ec7a0301296a17f06", - "reference": "23b460d3447fd61970e0ed5ec7a0301296a17f06", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/2b4b0c46c901729e4e90719eacd980381f53e0a3", + "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3", "shasum": "" }, "require": { @@ -7228,7 +7347,9 @@ "symfony/http-foundation": "<6.4" }, "require-dev": { - "symfony/http-foundation": "^6.4|^7.0" + "psr/log": "^1|^2|^3", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0" }, "type": "library", "autoload": { @@ -7256,7 +7377,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v7.1.6" + "source": "https://github.com/symfony/security-csrf/tree/v7.3.0" }, "funding": [ { @@ -7272,20 +7393,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-01-02T18:42:10+00:00" }, { "name": "symfony/security-http", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "c5ef4cb3bb013cf02c1d8459d1c51bc9f616cd80" + "reference": "ca8d92035a5c8d31012458589bdaef30ef3c54d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/c5ef4cb3bb013cf02c1d8459d1c51bc9f616cd80", - "reference": "c5ef4cb3bb013cf02c1d8459d1c51bc9f616cd80", + "url": "https://api.github.com/repos/symfony/security-http/zipball/ca8d92035a5c8d31012458589bdaef30ef3c54d6", + "reference": "ca8d92035a5c8d31012458589bdaef30ef3c54d6", "shasum": "" }, "require": { @@ -7295,7 +7416,7 @@ "symfony/http-kernel": "^6.4|^7.0", "symfony/polyfill-mbstring": "~1.0", "symfony/property-access": "^6.4|^7.0", - "symfony/security-core": "^6.4|^7.0", + "symfony/security-core": "^7.3", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -7344,7 +7465,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.1.11" + "source": "https://github.com/symfony/security-http/tree/v7.3.2" }, "funding": [ { @@ -7355,25 +7476,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-28T15:50:57+00:00" + "time": "2025-07-10T08:47:49+00:00" }, { "name": "symfony/serializer", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "cb88edf0d4d63472c50b5f77bcb3227a103966e6" + "reference": "0ed011583fd24899fa003abf77c45d4a901714da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/cb88edf0d4d63472c50b5f77bcb3227a103966e6", - "reference": "cb88edf0d4d63472c50b5f77bcb3227a103966e6", + "url": "https://api.github.com/repos/symfony/serializer/zipball/0ed011583fd24899fa003abf77c45d4a901714da", + "reference": "0ed011583fd24899fa003abf77c45d4a901714da", "shasum": "" }, "require": { @@ -7387,7 +7512,6 @@ "symfony/dependency-injection": "<6.4", "symfony/property-access": "<6.4", "symfony/property-info": "<6.4", - "symfony/type-info": "<7.1.5", "symfony/uid": "<6.4", "symfony/validator": "<6.4", "symfony/yaml": "<6.4" @@ -7399,7 +7523,7 @@ "symfony/cache": "^6.4|^7.0", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dependency-injection": "^7.2", "symfony/error-handler": "^6.4|^7.0", "symfony/filesystem": "^6.4|^7.0", "symfony/form": "^6.4|^7.0", @@ -7410,7 +7534,7 @@ "symfony/property-access": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/type-info": "^7.1.5", + "symfony/type-info": "^7.1.8", "symfony/uid": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0", @@ -7443,7 +7567,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v7.1.11" + "source": "https://github.com/symfony/serializer/tree/v7.3.2" }, "funding": [ { @@ -7454,12 +7578,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-29T07:13:42+00:00" + "time": "2025-07-26T13:07:17+00:00" }, { "name": "symfony/service-contracts", @@ -7619,16 +7747,16 @@ }, { "name": "symfony/stopwatch", - "version": "v7.1.6", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05" + "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8b4a434e6e7faf6adedffb48783a5c75409a1a05", - "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", + "reference": "5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd", "shasum": "" }, "require": { @@ -7661,7 +7789,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.1.6" + "source": "https://github.com/symfony/stopwatch/tree/v7.3.0" }, "funding": [ { @@ -7677,20 +7805,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-02-24T10:49:57+00:00" }, { "name": "symfony/string", - "version": "v7.1.8", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281" + "reference": "42f505aff654e62ac7ac2ce21033818297ca89ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/591ebd41565f356fcd8b090fe64dbb5878f50281", - "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281", + "url": "https://api.github.com/repos/symfony/string/zipball/42f505aff654e62ac7ac2ce21033818297ca89ca", + "reference": "42f505aff654e62ac7ac2ce21033818297ca89ca", "shasum": "" }, "require": { @@ -7748,7 +7876,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.8" + "source": "https://github.com/symfony/string/tree/v7.3.2" }, "funding": [ { @@ -7759,33 +7887,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-13T13:31:21+00:00" + "time": "2025-07-10T08:47:49+00:00" }, { "name": "symfony/translation", - "version": "v7.1.6", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f" + "reference": "81b48f4daa96272efcce9c7a6c4b58e629df3c90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/b9f72ab14efdb6b772f85041fa12f820dee8d55f", - "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f", + "url": "https://api.github.com/repos/symfony/translation/zipball/81b48f4daa96272efcce9c7a6c4b58e629df3c90", + "reference": "81b48f4daa96272efcce9c7a6c4b58e629df3c90", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { + "nikic/php-parser": "<5.0", "symfony/config": "<6.4", "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", @@ -7799,7 +7933,7 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", @@ -7842,7 +7976,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.1.6" + "source": "https://github.com/symfony/translation/tree/v7.3.2" }, "funding": [ { @@ -7853,12 +7987,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-28T12:35:13+00:00" + "time": "2025-07-30T17:31:46+00:00" }, { "name": "symfony/translation-contracts", @@ -7940,22 +8078,23 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.1.10", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "c027c54611cd194273b924c8d24d9706695171ff" + "reference": "81d1c69769cf913240afdd4c9673304ddca964b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/c027c54611cd194273b924c8d24d9706695171ff", - "reference": "c027c54611cd194273b924c8d24d9706695171ff", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/81d1c69769cf913240afdd4c9673304ddca964b0", + "reference": "81d1c69769cf913240afdd4c9673304ddca964b0", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^3.9" + "twig/twig": "^3.21" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", @@ -7980,9 +8119,9 @@ "symfony/emoji": "^7.1", "symfony/expression-language": "^6.4|^7.0", "symfony/finder": "^6.4|^7.0", - "symfony/form": "^6.4|^7.0", + "symfony/form": "^6.4.20|^7.2.5", "symfony/html-sanitizer": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-foundation": "^7.3", "symfony/http-kernel": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", @@ -7996,12 +8135,13 @@ "symfony/serializer": "^6.4.3|^7.0.3", "symfony/stopwatch": "^6.4|^7.0", "symfony/translation": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", "symfony/web-link": "^6.4|^7.0", "symfony/workflow": "^6.4|^7.0", "symfony/yaml": "^6.4|^7.0", - "twig/cssinliner-extra": "^2.12|^3", - "twig/inky-extra": "^2.12|^3", - "twig/markdown-extra": "^2.12|^3" + "twig/cssinliner-extra": "^3", + "twig/inky-extra": "^3", + "twig/markdown-extra": "^3" }, "type": "symfony-bridge", "autoload": { @@ -8029,7 +8169,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.1.10" + "source": "https://github.com/symfony/twig-bridge/tree/v7.3.2" }, "funding": [ { @@ -8040,36 +8180,40 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-19T14:23:39+00:00" + "time": "2025-07-26T16:47:03+00:00" }, { "name": "symfony/twig-bundle", - "version": "v7.1.6", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "af902314a71fb412ae412094f7e1d7e49594507b" + "reference": "5d85220df4d8d79e6a9ca57eea6f70004de39657" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/af902314a71fb412ae412094f7e1d7e49594507b", - "reference": "af902314a71fb412ae412094f7e1d7e49594507b", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/5d85220df4d8d79e6a9ca57eea6f70004de39657", + "reference": "5d85220df4d8d79e6a9ca57eea6f70004de39657", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "php": ">=8.2", - "symfony/config": "^6.4|^7.0", + "symfony/config": "^7.3", "symfony/dependency-injection": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", - "symfony/twig-bridge": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "symfony/twig-bridge": "^7.3", + "twig/twig": "^3.12" }, "conflict": { "symfony/framework-bundle": "<6.4", @@ -8113,7 +8257,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v7.1.6" + "source": "https://github.com/symfony/twig-bundle/tree/v7.3.2" }, "funding": [ { @@ -8124,40 +8268,41 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-07-10T08:47:49+00:00" }, { "name": "symfony/type-info", - "version": "v7.1.10", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "8f980bdd1d6a2834503afbfcf3f39de8133e48fe" + "reference": "b72d44c7d6638480fce101b7c4cd3abea4c2efba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/8f980bdd1d6a2834503afbfcf3f39de8133e48fe", - "reference": "8f980bdd1d6a2834503afbfcf3f39de8133e48fe", + "url": "https://api.github.com/repos/symfony/type-info/zipball/b72d44c7d6638480fce101b7c4cd3abea4c2efba", + "reference": "b72d44c7d6638480fce101b7c4cd3abea4c2efba", "shasum": "" }, "require": { "php": ">=8.2", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { - "phpstan/phpdoc-parser": "<1.0", - "symfony/dependency-injection": "<6.4", - "symfony/property-info": "<6.4" + "phpstan/phpdoc-parser": "<1.30" }, "require-dev": { - "phpstan/phpdoc-parser": "^1.0|^2.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0" + "phpstan/phpdoc-parser": "^1.30|^2.0" }, "type": "library", "autoload": { @@ -8195,7 +8340,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.1.10" + "source": "https://github.com/symfony/type-info/tree/v7.3.2" }, "funding": [ { @@ -8206,12 +8351,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-12-11T12:11:39+00:00" + "time": "2025-07-10T05:39:45+00:00" }, { "name": "symfony/ux-turbo", @@ -8318,16 +8467,16 @@ }, { "name": "symfony/validator", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "bb226e43829a6554cf891bd7c176dc73d49bc6c1" + "reference": "e5cc60fd44aab8e1d662fc0d954da322c2e08b43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/bb226e43829a6554cf891bd7c176dc73d49bc6c1", - "reference": "bb226e43829a6554cf891bd7c176dc73d49bc6c1", + "url": "https://api.github.com/repos/symfony/validator/zipball/e5cc60fd44aab8e1d662fc0d954da322c2e08b43", + "reference": "e5cc60fd44aab8e1d662fc0d954da322c2e08b43", "shasum": "" }, "require": { @@ -8364,8 +8513,9 @@ "symfony/mime": "^6.4|^7.0", "symfony/property-access": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0", "symfony/translation": "^6.4.3|^7.0.3", - "symfony/type-info": "^7.1", + "symfony/type-info": "^7.1.8", "symfony/yaml": "^6.4|^7.0" }, "type": "library", @@ -8395,7 +8545,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.1.11" + "source": "https://github.com/symfony/validator/tree/v7.3.2" }, "funding": [ { @@ -8406,41 +8556,45 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-28T15:50:57+00:00" + "time": "2025-07-29T20:02:46+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "a563c5aeacb98cd46f9885a63cf241ea7794b307" + "reference": "53205bea27450dc5c65377518b3275e126d45e75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a563c5aeacb98cd46f9885a63cf241ea7794b307", - "reference": "a563c5aeacb98cd46f9885a63cf241ea7794b307", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/53205bea27450dc5c65377518b3275e126d45e75", + "reference": "53205bea27450dc5c65377518b3275e126d45e75", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "symfony/console": "<6.4" }, "require-dev": { - "ext-iconv": "*", "symfony/console": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/process": "^6.4|^7.0", "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.0.4" + "twig/twig": "^3.12" }, "bin": [ "Resources/bin/var-dump-server" @@ -8478,7 +8632,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.1.11" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.2" }, "funding": [ { @@ -8489,29 +8643,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-17T11:38:41+00:00" + "time": "2025-07-29T20:02:46+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.1.6", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "90173ef89c40e7c8c616653241048705f84130ef" + "reference": "05b3e90654c097817325d6abd284f7938b05f467" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/90173ef89c40e7c8c616653241048705f84130ef", - "reference": "90173ef89c40e7c8c616653241048705f84130ef", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/05b3e90654c097817325d6abd284f7938b05f467", + "reference": "05b3e90654c097817325d6abd284f7938b05f467", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { "symfony/property-access": "^6.4|^7.0", @@ -8554,7 +8713,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.1.6" + "source": "https://github.com/symfony/var-exporter/tree/v7.3.2" }, "funding": [ { @@ -8565,25 +8724,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-07-10T08:47:49+00:00" }, { "name": "symfony/web-link", - "version": "v7.1.6", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/web-link.git", - "reference": "383aa7566f25e3a1ab323732c2cc6a1748120d3a" + "reference": "7697f74fce67555665339423ce453cc8216a98ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-link/zipball/383aa7566f25e3a1ab323732c2cc6a1748120d3a", - "reference": "383aa7566f25e3a1ab323732c2cc6a1748120d3a", + "url": "https://api.github.com/repos/symfony/web-link/zipball/7697f74fce67555665339423ce453cc8216a98ff", + "reference": "7697f74fce67555665339423ce453cc8216a98ff", "shasum": "" }, "require": { @@ -8637,7 +8800,7 @@ "push" ], "support": { - "source": "https://github.com/symfony/web-link/tree/v7.1.6" + "source": "https://github.com/symfony/web-link/tree/v7.3.0" }, "funding": [ { @@ -8653,24 +8816,25 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-05-19T13:28:18+00:00" }, { "name": "symfony/yaml", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4921b8c1db90c13ba2ee0520080ef6800912b018" + "reference": "b8d7d868da9eb0919e99c8830431ea087d6aae30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4921b8c1db90c13ba2ee0520080ef6800912b018", - "reference": "4921b8c1db90c13ba2ee0520080ef6800912b018", + "url": "https://api.github.com/repos/symfony/yaml/zipball/b8d7d868da9eb0919e99c8830431ea087d6aae30", + "reference": "b8d7d868da9eb0919e99c8830431ea087d6aae30", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -8708,7 +8872,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.11" + "source": "https://github.com/symfony/yaml/tree/v7.3.2" }, "funding": [ { @@ -8719,12 +8883,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-07T12:50:05+00:00" + "time": "2025-07-10T08:47:49+00:00" }, { "name": "twig/extra-bundle", @@ -9510,57 +9678,59 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.66.0", + "version": "v3.85.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "5f5f2a142ff36b93c41885bca29cc5f861c013e6" + "reference": "2fb6d7f6c3398dca5786a1635b27405d73a417ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/5f5f2a142ff36b93c41885bca29cc5f861c013e6", - "reference": "5f5f2a142ff36b93c41885bca29cc5f861c013e6", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2fb6d7f6c3398dca5786a1635b27405d73a417ba", + "reference": "2fb6d7f6c3398dca5786a1635b27405d73a417ba", "shasum": "" }, "require": { - "clue/ndjson-react": "^1.0", + "clue/ndjson-react": "^1.3", "composer/semver": "^3.4", - "composer/xdebug-handler": "^3.0.3", + "composer/xdebug-handler": "^3.0.5", "ext-filter": "*", + "ext-hash": "*", "ext-json": "*", "ext-tokenizer": "*", "fidry/cpu-core-counter": "^1.2", "php": "^7.4 || ^8.0", - "react/child-process": "^0.6.5", - "react/event-loop": "^1.0", - "react/promise": "^2.0 || ^3.0", - "react/socket": "^1.0", - "react/stream": "^1.0", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0", - "symfony/console": "^5.4 || ^6.0 || ^7.0", - "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", - "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", - "symfony/finder": "^5.4 || ^6.0 || ^7.0", - "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", - "symfony/polyfill-mbstring": "^1.28", - "symfony/polyfill-php80": "^1.28", - "symfony/polyfill-php81": "^1.28", - "symfony/process": "^5.4 || ^6.0 || ^7.0 <7.2", - "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" + "react/child-process": "^0.6.6", + "react/event-loop": "^1.5", + "react/promise": "^3.2", + "react/socket": "^1.16", + "react/stream": "^1.4", + "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0", + "symfony/console": "^5.4.47 || ^6.4.13 || ^7.0", + "symfony/event-dispatcher": "^5.4.45 || ^6.4.13 || ^7.0", + "symfony/filesystem": "^5.4.45 || ^6.4.13 || ^7.0", + "symfony/finder": "^5.4.45 || ^6.4.17 || ^7.0", + "symfony/options-resolver": "^5.4.45 || ^6.4.16 || ^7.0", + "symfony/polyfill-mbstring": "^1.32", + "symfony/polyfill-php80": "^1.32", + "symfony/polyfill-php81": "^1.32", + "symfony/process": "^5.4.47 || ^6.4.20 || ^7.2", + "symfony/stopwatch": "^5.4.45 || ^6.4.19 || ^7.0" }, "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.4", - "infection/infection": "^0.29.8", - "justinrainbow/json-schema": "^5.3 || ^6.0", - "keradus/cli-executor": "^2.1", + "facile-it/paraunit": "^1.3.1 || ^2.6", + "infection/infection": "^0.29.14", + "justinrainbow/json-schema": "^5.3 || ^6.4", + "keradus/cli-executor": "^2.2", "mikey179/vfsstream": "^1.6.12", - "php-coveralls/php-coveralls": "^2.7", + "php-coveralls/php-coveralls": "^2.8", "php-cs-fixer/accessible-object": "^1.1", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", - "phpunit/phpunit": "^9.6.21 || ^10.5.38 || ^11.4.3", - "symfony/var-dumper": "^5.4.47 || ^6.4.15 || ^7.1.8", - "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.1.6" + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", + "phpunit/phpunit": "^9.6.23 || ^10.5.47 || ^11.5.25", + "symfony/polyfill-php84": "^1.32", + "symfony/var-dumper": "^5.4.48 || ^6.4.23 || ^7.3.1", + "symfony/yaml": "^5.4.45 || ^6.4.23 || ^7.3.1" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -9601,7 +9771,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.66.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.85.1" }, "funding": [ { @@ -9609,7 +9779,7 @@ "type": "github" } ], - "time": "2024-12-29T13:46:23+00:00" + "time": "2025-07-29T22:22:50+00:00" }, { "name": "masterminds/html5", @@ -12036,16 +12206,16 @@ }, { "name": "symfony/browser-kit", - "version": "v7.1.6", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "714becc9ba9b20115ffededc58f6b7172dc394cf" + "reference": "f0b889b73a845cddef1d25fe207b37fd04cb5419" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/714becc9ba9b20115ffededc58f6b7172dc394cf", - "reference": "714becc9ba9b20115ffededc58f6b7172dc394cf", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/f0b889b73a845cddef1d25fe207b37fd04cb5419", + "reference": "f0b889b73a845cddef1d25fe207b37fd04cb5419", "shasum": "" }, "require": { @@ -12084,7 +12254,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v7.1.6" + "source": "https://github.com/symfony/browser-kit/tree/v7.3.2" }, "funding": [ { @@ -12095,25 +12265,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-25T15:11:02+00:00" + "time": "2025-07-10T08:47:49+00:00" }, { "name": "symfony/css-selector", - "version": "v7.1.6", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66" + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", - "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", "shasum": "" }, "require": { @@ -12149,7 +12323,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.6" + "source": "https://github.com/symfony/css-selector/tree/v7.3.0" }, "funding": [ { @@ -12165,36 +12339,33 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/debug-bundle", - "version": "v7.1.6", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "c91a650aa390071d22dfaf32c2ff77fda27e9583" + "reference": "781acc90f31f5fe18915f9276890864ebbbe3da8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/c91a650aa390071d22dfaf32c2ff77fda27e9583", - "reference": "c91a650aa390071d22dfaf32c2ff77fda27e9583", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/781acc90f31f5fe18915f9276890864ebbbe3da8", + "reference": "781acc90f31f5fe18915f9276890864ebbbe3da8", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.1", "ext-xml": "*", "php": ">=8.2", + "symfony/config": "^7.3", "symfony/dependency-injection": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/twig-bridge": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0" }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4" - }, "require-dev": { - "symfony/config": "^6.4|^7.0", "symfony/web-profiler-bundle": "^6.4|^7.0" }, "type": "symfony-bundle", @@ -12223,7 +12394,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v7.1.6" + "source": "https://github.com/symfony/debug-bundle/tree/v7.3.0" }, "funding": [ { @@ -12239,20 +12410,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-05-04T13:21:13+00:00" }, { "name": "symfony/dom-crawler", - "version": "v7.1.11", + "version": "v7.3.1", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "7361d8f7e7eecbca17efe68ca1ee677bf23cfe5a" + "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7361d8f7e7eecbca17efe68ca1ee677bf23cfe5a", - "reference": "7361d8f7e7eecbca17efe68ca1ee677bf23cfe5a", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", + "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", "shasum": "" }, "require": { @@ -12290,7 +12461,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.1.11" + "source": "https://github.com/symfony/dom-crawler/tree/v7.3.1" }, "funding": [ { @@ -12306,7 +12477,7 @@ "type": "tidelift" } ], - "time": "2025-01-27T10:57:12+00:00" + "time": "2025-06-15T10:07:06+00:00" }, { "name": "symfony/maker-bundle", @@ -12488,31 +12659,35 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v7.1.11", + "version": "v7.3.2", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "328b2728bb5d85d0d38b18d1458834098202afe2" + "reference": "c5e02451fe4e430c5067ddbf0899493522782390" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/328b2728bb5d85d0d38b18d1458834098202afe2", - "reference": "328b2728bb5d85d0d38b18d1458834098202afe2", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/c5e02451fe4e430c5067ddbf0899493522782390", + "reference": "c5e02451fe4e430c5067ddbf0899493522782390", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.1", "php": ">=8.2", - "symfony/config": "^6.4|^7.0", + "symfony/config": "^7.3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/framework-bundle": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", "symfony/routing": "^6.4|^7.0", "symfony/twig-bundle": "^6.4|^7.0", - "twig/twig": "^3.10" + "twig/twig": "^3.12" }, "conflict": { "symfony/form": "<6.4", "symfony/mailer": "<6.4", - "symfony/messenger": "<6.4" + "symfony/messenger": "<6.4", + "symfony/serializer": "<7.2", + "symfony/workflow": "<7.3" }, "require-dev": { "symfony/browser-kit": "^6.4|^7.0", @@ -12549,7 +12724,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.1.11" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.3.2" }, "funding": [ { @@ -12560,12 +12735,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2025-01-07T09:23:14+00:00" + "time": "2025-07-26T16:47:03+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/packages/csrf.yaml b/config/packages/csrf.yaml new file mode 100644 index 0000000..40d4040 --- /dev/null +++ b/config/packages/csrf.yaml @@ -0,0 +1,11 @@ +# Enable stateless CSRF protection for forms and logins/logouts +framework: + form: + csrf_protection: + token_id: submit + + csrf_protection: + stateless_token_ids: + - submit + - authenticate + - logout diff --git a/config/packages/property_info.yaml b/config/packages/property_info.yaml new file mode 100644 index 0000000..dd31b9d --- /dev/null +++ b/config/packages/property_info.yaml @@ -0,0 +1,3 @@ +framework: + property_info: + with_constructor_extractor: true diff --git a/config/packages/ux_turbo.yaml b/config/packages/ux_turbo.yaml new file mode 100644 index 0000000..c2a6a44 --- /dev/null +++ b/config/packages/ux_turbo.yaml @@ -0,0 +1,4 @@ +# Enable stateless CSRF protection for forms and logins/logouts +framework: + csrf_protection: + check_header: true diff --git a/phpstan.dist.neon b/phpstan.dist.neon new file mode 100644 index 0000000..e0de575 --- /dev/null +++ b/phpstan.dist.neon @@ -0,0 +1,8 @@ +parameters: + level: 6 + paths: + - bin/ + - config/ + - public/ + - src/ + - tests/ diff --git a/public/lib/app/app.css b/public/lib/app/app.css index c457699..41138cc 100644 --- a/public/lib/app/app.css +++ b/public/lib/app/app.css @@ -105,4 +105,8 @@ content { margin-bottom: 2px; margin-right: 2px; padding: 3px; +} + +small { + font-size: 80%; } \ No newline at end of file diff --git a/src/Controller/ProjectController.php b/src/Controller/ProjectController.php index 826eb01..848ed0b 100644 --- a/src/Controller/ProjectController.php +++ b/src/Controller/ProjectController.php @@ -3,9 +3,9 @@ namespace App\Controller; use App\Entity\Project; -use App\Entity\User; use App\Form\ProjectType; use App\Repository\ProjectRepository; +use App\Security\ProjectVoter; use Bnine\FilesBundle\Service\FileService; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; @@ -39,11 +39,16 @@ class ProjectController extends AbstractController } #[Route('/admin/project/submit', name: 'app_admin_project_submit')] + #[Route('/user/project/submit', name: 'app_user_project_submit')] public function submit(Request $request, EntityManagerInterface $em): Response { $project = new Project(); $project->addUser($this->getUser()); + $project->setStatus(Project::DRAFT); + $this->denyAccessUnlessGranted(ProjectVoter::SUBMIT, $project); + + $isAdmin = str_starts_with($request->attributes->get('_route'), 'app_admin'); $form = $this->createForm(ProjectType::class, $project, ['mode' => 'submit']); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { @@ -51,21 +56,22 @@ class ProjectController extends AbstractController $em->flush(); $this->fileService->init('project', $project->getId()); - return $this->redirectToRoute('app_admin_project'); + return $this->redirectToRoute($isAdmin ? 'app_admin_project' : 'app_user_update', ['id' => $project->getId()]); } return $this->render('project/edit.html.twig', [ 'usemenu' => true, 'usesidebar' => true, 'title' => 'Création Projet', - 'routecancel' => 'app_admin_project', - 'routedelete' => 'app_admin_project_delete', + 'routecancel' => $isAdmin ? 'app_admin_project' : 'app_home', + 'routedelete' => $isAdmin ? 'app_admin_project_delete' : 'app_user_project_delete', 'mode' => 'submit', 'form' => $form, ]); } #[Route('/admin/project/update/{id}', name: 'app_admin_project_update')] + #[Route('/user/project/update/{id}', name: 'app_user_project_update')] public function update(int $id, Request $request, ProjectRepository $projectRepository, EntityManagerInterface $em): Response { $project = $projectRepository->find($id); @@ -73,20 +79,23 @@ class ProjectController extends AbstractController throw new NotFoundHttpException('La ressource demandée est introuvable.'); } + $this->denyAccessUnlessGranted(ProjectVoter::UPDATE, $project); + + $isAdmin = str_starts_with($request->attributes->get('_route'), 'app_admin'); $form = $this->createForm(ProjectType::class, $project, ['mode' => 'update']); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $em->flush(); - // return $this->redirectToRoute('app_admin_project'); + return $this->redirectToRoute($isAdmin ? 'app_admin_project' : 'app_home'); } return $this->render('project/edit.html.twig', [ 'usemenu' => true, - 'usesidebar' => true, + 'usesidebar' => $isAdmin, 'title' => 'Modification Projet = '.$project->getTitle(), - 'routecancel' => 'app_admin_project', - 'routedelete' => 'app_admin_project_delete', + 'routecancel' => $isAdmin ? 'app_admin_project' : 'app_home', + 'routedelete' => $isAdmin ? 'app_admin_project_delete' : 'app_user_project_delete', 'mode' => 'update', 'form' => $form, 'project' => $project, @@ -94,18 +103,17 @@ class ProjectController extends AbstractController } #[Route('/admin/project/delete/{id}', name: 'app_admin_project_delete')] - public function delete(int $id, ProjectRepository $projectRepository, EntityManagerInterface $em): Response + #[Route('/user/project/delete/{id}', name: 'app_user_project_delete')] + public function delete(int $id, Request $request, ProjectRepository $projectRepository, EntityManagerInterface $em): Response { $project = $projectRepository->find($id); if (!$project) { throw new NotFoundHttpException('La ressource demandée est introuvable.'); } - $users = $em->getRepository(User::class)->findBy(['project' => $project]); - foreach ($users as $user) { - $user->setProject(null); - $em->flush(); - } + $this->denyAccessUnlessGranted(ProjectVoter::DELETE, $project); + + $isAdmin = str_starts_with($request->attributes->get('_route'), 'app_admin'); // Tentative de suppression try { @@ -114,9 +122,9 @@ class ProjectController extends AbstractController } catch (\Exception $e) { $this->addflash('error', $e->getMessage()); - return $this->redirectToRoute('app_admin_project_update', ['id' => $id]); + return $this->redirectToRoute($isAdmin ? 'app_admin_project' : 'app_user_update', ['id' => $project->getId()]); } - return $this->redirectToRoute('app_admin_project'); + return $this->redirectToRoute($isAdmin ? 'app_admin_project' : 'app_home'); } } diff --git a/src/Entity/Project.php b/src/Entity/Project.php index 9291f5f..07ae03d 100644 --- a/src/Entity/Project.php +++ b/src/Entity/Project.php @@ -25,7 +25,7 @@ class Project #[ORM\Column] private ?int $id = null; - #[ORM\Column(length: 255, unique: true)] + #[ORM\Column(length: 255)] private ?string $title = null; #[ORM\Column(type: 'text')] diff --git a/src/Form/ProjectType.php b/src/Form/ProjectType.php index 5acf4ea..9b5abf3 100644 --- a/src/Form/ProjectType.php +++ b/src/Form/ProjectType.php @@ -32,16 +32,6 @@ class ProjectType extends AbstractType 'label' => 'Résumé', ]) - ->add('status', ChoiceType::class, [ - 'label' => 'Statut', - 'choices' => [ - Project::DRAFT => Project::DRAFT, - Project::TOVOTE => Project::TOVOTE, - Project::VOTED => Project::VOTED, - Project::ARCHIVED => Project::ARCHIVED, - ], - ]) - ->add('nature', ChoiceType::class, [ 'label' => 'Nature', 'choices' => [ @@ -51,11 +41,6 @@ class ProjectType extends AbstractType ], ]) - ->add('description', MarkdownType::class, [ - 'label' => 'Description du Projet', - 'markdown_height' => 900, - ]) - ->add('users', EntityType::class, [ 'label' => 'Propriétaires', 'class' => User::class, @@ -65,6 +50,14 @@ class ProjectType extends AbstractType 'required' => false, 'by_reference' => false, ]); + + if ('update' == $options['mode']) { + $builder + ->add('description', MarkdownType::class, [ + 'label' => 'Description du Projet', + 'markdown_height' => 900, + ]); + } } public function configureOptions(OptionsResolver $resolver): void diff --git a/src/Security/ProjectVoter.php b/src/Security/ProjectVoter.php index b8012a4..1b32d90 100644 --- a/src/Security/ProjectVoter.php +++ b/src/Security/ProjectVoter.php @@ -10,14 +10,15 @@ use Symfony\Component\Security\Core\Authorization\Voter\Voter; class ProjectVoter extends Voter { // Les actions que ce voter supporte - private const EDIT = 'EDIT'; - private const VIEW = 'VIEW'; - private const DELETE = 'DELETE'; - private const MOVEDRAFT = 'MOVEDRAFT'; + public const VIEW = 'VIEW'; + public const SUBMIT = 'SUBMIT'; + public const UPDATE = 'UPDATE'; + public const DELETE = 'DELETE'; + public const MOVEDRAFT = 'MOVEDRAFT'; protected function supports(string $attribute, $subject): bool { - $attributes = [self::EDIT, self::VIEW, self::DELETE, self::MOVEDRAFT]; + $attributes = [self::VIEW, self::SUBMIT, self::UPDATE, self::DELETE, self::MOVEDRAFT]; return in_array($attribute, $attributes) && $subject instanceof Project; } @@ -27,7 +28,12 @@ class ProjectVoter extends Voter return true; } - private function canEdit(Project $project, User $user): bool + private function canSubmit(Project $project, User $user): bool + { + return true; + } + + private function canUpdate(Project $project, User $user): bool { return $user->hasRole('ROLE_ADMIN') || (Project::DRAFT === $project->getStatus() && $project->getUsers()->contains($user)); } @@ -51,7 +57,8 @@ class ProjectVoter extends Voter return match ($attribute) { self::VIEW => $this->canView($project, $user), - self::EDIT => $this->canEdit($project, $user), + self::SUBMIT => $this->canSubmit($project, $user), + self::UPDATE => $this->canUpdate($project, $user), self::DELETE => $this->canDelete($project, $user), self::MOVEDRAFT => $this->canMoveDraft($project, $user), default => false, diff --git a/symfony.lock b/symfony.lock index d2e316b..8916319 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,12 +1,9 @@ { - "bnine/files-bundle": { - "version": "v1.0.1" - }, "bnine/filesbundle": { - "version": "v1.0.4" + "version": "v1.0.6" }, "bnine/mdeditorbundle": { - "version": "v1.1.1" + "version": "v1.1.5" }, "doctrine/deprecations": { "version": "1.1", @@ -18,12 +15,12 @@ } }, "doctrine/doctrine-bundle": { - "version": "2.13", + "version": "2.15", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", "version": "2.13", - "ref": "8d96c0b51591ffc26794d865ba3ee7d193438a83" + "ref": "620b57f496f2e599a6015a9fa222c2ee0a32adcb" }, "files": [ "config/packages/doctrine.yaml", @@ -32,7 +29,7 @@ ] }, "doctrine/doctrine-migrations-bundle": { - "version": "3.3", + "version": "3.4", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -45,7 +42,7 @@ ] }, "friendsofphp/php-cs-fixer": { - "version": "3.65", + "version": "3.85", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -82,7 +79,7 @@ ] }, "phpstan/phpstan": { - "version": "2.0", + "version": "2.1", "recipe": { "repo": "github.com/symfony/recipes-contrib", "branch": "main", @@ -99,7 +96,7 @@ "repo": "github.com/symfony/recipes", "branch": "main", "version": "9.6", - "ref": "7364a21d87e658eb363c5020c072ecfdc12e2326" + "ref": "6a9341aa97d441627f8bd424ae85dc04c944f8b4" }, "files": [ ".env.test", @@ -108,7 +105,7 @@ ] }, "symfony/console": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -120,7 +117,7 @@ ] }, "symfony/debug-bundle": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -132,24 +129,37 @@ ] }, "symfony/flex": { - "version": "2.4", + "version": "2.8", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "1.0", - "ref": "146251ae39e06a95be0fe3d13c807bcf3938b172" + "version": "2.4", + "ref": "52e9754527a15e2b79d9a610f98185a1fe46622a" }, "files": [ - ".env" + ".env", + ".env.dev" + ] + }, + "symfony/form": { + "version": "7.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.2", + "ref": "7d86a6723f4a623f59e2bf966b6aad2fc461d36b" + }, + "files": [ + "config/packages/csrf.yaml" ] }, "symfony/framework-bundle": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "7.0", - "ref": "6356c19b9ae08e7763e4ba2d9ae63043efc75db5" + "version": "7.3", + "ref": "5a1497d539f691b96afd45ae397ce5fe30beb4b9" }, "files": [ "config/packages/cache.yaml", @@ -159,23 +169,24 @@ "config/services.yaml", "public/index.php", "src/Controller/.gitignore", - "src/Kernel.php" + "src/Kernel.php", + ".editorconfig" ] }, "symfony/mailer": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", "version": "4.3", - "ref": "df66ee1f226c46f01e85c29c2f7acce0596ba35a" + "ref": "09051cfde49476e3c12cd3a0e44289ace1c75a4f" }, "files": [ "config/packages/mailer.yaml" ] }, "symfony/maker-bundle": { - "version": "1.61", + "version": "1.64", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -184,7 +195,7 @@ } }, "symfony/messenger": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -208,7 +219,7 @@ ] }, "symfony/notifier": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -220,7 +231,7 @@ ] }, "symfony/phpunit-bridge": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -234,8 +245,20 @@ "tests/bootstrap.php" ] }, + "symfony/property-info": { + "version": "7.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.3", + "ref": "dae70df71978ae9226ae915ffd5fad817f5ca1f7" + }, + "files": [ + "config/packages/property_info.yaml" + ] + }, "symfony/routing": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -248,7 +271,7 @@ ] }, "symfony/security-bundle": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -261,26 +284,27 @@ ] }, "symfony/stimulus-bundle": { - "version": "2.21", + "version": "2.28", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "2.13", - "ref": "6acd9ff4f7fd5626d2962109bd4ebab351d43c43" + "version": "2.20", + "ref": "e058471c5502e549c1404ebdd510099107bb5549" }, "files": [ "assets/bootstrap.js", "assets/controllers.json", + "assets/controllers/csrf_protection_controller.js", "assets/controllers/hello_controller.js" ] }, "symfony/translation": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", "version": "6.3", - "ref": "e28e27f53663cc34f0be2837aba18e3a1bef8e7b" + "ref": "620a1b84865ceb2ba304c8f8bf2a185fbf32a843" }, "files": [ "config/packages/translation.yaml", @@ -288,7 +312,7 @@ ] }, "symfony/twig-bundle": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -301,10 +325,19 @@ ] }, "symfony/ux-turbo": { - "version": "v2.21.0" + "version": "2.28", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "2.20", + "ref": "287f7c6eb6e9b65e422d34c00795b360a787380b" + }, + "files": [ + "config/packages/ux_turbo.yaml" + ] }, "symfony/validator": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", @@ -316,12 +349,12 @@ ] }, "symfony/web-profiler-bundle": { - "version": "7.1", + "version": "7.3", "recipe": { "repo": "github.com/symfony/recipes", "branch": "main", - "version": "6.1", - "ref": "e42b3f0177df239add25373083a564e5ead4e13a" + "version": "7.3", + "ref": "a363460c1b0b4a4d0242f2ce1a843ca0f6ac9026" }, "files": [ "config/packages/web_profiler.yaml", @@ -329,6 +362,6 @@ ] }, "twig/extra-bundle": { - "version": "v3.13.0" + "version": "v3.21.0" } } diff --git a/templates/home/home.html.twig b/templates/home/home.html.twig index c7f1c06..7abcf85 100644 --- a/templates/home/home.html.twig +++ b/templates/home/home.html.twig @@ -4,23 +4,34 @@ {%block body%}

Projets

-
+
{% for project in projects %} -
-
- {{project.title}} - -
- {% if is_granted('EDIT', project) %} - - {% endif %} + {% if is_granted('VIEW', project) %} +
+
+ {{project.title}} + +
+ {% if is_granted('UPDATE', project) %} + + {% endif %} - -
+ +
+
+
+ {{project.summary|raw}} + +
+ + Propriétaires = + {%for user in project.users%} + {{' '~user.username}} + {%endfor%} + +
-
-
-
+ {% endif %} {% endfor %}
diff --git a/templates/project/edit.html.twig b/templates/project/edit.html.twig index f8b3d2a..c356873 100644 --- a/templates/project/edit.html.twig +++ b/templates/project/edit.html.twig @@ -9,7 +9,11 @@ {{ form_start(form) }} {{ form_widget(form.submit) }} Annuler - {%if mode=="update" %}Supprimer{%endif%} + {%if mode=="update" %} + {% if is_granted('DELETE', project) %} + Supprimer + {% endif %} + {%endif%} {% include('include/error.html.twig') %} @@ -20,24 +24,24 @@
{{ form_row(form.title) }} {{ form_row(form.nature) }} - {{ form_row(form.status) }} {{ form_row(form.users) }} {{ form_row(form.summary) }}
- {{ render(path("bninefiles_files",{domain:'project',id:project.id, editable:1})) }} + {% if mode=="update" %} + {{ render(path("bninefiles_files",{domain:'project',id:project.id, editable:1})) }} -
-
Timeline
-
- {% include('project/timeline.html.twig') %} +
+
Timeline
+
+ {% include('project/timeline.html.twig') %} +
- -
- + {% endif %}
+ {% if mode=="update" %}
Description du Projet
@@ -46,6 +50,7 @@
+ {% endif %} {{ form_end(form) }} {% endblock %} diff --git a/templates/project/timeline.html.twig b/templates/project/timeline.html.twig index dd61a54..93ca63a 100644 --- a/templates/project/timeline.html.twig +++ b/templates/project/timeline.html.twig @@ -15,8 +15,8 @@ {{ change.new ?? '' }} {% endif %} - {% if not change.old is defined %} - = {{ change[0] }} + {% if not change.old is defined and change[0] is defined %} + {{ change[0] }} {% endif %}
{% endfor %}