From f9451188276b6a9ad8c6320c0fe2fb79ea2ecc33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Fri, 29 Aug 2025 23:24:42 +0200 Subject: [PATCH 1/8] Redact API keys overwritten via env variables to prevent leakage to undesired users --- src/Form/Type/APIKeyType.php | 31 +++++++++++++++++++++++++++++-- translations/messages.en.xlf | 6 ++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/Form/Type/APIKeyType.php b/src/Form/Type/APIKeyType.php index ae72f2a6..57eaea96 100644 --- a/src/Form/Type/APIKeyType.php +++ b/src/Form/Type/APIKeyType.php @@ -28,9 +28,14 @@ use Symfony\Component\Form\Extension\Core\Type\PasswordType; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormView; use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Contracts\Translation\TranslatorInterface; class APIKeyType extends AbstractType { + public function __construct(private readonly TranslatorInterface $translator) + { + } + public function getParent(): string { return PasswordType::class; @@ -38,8 +43,30 @@ class APIKeyType extends AbstractType public function buildView(FormView $view, FormInterface $form, array $options): void { - //Ensure that the field is never empty - $view->vars['value'] = $form->getViewData(); + $viewData = $form->getViewData(); + + //If the field is disabled, show the redacted API key + if ($options['disabled'] ?? false) { + if ($viewData === null || $viewData === '') { + $view->vars['value'] = $viewData; + } else { + + $view->vars['value'] = self::redact((string)$viewData) . ' (' . $this ->translator->trans("form.apikey.redacted") . ')'; + } + } else { //Otherwise, show the actual value + $view->vars['value'] = $viewData; + } + } + + public static function redact(string $apiKey): string + { + //Show only the last 2 characters of the API key if it is long enough (more than 16 characters) + //Replace all other characters with dots + if (strlen($apiKey) > 16) { + return str_repeat('*', strlen($apiKey) - 2) . substr($apiKey, -2); + } + + return str_repeat('*', strlen($apiKey)); } public function configureOptions(OptionsResolver $resolver): void diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index d9c4b1fd..481a5083 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -13051,5 +13051,11 @@ Please note, that you can not impersonate a disabled user. If you try you will g Info provider settings + + + form.apikey.redacted + Redacted for security reasons + + From d5c5c7c772822b4605b65d6848cba54cdc2bc9fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Fri, 29 Aug 2025 23:25:58 +0200 Subject: [PATCH 2/8] Added documentation about the censoring --- docs/configuration.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/configuration.md b/docs/configuration.md index 9cb5d1b3..d4b21781 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -43,7 +43,8 @@ options listed, see `.env` file for the full list of possible env variables. Environment variables allow to overwrite settings in the web interface. This is useful, if you want to enforce certain settings to be unchangable by users, or if you want to configure settings in a central place in a deployed environment. On the settings page, you can hover over a setting to see, which environment variable can be used to overwrite it, it -is shown as tooltip. +is shown as tooltip. API keys or similar sensitve data which is overwritten by env variables, are redacted on the web +interface, so that even administrators cannot see them (only the last 2 characters and the length). For technical and security reasons some settings can only be configured via environment variables and not via the web interface. These settings are marked with "(env only)" in the description below. From e3125e3afb4e17e84e3288a4421e5f2178e3de15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Fri, 29 Aug 2025 23:33:35 +0200 Subject: [PATCH 3/8] Document system settings in getting_started guide --- .../getting_started/system_settings.png | Bin 0 -> 50062 bytes docs/usage/getting_started.md | 22 ++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 docs/assets/getting_started/system_settings.png diff --git a/docs/assets/getting_started/system_settings.png b/docs/assets/getting_started/system_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..5a7d7380a91a5ccb88c64b55282a46426f9240fa GIT binary patch literal 50062 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 literal 0 HcmV?d00001 diff --git a/docs/usage/getting_started.md b/docs/usage/getting_started.md index 4bb8afb9..4b9a809a 100644 --- a/docs/usage/getting_started.md +++ b/docs/usage/getting_started.md @@ -12,11 +12,19 @@ Before starting, it's useful to read a bit about the [concepts of Part-DB]({% li 1. TOC {:toc} -## Customize config files +## Customize system settings -Before you start creating data structures, you should configure Part-DB to your needs by changing possible configuration -options. -This is done either via changing the `.env.local` file in a direct installation or by changing the env variables in +Before starting creating datastructures, you should check the system settings to ensure that they fit your needs. +After login as an administrator, you can find the settings in the sidebar under `Tools -> System -> Settings`. +![image]({% link assets/getting_started/system_settings.png %}) + +Here you can change various settings, like the name of your Part-DB instance (which is shown in the title bar of the +browser), the default language (which is used if no user preference is set), the default timezone (which is used to +display times correctly), the default currency (which is used to display prices correctly), and many more. + +Some more fundamental settings like database connection, mail server settings, SSO, etc. are configured via environment variables. +Environment variables also allow to overwrite various settings from the web interface. +Environment variables can be changed by editing the `.env.local` file in a direct installation or by changing the env variables in your `docker-compose.yaml` file. A list of possible configuration options can be found [here]({% link configuration.md %}). @@ -44,8 +52,8 @@ used. ## (Optional) Customize homepage banner -The banner which is shown on the homepage, can be customized/changed by changing the `config/banner.md` file with a text -editor. You can use markdown and (safe) HTML here, to style and customize the banner. +The banner which is shown on the homepage, can be customized/changed via the homepage banner setting in system settings. +You can use markdown and (safe) HTML here, to style and customize the banner. You can even use LaTeX-style equations by wrapping the expressions into `$` (like `$E=mc^2$`, which is rendered inline: $E=mc^2$) or `$$` (like `$$E=mc^2$$`) which will be rendered as a block, like so: $$E=mc^2$$ @@ -202,4 +210,4 @@ later. You can choose from your created datastructures to add manufacturer information, supplier information, etc. to the part. You can also create new datastructures on the fly, if you want to add additional information to the part, by typing the name of the new datastructure in the field and select the "New ..." option in the dropdown menu. See [tips]({% link -usage/tips_tricks.md %}) for more information. \ No newline at end of file +usage/tips_tricks.md %}) for more information. From b217d3e4ef28beef577a5e3091c7c1a5b8dcea0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sat, 30 Aug 2025 00:08:29 +0200 Subject: [PATCH 4/8] Added info about the configuration of the info provider system --- docs/usage/information_provider_system.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/usage/information_provider_system.md b/docs/usage/information_provider_system.md index 8de83a8e..953db409 100644 --- a/docs/usage/information_provider_system.md +++ b/docs/usage/information_provider_system.md @@ -80,6 +80,11 @@ Normally the providers utilize an API of a service, and you need to create an ac Also, there are limits on how many requests you can do per day or month, depending on the provider and your contract with them. +Data providers can be either configured in the system settings (in the info provider tab) or on the settings page which is +reachable via the cogwheel symbol next to the provider in the provider list. It is also possible to configure them via +environment variables. See below for the available configuration options. API keys configured via environment variables +are redacted in the settings interface. + The following providers are currently available and shipped with Part-DB: (All trademarks are property of their respective owners. Part-DB is not affiliated with any of the companies.) From 2019f44395d3f7dd951692f644e66aba89a50a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sat, 30 Aug 2025 00:10:59 +0200 Subject: [PATCH 5/8] Updated dependencies --- composer.lock | 466 ++++++++++++++++++++++++++------------------------ 1 file changed, 244 insertions(+), 222 deletions(-) diff --git a/composer.lock b/composer.lock index 7fba241b..91fcf0e4 100644 --- a/composer.lock +++ b/composer.lock @@ -968,7 +968,7 @@ }, { "name": "api-platform/doctrine-common", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/doctrine-common.git", @@ -1050,13 +1050,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/doctrine-common/tree/v4.1.21" + "source": "https://github.com/api-platform/doctrine-common/tree/v4.1.22" }, "time": "2025-08-18T13:30:43+00:00" }, { "name": "api-platform/doctrine-orm", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/doctrine-orm.git", @@ -1135,13 +1135,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/doctrine-orm/tree/v4.1.21" + "source": "https://github.com/api-platform/doctrine-orm/tree/v4.1.22" }, "time": "2025-06-06T14:56:47+00:00" }, { "name": "api-platform/documentation", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/documentation.git", @@ -1203,7 +1203,7 @@ }, { "name": "api-platform/http-cache", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/http-cache.git", @@ -1275,13 +1275,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/http-cache/tree/v4.1.21" + "source": "https://github.com/api-platform/http-cache/tree/v4.1.22" }, "time": "2025-06-06T14:56:47+00:00" }, { "name": "api-platform/hydra", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/hydra.git", @@ -1360,13 +1360,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/hydra/tree/v4.1.21" + "source": "https://github.com/api-platform/hydra/tree/v4.1.22" }, "time": "2025-07-15T14:10:59+00:00" }, { "name": "api-platform/json-api", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/json-api.git", @@ -1439,13 +1439,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/json-api/tree/v4.1.21" + "source": "https://github.com/api-platform/json-api/tree/v4.1.22" }, "time": "2025-08-06T07:56:58+00:00" }, { "name": "api-platform/json-schema", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/json-schema.git", @@ -1518,13 +1518,13 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/json-schema/tree/v4.1.21" + "source": "https://github.com/api-platform/json-schema/tree/v4.1.22" }, "time": "2025-06-29T12:24:14+00:00" }, { "name": "api-platform/jsonld", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/jsonld.git", @@ -1596,22 +1596,22 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/jsonld/tree/v4.1.21" + "source": "https://github.com/api-platform/jsonld/tree/v4.1.22" }, "time": "2025-07-25T10:05:30+00:00" }, { "name": "api-platform/metadata", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/metadata.git", - "reference": "9158aa2ab7090c135336f38816ce0d8226e526b5" + "reference": "782477dd28cc675909597bfa47af7c1f85659ffa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/metadata/zipball/9158aa2ab7090c135336f38816ce0d8226e526b5", - "reference": "9158aa2ab7090c135336f38816ce0d8226e526b5", + "url": "https://api.github.com/repos/api-platform/metadata/zipball/782477dd28cc675909597bfa47af7c1f85659ffa", + "reference": "782477dd28cc675909597bfa47af7c1f85659ffa", "shasum": "" }, "require": { @@ -1693,13 +1693,13 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/metadata/tree/v4.1.21" + "source": "https://github.com/api-platform/metadata/tree/v4.1.22" }, - "time": "2025-07-29T08:54:26+00:00" + "time": "2025-08-29T15:13:26+00:00" }, { "name": "api-platform/openapi", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/openapi.git", @@ -1780,22 +1780,22 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/openapi/tree/v4.1.21" + "source": "https://github.com/api-platform/openapi/tree/v4.1.22" }, "time": "2025-07-29T08:53:27+00:00" }, { "name": "api-platform/serializer", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/serializer.git", - "reference": "4cdce13e9b08de9658a36aec8bc9acca6052c1bc" + "reference": "70dbdeac9584870be444d78c1a796b6edb9e46a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/serializer/zipball/4cdce13e9b08de9658a36aec8bc9acca6052c1bc", - "reference": "4cdce13e9b08de9658a36aec8bc9acca6052c1bc", + "url": "https://api.github.com/repos/api-platform/serializer/zipball/70dbdeac9584870be444d78c1a796b6edb9e46a5", + "reference": "70dbdeac9584870be444d78c1a796b6edb9e46a5", "shasum": "" }, "require": { @@ -1871,13 +1871,13 @@ "serializer" ], "support": { - "source": "https://github.com/api-platform/serializer/tree/v4.1.21" + "source": "https://github.com/api-platform/serializer/tree/v4.1.22" }, - "time": "2025-08-20T09:58:23+00:00" + "time": "2025-08-29T15:13:26+00:00" }, { "name": "api-platform/state", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/state.git", @@ -1963,13 +1963,13 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/state/tree/v4.1.21" + "source": "https://github.com/api-platform/state/tree/v4.1.22" }, "time": "2025-07-16T14:01:52+00:00" }, { "name": "api-platform/symfony", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/symfony.git", @@ -2087,13 +2087,13 @@ "symfony" ], "support": { - "source": "https://github.com/api-platform/symfony/tree/v4.1.21" + "source": "https://github.com/api-platform/symfony/tree/v4.1.22" }, "time": "2025-07-16T14:01:52+00:00" }, { "name": "api-platform/validator", - "version": "v4.1.21", + "version": "v4.1.22", "source": { "type": "git", "url": "https://github.com/api-platform/validator.git", @@ -2162,7 +2162,7 @@ "validator" ], "support": { - "source": "https://github.com/api-platform/validator/tree/v4.1.21" + "source": "https://github.com/api-platform/validator/tree/v4.1.22" }, "time": "2025-07-16T14:01:52+00:00" }, @@ -10125,16 +10125,16 @@ }, { "name": "symfony/console", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "5f360ebc65c55265a74d23d7fe27f957870158a1" + "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/5f360ebc65c55265a74d23d7fe27f957870158a1", - "reference": "5f360ebc65c55265a74d23d7fe27f957870158a1", + "url": "https://api.github.com/repos/symfony/console/zipball/cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", + "reference": "cb0102a1c5ac3807cf3fdf8bea96007df7fdbea7", "shasum": "" }, "require": { @@ -10199,7 +10199,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.2" + "source": "https://github.com/symfony/console/tree/v7.3.3" }, "funding": [ { @@ -10219,7 +10219,7 @@ "type": "tidelift" } ], - "time": "2025-07-30T17:13:41+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "symfony/css-selector", @@ -10288,16 +10288,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "6cd2a1a77e8a0676a26e8bcddf10acfe7b0ba352" + "reference": "ab6c38dad5da9b15b1f7afb2f5c5814112e70261" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6cd2a1a77e8a0676a26e8bcddf10acfe7b0ba352", - "reference": "6cd2a1a77e8a0676a26e8bcddf10acfe7b0ba352", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/ab6c38dad5da9b15b1f7afb2f5c5814112e70261", + "reference": "ab6c38dad5da9b15b1f7afb2f5c5814112e70261", "shasum": "" }, "require": { @@ -10348,7 +10348,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.3.2" + "source": "https://github.com/symfony/dependency-injection/tree/v7.3.3" }, "funding": [ { @@ -10368,7 +10368,7 @@ "type": "tidelift" } ], - "time": "2025-07-30T17:31:46+00:00" + "time": "2025-08-14T09:54:27+00:00" }, { "name": "symfony/deprecation-contracts", @@ -10439,16 +10439,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "a2cbc12baf9bcc5d0c125e4c0f8330b98af841ca" + "reference": "b371ded46da25415e1a3a7422e4acd2ec34214c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/a2cbc12baf9bcc5d0c125e4c0f8330b98af841ca", - "reference": "a2cbc12baf9bcc5d0c125e4c0f8330b98af841ca", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/b371ded46da25415e1a3a7422e4acd2ec34214c5", + "reference": "b371ded46da25415e1a3a7422e4acd2ec34214c5", "shasum": "" }, "require": { @@ -10528,7 +10528,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v7.3.2" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.3.3" }, "funding": [ { @@ -10548,20 +10548,20 @@ "type": "tidelift" } ], - "time": "2025-07-15T11:36:08+00:00" + "time": "2025-08-18T13:10:53+00:00" }, { "name": "symfony/dom-crawler", - "version": "v7.3.1", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9" + "reference": "efa076ea0eeff504383ff0dcf827ea5ce15690ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", - "reference": "8b2ee2e06ab99fa5f067b6699296d4e35c156bb9", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/efa076ea0eeff504383ff0dcf827ea5ce15690ba", + "reference": "efa076ea0eeff504383ff0dcf827ea5ce15690ba", "shasum": "" }, "require": { @@ -10599,7 +10599,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.3.1" + "source": "https://github.com/symfony/dom-crawler/tree/v7.3.3" }, "funding": [ { @@ -10610,12 +10610,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-06-15T10:07:06+00:00" + "time": "2025-08-06T20:13:54+00:00" }, { "name": "symfony/dotenv", @@ -10778,16 +10782,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v7.3.0", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "497f73ac996a598c92409b44ac43b6690c4f666d" + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d", - "reference": "497f73ac996a598c92409b44ac43b6690c4f666d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191", "shasum": "" }, "require": { @@ -10838,7 +10842,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.3.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3" }, "funding": [ { @@ -10849,12 +10853,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-04-22T09:11:45+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -11212,16 +11220,16 @@ }, { "name": "symfony/form", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "e83e898d1589f3ec647824bd4416defe3d6e3875" + "reference": "f151b4a027fa67769268b80111f7fdb63edb5e79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/e83e898d1589f3ec647824bd4416defe3d6e3875", - "reference": "e83e898d1589f3ec647824bd4416defe3d6e3875", + "url": "https://api.github.com/repos/symfony/form/zipball/f151b4a027fa67769268b80111f7fdb63edb5e79", + "reference": "f151b4a027fa67769268b80111f7fdb63edb5e79", "shasum": "" }, "require": { @@ -11289,7 +11297,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v7.3.2" + "source": "https://github.com/symfony/form/tree/v7.3.3" }, "funding": [ { @@ -11309,20 +11317,20 @@ "type": "tidelift" } ], - "time": "2025-07-24T12:10:26+00:00" + "time": "2025-08-18T13:10:53+00:00" }, { "name": "symfony/framework-bundle", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "06c0f678129f99bda8b5cf8873b3d8ef5a0029e7" + "reference": "19ec4ab6be90322ed190e041e2404a976ed22571" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/06c0f678129f99bda8b5cf8873b3d8ef5a0029e7", - "reference": "06c0f678129f99bda8b5cf8873b3d8ef5a0029e7", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/19ec4ab6be90322ed190e041e2404a976ed22571", + "reference": "19ec4ab6be90322ed190e041e2404a976ed22571", "shasum": "" }, "require": { @@ -11447,7 +11455,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.3.2" + "source": "https://github.com/symfony/framework-bundle/tree/v7.3.3" }, "funding": [ { @@ -11467,20 +11475,20 @@ "type": "tidelift" } ], - "time": "2025-07-30T17:13:41+00:00" + "time": "2025-08-27T07:45:05+00:00" }, { "name": "symfony/http-client", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "1c064a0c67749923483216b081066642751cc2c7" + "reference": "333b9bd7639cbdaecd25a3a48a9d2dcfaa86e019" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/1c064a0c67749923483216b081066642751cc2c7", - "reference": "1c064a0c67749923483216b081066642751cc2c7", + "url": "https://api.github.com/repos/symfony/http-client/zipball/333b9bd7639cbdaecd25a3a48a9d2dcfaa86e019", + "reference": "333b9bd7639cbdaecd25a3a48a9d2dcfaa86e019", "shasum": "" }, "require": { @@ -11488,6 +11496,7 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-client-contracts": "~3.4.4|^3.5.2", + "symfony/polyfill-php83": "^1.29", "symfony/service-contracts": "^2.5|^3" }, "conflict": { @@ -11546,7 +11555,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.3.2" + "source": "https://github.com/symfony/http-client/tree/v7.3.3" }, "funding": [ { @@ -11566,7 +11575,7 @@ "type": "tidelift" } ], - "time": "2025-07-15T11:36:08+00:00" + "time": "2025-08-27T07:45:05+00:00" }, { "name": "symfony/http-client-contracts", @@ -11648,16 +11657,16 @@ }, { "name": "symfony/http-foundation", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "6877c122b3a6cc3695849622720054f6e6fa5fa6" + "reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6877c122b3a6cc3695849622720054f6e6fa5fa6", - "reference": "6877c122b3a6cc3695849622720054f6e6fa5fa6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7475561ec27020196c49bb7c4f178d33d7d3dc00", + "reference": "7475561ec27020196c49bb7c4f178d33d7d3dc00", "shasum": "" }, "require": { @@ -11707,7 +11716,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.3.2" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.3" }, "funding": [ { @@ -11727,20 +11736,20 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:47:49+00:00" + "time": "2025-08-20T08:04:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "6ecc895559ec0097e221ed2fd5eb44d5fede083c" + "reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6ecc895559ec0097e221ed2fd5eb44d5fede083c", - "reference": "6ecc895559ec0097e221ed2fd5eb44d5fede083c", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/72c304de37e1a1cec6d5d12b81187ebd4850a17b", + "reference": "72c304de37e1a1cec6d5d12b81187ebd4850a17b", "shasum": "" }, "require": { @@ -11825,7 +11834,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.3.2" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.3" }, "funding": [ { @@ -11845,20 +11854,20 @@ "type": "tidelift" } ], - "time": "2025-07-31T10:45:04+00:00" + "time": "2025-08-29T08:23:45+00:00" }, { "name": "symfony/intl", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "d1197fb6661b05f6178ddb2dc9c6d576f6f67ec8" + "reference": "754d5ad02c889e380efc5a74fa3f6cfe56b7454d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/d1197fb6661b05f6178ddb2dc9c6d576f6f67ec8", - "reference": "d1197fb6661b05f6178ddb2dc9c6d576f6f67ec8", + "url": "https://api.github.com/repos/symfony/intl/zipball/754d5ad02c889e380efc5a74fa3f6cfe56b7454d", + "reference": "754d5ad02c889e380efc5a74fa3f6cfe56b7454d", "shasum": "" }, "require": { @@ -11915,7 +11924,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v7.3.2" + "source": "https://github.com/symfony/intl/tree/v7.3.3" }, "funding": [ { @@ -11935,20 +11944,20 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:47:49+00:00" + "time": "2025-08-19T14:06:46+00:00" }, { "name": "symfony/mailer", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "d43e84d9522345f96ad6283d5dfccc8c1cfc299b" + "reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/d43e84d9522345f96ad6283d5dfccc8c1cfc299b", - "reference": "d43e84d9522345f96ad6283d5dfccc8c1cfc299b", + "url": "https://api.github.com/repos/symfony/mailer/zipball/a32f3f45f1990db8c4341d5122a7d3a381c7e575", + "reference": "a32f3f45f1990db8c4341d5122a7d3a381c7e575", "shasum": "" }, "require": { @@ -11999,7 +12008,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.3.2" + "source": "https://github.com/symfony/mailer/tree/v7.3.3" }, "funding": [ { @@ -12019,7 +12028,7 @@ "type": "tidelift" } ], - "time": "2025-07-15T11:36:08+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/mime", @@ -12111,16 +12120,16 @@ }, { "name": "symfony/monolog-bridge", - "version": "v7.3.0", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "1b188c8abbbef25b111da878797514b7a8d33990" + "reference": "6f3745e887659b46a8b7bb5ade8356a41700f095" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/1b188c8abbbef25b111da878797514b7a8d33990", - "reference": "1b188c8abbbef25b111da878797514b7a8d33990", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/6f3745e887659b46a8b7bb5ade8356a41700f095", + "reference": "6f3745e887659b46a8b7bb5ade8356a41700f095", "shasum": "" }, "require": { @@ -12169,7 +12178,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v7.3.0" + "source": "https://github.com/symfony/monolog-bridge/tree/v7.3.3" }, "funding": [ { @@ -12180,12 +12189,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-03-21T12:17:46+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/monolog-bundle", @@ -12270,16 +12283,16 @@ }, { "name": "symfony/options-resolver", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "119bcf13e67dbd188e5dbc74228b1686f66acd37" + "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/119bcf13e67dbd188e5dbc74228b1686f66acd37", - "reference": "119bcf13e67dbd188e5dbc74228b1686f66acd37", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d", + "reference": "0ff2f5c3df08a395232bbc3c2eb7e84912df911d", "shasum": "" }, "require": { @@ -12317,7 +12330,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.3.2" + "source": "https://github.com/symfony/options-resolver/tree/v7.3.3" }, "funding": [ { @@ -12337,7 +12350,7 @@ "type": "tidelift" } ], - "time": "2025-07-15T11:36:08+00:00" + "time": "2025-08-05T10:16:07+00:00" }, { "name": "symfony/password-hasher", @@ -13330,16 +13343,16 @@ }, { "name": "symfony/process", - "version": "v7.3.0", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af" + "reference": "32241012d521e2e8a9d713adb0812bb773b907f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", - "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", + "url": "https://api.github.com/repos/symfony/process/zipball/32241012d521e2e8a9d713adb0812bb773b907f1", + "reference": "32241012d521e2e8a9d713adb0812bb773b907f1", "shasum": "" }, "require": { @@ -13371,7 +13384,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.3.0" + "source": "https://github.com/symfony/process/tree/v7.3.3" }, "funding": [ { @@ -13382,25 +13395,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-04-17T09:11:12+00:00" + "time": "2025-08-18T09:42:54+00:00" }, { "name": "symfony/property-access", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "317916e49b2577a1908f321796f2b67984e61eab" + "reference": "4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/317916e49b2577a1908f321796f2b67984e61eab", - "reference": "317916e49b2577a1908f321796f2b67984e61eab", + "url": "https://api.github.com/repos/symfony/property-access/zipball/4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7", + "reference": "4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7", "shasum": "" }, "require": { @@ -13447,7 +13464,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v7.3.2" + "source": "https://github.com/symfony/property-access/tree/v7.3.3" }, "funding": [ { @@ -13467,7 +13484,7 @@ "type": "tidelift" } ], - "time": "2025-07-15T17:58:03+00:00" + "time": "2025-08-04T15:15:28+00:00" }, { "name": "symfony/property-info", @@ -13878,16 +13895,16 @@ }, { "name": "symfony/security-bundle", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "d8278a973b305c0b79b162f265d8ce1e96703236" + "reference": "fbecca9a10af8d886e116f74e860e19b7583689c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/d8278a973b305c0b79b162f265d8ce1e96703236", - "reference": "d8278a973b305c0b79b162f265d8ce1e96703236", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/fbecca9a10af8d886e116f74e860e19b7583689c", + "reference": "fbecca9a10af8d886e116f74e860e19b7583689c", "shasum": "" }, "require": { @@ -13964,7 +13981,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.3.2" + "source": "https://github.com/symfony/security-bundle/tree/v7.3.3" }, "funding": [ { @@ -13984,20 +14001,20 @@ "type": "tidelift" } ], - "time": "2025-07-22T08:15:39+00:00" + "time": "2025-08-06T08:34:58+00:00" }, { "name": "symfony/security-core", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "d8e1bb0de26266e2e4525beda0aed7f774e9c80d" + "reference": "4465a3b9cefbaebaeeeb98c2becfdb4b59d22488" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/d8e1bb0de26266e2e4525beda0aed7f774e9c80d", - "reference": "d8e1bb0de26266e2e4525beda0aed7f774e9c80d", + "url": "https://api.github.com/repos/symfony/security-core/zipball/4465a3b9cefbaebaeeeb98c2becfdb4b59d22488", + "reference": "4465a3b9cefbaebaeeeb98c2becfdb4b59d22488", "shasum": "" }, "require": { @@ -14055,7 +14072,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.3.2" + "source": "https://github.com/symfony/security-core/tree/v7.3.3" }, "funding": [ { @@ -14075,7 +14092,7 @@ "type": "tidelift" } ], - "time": "2025-07-23T09:11:24+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "symfony/security-csrf", @@ -14149,16 +14166,16 @@ }, { "name": "symfony/security-http", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "ca8d92035a5c8d31012458589bdaef30ef3c54d6" + "reference": "1bf0dc10f27d4776c47f18f98236c619793a9260" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/ca8d92035a5c8d31012458589bdaef30ef3c54d6", - "reference": "ca8d92035a5c8d31012458589bdaef30ef3c54d6", + "url": "https://api.github.com/repos/symfony/security-http/zipball/1bf0dc10f27d4776c47f18f98236c619793a9260", + "reference": "1bf0dc10f27d4776c47f18f98236c619793a9260", "shasum": "" }, "require": { @@ -14217,7 +14234,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.3.2" + "source": "https://github.com/symfony/security-http/tree/v7.3.3" }, "funding": [ { @@ -14237,26 +14254,27 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:47:49+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "symfony/serializer", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "0ed011583fd24899fa003abf77c45d4a901714da" + "reference": "5608b04d8daaf29432d76ecc618b0fac169c2dfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/0ed011583fd24899fa003abf77c45d4a901714da", - "reference": "0ed011583fd24899fa003abf77c45d4a901714da", + "url": "https://api.github.com/repos/symfony/serializer/zipball/5608b04d8daaf29432d76ecc618b0fac169c2dfb", + "reference": "5608b04d8daaf29432d76ecc618b0fac169c2dfb", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8" + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php84": "^1.30" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", @@ -14319,7 +14337,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.3.2" + "source": "https://github.com/symfony/serializer/tree/v7.3.3" }, "funding": [ { @@ -14339,7 +14357,7 @@ "type": "tidelift" } ], - "time": "2025-07-26T13:07:17+00:00" + "time": "2025-08-27T11:34:33+00:00" }, { "name": "symfony/service-contracts", @@ -14561,16 +14579,16 @@ }, { "name": "symfony/string", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "42f505aff654e62ac7ac2ce21033818297ca89ca" + "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/42f505aff654e62ac7ac2ce21033818297ca89ca", - "reference": "42f505aff654e62ac7ac2ce21033818297ca89ca", + "url": "https://api.github.com/repos/symfony/string/zipball/17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", + "reference": "17a426cce5fd1f0901fefa9b2a490d0038fd3c9c", "shasum": "" }, "require": { @@ -14628,7 +14646,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.3.2" + "source": "https://github.com/symfony/string/tree/v7.3.3" }, "funding": [ { @@ -14648,20 +14666,20 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:47:49+00:00" + "time": "2025-08-25T06:35:40+00:00" }, { "name": "symfony/translation", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "81b48f4daa96272efcce9c7a6c4b58e629df3c90" + "reference": "e0837b4cbcef63c754d89a4806575cada743a38d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/81b48f4daa96272efcce9c7a6c4b58e629df3c90", - "reference": "81b48f4daa96272efcce9c7a6c4b58e629df3c90", + "url": "https://api.github.com/repos/symfony/translation/zipball/e0837b4cbcef63c754d89a4806575cada743a38d", + "reference": "e0837b4cbcef63c754d89a4806575cada743a38d", "shasum": "" }, "require": { @@ -14728,7 +14746,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.3.2" + "source": "https://github.com/symfony/translation/tree/v7.3.3" }, "funding": [ { @@ -14748,7 +14766,7 @@ "type": "tidelift" } ], - "time": "2025-07-30T17:31:46+00:00" + "time": "2025-08-01T21:02:37+00:00" }, { "name": "symfony/translation-contracts", @@ -14830,16 +14848,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "81d1c69769cf913240afdd4c9673304ddca964b0" + "reference": "33558f013b7f6ed72805527c8405cae0062e47c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/81d1c69769cf913240afdd4c9673304ddca964b0", - "reference": "81d1c69769cf913240afdd4c9673304ddca964b0", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/33558f013b7f6ed72805527c8405cae0062e47c5", + "reference": "33558f013b7f6ed72805527c8405cae0062e47c5", "shasum": "" }, "require": { @@ -14921,7 +14939,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.3.2" + "source": "https://github.com/symfony/twig-bridge/tree/v7.3.3" }, "funding": [ { @@ -14941,7 +14959,7 @@ "type": "tidelift" } ], - "time": "2025-07-26T16:47:03+00:00" + "time": "2025-08-18T13:10:53+00:00" }, { "name": "symfony/twig-bundle", @@ -15033,16 +15051,16 @@ }, { "name": "symfony/type-info", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "b72d44c7d6638480fce101b7c4cd3abea4c2efba" + "reference": "aa64b58ed04517d4d730202dd035895743c23273" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/b72d44c7d6638480fce101b7c4cd3abea4c2efba", - "reference": "b72d44c7d6638480fce101b7c4cd3abea4c2efba", + "url": "https://api.github.com/repos/symfony/type-info/zipball/aa64b58ed04517d4d730202dd035895743c23273", + "reference": "aa64b58ed04517d4d730202dd035895743c23273", "shasum": "" }, "require": { @@ -15092,7 +15110,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.3.2" + "source": "https://github.com/symfony/type-info/tree/v7.3.3" }, "funding": [ { @@ -15112,7 +15130,7 @@ "type": "tidelift" } ], - "time": "2025-07-10T05:39:45+00:00" + "time": "2025-08-28T09:38:04+00:00" }, { "name": "symfony/uid", @@ -15458,16 +15476,16 @@ }, { "name": "symfony/validator", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "e5cc60fd44aab8e1d662fc0d954da322c2e08b43" + "reference": "a2f26d7c122393db75a2d41435ad8251250f8bc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/e5cc60fd44aab8e1d662fc0d954da322c2e08b43", - "reference": "e5cc60fd44aab8e1d662fc0d954da322c2e08b43", + "url": "https://api.github.com/repos/symfony/validator/zipball/a2f26d7c122393db75a2d41435ad8251250f8bc6", + "reference": "a2f26d7c122393db75a2d41435ad8251250f8bc6", "shasum": "" }, "require": { @@ -15536,7 +15554,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v7.3.2" + "source": "https://github.com/symfony/validator/tree/v7.3.3" }, "funding": [ { @@ -15556,20 +15574,20 @@ "type": "tidelift" } ], - "time": "2025-07-29T20:02:46+00:00" + "time": "2025-08-27T11:34:33+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "53205bea27450dc5c65377518b3275e126d45e75" + "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/53205bea27450dc5c65377518b3275e126d45e75", - "reference": "53205bea27450dc5c65377518b3275e126d45e75", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", + "reference": "34d8d4c4b9597347306d1ec8eb4e1319b1e6986f", "shasum": "" }, "require": { @@ -15623,7 +15641,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.2" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.3" }, "funding": [ { @@ -15643,20 +15661,20 @@ "type": "tidelift" } ], - "time": "2025-07-29T20:02:46+00:00" + "time": "2025-08-13T11:49:31+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "05b3e90654c097817325d6abd284f7938b05f467" + "reference": "d4dfcd2a822cbedd7612eb6fbd260e46f87b7137" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/05b3e90654c097817325d6abd284f7938b05f467", - "reference": "05b3e90654c097817325d6abd284f7938b05f467", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/d4dfcd2a822cbedd7612eb6fbd260e46f87b7137", + "reference": "d4dfcd2a822cbedd7612eb6fbd260e46f87b7137", "shasum": "" }, "require": { @@ -15704,7 +15722,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.3.2" + "source": "https://github.com/symfony/var-exporter/tree/v7.3.3" }, "funding": [ { @@ -15724,7 +15742,7 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:47:49+00:00" + "time": "2025-08-18T13:10:53+00:00" }, { "name": "symfony/web-link", @@ -15887,16 +15905,16 @@ }, { "name": "symfony/yaml", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "b8d7d868da9eb0919e99c8830431ea087d6aae30" + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/b8d7d868da9eb0919e99c8830431ea087d6aae30", - "reference": "b8d7d868da9eb0919e99c8830431ea087d6aae30", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d4f4a66866fe2451f61296924767280ab5732d9d", + "reference": "d4f4a66866fe2451f61296924767280ab5732d9d", "shasum": "" }, "require": { @@ -15939,7 +15957,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.3.2" + "source": "https://github.com/symfony/yaml/tree/v7.3.3" }, "funding": [ { @@ -15959,7 +15977,7 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:47:49+00:00" + "time": "2025-08-27T11:34:33+00:00" }, { "name": "symplify/easy-coding-standard", @@ -18572,12 +18590,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "1e6dd833087765a9aa80c5c0a6444f4521a63a79" + "reference": "e7589e01dc8452bfecb4c8df977346cd3132650f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/1e6dd833087765a9aa80c5c0a6444f4521a63a79", - "reference": "1e6dd833087765a9aa80c5c0a6444f4521a63a79", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/e7589e01dc8452bfecb4c8df977346cd3132650f", + "reference": "e7589e01dc8452bfecb4c8df977346cd3132650f", "shasum": "" }, "conflict": { @@ -18608,8 +18626,8 @@ "aoe/restler": "<1.7.1", "apache-solr-for-typo3/solr": "<2.8.3", "apereo/phpcas": "<1.6", - "api-platform/core": "<3.4.17|>=4.0.0.0-alpha1,<4.0.22", - "api-platform/graphql": "<3.4.17|>=4.0.0.0-alpha1,<4.0.22", + "api-platform/core": "<3.4.17|>=4,<4.0.22|>=4.1,<4.1.5", + "api-platform/graphql": "<3.4.17|>=4,<4.0.22|>=4.1,<4.1.5", "appwrite/server-ce": "<=1.2.1", "arc/web": "<3", "area17/twill": "<1.2.5|>=2,<2.5.3", @@ -19529,7 +19547,7 @@ "type": "tidelift" } ], - "time": "2025-08-28T15:05:43+00:00" + "time": "2025-08-29T15:04:47+00:00" }, { "name": "sebastian/cli-parser", @@ -20795,16 +20813,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v7.3.1", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "71624984d8bcad6acf7a790d4e3ceafe04bc2485" + "reference": "7954e563ed14f924593169f6c4645d58d9d9ac77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/71624984d8bcad6acf7a790d4e3ceafe04bc2485", - "reference": "71624984d8bcad6acf7a790d4e3ceafe04bc2485", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/7954e563ed14f924593169f6c4645d58d9d9ac77", + "reference": "7954e563ed14f924593169f6c4645d58d9d9ac77", "shasum": "" }, "require": { @@ -20860,7 +20878,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.3.1" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.3.3" }, "funding": [ { @@ -20871,25 +20889,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-06-04T10:09:06+00:00" + "time": "2025-08-04T15:15:28+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v7.3.2", + "version": "v7.3.3", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "c5e02451fe4e430c5067ddbf0899493522782390" + "reference": "6ee224d6e9de787a47622b9ad4880e205ef16ad1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/c5e02451fe4e430c5067ddbf0899493522782390", - "reference": "c5e02451fe4e430c5067ddbf0899493522782390", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6ee224d6e9de787a47622b9ad4880e205ef16ad1", + "reference": "6ee224d6e9de787a47622b9ad4880e205ef16ad1", "shasum": "" }, "require": { @@ -20945,7 +20967,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.3.2" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.3.3" }, "funding": [ { @@ -20965,7 +20987,7 @@ "type": "tidelift" } ], - "time": "2025-07-26T16:47:03+00:00" + "time": "2025-08-19T13:44:55+00:00" }, { "name": "theseer/tokenizer", From 1aedcc056f5c209f2c9e29131cf16205c564e487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sat, 30 Aug 2025 00:30:10 +0200 Subject: [PATCH 6/8] Fixed (hopefully) frankenphp dockerfile --- Dockerfile-frankenphp | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/Dockerfile-frankenphp b/Dockerfile-frankenphp index ae837019..74d94e81 100644 --- a/Dockerfile-frankenphp +++ b/Dockerfile-frankenphp @@ -13,13 +13,33 @@ RUN apt-get update && apt-get -y install \ zip \ && apt-get -y autoremove && apt-get clean autoclean && rm -rf /var/lib/apt/lists/*; -# Install node and yarn -RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ - echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ - curl -sL https://deb.nodesource.com/setup_20.x | bash - && \ - apt-get update && apt-get install -y \ - nodejs yarn \ - && apt-get -y autoremove && apt-get clean autoclean && rm -rf /var/lib/apt/lists/* +RUN set -eux; \ + # Prepare keyrings directory + mkdir -p /etc/apt/keyrings; \ + \ + # Import Yarn GPG key + curl -fsSL https://dl.yarnpkg.com/debian/pubkey.gpg \ + | tee /etc/apt/keyrings/yarn.gpg >/dev/null; \ + chmod 644 /etc/apt/keyrings/yarn.gpg; \ + \ + # Add Yarn repo with signed-by + echo "deb [signed-by=/etc/apt/keyrings/yarn.gpg] https://dl.yarnpkg.com/debian stable main" \ + | tee /etc/apt/sources.list.d/yarn.list; \ + \ + # Run NodeSource setup script (unchanged) + curl -sL https://deb.nodesource.com/setup_20.x | bash -; \ + \ + # Install Node.js + Yarn + apt-get update; \ + apt-get install -y --no-install-recommends \ + nodejs \ + yarn; \ + \ + # Cleanup + apt-get -y autoremove; \ + apt-get clean autoclean; \ + rm -rf /var/lib/apt/lists/* + # Install PHP RUN set -eux; \ From a2d94b54b1d0ef5cbe12305ccf8130da46d09d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sat, 30 Aug 2025 00:31:50 +0200 Subject: [PATCH 7/8] Use PHP 8.4 in docker images --- Dockerfile | 2 +- Dockerfile-frankenphp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0f909f16..f03c2b72 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ARG BASE_IMAGE=debian:bookworm-slim -ARG PHP_VERSION=8.3 +ARG PHP_VERSION=8.4 FROM ${BASE_IMAGE} AS base ARG PHP_VERSION diff --git a/Dockerfile-frankenphp b/Dockerfile-frankenphp index 74d94e81..dccb41e1 100644 --- a/Dockerfile-frankenphp +++ b/Dockerfile-frankenphp @@ -1,4 +1,4 @@ -FROM dunglas/frankenphp:1-php8.3 AS frankenphp_upstream +FROM dunglas/frankenphp:1-php8.4 AS frankenphp_upstream RUN apt-get update && apt-get -y install \ curl \ From 93b04fbf940d2d0579bc115797eccbc5687841c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sat, 30 Aug 2025 00:32:43 +0200 Subject: [PATCH 8/8] Use nodejs 22 in docker images --- Dockerfile | 2 +- Dockerfile-frankenphp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index f03c2b72..13a8d5c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,7 +48,7 @@ RUN apt-get update && apt-get -y install \ # Install node and yarn RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ - curl -sL https://deb.nodesource.com/setup_20.x | bash - && \ + curl -sL https://deb.nodesource.com/setup_22.x | bash - && \ apt-get update && apt-get install -y \ nodejs \ yarn \ diff --git a/Dockerfile-frankenphp b/Dockerfile-frankenphp index dccb41e1..f381f330 100644 --- a/Dockerfile-frankenphp +++ b/Dockerfile-frankenphp @@ -27,7 +27,7 @@ RUN set -eux; \ | tee /etc/apt/sources.list.d/yarn.list; \ \ # Run NodeSource setup script (unchanged) - curl -sL https://deb.nodesource.com/setup_20.x | bash -; \ + curl -sL https://deb.nodesource.com/setup_22.x | bash -; \ \ # Install Node.js + Yarn apt-get update; \