diff --git a/composer.lock b/composer.lock index 3aa6b4a6..874f54b0 100644 --- a/composer.lock +++ b/composer.lock @@ -2902,16 +2902,16 @@ }, { "name": "monolog/monolog", - "version": "3.4.0", + "version": "3.5.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "e2392369686d420ca32df3803de28b5d6f76867d" + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/e2392369686d420ca32df3803de28b5d6f76867d", - "reference": "e2392369686d420ca32df3803de28b5d6f76867d", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", "shasum": "" }, "require": { @@ -2987,7 +2987,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.4.0" + "source": "https://github.com/Seldaek/monolog/tree/3.5.0" }, "funding": [ { @@ -2999,7 +2999,7 @@ "type": "tidelift" } ], - "time": "2023-06-21T08:46:11+00:00" + "time": "2023-10-27T15:32:31+00:00" }, { "name": "mpdf/mpdf", @@ -5004,16 +5004,16 @@ }, { "name": "symfony/cache", - "version": "v6.3.5", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "6c1a3ea078c4d88ee892530945df63a87981b2da" + "reference": "84aff8d948d6292d2b5a01ac622760be44dddc72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/6c1a3ea078c4d88ee892530945df63a87981b2da", - "reference": "6c1a3ea078c4d88ee892530945df63a87981b2da", + "url": "https://api.github.com/repos/symfony/cache/zipball/84aff8d948d6292d2b5a01ac622760be44dddc72", + "reference": "84aff8d948d6292d2b5a01ac622760be44dddc72", "shasum": "" }, "require": { @@ -5022,7 +5022,7 @@ "psr/log": "^1.1|^2|^3", "symfony/cache-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.2.10" + "symfony/var-exporter": "^6.3.6" }, "conflict": { "doctrine/dbal": "<2.13.1", @@ -5037,7 +5037,7 @@ }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/dbal": "^2.13.1|^3.0", + "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", "symfony/config": "^5.4|^6.0", @@ -5080,7 +5080,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.3.5" + "source": "https://github.com/symfony/cache/tree/v6.3.6" }, "funding": [ { @@ -5096,7 +5096,7 @@ "type": "tidelift" } ], - "time": "2023-09-26T15:48:55+00:00" + "time": "2023-10-17T14:44:58+00:00" }, { "name": "symfony/cache-contracts", @@ -5627,16 +5627,16 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v6.3.5", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "9977eb1adf999ceded213e88c1ac6dff7a1a0306" + "reference": "c8af292f733cc28149485639177c5f2b67dff200" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/9977eb1adf999ceded213e88c1ac6dff7a1a0306", - "reference": "9977eb1adf999ceded213e88c1ac6dff7a1a0306", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/c8af292f733cc28149485639177c5f2b67dff200", + "reference": "c8af292f733cc28149485639177c5f2b67dff200", "shasum": "" }, "require": { @@ -5669,8 +5669,8 @@ "doctrine/annotations": "^1.13.1|^2", "doctrine/collections": "^1.0|^2.0", "doctrine/data-fixtures": "^1.1", - "doctrine/dbal": "^2.13.1|^3.0", - "doctrine/orm": "^2.12", + "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/orm": "^2.12|^3", "psr/log": "^1|^2|^3", "symfony/cache": "^5.4|^6.0", "symfony/config": "^5.4|^6.0", @@ -5717,7 +5717,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.3.5" + "source": "https://github.com/symfony/doctrine-bridge/tree/v6.3.7" }, "funding": [ { @@ -5733,20 +5733,20 @@ "type": "tidelift" } ], - "time": "2023-09-29T16:16:03+00:00" + "time": "2023-10-28T23:11:45+00:00" }, { "name": "symfony/dotenv", - "version": "v6.3.0", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "ceadb434fe2a6763a03d2d110441745834f3dd1e" + "reference": "7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/ceadb434fe2a6763a03d2d110441745834f3dd1e", - "reference": "ceadb434fe2a6763a03d2d110441745834f3dd1e", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e", + "reference": "7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e", "shasum": "" }, "require": { @@ -5791,7 +5791,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.3.0" + "source": "https://github.com/symfony/dotenv/tree/v6.3.7" }, "funding": [ { @@ -5807,7 +5807,7 @@ "type": "tidelift" } ], - "time": "2023-04-21T14:41:17+00:00" + "time": "2023-10-26T18:15:14+00:00" }, { "name": "symfony/error-handler", @@ -6232,16 +6232,16 @@ }, { "name": "symfony/flex", - "version": "v2.3.3", + "version": "v2.4.1", "source": { "type": "git", "url": "https://github.com/symfony/flex.git", - "reference": "9c402af768c6c9f8126a9ffa192ecf7c16581e35" + "reference": "ae6dea68771c5fca9d172e0c0910bdd06199f6f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/9c402af768c6c9f8126a9ffa192ecf7c16581e35", - "reference": "9c402af768c6c9f8126a9ffa192ecf7c16581e35", + "url": "https://api.github.com/repos/symfony/flex/zipball/ae6dea68771c5fca9d172e0c0910bdd06199f6f4", + "reference": "ae6dea68771c5fca9d172e0c0910bdd06199f6f4", "shasum": "" }, "require": { @@ -6277,7 +6277,7 @@ "description": "Composer plugin for Symfony", "support": { "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v2.3.3" + "source": "https://github.com/symfony/flex/tree/v2.4.1" }, "funding": [ { @@ -6293,20 +6293,20 @@ "type": "tidelift" } ], - "time": "2023-08-04T09:02:35+00:00" + "time": "2023-10-30T18:35:17+00:00" }, { "name": "symfony/form", - "version": "v6.3.5", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "0f9ad8600c1021983d096512066ee54332aa3139" + "reference": "e6743d188f168643cb247f65cbad09ddb1dfcfe5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/0f9ad8600c1021983d096512066ee54332aa3139", - "reference": "0f9ad8600c1021983d096512066ee54332aa3139", + "url": "https://api.github.com/repos/symfony/form/zipball/e6743d188f168643cb247f65cbad09ddb1dfcfe5", + "reference": "e6743d188f168643cb247f65cbad09ddb1dfcfe5", "shasum": "" }, "require": { @@ -6374,7 +6374,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.3.5" + "source": "https://github.com/symfony/form/tree/v6.3.7" }, "funding": [ { @@ -6390,20 +6390,20 @@ "type": "tidelift" } ], - "time": "2023-09-10T17:47:23+00:00" + "time": "2023-10-28T23:11:45+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.3.5", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "567cafcfc08e3076b47290a7558b0ca17a98b0ce" + "reference": "dba20792c726c30d455626eddfb2db008f64085f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/567cafcfc08e3076b47290a7558b0ca17a98b0ce", - "reference": "567cafcfc08e3076b47290a7558b0ca17a98b0ce", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/dba20792c726c30d455626eddfb2db008f64085f", + "reference": "dba20792c726c30d455626eddfb2db008f64085f", "shasum": "" }, "require": { @@ -6518,7 +6518,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/v6.3.5" + "source": "https://github.com/symfony/framework-bundle/tree/v6.3.7" }, "funding": [ { @@ -6534,20 +6534,20 @@ "type": "tidelift" } ], - "time": "2023-09-29T10:45:15+00:00" + "time": "2023-10-26T18:15:14+00:00" }, { "name": "symfony/http-client", - "version": "v6.3.5", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "213e564da4cbf61acc9728d97e666bcdb868c10d" + "reference": "cd67fcaf4524ec6ae5d9b2d9497682d7ad3ce57d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/213e564da4cbf61acc9728d97e666bcdb868c10d", - "reference": "213e564da4cbf61acc9728d97e666bcdb868c10d", + "url": "https://api.github.com/repos/symfony/http-client/zipball/cd67fcaf4524ec6ae5d9b2d9497682d7ad3ce57d", + "reference": "cd67fcaf4524ec6ae5d9b2d9497682d7ad3ce57d", "shasum": "" }, "require": { @@ -6610,7 +6610,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.3.5" + "source": "https://github.com/symfony/http-client/tree/v6.3.7" }, "funding": [ { @@ -6626,7 +6626,7 @@ "type": "tidelift" } ], - "time": "2023-09-29T15:57:12+00:00" + "time": "2023-10-29T12:41:36+00:00" }, { "name": "symfony/http-client-contracts", @@ -6708,16 +6708,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.3.5", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957" + "reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b50f5e281d722cb0f4c296f908bacc3e2b721957", - "reference": "b50f5e281d722cb0f4c296f908bacc3e2b721957", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/59d1837d5d992d16c2628cd0d6b76acf8d69b33e", + "reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e", "shasum": "" }, "require": { @@ -6727,12 +6727,12 @@ "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.2" + "symfony/cache": "<6.3" }, "require-dev": { - "doctrine/dbal": "^2.13.1|^3.0", + "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^5.4|^6.0", + "symfony/cache": "^6.3", "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", @@ -6765,7 +6765,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.5" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.7" }, "funding": [ { @@ -6781,20 +6781,20 @@ "type": "tidelift" } ], - "time": "2023-09-04T21:33:54+00:00" + "time": "2023-10-28T23:55:27+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.3.5", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "9f991a964368bee8d883e8d57ced4fe9fff04dfc" + "reference": "6d4098095f93279d9536a0e9124439560cc764d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f991a964368bee8d883e8d57ced4fe9fff04dfc", - "reference": "9f991a964368bee8d883e8d57ced4fe9fff04dfc", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6d4098095f93279d9536a0e9124439560cc764d0", + "reference": "6d4098095f93279d9536a0e9124439560cc764d0", "shasum": "" }, "require": { @@ -6878,7 +6878,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/v6.3.5" + "source": "https://github.com/symfony/http-kernel/tree/v6.3.7" }, "funding": [ { @@ -6894,20 +6894,20 @@ "type": "tidelift" } ], - "time": "2023-09-30T06:37:04+00:00" + "time": "2023-10-29T14:31:45+00:00" }, { "name": "symfony/intl", - "version": "v6.3.2", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "1f8cb145c869ed089a8531c51a6a4b31ed0b3c69" + "reference": "4cc98c05f2c55150a6aa5b3e20667f7a6d06cca9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/1f8cb145c869ed089a8531c51a6a4b31ed0b3c69", - "reference": "1f8cb145c869ed089a8531c51a6a4b31ed0b3c69", + "url": "https://api.github.com/repos/symfony/intl/zipball/4cc98c05f2c55150a6aa5b3e20667f7a6d06cca9", + "reference": "4cc98c05f2c55150a6aa5b3e20667f7a6d06cca9", "shasum": "" }, "require": { @@ -6960,7 +6960,7 @@ "localization" ], "support": { - "source": "https://github.com/symfony/intl/tree/v6.3.2" + "source": "https://github.com/symfony/intl/tree/v6.3.7" }, "funding": [ { @@ -6976,7 +6976,7 @@ "type": "tidelift" } ], - "time": "2023-07-20T07:43:09+00:00" + "time": "2023-10-28T23:11:45+00:00" }, { "name": "symfony/mailer", @@ -8021,16 +8021,16 @@ }, { "name": "symfony/rate-limiter", - "version": "v6.3.2", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/rate-limiter.git", - "reference": "5223387e4017f26c8c61c46d8e39c11fe4d504b7" + "reference": "1eba1f963a7a35cee5f19593c84c374b54bf12dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/5223387e4017f26c8c61c46d8e39c11fe4d504b7", - "reference": "5223387e4017f26c8c61c46d8e39c11fe4d504b7", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/1eba1f963a7a35cee5f19593c84c374b54bf12dc", + "reference": "1eba1f963a7a35cee5f19593c84c374b54bf12dc", "shasum": "" }, "require": { @@ -8071,7 +8071,7 @@ "rate-limiter" ], "support": { - "source": "https://github.com/symfony/rate-limiter/tree/v6.3.2" + "source": "https://github.com/symfony/rate-limiter/tree/v6.3.6" }, "funding": [ { @@ -8087,7 +8087,7 @@ "type": "tidelift" } ], - "time": "2023-07-13T14:29:38+00:00" + "time": "2023-10-11T18:18:20+00:00" }, { "name": "symfony/routing", @@ -8253,16 +8253,16 @@ }, { "name": "symfony/security-bundle", - "version": "v6.3.5", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "2df460eacceb11b9287cfafddda4d27023dd9001" + "reference": "8ece4fd6e242acbabad4461feae7c52fe1982c48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/2df460eacceb11b9287cfafddda4d27023dd9001", - "reference": "2df460eacceb11b9287cfafddda4d27023dd9001", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/8ece4fd6e242acbabad4461feae7c52fe1982c48", + "reference": "8ece4fd6e242acbabad4461feae7c52fe1982c48", "shasum": "" }, "require": { @@ -8279,7 +8279,8 @@ "symfony/password-hasher": "^5.4|^6.0", "symfony/security-core": "^6.2", "symfony/security-csrf": "^5.4|^6.0", - "symfony/security-http": "^6.3.4" + "symfony/security-http": "^6.3.6", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/browser-kit": "<5.4", @@ -8343,7 +8344,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/v6.3.5" + "source": "https://github.com/symfony/security-bundle/tree/v6.3.7" }, "funding": [ { @@ -8359,20 +8360,20 @@ "type": "tidelift" } ], - "time": "2023-09-25T17:05:55+00:00" + "time": "2023-10-26T18:15:14+00:00" }, { "name": "symfony/security-core", - "version": "v6.3.5", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "ec8f24dc1195f46483510892271d01a5202bba70" + "reference": "7ceb30fed93f5ea40ccde3173d1f7712527c0d62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/ec8f24dc1195f46483510892271d01a5202bba70", - "reference": "ec8f24dc1195f46483510892271d01a5202bba70", + "url": "https://api.github.com/repos/symfony/security-core/zipball/7ceb30fed93f5ea40ccde3173d1f7712527c0d62", + "reference": "7ceb30fed93f5ea40ccde3173d1f7712527c0d62", "shasum": "" }, "require": { @@ -8428,7 +8429,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.3.5" + "source": "https://github.com/symfony/security-core/tree/v6.3.7" }, "funding": [ { @@ -8444,7 +8445,7 @@ "type": "tidelift" } ], - "time": "2023-09-10T17:47:23+00:00" + "time": "2023-10-28T23:11:45+00:00" }, { "name": "symfony/security-csrf", @@ -8516,16 +8517,16 @@ }, { "name": "symfony/security-http", - "version": "v6.3.5", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "47058ea557a4c64ba86e9249651222842bd52e2a" + "reference": "573ef96ab62d509ac953362fa61f9d1bd283f3a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/47058ea557a4c64ba86e9249651222842bd52e2a", - "reference": "47058ea557a4c64ba86e9249651222842bd52e2a", + "url": "https://api.github.com/repos/symfony/security-http/zipball/573ef96ab62d509ac953362fa61f9d1bd283f3a7", + "reference": "573ef96ab62d509ac953362fa61f9d1bd283f3a7", "shasum": "" }, "require": { @@ -8535,7 +8536,8 @@ "symfony/http-kernel": "^6.3", "symfony/polyfill-mbstring": "~1.0", "symfony/property-access": "^5.4|^6.0", - "symfony/security-core": "^6.3" + "symfony/security-core": "^6.3", + "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/clock": "<6.3", @@ -8583,7 +8585,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.3.5" + "source": "https://github.com/symfony/security-http/tree/v6.3.6" }, "funding": [ { @@ -8599,20 +8601,20 @@ "type": "tidelift" } ], - "time": "2023-08-30T06:30:46+00:00" + "time": "2023-10-13T10:26:24+00:00" }, { "name": "symfony/serializer", - "version": "v6.3.5", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "855fc058c8bdbb69f53834f2fdb3876c9bc0ab7c" + "reference": "641472dd3d6dc3c4d0fdd1496ebd1b55c72e43d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/855fc058c8bdbb69f53834f2fdb3876c9bc0ab7c", - "reference": "855fc058c8bdbb69f53834f2fdb3876c9bc0ab7c", + "url": "https://api.github.com/repos/symfony/serializer/zipball/641472dd3d6dc3c4d0fdd1496ebd1b55c72e43d9", + "reference": "641472dd3d6dc3c4d0fdd1496ebd1b55c72e43d9", "shasum": "" }, "require": { @@ -8677,7 +8679,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/v6.3.5" + "source": "https://github.com/symfony/serializer/tree/v6.3.7" }, "funding": [ { @@ -8693,7 +8695,7 @@ "type": "tidelift" } ], - "time": "2023-09-29T16:18:53+00:00" + "time": "2023-10-26T18:15:14+00:00" }, { "name": "symfony/service-contracts", @@ -8927,16 +8929,16 @@ }, { "name": "symfony/translation", - "version": "v6.3.3", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd" + "reference": "30212e7c87dcb79c83f6362b00bde0e0b1213499" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", - "reference": "3ed078c54bc98bbe4414e1e9b2d5e85ed5a5c8bd", + "url": "https://api.github.com/repos/symfony/translation/zipball/30212e7c87dcb79c83f6362b00bde0e0b1213499", + "reference": "30212e7c87dcb79c83f6362b00bde0e0b1213499", "shasum": "" }, "require": { @@ -9002,7 +9004,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.3.3" + "source": "https://github.com/symfony/translation/tree/v6.3.7" }, "funding": [ { @@ -9018,7 +9020,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-10-28T23:11:45+00:00" }, { "name": "symfony/translation-contracts", @@ -9293,16 +9295,16 @@ }, { "name": "symfony/validator", - "version": "v6.3.5", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "48e815ba3b5eb72e632588dbf7ea2dc4e608ee47" + "reference": "9cc736663fa5839b9710ac2c303bb0b951014fc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/48e815ba3b5eb72e632588dbf7ea2dc4e608ee47", - "reference": "48e815ba3b5eb72e632588dbf7ea2dc4e608ee47", + "url": "https://api.github.com/repos/symfony/validator/zipball/9cc736663fa5839b9710ac2c303bb0b951014fc1", + "reference": "9cc736663fa5839b9710ac2c303bb0b951014fc1", "shasum": "" }, "require": { @@ -9369,7 +9371,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.3.5" + "source": "https://github.com/symfony/validator/tree/v6.3.7" }, "funding": [ { @@ -9385,20 +9387,20 @@ "type": "tidelift" } ], - "time": "2023-09-29T07:41:15+00:00" + "time": "2023-10-28T23:11:45+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.3.5", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5" + "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3d9999376be5fea8de47752837a3e1d1c5f69ef5", - "reference": "3d9999376be5fea8de47752837a3e1d1c5f69ef5", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/999ede244507c32b8e43aebaa10e9fce20de7c97", + "reference": "999ede244507c32b8e43aebaa10e9fce20de7c97", "shasum": "" }, "require": { @@ -9453,7 +9455,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.5" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.6" }, "funding": [ { @@ -9469,20 +9471,20 @@ "type": "tidelift" } ], - "time": "2023-09-12T10:11:35+00:00" + "time": "2023-10-12T18:45:56+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.3.4", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691" + "reference": "374d289c13cb989027274c86206ddc63b16a2441" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/df1f8aac5751871b83d30bf3e2c355770f8f0691", - "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/374d289c13cb989027274c86206ddc63b16a2441", + "reference": "374d289c13cb989027274c86206ddc63b16a2441", "shasum": "" }, "require": { @@ -9527,7 +9529,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.3.4" + "source": "https://github.com/symfony/var-exporter/tree/v6.3.6" }, "funding": [ { @@ -9543,20 +9545,20 @@ "type": "tidelift" } ], - "time": "2023-08-16T18:14:47+00:00" + "time": "2023-10-13T09:16:49+00:00" }, { "name": "symfony/webpack-encore-bundle", - "version": "v2.1.0", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/symfony/webpack-encore-bundle.git", - "reference": "50d4af5cca35dab66a51dfeeb63616937ba96f4a" + "reference": "75cb918df3f65e28cf0d4bc03042bc45ccb19dd0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/50d4af5cca35dab66a51dfeeb63616937ba96f4a", - "reference": "50d4af5cca35dab66a51dfeeb63616937ba96f4a", + "url": "https://api.github.com/repos/symfony/webpack-encore-bundle/zipball/75cb918df3f65e28cf0d4bc03042bc45ccb19dd0", + "reference": "75cb918df3f65e28cf0d4bc03042bc45ccb19dd0", "shasum": "" }, "require": { @@ -9598,7 +9600,7 @@ "description": "Integration with your Symfony app & Webpack Encore!", "support": { "issues": "https://github.com/symfony/webpack-encore-bundle/issues", - "source": "https://github.com/symfony/webpack-encore-bundle/tree/v2.1.0" + "source": "https://github.com/symfony/webpack-encore-bundle/tree/v2.1.1" }, "funding": [ { @@ -9614,20 +9616,20 @@ "type": "tidelift" } ], - "time": "2023-09-26T14:41:29+00:00" + "time": "2023-10-22T18:53:08+00:00" }, { "name": "symfony/yaml", - "version": "v6.3.3", + "version": "v6.3.7", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add" + "reference": "9758b6c69d179936435d0ffb577c3708d57e38a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add", - "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add", + "url": "https://api.github.com/repos/symfony/yaml/zipball/9758b6c69d179936435d0ffb577c3708d57e38a8", + "reference": "9758b6c69d179936435d0ffb577c3708d57e38a8", "shasum": "" }, "require": { @@ -9670,7 +9672,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.3.3" + "source": "https://github.com/symfony/yaml/tree/v6.3.7" }, "funding": [ { @@ -9686,7 +9688,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-10-28T23:31:00+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -10824,16 +10826,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.35.1", + "version": "v3.37.1", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "ec1ccc264994b6764882669973ca435cf05bab08" + "reference": "c3fe76976081ab871aa654e872da588077e19679" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/ec1ccc264994b6764882669973ca435cf05bab08", - "reference": "ec1ccc264994b6764882669973ca435cf05bab08", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/c3fe76976081ab871aa654e872da588077e19679", + "reference": "c3fe76976081ab871aa654e872da588077e19679", "shasum": "" }, "require": { @@ -10905,7 +10907,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.35.1" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.37.1" }, "funding": [ { @@ -10913,7 +10915,7 @@ "type": "github" } ], - "time": "2023-10-12T13:47:26+00:00" + "time": "2023-10-29T20:51:23+00:00" }, { "name": "masterminds/html5", @@ -11151,16 +11153,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.39", + "version": "1.10.40", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4" + "reference": "93c84b5bf7669920d823631e39904d69b9c7dc5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d9dedb0413f678b4d03cbc2279a48f91592c97c4", - "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/93c84b5bf7669920d823631e39904d69b9c7dc5d", + "reference": "93c84b5bf7669920d823631e39904d69b9c7dc5d", "shasum": "" }, "require": { @@ -11209,20 +11211,20 @@ "type": "tidelift" } ], - "time": "2023-10-17T15:46:26+00:00" + "time": "2023-10-30T14:48:31+00:00" }, { "name": "phpstan/phpstan-doctrine", - "version": "1.3.43", + "version": "1.3.45", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-doctrine.git", - "reference": "c5015035755ad2d5013bd6bf98ff423ca6150822" + "reference": "90e60ba9dbea4b29c7b87026a29e91ac0a02674e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/c5015035755ad2d5013bd6bf98ff423ca6150822", - "reference": "c5015035755ad2d5013bd6bf98ff423ca6150822", + "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/90e60ba9dbea4b29c7b87026a29e91ac0a02674e", + "reference": "90e60ba9dbea4b29c7b87026a29e91ac0a02674e", "shasum": "" }, "require": { @@ -11277,9 +11279,9 @@ "description": "Doctrine extensions for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-doctrine/issues", - "source": "https://github.com/phpstan/phpstan-doctrine/tree/1.3.43" + "source": "https://github.com/phpstan/phpstan-doctrine/tree/1.3.45" }, - "time": "2023-09-01T15:01:13+00:00" + "time": "2023-10-29T08:18:22+00:00" }, { "name": "phpstan/phpstan-phpunit", @@ -11335,21 +11337,21 @@ }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "b21c03d4f6f3a446e4311155f4be9d65048218e6" + "reference": "7a50e9662ee9f3942e4aaaf3d603653f60282542" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/b21c03d4f6f3a446e4311155f4be9d65048218e6", - "reference": "b21c03d4f6f3a446e4311155f4be9d65048218e6", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/7a50e9662ee9f3942e4aaaf3d603653f60282542", + "reference": "7a50e9662ee9f3942e4aaaf3d603653f60282542", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" + "phpstan/phpstan": "^1.10.34" }, "require-dev": { "nikic/php-parser": "^4.13.0", @@ -11378,22 +11380,22 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.1" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.2" }, - "time": "2023-03-29T14:47:40+00:00" + "time": "2023-10-30T14:35:06+00:00" }, { "name": "phpstan/phpstan-symfony", - "version": "1.3.4", + "version": "1.3.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "383855999db6a7d65d0bf580ce2762e17188c2a5" + "reference": "27ff6339f83796a7e0dd963cf445cd3c456fc620" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/383855999db6a7d65d0bf580ce2762e17188c2a5", - "reference": "383855999db6a7d65d0bf580ce2762e17188c2a5", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/27ff6339f83796a7e0dd963cf445cd3c456fc620", + "reference": "27ff6339f83796a7e0dd963cf445cd3c456fc620", "shasum": "" }, "require": { @@ -11450,9 +11452,9 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.4" + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.5" }, - "time": "2023-09-29T14:10:11+00:00" + "time": "2023-10-30T14:52:15+00:00" }, { "name": "phpunit/php-code-coverage", @@ -13050,16 +13052,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v6.3.2", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "e020e1efbd1b42cb670fcd7d19a25abbddba035d" + "reference": "c6f1df6a76c2c12bd14a0a5bf7c556dd935efe1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/e020e1efbd1b42cb670fcd7d19a25abbddba035d", - "reference": "e020e1efbd1b42cb670fcd7d19a25abbddba035d", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/c6f1df6a76c2c12bd14a0a5bf7c556dd935efe1d", + "reference": "c6f1df6a76c2c12bd14a0a5bf7c556dd935efe1d", "shasum": "" }, "require": { @@ -13111,7 +13113,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.3.2" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.3.6" }, "funding": [ { @@ -13127,7 +13129,7 @@ "type": "tidelift" } ], - "time": "2023-07-12T16:00:22+00:00" + "time": "2023-10-12T15:02:41+00:00" }, { "name": "symfony/process", @@ -13192,16 +13194,16 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v6.3.2", + "version": "v6.3.6", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "6101b5ab7857c373d237e121f9060c68b32e1373" + "reference": "249cb2486597d3ab810d8bcc8e4db5ad0fc3e3bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6101b5ab7857c373d237e121f9060c68b32e1373", - "reference": "6101b5ab7857c373d237e121f9060c68b32e1373", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/249cb2486597d3ab810d8bcc8e4db5ad0fc3e3bd", + "reference": "249cb2486597d3ab810d8bcc8e4db5ad0fc3e3bd", "shasum": "" }, "require": { @@ -13253,7 +13255,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.3.2" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.3.6" }, "funding": [ { @@ -13269,7 +13271,7 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:17:28+00:00" + "time": "2023-10-11T18:18:20+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/packages/monolog.yaml b/config/packages/monolog.yaml index 36ba8d0c..d2bb1b6f 100644 --- a/config/packages/monolog.yaml +++ b/config/packages/monolog.yaml @@ -1,6 +1,6 @@ when@prod: monolog: - channels: ["deprecation"] +# channels: ["deprecation"] handlers: main: type: fingers_crossed @@ -15,10 +15,11 @@ when@prod: type: console process_psr_3_messages: false channels: ["!event", "!doctrine"] - deprecation: - type: stream - channels: ["deprecation"] - path: "%kernel.logs_dir%/deprecations.log" +# deactivated, because currently there are too many deprecations cause by gedmo and doctrine +# deprecation: +# type: stream +# channels: ["deprecation"] +# path: "%kernel.logs_dir%/deprecations.log" when@dev: monolog: diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 3237af0a..05e3bdc1 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -60,6 +60,7 @@ security: logout: path: logout target: homepage + enable_csrf: true login_throttling: max_attempts: 5 diff --git a/src/Command/UserLoginLinkCommand.php b/src/Command/UserLoginLinkCommand.php index 3da06baa..f33f17dc 100644 --- a/src/Command/UserLoginLinkCommand.php +++ b/src/Command/UserLoginLinkCommand.php @@ -77,7 +77,7 @@ final class UserLoginLinkCommand extends Command $loginLink = $loginLinkDetails->getUrl(); if ($input->getOption('password-reset') === true) { - $user->setPasswordRequestedAt(new \DateTime()); + $user->markPasswordRequested(); $user->setRequiresPasswordReset(true); $this->userRepository->saveUser($user); } diff --git a/src/Constants.php b/src/Constants.php index 2cfbf1b9..1edd1018 100644 --- a/src/Constants.php +++ b/src/Constants.php @@ -17,11 +17,11 @@ class Constants /** * The current release version */ - public const VERSION = '2.1.0'; + public const VERSION = '2.2.0'; /** * The current release: major * 10000 + minor * 100 + patch */ - public const VERSION_ID = 20100; + public const VERSION_ID = 20200; /** * The software name */ diff --git a/src/Controller/Security/PasswordResetController.php b/src/Controller/Security/PasswordResetController.php index b7a12f7b..ca073c52 100644 --- a/src/Controller/Security/PasswordResetController.php +++ b/src/Controller/Security/PasswordResetController.php @@ -17,7 +17,6 @@ use App\Event\EmailPasswordResetEvent; use App\Form\PasswordResetForm; use App\User\LoginManager; use App\User\UserService; -use DateTime; use Psr\EventDispatcher\EventDispatcherInterface; use Symfony\Bridge\Twig\Mime\TemplatedEmail; use Symfony\Component\Form\FormInterface; @@ -83,7 +82,7 @@ final class PasswordResetController extends AbstractController // this will finally send the email $this->eventDispatcher->dispatch(new EmailEvent($event->getEmail())); - $user->setPasswordRequestedAt(new DateTime()); + $user->markPasswordRequested(); $this->userService->updateUser($user); } @@ -138,8 +137,7 @@ final class PasswordResetController extends AbstractController $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $user->setConfirmationToken(null); - $user->setPasswordRequestedAt(null); + $user->markPasswordResetted(); $user->setEnabled(true); $this->userService->updateUser($user); diff --git a/src/Entity/Timesheet.php b/src/Entity/Timesheet.php index ba2feb65..99064bbe 100644 --- a/src/Entity/Timesheet.php +++ b/src/Entity/Timesheet.php @@ -188,8 +188,8 @@ class Timesheet implements EntityWithMetaFields, ExportableItem #[ORM\Column(name: 'category', type: 'string', length: 10, nullable: false, options: ['default' => 'work'])] #[Assert\NotNull] private ?string $category = self::WORK; - #[ORM\Column(name: 'modified_at', type: 'datetime', nullable: true)] - private \DateTimeInterface $modifiedAt; + #[ORM\Column(name: 'modified_at', type: 'datetime_immutable', nullable: true)] + private \DateTimeImmutable $modifiedAt; // @phpstan-ignore-line - create migration and update all null values and then make it not null /** * Tags * @@ -586,12 +586,12 @@ class Timesheet implements EntityWithMetaFields, ExportableItem return $this; } - public function getModifiedAt(): \DateTimeInterface + public function getModifiedAt(): \DateTimeImmutable { return $this->modifiedAt; } - public function setModifiedAt(\DateTimeInterface $dateTime): void + public function setModifiedAt(\DateTimeImmutable $dateTime): void { $this->modifiedAt = $dateTime; } diff --git a/src/Entity/User.php b/src/Entity/User.php index 02ffd21d..dc9394bc 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -196,8 +196,8 @@ class User implements UserInterface, EquatableInterface, ThemeUserInterface, Pas #[ORM\Column(name: 'confirmation_token', type: 'string', length: 180, unique: true, nullable: true)] #[Assert\Length(max: 180)] private ?string $confirmationToken = null; - #[ORM\Column(name: 'password_requested_at', type: 'datetime', nullable: true)] - private ?\DateTime $passwordRequestedAt = null; + #[ORM\Column(name: 'password_requested_at', type: 'datetime_immutable', nullable: true)] + private ?\DateTimeImmutable $passwordRequestedAt = null; /** * List of all role names */ @@ -958,26 +958,31 @@ class User implements UserInterface, EquatableInterface, ThemeUserInterface, Pas return $this; } - public function setConfirmationToken($confirmationToken): User + public function setConfirmationToken($confirmationToken): void { $this->confirmationToken = $confirmationToken; - - return $this; } - public function setPasswordRequestedAt(?\DateTime $date = null): User + public function markPasswordRequested(): void + { + $this->setPasswordRequestedAt(new \DateTimeImmutable('now', new \DateTimeZone($this->getTimezone()))); + } + + public function markPasswordResetted(): void + { + $this->setConfirmationToken(null); + $this->setPasswordRequestedAt(null); + } + + public function setPasswordRequestedAt(?\DateTimeImmutable $date): void { $this->passwordRequestedAt = $date; - - return $this; } /** * Gets the timestamp that the user requested a password reset. - * - * @return DateTime|null */ - public function getPasswordRequestedAt(): ?DateTime + public function getPasswordRequestedAt(): ?\DateTimeImmutable { return $this->passwordRequestedAt; } diff --git a/src/Entity/WorkingTime.php b/src/Entity/WorkingTime.php index f2e62902..e0df450f 100644 --- a/src/Entity/WorkingTime.php +++ b/src/Entity/WorkingTime.php @@ -41,9 +41,9 @@ class WorkingTime #[ORM\ManyToOne(targetEntity: User::class)] #[ORM\JoinColumn(name: 'approved_by', nullable: true, onDelete: 'SET NULL')] private ?User $approvedBy = null; - #[ORM\Column(name: 'approved_at', type: 'datetime', nullable: true)] + #[ORM\Column(name: 'approved_at', type: 'datetime_immutable', nullable: true)] #[Assert\NotNull] - private ?\DateTimeInterface $approvedAt = null; + private ?\DateTimeImmutable $approvedAt = null; public function __construct(User $user, \DateTimeInterface $date) { @@ -96,12 +96,12 @@ class WorkingTime $this->approvedBy = $approvedBy; } - public function getApprovedAt(): ?\DateTimeInterface + public function getApprovedAt(): ?\DateTimeImmutable { return $this->approvedAt; } - public function setApprovedAt(?\DateTimeInterface $approvedAt): void + public function setApprovedAt(?\DateTimeImmutable $approvedAt): void { $this->approvedAt = $approvedAt; } diff --git a/src/Model/Day.php b/src/Model/Day.php index 6b260790..c7e425d3 100644 --- a/src/Model/Day.php +++ b/src/Model/Day.php @@ -9,15 +9,15 @@ namespace App\Model; -use DateTimeInterface; +use DateTimeImmutable; class Day { - public function __construct(private DateTimeInterface $day) + public function __construct(private DateTimeImmutable $day) { } - public function getDay(): DateTimeInterface + public function getDay(): DateTimeImmutable { return $this->day; } diff --git a/src/Model/Month.php b/src/Model/Month.php index 4805c018..c0046b6e 100644 --- a/src/Model/Month.php +++ b/src/Model/Month.php @@ -20,7 +20,7 @@ class Month public function __construct(private \DateTimeInterface $month) { - $date = new \DateTimeImmutable($this->month->format('Y-m-01 00:00:00')); + $date = new \DateTimeImmutable($this->month->format('Y-m-01 00:00:00'), $month->getTimezone()); $start = $date->format('m'); while ($start === $date->format('m')) { $day = $this->createDay($date); @@ -29,7 +29,7 @@ class Month } } - protected function createDay(\DateTimeInterface $day): Day + protected function createDay(\DateTimeImmutable $day): Day { return new Day($day); } diff --git a/src/Model/Year.php b/src/Model/Year.php index 414c4d98..52388375 100644 --- a/src/Model/Year.php +++ b/src/Model/Year.php @@ -20,17 +20,15 @@ class Year public function __construct(private DateTimeInterface $month) { - $monthDate = new \DateTimeImmutable(); - $monthDate = $monthDate->setDate((int) $this->month->format('Y'), 1, 1); - $monthDate = $monthDate->setTime(1, 0); + $monthDate = new \DateTimeImmutable($this->month->format('Y-01-01 01:00:00'), $this->month->getTimezone()); for ($i = 1; $i < 13; $i++) { - $month = $this->createMonth($monthDate); - $this->setMonth($month); + $tmp = $this->createMonth($monthDate); + $this->setMonth($tmp); $monthDate = $monthDate->add(new \DateInterval('P1M')); } } - protected function createMonth(\DateTimeInterface $month): Month + protected function createMonth(\DateTimeImmutable $month): Month { return new Month($month); } diff --git a/src/Twig/SecurityPolicy/InvoicePolicy.php b/src/Twig/SecurityPolicy/InvoicePolicy.php index 655b021b..cf1471ff 100644 --- a/src/Twig/SecurityPolicy/InvoicePolicy.php +++ b/src/Twig/SecurityPolicy/InvoicePolicy.php @@ -31,14 +31,113 @@ final class InvoicePolicy implements SecurityPolicyInterface $this->policy->addPolicy(new SecurityPolicy( ['block', 'if', 'for', 'set', 'extends'], [ - // Twig core filters - 'map', 'escape', 'trans', 'default', 'nl2br', 'trim', 'raw', - 'join', 'u', 'slice', 'date', 'month_name', 'first', 'country_name', - 'replace', 'length', 'number_format', 'split', + // ================================================================= + // vendor/twig/twig/src/Extension/CoreExtension.php - // Kimai filters - 'md2html', 'desc2html', 'comment2html', 'comment1line', 'multiline_indent', 'nl2str', - 'date_short', 'duration', 'amount', 'money', 'duration_decimal', + // formatting filters + 'date', + 'date_modify', + 'format', + 'replace', + 'number_format', + 'abs', + 'round', + + // encoding + 'url_encode', + 'json_encode', + 'convert_encoding', + + // string filters + 'title', + 'capitalize', + 'upper', + 'lower', + 'striptags', + 'trim', + 'nl2br', + 'spaceless', + + // array helpers + 'join', + 'split', + 'sort', + 'merge', + 'batch', + 'column', + 'filter', + 'map', + 'reduce', + + // string/array filters + 'reverse', + 'length', + 'slice', + 'first', + 'last', + + // iteration and runtime + 'default', + 'keys', + + // ================================================================= + // vendor/twig/twig/src/Extension/EscaperExtension.php + 'escape', + 'e', + 'raw', + + // ================================================================= + // vendor/symfony/twig-bridge/Extension/TranslationExtension.php + 'trans', + + // ================================================================= + // vendor/twig/string-extra/StringExtension.php + 'u', + 'slug', + + // ================================================================= + // vendor/twig/intl-extra/IntlExtension.php + 'country_name', + 'currency_name', + 'currency_symbol', + 'language_name', + 'locale_name', + 'format_currency', + 'format_number', + 'format_*_number', + 'format_datetime', + 'format_date', + 'format_time', + + // ================================================================= + // src/Twig/LocaleFormatExtensions.php + 'month_name', + 'day_name', + 'date_short', + 'date_time', + 'date_full', + 'date_format', + 'date_weekday', + 'time', + 'duration', + 'duration_decimal', + 'money', + 'amount', + + // ================================================================= + // src/Twig/RuntimeExtensions.php + 'md2html', + 'desc2html', + 'comment2html', + 'comment1line', + + // ================================================================= + // src/Twig/Extensions.php + 'multiline_indent', + 'color', + 'font_contrast', + 'default_color', + 'nl2str', ], [ PdfContext::class => ['setoption'], @@ -46,11 +145,37 @@ final class InvoicePolicy implements SecurityPolicyInterface ], [], // properties [ - // Twig core functions - 'cycle', 'asset', 'range', + // ================================================================= + // vendor/twig/twig/src/Extension/CoreExtension.php + 'max', + 'min', + 'range', + 'constant', + 'cycle', + 'random', + 'date', + 'asset', + 'range', - // Kimai functions - 'encore_entry_css_source', 'qr_code_data_uri', 'config', + // ================================================================= + // vendor/symfony/twig-bridge/Extension/TranslationExtension.php + 't', + + // ================================================================= + // vendor/symfony/webpack-encore-bundle/src/Twig/EntryFilesTwigExtension.php + 'encore_entry_css_source', + + // ================================================================= + // vendor/symfony/twig-bridge/Extension/AssetExtension.php + 'asset', + + // ================================================================= + // Twig/RuntimeExtensions.php + 'qr_code_data_uri', + + // ================================================================= + // Twig/Configuration.php + 'config', ] )); } diff --git a/src/WorkingTime/Model/Month.php b/src/WorkingTime/Model/Month.php index 54aa0eb6..8b1d4d98 100644 --- a/src/WorkingTime/Model/Month.php +++ b/src/WorkingTime/Model/Month.php @@ -18,7 +18,7 @@ use App\Model\Month as BaseMonth; */ final class Month extends BaseMonth { - public function __construct(\DateTimeInterface $month, private User $user) + public function __construct(\DateTimeImmutable $month, private User $user) { parent::__construct($month); } @@ -67,7 +67,7 @@ final class Month extends BaseMonth return null; } - protected function createDay(\DateTimeInterface $day): Day + protected function createDay(\DateTimeImmutable $day): Day { return new Day($day); } diff --git a/src/WorkingTime/Model/Year.php b/src/WorkingTime/Model/Year.php index e4b35d73..d3e4c355 100644 --- a/src/WorkingTime/Model/Year.php +++ b/src/WorkingTime/Model/Year.php @@ -28,7 +28,7 @@ final class Year extends BaseYear return $this->user; } - protected function createMonth(\DateTimeInterface $month): Month + protected function createMonth(\DateTimeImmutable $month): Month { return new Month($month, $this->user); } diff --git a/src/WorkingTime/WorkingTimeService.php b/src/WorkingTime/WorkingTimeService.php index f3a7cbf4..2f3255fd 100644 --- a/src/WorkingTime/WorkingTimeService.php +++ b/src/WorkingTime/WorkingTimeService.php @@ -117,7 +117,8 @@ final class WorkingTimeService } $workingTime->setApprovedBy($approver); - $workingTime->setApprovedAt($approvalDate); + // FIXME see calling method + $workingTime->setApprovedAt(\DateTimeImmutable::createFromInterface($approvalDate)); $this->workingTimeRepository->scheduleWorkingTimeUpdate($workingTime); } diff --git a/tests/Configuration/SystemConfigurationTest.php b/tests/Configuration/SystemConfigurationTest.php index cbd8eb8e..d18c42ca 100644 --- a/tests/Configuration/SystemConfigurationTest.php +++ b/tests/Configuration/SystemConfigurationTest.php @@ -24,14 +24,17 @@ class SystemConfigurationTest extends TestCase * @param array $loaderSettings * @return SystemConfiguration */ - protected function getSut(array $settings, array $loaderSettings = []) + protected function getSut(array $settings, array $loaderSettings = []): SystemConfiguration { $loader = new TestConfigLoader($loaderSettings); return SystemConfigurationFactory::create($loader, $settings); } - protected function getDefaultSettings() + /** + * @return array> + */ + protected function getDefaultSettings(): array { return [ 'timesheet' => [ @@ -106,7 +109,10 @@ class SystemConfigurationTest extends TestCase ]; } - protected function getDefaultLoaderSettings() + /** + * @return array + */ + protected function getDefaultLoaderSettings(): array { return [ (new Configuration())->setName('defaults.customer.timezone')->setValue('Russia/Moscov'), @@ -123,7 +129,7 @@ class SystemConfigurationTest extends TestCase ]; } - public function testDefaultWithoutLoader() + public function testDefaultWithoutLoader(): void { $sut = $this->getSut($this->getDefaultSettings(), []); $this->assertEquals('Europe/London', $sut->find('defaults.customer.timezone')); @@ -133,7 +139,7 @@ class SystemConfigurationTest extends TestCase $this->assertEquals('Maroon|#800000,Brown|#a52a2a,Red|#ff0000,Orange|#ffa500,#ffffff,,|#000000', $sut->getThemeColorChoices()); } - public function testDefaultWithLoader() + public function testDefaultWithLoader(): void { $sut = $this->getSut($this->getDefaultSettings(), $this->getDefaultLoaderSettings()); $this->assertEquals('Russia/Moscov', $sut->find('defaults.customer.timezone')); @@ -143,7 +149,7 @@ class SystemConfigurationTest extends TestCase $this->assertFalse($sut->isSamlActive()); } - public function testDefaultWithMixedConfigs() + public function testDefaultWithMixedConfigs(): void { $sut = $this->getSut($this->getDefaultSettings(), [ (new Configuration())->setName('timesheet.rules.allow_future_times')->setValue(''), @@ -157,7 +163,7 @@ class SystemConfigurationTest extends TestCase $this->assertEquals('2020-03-27', $sut->getFinancialYearStart()); } - public function testOffsetUnsetThrowsException() + public function testOffsetUnsetThrowsException(): void { $this->expectException(\BadMethodCallException::class); $this->expectExceptionMessage('SystemBundleConfiguration does not support offsetUnset()'); @@ -166,7 +172,7 @@ class SystemConfigurationTest extends TestCase $sut->offsetUnset('dfsdf'); } - public function testUnknownConfigs() + public function testUnknownConfigs(): void { $sut = $this->getSut($this->getDefaultSettings(), [ (new Configuration())->setName('timesheet.foo')->setValue('hello'), @@ -182,7 +188,7 @@ class SystemConfigurationTest extends TestCase $this->assertEquals('foooo-bar!', $sut->find('xxxxxxxx.yyyyyyyyy')); } - public function testCalendarWithoutLoader() + public function testCalendarWithoutLoader(): void { $sut = $this->getSut($this->getDefaultSettings(), []); $this->assertEquals('07:49', $sut->getCalendarBusinessTimeBegin()); @@ -199,7 +205,7 @@ class SystemConfigurationTest extends TestCase $this->assertEquals(2, \count($sources)); } - public function testCalendarWithLoader() + public function testCalendarWithLoader(): void { $sut = $this->getSut($this->getDefaultSettings(), $this->getDefaultLoaderSettings()); $this->assertEquals('00:30:00', $sut->getCalendarSlotDuration()); @@ -207,7 +213,7 @@ class SystemConfigurationTest extends TestCase $this->assertEquals(2, \count($sources)); } - public function testFormDefaultWithoutLoader() + public function testFormDefaultWithoutLoader(): void { $sut = $this->getSut($this->getDefaultSettings(), []); $this->assertEquals('Europe/London', $sut->getCustomerDefaultTimezone()); @@ -220,7 +226,7 @@ class SystemConfigurationTest extends TestCase $this->assertNull($sut->getFinancialYearStart()); } - public function testFormDefaultWithLoader() + public function testFormDefaultWithLoader(): void { $sut = $this->getSut($this->getDefaultSettings(), $this->getDefaultLoaderSettings()); $this->assertEquals('Russia/Moscov', $sut->getCustomerDefaultTimezone()); @@ -232,7 +238,7 @@ class SystemConfigurationTest extends TestCase $this->assertEquals('USD', $sut->getUserDefaultCurrency()); } - public function testTimesheetWithoutLoader() + public function testTimesheetWithoutLoader(): void { $sut = $this->getSut($this->getDefaultSettings(), []); $this->assertEquals(99, $sut->getTimesheetActiveEntriesHardLimit()); @@ -250,7 +256,7 @@ class SystemConfigurationTest extends TestCase $this->assertEquals(5, $sut->getTimesheetIncrementMinutes()); } - public function testTimesheetWithLoader() + public function testTimesheetWithLoader(): void { $sut = $this->getSut($this->getDefaultSettings(), $this->getDefaultLoaderSettings()); $this->assertEquals(7, $sut->getTimesheetActiveEntriesHardLimit()); diff --git a/tests/Controller/LayoutControllerTest.php b/tests/Controller/LayoutControllerTest.php index b7d489a7..fce5b537 100644 --- a/tests/Controller/LayoutControllerTest.php +++ b/tests/Controller/LayoutControllerTest.php @@ -38,7 +38,7 @@ class LayoutControllerTest extends ControllerBaseTest $this->assertStringContainsString('href="/en/profile/' . $user->getUserIdentifier() . '"', $content); $this->assertStringContainsString('href="/en/profile/' . $user->getUserIdentifier() . '/edit"', $content); $this->assertStringContainsString('href="/en/profile/' . $user->getUserIdentifier() . '/prefs"', $content); - $this->assertStringContainsString('href="/en/logout"', $content); + $this->assertStringContainsString('href="/en/logout?_csrf_token=', $content); } protected function assertHasNavigation(HttpKernelBrowser $client) diff --git a/tests/Entity/TimesheetTest.php b/tests/Entity/TimesheetTest.php index 5d91738c..a2d4dc43 100644 --- a/tests/Entity/TimesheetTest.php +++ b/tests/Entity/TimesheetTest.php @@ -183,7 +183,7 @@ class TimesheetTest extends TestCase $sut->setExported(true); $sut->setDescription('Invalid timesheet category "foo" given, expected one of: work, holiday, sickness, parental, overtime'); - $modifiedDate = new \DateTime(); + $modifiedDate = new \DateTimeImmutable(); $reflection = new \ReflectionClass($sut); $property = $reflection->getProperty('modifiedAt'); diff --git a/tests/Entity/UserTest.php b/tests/Entity/UserTest.php index ebba943b..84f1b2e4 100644 --- a/tests/Entity/UserTest.php +++ b/tests/Entity/UserTest.php @@ -219,7 +219,7 @@ class UserTest extends TestCase public function testPasswordRequestedAt(): void { - $date = new \DateTime('-60 minutes'); + $date = new \DateTimeImmutable('-60 minutes'); $sut = new User(); self::assertFalse($sut->isPasswordRequestNonExpired(3599)); diff --git a/tests/Entity/WorkingTimeTest.php b/tests/Entity/WorkingTimeTest.php index d802eb5b..7e9de940 100644 --- a/tests/Entity/WorkingTimeTest.php +++ b/tests/Entity/WorkingTimeTest.php @@ -22,7 +22,7 @@ class WorkingTimeTest extends TestCase { $user = new User(); $user->setUsername('bar'); - $date = new \DateTime(); + $date = new \DateTimeImmutable(); $sut = new WorkingTime($user, $date); self::assertSame($user, $sut->getUser()); @@ -36,7 +36,7 @@ class WorkingTimeTest extends TestCase self::assertNull($sut->getApprovedBy()); self::assertFalse($sut->isApproved()); - $approvedAt = new \DateTime('2023-01-01 12:00:00', new \DateTimeZone('Europe/Vienna')); + $approvedAt = new \DateTimeImmutable('2023-01-01 12:00:00', new \DateTimeZone('Europe/Vienna')); $approvedBy = new User(); $approvedBy->setUsername('foo'); diff --git a/tests/phpstan.neon b/tests/phpstan.neon index e97254e5..02bcd497 100644 --- a/tests/phpstan.neon +++ b/tests/phpstan.neon @@ -1922,16 +1922,6 @@ parameters: count: 1 path: Configuration/SamlConfigurationTest.php - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:getDefaultLoaderSettings\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:getDefaultSettings\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:getSut\\(\\) has parameter \\$loaderSettings with no value type specified in iterable type array\\.$#" count: 1 @@ -1942,61 +1932,6 @@ parameters: count: 1 path: Configuration/SystemConfigurationTest.php - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:testCalendarWithLoader\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:testCalendarWithoutLoader\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:testDefaultWithLoader\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:testDefaultWithMixedConfigs\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:testDefaultWithoutLoader\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:testFormDefaultWithLoader\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:testFormDefaultWithoutLoader\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:testOffsetUnsetThrowsException\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:testTimesheetWithLoader\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:testTimesheetWithoutLoader\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - - - message: "#^Method App\\\\Tests\\\\Configuration\\\\SystemConfigurationTest\\:\\:testUnknownConfigs\\(\\) has no return type specified\\.$#" - count: 1 - path: Configuration/SystemConfigurationTest.php - - message: "#^Method App\\\\Tests\\\\ConsoleApplicationTest\\:\\:testVersion\\(\\) has no return type specified\\.$#" count: 1