diff --git a/composer.json b/composer.json index 53ddd14f0..720359f78 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,7 @@ "type": "project", "license": "AGPL-3.0-only", "require": { - "php": ">=8.1.0 <8.4.0", + "php": ">=8.1.0 <8.5.0", "ext-ctype": "*", "ext-dom": "*", "ext-gd": "*", @@ -12,8 +12,7 @@ "ext-json": "*", "ext-mysqli": "*", "ext-soap": "*", - "apereo/phpcas": "~1.6.0", - "firebase/php-jwt": "^6.4.0", + "apereo/phpcas": "dev-master", "guzzlehttp/guzzle": "^7.5.1", "league/oauth2-google": "^4.0.1", "nikic/php-parser": "dev-master", @@ -40,10 +39,16 @@ "symfony/stopwatch": "~6.4.0", "symfony/web-profiler-bundle": "~6.4.0" }, - "repositories": [{ - "type": "vcs", - "url": "https://github.com/Combodo/PHP-Parser" - }], + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/Combodo/PHP-Parser" + }, + { + "type": "vcs", + "url": "https://github.com/EsupPortail/phpCAS" + } + ], "suggest": { "ext-libsodium": "Required to use the AttributeEncryptedString.", "ext-openssl": "Can be used as a polyfill if libsodium is not installed", diff --git a/composer.lock b/composer.lock index be99d6b17..07b88c2a1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3e627286597661542dd598499c2bcc36", + "content-hash": "fc0e9e9dea11dcbb6272414776c30685", "packages": [ { "name": "apereo/phpcas", - "version": "1.6.1", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/apereo/phpCAS.git", - "reference": "c129708154852656aabb13d8606cd5b12dbbabac" + "url": "https://github.com/EsupPortail/phpCAS.git", + "reference": "57a7744146a963d8fa80192e0ab351051b711ff6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/apereo/phpCAS/zipball/c129708154852656aabb13d8606cd5b12dbbabac", - "reference": "c129708154852656aabb13d8606cd5b12dbbabac", + "url": "https://api.github.com/repos/EsupPortail/phpCAS/zipball/57a7744146a963d8fa80192e0ab351051b711ff6", + "reference": "57a7744146a963d8fa80192e0ab351051b711ff6", "shasum": "" }, "require": { @@ -31,6 +31,7 @@ "phpstan/phpstan": "^1.5", "phpunit/phpunit": ">=7.5" }, + "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -45,15 +46,27 @@ "source/" ] }, - "notification-url": "https://packagist.org/downloads/", + "autoload-dev": { + "psr-4": { + "PhpCas\\": "test/CAS/" + } + }, + "scripts": { + "test": [ + "phpunit" + ], + "phpstan": [ + "phpstan" + ] + }, "license": [ "Apache-2.0" ], "authors": [ { "name": "Joachim Fritschi", - "email": "jfritschi@freenet.de", - "homepage": "https://github.com/jfritschi" + "homepage": "https://github.com/jfritschi", + "email": "jfritschi@freenet.de" }, { "name": "Adam Franco", @@ -72,10 +85,10 @@ "jasig" ], "support": { - "issues": "https://github.com/apereo/phpCAS/issues", - "source": "https://github.com/apereo/phpCAS/tree/1.6.1" + "source": "https://github.com/EsupPortail/phpCAS/tree/master", + "issues": "https://github.com/EsupPortail/phpCAS/issues" }, - "time": "2023-02-19T19:52:35+00:00" + "time": "2025-12-02T11:38:23+00:00" }, { "name": "doctrine/lexer", @@ -223,16 +236,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.11.1", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66" + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", - "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", "shasum": "" }, "require": { @@ -280,9 +293,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.11.1" + "source": "https://github.com/firebase/php-jwt/tree/v7.0.3" }, - "time": "2025-04-09T20:32:01+00:00" + "time": "2026-02-25T22:16:40+00:00" }, { "name": "guzzlehttp/guzzle", @@ -611,22 +624,22 @@ }, { "name": "league/oauth2-client", - "version": "2.8.1", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/thephpleague/oauth2-client.git", - "reference": "9df2924ca644736c835fc60466a3a60390d334f9" + "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/9df2924ca644736c835fc60466a3a60390d334f9", - "reference": "9df2924ca644736c835fc60466a3a60390d334f9", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/26e8c5da4f3d78cede7021e09b1330a0fc093d5e", + "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "php": "^7.1 || >=8.0.0 <8.5.0" + "php": "^7.1 || >=8.0.0 <8.6.0" }, "require-dev": { "mockery/mockery": "^1.3.5", @@ -670,22 +683,22 @@ ], "support": { "issues": "https://github.com/thephpleague/oauth2-client/issues", - "source": "https://github.com/thephpleague/oauth2-client/tree/2.8.1" + "source": "https://github.com/thephpleague/oauth2-client/tree/2.9.0" }, - "time": "2025-02-26T04:37:30+00:00" + "time": "2025-11-25T22:17:17+00:00" }, { "name": "league/oauth2-google", - "version": "4.0.1", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/thephpleague/oauth2-google.git", - "reference": "1b01ba18ba31b29e88771e3e0979e5c91d4afe76" + "reference": "8b9bb43740ac6d994aca881a35f7bacbe98c0ffb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/1b01ba18ba31b29e88771e3e0979e5c91d4afe76", - "reference": "1b01ba18ba31b29e88771e3e0979e5c91d4afe76", + "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/8b9bb43740ac6d994aca881a35f7bacbe98c0ffb", + "reference": "8b9bb43740ac6d994aca881a35f7bacbe98c0ffb", "shasum": "" }, "require": { @@ -725,9 +738,9 @@ ], "support": { "issues": "https://github.com/thephpleague/oauth2-google/issues", - "source": "https://github.com/thephpleague/oauth2-google/tree/4.0.1" + "source": "https://github.com/thephpleague/oauth2-google/tree/4.1.0" }, - "time": "2023-03-17T15:20:52+00:00" + "time": "2025-12-15T12:24:14+00:00" }, { "name": "nikic/php-parser", @@ -735,12 +748,12 @@ "source": { "type": "git", "url": "https://github.com/Combodo/PHP-Parser.git", - "reference": "8ffc1239ff48ed2476b2672dbcc939fcdc5b0f7a" + "reference": "b2cd0735eb27788d5d41fa3c2cfaa01a593fd7fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Combodo/PHP-Parser/zipball/8ffc1239ff48ed2476b2672dbcc939fcdc5b0f7a", - "reference": "8ffc1239ff48ed2476b2672dbcc939fcdc5b0f7a", + "url": "https://api.github.com/repos/Combodo/PHP-Parser/zipball/b2cd0735eb27788d5d41fa3c2cfaa01a593fd7fb", + "reference": "b2cd0735eb27788d5d41fa3c2cfaa01a593fd7fb", "shasum": "" }, "require": { @@ -789,7 +802,7 @@ "support": { "source": "https://github.com/Combodo/PHP-Parser/tree/master" }, - "time": "2025-09-09T09:14:16+00:00" + "time": "2025-09-18T12:29:15+00:00" }, { "name": "pear/archive_tar", @@ -924,16 +937,16 @@ }, { "name": "pear/pear-core-minimal", - "version": "v1.10.16", + "version": "v1.10.18", "source": { "type": "git", "url": "https://github.com/pear/pear-core-minimal.git", - "reference": "c0f51b45f50683bf5bbf558036854ebc9b54d033" + "reference": "c7b55789d01de0ce090d289b73f1bbd6a2f113b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/c0f51b45f50683bf5bbf558036854ebc9b54d033", - "reference": "c0f51b45f50683bf5bbf558036854ebc9b54d033", + "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/c7b55789d01de0ce090d289b73f1bbd6a2f113b1", + "reference": "c7b55789d01de0ce090d289b73f1bbd6a2f113b1", "shasum": "" }, "require": { @@ -969,7 +982,7 @@ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR", "source": "https://github.com/pear/pear-core-minimal" }, - "time": "2024-11-24T22:27:58+00:00" + "time": "2025-12-14T20:37:07+00:00" }, { "name": "pear/pear_exception", @@ -1721,16 +1734,16 @@ }, { "name": "symfony/cache", - "version": "v6.4.33", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "5b088fa41eb9568748dc255c45e4054c387ba73b" + "reference": "a0a1690543329685c044362c873b78c6de9d4faa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/5b088fa41eb9568748dc255c45e4054c387ba73b", - "reference": "5b088fa41eb9568748dc255c45e4054c387ba73b", + "url": "https://api.github.com/repos/symfony/cache/zipball/a0a1690543329685c044362c873b78c6de9d4faa", + "reference": "a0a1690543329685c044362c873b78c6de9d4faa", "shasum": "" }, "require": { @@ -1797,7 +1810,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.33" + "source": "https://github.com/symfony/cache/tree/v6.4.34" }, "funding": [ { @@ -1817,7 +1830,7 @@ "type": "tidelift" } ], - "time": "2026-01-27T15:05:20+00:00" + "time": "2026-02-20T15:06:30+00:00" }, { "name": "symfony/cache-contracts", @@ -1897,16 +1910,16 @@ }, { "name": "symfony/config", - "version": "v6.4.32", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "d445badf0ad2c2a492e38c0378c39997a56ef97b" + "reference": "ce9cb0c0d281aaf188b802d4968e42bfb60701e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/d445badf0ad2c2a492e38c0378c39997a56ef97b", - "reference": "d445badf0ad2c2a492e38c0378c39997a56ef97b", + "url": "https://api.github.com/repos/symfony/config/zipball/ce9cb0c0d281aaf188b802d4968e42bfb60701e9", + "reference": "ce9cb0c0d281aaf188b802d4968e42bfb60701e9", "shasum": "" }, "require": { @@ -1952,7 +1965,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.32" + "source": "https://github.com/symfony/config/tree/v6.4.34" }, "funding": [ { @@ -1972,20 +1985,20 @@ "type": "tidelift" } ], - "time": "2026-01-13T08:40:30+00:00" + "time": "2026-02-24T17:34:50+00:00" }, { "name": "symfony/console", - "version": "v6.4.32", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3" + "reference": "7b1f1c37eff5910ddda2831345467e593a5120ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3", - "reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3", + "url": "https://api.github.com/repos/symfony/console/zipball/7b1f1c37eff5910ddda2831345467e593a5120ad", + "reference": "7b1f1c37eff5910ddda2831345467e593a5120ad", "shasum": "" }, "require": { @@ -2050,7 +2063,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.32" + "source": "https://github.com/symfony/console/tree/v6.4.34" }, "funding": [ { @@ -2070,20 +2083,20 @@ "type": "tidelift" } ], - "time": "2026-01-13T08:45:59+00:00" + "time": "2026-02-23T15:42:15+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.24", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "9b784413143701aa3c94ac1869a159a9e53e8761" + "reference": "b0314c186f1464de048cce58979ff1625ca88bbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/9b784413143701aa3c94ac1869a159a9e53e8761", - "reference": "9b784413143701aa3c94ac1869a159a9e53e8761", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/b0314c186f1464de048cce58979ff1625ca88bbb", + "reference": "b0314c186f1464de048cce58979ff1625ca88bbb", "shasum": "" }, "require": { @@ -2119,7 +2132,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.24" + "source": "https://github.com/symfony/css-selector/tree/v6.4.34" }, "funding": [ { @@ -2139,20 +2152,20 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2026-02-16T08:37:21+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.32", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "b17882e933c4c606620247b6708ab53aa3b88753" + "reference": "91e49958b8a6092e48e4711894a1aeb1b151c62a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b17882e933c4c606620247b6708ab53aa3b88753", - "reference": "b17882e933c4c606620247b6708ab53aa3b88753", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/91e49958b8a6092e48e4711894a1aeb1b151c62a", + "reference": "91e49958b8a6092e48e4711894a1aeb1b151c62a", "shasum": "" }, "require": { @@ -2204,7 +2217,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/v6.4.32" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.34" }, "funding": [ { @@ -2224,7 +2237,7 @@ "type": "tidelift" } ], - "time": "2026-01-23T10:54:33+00:00" + "time": "2026-02-24T15:33:38+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2612,16 +2625,16 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.30", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789" + "reference": "01ffe0411b842f93c571e5c391f289c3fdd498c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/01ffe0411b842f93c571e5c391f289c3fdd498c3", + "reference": "01ffe0411b842f93c571e5c391f289c3fdd498c3", "shasum": "" }, "require": { @@ -2658,7 +2671,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.30" + "source": "https://github.com/symfony/filesystem/tree/v6.4.34" }, "funding": [ { @@ -2678,20 +2691,20 @@ "type": "tidelift" } ], - "time": "2025-11-26T14:43:45+00:00" + "time": "2026-02-24T17:51:06+00:00" }, { "name": "symfony/finder", - "version": "v6.4.33", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "24965ca011dac87431729640feef8bcf7b5523e0" + "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/24965ca011dac87431729640feef8bcf7b5523e0", - "reference": "24965ca011dac87431729640feef8bcf7b5523e0", + "url": "https://api.github.com/repos/symfony/finder/zipball/9590e86be1d1c57bfbb16d0dd040345378c20896", + "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896", "shasum": "" }, "require": { @@ -2726,7 +2739,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.33" + "source": "https://github.com/symfony/finder/tree/v6.4.34" }, "funding": [ { @@ -2746,20 +2759,20 @@ "type": "tidelift" } ], - "time": "2026-01-26T13:03:48+00:00" + "time": "2026-01-28T15:16:37+00:00" }, { "name": "symfony/form", - "version": "v6.4.32", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "b758162fb45024f898640ec27f4ac90be0dbfb8f" + "reference": "ed9275a133809bb48d949ba6dfdc808a819ebea2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/b758162fb45024f898640ec27f4ac90be0dbfb8f", - "reference": "b758162fb45024f898640ec27f4ac90be0dbfb8f", + "url": "https://api.github.com/repos/symfony/form/zipball/ed9275a133809bb48d949ba6dfdc808a819ebea2", + "reference": "ed9275a133809bb48d949ba6dfdc808a819ebea2", "shasum": "" }, "require": { @@ -2827,7 +2840,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.4.32" + "source": "https://github.com/symfony/form/tree/v6.4.34" }, "funding": [ { @@ -2847,20 +2860,20 @@ "type": "tidelift" } ], - "time": "2026-01-22T20:17:27+00:00" + "time": "2026-02-23T17:59:52+00:00" }, { "name": "symfony/framework-bundle", - "version": "v6.4.33", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "9ef2d0b63b9e855ba351e770a603d89699115801" + "reference": "5b5d19473f22d699811a41b01cef2462bc42b238" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/9ef2d0b63b9e855ba351e770a603d89699115801", - "reference": "9ef2d0b63b9e855ba351e770a603d89699115801", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/5b5d19473f22d699811a41b01cef2462bc42b238", + "reference": "5b5d19473f22d699811a41b01cef2462bc42b238", "shasum": "" }, "require": { @@ -2980,7 +2993,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.4.33" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.34" }, "funding": [ { @@ -3000,20 +3013,20 @@ "type": "tidelift" } ], - "time": "2026-01-26T14:46:41+00:00" + "time": "2026-02-24T16:00:52+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.33", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f1a490cc9d595ba7ebe684220e625d1e472ad278" + "reference": "5bb346d1b4b2a616e5c3d99b3ee4d5810735c535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f1a490cc9d595ba7ebe684220e625d1e472ad278", - "reference": "f1a490cc9d595ba7ebe684220e625d1e472ad278", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5bb346d1b4b2a616e5c3d99b3ee4d5810735c535", + "reference": "5bb346d1b4b2a616e5c3d99b3ee4d5810735c535", "shasum": "" }, "require": { @@ -3061,7 +3074,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.4.33" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.34" }, "funding": [ { @@ -3081,20 +3094,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T15:04:55+00:00" + "time": "2026-02-21T15:48:41+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.33", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "73fa5c999d7f741ca544a97d3c791cc97890ae4d" + "reference": "006a49fc4f41ee21a6ca61e69caed1c30b29f07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/73fa5c999d7f741ca544a97d3c791cc97890ae4d", - "reference": "73fa5c999d7f741ca544a97d3c791cc97890ae4d", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/006a49fc4f41ee21a6ca61e69caed1c30b29f07c", + "reference": "006a49fc4f41ee21a6ca61e69caed1c30b29f07c", "shasum": "" }, "require": { @@ -3135,7 +3148,7 @@ "symfony/config": "^6.1|^7.0", "symfony/console": "^5.4|^6.0|^7.0", "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4.1|^7.0.1", "symfony/dom-crawler": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/finder": "^5.4|^6.0|^7.0", @@ -3179,7 +3192,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.4.33" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.34" }, "funding": [ { @@ -3199,20 +3212,20 @@ "type": "tidelift" } ], - "time": "2026-01-28T10:02:13+00:00" + "time": "2026-02-26T08:27:11+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.31", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "8835f93333474780fda1b987cae37e33c3e026ca" + "reference": "01b846f48e53ee4096692a383637a1fa4d577301" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/8835f93333474780fda1b987cae37e33c3e026ca", - "reference": "8835f93333474780fda1b987cae37e33c3e026ca", + "url": "https://api.github.com/repos/symfony/mailer/zipball/01b846f48e53ee4096692a383637a1fa4d577301", + "reference": "01b846f48e53ee4096692a383637a1fa4d577301", "shasum": "" }, "require": { @@ -3263,7 +3276,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.31" + "source": "https://github.com/symfony/mailer/tree/v6.4.34" }, "funding": [ { @@ -3283,20 +3296,20 @@ "type": "tidelift" } ], - "time": "2025-12-12T07:33:25+00:00" + "time": "2026-02-24T09:34:36+00:00" }, { "name": "symfony/mime", - "version": "v6.4.32", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7409686879ca36c09fc970a5fa8ff6e93504dba4" + "reference": "2b32fbbe10b36a8379efab6e702ad8b917151839" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7409686879ca36c09fc970a5fa8ff6e93504dba4", - "reference": "7409686879ca36c09fc970a5fa8ff6e93504dba4", + "url": "https://api.github.com/repos/symfony/mime/zipball/2b32fbbe10b36a8379efab6e702ad8b917151839", + "reference": "2b32fbbe10b36a8379efab6e702ad8b917151839", "shasum": "" }, "require": { @@ -3352,7 +3365,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.32" + "source": "https://github.com/symfony/mime/tree/v6.4.34" }, "funding": [ { @@ -3372,7 +3385,7 @@ "type": "tidelift" } ], - "time": "2026-01-04T11:53:14+00:00" + "time": "2026-02-02T17:01:23+00:00" }, { "name": "symfony/options-resolver", @@ -4194,16 +4207,16 @@ }, { "name": "symfony/property-info", - "version": "v6.4.33", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "7d961dbb543fcfaa57fa55e555edd466e90160be" + "reference": "916455e4c9dcddbebfd101f29d7983841c3564e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/7d961dbb543fcfaa57fa55e555edd466e90160be", - "reference": "7d961dbb543fcfaa57fa55e555edd466e90160be", + "url": "https://api.github.com/repos/symfony/property-info/zipball/916455e4c9dcddbebfd101f29d7983841c3564e0", + "reference": "916455e4c9dcddbebfd101f29d7983841c3564e0", "shasum": "" }, "require": { @@ -4260,7 +4273,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.4.33" + "source": "https://github.com/symfony/property-info/tree/v6.4.34" }, "funding": [ { @@ -4280,20 +4293,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T15:12:57+00:00" + "time": "2026-02-13T09:42:46+00:00" }, { "name": "symfony/routing", - "version": "v6.4.32", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "0dc6253e864e71b486e8ba4970a56ab849106ebe" + "reference": "5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/0dc6253e864e71b486e8ba4970a56ab849106ebe", - "reference": "0dc6253e864e71b486e8ba4970a56ab849106ebe", + "url": "https://api.github.com/repos/symfony/routing/zipball/5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47", + "reference": "5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47", "shasum": "" }, "require": { @@ -4347,7 +4360,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.32" + "source": "https://github.com/symfony/routing/tree/v6.4.34" }, "funding": [ { @@ -4367,7 +4380,7 @@ "type": "tidelift" } ], - "time": "2026-01-12T08:31:19+00:00" + "time": "2026-02-24T17:34:50+00:00" }, { "name": "symfony/security-core", @@ -4620,16 +4633,16 @@ }, { "name": "symfony/string", - "version": "v6.4.30", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" + "reference": "2adaf4106f2ef4c67271971bde6d3fe0a6936432" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", + "url": "https://api.github.com/repos/symfony/string/zipball/2adaf4106f2ef4c67271971bde6d3fe0a6936432", + "reference": "2adaf4106f2ef4c67271971bde6d3fe0a6936432", "shasum": "" }, "require": { @@ -4685,7 +4698,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.30" + "source": "https://github.com/symfony/string/tree/v6.4.34" }, "funding": [ { @@ -4705,7 +4718,7 @@ "type": "tidelift" } ], - "time": "2025-11-21T18:03:05+00:00" + "time": "2026-02-08T20:44:54+00:00" }, { "name": "symfony/translation-contracts", @@ -4791,16 +4804,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v6.4.32", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8" + "reference": "5169074f4a88dfb02eeccddaba78edfdf212a9b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8", - "reference": "1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/5169074f4a88dfb02eeccddaba78edfdf212a9b2", + "reference": "5169074f4a88dfb02eeccddaba78edfdf212a9b2", "shasum": "" }, "require": { @@ -4880,7 +4893,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.32" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.34" }, "funding": [ { @@ -4900,7 +4913,7 @@ "type": "tidelift" } ], - "time": "2026-01-03T23:03:08+00:00" + "time": "2026-02-23T18:17:33+00:00" }, { "name": "symfony/twig-bundle", @@ -4992,16 +5005,16 @@ }, { "name": "symfony/validator", - "version": "v6.4.33", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "da1a40418439c0483ca7e0d4ae4c4f744f6b8536" + "reference": "7c3897b7f739d4ab913481e680405ca82d08084d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/da1a40418439c0483ca7e0d4ae4c4f744f6b8536", - "reference": "da1a40418439c0483ca7e0d4ae4c4f744f6b8536", + "url": "https://api.github.com/repos/symfony/validator/zipball/7c3897b7f739d4ab913481e680405ca82d08084d", + "reference": "7c3897b7f739d4ab913481e680405ca82d08084d", "shasum": "" }, "require": { @@ -5069,7 +5082,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.33" + "source": "https://github.com/symfony/validator/tree/v6.4.34" }, "funding": [ { @@ -5089,7 +5102,7 @@ "type": "tidelift" } ], - "time": "2026-01-26T16:20:53+00:00" + "time": "2026-02-23T17:49:24+00:00" }, { "name": "symfony/var-dumper", @@ -5262,16 +5275,16 @@ }, { "name": "symfony/yaml", - "version": "v6.4.30", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331" + "reference": "7bca30dabed7900a08c5ad4f1d6483f881a64d0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/8207ae83da19ee3748d6d4f567b4d9a7c656e331", - "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331", + "url": "https://api.github.com/repos/symfony/yaml/zipball/7bca30dabed7900a08c5ad4f1d6483f881a64d0f", + "reference": "7bca30dabed7900a08c5ad4f1d6483f881a64d0f", "shasum": "" }, "require": { @@ -5314,7 +5327,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.30" + "source": "https://github.com/symfony/yaml/tree/v6.4.34" }, "funding": [ { @@ -5334,20 +5347,20 @@ "type": "tidelift" } ], - "time": "2025-12-02T11:50:18+00:00" + "time": "2026-02-06T18:32:11+00:00" }, { "name": "tecnickcom/tcpdf", - "version": "6.10.0", + "version": "6.11.0", "source": { "type": "git", "url": "https://github.com/tecnickcom/TCPDF.git", - "reference": "ca5b6de294512145db96bcbc94e61696599c391d" + "reference": "81172e58edb1cfae4019ef150ccbdc0e9a8c85c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/ca5b6de294512145db96bcbc94e61696599c391d", - "reference": "ca5b6de294512145db96bcbc94e61696599c391d", + "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/81172e58edb1cfae4019ef150ccbdc0e9a8c85c9", + "reference": "81172e58edb1cfae4019ef150ccbdc0e9a8c85c9", "shasum": "" }, "require": { @@ -5397,7 +5410,7 @@ ], "support": { "issues": "https://github.com/tecnickcom/TCPDF/issues", - "source": "https://github.com/tecnickcom/TCPDF/tree/6.10.0" + "source": "https://github.com/tecnickcom/TCPDF/tree/6.11.0" }, "funding": [ { @@ -5405,26 +5418,26 @@ "type": "custom" } ], - "time": "2025-05-27T18:02:28+00:00" + "time": "2026-03-01T09:35:25+00:00" }, { "name": "thenetworg/oauth2-azure", - "version": "v2.2.2", + "version": "v2.2.5", "source": { "type": "git", "url": "https://github.com/TheNetworg/oauth2-azure.git", - "reference": "be204a5135f016470a9c33e82ab48785bbc11af2" + "reference": "06f1aa023e18cc3ea80df6410c7c2dc5502a3655" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/be204a5135f016470a9c33e82ab48785bbc11af2", - "reference": "be204a5135f016470a9c33e82ab48785bbc11af2", + "url": "https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/06f1aa023e18cc3ea80df6410c7c2dc5502a3655", + "reference": "06f1aa023e18cc3ea80df6410c7c2dc5502a3655", "shasum": "" }, "require": { "ext-json": "*", "ext-openssl": "*", - "firebase/php-jwt": "~3.0||~4.0||~5.0||~6.0", + "firebase/php-jwt": "~3.0||~4.0||~5.0||~6.0||~7.0", "league/oauth2-client": "~2.0", "php": "^7.1|^8.0" }, @@ -5463,9 +5476,9 @@ ], "support": { "issues": "https://github.com/TheNetworg/oauth2-azure/issues", - "source": "https://github.com/TheNetworg/oauth2-azure/tree/v2.2.2" + "source": "https://github.com/TheNetworg/oauth2-azure/tree/v2.2.5" }, - "time": "2023-12-19T12:10:48+00:00" + "time": "2026-02-26T08:05:57+00:00" }, { "name": "twig/twig", @@ -5616,16 +5629,16 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v6.4.32", + "version": "v6.4.34", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "011f59e3f3d20f60d11b4e78b8dc63504f56e145" + "reference": "848bc5d5745500f855bb201d57ae066fd7e67448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/011f59e3f3d20f60d11b4e78b8dc63504f56e145", - "reference": "011f59e3f3d20f60d11b4e78b8dc63504f56e145", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/848bc5d5745500f855bb201d57ae066fd7e67448", + "reference": "848bc5d5745500f855bb201d57ae066fd7e67448", "shasum": "" }, "require": { @@ -5678,7 +5691,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.32" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.34" }, "funding": [ { @@ -5698,18 +5711,19 @@ "type": "tidelift" } ], - "time": "2026-01-06T09:13:42+00:00" + "time": "2026-02-05T15:19:06+00:00" } ], "aliases": [], "minimum-stability": "stable", "stability-flags": { + "apereo/phpcas": 20, "nikic/php-parser": 20 }, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=8.1.0 <8.4.0", + "php": ">=8.1.0 <8.5.0", "ext-ctype": "*", "ext-dom": "*", "ext-gd": "*", diff --git a/lib/apereo/phpcas/README.md b/lib/apereo/phpcas/README.md index d48128912..05f3c7d17 100644 --- a/lib/apereo/phpcas/README.md +++ b/lib/apereo/phpcas/README.md @@ -13,7 +13,7 @@ Api documentation can be found here: https://apereo.github.io/phpCAS/api/ -[![Test](https://github.com/apereo/phpCAS/actions/workflows/test.yml/badge.svg)](https://github.com/apereo/phpCAS/actions/workflows/test.yml) +[![Test](https://github.com/EsupPortail/phpCAS/actions/workflows/test.yml/badge.svg)](https://github.com/EsupPortail/phpCAS/actions/workflows/test.yml) LICENSE ------- diff --git a/lib/apereo/phpcas/source/CAS.php b/lib/apereo/phpcas/source/CAS.php index 71c04755a..bf75c551e 100644 --- a/lib/apereo/phpcas/source/CAS.php +++ b/lib/apereo/phpcas/source/CAS.php @@ -57,7 +57,7 @@ if (!isset($_SERVER['REQUEST_URI']) && isset($_SERVER['SCRIPT_NAME']) && isset($ /** * phpCAS version. accessible for the user by phpCAS::getVersion(). */ -define('PHPCAS_VERSION', '1.6.1'); +define('PHPCAS_VERSION', '1.6.1+'); /** * @addtogroup public @@ -303,7 +303,7 @@ class phpCAS /** * This variable is used to enable verbose mode - * This pevents debug info to be show to the user. Since it's a security + * This prevents debug info to be show to the user. Since it's a security * feature the default is false * * @hideinitializer @@ -338,7 +338,7 @@ class phpCAS * @param bool $changeSessionID Allow phpCAS to change the session_id * (Single Sign Out/handleLogoutRequests * is based on that change) - * @param \SessionHandlerInterface $sessionHandler the session handler + * @param \SessionHandlerInterface|null $sessionHandler the session handler * * @return void a newly created CAS_Client object * @note Only one of the phpCAS::client() and phpCAS::proxy functions should be @@ -347,7 +347,7 @@ class phpCAS */ public static function client($server_version, $server_hostname, $server_port, $server_uri, $service_base_url, - $changeSessionID = true, \SessionHandlerInterface $sessionHandler = null + $changeSessionID = true, ?\SessionHandlerInterface $sessionHandler = null ) { phpCAS :: traceBegin(); if (is_object(self::$_PHPCAS_CLIENT)) { @@ -393,7 +393,7 @@ class phpCAS * @param bool $changeSessionID Allow phpCAS to change the session_id * (Single Sign Out/handleLogoutRequests * is based on that change) - * @param \SessionHandlerInterface $sessionHandler the session handler + * @param \SessionHandlerInterface|null $sessionHandler the session handler * * @return void a newly created CAS_Client object * @note Only one of the phpCAS::client() and phpCAS::proxy functions should be @@ -402,14 +402,14 @@ class phpCAS */ public static function proxy($server_version, $server_hostname, $server_port, $server_uri, $service_base_url, - $changeSessionID = true, \SessionHandlerInterface $sessionHandler = null + $changeSessionID = true, ?\SessionHandlerInterface $sessionHandler = null ) { phpCAS :: traceBegin(); if (is_object(self::$_PHPCAS_CLIENT)) { phpCAS :: error(self::$_PHPCAS_INIT_CALL['method'] . '() has already been called (at ' . self::$_PHPCAS_INIT_CALL['file'] . ':' . self::$_PHPCAS_INIT_CALL['line'] . ')'); } - // store where the initialzer is called from + // store where the initializer is called from $dbg = debug_backtrace(); self::$_PHPCAS_INIT_CALL = array ( 'done' => true, @@ -560,7 +560,7 @@ class phpCAS $indent_str .= '| '; } - // allow for multiline output with proper identing. Usefull for + // allow for multiline output with proper identing. Useful for // dumping cas answers etc. $str2 = str_replace("\n", "\n" . self::$_PHPCAS_DEBUG['unique_id'] . ' ' . $indent_str, $str); $str3 = self::$_PHPCAS_DEBUG['unique_id'] . ' ' . $indent_str . $str2; @@ -568,7 +568,7 @@ class phpCAS self::$_PHPCAS_DEBUG['logger']->info($str3); } if (!empty(self::$_PHPCAS_DEBUG['filename'])) { - // Check if file exists and modifiy file permissions to be only + // Check if file exists and modify file permissions to be only // readable by the webserver if (!file_exists(self::$_PHPCAS_DEBUG['filename'])) { touch(self::$_PHPCAS_DEBUG['filename']); @@ -1769,7 +1769,7 @@ class phpCAS /** * If you want your service to be proxied you have to enable it (default - * disabled) and define an accepable list of proxies that are allowed to + * disabled) and define an acceptable list of proxies that are allowed to * proxy your service. * * Add each allowed proxy definition object. For the normal CAS_ProxyChain @@ -1790,7 +1790,7 @@ class phpCAS * 'http://client.example.com/' * ))); * - * For quick testing or in certain production screnarios you might want to + * For quick testing or in certain production scenarios you might want to * allow allow any other valid service to proxy your service. To do so, add * the "Any" chain: * phpCAS::allowProxyChain(new CAS_ProxyChain_Any); @@ -1897,7 +1897,7 @@ class phpCAS } /** - * Checks of a proxy client aready exists + * Checks of a proxy client already exists * * @throws CAS_OutOfSequenceBeforeProxyException * diff --git a/lib/apereo/phpcas/source/CAS/Client.php b/lib/apereo/phpcas/source/CAS/Client.php index 8ca9711f4..7f7c7d111 100644 --- a/lib/apereo/phpcas/source/CAS/Client.php +++ b/lib/apereo/phpcas/source/CAS/Client.php @@ -788,7 +788,7 @@ class CAS_Client 'file' => $dbg[1]['file'], 'line' => $dbg[1]['line'], 'method' => $dbg[1]['class'] . '::' . $dbg[1]['function'], - 'result' => (boolean)$auth + 'result' => (bool)$auth ); } private $_authentication_caller; @@ -926,7 +926,7 @@ class CAS_Client * CAS_ServiceBaseUrl_Interface for custom * behavior. Added in 1.6.0. Similar to * serverName config in other CAS clients. - * @param \SessionHandlerInterface $sessionHandler the session handler + * @param \SessionHandlerInterface|null $sessionHandler the session handler * * @return self a newly created CAS_Client object */ @@ -938,7 +938,7 @@ class CAS_Client $server_uri, $service_base_url, $changeSessionID = true, - \SessionHandlerInterface $sessionHandler = null + ?\SessionHandlerInterface $sessionHandler = null ) { // Argument validation if (gettype($server_version) != 'string') @@ -3166,7 +3166,7 @@ class CAS_Client $proxiedService->setCasClient($this); } return $proxiedService; - case PHPCAS_PROXIED_SERVICE_IMAP; + case PHPCAS_PROXIED_SERVICE_IMAP: $proxiedService = new CAS_ProxiedService_Imap($this->_getUser()); if ($proxiedService instanceof CAS_ProxiedService_Testable) { $proxiedService->setCasClient($this); diff --git a/lib/apereo/phpcas/source/CAS/PGTStorage/Db.php b/lib/apereo/phpcas/source/CAS/PGTStorage/Db.php index 2efe5a3e8..9f8baf37f 100644 --- a/lib/apereo/phpcas/source/CAS/PGTStorage/Db.php +++ b/lib/apereo/phpcas/source/CAS/PGTStorage/Db.php @@ -316,7 +316,7 @@ class CAS_PGTStorage_Db extends CAS_PGTStorage_AbstractStorage try { $pdo->beginTransaction(); - $query = $pdo->query($this->createTableSQL()); + $query = $pdo->query($this->createTableSql()); $query->closeCursor(); $pdo->commit(); diff --git a/lib/apereo/phpcas/source/CAS/PGTStorage/File.php b/lib/apereo/phpcas/source/CAS/PGTStorage/File.php index fbacd3b7d..213ab40b7 100644 --- a/lib/apereo/phpcas/source/CAS/PGTStorage/File.php +++ b/lib/apereo/phpcas/source/CAS/PGTStorage/File.php @@ -127,6 +127,12 @@ class CAS_PGTStorage_File extends CAS_PGTStorage_AbstractStorage if (!preg_match('`^[a-zA-Z]:`', $path)) { phpCAS::error('an absolute path is needed for PGT storage to file'); } + + // ensure that the directory separator on Windows is '/' for consistency with the rest of the phpcas code + $path = str_replace(DIRECTORY_SEPARATOR , '/', $path); + + // store the path (with a trailing '/') + $path = preg_replace('|([^/])$|', '$1/', $path); } else { diff --git a/lib/apereo/phpcas/source/CAS/Request/CurlMultiRequest.php b/lib/apereo/phpcas/source/CAS/Request/CurlMultiRequest.php index 850f6f0e4..18a810ef9 100644 --- a/lib/apereo/phpcas/source/CAS/Request/CurlMultiRequest.php +++ b/lib/apereo/phpcas/source/CAS/Request/CurlMultiRequest.php @@ -139,7 +139,12 @@ implements CAS_Request_MultiRequestInterface $buf = curl_multi_getcontent($handles[$i]); $request->_storeResponseBody($buf); curl_multi_remove_handle($multiHandle, $handles[$i]); - curl_close($handles[$i]); + if (PHP_VERSION_ID < 80000) { + curl_close($handles[$i]); + } else { + // unreference it => it will be closed + unset($handles[$i]); + } } curl_multi_close($multiHandle); diff --git a/lib/apereo/phpcas/source/CAS/Request/CurlRequest.php b/lib/apereo/phpcas/source/CAS/Request/CurlRequest.php index e30dd0d19..ac7f0ec95 100644 --- a/lib/apereo/phpcas/source/CAS/Request/CurlRequest.php +++ b/lib/apereo/phpcas/source/CAS/Request/CurlRequest.php @@ -86,7 +86,9 @@ implements CAS_Request_RequestInterface } // close the CURL session - curl_close($ch); + if (PHP_VERSION_ID < 80000) { + curl_close($ch); + } phpCAS::traceEnd($res); return $res; diff --git a/lib/autoload.php b/lib/autoload.php index 9ee03077e..9861c4c24 100644 --- a/lib/autoload.php +++ b/lib/autoload.php @@ -19,4 +19,4 @@ if (PHP_VERSION_ID < 50600) { require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f::getLoader(); +return ComposerAutoloaderInitfc0e9e9dea11dcbb6272414776c30685::getLoader(); diff --git a/lib/bin/patch-type-declarations.bat b/lib/bin/patch-type-declarations.bat deleted file mode 100755 index 2b0707968..000000000 --- a/lib/bin/patch-type-declarations.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/patch-type-declarations -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/lib/bin/var-dump-server.bat b/lib/bin/var-dump-server.bat deleted file mode 100755 index 94333da54..000000000 --- a/lib/bin/var-dump-server.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/var-dump-server -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/lib/bin/yaml-lint.bat b/lib/bin/yaml-lint.bat deleted file mode 100755 index fa7663748..000000000 --- a/lib/bin/yaml-lint.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/yaml-lint -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index ecfd37d3b..495cd5207 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -1112,6 +1112,8 @@ return array( 'PhpParser\\ErrorHandler' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', 'PhpParser\\ErrorHandler\\Collecting' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', 'PhpParser\\ErrorHandler\\Throwing' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', + 'PhpParser\\ExprEvaluationException' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ExprEvaluationException.php', + 'PhpParser\\ExprEvaluator' => $vendorDir . '/nikic/php-parser/lib/PhpParser/ExprEvaluator.php', 'PhpParser\\Internal\\DiffElem' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', 'PhpParser\\Internal\\Differ' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', 'PhpParser\\Internal\\PrintableNewAnonClassNode' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', @@ -2647,6 +2649,17 @@ return array( 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => $vendorDir . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php', 'Symfony\\Component\\HttpFoundation\\StreamedJsonResponse' => $vendorDir . '/symfony/http-foundation/StreamedJsonResponse.php', 'Symfony\\Component\\HttpFoundation\\StreamedResponse' => $vendorDir . '/symfony/http-foundation/StreamedResponse.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\RequestAttributeValueSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseCookieValueSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseFormatSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasCookie' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasHeader' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderLocationSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsRedirected' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsSuccessful' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsUnprocessable' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseStatusCodeSame' => $vendorDir . '/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php', 'Symfony\\Component\\HttpFoundation\\UriSigner' => $vendorDir . '/symfony/http-foundation/UriSigner.php', 'Symfony\\Component\\HttpFoundation\\UrlHelper' => $vendorDir . '/symfony/http-foundation/UrlHelper.php', 'Symfony\\Component\\HttpKernel\\Attribute\\AsController' => $vendorDir . '/symfony/http-kernel/Attribute/AsController.php', diff --git a/lib/composer/autoload_real.php b/lib/composer/autoload_real.php index 671821bc0..1ddd43545 100644 --- a/lib/composer/autoload_real.php +++ b/lib/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f +class ComposerAutoloaderInitfc0e9e9dea11dcbb6272414776c30685 { private static $loader; @@ -24,21 +24,21 @@ class ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f require __DIR__ . '/platform_check.php'; - spl_autoload_register(array('ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInitfc0e9e9dea11dcbb6272414776c30685', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInitfc0e9e9dea11dcbb6272414776c30685', 'loadClassLoader')); $includePaths = require __DIR__ . '/include_paths.php'; $includePaths[] = get_include_path(); set_include_path(implode(PATH_SEPARATOR, $includePaths)); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685::$files; $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index 2f30b308d..662c2186c 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f +class ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685 { public static $files = array ( '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', @@ -1498,6 +1498,8 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'PhpParser\\ErrorHandler' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler.php', 'PhpParser\\ErrorHandler\\Collecting' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Collecting.php', 'PhpParser\\ErrorHandler\\Throwing' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ErrorHandler/Throwing.php', + 'PhpParser\\ExprEvaluationException' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ExprEvaluationException.php', + 'PhpParser\\ExprEvaluator' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/ExprEvaluator.php', 'PhpParser\\Internal\\DiffElem' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/DiffElem.php', 'PhpParser\\Internal\\Differ' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/Differ.php', 'PhpParser\\Internal\\PrintableNewAnonClassNode' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php', @@ -3033,6 +3035,17 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'Symfony\\Component\\HttpFoundation\\Session\\Storage\\SessionStorageInterface' => __DIR__ . '/..' . '/symfony/http-foundation/Session/Storage/SessionStorageInterface.php', 'Symfony\\Component\\HttpFoundation\\StreamedJsonResponse' => __DIR__ . '/..' . '/symfony/http-foundation/StreamedJsonResponse.php', 'Symfony\\Component\\HttpFoundation\\StreamedResponse' => __DIR__ . '/..' . '/symfony/http-foundation/StreamedResponse.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\RequestAttributeValueSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseCookieValueSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseFormatSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasCookie' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHasHeader' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderLocationSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHeaderLocationSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseHeaderSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsRedirected' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsSuccessful' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseIsUnprocessable' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php', + 'Symfony\\Component\\HttpFoundation\\Test\\Constraint\\ResponseStatusCodeSame' => __DIR__ . '/..' . '/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php', 'Symfony\\Component\\HttpFoundation\\UriSigner' => __DIR__ . '/..' . '/symfony/http-foundation/UriSigner.php', 'Symfony\\Component\\HttpFoundation\\UrlHelper' => __DIR__ . '/..' . '/symfony/http-foundation/UrlHelper.php', 'Symfony\\Component\\HttpKernel\\Attribute\\AsController' => __DIR__ . '/..' . '/symfony/http-kernel/Attribute/AsController.php', @@ -4376,10 +4389,10 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::$prefixDirsPsr4; - $loader->prefixesPsr0 = ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::$prefixesPsr0; - $loader->classMap = ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685::$prefixDirsPsr4; + $loader->prefixesPsr0 = ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685::$prefixesPsr0; + $loader->classMap = ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685::$classMap; }, null, ClassLoader::class); } diff --git a/lib/composer/include_paths.php b/lib/composer/include_paths.php index af33c1491..da6b7a8c2 100644 --- a/lib/composer/include_paths.php +++ b/lib/composer/include_paths.php @@ -6,8 +6,8 @@ $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( - $vendorDir . '/pear/archive_tar', + $vendorDir . '/pear/pear_exception', $vendorDir . '/pear/console_getopt', $vendorDir . '/pear/pear-core-minimal/src', - $vendorDir . '/pear/pear_exception', + $vendorDir . '/pear/archive_tar', ); diff --git a/lib/composer/installed.json b/lib/composer/installed.json index f26be2736..848a7992e 100644 --- a/lib/composer/installed.json +++ b/lib/composer/installed.json @@ -2,17 +2,17 @@ "packages": [ { "name": "apereo/phpcas", - "version": "1.6.1", - "version_normalized": "1.6.1.0", + "version": "dev-master", + "version_normalized": "dev-master", "source": { "type": "git", - "url": "https://github.com/apereo/phpCAS.git", - "reference": "c129708154852656aabb13d8606cd5b12dbbabac" + "url": "https://github.com/EsupPortail/phpCAS.git", + "reference": "57a7744146a963d8fa80192e0ab351051b711ff6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/apereo/phpCAS/zipball/c129708154852656aabb13d8606cd5b12dbbabac", - "reference": "c129708154852656aabb13d8606cd5b12dbbabac", + "url": "https://api.github.com/repos/EsupPortail/phpCAS/zipball/57a7744146a963d8fa80192e0ab351051b711ff6", + "reference": "57a7744146a963d8fa80192e0ab351051b711ff6", "shasum": "" }, "require": { @@ -26,7 +26,8 @@ "phpstan/phpstan": "^1.5", "phpunit/phpunit": ">=7.5" }, - "time": "2023-02-19T19:52:35+00:00", + "time": "2025-12-02T11:38:23+00:00", + "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -42,15 +43,27 @@ "source/" ] }, - "notification-url": "https://packagist.org/downloads/", + "autoload-dev": { + "psr-4": { + "PhpCas\\": "test/CAS/" + } + }, + "scripts": { + "test": [ + "phpunit" + ], + "phpstan": [ + "phpstan" + ] + }, "license": [ "Apache-2.0" ], "authors": [ { "name": "Joachim Fritschi", - "email": "jfritschi@freenet.de", - "homepage": "https://github.com/jfritschi" + "homepage": "https://github.com/jfritschi", + "email": "jfritschi@freenet.de" }, { "name": "Adam Franco", @@ -69,8 +82,8 @@ "jasig" ], "support": { - "issues": "https://github.com/apereo/phpCAS/issues", - "source": "https://github.com/apereo/phpCAS/tree/1.6.1" + "source": "https://github.com/EsupPortail/phpCAS/tree/master", + "issues": "https://github.com/EsupPortail/phpCAS/issues" }, "install-path": "../apereo/phpcas" }, @@ -226,17 +239,17 @@ }, { "name": "firebase/php-jwt", - "version": "v6.11.1", - "version_normalized": "6.11.1.0", + "version": "v7.0.3", + "version_normalized": "7.0.3.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66" + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", - "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", "shasum": "" }, "require": { @@ -254,7 +267,7 @@ "ext-sodium": "Support EdDSA (Ed25519) signatures", "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" }, - "time": "2025-04-09T20:32:01+00:00", + "time": "2026-02-25T22:16:40+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -286,7 +299,7 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.11.1" + "source": "https://github.com/firebase/php-jwt/tree/v7.0.3" }, "install-path": "../firebase/php-jwt" }, @@ -626,23 +639,23 @@ }, { "name": "league/oauth2-client", - "version": "2.8.1", - "version_normalized": "2.8.1.0", + "version": "2.9.0", + "version_normalized": "2.9.0.0", "source": { "type": "git", "url": "https://github.com/thephpleague/oauth2-client.git", - "reference": "9df2924ca644736c835fc60466a3a60390d334f9" + "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/9df2924ca644736c835fc60466a3a60390d334f9", - "reference": "9df2924ca644736c835fc60466a3a60390d334f9", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/26e8c5da4f3d78cede7021e09b1330a0fc093d5e", + "reference": "26e8c5da4f3d78cede7021e09b1330a0fc093d5e", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", - "php": "^7.1 || >=8.0.0 <8.5.0" + "php": "^7.1 || >=8.0.0 <8.6.0" }, "require-dev": { "mockery/mockery": "^1.3.5", @@ -650,7 +663,7 @@ "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", "squizlabs/php_codesniffer": "^3.11" }, - "time": "2025-02-26T04:37:30+00:00", + "time": "2025-11-25T22:17:17+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -688,23 +701,23 @@ ], "support": { "issues": "https://github.com/thephpleague/oauth2-client/issues", - "source": "https://github.com/thephpleague/oauth2-client/tree/2.8.1" + "source": "https://github.com/thephpleague/oauth2-client/tree/2.9.0" }, "install-path": "../league/oauth2-client" }, { "name": "league/oauth2-google", - "version": "4.0.1", - "version_normalized": "4.0.1.0", + "version": "4.1.0", + "version_normalized": "4.1.0.0", "source": { "type": "git", "url": "https://github.com/thephpleague/oauth2-google.git", - "reference": "1b01ba18ba31b29e88771e3e0979e5c91d4afe76" + "reference": "8b9bb43740ac6d994aca881a35f7bacbe98c0ffb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/1b01ba18ba31b29e88771e3e0979e5c91d4afe76", - "reference": "1b01ba18ba31b29e88771e3e0979e5c91d4afe76", + "url": "https://api.github.com/repos/thephpleague/oauth2-google/zipball/8b9bb43740ac6d994aca881a35f7bacbe98c0ffb", + "reference": "8b9bb43740ac6d994aca881a35f7bacbe98c0ffb", "shasum": "" }, "require": { @@ -716,7 +729,7 @@ "phpunit/phpunit": "^8.0 || ^9.0", "squizlabs/php_codesniffer": "^3.0" }, - "time": "2023-03-17T15:20:52+00:00", + "time": "2025-12-15T12:24:14+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -746,7 +759,7 @@ ], "support": { "issues": "https://github.com/thephpleague/oauth2-google/issues", - "source": "https://github.com/thephpleague/oauth2-google/tree/4.0.1" + "source": "https://github.com/thephpleague/oauth2-google/tree/4.1.0" }, "install-path": "../league/oauth2-google" }, @@ -757,12 +770,12 @@ "source": { "type": "git", "url": "https://github.com/Combodo/PHP-Parser.git", - "reference": "8ffc1239ff48ed2476b2672dbcc939fcdc5b0f7a" + "reference": "b2cd0735eb27788d5d41fa3c2cfaa01a593fd7fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Combodo/PHP-Parser/zipball/8ffc1239ff48ed2476b2672dbcc939fcdc5b0f7a", - "reference": "8ffc1239ff48ed2476b2672dbcc939fcdc5b0f7a", + "url": "https://api.github.com/repos/Combodo/PHP-Parser/zipball/b2cd0735eb27788d5d41fa3c2cfaa01a593fd7fb", + "reference": "b2cd0735eb27788d5d41fa3c2cfaa01a593fd7fb", "shasum": "" }, "require": { @@ -775,7 +788,7 @@ "ircmaxell/php-yacc": "^0.0.7", "phpunit/phpunit": "^9.0" }, - "time": "2025-09-09T09:14:16+00:00", + "time": "2025-09-18T12:29:15+00:00", "default-branch": true, "bin": [ "bin/php-parse" @@ -954,17 +967,17 @@ }, { "name": "pear/pear-core-minimal", - "version": "v1.10.16", - "version_normalized": "1.10.16.0", + "version": "v1.10.18", + "version_normalized": "1.10.18.0", "source": { "type": "git", "url": "https://github.com/pear/pear-core-minimal.git", - "reference": "c0f51b45f50683bf5bbf558036854ebc9b54d033" + "reference": "c7b55789d01de0ce090d289b73f1bbd6a2f113b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/c0f51b45f50683bf5bbf558036854ebc9b54d033", - "reference": "c0f51b45f50683bf5bbf558036854ebc9b54d033", + "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/c7b55789d01de0ce090d289b73f1bbd6a2f113b1", + "reference": "c7b55789d01de0ce090d289b73f1bbd6a2f113b1", "shasum": "" }, "require": { @@ -975,7 +988,7 @@ "replace": { "rsky/pear-core-min": "self.version" }, - "time": "2024-11-24T22:27:58+00:00", + "time": "2025-12-14T20:37:07+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1793,17 +1806,17 @@ }, { "name": "symfony/cache", - "version": "v6.4.33", - "version_normalized": "6.4.33.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "5b088fa41eb9568748dc255c45e4054c387ba73b" + "reference": "a0a1690543329685c044362c873b78c6de9d4faa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/5b088fa41eb9568748dc255c45e4054c387ba73b", - "reference": "5b088fa41eb9568748dc255c45e4054c387ba73b", + "url": "https://api.github.com/repos/symfony/cache/zipball/a0a1690543329685c044362c873b78c6de9d4faa", + "reference": "a0a1690543329685c044362c873b78c6de9d4faa", "shasum": "" }, "require": { @@ -1837,7 +1850,7 @@ "symfony/messenger": "^5.4|^6.0|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, - "time": "2026-01-27T15:05:20+00:00", + "time": "2026-02-20T15:06:30+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1872,7 +1885,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.33" + "source": "https://github.com/symfony/cache/tree/v6.4.34" }, "funding": [ { @@ -1975,17 +1988,17 @@ }, { "name": "symfony/config", - "version": "v6.4.32", - "version_normalized": "6.4.32.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "d445badf0ad2c2a492e38c0378c39997a56ef97b" + "reference": "ce9cb0c0d281aaf188b802d4968e42bfb60701e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/d445badf0ad2c2a492e38c0378c39997a56ef97b", - "reference": "d445badf0ad2c2a492e38c0378c39997a56ef97b", + "url": "https://api.github.com/repos/symfony/config/zipball/ce9cb0c0d281aaf188b802d4968e42bfb60701e9", + "reference": "ce9cb0c0d281aaf188b802d4968e42bfb60701e9", "shasum": "" }, "require": { @@ -2005,7 +2018,7 @@ "symfony/service-contracts": "^2.5|^3", "symfony/yaml": "^5.4|^6.0|^7.0" }, - "time": "2026-01-13T08:40:30+00:00", + "time": "2026-02-24T17:34:50+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2033,7 +2046,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.32" + "source": "https://github.com/symfony/config/tree/v6.4.34" }, "funding": [ { @@ -2057,17 +2070,17 @@ }, { "name": "symfony/console", - "version": "v6.4.32", - "version_normalized": "6.4.32.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3" + "reference": "7b1f1c37eff5910ddda2831345467e593a5120ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3", - "reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3", + "url": "https://api.github.com/repos/symfony/console/zipball/7b1f1c37eff5910ddda2831345467e593a5120ad", + "reference": "7b1f1c37eff5910ddda2831345467e593a5120ad", "shasum": "" }, "require": { @@ -2100,7 +2113,7 @@ "symfony/stopwatch": "^5.4|^6.0|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, - "time": "2026-01-13T08:45:59+00:00", + "time": "2026-02-23T15:42:15+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2134,7 +2147,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.32" + "source": "https://github.com/symfony/console/tree/v6.4.34" }, "funding": [ { @@ -2158,23 +2171,23 @@ }, { "name": "symfony/css-selector", - "version": "v6.4.24", - "version_normalized": "6.4.24.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "9b784413143701aa3c94ac1869a159a9e53e8761" + "reference": "b0314c186f1464de048cce58979ff1625ca88bbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/9b784413143701aa3c94ac1869a159a9e53e8761", - "reference": "9b784413143701aa3c94ac1869a159a9e53e8761", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/b0314c186f1464de048cce58979ff1625ca88bbb", + "reference": "b0314c186f1464de048cce58979ff1625ca88bbb", "shasum": "" }, "require": { "php": ">=8.1" }, - "time": "2025-07-10T08:14:14+00:00", + "time": "2026-02-16T08:37:21+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2206,7 +2219,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.24" + "source": "https://github.com/symfony/css-selector/tree/v6.4.34" }, "funding": [ { @@ -2230,17 +2243,17 @@ }, { "name": "symfony/dependency-injection", - "version": "v6.4.32", - "version_normalized": "6.4.32.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "b17882e933c4c606620247b6708ab53aa3b88753" + "reference": "91e49958b8a6092e48e4711894a1aeb1b151c62a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b17882e933c4c606620247b6708ab53aa3b88753", - "reference": "b17882e933c4c606620247b6708ab53aa3b88753", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/91e49958b8a6092e48e4711894a1aeb1b151c62a", + "reference": "91e49958b8a6092e48e4711894a1aeb1b151c62a", "shasum": "" }, "require": { @@ -2266,7 +2279,7 @@ "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/yaml": "^5.4|^6.0|^7.0" }, - "time": "2026-01-23T10:54:33+00:00", + "time": "2026-02-24T15:33:38+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2294,7 +2307,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/v6.4.32" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.34" }, "funding": [ { @@ -2717,17 +2730,17 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.30", - "version_normalized": "6.4.30.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789" + "reference": "01ffe0411b842f93c571e5c391f289c3fdd498c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/441c6b69f7222aadae7cbf5df588496d5ee37789", - "reference": "441c6b69f7222aadae7cbf5df588496d5ee37789", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/01ffe0411b842f93c571e5c391f289c3fdd498c3", + "reference": "01ffe0411b842f93c571e5c391f289c3fdd498c3", "shasum": "" }, "require": { @@ -2738,7 +2751,7 @@ "require-dev": { "symfony/process": "^5.4|^6.4|^7.0" }, - "time": "2025-11-26T14:43:45+00:00", + "time": "2026-02-24T17:51:06+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2766,7 +2779,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.30" + "source": "https://github.com/symfony/filesystem/tree/v6.4.34" }, "funding": [ { @@ -2790,17 +2803,17 @@ }, { "name": "symfony/finder", - "version": "v6.4.33", - "version_normalized": "6.4.33.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "24965ca011dac87431729640feef8bcf7b5523e0" + "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/24965ca011dac87431729640feef8bcf7b5523e0", - "reference": "24965ca011dac87431729640feef8bcf7b5523e0", + "url": "https://api.github.com/repos/symfony/finder/zipball/9590e86be1d1c57bfbb16d0dd040345378c20896", + "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896", "shasum": "" }, "require": { @@ -2809,7 +2822,7 @@ "require-dev": { "symfony/filesystem": "^6.0|^7.0" }, - "time": "2026-01-26T13:03:48+00:00", + "time": "2026-01-28T15:16:37+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2837,7 +2850,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.33" + "source": "https://github.com/symfony/finder/tree/v6.4.34" }, "funding": [ { @@ -2861,17 +2874,17 @@ }, { "name": "symfony/form", - "version": "v6.4.32", - "version_normalized": "6.4.32.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/form.git", - "reference": "b758162fb45024f898640ec27f4ac90be0dbfb8f" + "reference": "ed9275a133809bb48d949ba6dfdc808a819ebea2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/b758162fb45024f898640ec27f4ac90be0dbfb8f", - "reference": "b758162fb45024f898640ec27f4ac90be0dbfb8f", + "url": "https://api.github.com/repos/symfony/form/zipball/ed9275a133809bb48d949ba6dfdc808a819ebea2", + "reference": "ed9275a133809bb48d949ba6dfdc808a819ebea2", "shasum": "" }, "require": { @@ -2913,7 +2926,7 @@ "symfony/validator": "^5.4|^6.0|^7.0", "symfony/var-dumper": "^5.4|^6.0|^7.0" }, - "time": "2026-01-22T20:17:27+00:00", + "time": "2026-02-23T17:59:52+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2941,7 +2954,7 @@ "description": "Allows to easily create, process and reuse HTML forms", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/form/tree/v6.4.32" + "source": "https://github.com/symfony/form/tree/v6.4.34" }, "funding": [ { @@ -2965,17 +2978,17 @@ }, { "name": "symfony/framework-bundle", - "version": "v6.4.33", - "version_normalized": "6.4.33.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "9ef2d0b63b9e855ba351e770a603d89699115801" + "reference": "5b5d19473f22d699811a41b01cef2462bc42b238" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/9ef2d0b63b9e855ba351e770a603d89699115801", - "reference": "9ef2d0b63b9e855ba351e770a603d89699115801", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/5b5d19473f22d699811a41b01cef2462bc42b238", + "reference": "5b5d19473f22d699811a41b01cef2462bc42b238", "shasum": "" }, "require": { @@ -3069,7 +3082,7 @@ "symfony/yaml": "^5.4|^6.0|^7.0", "twig/twig": "^2.10|^3.0.4" }, - "time": "2026-01-26T14:46:41+00:00", + "time": "2026-02-24T16:00:52+00:00", "type": "symfony-bundle", "installation-source": "dist", "autoload": { @@ -3097,7 +3110,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.4.33" + "source": "https://github.com/symfony/framework-bundle/tree/v6.4.34" }, "funding": [ { @@ -3121,17 +3134,17 @@ }, { "name": "symfony/http-foundation", - "version": "v6.4.33", - "version_normalized": "6.4.33.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "f1a490cc9d595ba7ebe684220e625d1e472ad278" + "reference": "5bb346d1b4b2a616e5c3d99b3ee4d5810735c535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f1a490cc9d595ba7ebe684220e625d1e472ad278", - "reference": "f1a490cc9d595ba7ebe684220e625d1e472ad278", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5bb346d1b4b2a616e5c3d99b3ee4d5810735c535", + "reference": "5bb346d1b4b2a616e5c3d99b3ee4d5810735c535", "shasum": "" }, "require": { @@ -3153,7 +3166,7 @@ "symfony/mime": "^5.4|^6.0|^7.0", "symfony/rate-limiter": "^5.4|^6.0|^7.0" }, - "time": "2026-01-27T15:04:55+00:00", + "time": "2026-02-21T15:48:41+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3181,7 +3194,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.4.33" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.34" }, "funding": [ { @@ -3205,17 +3218,17 @@ }, { "name": "symfony/http-kernel", - "version": "v6.4.33", - "version_normalized": "6.4.33.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "73fa5c999d7f741ca544a97d3c791cc97890ae4d" + "reference": "006a49fc4f41ee21a6ca61e69caed1c30b29f07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/73fa5c999d7f741ca544a97d3c791cc97890ae4d", - "reference": "73fa5c999d7f741ca544a97d3c791cc97890ae4d", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/006a49fc4f41ee21a6ca61e69caed1c30b29f07c", + "reference": "006a49fc4f41ee21a6ca61e69caed1c30b29f07c", "shasum": "" }, "require": { @@ -3256,7 +3269,7 @@ "symfony/config": "^6.1|^7.0", "symfony/console": "^5.4|^6.0|^7.0", "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4.1|^7.0.1", "symfony/dom-crawler": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/finder": "^5.4|^6.0|^7.0", @@ -3274,7 +3287,7 @@ "symfony/var-exporter": "^6.2|^7.0", "twig/twig": "^2.13|^3.0.4" }, - "time": "2026-01-28T10:02:13+00:00", + "time": "2026-02-26T08:27:11+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3302,7 +3315,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.4.33" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.34" }, "funding": [ { @@ -3326,17 +3339,17 @@ }, { "name": "symfony/mailer", - "version": "v6.4.31", - "version_normalized": "6.4.31.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "8835f93333474780fda1b987cae37e33c3e026ca" + "reference": "01b846f48e53ee4096692a383637a1fa4d577301" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/8835f93333474780fda1b987cae37e33c3e026ca", - "reference": "8835f93333474780fda1b987cae37e33c3e026ca", + "url": "https://api.github.com/repos/symfony/mailer/zipball/01b846f48e53ee4096692a383637a1fa4d577301", + "reference": "01b846f48e53ee4096692a383637a1fa4d577301", "shasum": "" }, "require": { @@ -3361,7 +3374,7 @@ "symfony/messenger": "^6.2|^7.0", "symfony/twig-bridge": "^6.2|^7.0" }, - "time": "2025-12-12T07:33:25+00:00", + "time": "2026-02-24T09:34:36+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3389,7 +3402,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.31" + "source": "https://github.com/symfony/mailer/tree/v6.4.34" }, "funding": [ { @@ -3413,17 +3426,17 @@ }, { "name": "symfony/mime", - "version": "v6.4.32", - "version_normalized": "6.4.32.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7409686879ca36c09fc970a5fa8ff6e93504dba4" + "reference": "2b32fbbe10b36a8379efab6e702ad8b917151839" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7409686879ca36c09fc970a5fa8ff6e93504dba4", - "reference": "7409686879ca36c09fc970a5fa8ff6e93504dba4", + "url": "https://api.github.com/repos/symfony/mime/zipball/2b32fbbe10b36a8379efab6e702ad8b917151839", + "reference": "2b32fbbe10b36a8379efab6e702ad8b917151839", "shasum": "" }, "require": { @@ -3449,7 +3462,7 @@ "symfony/property-info": "^5.4|^6.0|^7.0", "symfony/serializer": "^6.4.3|^7.0.3" }, - "time": "2026-01-04T11:53:14+00:00", + "time": "2026-02-02T17:01:23+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3481,7 +3494,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.32" + "source": "https://github.com/symfony/mime/tree/v6.4.34" }, "funding": [ { @@ -4353,17 +4366,17 @@ }, { "name": "symfony/property-info", - "version": "v6.4.33", - "version_normalized": "6.4.33.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "7d961dbb543fcfaa57fa55e555edd466e90160be" + "reference": "916455e4c9dcddbebfd101f29d7983841c3564e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/7d961dbb543fcfaa57fa55e555edd466e90160be", - "reference": "7d961dbb543fcfaa57fa55e555edd466e90160be", + "url": "https://api.github.com/repos/symfony/property-info/zipball/916455e4c9dcddbebfd101f29d7983841c3564e0", + "reference": "916455e4c9dcddbebfd101f29d7983841c3564e0", "shasum": "" }, "require": { @@ -4386,7 +4399,7 @@ "symfony/dependency-injection": "^5.4|^6.0|^7.0", "symfony/serializer": "^5.4|^6.4|^7.0" }, - "time": "2026-01-27T15:12:57+00:00", + "time": "2026-02-13T09:42:46+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -4422,7 +4435,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.4.33" + "source": "https://github.com/symfony/property-info/tree/v6.4.34" }, "funding": [ { @@ -4446,17 +4459,17 @@ }, { "name": "symfony/routing", - "version": "v6.4.32", - "version_normalized": "6.4.32.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "0dc6253e864e71b486e8ba4970a56ab849106ebe" + "reference": "5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/0dc6253e864e71b486e8ba4970a56ab849106ebe", - "reference": "0dc6253e864e71b486e8ba4970a56ab849106ebe", + "url": "https://api.github.com/repos/symfony/routing/zipball/5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47", + "reference": "5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47", "shasum": "" }, "require": { @@ -4478,7 +4491,7 @@ "symfony/http-foundation": "^5.4|^6.0|^7.0", "symfony/yaml": "^5.4|^6.0|^7.0" }, - "time": "2026-01-12T08:31:19+00:00", + "time": "2026-02-24T17:34:50+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -4512,7 +4525,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.32" + "source": "https://github.com/symfony/routing/tree/v6.4.34" }, "funding": [ { @@ -4863,17 +4876,17 @@ }, { "name": "symfony/string", - "version": "v6.4.30", - "version_normalized": "6.4.30.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb" + "reference": "2adaf4106f2ef4c67271971bde6d3fe0a6936432" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/50590a057841fa6bf69d12eceffce3465b9e32cb", - "reference": "50590a057841fa6bf69d12eceffce3465b9e32cb", + "url": "https://api.github.com/repos/symfony/string/zipball/2adaf4106f2ef4c67271971bde6d3fe0a6936432", + "reference": "2adaf4106f2ef4c67271971bde6d3fe0a6936432", "shasum": "" }, "require": { @@ -4892,7 +4905,7 @@ "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^5.4|^6.0|^7.0" }, - "time": "2025-11-21T18:03:05+00:00", + "time": "2026-02-08T20:44:54+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -4931,7 +4944,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.30" + "source": "https://github.com/symfony/string/tree/v6.4.34" }, "funding": [ { @@ -5040,17 +5053,17 @@ }, { "name": "symfony/twig-bridge", - "version": "v6.4.32", - "version_normalized": "6.4.32.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8" + "reference": "5169074f4a88dfb02eeccddaba78edfdf212a9b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8", - "reference": "1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/5169074f4a88dfb02eeccddaba78edfdf212a9b2", + "reference": "5169074f4a88dfb02eeccddaba78edfdf212a9b2", "shasum": "" }, "require": { @@ -5104,7 +5117,7 @@ "twig/inky-extra": "^2.12|^3", "twig/markdown-extra": "^2.12|^3" }, - "time": "2026-01-03T23:03:08+00:00", + "time": "2026-02-23T18:17:33+00:00", "type": "symfony-bridge", "installation-source": "dist", "autoload": { @@ -5132,7 +5145,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.32" + "source": "https://github.com/symfony/twig-bridge/tree/v6.4.34" }, "funding": [ { @@ -5247,17 +5260,17 @@ }, { "name": "symfony/validator", - "version": "v6.4.33", - "version_normalized": "6.4.33.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "da1a40418439c0483ca7e0d4ae4c4f744f6b8536" + "reference": "7c3897b7f739d4ab913481e680405ca82d08084d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/da1a40418439c0483ca7e0d4ae4c4f744f6b8536", - "reference": "da1a40418439c0483ca7e0d4ae4c4f744f6b8536", + "url": "https://api.github.com/repos/symfony/validator/zipball/7c3897b7f739d4ab913481e680405ca82d08084d", + "reference": "7c3897b7f739d4ab913481e680405ca82d08084d", "shasum": "" }, "require": { @@ -5298,7 +5311,7 @@ "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", "symfony/yaml": "^5.4|^6.0|^7.0" }, - "time": "2026-01-26T16:20:53+00:00", + "time": "2026-02-23T17:49:24+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5327,7 +5340,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.33" + "source": "https://github.com/symfony/validator/tree/v6.4.34" }, "funding": [ { @@ -5526,17 +5539,17 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v6.4.32", - "version_normalized": "6.4.32.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "011f59e3f3d20f60d11b4e78b8dc63504f56e145" + "reference": "848bc5d5745500f855bb201d57ae066fd7e67448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/011f59e3f3d20f60d11b4e78b8dc63504f56e145", - "reference": "011f59e3f3d20f60d11b4e78b8dc63504f56e145", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/848bc5d5745500f855bb201d57ae066fd7e67448", + "reference": "848bc5d5745500f855bb201d57ae066fd7e67448", "shasum": "" }, "require": { @@ -5560,7 +5573,7 @@ "symfony/css-selector": "^5.4|^6.0|^7.0", "symfony/stopwatch": "^5.4|^6.0|^7.0" }, - "time": "2026-01-06T09:13:42+00:00", + "time": "2026-02-05T15:19:06+00:00", "type": "symfony-bundle", "installation-source": "dist", "autoload": { @@ -5591,7 +5604,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.32" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.34" }, "funding": [ { @@ -5615,17 +5628,17 @@ }, { "name": "symfony/yaml", - "version": "v6.4.30", - "version_normalized": "6.4.30.0", + "version": "v6.4.34", + "version_normalized": "6.4.34.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331" + "reference": "7bca30dabed7900a08c5ad4f1d6483f881a64d0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/8207ae83da19ee3748d6d4f567b4d9a7c656e331", - "reference": "8207ae83da19ee3748d6d4f567b4d9a7c656e331", + "url": "https://api.github.com/repos/symfony/yaml/zipball/7bca30dabed7900a08c5ad4f1d6483f881a64d0f", + "reference": "7bca30dabed7900a08c5ad4f1d6483f881a64d0f", "shasum": "" }, "require": { @@ -5639,7 +5652,7 @@ "require-dev": { "symfony/console": "^5.4|^6.0|^7.0" }, - "time": "2025-12-02T11:50:18+00:00", + "time": "2026-02-06T18:32:11+00:00", "bin": [ "Resources/bin/yaml-lint" ], @@ -5670,7 +5683,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.30" + "source": "https://github.com/symfony/yaml/tree/v6.4.34" }, "funding": [ { @@ -5694,24 +5707,24 @@ }, { "name": "tecnickcom/tcpdf", - "version": "6.10.0", - "version_normalized": "6.10.0.0", + "version": "6.11.0", + "version_normalized": "6.11.0.0", "source": { "type": "git", "url": "https://github.com/tecnickcom/TCPDF.git", - "reference": "ca5b6de294512145db96bcbc94e61696599c391d" + "reference": "81172e58edb1cfae4019ef150ccbdc0e9a8c85c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/ca5b6de294512145db96bcbc94e61696599c391d", - "reference": "ca5b6de294512145db96bcbc94e61696599c391d", + "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/81172e58edb1cfae4019ef150ccbdc0e9a8c85c9", + "reference": "81172e58edb1cfae4019ef150ccbdc0e9a8c85c9", "shasum": "" }, "require": { "ext-curl": "*", "php": ">=7.1.0" }, - "time": "2025-05-27T18:02:28+00:00", + "time": "2026-03-01T09:35:25+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5756,7 +5769,7 @@ ], "support": { "issues": "https://github.com/tecnickcom/TCPDF/issues", - "source": "https://github.com/tecnickcom/TCPDF/tree/6.10.0" + "source": "https://github.com/tecnickcom/TCPDF/tree/6.11.0" }, "funding": [ { @@ -5768,30 +5781,30 @@ }, { "name": "thenetworg/oauth2-azure", - "version": "v2.2.2", - "version_normalized": "2.2.2.0", + "version": "v2.2.5", + "version_normalized": "2.2.5.0", "source": { "type": "git", "url": "https://github.com/TheNetworg/oauth2-azure.git", - "reference": "be204a5135f016470a9c33e82ab48785bbc11af2" + "reference": "06f1aa023e18cc3ea80df6410c7c2dc5502a3655" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/be204a5135f016470a9c33e82ab48785bbc11af2", - "reference": "be204a5135f016470a9c33e82ab48785bbc11af2", + "url": "https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/06f1aa023e18cc3ea80df6410c7c2dc5502a3655", + "reference": "06f1aa023e18cc3ea80df6410c7c2dc5502a3655", "shasum": "" }, "require": { "ext-json": "*", "ext-openssl": "*", - "firebase/php-jwt": "~3.0||~4.0||~5.0||~6.0", + "firebase/php-jwt": "~3.0||~4.0||~5.0||~6.0||~7.0", "league/oauth2-client": "~2.0", "php": "^7.1|^8.0" }, "require-dev": { "phpunit/phpunit": "^9.6" }, - "time": "2023-12-19T12:10:48+00:00", + "time": "2026-02-26T08:05:57+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5825,7 +5838,7 @@ ], "support": { "issues": "https://github.com/TheNetworg/oauth2-azure/issues", - "source": "https://github.com/TheNetworg/oauth2-azure/tree/v2.2.2" + "source": "https://github.com/TheNetworg/oauth2-azure/tree/v2.2.5" }, "install-path": "../thenetworg/oauth2-azure" }, diff --git a/lib/composer/installed.php b/lib/composer/installed.php index d05367ff1..a8e30d8db 100644 --- a/lib/composer/installed.php +++ b/lib/composer/installed.php @@ -1,9 +1,9 @@ array( 'name' => 'combodo/itop', - 'pretty_version' => 'dev-develop', - 'version' => 'dev-develop', - 'reference' => '0f11fd9919aab579586a6f52e1c74f317518040c', + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => null, 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -11,18 +11,20 @@ ), 'versions' => array( 'apereo/phpcas' => array( - 'pretty_version' => '1.6.1', - 'version' => '1.6.1.0', - 'reference' => 'c129708154852656aabb13d8606cd5b12dbbabac', + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => '57a7744146a963d8fa80192e0ab351051b711ff6', 'type' => 'library', 'install_path' => __DIR__ . '/../apereo/phpcas', - 'aliases' => array(), + 'aliases' => array( + 0 => '1.3.x-dev', + ), 'dev_requirement' => false, ), 'combodo/itop' => array( - 'pretty_version' => 'dev-develop', - 'version' => 'dev-develop', - 'reference' => '0f11fd9919aab579586a6f52e1c74f317518040c', + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => null, 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -47,9 +49,9 @@ 'dev_requirement' => false, ), 'firebase/php-jwt' => array( - 'pretty_version' => 'v6.11.1', - 'version' => '6.11.1.0', - 'reference' => 'd1e91ecf8c598d073d0995afa8cd5c75c6e19e66', + 'pretty_version' => 'v7.0.3', + 'version' => '7.0.3.0', + 'reference' => '28aa0694bcfdfa5e2959c394d5a1ee7a5083629e', 'type' => 'library', 'install_path' => __DIR__ . '/../firebase/php-jwt', 'aliases' => array(), @@ -83,18 +85,18 @@ 'dev_requirement' => false, ), 'league/oauth2-client' => array( - 'pretty_version' => '2.8.1', - 'version' => '2.8.1.0', - 'reference' => '9df2924ca644736c835fc60466a3a60390d334f9', + 'pretty_version' => '2.9.0', + 'version' => '2.9.0.0', + 'reference' => '26e8c5da4f3d78cede7021e09b1330a0fc093d5e', 'type' => 'library', 'install_path' => __DIR__ . '/../league/oauth2-client', 'aliases' => array(), 'dev_requirement' => false, ), 'league/oauth2-google' => array( - 'pretty_version' => '4.0.1', - 'version' => '4.0.1.0', - 'reference' => '1b01ba18ba31b29e88771e3e0979e5c91d4afe76', + 'pretty_version' => '4.1.0', + 'version' => '4.1.0.0', + 'reference' => '8b9bb43740ac6d994aca881a35f7bacbe98c0ffb', 'type' => 'library', 'install_path' => __DIR__ . '/../league/oauth2-google', 'aliases' => array(), @@ -103,7 +105,7 @@ 'nikic/php-parser' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '8ffc1239ff48ed2476b2672dbcc939fcdc5b0f7a', + 'reference' => 'b2cd0735eb27788d5d41fa3c2cfaa01a593fd7fb', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array( @@ -130,9 +132,9 @@ 'dev_requirement' => false, ), 'pear/pear-core-minimal' => array( - 'pretty_version' => 'v1.10.16', - 'version' => '1.10.16.0', - 'reference' => 'c0f51b45f50683bf5bbf558036854ebc9b54d033', + 'pretty_version' => 'v1.10.18', + 'version' => '1.10.18.0', + 'reference' => 'c7b55789d01de0ce090d289b73f1bbd6a2f113b1', 'type' => 'library', 'install_path' => __DIR__ . '/../pear/pear-core-minimal', 'aliases' => array(), @@ -279,7 +281,7 @@ 'rsky/pear-core-min' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => 'v1.10.16', + 0 => 'v1.10.18', ), ), 'sabberworm/php-css-parser' => array( @@ -310,9 +312,9 @@ 'dev_requirement' => false, ), 'symfony/cache' => array( - 'pretty_version' => 'v6.4.33', - 'version' => '6.4.33.0', - 'reference' => '5b088fa41eb9568748dc255c45e4054c387ba73b', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => 'a0a1690543329685c044362c873b78c6de9d4faa', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache', 'aliases' => array(), @@ -334,36 +336,36 @@ ), ), 'symfony/config' => array( - 'pretty_version' => 'v6.4.32', - 'version' => '6.4.32.0', - 'reference' => 'd445badf0ad2c2a492e38c0378c39997a56ef97b', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => 'ce9cb0c0d281aaf188b802d4968e42bfb60701e9', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/config', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/console' => array( - 'pretty_version' => 'v6.4.32', - 'version' => '6.4.32.0', - 'reference' => '0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '7b1f1c37eff5910ddda2831345467e593a5120ad', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/css-selector' => array( - 'pretty_version' => 'v6.4.24', - 'version' => '6.4.24.0', - 'reference' => '9b784413143701aa3c94ac1869a159a9e53e8761', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => 'b0314c186f1464de048cce58979ff1625ca88bbb', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/css-selector', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/dependency-injection' => array( - 'pretty_version' => 'v6.4.32', - 'version' => '6.4.32.0', - 'reference' => 'b17882e933c4c606620247b6708ab53aa3b88753', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '91e49958b8a6092e48e4711894a1aeb1b151c62a', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/dependency-injection', 'aliases' => array(), @@ -421,72 +423,72 @@ ), ), 'symfony/filesystem' => array( - 'pretty_version' => 'v6.4.30', - 'version' => '6.4.30.0', - 'reference' => '441c6b69f7222aadae7cbf5df588496d5ee37789', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '01ffe0411b842f93c571e5c391f289c3fdd498c3', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/finder' => array( - 'pretty_version' => 'v6.4.33', - 'version' => '6.4.33.0', - 'reference' => '24965ca011dac87431729640feef8bcf7b5523e0', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '9590e86be1d1c57bfbb16d0dd040345378c20896', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/finder', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/form' => array( - 'pretty_version' => 'v6.4.32', - 'version' => '6.4.32.0', - 'reference' => 'b758162fb45024f898640ec27f4ac90be0dbfb8f', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => 'ed9275a133809bb48d949ba6dfdc808a819ebea2', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/form', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/framework-bundle' => array( - 'pretty_version' => 'v6.4.33', - 'version' => '6.4.33.0', - 'reference' => '9ef2d0b63b9e855ba351e770a603d89699115801', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '5b5d19473f22d699811a41b01cef2462bc42b238', 'type' => 'symfony-bundle', 'install_path' => __DIR__ . '/../symfony/framework-bundle', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/http-foundation' => array( - 'pretty_version' => 'v6.4.33', - 'version' => '6.4.33.0', - 'reference' => 'f1a490cc9d595ba7ebe684220e625d1e472ad278', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '5bb346d1b4b2a616e5c3d99b3ee4d5810735c535', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/http-foundation', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/http-kernel' => array( - 'pretty_version' => 'v6.4.33', - 'version' => '6.4.33.0', - 'reference' => '73fa5c999d7f741ca544a97d3c791cc97890ae4d', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '006a49fc4f41ee21a6ca61e69caed1c30b29f07c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/http-kernel', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/mailer' => array( - 'pretty_version' => 'v6.4.31', - 'version' => '6.4.31.0', - 'reference' => '8835f93333474780fda1b987cae37e33c3e026ca', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '01b846f48e53ee4096692a383637a1fa4d577301', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/mailer', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/mime' => array( - 'pretty_version' => 'v6.4.32', - 'version' => '6.4.32.0', - 'reference' => '7409686879ca36c09fc970a5fa8ff6e93504dba4', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '2b32fbbe10b36a8379efab6e702ad8b917151839', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/mime', 'aliases' => array(), @@ -583,18 +585,18 @@ 'dev_requirement' => false, ), 'symfony/property-info' => array( - 'pretty_version' => 'v6.4.33', - 'version' => '6.4.33.0', - 'reference' => '7d961dbb543fcfaa57fa55e555edd466e90160be', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '916455e4c9dcddbebfd101f29d7983841c3564e0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/property-info', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/routing' => array( - 'pretty_version' => 'v6.4.32', - 'version' => '6.4.32.0', - 'reference' => '0dc6253e864e71b486e8ba4970a56ab849106ebe', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/routing', 'aliases' => array(), @@ -643,9 +645,9 @@ 'dev_requirement' => true, ), 'symfony/string' => array( - 'pretty_version' => 'v6.4.30', - 'version' => '6.4.30.0', - 'reference' => '50590a057841fa6bf69d12eceffce3465b9e32cb', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '2adaf4106f2ef4c67271971bde6d3fe0a6936432', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), @@ -661,9 +663,9 @@ 'dev_requirement' => false, ), 'symfony/twig-bridge' => array( - 'pretty_version' => 'v6.4.32', - 'version' => '6.4.32.0', - 'reference' => '1dcf980dd4f79885b986befdeb1c1bc0d6aedfc8', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '5169074f4a88dfb02eeccddaba78edfdf212a9b2', 'type' => 'symfony-bridge', 'install_path' => __DIR__ . '/../symfony/twig-bridge', 'aliases' => array(), @@ -679,9 +681,9 @@ 'dev_requirement' => false, ), 'symfony/validator' => array( - 'pretty_version' => 'v6.4.33', - 'version' => '6.4.33.0', - 'reference' => 'da1a40418439c0483ca7e0d4ae4c4f744f6b8536', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '7c3897b7f739d4ab913481e680405ca82d08084d', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/validator', 'aliases' => array(), @@ -706,36 +708,36 @@ 'dev_requirement' => false, ), 'symfony/web-profiler-bundle' => array( - 'pretty_version' => 'v6.4.32', - 'version' => '6.4.32.0', - 'reference' => '011f59e3f3d20f60d11b4e78b8dc63504f56e145', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '848bc5d5745500f855bb201d57ae066fd7e67448', 'type' => 'symfony-bundle', 'install_path' => __DIR__ . '/../symfony/web-profiler-bundle', 'aliases' => array(), 'dev_requirement' => true, ), 'symfony/yaml' => array( - 'pretty_version' => 'v6.4.30', - 'version' => '6.4.30.0', - 'reference' => '8207ae83da19ee3748d6d4f567b4d9a7c656e331', + 'pretty_version' => 'v6.4.34', + 'version' => '6.4.34.0', + 'reference' => '7bca30dabed7900a08c5ad4f1d6483f881a64d0f', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/yaml', 'aliases' => array(), 'dev_requirement' => false, ), 'tecnickcom/tcpdf' => array( - 'pretty_version' => '6.10.0', - 'version' => '6.10.0.0', - 'reference' => 'ca5b6de294512145db96bcbc94e61696599c391d', + 'pretty_version' => '6.11.0', + 'version' => '6.11.0.0', + 'reference' => '81172e58edb1cfae4019ef150ccbdc0e9a8c85c9', 'type' => 'library', 'install_path' => __DIR__ . '/../tecnickcom/tcpdf', 'aliases' => array(), 'dev_requirement' => false, ), 'thenetworg/oauth2-azure' => array( - 'pretty_version' => 'v2.2.2', - 'version' => '2.2.2.0', - 'reference' => 'be204a5135f016470a9c33e82ab48785bbc11af2', + 'pretty_version' => 'v2.2.5', + 'version' => '2.2.5.0', + 'reference' => '06f1aa023e18cc3ea80df6410c7c2dc5502a3655', 'type' => 'library', 'install_path' => __DIR__ . '/../thenetworg/oauth2-azure', 'aliases' => array(), diff --git a/lib/firebase/php-jwt/CHANGELOG.md b/lib/firebase/php-jwt/CHANGELOG.md index 7b5f6ce40..32a5433ac 100644 --- a/lib/firebase/php-jwt/CHANGELOG.md +++ b/lib/firebase/php-jwt/CHANGELOG.md @@ -1,5 +1,36 @@ # Changelog +## [7.0.3](https://github.com/firebase/php-jwt/compare/v7.0.2...v7.0.3) (2026-02-18) + + +### Miscellaneous Chores + +* add environment for Release Please job ([#619](https://github.com/firebase/php-jwt/issues/619)) ([300fd02](https://github.com/firebase/php-jwt/commit/300fd02c883f096c9067df652dbd23f62cb5e2a7)) + +## [7.0.2](https://github.com/firebase/php-jwt/compare/v7.0.1...v7.0.2) (2025-12-16) + + +### Bug Fixes + +* add key length validation for ec keys ([#615](https://github.com/firebase/php-jwt/issues/615)) ([7044f9a](https://github.com/firebase/php-jwt/commit/7044f9ae7e7d175d28cca71714feb236f1c0e252)) + +## [7.0.0](https://github.com/firebase/php-jwt/compare/v6.11.1...v7.0.0) (2025-12-15) + + +### ⚠️ ⚠️ ⚠️ Security Fixes ⚠️ ⚠️ ⚠️ + * add key size validation ([#613](https://github.com/firebase/php-jwt/issues/613)) ([6b80341](https://github.com/firebase/php-jwt/commit/6b80341bf57838ea2d011487917337901cd71576)) + **NOTE**: This fix will cause keys with a size below the minimally allowed size to break. + +### Features + +* add SensitiveParameter attribute to security-critical parameters ([#603](https://github.com/firebase/php-jwt/issues/603)) ([4dbfac0](https://github.com/firebase/php-jwt/commit/4dbfac0260eeb0e9e643063c99998e3219cc539b)) +* store timestamp in `ExpiredException` ([#604](https://github.com/firebase/php-jwt/issues/604)) ([f174826](https://github.com/firebase/php-jwt/commit/f1748260d218a856b6a0c23715ac7fae1d7ca95b)) + + +### Bug Fixes + +* validate iat and nbf on payload ([#568](https://github.com/firebase/php-jwt/issues/568)) ([953b2c8](https://github.com/firebase/php-jwt/commit/953b2c88bb445b7e3bb82a5141928f13d7343afd)) + ## [6.11.1](https://github.com/firebase/php-jwt/compare/v6.11.0...v6.11.1) (2025-04-09) diff --git a/lib/firebase/php-jwt/README.md b/lib/firebase/php-jwt/README.md index e45ccb808..65b6c8609 100644 --- a/lib/firebase/php-jwt/README.md +++ b/lib/firebase/php-jwt/README.md @@ -186,7 +186,7 @@ $passphrase = '[YOUR_PASSPHRASE]'; // Can be generated with "ssh-keygen -t rsa -m pem" $privateKeyFile = '/path/to/key-with-passphrase.pem'; -// Create a private key of type "resource" +/** @var OpenSSLAsymmetricKey $privateKey */ $privateKey = openssl_pkey_get_private( file_get_contents($privateKeyFile), $passphrase diff --git a/lib/firebase/php-jwt/src/ExpiredException.php b/lib/firebase/php-jwt/src/ExpiredException.php index 12fef0944..25f445132 100644 --- a/lib/firebase/php-jwt/src/ExpiredException.php +++ b/lib/firebase/php-jwt/src/ExpiredException.php @@ -6,6 +6,8 @@ class ExpiredException extends \UnexpectedValueException implements JWTException { private object $payload; + private ?int $timestamp = null; + public function setPayload(object $payload): void { $this->payload = $payload; @@ -15,4 +17,14 @@ class ExpiredException extends \UnexpectedValueException implements JWTException { return $this->payload; } + + public function setTimestamp(int $timestamp): void + { + $this->timestamp = $timestamp; + } + + public function getTimestamp(): ?int + { + return $this->timestamp; + } } diff --git a/lib/firebase/php-jwt/src/JWK.php b/lib/firebase/php-jwt/src/JWK.php index 405dcc49b..d5175b217 100644 --- a/lib/firebase/php-jwt/src/JWK.php +++ b/lib/firebase/php-jwt/src/JWK.php @@ -52,7 +52,7 @@ class JWK * * @uses parseKey */ - public static function parseKeySet(array $jwks, ?string $defaultAlg = null): array + public static function parseKeySet(#[\SensitiveParameter] array $jwks, ?string $defaultAlg = null): array { $keys = []; @@ -93,7 +93,7 @@ class JWK * * @uses createPemFromModulusAndExponent */ - public static function parseKey(array $jwk, ?string $defaultAlg = null): ?Key + public static function parseKey(#[\SensitiveParameter] array $jwk, ?string $defaultAlg = null): ?Key { if (empty($jwk)) { throw new InvalidArgumentException('JWK must not be empty'); diff --git a/lib/firebase/php-jwt/src/JWT.php b/lib/firebase/php-jwt/src/JWT.php index 833a415e6..90f62ca9d 100644 --- a/lib/firebase/php-jwt/src/JWT.php +++ b/lib/firebase/php-jwt/src/JWT.php @@ -31,6 +31,8 @@ class JWT private const ASN1_SEQUENCE = 0x10; private const ASN1_BIT_STRING = 0x03; + private const RSA_KEY_MIN_LENGTH=2048; + /** * When checking nbf, iat or expiration times, * we want to provide some extra leeway time to @@ -95,7 +97,7 @@ class JWT */ public static function decode( string $jwt, - $keyOrKeyArray, + #[\SensitiveParameter] $keyOrKeyArray, ?stdClass &$headers = null ): stdClass { // Validate JWT @@ -127,6 +129,16 @@ class JWT if (!$payload instanceof stdClass) { throw new UnexpectedValueException('Payload must be a JSON object'); } + if (isset($payload->iat) && !\is_numeric($payload->iat)) { + throw new UnexpectedValueException('Payload iat must be a number'); + } + if (isset($payload->nbf) && !\is_numeric($payload->nbf)) { + throw new UnexpectedValueException('Payload nbf must be a number'); + } + if (isset($payload->exp) && !\is_numeric($payload->exp)) { + throw new UnexpectedValueException('Payload exp must be a number'); + } + $sig = static::urlsafeB64Decode($cryptob64); if (empty($header->alg)) { throw new UnexpectedValueException('Empty algorithm'); @@ -154,7 +166,7 @@ class JWT // token can actually be used. If it's not yet that time, abort. if (isset($payload->nbf) && floor($payload->nbf) > ($timestamp + static::$leeway)) { $ex = new BeforeValidException( - 'Cannot handle token with nbf prior to ' . \date(DateTime::ISO8601, (int) floor($payload->nbf)) + 'Cannot handle token with nbf prior to ' . \date(DateTime::ATOM, (int) floor($payload->nbf)) ); $ex->setPayload($payload); throw $ex; @@ -165,7 +177,7 @@ class JWT // correctly used the nbf claim). if (!isset($payload->nbf) && isset($payload->iat) && floor($payload->iat) > ($timestamp + static::$leeway)) { $ex = new BeforeValidException( - 'Cannot handle token with iat prior to ' . \date(DateTime::ISO8601, (int) floor($payload->iat)) + 'Cannot handle token with iat prior to ' . \date(DateTime::ATOM, (int) floor($payload->iat)) ); $ex->setPayload($payload); throw $ex; @@ -175,6 +187,7 @@ class JWT if (isset($payload->exp) && ($timestamp - static::$leeway) >= $payload->exp) { $ex = new ExpiredException('Expired token'); $ex->setPayload($payload); + $ex->setTimestamp($timestamp); throw $ex; } @@ -185,11 +198,11 @@ class JWT * Converts and signs a PHP array into a JWT string. * * @param array $payload PHP array - * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key. + * @param string|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key. * @param string $alg Supported algorithms are 'ES384','ES256', 'ES256K', 'HS256', * 'HS384', 'HS512', 'RS256', 'RS384', and 'RS512' * @param string $keyId - * @param array $head An array with header elements to attach + * @param array $head An array with header elements to attach * * @return string A signed JWT * @@ -198,7 +211,7 @@ class JWT */ public static function encode( array $payload, - $key, + #[\SensitiveParameter] $key, string $alg, ?string $keyId = null, ?array $head = null @@ -226,7 +239,7 @@ class JWT * Sign a string with a given key and algorithm. * * @param string $msg The message to sign - * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key. + * @param string|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key. * @param string $alg Supported algorithms are 'EdDSA', 'ES384', 'ES256', 'ES256K', 'HS256', * 'HS384', 'HS512', 'RS256', 'RS384', and 'RS512' * @@ -236,7 +249,7 @@ class JWT */ public static function sign( string $msg, - $key, + #[\SensitiveParameter] $key, string $alg ): string { if (empty(static::$supported_algs[$alg])) { @@ -248,13 +261,19 @@ class JWT if (!\is_string($key)) { throw new InvalidArgumentException('key must be a string when using hmac'); } + self::validateHmacKeyLength($key, $algorithm); return \hash_hmac($algorithm, $msg, $key, true); case 'openssl': $signature = ''; - if (!\is_resource($key) && !openssl_pkey_get_private($key)) { + if (!$key = openssl_pkey_get_private($key)) { throw new DomainException('OpenSSL unable to validate key'); } - $success = \openssl_sign($msg, $signature, $key, $algorithm); // @phpstan-ignore-line + if (str_starts_with($alg, 'RS')) { + self::validateRsaKeyLength($key); + } elseif (str_starts_with($alg, 'ES')) { + self::validateEcKeyLength($key, $alg); + } + $success = \openssl_sign($msg, $signature, $key, $algorithm); if (!$success) { throw new DomainException('OpenSSL unable to sign data'); } @@ -293,7 +312,7 @@ class JWT * * @param string $msg The original message (header and body) * @param string $signature The original signature - * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial For Ed*, ES*, HS*, a string key works. for RS*, must be an instance of OpenSSLAsymmetricKey + * @param string|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial For Ed*, ES*, HS*, a string key works. for RS*, must be an instance of OpenSSLAsymmetricKey * @param string $alg The algorithm * * @return bool @@ -303,7 +322,7 @@ class JWT private static function verify( string $msg, string $signature, - $keyMaterial, + #[\SensitiveParameter] $keyMaterial, string $alg ): bool { if (empty(static::$supported_algs[$alg])) { @@ -313,7 +332,15 @@ class JWT list($function, $algorithm) = static::$supported_algs[$alg]; switch ($function) { case 'openssl': - $success = \openssl_verify($msg, $signature, $keyMaterial, $algorithm); // @phpstan-ignore-line + if (!$key = openssl_pkey_get_public($keyMaterial)) { + throw new DomainException('OpenSSL unable to validate key'); + } + if (str_starts_with($alg, 'RS')) { + self::validateRsaKeyLength($key); + } elseif (str_starts_with($alg, 'ES')) { + self::validateEcKeyLength($key, $alg); + } + $success = \openssl_verify($msg, $signature, $keyMaterial, $algorithm); if ($success === 1) { return true; } @@ -350,6 +377,7 @@ class JWT if (!\is_string($keyMaterial)) { throw new InvalidArgumentException('key must be a string when using hmac'); } + self::validateHmacKeyLength($keyMaterial, $algorithm); $hash = \hash_hmac($algorithm, $msg, $keyMaterial, true); return self::constantTimeEquals($hash, $signature); } @@ -457,7 +485,7 @@ class JWT * @return Key */ private static function getKey( - $keyOrKeyArray, + #[\SensitiveParameter] $keyOrKeyArray, ?string $kid ): Key { if ($keyOrKeyArray instanceof Key) { @@ -664,4 +692,57 @@ class JWT return [$pos, $data]; } + + /** + * Validate HMAC key length + * + * @param string $key HMAC key material + * @param string $algorithm The algorithm + * + * @throws DomainException Provided key is too short + */ + private static function validateHmacKeyLength(string $key, string $algorithm): void + { + $keyLength = \strlen($key) * 8; + $minKeyLength = (int) \str_replace('SHA', '', $algorithm); + if ($keyLength < $minKeyLength) { + throw new DomainException('Provided key is too short'); + } + } + + /** + * Validate RSA key length + * + * @param OpenSSLAsymmetricKey $key RSA key material + * @throws DomainException Provided key is too short + */ + private static function validateRsaKeyLength(#[\SensitiveParameter] OpenSSLAsymmetricKey $key): void + { + if (!$keyDetails = openssl_pkey_get_details($key)) { + throw new DomainException('Unable to validate key'); + } + if ($keyDetails['bits'] < self::RSA_KEY_MIN_LENGTH) { + throw new DomainException('Provided key is too short'); + } + } + + /** + * Validate RSA key length + * + * @param OpenSSLAsymmetricKey $key RSA key material + * @param string $algorithm The algorithm + * @throws DomainException Provided key is too short + */ + private static function validateEcKeyLength( + #[\SensitiveParameter] OpenSSLAsymmetricKey $key, + string $algorithm + ): void { + if (!$keyDetails = openssl_pkey_get_details($key)) { + throw new DomainException('Unable to validate key'); + } + $minKeyLength = (int) \str_replace('ES', '', $algorithm); + if ($keyDetails['bits'] < $minKeyLength) { + throw new DomainException('Provided key is too short'); + } + } } diff --git a/lib/firebase/php-jwt/src/Key.php b/lib/firebase/php-jwt/src/Key.php index b34eae258..694d3b13b 100644 --- a/lib/firebase/php-jwt/src/Key.php +++ b/lib/firebase/php-jwt/src/Key.php @@ -10,20 +10,19 @@ use TypeError; class Key { /** - * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial + * @param string|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial * @param string $algorithm */ public function __construct( - private $keyMaterial, + #[\SensitiveParameter] private $keyMaterial, private string $algorithm ) { if ( !\is_string($keyMaterial) && !$keyMaterial instanceof OpenSSLAsymmetricKey && !$keyMaterial instanceof OpenSSLCertificate - && !\is_resource($keyMaterial) ) { - throw new TypeError('Key material must be a string, resource, or OpenSSLAsymmetricKey'); + throw new TypeError('Key material must be a string, OpenSSLCertificate, or OpenSSLAsymmetricKey'); } if (empty($keyMaterial)) { @@ -46,7 +45,7 @@ class Key } /** - * @return string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate + * @return string|OpenSSLAsymmetricKey|OpenSSLCertificate */ public function getKeyMaterial() { diff --git a/lib/league/oauth2-client/README.md b/lib/league/oauth2-client/README.md index 37a127d15..05c8d457e 100644 --- a/lib/league/oauth2-client/README.md +++ b/lib/league/oauth2-client/README.md @@ -24,6 +24,7 @@ This package is compliant with [PSR-1][], [PSR-2][], [PSR-4][], and [PSR-7][]. I We support the following versions of PHP: +* PHP 8.5 * PHP 8.4 * PHP 8.3 * PHP 8.2 diff --git a/lib/league/oauth2-client/composer.json b/lib/league/oauth2-client/composer.json index 905f7ce8f..5dcc58355 100644 --- a/lib/league/oauth2-client/composer.json +++ b/lib/league/oauth2-client/composer.json @@ -6,7 +6,7 @@ "sort-packages": true }, "require": { - "php": "^7.1 || >=8.0.0 <8.5.0", + "php": "^7.1 || >=8.0.0 <8.6.0", "ext-json": "*", "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5" }, diff --git a/lib/league/oauth2-google/CHANGELOG.md b/lib/league/oauth2-google/CHANGELOG.md index d82a2ae17..d41761f51 100644 --- a/lib/league/oauth2-google/CHANGELOG.md +++ b/lib/league/oauth2-google/CHANGELOG.md @@ -1,5 +1,12 @@ OAuth 2.0 Google Provider Changelog + +## 4.1.0 - 2025-12-15 + +### Added + +- Added getEmailVerified(), isEmailTrustworthy() to user definition, #132 by @dt-thomas-durand + ## 4.0.1 - 2022-03-17 ### Changed diff --git a/lib/league/oauth2-google/README.md b/lib/league/oauth2-google/README.md index 38792d4af..e951f309b 100644 --- a/lib/league/oauth2-google/README.md +++ b/lib/league/oauth2-google/README.md @@ -1,6 +1,6 @@ # Google Provider for OAuth 2.0 Client -[![Build Status](https://img.shields.io/github/workflow/status/thephpleague/oauth2-google/test/main)](https://github.com/thephpleague/oauth2-google/actions/workflows/test.yaml) +[![Build Status](https://img.shields.io/github/actions/workflow/status/thephpleague/oauth2-google/ci.yml?branch=main)](https://github.com/thephpleague/oauth2-google/actions/workflows/ci.yml) [![Code Coverage](https://img.shields.io/codecov/c/gh/thephpleague/oauth2-google)](https://app.codecov.io/gh/thephpleague/oauth2-google) [![License](https://img.shields.io/packagist/l/league/oauth2-google)](https://github.com/thephpleague/oauth2-google/blob/main/LICENSE) [![Latest Stable Version](https://img.shields.io/packagist/v/league/oauth2-google)](https://packagist.org/packages/league/oauth2-google) @@ -22,6 +22,8 @@ The following versions of PHP are supported. * PHP 7.4 * PHP 8.0 * PHP 8.1 +* PHP 8.2 +* PHP 8.3 This package uses [OpenID Connect][openid-connect] to authenticate users with Google accounts. diff --git a/lib/league/oauth2-google/src/Provider/GoogleUser.php b/lib/league/oauth2-google/src/Provider/GoogleUser.php index d004e3c6d..58f0538d2 100644 --- a/lib/league/oauth2-google/src/Provider/GoogleUser.php +++ b/lib/league/oauth2-google/src/Provider/GoogleUser.php @@ -72,6 +72,36 @@ class GoogleUser implements ResourceOwnerInterface return $this->getResponseValue('email'); } + /** + * Get email_verified attribute. + * + * @return bool|null + */ + public function getEmailVerified(): ?bool + { + return $this->getResponseValue('email_verified'); + } + + /** + * Returns whether the email is trustable enough to be used for authentication purpose. + * + * @see https://developers.google.com/identity/gsi/web/guides/verify-google-id-token + */ + public function isEmailTrustworthy(): bool + { + $email = $this->getEmail(); + if (! $email) { + return false; + } + if ('@gmail.com' === substr($email, -10)) { + return true; + } + if ($this->getHostedDomain() && $this->getEmailVerified()) { + return true; + } + return false; + } + /** * Get hosted domain. * diff --git a/lib/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php b/lib/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php index 457bddc86..b10578088 100644 --- a/lib/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php +++ b/lib/nikic/php-parser/lib/PhpParser/ConstExprEvaluator.php @@ -3,10 +3,7 @@ namespace PhpParser; use PhpParser\Node\Expr; -use PhpParser\Node\Identifier; -use PhpParser\Node\Name; use PhpParser\Node\Scalar; -use Exception; use function array_merge; @@ -20,8 +17,6 @@ use function array_merge; * following node types: * * * All Scalar\MagicConst\* nodes. - * * Expr\ConstFetch nodes. Only null/false/true are already handled by this class. - * * Expr\ClassConstFetch nodes. * * The fallback evaluator should throw ConstExprEvaluationException for nodes it cannot evaluate. * @@ -31,13 +26,7 @@ use function array_merge; */ class ConstExprEvaluator { /** @var callable|null */ - private $fallbackEvaluator; - - /** @var array $functionsWhiteList */ - private $functionsWhiteList; - - /** @var array $staticCallsWhitelist */ - private $staticCallsWhitelist; + protected $fallbackEvaluator; /** * Create a constant expression evaluator. @@ -53,17 +42,6 @@ class ConstExprEvaluator { "Expression of type {$expr->getType()} cannot be evaluated" ); }; - - $this->functionsWhiteList = []; - $this->staticCallsWhitelist = []; - } - - public function setFunctionsWhitelist(array $functionsWhiteList): void { - $this->functionsWhiteList = $functionsWhiteList; - } - - public function setStaticCallsWhitelist(array $staticCallsWhitelist): void { - $this->staticCallsWhitelist = $staticCallsWhitelist; } /** @@ -123,7 +101,7 @@ class ConstExprEvaluator { } /** @return mixed */ - private function evaluate(Expr $expr) { + protected function evaluate(Expr $expr) { if ($expr instanceof Scalar\Int_ || $expr instanceof Scalar\Float_ || $expr instanceof Scalar\String_ @@ -135,10 +113,6 @@ class ConstExprEvaluator { return $this->evaluateArray($expr); } - if ($expr instanceof Expr\Variable) { - return $this->evaluateVariable($expr); - } - // Unary operators if ($expr instanceof Expr\UnaryPlus) { return +$this->evaluate($expr->expr); @@ -169,37 +143,13 @@ class ConstExprEvaluator { return $this->evaluateConstFetch($expr); } - if ($expr instanceof Expr\Isset_) { - return $this->evaluateIsset($expr); - } + if ($expr instanceof Expr\ClassConstFetch) { + return $this->evaluateClassConstFetch($expr); + } - if ($expr instanceof Expr\ClassConstFetch) { - return $this->evaluateClassConstFetch($expr); - } - - if ($expr instanceof Expr\Cast) { - return $this->evaluateCast($expr); - } - - if ($expr instanceof Expr\StaticPropertyFetch) { - return $this->evaluateStaticPropertyFetch($expr); - } - - if ($expr instanceof Expr\FuncCall) { - return $this->evaluateFuncCall($expr); - } - - if ($expr instanceof Expr\StaticCall) { - return $this->evaluateStaticCall($expr); - } - - if ($expr instanceof Expr\NullsafePropertyFetch||$expr instanceof Expr\PropertyFetch) { - return $this->evaluatePropertyFetch($expr); - } - - if ($expr instanceof Expr\NullsafeMethodCall||$expr instanceof Expr\MethodCall) { - return $this->evaluateMethodCall($expr); - } + if ($expr instanceof Expr\Cast) { + return $this->evaluateCast($expr); + } return ($this->fallbackEvaluator)($expr); } @@ -231,15 +181,12 @@ class ConstExprEvaluator { /** @return mixed */ private function evaluateBinaryOp(Expr\BinaryOp $expr) { - if ($expr instanceof Expr\BinaryOp\Coalesce) { - try { - $var = $this->evaluate($expr->left); - } catch(\Throwable $t) { - //left expression cannot be evaluated (! isset for exeample) - return $this->evaluate($expr->right); - } - - return $var ?? $this->evaluate($expr->right); + if ($expr instanceof Expr\BinaryOp\Coalesce + && $expr->left instanceof Expr\ArrayDimFetch + ) { + // This needs to be special cased to respect BP_VAR_IS fetch semantics + return $this->evaluate($expr->left->var)[$this->evaluate($expr->left->dim)] + ?? $this->evaluate($expr->right); } // The evaluate() calls are repeated in each branch, because some of the operators are @@ -284,272 +231,79 @@ class ConstExprEvaluator { /** @return mixed */ private function evaluateConstFetch(Expr\ConstFetch $expr) { - try { - $name = $expr->name; - if(! is_string($name)) { - //PHP_VERSION_ID usecase - $name = $name->name; - } + try { + $name = $expr->name->name; - if (defined($name)) { - return constant($name); - } - } catch(\Throwable $t) {} + if (defined($name)) { + return constant($name); + } + } catch (\Throwable $t) { + } return ($this->fallbackEvaluator)($expr); } - /** @return bool */ - private function evaluateIsset(Expr\Isset_ $expr) { - try { - foreach ($expr->vars as $var) { - $var = $this->evaluate($var); - if (! isset($var)) { - return false; - } - } + /** @return mixed */ + private function evaluateClassConstFetch(Expr\ClassConstFetch $expr) { + try { + $classname = $expr->class->name; + $property = $expr->name->name; - return true; - } catch(\Throwable $t) { - return false; - } - } + if ('class' === $property) { + return $classname; + } - /** @return mixed */ - private function evaluateClassConstFetch(Expr\ClassConstFetch $expr) { - try { - $classname = $expr->class->name; - $property = $expr->name->name; + if (class_exists($classname)) { + $class = new \ReflectionClass($classname); + if (array_key_exists($property, $class->getConstants())) { + $oReflectionConstant = $class->getReflectionConstant($property); + if ($oReflectionConstant->isPublic()) { + return $class->getConstant($property); + } + } + } + } catch (\Throwable $t) { + } - if ('class' === $property) { - return $classname; - } + return ($this->fallbackEvaluator)($expr); + } - if (class_exists($classname)) { - $class = new \ReflectionClass($classname); - if (array_key_exists($property, $class->getConstants())) { - $oReflectionConstant = $class->getReflectionConstant($property); - if ($oReflectionConstant->isPublic()) { - return $class->getConstant($property); - } - } - } - } catch(\Throwable $t) {} + /** @return mixed */ + private function evaluateCast(Expr\Cast $expr) { + try { + $subexpr = $this->evaluate($expr->expr); + $type = get_class($expr); + switch ($type) { + case Expr\Cast\Array_::class: + return (array) $subexpr; - return ($this->fallbackEvaluator)($expr); - } + case Expr\Cast\Bool_::class: + return (bool) $subexpr; - /** @return mixed */ - private function evaluateCast(Expr\Cast $expr) { - try { - $subexpr = $this->evaluate($expr->expr); - $type = get_class($expr); - switch ($type) { - case Expr\Cast\Array_::class: - return (array) $subexpr; + case Expr\Cast\Double::class: + switch ($expr->getAttribute("kind")) { + case Expr\Cast\Double::KIND_DOUBLE: + return (float) $subexpr; - case Expr\Cast\Bool_::class: - return (bool) $subexpr; + case Expr\Cast\Double::KIND_FLOAT: + case Expr\Cast\Double::KIND_REAL: + return (float) $subexpr; + } - case Expr\Cast\Double::class: - switch ($expr->getAttribute("kind")) { - case Expr\Cast\Double::KIND_DOUBLE: - return (double) $subexpr; + break; - case Expr\Cast\Double::KIND_FLOAT: - case Expr\Cast\Double::KIND_REAL: - return (float) $subexpr; - } + case Expr\Cast\Int_::class: + return (int) $subexpr; - break; + case Expr\Cast\Object_::class: + return (object) $subexpr; - case Expr\Cast\Int_::class: - return (int) $subexpr; + case Expr\Cast\String_::class: + return (string) $subexpr; + } + } catch (\Throwable $t) { + } - case Expr\Cast\Object_::class: - return (object) $subexpr; - - case Expr\Cast\String_::class: - return (string) $subexpr; - } - } catch(\Throwable $t) {} - - return ($this->fallbackEvaluator)($expr); - } - - /** @return mixed */ - private function evaluateStaticPropertyFetch(Expr\StaticPropertyFetch $expr) { - try { - $classname = $expr->class->name; - if ($expr->name instanceof Identifier) { - $property = $expr->name->name; - } else { - $property = $this->evaluate($expr->name); - } - - if (class_exists($classname)) { - $class = new \ReflectionClass($classname); - if (array_key_exists($property, $class->getStaticProperties())) { - $oReflectionProperty = $class->getProperty($property); - if ($oReflectionProperty->isPublic()) { - return $class->getStaticPropertyValue($property); - } - } - } - } - catch (\Throwable $t) {} - - return ($this->fallbackEvaluator)($expr); - } - - /** @return mixed */ - private function evaluateFuncCall(Expr\FuncCall $expr) { - try { - $name = $expr->name; - if ($name instanceof Name) { - $function = $name->name; - } else { - $function = $this->evaluate($name); - } - - if (! in_array($function, $this->functionsWhiteList)) { - throw new Exception("FuncCall $function not supported"); - } - - $args=[]; - foreach ($expr->args as $arg) { - /** @var \PhpParser\Node\Arg $arg */ - $args[]=$arg->value->value; - } - - $reflection_function = new \ReflectionFunction($function); - return $reflection_function->invoke(...$args); - } - catch (\Throwable $t) {} - - return ($this->fallbackEvaluator)($expr); - } - - /** @return mixed */ - private function evaluateVariable(Expr\Variable $expr) { - try { - $name = $expr->name; - if (array_key_exists($name, get_defined_vars())) { - return $$name; - } - - if (array_key_exists($name, $GLOBALS)) { - global $$name; - return $$name; - } - } catch (\Throwable $t) { - } - - return ($this->fallbackEvaluator)($expr); - } - - /** @return mixed */ - private function evaluateStaticCall(Expr\StaticCall $expr) { - try { - $class = $expr->class->name; - if ($expr->name instanceof Identifier) { - $method = $expr->name->name; - } else { - $method = $this->evaluate($expr->name); - } - - $static_call_description = "$class::$method"; - if (! in_array($static_call_description, $this->staticCallsWhitelist)) { - throw new Exception("StaticCall $static_call_description not supported"); - } - - $args=[]; - foreach ($expr->args as $arg) { - /** @var \PhpParser\Node\Arg $arg */ - $args[]=$arg->value->value; - } - - $class = new \ReflectionClass($class); - $method = $class->getMethod($method); - if ($method->isPublic()) { - return $method->invokeArgs(null, $args); - } - } catch (\Throwable $t) {} - - return ($this->fallbackEvaluator)($expr); - } - - /** - * @param \PhpParser\Node\Expr\NullsafePropertyFetch|\PhpParser\Node\Expr\PropertyFetch $expr - * - * @return mixed - */ - private function evaluatePropertyFetch($expr) { - try { - $var = $this->evaluate($expr->var); - } catch (\Throwable $t) { - $var = null; - } - - if (! is_null($var)) { - try { - if ($expr->name instanceof Identifier) { - $name = $expr->name->name; - } else { - $name = $this->evaluate($expr->name); - } - - $reflectionClass = new \ReflectionClass(get_class($var)); - $property = $reflectionClass->getProperty($name); - if ($property->isPublic()) { - return $property->getValue($var); - } - } - catch (\Throwable $t) {} - } else if ($expr instanceof Expr\NullsafePropertyFetch) { - return null; - } - - return ($this->fallbackEvaluator)($expr); - } - - /** - * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\NullsafeMethodCall $expr - * - * @return mixed - */ - private function evaluateMethodCall($expr) { - try { - $var = $this->evaluate($expr->var); - } catch (\Throwable $t) { - $var = null; - } - - if (! is_null($var)) { - try { - $args = []; - foreach ($expr->args as $arg) { - /** @var \PhpParser\Node\Arg $arg */ - $args[] = $arg->value->value; - } - - if ($expr->name instanceof Identifier) { - $name = $expr->name->name; - } else { - $name = $this->evaluate($expr->name); - } - - $reflectionClass = new \ReflectionClass(get_class($var)); - $method = $reflectionClass->getMethod($name); - if ($method->isPublic()) { - return $method->invokeArgs($var, $args); - } - } - catch (\Throwable $t) {} - } else if ($expr instanceof Expr\NullsafeMethodCall) { - return null; - } - - return ($this->fallbackEvaluator)($expr); - } + return ($this->fallbackEvaluator)($expr); + } } diff --git a/lib/nikic/php-parser/lib/PhpParser/ExprEvaluationException.php b/lib/nikic/php-parser/lib/PhpParser/ExprEvaluationException.php new file mode 100644 index 000000000..25a6290bd --- /dev/null +++ b/lib/nikic/php-parser/lib/PhpParser/ExprEvaluationException.php @@ -0,0 +1,6 @@ + */ + private array $functionsWhiteList = []; + + /** @var array */ + private array $staticCallsWhitelist = []; + + /** + * Create a constant expression evaluator. + * + * The provided fallback evaluator is invoked whenever a subexpression cannot be evaluated. See + * class doc comment for more information. + * + * @param callable|null $fallbackEvaluator To call if subexpression cannot be evaluated + */ + public function __construct(?callable $fallbackEvaluator = null) { + parent::__construct($fallbackEvaluator); + + $this->fallbackEvaluator = $fallbackEvaluator ?? function (Expr $expr) { + throw new ExprEvaluationException( + "Expression of type {$expr->getType()} cannot be evaluated" + ); + }; + } + + /** + * @param array $functionsWhiteList + */ + public function setFunctionsWhitelist(array $functionsWhiteList): void { + $this->functionsWhiteList = $functionsWhiteList; + } + + /** + * @param array $staticCallsWhitelist + */ + public function setStaticCallsWhitelist(array $staticCallsWhitelist): void { + $this->staticCallsWhitelist = $staticCallsWhitelist; + } + + /** + * Silently evaluates a constant expression into a PHP value. + * + * Thrown Errors, warnings or notices will be converted into a ConstExprEvaluationException. + * The original source of the exception is available through getPrevious(). + * + * If some part of the expression cannot be evaluated, the fallback evaluator passed to the + * constructor will be invoked. By default, if no fallback is provided, an exception of type + * ConstExprEvaluationException is thrown. + * + * See class doc comment for caveats and limitations. + * + * @param Expr $expr Constant expression to evaluate + * + * @return mixed Result of evaluation + * + * @throws ExprEvaluationException if the expression cannot be evaluated or an error occurred + */ + public function evaluateSilently(Expr $expr) { + set_error_handler(function ($num, $str, $file, $line) { + throw new \ErrorException($str, 0, $num, $file, $line); + }); + + try { + return $this->evaluate($expr); + } catch (\Throwable $e) { + if (!$e instanceof ExprEvaluationException) { + $e = new ExprEvaluationException( + "An error occurred during expression evaluation", 0, $e); + } + throw $e; + } finally { + restore_error_handler(); + } + } + + /** + * Directly evaluates a constant expression into a PHP value. + * + * May generate Error exceptions, warnings or notices. Use evaluateSilently() to convert these + * into a ConstExprEvaluationException. + * + * If some part of the expression cannot be evaluated, the fallback evaluator passed to the + * constructor will be invoked. By default, if no fallback is provided, an exception of type + * ConstExprEvaluationException is thrown. + * + * See class doc comment for caveats and limitations. + * + * @param Expr $expr Constant expression to evaluate + * + * @return mixed Result of evaluation + * + * @throws ExprEvaluationException if the expression cannot be evaluated + */ + public function evaluateDirectly(Expr $expr) { + return $this->evaluate($expr); + } + + /** @return mixed */ + protected function evaluate(Expr $expr) { + try { + return parent::evaluate($expr); + } catch (\Throwable $t) { + } + + if ($expr instanceof Expr\Variable) { + return $this->evaluateVariable($expr); + } + + if ($expr instanceof Expr\BinaryOp\Coalesce) { + try { + $var = $this->evaluate($expr->left); + } catch (\Throwable $t) { + //left expression cannot be evaluated (! isset for exeample) + return $this->evaluate($expr->right); + } + + return $var ?? $this->evaluate($expr->right); + } + + if ($expr instanceof Expr\Isset_) { + return $this->evaluateIsset($expr); + } + + if ($expr instanceof Expr\StaticPropertyFetch) { + return $this->evaluateStaticPropertyFetch($expr); + } + + if ($expr instanceof Expr\FuncCall) { + return $this->evaluateFuncCall($expr); + } + + if ($expr instanceof Expr\StaticCall) { + return $this->evaluateStaticCall($expr); + } + + if ($expr instanceof Expr\NullsafePropertyFetch || $expr instanceof Expr\PropertyFetch) { + return $this->evaluatePropertyFetch($expr); + } + + if ($expr instanceof Expr\NullsafeMethodCall || $expr instanceof Expr\MethodCall) { + return $this->evaluateMethodCall($expr); + } + + return ($this->fallbackEvaluator)($expr); + } + + /** @return bool */ + private function evaluateIsset(Expr\Isset_ $expr) { + try { + foreach ($expr->vars as $var) { + $var = $this->evaluate($var); + if (! isset($var)) { + return false; + } + } + + return true; + } catch (\Throwable $t) { + return false; + } + } + + /** @return mixed */ + private function evaluateStaticPropertyFetch(Expr\StaticPropertyFetch $expr) { + try { + $classname = $expr->class->name; + if ($expr->name instanceof Identifier) { + $property = $expr->name->name; + } else { + $property = $this->evaluate($expr->name); + } + + if (class_exists($classname)) { + $class = new \ReflectionClass($classname); + if (array_key_exists($property, $class->getStaticProperties())) { + $oReflectionProperty = $class->getProperty($property); + if ($oReflectionProperty->isPublic()) { + return $class->getStaticPropertyValue($property); + } + } + } + } catch (\Throwable $t) { + } + + return ($this->fallbackEvaluator)($expr); + } + + /** @return mixed */ + private function evaluateFuncCall(Expr\FuncCall $expr) { + try { + $name = $expr->name; + if ($name instanceof Name) { + $function = $name->name; + } else { + $function = $this->evaluate($name); + } + + if (! in_array($function, $this->functionsWhiteList)) { + throw new Exception("FuncCall $function not supported"); + } + + $args = []; + foreach ($expr->args as $arg) { + /** @var \PhpParser\Node\Arg $arg */ + $args[] = $this->evaluate($arg->value); + } + + $reflection_function = new \ReflectionFunction($function); + return $reflection_function->invoke(...$args); + } catch (\Throwable $t) { + } + + return ($this->fallbackEvaluator)($expr); + } + + /** @return mixed */ + private function evaluateVariable(Expr\Variable $expr) { + try { + $name = $expr->name; + if (array_key_exists($name, get_defined_vars())) { + return $$name; + } + + if (array_key_exists($name, $GLOBALS)) { + global $$name; + return $$name; + } + } catch (\Throwable $t) { + } + + return ($this->fallbackEvaluator)($expr); + } + + /** @return mixed */ + private function evaluateStaticCall(Expr\StaticCall $expr) { + try { + $class = $expr->class->name; + if ($expr->name instanceof Identifier) { + $method = $expr->name->name; + } else { + $method = $this->evaluate($expr->name); + } + + $static_call_description = "$class::$method"; + if (! in_array($static_call_description, $this->staticCallsWhitelist)) { + throw new Exception("StaticCall $static_call_description not supported"); + } + + $args = []; + foreach ($expr->args as $arg) { + /** @var \PhpParser\Node\Arg $arg */ + $args[] = $this->evaluate($arg->value); + } + + $class = new \ReflectionClass($class); + $method = $class->getMethod($method); + if ($method->isPublic()) { + return $method->invokeArgs(null, $args); + } + } catch (\Throwable $t) { + } + + return ($this->fallbackEvaluator)($expr); + } + + /** + * @param \PhpParser\Node\Expr\NullsafePropertyFetch|\PhpParser\Node\Expr\PropertyFetch $expr + * + * @return mixed + */ + private function evaluatePropertyFetch($expr) { + try { + $var = $this->evaluate($expr->var); + } catch (\Throwable $t) { + $var = null; + } + + if (! is_null($var)) { + try { + if ($expr->name instanceof Identifier) { + $name = $expr->name->name; + } else { + $name = $this->evaluate($expr->name); + } + + $reflectionClass = new \ReflectionClass(get_class($var)); + $property = $reflectionClass->getProperty($name); + if ($property->isPublic()) { + return $property->getValue($var); + } + } catch (\Throwable $t) { + } + } elseif ($expr instanceof Expr\NullsafePropertyFetch) { + return null; + } + + return ($this->fallbackEvaluator)($expr); + } + + /** + * @param \PhpParser\Node\Expr\MethodCall|\PhpParser\Node\Expr\NullsafeMethodCall $expr + * + * @return mixed + */ + private function evaluateMethodCall($expr) { + try { + $var = $this->evaluate($expr->var); + } catch (\Throwable $t) { + $var = null; + } + + if (! is_null($var)) { + try { + $args = []; + foreach ($expr->args as $arg) { + /** @var \PhpParser\Node\Arg $arg */ + $args[] = $this->evaluate($arg->value); + } + + if ($expr->name instanceof Identifier) { + $name = $expr->name->name; + } else { + $name = $this->evaluate($expr->name); + } + + $reflectionClass = new \ReflectionClass(get_class($var)); + $method = $reflectionClass->getMethod($name); + if ($method->isPublic()) { + return $method->invokeArgs($var, $args); + } + } catch (\Throwable $t) { + } + } elseif ($expr instanceof Expr\NullsafeMethodCall) { + return null; + } + + return ($this->fallbackEvaluator)($expr); + } +} diff --git a/lib/pear/pear-core-minimal/src/PEAR.php b/lib/pear/pear-core-minimal/src/PEAR.php index 43c65dbdb..0c9ab5694 100644 --- a/lib/pear/pear-core-minimal/src/PEAR.php +++ b/lib/pear/pear-core-minimal/src/PEAR.php @@ -216,9 +216,13 @@ class PEAR public function __call($method, $arguments) { if (!isset(self::$bivalentMethods[$method])) { - trigger_error( - 'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR - ); + if (PHP_VERSION_ID < 70000) { + trigger_error( + 'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR + ); + } else { + throw new Error('Call to undefined method PEAR::' . $method . '()'); + } } return call_user_func_array( array(__CLASS__, '_' . $method), @@ -229,9 +233,13 @@ class PEAR public static function __callStatic($method, $arguments) { if (!isset(self::$bivalentMethods[$method])) { - trigger_error( - 'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR - ); + if (PHP_VERSION_ID < 70000) { + trigger_error( + 'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR + ); + } else { + throw new Error('Call to undefined method PEAR::' . $method . '()'); + } } return call_user_func_array( array(__CLASS__, '_' . $method), diff --git a/lib/symfony/cache/Adapter/DoctrineDbalAdapter.php b/lib/symfony/cache/Adapter/DoctrineDbalAdapter.php index 1866083b4..b4673562b 100644 --- a/lib/symfony/cache/Adapter/DoctrineDbalAdapter.php +++ b/lib/symfony/cache/Adapter/DoctrineDbalAdapter.php @@ -32,6 +32,8 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface { private const MAX_KEY_LENGTH = 255; + private static int $savepointCounter = 0; + private MarshallerInterface $marshaller; private Connection $conn; private string $platformName; @@ -244,6 +246,26 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface return $failed; } + if ($this->conn->isTransactionActive() && $this->conn->getDatabasePlatform()->supportsSavepoints()) { + $savepoint = 'cache_save_'.++self::$savepointCounter; + try { + $this->conn->createSavepoint($savepoint); + $failed = $this->doSaveInner($values, $lifetime, $failed); + $this->conn->releaseSavepoint($savepoint); + + return $failed; + } catch (\Throwable $e) { + $this->conn->rollbackSavepoint($savepoint); + + throw $e; + } + } + + return $this->doSaveInner($values, $lifetime, $failed); + } + + private function doSaveInner(array $values, int $lifetime, array $failed): array|bool + { $platformName = $this->getPlatformName(); $insertSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?)"; diff --git a/lib/symfony/cache/Adapter/PdoAdapter.php b/lib/symfony/cache/Adapter/PdoAdapter.php index f5865993d..3eaf70c52 100644 --- a/lib/symfony/cache/Adapter/PdoAdapter.php +++ b/lib/symfony/cache/Adapter/PdoAdapter.php @@ -108,7 +108,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface // - trailing space removal // - case-insensitivity // - language processing like é == e - 'mysql' => "CREATE TABLE $this->table ($this->idCol VARBINARY(255) NOT NULL PRIMARY KEY, $this->dataCol MEDIUMBLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED, $this->timeCol INTEGER UNSIGNED NOT NULL), ENGINE = InnoDB", + 'mysql' => "CREATE TABLE $this->table ($this->idCol VARBINARY(255) NOT NULL PRIMARY KEY, $this->dataCol MEDIUMBLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED, $this->timeCol INTEGER UNSIGNED NOT NULL) ENGINE = InnoDB", 'sqlite' => "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", 'pgsql' => "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", 'oci' => "CREATE TABLE $this->table ($this->idCol VARCHAR2(255) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", diff --git a/lib/symfony/cache/Traits/RedisTrait.php b/lib/symfony/cache/Traits/RedisTrait.php index c3fc68990..120fd4152 100644 --- a/lib/symfony/cache/Traits/RedisTrait.php +++ b/lib/symfony/cache/Traits/RedisTrait.php @@ -175,9 +175,26 @@ trait RedisTrait } $params += $query + $options + self::$defaultConnectionOptions; - $params['auth'] ??= $auth; - if (isset($params['redis_sentinel']) && !class_exists(\Predis\Client::class) && !class_exists(\RedisSentinel::class) && !class_exists(Sentinel::class)) { + $booleanStreamOptions = [ + 'allow_self_signed', + 'capture_peer_cert', + 'capture_peer_cert_chain', + 'disable_compression', + 'SNI_enabled', + 'verify_peer', + 'verify_peer_name', + ]; + + foreach ($params['ssl'] ?? [] as $streamOption => $value) { + if (\in_array($streamOption, $booleanStreamOptions, true) && \is_string($value)) { + $params['ssl'][$streamOption] = filter_var($value, \FILTER_VALIDATE_BOOL); + } + } + + if (!isset($params['redis_sentinel'])) { + $params['auth'] ??= $auth; + } elseif (!class_exists(\Predis\Client::class) && !class_exists(\RedisSentinel::class) && !class_exists(Sentinel::class)) { throw new CacheException('Redis Sentinel support requires one of: "predis/predis", "ext-redis >= 5.2", "ext-relay".'); } @@ -246,6 +263,10 @@ trait RedisTrait $options['auth'] = $params['auth']; } + if (null !== $params['ssl'] && version_compare(phpversion('redis'), '6.2.0', '>=')) { + $options['ssl'] = $params['ssl']; + } + $sentinel = new \RedisSentinel($options); } else { $extra = $passAuth ? [$params['auth']] : []; @@ -268,21 +289,6 @@ trait RedisTrait $extra = [ 'stream' => $params['ssl'] ?? null, ]; - $booleanStreamOptions = [ - 'allow_self_signed', - 'capture_peer_cert', - 'capture_peer_cert_chain', - 'disable_compression', - 'SNI_enabled', - 'verify_peer', - 'verify_peer_name', - ]; - - foreach ($extra['stream'] ?? [] as $streamOption => $value) { - if (\in_array($streamOption, $booleanStreamOptions, true) && \is_string($value)) { - $extra['stream'][$streamOption] = filter_var($value, \FILTER_VALIDATE_BOOL); - } - } if (null !== $params['auth']) { $extra['auth'] = $params['auth']; @@ -388,12 +394,12 @@ trait RedisTrait if ($params['dbindex']) { $params['parameters']['database'] = $params['dbindex']; } - if (\is_array($params['auth'])) { + if (\is_array($auth)) { // ACL - $params['parameters']['username'] = $params['auth'][0]; - $params['parameters']['password'] = $params['auth'][1]; - } elseif (null !== $params['auth']) { - $params['parameters']['password'] = $params['auth']; + $params['parameters']['username'] = $auth[0]; + $params['parameters']['password'] = $auth[1]; + } elseif (null !== $auth) { + $params['parameters']['password'] = $auth; } if (isset($params['ssl'])) { diff --git a/lib/symfony/config/Loader/FileLoader.php b/lib/symfony/config/Loader/FileLoader.php index 8275ffcd3..2c505577a 100644 --- a/lib/symfony/config/Loader/FileLoader.php +++ b/lib/symfony/config/Loader/FileLoader.php @@ -72,27 +72,40 @@ abstract class FileLoader extends Loader */ public function import(mixed $resource, ?string $type = null, bool $ignoreErrors = false, ?string $sourceResource = null, string|array|null $exclude = null) { - if (\is_string($resource) && \strlen($resource) !== ($i = strcspn($resource, '*?{[')) && !str_contains($resource, "\n")) { - $excluded = []; - foreach ((array) $exclude as $pattern) { - foreach ($this->glob($pattern, true, $_, false, true) as $path => $info) { - // normalize Windows slashes and remove trailing slashes - $excluded[rtrim(str_replace('\\', '/', $path), '/')] = true; - } + $excluded = []; + foreach ((array) $exclude as $pattern) { + foreach ($this->glob($pattern, true, $_, false, true) as $path => $info) { + // normalize Windows slashes and remove trailing slashes + $excluded[rtrim(str_replace('\\', '/', $path), '/')] = true; + } + } + + if (\is_string($resource) && !class_exists($resource)) { + $isGlobPattern = \strlen($resource) !== strcspn($resource, '*?{['); + + if (!$isGlobPattern && $excluded) { + $resource = rtrim(str_replace('\\', '/', $resource), '/'); + $resource .= '/**/*'; + $isGlobPattern = true; } - $ret = []; - $isSubpath = 0 !== $i && str_contains(substr($resource, 0, $i), '/'); - foreach ($this->glob($resource, false, $_, $ignoreErrors || !$isSubpath, false, $excluded) as $path => $info) { - if (null !== $res = $this->doImport($path, 'glob' === $type ? null : $type, $ignoreErrors, $sourceResource)) { - $ret[] = $res; + if ($isGlobPattern && !str_contains($resource, "\n")) { + $ret = []; + $i = strcspn($resource, '*?{['); + $isSubpath = 0 !== $i && str_contains(substr($resource, 0, $i), '/'); + foreach ($this->glob($resource, false, $_, $ignoreErrors || !$isSubpath, false, $excluded) as $path => $info) { + if (null !== $res = $this->doImport($path, 'glob' === $type ? null : $type, $ignoreErrors, $sourceResource)) { + $ret[] = $res; + } + $isSubpath = true; } - $isSubpath = true; - } - if ($isSubpath) { - return isset($ret[1]) ? $ret : ($ret[0] ?? null); + if ($isSubpath) { + return isset($ret[1]) ? $ret : ($ret[0] ?? null); + } } + } elseif (\is_array($resource) && $excluded) { + $resource['_excluded'] = $excluded; } return $this->doImport($resource, $type, $ignoreErrors, $sourceResource); diff --git a/lib/symfony/config/Resource/ReflectionClassResource.php b/lib/symfony/config/Resource/ReflectionClassResource.php index 8b7bfba82..8c27b363b 100644 --- a/lib/symfony/config/Resource/ReflectionClassResource.php +++ b/lib/symfony/config/Resource/ReflectionClassResource.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Config\Resource; use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\Form\FormTypeExtensionInterface; use Symfony\Component\Messenger\Handler\MessageSubscriberInterface; use Symfony\Contracts\Service\ServiceSubscriberInterface; @@ -212,5 +213,12 @@ class ReflectionClassResource implements SelfCheckingResourceInterface yield ServiceSubscriberInterface::class; yield print_r($class->name::getSubscribedServices(), true); } + + if (interface_exists(FormTypeExtensionInterface::class, false) && $class->isSubclassOf(FormTypeExtensionInterface::class)) { + yield FormTypeExtensionInterface::class; + foreach ($class->name::getExtendedTypes() as $key => $value) { + yield $key.print_r($value, true); + } + } } } diff --git a/lib/symfony/console/Application.php b/lib/symfony/console/Application.php index f61761df5..b405c8318 100644 --- a/lib/symfony/console/Application.php +++ b/lib/symfony/console/Application.php @@ -761,6 +761,21 @@ class Application implements ResetInterface })); } + // check whether all commands left are aliases to the same one + if (\count($commands) > 1) { + $uniqueCommands = array_unique(array_map(function ($nameOrAlias) use (&$commandList) { + if (!$commandList[$nameOrAlias] instanceof Command) { + $commandList[$nameOrAlias] = $this->commandLoader->get($nameOrAlias); + } + + return $commandList[$nameOrAlias]->getName(); + }, $commands)); + + if (1 === \count($uniqueCommands)) { + $commands = [reset($uniqueCommands)]; + } + } + if (\count($commands) > 1) { $usableWidth = $this->terminal->getWidth() - 10; $abbrevs = array_values($commands); diff --git a/lib/symfony/console/Command/CompleteCommand.php b/lib/symfony/console/Command/CompleteCommand.php index 33f7f93c8..00b80f340 100644 --- a/lib/symfony/console/Command/CompleteCommand.php +++ b/lib/symfony/console/Command/CompleteCommand.php @@ -115,24 +115,30 @@ final class CompleteCommand extends Command 'Messages:', ]); - $command = $this->findCommand($completionInput, $output); + if ($command = $this->findCommand($completionInput, $output)) { + $command->mergeApplicationDefinition(); + $completionInput->bind($command->getDefinition()); + } + if (null === $command) { $this->log(' No command found, completing using the Application class.'); $this->getApplication()->complete($completionInput, $suggestions); } elseif ( $completionInput->mustSuggestArgumentValuesFor('command') - && $command->getName() !== $completionInput->getCompletionValue() - && !\in_array($completionInput->getCompletionValue(), $command->getAliases(), true) ) { - $this->log(' No command found, completing using the Application class.'); + $this->log(' Command found, completing command name.'); // expand shortcut names ("cache:cl") into their full name ("cache:clear") - $suggestions->suggestValues(array_filter(array_merge([$command->getName()], $command->getAliases()))); + $commandNames = array_filter(array_merge([$command->getName()], $command->getAliases())); + foreach ($commandNames as $name) { + if (str_starts_with($name, $completionInput->getCompletionValue())) { + $commandNames = [$name]; + break; + } + } + $suggestions->suggestValues($commandNames); } else { - $command->mergeApplicationDefinition(); - $completionInput->bind($command->getDefinition()); - if (CompletionInput::TYPE_OPTION_NAME === $completionInput->getCompletionType()) { $this->log(' Completing option names for the '.($command instanceof LazyCommand ? $command->getCommand() : $command)::class.' command.'); diff --git a/lib/symfony/console/Exception/RunCommandFailedException.php b/lib/symfony/console/Exception/RunCommandFailedException.php index 5d87ec949..e25ad2bdd 100644 --- a/lib/symfony/console/Exception/RunCommandFailedException.php +++ b/lib/symfony/console/Exception/RunCommandFailedException.php @@ -22,7 +22,7 @@ final class RunCommandFailedException extends RuntimeException { parent::__construct( $exception instanceof \Throwable ? $exception->getMessage() : $exception, - $exception instanceof \Throwable ? $exception->getCode() : 0, + $exception instanceof \Throwable && \is_int($exception->getCode()) ? $exception->getCode() : 0, $exception instanceof \Throwable ? $exception : null, ); } diff --git a/lib/symfony/console/Helper/ProgressIndicator.php b/lib/symfony/console/Helper/ProgressIndicator.php index 92106caf6..8c0475ed4 100644 --- a/lib/symfony/console/Helper/ProgressIndicator.php +++ b/lib/symfony/console/Helper/ProgressIndicator.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Console\Helper; use Symfony\Component\Console\Exception\InvalidArgumentException; use Symfony\Component\Console\Exception\LogicException; +use Symfony\Component\Console\Output\ConsoleSectionOutput; use Symfony\Component\Console\Output\OutputInterface; /** @@ -140,7 +141,9 @@ class ProgressIndicator $this->message = $message; $this->display(); - $this->output->writeln(''); + if (!$this->output instanceof ConsoleSectionOutput) { + $this->output->writeln(''); + } $this->started = false; } @@ -207,7 +210,9 @@ class ProgressIndicator */ private function overwrite(string $message): void { - if ($this->output->isDecorated()) { + if ($this->output instanceof ConsoleSectionOutput) { + $this->output->overwrite($message); + } elseif ($this->output->isDecorated()) { $this->output->write("\x0D\x1B[2K"); $this->output->write($message); } else { diff --git a/lib/symfony/console/Helper/QuestionHelper.php b/lib/symfony/console/Helper/QuestionHelper.php index d652a05ef..342a2a7e5 100644 --- a/lib/symfony/console/Helper/QuestionHelper.php +++ b/lib/symfony/console/Helper/QuestionHelper.php @@ -474,6 +474,8 @@ class QuestionHelper extends Helper try { return $question->getValidator()($interviewer()); + } catch (MissingInputException $e) { + throw $error ?? $e; } catch (RuntimeException $e) { throw $e; } catch (\Exception $error) { diff --git a/lib/symfony/console/Style/SymfonyStyle.php b/lib/symfony/console/Style/SymfonyStyle.php index 135f4fd0e..33800fe16 100644 --- a/lib/symfony/console/Style/SymfonyStyle.php +++ b/lib/symfony/console/Style/SymfonyStyle.php @@ -104,7 +104,7 @@ class SymfonyStyle extends OutputStyle public function listing(array $elements) { $this->autoPrependText(); - $elements = array_map(fn ($element) => \sprintf(' * %s', $element), $elements); + $elements = array_map(static fn ($element) => \sprintf(' * %s', $element), $elements); $this->writeln($elements); $this->newLine(); @@ -475,12 +475,14 @@ class SymfonyStyle extends OutputStyle $message = OutputFormatter::escape($message); } + $message = str_replace("\r\n", "\n", $message); + $lines = array_merge( $lines, - explode(\PHP_EOL, $outputWrapper->wrap( + explode("\n", $outputWrapper->wrap( $message, $this->lineLength - $prefixLength - $indentLength, - \PHP_EOL + "\n" )) ); diff --git a/lib/symfony/console/Terminal.php b/lib/symfony/console/Terminal.php index f094adedc..b87080609 100644 --- a/lib/symfony/console/Terminal.php +++ b/lib/symfony/console/Terminal.php @@ -128,7 +128,7 @@ class Terminal return false; } - return self::$stty = (bool) shell_exec('stty 2> '.('\\' === \DIRECTORY_SEPARATOR ? 'NUL' : '/dev/null')); + return self::$stty = (bool) @shell_exec('stty 2> '.('\\' === \DIRECTORY_SEPARATOR ? 'NUL' : '/dev/null')); } private static function initDimensions(): void diff --git a/lib/symfony/css-selector/CssSelectorConverter.php b/lib/symfony/css-selector/CssSelectorConverter.php index 7120a2950..a90cb8d6e 100644 --- a/lib/symfony/css-selector/CssSelectorConverter.php +++ b/lib/symfony/css-selector/CssSelectorConverter.php @@ -26,6 +26,8 @@ use Symfony\Component\CssSelector\XPath\Translator; */ class CssSelectorConverter { + public static int $maxCachedItems = 1024; + private Translator $translator; private array $cache; @@ -62,6 +64,21 @@ class CssSelectorConverter */ public function toXPath(string $cssExpr, string $prefix = 'descendant-or-self::'): string { - return $this->cache[$prefix][$cssExpr] ??= $this->translator->cssToXPath($cssExpr, $prefix); + $cacheKey = $prefix."\0".$cssExpr; + + if (isset($this->cache[$cacheKey])) { + // Move the item last in cache (LRU) + $value = $this->cache[$cacheKey]; + unset($this->cache[$cacheKey]); + + return $this->cache[$cacheKey] = $value; + } + + if (\count($this->cache) >= self::$maxCachedItems) { + // Evict the oldest entry + unset($this->cache[array_key_first($this->cache)]); + } + + return $this->cache[$cacheKey] = $this->translator->cssToXPath($cssExpr, $prefix); } } diff --git a/lib/symfony/dependency-injection/Attribute/Autowire.php b/lib/symfony/dependency-injection/Attribute/Autowire.php index c2d6c56c5..b4927bf67 100644 --- a/lib/symfony/dependency-injection/Attribute/Autowire.php +++ b/lib/symfony/dependency-injection/Attribute/Autowire.php @@ -21,7 +21,7 @@ use Symfony\Component\ExpressionLanguage\Expression; * * @author Kevin Bond */ -#[\Attribute(\Attribute::TARGET_PARAMETER)] +#[\Attribute(\Attribute::TARGET_PARAMETER | \Attribute::TARGET_PROPERTY)] class Autowire { public readonly string|array|Expression|Reference|ArgumentInterface|null $value; diff --git a/lib/symfony/dependency-injection/Attribute/AutowireDecorated.php b/lib/symfony/dependency-injection/Attribute/AutowireDecorated.php index ed8f33e00..fc69f754a 100644 --- a/lib/symfony/dependency-injection/Attribute/AutowireDecorated.php +++ b/lib/symfony/dependency-injection/Attribute/AutowireDecorated.php @@ -11,7 +11,7 @@ namespace Symfony\Component\DependencyInjection\Attribute; -#[\Attribute(\Attribute::TARGET_PARAMETER)] +#[\Attribute(\Attribute::TARGET_PARAMETER | \Attribute::TARGET_PROPERTY)] class AutowireDecorated { } diff --git a/lib/symfony/dependency-injection/Attribute/Target.php b/lib/symfony/dependency-injection/Attribute/Target.php index 0de388e71..b65bce21b 100644 --- a/lib/symfony/dependency-injection/Attribute/Target.php +++ b/lib/symfony/dependency-injection/Attribute/Target.php @@ -19,7 +19,7 @@ use Symfony\Component\DependencyInjection\Exception\LogicException; * * @author Nicolas Grekas */ -#[\Attribute(\Attribute::TARGET_PARAMETER)] +#[\Attribute(\Attribute::TARGET_PARAMETER | \Attribute::TARGET_PROPERTY)] final class Target { public function __construct( diff --git a/lib/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php b/lib/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php index 568211008..c438c9905 100644 --- a/lib/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php +++ b/lib/symfony/dependency-injection/Compiler/AutowireRequiredPropertiesPass.php @@ -11,6 +11,9 @@ namespace Symfony\Component\DependencyInjection\Compiler; +use Symfony\Component\DependencyInjection\Attribute\Autowire; +use Symfony\Component\DependencyInjection\Attribute\AutowireDecorated; +use Symfony\Component\DependencyInjection\Attribute\Target; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\TypedReference; @@ -56,7 +59,11 @@ class AutowireRequiredPropertiesPass extends AbstractRecursivePass } $type = $type->getName(); - $value->setProperty($name, new TypedReference($type, $type, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, $name)); + $value->setProperty($name, new TypedReference($type, $type, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, $name, array_map(static fn ($a) => $a->newInstance(), array_merge( + $reflectionProperty->getAttributes(Autowire::class, \ReflectionAttribute::IS_INSTANCEOF), + $reflectionProperty->getAttributes(AutowireDecorated::class), + $reflectionProperty->getAttributes(Target::class), + )))); } return $value; diff --git a/lib/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php b/lib/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php index 36964dd0e..b35d8588a 100644 --- a/lib/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php +++ b/lib/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php @@ -65,6 +65,17 @@ trait PriorityTaggedServiceTrait $class = $container->getParameterBag()->resolveValue($class) ?: null; $checkTaggedItem = !$definition->hasTag($definition->isAutoconfigured() ? 'container.ignore_attributes' : $tagName); + // For decorated services, walk the decoration chain to find #[AsTaggedItem] on the original service + $innerClass = null; + $innerDef = $definition; + while ($innerId = $innerDef->getTag('container.decorator')[0]['inner'] ?? null) { + if (!$container->has($innerId)) { + break; + } + $innerDef = $container->findDefinition($innerId); + $innerClass = $container->getParameterBag()->resolveValue($innerDef->getClass()) ?: null; + } + foreach ($attributes as $attribute) { $index = $priority = null; @@ -72,6 +83,9 @@ trait PriorityTaggedServiceTrait $priority = $attribute['priority']; } elseif (null === $defaultPriority && $defaultPriorityMethod && $class) { $defaultPriority = PriorityTaggedServiceUtil::getDefault($container, $serviceId, $class, $defaultPriorityMethod, $tagName, 'priority', $checkTaggedItem); + if (null === $defaultPriority && $innerClass) { + $defaultPriority = PriorityTaggedServiceUtil::getDefault($container, $serviceId, $innerClass, $defaultPriorityMethod, $tagName, 'priority', true); + } } $priority ??= $defaultPriority ??= 0; @@ -84,6 +98,9 @@ trait PriorityTaggedServiceTrait $index = $attribute[$indexAttribute]; } elseif (null === $defaultIndex && $defaultPriorityMethod && $class) { $defaultIndex = PriorityTaggedServiceUtil::getDefault($container, $serviceId, $class, $defaultIndexMethod ?? 'getDefaultName', $tagName, $indexAttribute, $checkTaggedItem); + if (null === $defaultIndex && $innerClass) { + $defaultIndex = PriorityTaggedServiceUtil::getDefault($container, $serviceId, $innerClass, $defaultIndexMethod ?? 'getDefaultName', $tagName, $indexAttribute, true); + } } $decorated = $definition->getTag('container.decorator')[0]['id'] ?? null; $index = $index ?? $defaultIndex ?? $defaultIndex = $decorated ?? $serviceId; diff --git a/lib/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php b/lib/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php index dbe87aad1..af5324a49 100644 --- a/lib/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php +++ b/lib/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php @@ -27,6 +27,7 @@ class RemoveAbstractDefinitionsPass implements CompilerPassInterface { foreach ($container->getDefinitions() as $id => $definition) { if ($definition->isAbstract()) { + $container->resolveEnvPlaceholders($definition); $container->removeDefinition($id); $container->log($this, \sprintf('Removed service "%s"; reason: abstract.', $id)); } diff --git a/lib/symfony/dependency-injection/Compiler/ResolveBindingsPass.php b/lib/symfony/dependency-injection/Compiler/ResolveBindingsPass.php index 9fa617822..450081168 100644 --- a/lib/symfony/dependency-injection/Compiler/ResolveBindingsPass.php +++ b/lib/symfony/dependency-injection/Compiler/ResolveBindingsPass.php @@ -222,7 +222,7 @@ class ResolveBindingsPass extends AbstractRecursivePass continue; } - if (isset($bindingNames[$name]) || isset($bindingNames[$parsedName]) || isset($bindingNames[$parameter->name])) { + if (null !== $binding = $bindingNames[$name] ?? $bindingNames[$parsedName] ?? $bindingNames[$parameter->name] ?? null) { $bindingKey = array_search($binding, $bindings, true); $argumentType = substr($bindingKey, 0, strpos($bindingKey, ' ')); $this->errorMessages[] = \sprintf('Did you forget to add the type "%s" to argument "$%s" of method "%s::%s()"?', $argumentType, $parameter->name, $reflectionMethod->class, $reflectionMethod->name); diff --git a/lib/symfony/dependency-injection/Container.php b/lib/symfony/dependency-injection/Container.php index 57c6c1e6f..9f1b6300f 100644 --- a/lib/symfony/dependency-injection/Container.php +++ b/lib/symfony/dependency-injection/Container.php @@ -35,7 +35,7 @@ class_exists(ArgumentServiceLocator::class); * * It gives access to object instances (services). * Services and parameters are simple key/pair stores. - * The container can have four possible behaviors when a service + * The container can have five possible behaviors when a service * does not exist (or is not initialized for the last case): * * * EXCEPTION_ON_INVALID_REFERENCE: Throws an exception at compilation time (the default) diff --git a/lib/symfony/dependency-injection/Dumper/PhpDumper.php b/lib/symfony/dependency-injection/Dumper/PhpDumper.php index d55a5a100..1f9f4d31f 100644 --- a/lib/symfony/dependency-injection/Dumper/PhpDumper.php +++ b/lib/symfony/dependency-injection/Dumper/PhpDumper.php @@ -1033,7 +1033,7 @@ EOF; $name = $this->getNextVariableName(); $this->referenceVariables[$targetId] = new Variable($name); - $reference = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE >= $behavior ? new Reference($targetId, $behavior) : null; + $reference = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $behavior ? new Reference($targetId, $behavior) : null; $code .= \sprintf(" \$%s = %s;\n", $name, $this->getServiceCall($targetId, $reference)); if (!$hasSelfRef || !$forConstructor) { diff --git a/lib/symfony/error-handler/Resources/bin/extract-tentative-return-types.php b/lib/symfony/error-handler/Resources/bin/extract-tentative-return-types.php old mode 100755 new mode 100644 diff --git a/lib/symfony/filesystem/Filesystem.php b/lib/symfony/filesystem/Filesystem.php index 71628ceed..cc1a0a18e 100644 --- a/lib/symfony/filesystem/Filesystem.php +++ b/lib/symfony/filesystem/Filesystem.php @@ -463,6 +463,8 @@ class Filesystem throw new InvalidArgumentException(\sprintf('The end path "%s" is not absolute.', $endPath)); } + $originalEndPath = $endPath; + // Normalize separators on Windows if ('\\' === \DIRECTORY_SEPARATOR) { $endPath = str_replace('\\', '/', $endPath); @@ -519,6 +521,11 @@ class Filesystem // Construct $endPath from traversing to the common path, then to the remaining $endPath $relativePath = $traverser.('' !== $endPathRemainder ? $endPathRemainder.'/' : ''); + // Remove ending "/" if $endPath points to an existing file + if (str_ends_with($relativePath, '/') && is_file($originalEndPath)) { + $relativePath = substr($relativePath, 0, -1); + } + return '' === $relativePath ? './' : $relativePath; } diff --git a/lib/symfony/finder/Iterator/SortableIterator.php b/lib/symfony/finder/Iterator/SortableIterator.php index 177cd0b60..1cfcea0a8 100644 --- a/lib/symfony/finder/Iterator/SortableIterator.php +++ b/lib/symfony/finder/Iterator/SortableIterator.php @@ -87,17 +87,29 @@ class SortableIterator implements \IteratorAggregate public function getIterator(): \Traversable { if (1 === $this->sort) { - return $this->iterator; + yield from $this->iterator; + + return; } - $array = iterator_to_array($this->iterator, true); + $keys = $values = []; + foreach ($this->iterator as $key => $value) { + $keys[] = $key; + $values[] = $value; + } if (-1 === $this->sort) { - $array = array_reverse($array); - } else { - uasort($array, $this->sort); + for ($i = \count($values) - 1; $i >= 0; --$i) { + yield $keys[$i] => $values[$i]; + } + + return; } - return new \ArrayIterator($array); + uasort($values, $this->sort); + + foreach ($values as $i => $v) { + yield $keys[$i] => $v; + } } } diff --git a/lib/symfony/form/DependencyInjection/FormPass.php b/lib/symfony/form/DependencyInjection/FormPass.php index 4b9a53353..1364566f9 100644 --- a/lib/symfony/form/DependencyInjection/FormPass.php +++ b/lib/symfony/form/DependencyInjection/FormPass.php @@ -86,6 +86,7 @@ class FormPass implements CompilerPassInterface $extendsTypes = false; $typeExtensionsClasses[] = $typeExtensionClass; + $container->getReflectionClass($typeExtensionClass); foreach ($typeExtensionClass::getExtendedTypes() as $extendedType) { $typeExtensions[$extendedType][] = new Reference($serviceId); $extendsTypes = true; diff --git a/lib/symfony/form/Util/FormUtil.php b/lib/symfony/form/Util/FormUtil.php index 1a5cd3b15..52576c397 100644 --- a/lib/symfony/form/Util/FormUtil.php +++ b/lib/symfony/form/Util/FormUtil.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Form\Util; +use Symfony\Component\HttpFoundation\File\UploadedFile; + /** * @author Bernhard Schussek */ @@ -39,30 +41,84 @@ class FormUtil } /** - * Recursively replaces or appends elements of the first array with elements - * of second array. If the key is an integer, the values will be appended to - * the new array; otherwise, the value from the second array will replace - * the one from the first array. + * Merges query string or post parameters with uploaded files. */ public static function mergeParamsAndFiles(array $params, array $files): array { - $isFilesList = array_is_list($files); + return self::merge($params, $files); + } - foreach ($params as $key => $value) { - if (\is_array($value) && \is_array($files[$key] ?? null)) { - $params[$key] = self::mergeParamsAndFiles($value, $files[$key]); - unset($files[$key]); + private static function merge(mixed $params, mixed $files): mixed + { + if (null === $params) { + return $files; + } + + if (\is_array($params) && self::isFileUpload($files)) { + return $files; // if the array is a file upload field, it has the precedence + } + + if (\is_array($params) && \is_array($files)) { + // if both are lists and both do not contain arrays, then merge them and return + if (array_is_list($params) && self::doesNotContainNonFileUploadArray($params) && array_is_list($files) && self::doesNotContainNonFileUploadArray($files)) { + return array_merge($params, $files); } + + // heuristics to preserve order, the bigger array wins + if (\count($files) > \count($params)) { + $keys = array_unique(array_merge(array_keys($files), array_keys($params))); + } else { + $keys = array_unique(array_merge(array_keys($params), array_keys($files))); + } + + $result = []; + + foreach ($keys as $key) { + $result[$key] = self::merge($params[$key] ?? null, $files[$key] ?? null); + } + + return $result; } - if (!$isFilesList) { - return array_replace($params, $files); + if (\is_array($params)) { + return $params; // params has the precedence } - foreach ($files as $value) { - $params[] = $value; + if (self::isFileUpload($files)) { + return $files; // if the array is a file upload field, it has the precedence } return $params; } + + private static function isFileUpload(mixed $value): bool + { + if ($value instanceof UploadedFile) { + return true; + } + + if (!\is_array($value) || !\in_array(\count($value), [5, 6], true)) { + return false; + } + + if (\array_key_exists('full_path', $value)) { + unset($value['full_path']); + } + + $keys = array_keys($value); + sort($keys); + + return ['error', 'name', 'size', 'tmp_name', 'type'] === $keys; + } + + private static function doesNotContainNonFileUploadArray(array $array): bool + { + foreach ($array as $value) { + if (\is_array($value) && !self::isFileUpload($value)) { + return false; + } + } + + return true; + } } diff --git a/lib/symfony/framework-bundle/Command/ConfigDebugCommand.php b/lib/symfony/framework-bundle/Command/ConfigDebugCommand.php index fcef7c1d6..f0bcb1786 100644 --- a/lib/symfony/framework-bundle/Command/ConfigDebugCommand.php +++ b/lib/symfony/framework-bundle/Command/ConfigDebugCommand.php @@ -11,6 +11,7 @@ namespace Symfony\Bundle\FrameworkBundle\Command; +use Psr\Container\ContainerInterface; use Symfony\Component\Config\Definition\ConfigurationInterface; use Symfony\Component\Config\Definition\Processor; use Symfony\Component\Console\Attribute\AsCommand; @@ -39,9 +40,15 @@ use Symfony\Component\Yaml\Yaml; #[AsCommand(name: 'debug:config', description: 'Dump the current configuration for an extension')] class ConfigDebugCommand extends AbstractConfigCommand { + public function __construct( + private ?ContainerInterface $envVarProcessors = null, + ) { + parent::__construct(); + } + protected function configure(): void { - $commentedHelpFormats = array_map(fn ($format) => \sprintf('%s', $format), $this->getAvailableFormatOptions()); + $commentedHelpFormats = array_map(static fn ($format) => \sprintf('%s', $format), $this->getAvailableFormatOptions()); $helpFormats = implode('", "', $commentedHelpFormats); $this @@ -146,6 +153,9 @@ EOF $method = new \ReflectionMethod($kernel, 'buildContainer'); $container = $method->invoke($kernel); + if ($this->envVarProcessors) { + $container->set('container.env_var_processors_locator', $this->envVarProcessors); + } $container->getCompiler()->compile($container); return $container; diff --git a/lib/symfony/framework-bundle/DependencyInjection/Configuration.php b/lib/symfony/framework-bundle/DependencyInjection/Configuration.php index 7fe754e3d..3d3523d47 100644 --- a/lib/symfony/framework-bundle/DependencyInjection/Configuration.php +++ b/lib/symfony/framework-bundle/DependencyInjection/Configuration.php @@ -494,6 +494,7 @@ class Configuration implements ConfigurationInterface ->cannotBeEmpty() ->end() ->arrayNode('metadata') + ->useAttributeAsKey('key') ->normalizeKeys(false) ->defaultValue([]) ->example(['color' => 'blue', 'description' => 'Workflow to manage article.']) @@ -563,6 +564,7 @@ class Configuration implements ConfigurationInterface ->end() ->end() ->arrayNode('metadata') + ->useAttributeAsKey('key') ->normalizeKeys(false) ->defaultValue([]) ->example(['color' => 'blue', 'description' => 'Workflow to manage article.']) @@ -573,6 +575,7 @@ class Configuration implements ConfigurationInterface ->end() ->end() ->arrayNode('metadata') + ->useAttributeAsKey('key') ->normalizeKeys(false) ->defaultValue([]) ->example(['color' => 'blue', 'description' => 'Workflow to manage article.']) @@ -1186,6 +1189,7 @@ class Configuration implements ConfigurationInterface ->end() ->end() ->arrayNode('default_context') + ->useAttributeAsKey('key') ->normalizeKeys(false) ->validate() ->ifTrue(fn () => $this->debug && class_exists(JsonParser::class)) @@ -1667,6 +1671,7 @@ class Configuration implements ConfigurationInterface ->scalarNode('dsn')->end() ->scalarNode('serializer')->defaultNull()->info('Service id of a custom serializer to use.')->end() ->arrayNode('options') + ->useAttributeAsKey('key') ->normalizeKeys(false) ->defaultValue([]) ->prototype('variable') diff --git a/lib/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php b/lib/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php index a8ef96b65..20810098a 100644 --- a/lib/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php +++ b/lib/symfony/framework-bundle/DependencyInjection/FrameworkExtension.php @@ -2101,6 +2101,10 @@ class FrameworkExtension extends Extension private function registerSemaphoreConfiguration(array $config, ContainerBuilder $container, PhpFileLoader $loader): void { + if (!class_exists(Semaphore::class)) { + throw new LogicException('Semaphore support cannot be enabled as the Semaphore component is not installed. Try running "composer require symfony/semaphore".'); + } + $loader->load('semaphore.php'); foreach ($config['resources'] as $resourceName => $resourceStore) { @@ -2395,7 +2399,8 @@ class FrameworkExtension extends Extension $failureTransportsByTransportNameServiceLocator = ServiceLocatorTagPass::register($container, $failureTransportReferencesByTransportName); $container->getDefinition('messenger.failure.send_failed_message_to_failure_transport_listener') - ->replaceArgument(0, $failureTransportsByTransportNameServiceLocator); + ->replaceArgument(0, $failureTransportsByTransportNameServiceLocator) + ->replaceArgument(2, $failureTransportsByName); } else { $container->removeDefinition('messenger.failure.send_failed_message_to_failure_transport_listener'); $container->removeDefinition('console.command.messenger_failed_messages_retry'); diff --git a/lib/symfony/framework-bundle/Resources/config/console.php b/lib/symfony/framework-bundle/Resources/config/console.php index 334d20426..0ca643842 100644 --- a/lib/symfony/framework-bundle/Resources/config/console.php +++ b/lib/symfony/framework-bundle/Resources/config/console.php @@ -124,6 +124,9 @@ return static function (ContainerConfigurator $container) { ->tag('console.command') ->set('console.command.config_debug', ConfigDebugCommand::class) + ->args([ + service('container.env_var_processors_locator'), + ]) ->tag('console.command') ->set('console.command.config_dump_reference', ConfigDumpReferenceCommand::class) diff --git a/lib/symfony/framework-bundle/Resources/config/messenger.php b/lib/symfony/framework-bundle/Resources/config/messenger.php index 5e4726265..fe647f2eb 100644 --- a/lib/symfony/framework-bundle/Resources/config/messenger.php +++ b/lib/symfony/framework-bundle/Resources/config/messenger.php @@ -186,6 +186,7 @@ return static function (ContainerConfigurator $container) { ->args([ abstract_arg('failure transports'), service('logger')->ignoreOnInvalid(), + abstract_arg('failure transports by name'), ]) ->tag('kernel.event_subscriber') ->tag('monolog.logger', ['channel' => 'messenger']) diff --git a/lib/symfony/framework-bundle/Resources/config/schema/symfony-1.0.xsd b/lib/symfony/framework-bundle/Resources/config/schema/symfony-1.0.xsd index 4a650af6b..586bb5e3c 100644 --- a/lib/symfony/framework-bundle/Resources/config/schema/symfony-1.0.xsd +++ b/lib/symfony/framework-bundle/Resources/config/schema/symfony-1.0.xsd @@ -486,6 +486,7 @@ + diff --git a/lib/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php b/lib/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php index b09045b4f..f2e3e3c14 100644 --- a/lib/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php +++ b/lib/symfony/framework-bundle/Test/BrowserKitAssertionsTrait.php @@ -16,6 +16,8 @@ use PHPUnit\Framework\Constraint\LogicalAnd; use PHPUnit\Framework\Constraint\LogicalNot; use PHPUnit\Framework\ExpectationFailedException; use Symfony\Component\BrowserKit\AbstractBrowser; +use Symfony\Component\BrowserKit\Request as BrowserKitRequest; +use Symfony\Component\BrowserKit\Response as BrowserKitResponse; use Symfony\Component\BrowserKit\Test\Constraint as BrowserKitConstraint; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -183,6 +185,14 @@ trait BrowserKitAssertionsTrait static::fail('A client must have an HTTP Response to make assertions. Did you forget to make an HTTP request?'); } + if ($response instanceof BrowserKitResponse) { + return new Response( + $response->getContent(), + $response->getStatusCode(), + $response->getHeaders() + ); + } + return $response; } @@ -192,6 +202,18 @@ trait BrowserKitAssertionsTrait static::fail('A client must have an HTTP Request to make assertions. Did you forget to make an HTTP request?'); } + if ($request instanceof BrowserKitRequest) { + return Request::create( + $request->getUri(), + $request->getMethod(), + $request->getParameters(), + $request->getCookies(), + $request->getFiles(), + $request->getServer(), + $request->getContent() + ); + } + return $request; } } diff --git a/lib/symfony/framework-bundle/Test/KernelTestCase.php b/lib/symfony/framework-bundle/Test/KernelTestCase.php index 5c337b730..5a6384b5e 100644 --- a/lib/symfony/framework-bundle/Test/KernelTestCase.php +++ b/lib/symfony/framework-bundle/Test/KernelTestCase.php @@ -86,7 +86,7 @@ abstract class KernelTestCase extends TestCase // If the cache warmer is registered, it means that the cache has been // warmed up, so the current container is not fresh anymore. Let's // reboot a fresh one. - if (self::getContainer()->initialized('cache_warmer')) { + if ($kernel->getContainer()->initialized('cache_warmer')) { static::ensureKernelShutdown(); $kernel = static::createKernel($options); diff --git a/lib/symfony/http-foundation/BinaryFileResponse.php b/lib/symfony/http-foundation/BinaryFileResponse.php index 9cd86879b..d98dcb9f0 100644 --- a/lib/symfony/http-foundation/BinaryFileResponse.php +++ b/lib/symfony/http-foundation/BinaryFileResponse.php @@ -260,7 +260,7 @@ class BinaryFileResponse extends Response if ($start < 0 || $start > $end) { $this->setStatusCode(416); $this->headers->set('Content-Range', \sprintf('bytes */%s', $fileSize)); - } elseif ($end - $start < $fileSize - 1) { + } else { $this->maxlen = $end < $fileSize ? $end - $start + 1 : -1; $this->offset = $start; diff --git a/lib/symfony/http-foundation/File/UploadedFile.php b/lib/symfony/http-foundation/File/UploadedFile.php index 85aab2872..dcbf19458 100644 --- a/lib/symfony/http-foundation/File/UploadedFile.php +++ b/lib/symfony/http-foundation/File/UploadedFile.php @@ -184,22 +184,30 @@ class UploadedFile extends File switch ($this->error) { case \UPLOAD_ERR_INI_SIZE: - throw new IniSizeFileException($this->getErrorMessage()); + throw new IniSizeFileException($this->getExceptionMessage()); case \UPLOAD_ERR_FORM_SIZE: - throw new FormSizeFileException($this->getErrorMessage()); + throw new FormSizeFileException($this->getExceptionMessage()); case \UPLOAD_ERR_PARTIAL: - throw new PartialFileException($this->getErrorMessage()); + throw new PartialFileException($this->getExceptionMessage()); case \UPLOAD_ERR_NO_FILE: - throw new NoFileException($this->getErrorMessage()); + throw new NoFileException($this->getExceptionMessage()); case \UPLOAD_ERR_CANT_WRITE: - throw new CannotWriteFileException($this->getErrorMessage()); + throw new CannotWriteFileException($this->getExceptionMessage()); case \UPLOAD_ERR_NO_TMP_DIR: - throw new NoTmpDirFileException($this->getErrorMessage()); + throw new NoTmpDirFileException($this->getExceptionMessage()); case \UPLOAD_ERR_EXTENSION: - throw new ExtensionFileException($this->getErrorMessage()); + throw new ExtensionFileException($this->getExceptionMessage()); } - throw new FileException($this->getErrorMessage()); + throw new FileException($this->getExceptionMessage()); + } + + /** + * Retrieves a user-friendly error message for file upload issues, if any. + */ + public function getErrorMessage(): string + { + return \UPLOAD_ERR_OK !== $this->error ? $this->getExceptionMessage() : ''; } /** @@ -248,7 +256,7 @@ class UploadedFile extends File /** * Returns an informative upload error message. */ - public function getErrorMessage(): string + private function getExceptionMessage(): string { static $errors = [ \UPLOAD_ERR_INI_SIZE => 'The file "%s" exceeds your upload_max_filesize ini directive (limit is %d KiB).', diff --git a/lib/symfony/http-foundation/Request.php b/lib/symfony/http-foundation/Request.php index 8a497a77c..0bc7edb2e 100644 --- a/lib/symfony/http-foundation/Request.php +++ b/lib/symfony/http-foundation/Request.php @@ -404,8 +404,16 @@ class Request $server['PHP_AUTH_PW'] = $components['pass']; } - if (!isset($components['path'])) { + if ('' === $path = $components['path'] ?? '') { $components['path'] = '/'; + } elseif (!isset($components['scheme']) && !isset($components['host']) && '/' !== $path[0]) { + if (false !== $pos = strpos($path, '/')) { + $path = substr($path, 0, $pos); + } + + if (str_contains($path, ':')) { + throw new BadRequestException('Invalid URI: Path is malformed.'); + } } switch (strtoupper($method)) { diff --git a/lib/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php b/lib/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php index fd8562377..ccdabbfa7 100644 --- a/lib/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php +++ b/lib/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php @@ -72,6 +72,16 @@ abstract class AbstractSessionHandler implements \SessionHandlerInterface, \Sess return $data; } + public function updateTimestamp(#[\SensitiveParameter] string $sessionId, string $data): bool + { + $this->igbinaryEmptyData ??= \function_exists('igbinary_serialize') ? igbinary_serialize([]) : ''; + if ('' === $data || $this->igbinaryEmptyData === $data) { + return $this->destroy($sessionId); + } + + return true; + } + public function write(#[\SensitiveParameter] string $sessionId, string $data): bool { // see https://github.com/igbinary/igbinary/issues/146 diff --git a/lib/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php b/lib/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php index 8d757f03f..3498344aa 100644 --- a/lib/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php +++ b/lib/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php @@ -251,7 +251,7 @@ class PdoSessionHandler extends AbstractSessionHandler // - trailing space removal // - case-insensitivity // - language processing like é == e - 'mysql' => "CREATE TABLE $this->table ($this->idCol VARBINARY(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED NOT NULL, $this->timeCol INTEGER UNSIGNED NOT NULL), ENGINE = InnoDB", + 'mysql' => "CREATE TABLE $this->table ($this->idCol VARBINARY(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED NOT NULL, $this->timeCol INTEGER UNSIGNED NOT NULL) ENGINE = InnoDB", 'sqlite' => "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)", 'pgsql' => "CREATE TABLE $this->table ($this->idCol VARCHAR(128) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)", 'oci' => "CREATE TABLE $this->table ($this->idCol VARCHAR2(128) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER NOT NULL, $this->timeCol INTEGER NOT NULL)", diff --git a/lib/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php b/lib/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php index 0fb42944f..e3a092e7b 100644 --- a/lib/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php +++ b/lib/symfony/http-kernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php @@ -21,6 +21,7 @@ use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent; use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpKernel\KernelEvents; +use Symfony\Component\Serializer\Exception\InvalidArgumentException as SerializerInvalidArgumentException; use Symfony\Component\Serializer\Exception\NotEncodableValueException; use Symfony\Component\Serializer\Exception\PartialDenormalizationException; use Symfony\Component\Serializer\Exception\UnsupportedFormatException; @@ -119,6 +120,9 @@ class RequestPayloadValueResolver implements ValueResolverInterface, EventSubscr $violations->add(new ConstraintViolation($message, $template, $parameters, null, $error->getPath(), null)); } $payload = $e->getData(); + } catch (SerializerInvalidArgumentException $e) { + $violations->add(new ConstraintViolation($e->getMessage(), $e->getMessage(), [], null, '', null)); + $payload = null; } if (null !== $payload && !\count($violations)) { @@ -133,6 +137,8 @@ class RequestPayloadValueResolver implements ValueResolverInterface, EventSubscr $payload = $this->$payloadMapper($request, $type, $argument); } catch (PartialDenormalizationException $e) { throw new HttpException($validationFailedCode, implode("\n", array_map(static fn ($e) => $e->getMessage(), $e->getErrors())), $e); + } catch (SerializerInvalidArgumentException $e) { + throw new HttpException($validationFailedCode, $e->getMessage(), $e); } } diff --git a/lib/symfony/http-kernel/DataCollector/ExceptionDataCollector.php b/lib/symfony/http-kernel/DataCollector/ExceptionDataCollector.php index 80156bc8d..fe2a179ff 100644 --- a/lib/symfony/http-kernel/DataCollector/ExceptionDataCollector.php +++ b/lib/symfony/http-kernel/DataCollector/ExceptionDataCollector.php @@ -46,7 +46,7 @@ class ExceptionDataCollector extends DataCollector return $this->data['exception']->getMessage(); } - public function getCode(): int + public function getCode(): int|string { return $this->data['exception']->getCode(); } diff --git a/lib/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php b/lib/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php index e2f50dcba..5be3f650e 100644 --- a/lib/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php +++ b/lib/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php @@ -203,8 +203,10 @@ class RegisterControllerArgumentLocatorsPass implements CompilerPassInterface $args[$p->name] = new Reference($erroredId, ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE); } else { - $target = preg_replace('/(^|[(|&])\\\\/', '\1', $target); - $args[$p->name] = $type ? new TypedReference($target, $type, $invalidBehavior, Target::parseName($p)) : new Reference($target, $invalidBehavior); + $targetAttribute = null; + $name = Target::parseName($p, $targetAttribute); + $target = preg_replace('/(^|[(|&])\\\\/', '\\1', $target); + $args[$p->name] = $type ? new TypedReference($target, $type, $invalidBehavior, $name, $targetAttribute ? [$targetAttribute] : []) : new Reference($target, $invalidBehavior); } } // register the maps as a per-method service-locators diff --git a/lib/symfony/http-kernel/EventListener/LocaleListener.php b/lib/symfony/http-kernel/EventListener/LocaleListener.php index 9feaa0b4f..a3aa30f09 100644 --- a/lib/symfony/http-kernel/EventListener/LocaleListener.php +++ b/lib/symfony/http-kernel/EventListener/LocaleListener.php @@ -41,7 +41,7 @@ class LocaleListener implements EventSubscriberInterface $this->requestStack = $requestStack; $this->router = $router; $this->useAcceptLanguageHeader = $useAcceptLanguageHeader; - $this->enabledLocales = $enabledLocales; + $this->enabledLocales = $enabledLocales ? array_values(array_unique(array_merge([$defaultLocale], $enabledLocales))) : []; } public function setDefaultLocale(KernelEvent $event): void diff --git a/lib/symfony/http-kernel/Kernel.php b/lib/symfony/http-kernel/Kernel.php index a2bf0f827..cb148d4d2 100644 --- a/lib/symfony/http-kernel/Kernel.php +++ b/lib/symfony/http-kernel/Kernel.php @@ -77,11 +77,11 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl */ private static array $freshCache = []; - public const VERSION = '6.4.33'; - public const VERSION_ID = 60433; + public const VERSION = '6.4.34'; + public const VERSION_ID = 60434; public const MAJOR_VERSION = 6; public const MINOR_VERSION = 4; - public const RELEASE_VERSION = 33; + public const RELEASE_VERSION = 34; public const EXTRA_VERSION = ''; public const END_OF_MAINTENANCE = '11/2026'; diff --git a/lib/symfony/http-kernel/composer.json b/lib/symfony/http-kernel/composer.json index 1c70224aa..f1a5231cf 100644 --- a/lib/symfony/http-kernel/composer.json +++ b/lib/symfony/http-kernel/composer.json @@ -30,7 +30,7 @@ "symfony/config": "^6.1|^7.0", "symfony/console": "^5.4|^6.0|^7.0", "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4.1|^7.0.1", "symfony/dom-crawler": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/finder": "^5.4|^6.0|^7.0", diff --git a/lib/symfony/mailer/SentMessage.php b/lib/symfony/mailer/SentMessage.php index be8471180..ef9a63a03 100644 --- a/lib/symfony/mailer/SentMessage.php +++ b/lib/symfony/mailer/SentMessage.php @@ -25,9 +25,6 @@ class SentMessage private string $messageId; private string $debug = ''; - /** - * @internal - */ public function __construct(RawMessage $message, Envelope $envelope) { $message->ensureValidity(); @@ -63,11 +60,19 @@ class SentMessage return $this->envelope; } + /** + * Sets the transport-level message ID. + */ public function setMessageId(string $id): void { $this->messageId = $id; } + /** + * Gets the transport-level message ID. + * + * Not to be confused with the Message-ID header, which is available via getOriginalMessage() + */ public function getMessageId(): string { return $this->messageId; diff --git a/lib/symfony/mime/MimeTypes.php b/lib/symfony/mime/MimeTypes.php index fd9881b72..47534c1b7 100644 --- a/lib/symfony/mime/MimeTypes.php +++ b/lib/symfony/mime/MimeTypes.php @@ -135,7 +135,7 @@ final class MimeTypes implements MimeTypesInterface /** * A map of MIME types and their default extensions. * - * Updated from upstream on 2025-11-15. + * Updated from upstream on 2026-02-02. * * @see Resources/bin/update_mime_types.php */ @@ -636,6 +636,7 @@ final class MimeTypes implements MimeTypesInterface 'application/vnd.mynfc' => ['taglet'], 'application/vnd.nato.bindingdataobject+xml' => ['bdo'], 'application/vnd.neurolanguage.nlu' => ['nlu'], + 'application/vnd.nintendo.nitro.rom' => ['nds'], 'application/vnd.nintendo.snes.rom' => ['sfc', 'smc'], 'application/vnd.nitf' => ['ntf', 'nitf'], 'application/vnd.noblenet-directory' => ['nnd'], @@ -1159,7 +1160,7 @@ final class MimeTypes implements MimeTypesInterface 'application/x-sh' => ['sh'], 'application/x-shar' => ['shar'], 'application/x-shared-library-la' => ['la'], - 'application/x-sharedlib' => ['so'], + 'application/x-sharedlib' => ['so', 'so.[0-9]*'], 'application/x-shellscript' => ['sh'], 'application/x-shockwave-flash' => ['swf', 'spl'], 'application/x-shorten' => ['shn'], @@ -1216,7 +1217,7 @@ final class MimeTypes implements MimeTypesInterface 'application/x-trash' => ['bak', 'old', 'sik'], 'application/x-trig' => ['trig'], 'application/x-troff' => ['tr', 'roff', 't'], - 'application/x-troff-man' => ['man'], + 'application/x-troff-man' => ['man', '[1-9]'], 'application/x-tzo' => ['tar.lzo', 'tzo'], 'application/x-ufraw' => ['ufraw'], 'application/x-ustar' => ['ustar'], @@ -1293,7 +1294,7 @@ final class MimeTypes implements MimeTypesInterface 'application/xslt+xml' => ['xsl', 'xslt'], 'application/xspf+xml' => ['xspf'], 'application/xv+xml' => ['mxml', 'xhvml', 'xvml', 'xvm'], - 'application/yaml' => ['yaml', 'yml'], + 'application/yaml' => ['yml', 'yaml'], 'application/yang' => ['yang'], 'application/yin+xml' => ['yin'], 'application/zip' => ['zip', 'zipx'], @@ -1302,7 +1303,7 @@ final class MimeTypes implements MimeTypesInterface 'audio/3gpp' => ['3gpp', '3gp', '3ga'], 'audio/3gpp-encrypted' => ['3gp', '3gpp', '3ga'], 'audio/3gpp2' => ['3g2', '3gp2', '3gpp2'], - 'audio/aac' => ['aac', 'adts', 'ass'], + 'audio/aac' => ['adts', 'aac', 'ass'], 'audio/ac3' => ['ac3'], 'audio/adpcm' => ['adp'], 'audio/amr' => ['amr'], @@ -1318,6 +1319,7 @@ final class MimeTypes implements MimeTypesInterface 'audio/imelody' => ['imy', 'ime'], 'audio/m3u' => ['m3u', 'm3u8', 'vlc'], 'audio/m4a' => ['m4a', 'f4a'], + 'audio/matroska' => ['mka'], 'audio/midi' => ['mid', 'midi', 'kar', 'rmi'], 'audio/mobile-xmf' => ['mxmf'], 'audio/mp2' => ['mp2'], @@ -1355,6 +1357,8 @@ final class MimeTypes implements MimeTypesInterface 'audio/wave' => ['wav'], 'audio/webm' => ['weba'], 'audio/wma' => ['wma'], + 'audio/x-669' => ['669', 'uni'], + 'audio/x-669-mod' => ['669', 'uni'], 'audio/x-aac' => ['aac', 'adts', 'ass'], 'audio/x-aifc' => ['aifc', 'aiffc'], 'audio/x-aiff' => ['aif', 'aiff', 'aifc'], @@ -1381,10 +1385,11 @@ final class MimeTypes implements MimeTypesInterface 'audio/x-m4b' => ['m4b', 'f4b'], 'audio/x-m4r' => ['m4r'], 'audio/x-matroska' => ['mka'], + 'audio/x-med' => ['med'], 'audio/x-midi' => ['mid', 'midi', 'kar'], 'audio/x-minipsf' => ['minipsf'], 'audio/x-mo3' => ['mo3'], - 'audio/x-mod' => ['mod', 'ult', 'uni', 'm15', 'mtm', '669', 'med'], + 'audio/x-mod' => ['mod', 'm15', 'stk', 'nst', 'fst', '669', 'med'], 'audio/x-mp2' => ['mp2'], 'audio/x-mp3' => ['mp3', 'mpga'], 'audio/x-mp3-playlist' => ['m3u', 'm3u8', 'vlc'], @@ -1395,6 +1400,9 @@ final class MimeTypes implements MimeTypesInterface 'audio/x-ms-wax' => ['wax'], 'audio/x-ms-wma' => ['wma'], 'audio/x-ms-wmv' => ['wmv'], + 'audio/x-mtm' => ['mtm'], + 'audio/x-multimate-mod' => ['ult'], + 'audio/x-multitrack' => ['mtm'], 'audio/x-musepack' => ['mpc', 'mpp', 'mp+'], 'audio/x-ogg' => ['oga', 'ogg', 'opus'], 'audio/x-oggflac' => ['oga', 'ogg'], @@ -1417,6 +1425,7 @@ final class MimeTypes implements MimeTypesInterface 'audio/x-stm' => ['stm'], 'audio/x-tak' => ['tak'], 'audio/x-tta' => ['tta'], + 'audio/x-ult' => ['ult'], 'audio/x-voc' => ['voc'], 'audio/x-vorbis' => ['oga', 'ogg'], 'audio/x-vorbis+ogg' => ['oga', 'ogg'], @@ -1904,6 +1913,7 @@ final class MimeTypes implements MimeTypesInterface 'video/iso.segment' => ['m4s'], 'video/jpeg' => ['jpgv'], 'video/jpm' => ['jpm', 'jpgm'], + 'video/matroska' => ['mkv', 'mks', 'mk3d'], 'video/mj2' => ['mj2', 'mjp2'], 'video/mp2t' => ['ts', 'm2t', 'm2ts', 'mts', 'cpi', 'clpi', 'mpl', 'mpls', 'bdm', 'bdmv'], 'video/mp4' => ['mp4', 'mp4v', 'mpg4', 'm4v', 'f4v', 'lrv', 'lrf'], @@ -1933,7 +1943,7 @@ final class MimeTypes implements MimeTypesInterface 'video/vnd.vivo' => ['viv', 'vivo'], 'video/vnd.youtube.yt' => ['yt'], 'video/webm' => ['webm'], - 'video/x-anim' => ['anim1', 'anim2', 'anim3', 'anim4', 'anim5', 'anim6', 'anim7', 'anim8', 'anim9', 'animj'], + 'video/x-anim' => ['anim[1-9j]', 'anim2', 'anim3', 'anim4', 'anim5', 'anim6', 'anim7', 'anim8', 'anim9', 'animj'], 'video/x-annodex' => ['axv'], 'video/x-avi' => ['avi', 'avf', 'divx'], 'video/x-f4v' => ['f4v'], @@ -1995,7 +2005,7 @@ final class MimeTypes implements MimeTypesInterface '3gpp2' => ['audio/3gpp2', 'video/3gpp2'], '3mf' => ['application/vnd.ms-3mfdocument', 'model/3mf'], '602' => ['application/x-t602'], - '669' => ['audio/x-mod'], + '669' => ['audio/x-669', 'audio/x-669-mod', 'audio/x-mod'], '7z' => ['application/x-7z-compressed'], '7z.001' => ['application/x-7z-compressed'], 'C' => ['text/x-c++src'], @@ -2003,6 +2013,7 @@ final class MimeTypes implements MimeTypesInterface 'PAR2' => ['application/x-par2'], 'PL' => ['application/x-perl', 'text/x-perl'], 'Z' => ['application/x-compress'], + '[1-9]' => ['application/x-troff-man'], 'a' => ['application/x-archive'], 'a26' => ['application/x-atari-2600-rom'], 'a78' => ['application/x-atari-7800-rom'], @@ -2050,7 +2061,6 @@ final class MimeTypes implements MimeTypesInterface 'amr' => ['audio/amr', 'audio/amr-encrypted'], 'amz' => ['audio/x-amzxml'], 'ani' => ['application/x-navi-animation'], - 'anim1' => ['video/x-anim'], 'anim2' => ['video/x-anim'], 'anim3' => ['video/x-anim'], 'anim4' => ['video/x-anim'], @@ -2059,6 +2069,7 @@ final class MimeTypes implements MimeTypesInterface 'anim7' => ['video/x-anim'], 'anim8' => ['video/x-anim'], 'anim9' => ['video/x-anim'], + 'anim[1-9j]' => ['video/x-anim'], 'animj' => ['video/x-anim'], 'anx' => ['application/annodex', 'application/x-annodex'], 'ape' => ['audio/x-ape'], @@ -2457,7 +2468,7 @@ final class MimeTypes implements MimeTypesInterface 'fpx' => ['image/vnd.fpx', 'image/x-fpx'], 'frame' => ['application/vnd.framemaker'], 'fsc' => ['application/vnd.fsc.weblaunch'], - 'fst' => ['image/vnd.fst'], + 'fst' => ['audio/x-mod', 'image/vnd.fst'], 'ftc' => ['application/vnd.fluxtime.clip'], 'fti' => ['application/vnd.anser-web-funds-transfer-initiation'], 'fts' => ['application/fits', 'image/fits', 'image/x-fits'], @@ -2828,7 +2839,7 @@ final class MimeTypes implements MimeTypesInterface 'mdi' => ['image/vnd.ms-modi'], 'mdx' => ['application/x-genesis-32x-rom', 'text/mdx'], 'me' => ['text/troff', 'text/x-troff-me'], - 'med' => ['audio/x-mod'], + 'med' => ['audio/x-med', 'audio/x-mod'], 'mesh' => ['model/mesh'], 'meta4' => ['application/metalink4+xml'], 'metainfo.xml' => ['application/x-freedesktop-appstream-component'], @@ -2852,11 +2863,11 @@ final class MimeTypes implements MimeTypesInterface 'mjpg' => ['video/x-mjpeg'], 'mjs' => ['application/javascript', 'application/x-javascript', 'text/javascript', 'text/jscript'], 'mk' => ['text/x-makefile'], - 'mk3d' => ['video/x-matroska', 'video/x-matroska-3d'], - 'mka' => ['audio/x-matroska'], + 'mk3d' => ['video/matroska', 'video/x-matroska', 'video/x-matroska-3d'], + 'mka' => ['audio/matroska', 'audio/x-matroska'], 'mkd' => ['text/markdown', 'text/x-markdown'], - 'mks' => ['video/x-matroska'], - 'mkv' => ['video/x-matroska'], + 'mks' => ['video/matroska', 'video/x-matroska'], + 'mkv' => ['video/matroska', 'video/x-matroska'], 'ml' => ['text/x-ocaml'], 'mli' => ['text/x-ocaml'], 'mlp' => ['application/vnd.dolby.mlp'], @@ -2884,7 +2895,7 @@ final class MimeTypes implements MimeTypesInterface 'mp21' => ['application/mp21'], 'mp2a' => ['audio/mpeg'], 'mp3' => ['audio/mpeg', 'audio/mp3', 'audio/x-mp3', 'audio/x-mpeg', 'audio/x-mpg'], - 'mp4' => ['video/mp4', 'application/mp4', 'video/mp4v-es', 'video/x-m4v'], + 'mp4' => ['application/mp4', 'video/mp4', 'video/mp4v-es', 'video/x-m4v'], 'mp4a' => ['audio/mp4'], 'mp4s' => ['application/mp4'], 'mp4v' => ['video/mp4'], @@ -2894,7 +2905,7 @@ final class MimeTypes implements MimeTypesInterface 'mpeg' => ['video/mpeg', 'video/mpeg-system', 'video/x-mpeg', 'video/x-mpeg-system', 'video/x-mpeg2'], 'mpf' => ['application/media-policy-dataset+xml'], 'mpg' => ['video/mpeg', 'video/mpeg-system', 'video/x-mpeg', 'video/x-mpeg-system', 'video/x-mpeg2'], - 'mpg4' => ['video/mpg4', 'application/mp4', 'video/mp4'], + 'mpg4' => ['application/mp4', 'video/mp4', 'video/mpg4'], 'mpga' => ['audio/mp3', 'audio/mpeg', 'audio/x-mp3', 'audio/x-mpeg', 'audio/x-mpg'], 'mpkg' => ['application/vnd.apple.installer+xml'], 'mpl' => ['text/x-mpl2', 'video/mp2t'], @@ -2928,7 +2939,7 @@ final class MimeTypes implements MimeTypesInterface 'msu' => ['application/microsoftupdate'], 'msx' => ['application/x-msx-rom'], 'mtl' => ['model/mtl'], - 'mtm' => ['audio/x-mod'], + 'mtm' => ['audio/x-mtm', 'audio/x-multitrack'], 'mts' => ['application/typescript', 'model/vnd.mts', 'video/mp2t'], 'mup' => ['text/x-mup'], 'mus' => ['application/vnd.musician'], @@ -2950,7 +2961,7 @@ final class MimeTypes implements MimeTypesInterface 'nbp' => ['application/vnd.wolfram.player'], 'nc' => ['application/x-netcdf'], 'ncx' => ['application/x-dtbncx+xml'], - 'nds' => ['application/x-nintendo-ds-rom'], + 'nds' => ['application/vnd.nintendo.nitro.rom', 'application/x-nintendo-ds-rom'], 'nef' => ['image/x-nikon-nef'], 'nes' => ['application/x-nes-rom'], 'nez' => ['application/x-nes-rom'], @@ -2976,6 +2987,7 @@ final class MimeTypes implements MimeTypesInterface 'nsf' => ['application/vnd.lotus-notes'], 'nsh' => ['text/x-nsis'], 'nsi' => ['text/x-nsis'], + 'nst' => ['audio/x-mod'], 'nsv' => ['video/x-nsv'], 'nt' => ['application/n-triples'], 'ntar' => ['application/x-pcapng'], @@ -3389,6 +3401,7 @@ final class MimeTypes implements MimeTypesInterface 'snd' => ['audio/basic'], 'snf' => ['application/x-font-snf'], 'so' => ['application/x-sharedlib'], + 'so.[0-9]*' => ['application/x-sharedlib'], 'socket' => ['text/x-systemd-unit'], 'spc' => ['application/x-pkcs7-certificates'], 'spd' => ['application/x-font-speedo'], @@ -3427,7 +3440,7 @@ final class MimeTypes implements MimeTypesInterface 'step' => ['model/step'], 'stf' => ['application/vnd.wt.stf'], 'sti' => ['application/vnd.sun.xml.impress.template'], - 'stk' => ['application/hyperstudio'], + 'stk' => ['application/hyperstudio', 'audio/x-mod'], 'stl' => ['application/vnd.ms-pki.stl', 'model/stl', 'model/x.stl-ascii', 'model/x.stl-binary'], 'stm' => ['audio/x-stm'], 'stp' => ['model/step'], @@ -3570,11 +3583,11 @@ final class MimeTypes implements MimeTypesInterface 'ufraw' => ['application/x-ufraw'], 'ui' => ['application/x-designer', 'application/x-gtk-builder'], 'uil' => ['text/x-uil'], - 'ult' => ['audio/x-mod'], + 'ult' => ['audio/x-multimate-mod', 'audio/x-ult'], 'ulx' => ['application/x-glulx'], 'umj' => ['application/vnd.umajin'], 'unf' => ['application/x-nes-rom'], - 'uni' => ['audio/x-mod'], + 'uni' => ['audio/x-669', 'audio/x-669-mod'], 'unif' => ['application/x-nes-rom'], 'unityweb' => ['application/vnd.unity'], 'uo' => ['application/vnd.uoml+xml'], diff --git a/lib/symfony/mime/Resources/bin/update_mime_types.php b/lib/symfony/mime/Resources/bin/update_mime_types.php index 6811a7b25..db6b39fd0 100644 --- a/lib/symfony/mime/Resources/bin/update_mime_types.php +++ b/lib/symfony/mime/Resources/bin/update_mime_types.php @@ -88,6 +88,10 @@ $exts = [ 'md' => ['text/markdown', 'text/x-markdown'], 'mdb' => ['application/x-msaccess'], 'mid' => ['audio/midi'], + 'mk3d' => ['video/matroska'], + 'mka' => ['audio/matroska'], + 'mks' => ['video/matroska'], + 'mkv' => ['video/matroska'], 'mov' => ['video/quicktime'], 'mp3' => ['audio/mpeg'], 'ogg' => ['audio/ogg'], diff --git a/lib/symfony/property-info/Extractor/ReflectionExtractor.php b/lib/symfony/property-info/Extractor/ReflectionExtractor.php index e59a9ac40..933b2f687 100644 --- a/lib/symfony/property-info/Extractor/ReflectionExtractor.php +++ b/lib/symfony/property-info/Extractor/ReflectionExtractor.php @@ -138,7 +138,8 @@ class ReflectionExtractor implements PropertyListExtractorInterface, PropertyTyp return $fromMutator; } - if ($fromAccessor = $this->extractFromAccessor($class, $property)) { + $allowedPrefixes = array_diff($this->accessorPrefixes, ['is', 'can', 'has']); + if ($fromAccessor = $this->extractFromAccessor($class, $property, $allowedPrefixes)) { return $fromAccessor; } @@ -153,6 +154,11 @@ class ReflectionExtractor implements PropertyListExtractorInterface, PropertyTyp return $fromPropertyDeclaration; } + $allowedPrefixes = array_diff($this->accessorPrefixes, $allowedPrefixes); + if ($fromAccessor = $this->extractFromAccessor($class, $property, $allowedPrefixes)) { + return $fromAccessor; + } + return null; } @@ -460,13 +466,17 @@ class ReflectionExtractor implements PropertyListExtractorInterface, PropertyTyp * * @return Type[]|null */ - private function extractFromAccessor(string $class, string $property): ?array + private function extractFromAccessor(string $class, string $property, array $allowedPrefixes): ?array { [$reflectionMethod, $prefix] = $this->getAccessorMethod($class, $property); if (null === $reflectionMethod) { return null; } + if (!\in_array($prefix, $allowedPrefixes, true)) { + return null; + } + if ($reflectionType = $reflectionMethod->getReturnType()) { return $this->extractFromReflectionType($reflectionType, $reflectionMethod->getDeclaringClass()); } diff --git a/lib/symfony/property-info/Util/PhpDocTypeHelper.php b/lib/symfony/property-info/Util/PhpDocTypeHelper.php index a4d171ef0..d0b489a88 100644 --- a/lib/symfony/property-info/Util/PhpDocTypeHelper.php +++ b/lib/symfony/property-info/Util/PhpDocTypeHelper.php @@ -19,6 +19,7 @@ use phpDocumentor\Reflection\Types\Array_; use phpDocumentor\Reflection\Types\Collection; use phpDocumentor\Reflection\Types\Compound; use phpDocumentor\Reflection\Types\Integer; +use phpDocumentor\Reflection\Types\Mixed_; use phpDocumentor\Reflection\Types\Null_; use phpDocumentor\Reflection\Types\Nullable; use phpDocumentor\Reflection\Types\Scalar; @@ -83,6 +84,10 @@ final class PhpDocTypeHelper for ($typeIndex = 0; $varType->has($typeIndex); ++$typeIndex) { $type = $varType->get($typeIndex); + if ($type instanceof Mixed_) { + return []; + } + if ($type instanceof ConstExpression) { // It's safer to fall back to other extractors here, as resolving const types correctly is not easy at the moment return []; diff --git a/lib/symfony/routing/Loader/Psr4DirectoryLoader.php b/lib/symfony/routing/Loader/Psr4DirectoryLoader.php index bbf99418c..80cffe314 100644 --- a/lib/symfony/routing/Loader/Psr4DirectoryLoader.php +++ b/lib/symfony/routing/Loader/Psr4DirectoryLoader.php @@ -38,12 +38,13 @@ final class Psr4DirectoryLoader extends Loader implements DirectoryAwareLoaderIn */ public function load(mixed $resource, ?string $type = null): ?RouteCollection { + $excluded = $resource['_excluded'] ?? []; $path = $this->locator->locate($resource['path'], $this->currentDirectory); if (!is_dir($path)) { return new RouteCollection(); } - return $this->loadFromDirectory($path, trim($resource['namespace'], '\\')); + return $this->loadFromDirectory($path, trim($resource['namespace'], '\\'), $excluded); } public function supports(mixed $resource, ?string $type = null): bool @@ -59,7 +60,7 @@ final class Psr4DirectoryLoader extends Loader implements DirectoryAwareLoaderIn return $loader; } - private function loadFromDirectory(string $directory, string $psr4Prefix): RouteCollection + private function loadFromDirectory(string $directory, string $psr4Prefix, array $excluded = []): RouteCollection { $collection = new RouteCollection(); $collection->addResource(new DirectoryResource($directory, '/\.php$/')); @@ -74,8 +75,13 @@ final class Psr4DirectoryLoader extends Loader implements DirectoryAwareLoaderIn /** @var \SplFileInfo $file */ foreach ($files as $file) { + $normalizedPath = rtrim(str_replace('\\', '/', $file->getPathname()), '/'); + if (isset($excluded[$normalizedPath])) { + continue; + } + if ($file->isDir()) { - $collection->addCollection($this->loadFromDirectory($file->getPathname(), $psr4Prefix.'\\'.$file->getFilename())); + $collection->addCollection($this->loadFromDirectory($file->getPathname(), $psr4Prefix.'\\'.$file->getFilename(), $excluded)); continue; } diff --git a/lib/symfony/string/AbstractUnicodeString.php b/lib/symfony/string/AbstractUnicodeString.php index 6ea79938f..45a0d9abf 100644 --- a/lib/symfony/string/AbstractUnicodeString.php +++ b/lib/symfony/string/AbstractUnicodeString.php @@ -530,6 +530,8 @@ abstract class AbstractUnicodeString extends AbstractString private function wcswidth(string $string): int { $width = 0; + $lastChar = null; + $lastWidth = null; foreach (preg_split('//u', $string, -1, \PREG_SPLIT_NO_EMPTY) as $c) { $codePoint = mb_ord($c, 'UTF-8'); @@ -552,6 +554,20 @@ abstract class AbstractUnicodeString extends AbstractString return -1; } + if (0xFE0F === $codePoint) { + if (\PCRE_VERSION_MAJOR < 10 || \PCRE_VERSION_MAJOR === 10 && \PCRE_VERSION_MINOR < 40) { + $regex = '/\p{So}/u'; + } else { + $regex = '/\p{Emoji}/u'; + } + if (null !== $lastChar && 1 === $lastWidth && preg_match($regex, $lastChar)) { + ++$width; + $lastWidth = 2; + } + + continue; + } + self::$tableZero ??= require __DIR__.'/Resources/data/wcswidth_table_zero.php'; if ($codePoint >= self::$tableZero[0][0] && $codePoint <= self::$tableZero[$ubound = \count(self::$tableZero) - 1][1]) { @@ -582,6 +598,8 @@ abstract class AbstractUnicodeString extends AbstractString $ubound = $mid - 1; } else { $width += 2; + $lastChar = $c; + $lastWidth = 2; continue 2; } @@ -589,6 +607,8 @@ abstract class AbstractUnicodeString extends AbstractString } ++$width; + $lastChar = $c; + $lastWidth = 1; } return $width; diff --git a/lib/symfony/twig-bridge/Resources/views/Form/bootstrap_4_layout.html.twig b/lib/symfony/twig-bridge/Resources/views/Form/bootstrap_4_layout.html.twig index 458cc6847..a18accf88 100644 --- a/lib/symfony/twig-bridge/Resources/views/Form/bootstrap_4_layout.html.twig +++ b/lib/symfony/twig-bridge/Resources/views/Form/bootstrap_4_layout.html.twig @@ -235,7 +235,8 @@ {%- endif -%} <{{ element|default('label') }}{% if label_attr %}{% with { attr: label_attr } %}{{ block('attributes') }}{% endwith %}{% endif %}> {{- block('form_label_content') -}} - {% block form_label_errors %}{{- form_errors(form) -}}{% endblock form_label_errors %} + + {% block form_label_errors %}{{- form_errors(form) -}}{% endblock form_label_errors %} {%- else -%} {%- if errors|length > 0 -%}
@@ -271,8 +272,8 @@ {%- if label is not same as(false) -%} {{- block('form_label_content') -}} {%- endif -%} - {{- form_errors(form) -}} + {{- form_errors(form) -}} {%- endif -%} {%- endblock checkbox_radio_label %} @@ -297,7 +298,7 @@ {% block form_errors -%} {%- if errors|length > 0 -%} - + {%- for error in errors -%} {{ 'Error'|trans({}, 'validators') }} {{ error.message }} diff --git a/lib/symfony/validator/ConstraintValidator.php b/lib/symfony/validator/ConstraintValidator.php index 60808258c..0904c18a5 100644 --- a/lib/symfony/validator/ConstraintValidator.php +++ b/lib/symfony/validator/ConstraintValidator.php @@ -83,7 +83,7 @@ abstract class ConstraintValidator implements ConstraintValidatorInterface $formatter = new \IntlDateFormatter(\Locale::getDefault(), \IntlDateFormatter::MEDIUM, \IntlDateFormatter::SHORT, 'UTC'); return $formatter->format(new \DateTimeImmutable( - $value->format('Y-m-d H:i:s.u'), + ($value->format('y') > 0 ? '+' : '').$value->format('Y-m-d H:i:s.u'), new \DateTimeZone('UTC') )); } diff --git a/lib/symfony/validator/Constraints/UniqueValidator.php b/lib/symfony/validator/Constraints/UniqueValidator.php index 94d6a8965..96438b72f 100644 --- a/lib/symfony/validator/Constraints/UniqueValidator.php +++ b/lib/symfony/validator/Constraints/UniqueValidator.php @@ -45,7 +45,7 @@ class UniqueValidator extends ConstraintValidator foreach ($value as $element) { $element = $normalizer($element); - if ($fields && !$element = $this->reduceElementKeys($fields, $element)) { + if ($fields && !(\is_array($element) && $element = $this->reduceElementKeys($fields, $element))) { continue; } diff --git a/lib/symfony/validator/Resources/translations/validators.lv.xlf b/lib/symfony/validator/Resources/translations/validators.lv.xlf index 2d78bfd3e..7d654c43b 100644 --- a/lib/symfony/validator/Resources/translations/validators.lv.xlf +++ b/lib/symfony/validator/Resources/translations/validators.lv.xlf @@ -472,87 +472,87 @@ This file is not a valid video. - Šī datne nav derīgs video fails. + Šī datne nav derīgs video fails. The size of the video could not be detected. - Neizdevās noteikt video izmēru. + Neizdevās noteikt video izmēru. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - Video platums ir pārāk liels ({{ width }}px). Atļautais maksimālais platums ir {{ max_width }}px. + Video platums ir pārāk liels ({{ width }}px). Atļautais maksimālais platums ir {{ max_width }}px. The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - Video platums ir pārāk mazs ({{ width }}px). Sagaidāmais minimālais platums ir {{ min_width }}px. + Video platums ir pārāk mazs ({{ width }}px). Sagaidāmais minimālais platums ir {{ min_width }}px. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - Video augstums ir pārāk liels ({{ height }}px). Atļautais maksimālais augstums ir {{ max_height }}px. + Video augstums ir pārāk liels ({{ height }}px). Atļautais maksimālais augstums ir {{ max_height }}px. The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - Video augstums ir pārāk mazs ({{ height }}px). Sagaidāmais minimālais augstums ir {{ min_height }}px. + Video augstums ir pārāk mazs ({{ height }}px). Sagaidāmais minimālais augstums ir {{ min_height }}px. The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Video ir pārāk maz pikseļu ({{ pixels }}). Sagaidāmais minimālais daudzums ir {{ min_pixels }}. + Video ir pārāk maz pikseļu ({{ pixels }}). Sagaidāmais minimālais daudzums ir {{ min_pixels }}. The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Video ir pārāk daudz pikseļu ({{ pixels }}). Paredzētais maksimālais daudzums ir {{ max_pixels }}. + Video ir pārāk daudz pikseļu ({{ pixels }}). Paredzētais maksimālais daudzums ir {{ max_pixels }}. The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - Video attiecība ir pārāk liela ({{ ratio }}). Atļautā maksimālā attiecība ir {{ max_ratio }}. + Video attiecība ir pārāk liela ({{ ratio }}). Atļautā maksimālā attiecība ir {{ max_ratio }}. The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - Video attiecība ir pārāk maza ({{ ratio }}). Sagaidāmā minimālā attiecība ir {{ min_ratio }}. + Video attiecība ir pārāk maza ({{ ratio }}). Sagaidāmā minimālā attiecība ir {{ min_ratio }}. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - Video ir kvadrātveida ({{ width }}x{{ height }}px). Kvadrātveida video nav atļauti. + Video ir kvadrātveida ({{ width }}x{{ height }}px). Kvadrātveida video nav atļauti. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - Video ir ainavas orientācijā ({{ width }}x{{ height }} px). Ainavas formāta video nav atļauti. + Video ir ainavas orientācijā ({{ width }}x{{ height }} px). Ainavas formāta video nav atļauti. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - Video ir portreta orientācijā ({{ width }}x{{ height }}px). Portreta orientācijas video nav atļauti. + Video ir portreta orientācijā ({{ width }}x{{ height }}px). Portreta orientācijas video nav atļauti. The video file is corrupted. - Video fails ir bojāts. + Video fails ir bojāts. The video contains multiple streams. Only one stream is allowed. - Video satur vairākus straumējumus. Atļauta ir tikai viena straume. + Video satur vairākus straumējumus. Atļauta ir tikai viena straume. Unsupported video codec "{{ codec }}". - Neatbalstīts video kodeks “{{ codec }}”. + Neatbalstīts video kodeks "{{ codec }}". Unsupported video container "{{ container }}". - Neatbalstīts video konteiners "{{ container }}". + Neatbalstīts video konteiners "{{ container }}". The image file is corrupted. - Attēla fails ir bojāts. + Attēla fails ir bojāts. The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - Attēlam ir par maz pikseļu ({{ pixels }}). Sagaidāmais minimālais daudzums ir {{ min_pixels }}. + Attēlam ir par maz pikseļu ({{ pixels }}). Sagaidāmais minimālais daudzums ir {{ min_pixels }}. The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - Attēlam ir pārāk daudz pikseļu ({{ pixels }}). Sagaidāmais maksimālais daudzums ir {{ max_pixels }}. + Attēlam ir pārāk daudz pikseļu ({{ pixels }}). Sagaidāmais maksimālais daudzums ir {{ max_pixels }}. This filename does not match the expected charset. - Šis faila nosaukums neatbilst paredzētajam rakstzīmju kopumam. + Šis faila nosaukums neatbilst paredzētajam rakstzīmju kopumam. diff --git a/lib/symfony/validator/Resources/translations/validators.pt.xlf b/lib/symfony/validator/Resources/translations/validators.pt.xlf index 62c3c5fc2..536b5b7ba 100644 --- a/lib/symfony/validator/Resources/translations/validators.pt.xlf +++ b/lib/symfony/validator/Resources/translations/validators.pt.xlf @@ -472,87 +472,87 @@ This file is not a valid video. - Este ficheiro não é um vídeo válido. + Este ficheiro não é um vídeo válido. The size of the video could not be detected. - Não foi possível detetar o tamanho do vídeo. + Não foi possível detetar o tamanho do vídeo. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - A largura do vídeo é demasiado grande ({{ width }}px). A largura máxima permitida é {{ max_width }}px. + A largura do vídeo é demasiado grande ({{ width }}px). A largura máxima permitida é {{ max_width }}px. The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - A largura do vídeo é muito pequena ({{ width }}px). A largura mínima esperada é {{ min_width }}px. + A largura do vídeo é demasiado pequena ({{ width }}px). A largura mínima esperada é {{ min_width }}px. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - A altura do vídeo é demasiado grande ({{ height }}px). A altura máxima permitida é {{ max_height }}px. + A altura do vídeo é demasiado grande ({{ height }}px). A altura máxima permitida é {{ max_height }}px. The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - A altura do vídeo é muito pequena ({{ height }}px). A altura mínima esperada é {{ min_height }}px. + A altura do vídeo é demasiado pequena ({{ height }}px). A altura mínima esperada é {{ min_height }}px. The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - O vídeo tem poucos píxeis ({{ pixels }}). A quantidade mínima esperada é {{ min_pixels }}. + O vídeo tem poucos píxeis ({{ pixels }} píxeis). A quantidade mínima esperada é {{ min_pixels }} píxeis. The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - O vídeo tem píxeis a mais ({{ pixels }}). A quantidade máxima esperada é {{ max_pixels }}. + O vídeo tem demasiados píxeis ({{ pixels }} píxeis). A quantidade máxima esperada é {{ max_pixels }} píxeis. The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - A proporção do vídeo é muito grande ({{ ratio }}). A proporção máxima permitida é {{ max_ratio }}. + O rácio do vídeo é demasiado grande ({{ ratio }}). O rácio máximo permitido é {{ max_ratio }}. The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - A proporção do vídeo é muito pequena ({{ ratio }}). A proporção mínima esperada é {{ min_ratio }}. + O rácio do vídeo é demasiado pequeno ({{ ratio }}). O rácio mínimo esperado é {{ min_ratio }}. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - O vídeo é quadrado ({{ width }}x{{ height }}px). Vídeos quadrados não são permitidos. + O vídeo é quadrado ({{ width }}x{{ height }}px). Vídeos quadrados não são permitidos. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - O vídeo está em modo paisagem ({{ width }}x{{ height }} px). Vídeos em paisagem não são permitidos. + O vídeo está orientado na horizontal ({{ width }}x{{ height }}px). Vídeos orientados na horizontal não são permitidos. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - O vídeo está em orientação vertical ({{ width }}x{{ height }}px). Vídeos em orientação vertical não são permitidos. + O vídeo está orientado na vertical ({{ width }}x{{ height }}px). Vídeos orientados na vertical não são permitidos. The video file is corrupted. - O ficheiro de vídeo está corrompido. + O ficheiro de vídeo está corrompido. The video contains multiple streams. Only one stream is allowed. - O vídeo contém vários fluxos. É permitido apenas um fluxo. + O vídeo contém múltiplos fluxos. Apenas é permitido um fluxo. Unsupported video codec "{{ codec }}". - Codec de vídeo não suportado «{{ codec }}». + Codec de vídeo "{{ codec }}" não suportado. Unsupported video container "{{ container }}". - Contentor de vídeo não suportado "{{ container }}". + Contentor de vídeo "{{ container }}" não suportado. The image file is corrupted. - O ficheiro de imagem está corrompido. + O ficheiro de imagem está corrompido. The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - A imagem tem píxeis a menos ({{ pixels }}). A quantidade mínima esperada é {{ min_pixels }}. + A imagem tem poucos píxeis ({{ pixels }} píxeis). A quantidade mínima esperada é {{ min_pixels }} píxeis. The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - A imagem tem píxeis a mais ({{ pixels }}). A quantidade máxima esperada é {{ max_pixels }}. + A imagem tem demasiados píxeis ({{ pixels }} píxeis). A quantidade máxima esperada é {{ max_pixels }} píxeis. This filename does not match the expected charset. - Este nome de ficheiro não corresponde ao conjunto de caracteres esperado. + O nome do ficheiro não corresponde ao conjunto de caracteres esperado. diff --git a/lib/symfony/validator/Resources/translations/validators.pt_BR.xlf b/lib/symfony/validator/Resources/translations/validators.pt_BR.xlf index 0d3a30c6c..322e56307 100644 --- a/lib/symfony/validator/Resources/translations/validators.pt_BR.xlf +++ b/lib/symfony/validator/Resources/translations/validators.pt_BR.xlf @@ -472,87 +472,87 @@ This file is not a valid video. - Este arquivo não é um vídeo válido. + Este arquivo não é um vídeo válido. The size of the video could not be detected. - Não foi possível detectar o tamanho do vídeo. + Não foi possível detectar o tamanho do vídeo. The video width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px. - A largura do vídeo é muito grande ({{ width }}px). A largura máxima permitida é {{ max_width }}px. + A largura do vídeo é muito grande ({{ width }}px). A largura máxima permitida é {{ max_width }}px. The video width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px. - A largura do vídeo é muito pequena ({{ width }}px). A largura mínima esperada é {{ min_width }}px. + A largura do vídeo é muito pequena ({{ width }}px). A largura mínima esperada é {{ min_width }}px. The video height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px. - A altura do vídeo é muito grande ({{ height }}px). A altura máxima permitida é {{ max_height }}px. + A altura do vídeo é muito grande ({{ height }}px). A altura máxima permitida é {{ max_height }}px. The video height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px. - A altura do vídeo é muito pequena ({{ height }}px). A altura mínima esperada é {{ min_height }}px. + A altura do vídeo é muito pequena ({{ height }}px). A altura mínima esperada é {{ min_height }}px. The video has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - O vídeo tem poucos pixels ({{ pixels }}). A quantidade mínima esperada é {{ min_pixels }}. + O vídeo tem poucos pixels ({{ pixels }}). A quantidade mínima esperada é {{ min_pixels }}. The video has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - O vídeo tem pixels demais ({{ pixels }}). A quantidade máxima esperada é {{ max_pixels }}. + O vídeo tem pixels demais ({{ pixels }}). A quantidade máxima esperada é {{ max_pixels }}. The video ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}. - A proporção do vídeo é muito grande ({{ ratio }}). A proporção máxima permitida é {{ max_ratio }}. + A proporção do vídeo é muito grande ({{ ratio }}). A proporção máxima permitida é {{ max_ratio }}. The video ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}. - A proporção do vídeo é muito pequena ({{ ratio }}). A proporção mínima esperada é {{ min_ratio }}. + A proporção do vídeo é muito pequena ({{ ratio }}). A proporção mínima esperada é {{ min_ratio }}. The video is square ({{ width }}x{{ height }}px). Square videos are not allowed. - O vídeo é quadrado ({{ width }}x{{ height }}px). Vídeos quadrados não são permitidos. + O vídeo é quadrado ({{ width }}x{{ height }}px). Vídeos quadrados não são permitidos. The video is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented videos are not allowed. - O vídeo está no modo paisagem ({{ width }}x{{ height }} px). Vídeos em paisagem não são permitidos. + O vídeo está no modo paisagem ({{ width }}x{{ height }}px). Vídeos em paisagem não são permitidos. The video is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented videos are not allowed. - O vídeo está em orientação vertical ({{ width }}x{{ height }}px). Vídeos em orientação vertical não são permitidos. + O vídeo está em orientação vertical ({{ width }}x{{ height }}px). Vídeos em orientação vertical não são permitidos. The video file is corrupted. - O arquivo de vídeo está corrompido. + O arquivo de vídeo está corrompido. The video contains multiple streams. Only one stream is allowed. - O vídeo contém múltiplos fluxos. Apenas um fluxo é permitido. + O vídeo contém múltiplos fluxos. Apenas um fluxo é permitido. Unsupported video codec "{{ codec }}". - Codec de vídeo não suportado «{{ codec }}». + Codec de vídeo não suportado "{{ codec }}". Unsupported video container "{{ container }}". - Contêiner de vídeo não suportado "{{ container }}". + Contêiner de vídeo não suportado "{{ container }}". The image file is corrupted. - O arquivo de imagem está corrompido. + O arquivo de imagem está corrompido. The image has too few pixels ({{ pixels }} pixels). Minimum amount expected is {{ min_pixels }} pixels. - A imagem tem pixels de menos ({{ pixels }}). A quantidade mínima esperada é {{ min_pixels }}. + A imagem tem pixels de menos ({{ pixels }}). A quantidade mínima esperada é {{ min_pixels }}. The image has too many pixels ({{ pixels }} pixels). Maximum amount expected is {{ max_pixels }} pixels. - A imagem tem pixels demais ({{ pixels }}). A quantidade máxima esperada é {{ max_pixels }}. + A imagem tem pixels demais ({{ pixels }}). A quantidade máxima esperada é {{ max_pixels }}. This filename does not match the expected charset. - Este nome de arquivo não corresponde ao conjunto de caracteres esperado. + Este nome de arquivo não corresponde ao conjunto de caracteres esperado. diff --git a/lib/symfony/validator/Resources/translations/validators.ro.xlf b/lib/symfony/validator/Resources/translations/validators.ro.xlf index e4e27570a..385c264b7 100644 --- a/lib/symfony/validator/Resources/translations/validators.ro.xlf +++ b/lib/symfony/validator/Resources/translations/validators.ro.xlf @@ -24,11 +24,11 @@ You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices. - Trebuie să selectați cel puțin {{ limit }} opțiune.|Trebuie să selectați cel puțin {{ limit }} opțiuni. + Trebuie să selectați cel puțin {{ limit }} opțiune.|Trebuie să selectați cel puțin {{ limit }} opțiuni.|Trebuie să selectați cel puțin {{ limit }} de opțiuni. You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices. - Trebuie să selectați cel mult {{ limit }} opțiune.|Trebuie să selectați cel mult {{ limit }} opțiuni. + Trebuie să selectați cel mult {{ limit }} opțiune.|Trebuie să selectați cel mult {{ limit }} opțiuni.|Trebuie să selectați cel mult {{ limit }} de opțiuni. One or more of the given values is invalid. @@ -76,7 +76,7 @@ This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less. - Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caracter.|Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caractere. + Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caracter.|Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} caractere.|Această valoare este prea lungă. Ar trebui să aibă maxim {{ limit }} de caractere. This value should be {{ limit }} or more. @@ -84,7 +84,7 @@ This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more. - Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caracter.|Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caractere. + Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caracter.|Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} caractere.|Această valoare este prea scurtă. Ar trebui să aibă minim {{ limit }} de caractere. This value should not be blank. @@ -136,7 +136,7 @@ This value is not a valid IP address. - Această valoare nu este o adresă de IP validă. + Această valoare nu este o adresă IP validă. This value is not a valid language. @@ -180,7 +180,7 @@ This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters. - Această valoare trebuie să conțină exact {{ limit }} caracter.|Această valoare trebuie să conțină exact {{ limit }} caractere. + Această valoare trebuie să conțină exact {{ limit }} caracter.|Această valoare trebuie să conțină exact {{ limit }} caractere.|Această valoare trebuie să conțină exact {{ limit }} de caractere. The file was only partially uploaded. @@ -196,7 +196,7 @@ Cannot write temporary file to disk. - Nu a fost posibilă scrierea fișierului temporar pe disk. + Nu a fost posibilă scrierea fișierului temporar pe disc. A PHP extension caused the upload to fail. @@ -204,15 +204,15 @@ This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more. - Această colecție trebuie să conțină cel puțin {{ limit }} element.|Această colecție trebuie să conțină cel puțin {{ limit }} elemente. + Această colecție trebuie să conțină cel puțin {{ limit }} element.|Această colecție trebuie să conțină cel puțin {{ limit }} elemente.|Această colecție trebuie să conțină cel puțin {{ limit }} de elemente. This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less. - Această colecție trebuie să conțină cel mult {{ limit }} element.|Această colecție trebuie să conțină cel mult {{ limit }} elemente. + Această colecție trebuie să conțină cel mult {{ limit }} element.|Această colecție trebuie să conțină cel mult {{ limit }} elemente.|Această colecție trebuie să conțină cel mult {{ limit }} de elemente. This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements. - Această colecție trebuie să conțină exact {{ limit }} element.|Această colecție trebuie să conțină exact {{ limit }} elemente. + Această colecție trebuie să conțină exact {{ limit }} element.|Această colecție trebuie să conțină exact {{ limit }} elemente.|Această colecție trebuie să conțină exact {{ limit }} de elemente. Invalid card number. @@ -412,7 +412,7 @@ This value contains characters that are not allowed by the current restriction-level. - Această valoare conține caractere care nu sunt premise de nivelul de restricționare curent. + Această valoare conține caractere care nu sunt permise de nivelul de restricționare curent. Using invisible characters is not allowed. diff --git a/lib/symfony/validator/Validator/ValidatorInterface.php b/lib/symfony/validator/Validator/ValidatorInterface.php index f26a9b99a..b465162fe 100644 --- a/lib/symfony/validator/Validator/ValidatorInterface.php +++ b/lib/symfony/validator/Validator/ValidatorInterface.php @@ -30,7 +30,7 @@ interface ValidatorInterface extends MetadataFactoryInterface * If no constraint is passed, the constraint * {@link \Symfony\Component\Validator\Constraints\Valid} is assumed. * - * @param Constraint|Constraint[] $constraints The constraint(s) to validate against + * @param Constraint|Constraint[]|null $constraints The constraint(s) to validate against * @param string|GroupSequence|array|null $groups The validation groups to validate. If none is given, "Default" is assumed * * @return ConstraintViolationListInterface A list of constraint violations diff --git a/lib/symfony/web-profiler-bundle/Resources/views/Profiler/toolbar_js.html.twig b/lib/symfony/web-profiler-bundle/Resources/views/Profiler/toolbar_js.html.twig index 53e24f15e..a77ccb7be 100644 --- a/lib/symfony/web-profiler-bundle/Resources/views/Profiler/toolbar_js.html.twig +++ b/lib/symfony/web-profiler-bundle/Resources/views/Profiler/toolbar_js.html.twig @@ -1,657 +1,659 @@ -
- {{ include('@WebProfiler/Profiler/toolbar.html.twig', { - templates: { - 'request': '@WebProfiler/Profiler/cancel.html.twig' - }, - profile: null, - profiler_url: url('_profiler', {token: token}), - profiler_markup_version: 3, - }) }} -
- - - {{ include('@WebProfiler/Profiler/toolbar.css.twig') }} - - -{# CAUTION: the contents of this file are processed by Twig before loading - them as JavaScript source code. Always use '/*' comments instead - of '//' comments to avoid impossible-to-debug side-effects #} -/* +
+ {{ include('@WebProfiler/Profiler/toolbar.html.twig', { + templates: { + 'request': '@WebProfiler/Profiler/cancel.html.twig' + }, + profile: null, + profiler_url: url('_profiler', {token: token}), + profiler_markup_version: 3, + }) }} +
+ + + {{ include('@WebProfiler/Profiler/toolbar.css.twig') }} + + + {# CAUTION: the contents of this file are processed by Twig before loading + them as JavaScript source code. Always use '/*' comments instead + of '//' comments to avoid impossible-to-debug side-effects #} + /* 0) { + addClass(ajaxToolbarPanel, 'sf-ajax-request-loading'); + } else if (successStreak < 4) { + addClass(ajaxToolbarPanel, 'sf-toolbar-status-red'); + removeClass(ajaxToolbarPanel, 'sf-ajax-request-loading'); + } else { + removeClass(ajaxToolbarPanel, 'sf-ajax-request-loading'); + removeClass(ajaxToolbarPanel, 'sf-toolbar-status-red'); } }; - - if (options.onSend) { - options.onSend(tries); - } - - xhr.send(payload || ''); - }; - - var getPreference = function(name) { - if (!window.localStorage) { - return null; - } - - return localStorage.getItem(profilerStorageKey + name); - }; - - var setPreference = function(name, value) { - if (!window.localStorage) { - return null; - } - - localStorage.setItem(profilerStorageKey + name, value); - }; - - var requestStack = []; - - var extractHeaders = function(xhr, stackElement) { - /* Here we avoid to call xhr.getResponseHeader in order to */ - /* prevent polluting the console with CORS security errors */ - var allHeaders = xhr.getAllResponseHeaders(); - var ret; - - if (ret = allHeaders.match(/^x-debug-token:\s+(.*)$/im)) { - stackElement.profile = ret[1]; - } - if (ret = allHeaders.match(/^x-debug-token-link:\s+(.*)$/im)) { - stackElement.profilerUrl = ret[1]; - } - if (ret = allHeaders.match(/^Symfony-Debug-Toolbar-Replace:\s+(.*)$/im)) { - stackElement.toolbarReplaceFinished = false; - stackElement.toolbarReplace = '1' === ret[1]; - } - }; - - var successStreak = 4; - var pendingRequests = 0; - var renderAjaxRequests = function() { - var requestCounter = document.querySelector('.sf-toolbar-ajax-request-counter'); - if (!requestCounter) { - return; - } - requestCounter.textContent = requestStack.length; - - var infoSpan = document.querySelector(".sf-toolbar-ajax-info"); - if (infoSpan) { - infoSpan.textContent = requestStack.length + ' AJAX request' + (requestStack.length !== 1 ? 's' : ''); - } - - var ajaxToolbarPanel = document.querySelector('.sf-toolbar-block-ajax'); - if (requestStack.length) { - ajaxToolbarPanel.style.display = 'block'; - } else { - ajaxToolbarPanel.style.display = 'none'; - } - if (pendingRequests > 0) { - addClass(ajaxToolbarPanel, 'sf-ajax-request-loading'); - } else if (successStreak < 4) { - addClass(ajaxToolbarPanel, 'sf-toolbar-status-red'); - removeClass(ajaxToolbarPanel, 'sf-ajax-request-loading'); - } else { - removeClass(ajaxToolbarPanel, 'sf-ajax-request-loading'); - removeClass(ajaxToolbarPanel, 'sf-toolbar-status-red'); - } - }; - - var startAjaxRequest = function(index) { - var tbody = document.querySelector('.sf-toolbar-ajax-request-list'); - if (!tbody) { - return; - } - - var nbOfAjaxRequest = tbody.rows.length; - if (nbOfAjaxRequest >= 100) { - tbody.deleteRow(0); - } - - var request = requestStack[index]; - pendingRequests++; - var row = document.createElement('tr'); - request.DOMNode = row; - - var requestNumberCell = document.createElement('td'); - requestNumberCell.textContent = index + 1; - row.appendChild(requestNumberCell); - - var profilerCell = document.createElement('td'); - profilerCell.textContent = 'n/a'; - row.appendChild(profilerCell); - - var methodCell = document.createElement('td'); - methodCell.textContent = request.method; - row.appendChild(methodCell); - - var typeCell = document.createElement('td'); - typeCell.textContent = request.type; - row.appendChild(typeCell); - - var statusCodeCell = document.createElement('td'); - var statusCode = document.createElement('span'); - statusCode.textContent = 'n/a'; - statusCodeCell.appendChild(statusCode); - row.appendChild(statusCodeCell); - - var pathCell = document.createElement('td'); - pathCell.className = 'sf-ajax-request-url'; - if ('GET' === request.method) { - var pathLink = document.createElement('a'); - pathLink.setAttribute('href', request.url); - pathLink.textContent = request.url; - pathCell.appendChild(pathLink); - } else { - pathCell.textContent = request.url; - } - pathCell.setAttribute('title', request.url); - row.appendChild(pathCell); - - var durationCell = document.createElement('td'); - durationCell.className = 'sf-ajax-request-duration'; - durationCell.textContent = 'n/a'; - row.appendChild(durationCell); - - request.liveDurationHandle = setInterval(function() { - durationCell.textContent = (new Date() - request.start) + ' ms'; - }, 100); - - row.className = 'sf-ajax-request sf-ajax-request-loading'; - tbody.insertBefore(row, null); - - var toolbarInfo = document.querySelector('.sf-toolbar-block-ajax .sf-toolbar-info'); - toolbarInfo.scrollTop = toolbarInfo.scrollHeight; - - renderAjaxRequests(); - }; - - var finishAjaxRequest = function(index) { - var request = requestStack[index]; - clearInterval(request.liveDurationHandle); - - if (!request.DOMNode) { - return; - } - - if (request.toolbarReplace && !request.toolbarReplaceFinished && request.profile) { - /* Flag as complete because finishAjaxRequest can be called multiple times. */ - request.toolbarReplaceFinished = true; - /* Search up through the DOM to find the toolbar's container ID. */ - for (var elem = request.DOMNode; elem && elem !== document; elem = elem.parentNode) { - if (elem.id.match(/^sfwdt/)) { - Sfjs.loadToolbar(elem.id.replace(/^sfwdt/, ''), request.profile); - break; + + var startAjaxRequest = function(index) { + var tbody = document.querySelector('.sf-toolbar-ajax-request-list'); + if (!tbody) { + return; + } + + var nbOfAjaxRequest = tbody.rows.length; + if (nbOfAjaxRequest >= 100) { + tbody.deleteRow(0); + } + + var request = requestStack[index]; + pendingRequests++; + var row = document.createElement('tr'); + request.DOMNode = row; + + var requestNumberCell = document.createElement('td'); + requestNumberCell.textContent = index + 1; + row.appendChild(requestNumberCell); + + var profilerCell = document.createElement('td'); + profilerCell.textContent = 'n/a'; + row.appendChild(profilerCell); + + var methodCell = document.createElement('td'); + methodCell.textContent = request.method; + row.appendChild(methodCell); + + var typeCell = document.createElement('td'); + typeCell.textContent = request.type; + row.appendChild(typeCell); + + var statusCodeCell = document.createElement('td'); + var statusCode = document.createElement('span'); + statusCode.textContent = 'n/a'; + statusCodeCell.appendChild(statusCode); + row.appendChild(statusCodeCell); + + var pathCell = document.createElement('td'); + pathCell.className = 'sf-ajax-request-url'; + if ('GET' === request.method) { + var pathLink = document.createElement('a'); + pathLink.setAttribute('href', request.url); + pathLink.textContent = request.url; + pathCell.appendChild(pathLink); + } else { + pathCell.textContent = request.url; + } + pathCell.setAttribute('title', request.url); + row.appendChild(pathCell); + + var durationCell = document.createElement('td'); + durationCell.className = 'sf-ajax-request-duration'; + durationCell.textContent = 'n/a'; + row.appendChild(durationCell); + + request.liveDurationHandle = setInterval(function() { + durationCell.textContent = (new Date() - request.start) + ' ms'; + }, 100); + + row.className = 'sf-ajax-request sf-ajax-request-loading'; + tbody.insertBefore(row, null); + + var toolbarInfo = document.querySelector('.sf-toolbar-block-ajax .sf-toolbar-info'); + toolbarInfo.scrollTop = toolbarInfo.scrollHeight; + + renderAjaxRequests(); + }; + + var finishAjaxRequest = function(index) { + var request = requestStack[index]; + clearInterval(request.liveDurationHandle); + + if (!request.DOMNode) { + return; + } + + if (request.toolbarReplace && !request.toolbarReplaceFinished && request.profile) { + /* Flag as complete because finishAjaxRequest can be called multiple times. */ + request.toolbarReplaceFinished = true; + /* Search up through the DOM to find the toolbar's container ID. */ + for (var elem = request.DOMNode; elem && elem !== document; elem = elem.parentNode) { + if (elem.id.match(/^sfwdt/)) { + Sfjs.loadToolbar(elem.id.replace(/^sfwdt/, ''), request.profile); + break; + } } } - } - - pendingRequests--; - var row = request.DOMNode; - /* Unpack the children from the row */ - var profilerCell = row.children[1]; - var methodCell = row.children[2]; - var statusCodeCell = row.children[4]; - var statusCodeElem = statusCodeCell.children[0]; - var durationCell = row.children[6]; - - if (request.error) { - row.className = 'sf-ajax-request sf-ajax-request-error'; - methodCell.className = 'sf-ajax-request-error'; - successStreak = 0; - } else { - row.className = 'sf-ajax-request sf-ajax-request-ok'; - successStreak++; - } - - if (request.statusCode) { - if (request.statusCode < 300) { - statusCodeElem.setAttribute('class', 'sf-toolbar-status'); - } else if (request.statusCode < 400) { - statusCodeElem.setAttribute('class', 'sf-toolbar-status sf-toolbar-status-yellow'); + + pendingRequests--; + var row = request.DOMNode; + /* Unpack the children from the row */ + var profilerCell = row.children[1]; + var methodCell = row.children[2]; + var statusCodeCell = row.children[4]; + var statusCodeElem = statusCodeCell.children[0]; + var durationCell = row.children[6]; + + if (request.error) { + row.className = 'sf-ajax-request sf-ajax-request-error'; + methodCell.className = 'sf-ajax-request-error'; + successStreak = 0; + } else { + row.className = 'sf-ajax-request sf-ajax-request-ok'; + successStreak++; + } + + if (request.statusCode) { + if (request.statusCode < 300) { + statusCodeElem.setAttribute('class', 'sf-toolbar-status'); + } else if (request.statusCode < 400) { + statusCodeElem.setAttribute('class', 'sf-toolbar-status sf-toolbar-status-yellow'); + } else { + statusCodeElem.setAttribute('class', 'sf-toolbar-status sf-toolbar-status-red'); + } + statusCodeElem.textContent = request.statusCode; } else { statusCodeElem.setAttribute('class', 'sf-toolbar-status sf-toolbar-status-red'); } - statusCodeElem.textContent = request.statusCode; - } else { - statusCodeElem.setAttribute('class', 'sf-toolbar-status sf-toolbar-status-red'); - } - - if (request.duration) { - durationCell.textContent = request.duration + ' ms'; - } - - if (request.profilerUrl) { - profilerCell.textContent = ''; - var profilerLink = document.createElement('a'); - profilerLink.setAttribute('href', request.profilerUrl); - profilerLink.textContent = request.profile; - profilerCell.appendChild(profilerLink); - } - - renderAjaxRequests(); - }; - - {% if excluded_ajax_paths is defined %} - if (window.fetch && window.fetch.polyfill === undefined) { - var oldFetch = window.fetch; - window.fetch = function () { - var promise = oldFetch.apply(this, arguments); - var url = arguments[0]; - var params = arguments[1]; - var paramType = Object.prototype.toString.call(arguments[0]); - if (paramType === '[object Request]') { - url = arguments[0].url; - params = { - method: arguments[0].method, - credentials: arguments[0].credentials, - headers: arguments[0].headers, - mode: arguments[0].mode, - redirect: arguments[0].redirect - }; - } else { - url = String(url); + + if (request.duration) { + durationCell.textContent = request.duration + ' ms'; } - if (!url.match(new RegExp({{ excluded_ajax_paths|json_encode|raw }}))) { - var method = 'GET'; - if (params && params.method !== undefined) { - method = params.method; - } - - var stackElement = { - error: false, - url: url, - method: method, - type: 'fetch', - start: new Date() - }; - - var idx = requestStack.push(stackElement) - 1; - promise.then(function (r) { - stackElement.duration = new Date() - stackElement.start; - stackElement.error = r.status < 200 || r.status >= 400; - stackElement.statusCode = r.status; - stackElement.profile = r.headers.get('x-debug-token'); - stackElement.profilerUrl = r.headers.get('x-debug-token-link'); - stackElement.toolbarReplaceFinished = false; - stackElement.toolbarReplace = '1' === r.headers.get('Symfony-Debug-Toolbar-Replace'); - finishAjaxRequest(idx); - }, function (e){ - stackElement.error = true; - finishAjaxRequest(idx); - }); - startAjaxRequest(idx); + + if (request.profilerUrl) { + profilerCell.textContent = ''; + var profilerLink = document.createElement('a'); + profilerLink.setAttribute('href', request.profilerUrl); + profilerLink.textContent = request.profile; + profilerCell.appendChild(profilerLink); } - - return promise; + + renderAjaxRequests(); }; - } - if (window.XMLHttpRequest && XMLHttpRequest.prototype.addEventListener) { - var proxied = XMLHttpRequest.prototype.open; - - XMLHttpRequest.prototype.open = function(method, url, async, user, pass) { - var self = this; - - /* prevent logging AJAX calls to static and inline files, like templates */ - var path = url; - if (url.slice(0, 1) === '/') { - if (0 === url.indexOf('{{ request.basePath|e('js') }}')) { - path = url.slice({{ request.basePath|length }}); + + {% if excluded_ajax_paths is defined %} + if (window.fetch && window.fetch.polyfill === undefined) { + var oldFetch = window.fetch; + window.fetch = function () { + var promise = oldFetch.apply(this, arguments); + var url = arguments[0]; + var params = arguments[1]; + var paramType = Object.prototype.toString.call(arguments[0]); + if (paramType === '[object Request]') { + url = arguments[0].url; + params = { + method: arguments[0].method, + credentials: arguments[0].credentials, + headers: arguments[0].headers, + mode: arguments[0].mode, + redirect: arguments[0].redirect + }; + } else { + url = String(url); } - } - else if (0 === url.indexOf('{{ (request.schemeAndHttpHost ~ request.basePath)|e('js') }}')) { - path = url.slice({{ (request.schemeAndHttpHost ~ request.basePath)|length }}); - } - - if (!path.match(new RegExp({{ excluded_ajax_paths|json_encode|raw }}))) { - var stackElement = { - error: false, - url: url, - method: method, - type: 'xhr', - start: new Date() - }; - - var idx = requestStack.push(stackElement) - 1; - - this.addEventListener('readystatechange', function() { - if (self.readyState == 4) { - stackElement.duration = new Date() - stackElement.start; - stackElement.error = self.status < 200 || self.status >= 400; - stackElement.statusCode = self.status; - extractHeaders(self, stackElement); - - finishAjaxRequest(idx); + if (!url.match(new RegExp({{ excluded_ajax_paths|json_encode|raw }}))) { + var method = 'GET'; + if (params && params.method !== undefined) { + method = params.method; } - }, false); - - startAjaxRequest(idx); - } - - proxied.apply(this, Array.prototype.slice.call(arguments)); - }; - } - {% endif %} - - return { - hasClass: hasClass, - - removeClass: removeClass, - - addClass: addClass, - - toggleClass: toggleClass, - - getPreference: getPreference, - - setPreference: setPreference, - - addEventListener: addEventListener, - - request: request, - - renderAjaxRequests: renderAjaxRequests, - - getSfwdt: function(token) { - return document.getElementById('sfwdt' + token); - }, - - load: function(selector, url, onSuccess, onError, options) { - var el = document.getElementById(selector); - - if (el && el.getAttribute('data-sfurl') !== url) { - request( - url, - function(xhr) { - el.innerHTML = xhr.responseText; - el.setAttribute('data-sfurl', url); - removeClass(el, 'loading'); - var pending = pendingRequests; - for (var i = 0; i < requestStack.length; i++) { - startAjaxRequest(i); - if (requestStack[i].duration || requestStack[i].error) { - finishAjaxRequest(i); - } + + var stackElement = { + error: false, + url: url, + method: method, + type: 'fetch', + start: new Date() + }; + + var idx = requestStack.push(stackElement) - 1; + promise.then(function (r) { + stackElement.duration = new Date() - stackElement.start; + stackElement.error = r.status < 200 || r.status >= 400; + stackElement.statusCode = r.status; + stackElement.profile = r.headers.get('x-debug-token'); + stackElement.profilerUrl = r.headers.get('x-debug-token-link'); + stackElement.toolbarReplaceFinished = false; + stackElement.toolbarReplace = '1' === r.headers.get('Symfony-Debug-Toolbar-Replace'); + finishAjaxRequest(idx); + }, function (e){ + stackElement.error = true; + finishAjaxRequest(idx); + }); + startAjaxRequest(idx); + } + + return promise; + }; + } + if (window.XMLHttpRequest && XMLHttpRequest.prototype.addEventListener) { + var proxied = XMLHttpRequest.prototype.open; + + XMLHttpRequest.prototype.open = function(method, url, async, user, pass) { + var self = this; + + /* prevent logging AJAX calls to static and inline files, like templates */ + var path = url; + if (url.slice(0, 1) === '/') { + if (0 === url.indexOf('{{ request.basePath|e('js') }}')) { + path = url.slice({{ request.basePath|length }}); + } + } + else if (0 === url.indexOf('{{ (request.schemeAndHttpHost ~ request.basePath)|e('js') }}')) { + path = url.slice({{ (request.schemeAndHttpHost ~ request.basePath)|length }}); + } + + if (!path.match(new RegExp({{ excluded_ajax_paths|json_encode|raw }}))) { + var stackElement = { + error: false, + url: url, + method: method, + type: 'xhr', + start: new Date() + }; + + var idx = requestStack.push(stackElement) - 1; + + this.addEventListener('readystatechange', function() { + if (self.readyState == 4) { + stackElement.duration = new Date() - stackElement.start; + stackElement.error = self.status < 200 || self.status >= 400; + stackElement.statusCode = self.status; + extractHeaders(self, stackElement); + + finishAjaxRequest(idx); } - /* Revert the pending state in case there was a start called without a finish above. */ - pendingRequests = pending; - (onSuccess || noop)(xhr, el); - }, - function(xhr) { (onError || noop)(xhr, el); }, - '', - options - ); - } - - return this; - }, - - showToolbar: function(token) { - var sfwdt = this.getSfwdt(token); - removeClass(sfwdt, 'sf-display-none'); - - if (getPreference('toolbar/displayState') == 'none') { - document.getElementById('sfToolbarMainContent-' + token).style.display = 'none'; - document.getElementById('sfToolbarClearer-' + token).style.display = 'none'; - document.getElementById('sfMiniToolbar-' + token).style.display = 'block'; - } else { - document.getElementById('sfToolbarMainContent-' + token).style.display = 'block'; - document.getElementById('sfToolbarClearer-' + token).style.display = 'block'; - document.getElementById('sfMiniToolbar-' + token).style.display = 'none'; - } - }, - - hideToolbar: function(token) { - var sfwdt = this.getSfwdt(token); - addClass(sfwdt, 'sf-display-none'); - }, - - initToolbar: function(token) { - this.showToolbar(token); - - var hideButton = document.getElementById('sfToolbarHideButton-' + token); - var hideButtonSvg = hideButton.querySelector('svg'); - hideButtonSvg.setAttribute('aria-hidden', 'true'); - hideButtonSvg.setAttribute('focusable', 'false'); - addEventListener(hideButton, 'click', function (event) { - event.preventDefault(); - - var p = this.parentNode; - p.style.display = 'none'; - (p.previousElementSibling || p.previousSibling).style.display = 'none'; - document.getElementById('sfMiniToolbar-' + token).style.display = 'block'; - setPreference('toolbar/displayState', 'none'); - }); - - var showButton = document.getElementById('sfToolbarMiniToggler-' + token); - var showButtonSvg = showButton.querySelector('svg'); - showButtonSvg.setAttribute('aria-hidden', 'true'); - showButtonSvg.setAttribute('focusable', 'false'); - addEventListener(showButton, 'click', function (event) { - event.preventDefault(); - - var elem = this.parentNode; - if (elem.style.display == 'none') { + }, false); + + startAjaxRequest(idx); + } + + proxied.apply(this, Array.prototype.slice.call(arguments)); + }; + } + {% endif %} + + return { + hasClass: hasClass, + + removeClass: removeClass, + + addClass: addClass, + + toggleClass: toggleClass, + + getPreference: getPreference, + + setPreference: setPreference, + + addEventListener: addEventListener, + + request: request, + + renderAjaxRequests: renderAjaxRequests, + + getSfwdt: function(token) { + return document.getElementById('sfwdt' + token); + }, + + load: function(selector, url, onSuccess, onError, options) { + var el = document.getElementById(selector); + + if (el && el.getAttribute('data-sfurl') !== url) { + request( + url, + function(xhr) { + el.innerHTML = xhr.responseText; + el.setAttribute('data-sfurl', url); + removeClass(el, 'loading'); + var pending = pendingRequests; + for (var i = 0; i < requestStack.length; i++) { + startAjaxRequest(i); + if (requestStack[i].duration || requestStack[i].error) { + finishAjaxRequest(i); + } + } + /* Revert the pending state in case there was a start called without a finish above. */ + pendingRequests = pending; + (onSuccess || noop)(xhr, el); + }, + function(xhr) { (onError || noop)(xhr, el); }, + '', + options + ); + } + + return this; + }, + + showToolbar: function(token) { + var sfwdt = this.getSfwdt(token); + removeClass(sfwdt, 'sf-display-none'); + + if (getPreference('toolbar/displayState') == 'none') { document.getElementById('sfToolbarMainContent-' + token).style.display = 'none'; document.getElementById('sfToolbarClearer-' + token).style.display = 'none'; - elem.style.display = 'block'; + document.getElementById('sfMiniToolbar-' + token).style.display = 'block'; } else { document.getElementById('sfToolbarMainContent-' + token).style.display = 'block'; document.getElementById('sfToolbarClearer-' + token).style.display = 'block'; - elem.style.display = 'none' + document.getElementById('sfMiniToolbar-' + token).style.display = 'none'; } - - setPreference('toolbar/displayState', 'block'); - }); - }, - - loadToolbar: function(token, newToken) { - var that = this; - var triesCounter = document.getElementById('sfLoadCounter-' + token); - - var options = { - retry: true, - onSend: function (count) { - if (count === 3) { - that.initToolbar(token); - } - - if (triesCounter) { - triesCounter.textContent = count; - } - }, - }; - - var cancelButton = document.getElementById('sfLoadCancel-' + token); - if (cancelButton) { - addEventListener(cancelButton, 'click', function (event) { + }, + + hideToolbar: function(token) { + var sfwdt = this.getSfwdt(token); + addClass(sfwdt, 'sf-display-none'); + }, + + initToolbar: function(token) { + this.showToolbar(token); + + var hideButton = document.getElementById('sfToolbarHideButton-' + token); + var hideButtonSvg = hideButton.querySelector('svg'); + hideButtonSvg.setAttribute('aria-hidden', 'true'); + hideButtonSvg.setAttribute('focusable', 'false'); + addEventListener(hideButton, 'click', function (event) { event.preventDefault(); - - options.stop = true; - that.hideToolbar(token); + + var p = this.parentNode; + p.style.display = 'none'; + (p.previousElementSibling || p.previousSibling).style.display = 'none'; + document.getElementById('sfMiniToolbar-' + token).style.display = 'block'; + setPreference('toolbar/displayState', 'none'); }); - } - - newToken = (newToken || token); - - this.load( - 'sfwdt' + token, - '{{ url("_wdt", { "token": "xxxxxx" })|escape('js') }}'.replace(/xxxxxx/, newToken), - function(xhr, el) { - var toolbarContent = document.getElementById('sfToolbarMainContent-' + newToken); - - /* Do nothing in the edge case where the toolbar has already been replaced with a new one */ - if (!toolbarContent) { - return; + + var showButton = document.getElementById('sfToolbarMiniToggler-' + token); + var showButtonSvg = showButton.querySelector('svg'); + showButtonSvg.setAttribute('aria-hidden', 'true'); + showButtonSvg.setAttribute('focusable', 'false'); + addEventListener(showButton, 'click', function (event) { + event.preventDefault(); + + var elem = this.parentNode; + if (elem.style.display == 'none') { + document.getElementById('sfToolbarMainContent-' + token).style.display = 'none'; + document.getElementById('sfToolbarClearer-' + token).style.display = 'none'; + elem.style.display = 'block'; + } else { + document.getElementById('sfToolbarMainContent-' + token).style.display = 'block'; + document.getElementById('sfToolbarClearer-' + token).style.display = 'block'; + elem.style.display = 'none' } - - /* Replace the ID, it has to match the new token */ - toolbarContent.parentElement.id = 'sfwdt' + newToken; - - /* Evaluate in global scope scripts embedded inside the toolbar */ - var i, scripts = [].slice.call(el.querySelectorAll('script')); - for (i = 0; i < scripts.length; ++i) { - if (scripts[i].firstChild) { - eval.call({}, scripts[i].firstChild.nodeValue); + + setPreference('toolbar/displayState', 'block'); + }); + }, + + loadToolbar: function(token, newToken) { + var that = this; + var triesCounter = document.getElementById('sfLoadCounter-' + token); + + var options = { + retry: true, + onSend: function (count) { + if (count === 3) { + that.initToolbar(token); } - } - - el.style.display = -1 !== xhr.responseText.indexOf('sf-toolbarreset') ? 'block' : 'none'; - - if (el.style.display == 'none') { - return; - } - - that.initToolbar(newToken); - - /* Handle toolbar-info position */ - var toolbarBlocks = [].slice.call(el.querySelectorAll('.sf-toolbar-block')); - for (i = 0; i < toolbarBlocks.length; ++i) { - toolbarBlocks[i].onmouseover = function () { - var toolbarInfo = this.querySelectorAll('.sf-toolbar-info')[0]; - var pageWidth = document.body.clientWidth; - var elementWidth = toolbarInfo.offsetWidth; - var leftValue = (elementWidth + this.offsetLeft) - pageWidth; - var rightValue = (elementWidth + (pageWidth - this.offsetLeft)) - pageWidth; - - /* Reset right and left value, useful on window resize */ - toolbarInfo.style.right = ''; - toolbarInfo.style.left = ''; - - if (elementWidth > pageWidth) { - toolbarInfo.style.left = 0; - } - else if (leftValue > 0 && rightValue > 0) { - toolbarInfo.style.right = (rightValue * -1) + 'px'; - } else if (leftValue < 0) { - toolbarInfo.style.left = 0; - } else { - toolbarInfo.style.right = '0px'; - } - }; - } - - renderAjaxRequests(); - addEventListener(document.querySelector('.sf-toolbar-ajax-clear'), 'click', function() { - requestStack = []; - renderAjaxRequests(); - successStreak = 4; - document.querySelector('.sf-toolbar-ajax-request-list').innerHTML = ''; - }); - addEventListener(document.querySelector('.sf-toolbar-block-ajax'), 'mouseenter', function (event) { - var elem = document.querySelector('.sf-toolbar-block-ajax .sf-toolbar-info'); - elem.scrollTop = elem.scrollHeight; - }); - addEventListener(document.querySelector('.sf-toolbar-block-ajax > .sf-toolbar-icon'), 'click', function (event) { + + if (triesCounter) { + triesCounter.textContent = count; + } + }, + }; + + var cancelButton = document.getElementById('sfLoadCancel-' + token); + if (cancelButton) { + addEventListener(cancelButton, 'click', function (event) { event.preventDefault(); - - toggleClass(this.parentNode, 'hover'); + + options.stop = true; + that.hideToolbar(token); }); - - var dumpInfo = document.querySelector('.sf-toolbar-block-dump .sf-toolbar-info'); - if (null !== dumpInfo) { - addEventListener(dumpInfo, 'sfbeforedumpcollapse', function () { - dumpInfo.style.minHeight = dumpInfo.getBoundingClientRect().height+'px'; + } + + newToken = (newToken || token); + + this.load( + 'sfwdt' + token, + '{{ url("_wdt", { "token": "xxxxxx" })|escape('js') }}'.replace(/xxxxxx/, newToken), + function(xhr, el) { + var toolbarContent = document.getElementById('sfToolbarMainContent-' + newToken); + + /* Do nothing in the edge case where the toolbar has already been replaced with a new one */ + if (!toolbarContent) { + return; + } + + /* Replace the ID, it has to match the new token */ + toolbarContent.parentElement.id = 'sfwdt' + newToken; + + /* Evaluate in global scope scripts embedded inside the toolbar */ + var i, scripts = [].slice.call(el.querySelectorAll('script')); + for (i = 0; i < scripts.length; ++i) { + if (scripts[i].firstChild) { + eval.call({}, scripts[i].firstChild.nodeValue); + } + } + + el.style.display = -1 !== xhr.responseText.indexOf('sf-toolbarreset') ? 'block' : 'none'; + + if (el.style.display == 'none') { + return; + } + + that.initToolbar(newToken); + + /* Handle toolbar-info position */ + var toolbarBlocks = [].slice.call(el.querySelectorAll('.sf-toolbar-block')); + for (i = 0; i < toolbarBlocks.length; ++i) { + toolbarBlocks[i].onmouseover = function () { + var toolbarInfo = this.querySelectorAll('.sf-toolbar-info')[0]; + var pageWidth = document.body.clientWidth; + var elementWidth = toolbarInfo.offsetWidth; + var leftValue = (elementWidth + this.offsetLeft) - pageWidth; + var rightValue = (elementWidth + (pageWidth - this.offsetLeft)) - pageWidth; + + /* Reset right and left value, useful on window resize */ + toolbarInfo.style.right = ''; + toolbarInfo.style.left = ''; + + if (elementWidth > pageWidth) { + toolbarInfo.style.left = 0; + } + else if (leftValue > 0 && rightValue > 0) { + toolbarInfo.style.right = (rightValue * -1) + 'px'; + } else if (leftValue < 0) { + toolbarInfo.style.left = 0; + } else { + toolbarInfo.style.right = '0px'; + } + }; + } + + renderAjaxRequests(); + addEventListener(document.querySelector('.sf-toolbar-ajax-clear'), 'click', function() { + requestStack = []; + renderAjaxRequests(); + successStreak = 4; + document.querySelector('.sf-toolbar-ajax-request-list').innerHTML = ''; }); - addEventListener(dumpInfo, 'mouseleave', function () { - dumpInfo.style.minHeight = ''; + addEventListener(document.querySelector('.sf-toolbar-block-ajax'), 'mouseenter', function (event) { + var elem = document.querySelector('.sf-toolbar-block-ajax .sf-toolbar-info'); + elem.scrollTop = elem.scrollHeight; }); - } - }, - function(xhr) { - if (xhr.status !== 0 && !options.stop) { - var sfwdt = that.getSfwdt(token); - sfwdt.innerHTML = '\ -
\ -
\ - An error occurred while loading the web debug toolbar. Open the web profiler.\ -
\ - '; - sfwdt.setAttribute('class', 'sf-toolbar sf-error-toolbar'); - } - }, - options - ); - - return this; - }, - - toggle: function(selector, elOn, elOff) { - var tmp = elOn.style.display, - el = document.getElementById(selector); - - elOn.style.display = elOff.style.display; - elOff.style.display = tmp; - - if (el) { - el.style.display = 'none' === tmp ? 'none' : 'block'; - } - - return this; - }, - }; - })(); - } - - Sfjs.loadToolbar('{{ token }}'); -/*]]>*/ + addEventListener(document.querySelector('.sf-toolbar-block-ajax > .sf-toolbar-icon'), 'click', function (event) { + event.preventDefault(); + + toggleClass(this.parentNode, 'hover'); + }); + + var dumpInfo = document.querySelector('.sf-toolbar-block-dump .sf-toolbar-info'); + if (null !== dumpInfo) { + addEventListener(dumpInfo, 'sfbeforedumpcollapse', function () { + dumpInfo.style.minHeight = dumpInfo.getBoundingClientRect().height+'px'; + }); + addEventListener(dumpInfo, 'mouseleave', function () { + dumpInfo.style.minHeight = ''; + }); + } + }, + function(xhr) { + if (xhr.status !== 0 && !options.stop) { + var sfwdt = that.getSfwdt(token); + sfwdt.innerHTML = '\ +
\ +
\ + An error occurred while loading the web debug toolbar. Open the web profiler.\ +
\ + '; + sfwdt.setAttribute('class', 'sf-toolbar sf-error-toolbar'); + } + }, + options + ); + + return this; + }, + + toggle: function(selector, elOn, elOff) { + var tmp = elOn.style.display, + el = document.getElementById(selector); + + elOn.style.display = elOff.style.display; + elOff.style.display = tmp; + + if (el) { + el.style.display = 'none' === tmp ? 'none' : 'block'; + } + + return this; + }, + }; + })(); + } + + Sfjs.loadToolbar('{{ token }}'); + /*]]>*/ +
diff --git a/lib/symfony/yaml/Inline.php b/lib/symfony/yaml/Inline.php index 8feecea15..8db5766cf 100644 --- a/lib/symfony/yaml/Inline.php +++ b/lib/symfony/yaml/Inline.php @@ -386,11 +386,33 @@ class Inline // the value can be an array if a reference has been resolved to an array var if (\is_string($value) && !$isQuoted && str_contains($value, ': ')) { // embedded mapping? - try { - $pos = 0; - $value = self::parseMapping('{'.$value.'}', $flags, $pos, $references); - } catch (\InvalidArgumentException) { - // no, it's not + $j = $i; + $mappingValue = $value; + $mappingException = null; + do { + try { + $pos = 0; + $value = self::parseMapping('{'.$mappingValue.'}', $flags, $pos, $references); + $i = $j; + $mappingException = null; + break; + } catch (ParseException $exception) { + $mappingException = $exception; + if ($j >= $len) { + break; + } + + $mappingValue .= $sequence[$j++]; + if ($j >= $len) { + break; + } + + $mappingValue .= self::parseScalar($sequence, $flags, [',', ']'], $j, null === $tag, $references); + } + } while ($j < $len); + + if ($mappingException) { + throw $mappingException; } } diff --git a/lib/tecnickcom/tcpdf/CHANGELOG.TXT b/lib/tecnickcom/tcpdf/CHANGELOG.TXT index 5d560d0a7..0ed8f5713 100644 --- a/lib/tecnickcom/tcpdf/CHANGELOG.TXT +++ b/lib/tecnickcom/tcpdf/CHANGELOG.TXT @@ -1,3 +1,20 @@ +6.11.0 (2026-03-01) + - Updated copyright year. + - Updated linked http urls to https. + - Fix PHP 8.5 deprecation on curl_close() - PR #838 + - Fix PHP 8.5 deprecation on null array offset - PR #839 + - Fixed: Font subsetting - incorrect placement of head checksum - PR #849 + - Fix imagedestroy() deprecation in PHP 8.5 - PR #851 + - Fix Rendering of SVG -> PDF issue - PR #855 + +6.10.1 (2025-11-21) + - cI: Add 8.5 to CI matrix - PR #836 + - Fix PHP 8.5 deprecation for xml_parser_free - PR #835 + - Fix bad text-align from HTML source - PR #833 + - Fix image on footer problems - PR #823 + - Preserving percentage gradient decimals and correctly clamp coordinates - PR #815 + - Enables compression for PDF/A - PR #820 + 6.10.0 (2025-05-27) - Embedded files support (Factur-X 1.07 / ZUGFeRD 2.3) #789 @@ -1822,7 +1839,7 @@ addTOCPage(), endTOCPage(), addHTMLTOC(). 5.0.000 (2010-05-05) - - Method ImageSVG() was added to embedd SVG images (see example n. 58). Note that not all SVG images are supported. + - Method ImageSVG() was added to embed SVG images (see example n. 58). Note that not all SVG images are supported. - Method setRasterizeVectorImages() was added to enable/disable rasterization for vector images via ImageMagick library. - Method RoundedRectXY() was added. - Method PieSectorXY() was added. @@ -2549,7 +2566,7 @@ - A bug relative to fill color on next page was fixed. 4.2.007 (2008-11-12) - - The function setListIndentWidth() was added to set custom indentation widht for HTML lists. + - The function setListIndentWidth() was added to set custom indentation width for HTML lists. 4.2.006 (2008-11-06) - A bug relative to HTML justification was fixed. @@ -2743,7 +2760,7 @@ 4.0.011 (2008-07-23) - Font support was improved. - - The folder /fonts/utils contains new utilities and instructions for embedd font files. + - The folder /fonts/utils contains new utilities and instructions for embed font files. - Documentation was updated. 4.0.010 (2008-07-22) diff --git a/lib/tecnickcom/tcpdf/LICENSE.TXT b/lib/tecnickcom/tcpdf/LICENSE.TXT index 4e446a12f..b85904e8b 100644 --- a/lib/tecnickcom/tcpdf/LICENSE.TXT +++ b/lib/tecnickcom/tcpdf/LICENSE.TXT @@ -7,7 +7,7 @@ published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - 2002-2025 Nicola Asuni - Tecnick.com LTD + 2002-2026 Nicola Asuni - Tecnick.com LTD ********************************************************************** ********************************************************************** @@ -15,7 +15,7 @@ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -184,7 +184,7 @@ Library. GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -828,7 +828,7 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -847,14 +847,14 @@ might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see -. +. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. +. ********************************************************************** ********************************************************************** diff --git a/lib/tecnickcom/tcpdf/README.md b/lib/tecnickcom/tcpdf/README.md index 0144f49a1..cc5a2c1e5 100644 --- a/lib/tecnickcom/tcpdf/README.md +++ b/lib/tecnickcom/tcpdf/README.md @@ -6,8 +6,8 @@ * **category** Library * **author** Nicola Asuni -* **copyright** 2002-2025 Nicola Asuni - Tecnick.com LTD -* **license** http://www.gnu.org/copyleft/lesser.html GNU-LGPL v3 (see LICENSE.TXT) +* **copyright** 2002-2026 Nicola Asuni - Tecnick.com LTD +* **license** https://www.gnu.org/copyleft/lesser.html GNU-LGPL v3 (see LICENSE.TXT) * **link** http://www.tcpdf.org * **source** https://github.com/tecnickcom/TCPDF @@ -63,7 +63,7 @@ All the original binary TTF font files have been renamed for compatibility with The binary files (.z) that begins with the prefix "free" have been extracted from the GNU FreeFont collection (GNU-GPLv3). The binary files (.z) that begins with the prefix "pdfa" have been derived from the GNU FreeFont, so they are subject to the same license. For the details of Copyright, License and other information, please check the files inside the directory fonts/freefont-20120503 -Link : http://www.gnu.org/software/freefont/ +Link : https://www.gnu.org/software/freefont/ The binary files (.z) that begins with the prefix "dejavu" have been extracted from the DejaVu fonts 2.33 (Bitstream) collection. For the details of Copyright, License and other information, please check the files inside the directory fonts/dejavu-fonts-ttf-2.33 @@ -80,4 +80,4 @@ https://packages.debian.org/source/stable/icc-profiles-free ## Developer(s) Contact -* Nicola Asuni +*2026 Nicola Asuni diff --git a/lib/tecnickcom/tcpdf/VERSION b/lib/tecnickcom/tcpdf/VERSION index cf79bf90e..1de66e5ff 100644 --- a/lib/tecnickcom/tcpdf/VERSION +++ b/lib/tecnickcom/tcpdf/VERSION @@ -1 +1 @@ -6.10.0 +6.11.0 diff --git a/lib/tecnickcom/tcpdf/composer.json b/lib/tecnickcom/tcpdf/composer.json index 8d7791972..089bb5693 100644 --- a/lib/tecnickcom/tcpdf/composer.json +++ b/lib/tecnickcom/tcpdf/composer.json @@ -12,7 +12,7 @@ "barcodes" ], "homepage": "http://www.tcpdf.org/", - "version": "6.10.0", + "version": "6.11.0", "license": "LGPL-3.0-or-later", "authors": [ { diff --git a/lib/tecnickcom/tcpdf/config/tcpdf_config.php b/lib/tecnickcom/tcpdf/config/tcpdf_config.php index 9888a6778..d430ee4d0 100644 --- a/lib/tecnickcom/tcpdf/config/tcpdf_config.php +++ b/lib/tecnickcom/tcpdf/config/tcpdf_config.php @@ -6,9 +6,9 @@ // // Description : Configuration file for TCPDF. // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2004-2014 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2004-2014 2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // @@ -23,7 +23,7 @@ // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with TCPDF. If not, see . +// along with TCPDF. If not, see . // // See LICENSE.TXT file for more information. //============================================================+ @@ -114,7 +114,7 @@ define ('PDF_HEADER_TITLE', 'TCPDF Example'); /** * Header description string. */ -define ('PDF_HEADER_STRING', "by Nicola Asuni - Tecnick.com\nwww.tcpdf.org"); +define ('PDF_HEADER_STRING', "by2026 Nicola Asuni - Tecnick.com\nwww.tcpdf.org"); /** * Document unit of measure [pt=point, mm=millimeter, cm=centimeter, in=inch]. diff --git a/lib/tecnickcom/tcpdf/include/barcodes/datamatrix.php b/lib/tecnickcom/tcpdf/include/barcodes/datamatrix.php index d1cc6d2a9..77822fdf1 100644 --- a/lib/tecnickcom/tcpdf/include/barcodes/datamatrix.php +++ b/lib/tecnickcom/tcpdf/include/barcodes/datamatrix.php @@ -5,9 +5,9 @@ // Begin : 2010-06-07 // Last Update : 2014-05-06 // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2010-2014 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2010-2014 2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // @@ -22,7 +22,7 @@ // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with TCPDF. If not, see . +// along with TCPDF. If not, see . // // See LICENSE.TXT file for more information. // ------------------------------------------------------------------- diff --git a/lib/tecnickcom/tcpdf/include/barcodes/pdf417.php b/lib/tecnickcom/tcpdf/include/barcodes/pdf417.php index bda24822f..4c9a4b3d1 100644 --- a/lib/tecnickcom/tcpdf/include/barcodes/pdf417.php +++ b/lib/tecnickcom/tcpdf/include/barcodes/pdf417.php @@ -5,9 +5,9 @@ // Begin : 2010-06-03 // Last Update : 2014-04-25 // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2010-2013 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2010-2013 2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // @@ -22,7 +22,7 @@ // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with TCPDF. If not, see . +// along with TCPDF. If not, see . // // See LICENSE.TXT file for more information. // ------------------------------------------------------------------- diff --git a/lib/tecnickcom/tcpdf/include/barcodes/qrcode.php b/lib/tecnickcom/tcpdf/include/barcodes/qrcode.php index 1a64a4cb5..72cbf15e8 100644 --- a/lib/tecnickcom/tcpdf/include/barcodes/qrcode.php +++ b/lib/tecnickcom/tcpdf/include/barcodes/qrcode.php @@ -5,9 +5,9 @@ // Begin : 2010-03-22 // Last Update : 2012-07-25 // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2010-2012 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2010-2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // @@ -22,7 +22,7 @@ // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with TCPDF. If not, see . +// along with TCPDF. If not, see . // // See LICENSE.TXT file for more information. // ------------------------------------------------------------------- diff --git a/lib/tecnickcom/tcpdf/include/tcpdf_colors.php b/lib/tecnickcom/tcpdf/include/tcpdf_colors.php index 8c4529aff..fc5aeb08f 100644 --- a/lib/tecnickcom/tcpdf/include/tcpdf_colors.php +++ b/lib/tecnickcom/tcpdf/include/tcpdf_colors.php @@ -5,9 +5,9 @@ // Begin : 2002-04-09 // Last Update : 2014-04-25 // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2002-2013 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2002-2013 2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // @@ -22,7 +22,7 @@ // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with TCPDF. If not, see . +// along with TCPDF. If not, see . // // See LICENSE.TXT file for more information. // ------------------------------------------------------------------- diff --git a/lib/tecnickcom/tcpdf/include/tcpdf_filters.php b/lib/tecnickcom/tcpdf/include/tcpdf_filters.php index 3009cff7c..96be66f5d 100644 --- a/lib/tecnickcom/tcpdf/include/tcpdf_filters.php +++ b/lib/tecnickcom/tcpdf/include/tcpdf_filters.php @@ -5,9 +5,9 @@ // Begin : 2011-05-23 // Last Update : 2014-04-25 // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2011-2013 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2011-2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // diff --git a/lib/tecnickcom/tcpdf/include/tcpdf_font_data.php b/lib/tecnickcom/tcpdf/include/tcpdf_font_data.php index 974e72ec7..d7eae2f30 100644 --- a/lib/tecnickcom/tcpdf/include/tcpdf_font_data.php +++ b/lib/tecnickcom/tcpdf/include/tcpdf_font_data.php @@ -5,9 +5,9 @@ // Begin : 2008-01-01 // Last Update : 2013-04-01 // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2008-2013 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2008-2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // @@ -22,7 +22,7 @@ // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with TCPDF. If not, see . +// along with TCPDF. If not, see . // // See LICENSE.TXT file for more information. // ------------------------------------------------------------------- diff --git a/lib/tecnickcom/tcpdf/include/tcpdf_fonts.php b/lib/tecnickcom/tcpdf/include/tcpdf_fonts.php index fbe7009c6..1fc24f5af 100644 --- a/lib/tecnickcom/tcpdf/include/tcpdf_fonts.php +++ b/lib/tecnickcom/tcpdf/include/tcpdf_fonts.php @@ -5,9 +5,9 @@ // Begin : 2008-01-01 // Last Update : 2024-12-23 // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2008-2025 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2008-2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // @@ -22,7 +22,7 @@ // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with TCPDF. If not, see . +// along with TCPDF. If not, see . // // See LICENSE.TXT file for more information. // ------------------------------------------------------------------- @@ -1384,7 +1384,7 @@ class TCPDF_FONTS { } // set checkSumAdjustment on head table $checkSumAdjustment = 0xB1B0AFBA - self::_getTTFtableChecksum($font, strlen($font)); - $font = substr($font, 0, $table['head']['offset'] + $offset + 8).pack('N', $checkSumAdjustment).substr($font, $table['head']['offset'] + $offset + 12); + $font = substr($font, 0, $table['head']['offset'] + $offset + 4).pack('N', $checkSumAdjustment).substr($font, $table['head']['offset'] + $offset + 8); return $font; } diff --git a/lib/tecnickcom/tcpdf/include/tcpdf_images.php b/lib/tecnickcom/tcpdf/include/tcpdf_images.php index 6f2860c60..2d8b96e62 100644 --- a/lib/tecnickcom/tcpdf/include/tcpdf_images.php +++ b/lib/tecnickcom/tcpdf/include/tcpdf_images.php @@ -5,9 +5,9 @@ // Begin : 2002-08-03 // Last Update : 2014-11-15 // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2002-2014 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2002-2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // @@ -126,7 +126,9 @@ class TCPDF_IMAGES { // create temporary PNG image imagepng($image, $tempfile); // remove image from memory - imagedestroy($image); + if (PHP_VERSION_ID < 80000) { + imagedestroy($image); + } // get PNG image data $retvars = self::_parsepng($tempfile); // tidy up by removing temporary image @@ -145,7 +147,9 @@ class TCPDF_IMAGES { */ public static function _toJPEG($image, $quality, $tempfile) { imagejpeg($image, $tempfile, $quality); - imagedestroy($image); + if (PHP_VERSION_ID < 80000) { + imagedestroy($image); + } $retvars = self::_parsejpeg($tempfile); // tidy up by removing temporary image unlink($tempfile); @@ -270,12 +274,12 @@ class TCPDF_IMAGES { return 'pngalpha'; } if (ord(fread($f, 1)) != 0) { - // Unknown compression method + // Unknownn compression method fclose($f); return false; } if (ord(fread($f, 1)) != 0) { - // Unknown filter method + // Unknownn filter method fclose($f); return false; } @@ -327,7 +331,7 @@ class TCPDF_IMAGES { } // get compression method if (ord(fread($f, 1)) != 0) { - // Unknown filter method + // Unknownn filter method fclose($f); return false; } diff --git a/lib/tecnickcom/tcpdf/include/tcpdf_static.php b/lib/tecnickcom/tcpdf/include/tcpdf_static.php index efadc9253..6afddc57f 100644 --- a/lib/tecnickcom/tcpdf/include/tcpdf_static.php +++ b/lib/tecnickcom/tcpdf/include/tcpdf_static.php @@ -5,9 +5,9 @@ // Begin : 2002-08-03 // Last Update : 2024-12-23 // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2002-2025 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2002-2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // @@ -55,7 +55,7 @@ class TCPDF_STATIC { * Current TCPDF version. * @private static */ - private static $tcpdf_version = '6.10.0'; + private static $tcpdf_version = '6.11.0'; /** * String alias for total number of pages. @@ -492,7 +492,7 @@ class TCPDF_STATIC { * @param string $last_enc_key_c Reference to last RC4 computed key. * @return string encrypted text * @since 2.0.000 (2008-01-02) - * @author Klemen Vodopivec, Nicola Asuni + * @author Klemen Vodopivec,2026 Nicola Asuni * @public static */ public static function _RC4($key, $text, &$last_enc_key, &$last_enc_key_c) { @@ -1863,7 +1863,9 @@ class TCPDF_STATIC { curl_setopt_array($crs, $curlopts); curl_exec($crs); $code = curl_getinfo($crs, CURLINFO_HTTP_CODE); - curl_close($crs); + if (PHP_VERSION_ID < 80000) { + curl_close($crs); + } return ($code == 200); } @@ -1995,7 +1997,9 @@ class TCPDF_STATIC { $curlopts[CURLOPT_URL] = $url; curl_setopt_array($crs, $curlopts); $ret = curl_exec($crs); - curl_close($crs); + if (PHP_VERSION_ID < 80000) { + curl_close($crs); + } if ($ret !== false) { return $ret; } diff --git a/lib/tecnickcom/tcpdf/tcpdf.php b/lib/tecnickcom/tcpdf/tcpdf.php index 42c425e98..36f992c53 100644 --- a/lib/tecnickcom/tcpdf/tcpdf.php +++ b/lib/tecnickcom/tcpdf/tcpdf.php @@ -1,13 +1,13 @@ * @package com.tecnick.tcpdf * @author Nicola Asuni - * @version 6.10.0 + * @version 6.11.0 */ // TCPDF configuration @@ -128,7 +128,7 @@ require_once(dirname(__FILE__).'/include/tcpdf_static.php'); * TCPDF project (http://www.tcpdf.org) has been originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.
* @package com.tecnick.tcpdf * @brief PHP class for generating PDF documents without requiring external extensions. - * @version 6.10.0 + * @version 6.11.0 * @author Nicola Asuni - info@tecnick.com * @IgnoreAnnotation("protected") * @IgnoreAnnotation("public") @@ -1131,7 +1131,7 @@ class TCPDF { protected $opencell = true; /** - * Array of files to embedd. + * Array of files to embed. * @protected * @since 4.4.000 (2008-12-07) */ @@ -2907,12 +2907,10 @@ class TCPDF { * @since 1.4 */ public function setCompression($compress=true) { - $this->compress = false; + $this->compress = false; return; if (function_exists('gzcompress')) { if ($compress) { - if ( !$this->pdfa_mode) { - $this->compress = true; - } + $this->compress = true; } } } @@ -4259,7 +4257,7 @@ class TCPDF { * @param string $style Font style. Possible values are (case insensitive):
  • empty string: regular (default)
  • B: bold
  • I: italic
  • BI or IB: bold italic
* @param string $fontfile The font definition file. By default, the name is built from the family and style, in lower case with no spaces. * @return array|false array containing the font data, or false in case of error. - * @param mixed $subset if true embedd only a subset of the font (stores only the information related to the used characters); if false embedd full font; if 'default' uses the default value set using setFontSubsetting(). This option is valid only for TrueTypeUnicode fonts. If you want to enable users to change the document, set this parameter to false. If you subset the font, the person who receives your PDF would need to have your same font in order to make changes to your PDF. The file size of the PDF would also be smaller because you are embedding only part of a font. + * @param mixed $subset if true embed only a subset of the font (stores only the information related to the used characters); if false embed full font; if 'default' uses the default value set using setFontSubsetting(). This option is valid only for TrueTypeUnicode fonts. If you want to enable users to change the document, set this parameter to false. If you subset the font, the person who receives your PDF would need to have your same font in order to make changes to your PDF. The file size of the PDF would also be smaller because you are embedding only part of a font. * @public * @since 1.5 * @see SetFont(), setFontSubsetting() @@ -4439,7 +4437,7 @@ class TCPDF { $this->Error('All fonts must be embedded in PDF/A mode!'); } } else { - $this->Error('Unknow font type: '.$type.''); + $this->Error('Unknown font type: '.$type.''); } // set name if unset if (empty($name)) { @@ -4529,7 +4527,7 @@ class TCPDF { * @param string $style Font style. Possible values are (case insensitive):
  • empty string: regular
  • B: bold
  • I: italic
  • U: underline
  • D: line through
  • O: overline
or any combination. The default value is regular. Bold and italic styles do not apply to Symbol and ZapfDingbats basic fonts or other fonts when not defined. * @param float|null $size Font size in points. The default value is the current size. If no size has been specified since the beginning of the document, the value taken is 12 * @param string $fontfile The font definition file. By default, the name is built from the family and style, in lower case with no spaces. - * @param mixed $subset if true embedd only a subset of the font (stores only the information related to the used characters); if false embedd full font; if 'default' uses the default value set using setFontSubsetting(). This option is valid only for TrueTypeUnicode fonts. If you want to enable users to change the document, set this parameter to false. If you subset the font, the person who receives your PDF would need to have your same font in order to make changes to your PDF. The file size of the PDF would also be smaller because you are embedding only part of a font. + * @param mixed $subset if true embed only a subset of the font (stores only the information related to the used characters); if false embed full font; if 'default' uses the default value set using setFontSubsetting(). This option is valid only for TrueTypeUnicode fonts. If you want to enable users to change the document, set this parameter to false. If you subset the font, the person who receives your PDF would need to have your same font in order to make changes to your PDF. The file size of the PDF would also be smaller because you are embedding only part of a font. * @param boolean $out if true output the font size command, otherwise only set the font properties. * @author Nicola Asuni * @public @@ -5001,11 +4999,10 @@ class TCPDF { $filter = ''; if ($this->compress) { $data = gzcompress($data); - $filter = ' /Filter /FlateDecode'; + $filter .= ' /Filter /FlateDecode'; } - if ($this->pdfa_version == 3) { - $filter = ' /Subtype /text#2Fxml'; + $filter .= ' /Subtype /text#2Fxml'; } $stream = $this->_getrawstream($data, $filedata['n']); @@ -6271,7 +6268,7 @@ class TCPDF { * @param array|null $cellpadding Internal cell padding, if empty uses default cell padding. * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:
  • 0: no border (default)
  • 1: frame
or a string containing some or all of the following characters (in any order):
  • L: left
  • T: top
  • R: right
  • B: bottom
or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) * @return float Return the minimal height needed for multicell method for printing the $txt param. - * @author Alexander Escalona Fern\E1ndez, Nicola Asuni + * @author Alexander Escalona Fern\E1ndez,2026 Nicola Asuni * @public * @since 4.5.011 */ @@ -6467,7 +6464,7 @@ class TCPDF { // replacement for SHY character (minus symbol) $shy_replacement = 45; $shy_replacement_char = TCPDF_FONTS::unichr($shy_replacement, $this->isunicode); - // widht for SHY replacement + // width for SHY replacement $shy_replacement_width = $this->GetCharWidth($shy_replacement); // page width $pw = $w = $this->w - $this->lMargin - $this->rMargin; @@ -6925,8 +6922,8 @@ class TCPDF { // fallback to avoid division by zero $h = $h == 0 ? 1 : $h; $ratio_wh = ($w / $h); - if (($y + $h) > $this->PageBreakTrigger) { - $h = $this->PageBreakTrigger - $y; + if (($y + $h) > $this->PageBreakTrigger + $this->bMargin) { + $h = $this->PageBreakTrigger + $this->bMargin - $y; $w = ($h * $ratio_wh); } if ((!$this->rtl) AND (($x + $w) > ($this->w - $this->rMargin))) { @@ -7440,12 +7437,16 @@ class TCPDF { } } imagepng($imgalpha, $tempfile_alpha); - imagedestroy($imgalpha); + if (PHP_VERSION_ID < 80000) { + imagedestroy($imgalpha); + } // extract image without alpha channel $imgplain = imagecreatetruecolor($wpx, $hpx); imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx); imagepng($imgplain, $tempfile_plain); - imagedestroy($imgplain); + if (PHP_VERSION_ID < 80000) { + imagedestroy($imgplain); + } $parsed = true; } catch (Exception $e) { // GD fails @@ -7887,7 +7888,7 @@ class TCPDF { * @since 4.5.016 (2009-02-24) */ public function _destroy($destroyall=false, $preserve_objcopy=false) { - if (isset(self::$cleaned_ids[$this->file_id])) { + if (isset($this->file_id) && isset(self::$cleaned_ids[$this->file_id])) { $destroyall = false; } if ($destroyall AND !$preserve_objcopy && isset($this->file_id)) { @@ -8935,7 +8936,7 @@ class TCPDF { $this->_out('<< /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.'] >>'."\n".'endobj'); } foreach ($this->FontFiles as $file => $info) { - // search and get font file to embedd + // search and get font file to embed $fontfile = TCPDF_FONTS::getFontFullPath($file, $info['fontdir']); if (!TCPDF_STATIC::empty_string($fontfile)) { $font = file_get_contents($fontfile); @@ -9150,9 +9151,9 @@ class TCPDF { $this->_newobj(); // Embed CIDToGIDMap // A specification of the mapping from CIDs to glyph indices - // search and get CTG font file to embedd + // search and get CTG font file to embed $ctgfile = strtolower($font['ctg']); - // search and get ctg font file to embedd + // search and get ctg font file to embed $fontfile = TCPDF_FONTS::getFontFullPath($ctgfile, $fontdir); if (TCPDF_STATIC::empty_string($fontfile)) { $this->Error('Font file not found: '.$ctgfile); @@ -9177,7 +9178,7 @@ class TCPDF { * A Type 0 CIDFont contains glyph descriptions based on the Adobe Type 1 font format * @param array $font font data * @protected - * @author Andrew Whitehead, Nicola Asuni, Yukihiro Nakadaira + * @author Andrew Whitehead,2026 Nicola Asuni, Yukihiro Nakadaira * @since 3.2.000 (2008-06-23) */ protected function _putcidfont0($font) { @@ -12331,7 +12332,7 @@ class TCPDF { * @param int $head_style (0 = draw only arrowhead arms, 1 = draw closed arrowhead, but no fill, 2 = closed and filled arrowhead, 3 = filled arrowhead) * @param float $arm_size length of arrowhead arms * @param int $arm_angle angle between an arm and the shaft - * @author Piotr Galecki, Nicola Asuni, Andy Meier + * @author Piotr Galecki,2026 Nicola Asuni, Andy Meier * @since 4.6.018 (2009-07-10) */ public function Arrow($x0, $y0, $x1, $y1, $head_style=0, $arm_size=5, $arm_angle=15) { @@ -12396,7 +12397,7 @@ class TCPDF { * @param float $x X position in user units of the destiantion on the selected page (default = -1 = current position;). * @return string|false Stripped named destination identifier or false in case of error. * @public - * @author Christian Deligant, Nicola Asuni + * @author Christian Deligant,2026 Nicola Asuni * @since 5.9.097 (2011-06-23) */ public function setDestination($name, $y=-1, $page='', $x=-1) { @@ -12449,7 +12450,7 @@ class TCPDF { /** * Insert Named Destinations. * @protected - * @author Johannes G\FCntert, Nicola Asuni + * @author Johannes G\FCntert,2026 Nicola Asuni * @since 5.9.098 (2011-06-23) */ protected function _putdests() { @@ -12558,7 +12559,7 @@ class TCPDF { /** * Create a bookmark PDF string. * @protected - * @author Olivier Plathey, Nicola Asuni + * @author Olivier Plathey,2026 Nicola Asuni * @since 2.1.002 (2008-02-12) */ protected function _putbookmarks() { @@ -12684,7 +12685,7 @@ class TCPDF { * Adds a javascript * @param string $script Javascript code * @public - * @author Johannes G\FCntert, Nicola Asuni + * @author Johannes G\FCntert,2026 Nicola Asuni * @since 2.1.002 (2008-02-12) */ public function IncludeJS($script) { @@ -12713,7 +12714,7 @@ class TCPDF { /** * Create a javascript PDF string. * @protected - * @author Johannes G\FCntert, Nicola Asuni + * @author Johannes G\FCntert,2026 Nicola Asuni * @since 2.1.002 (2008-02-12) */ protected function _putjavascript() { @@ -12771,7 +12772,7 @@ class TCPDF { * @param int $h height * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. * @protected - * @author Denis Van Nuffelen, Nicola Asuni + * @author Denis Van Nuffelen,2026 Nicola Asuni * @since 2.1.002 (2008-02-12) */ protected function _addfield($type, $name, $x, $y, $w, $h, $prop) { @@ -14504,7 +14505,7 @@ class TCPDF { * @param array $col1 first color (Grayscale, RGB or CMYK components). * @param array $col2 second color (Grayscale, RGB or CMYK components). * @param array $coords array of the form (x1, y1, x2, y2) which defines the gradient vector (see linear_gradient_coords.jpg). The default value is from left to right (x1=0, y1=0, x2=1, y2=0). - * @author Andreas W\FCrmser, Nicola Asuni + * @author Andreas W\FCrmser,2026 Nicola Asuni * @since 3.1.000 (2008-06-09) * @public */ @@ -14522,7 +14523,7 @@ class TCPDF { * @param array $col1 first color (Grayscale, RGB or CMYK components). * @param array $col2 second color (Grayscale, RGB or CMYK components). * @param array $coords array of the form (fx, fy, cx, cy, r) where (fx, fy) is the starting point of the gradient with color1, (cx, cy) is the center of the circle with color2, and r is the radius of the circle (see radial_gradient_coords.jpg). (fx, fy) should be inside the circle, otherwise some areas will not be defined. - * @author Andreas W\FCrmser, Nicola Asuni + * @author Andreas W\FCrmser,2026 Nicola Asuni * @since 3.1.000 (2008-06-09) * @public */ @@ -14545,7 +14546,7 @@ class TCPDF { * @param array $coords_min minimum value used by the coordinates. If a coordinate's value is smaller than this it will be cut to coords_min. default: 0 * @param array $coords_max maximum value used by the coordinates. If a coordinate's value is greater than this it will be cut to coords_max. default: 1 * @param boolean $antialias A flag indicating whether to filter the shading function to prevent aliasing artifacts. - * @author Andreas W\FCrmser, Nicola Asuni + * @author Andreas W\FCrmser,2026 Nicola Asuni * @since 3.1.000 (2008-06-09) * @public */ @@ -14637,7 +14638,7 @@ class TCPDF { * @param float $y ordinate of the top left corner of the rectangle. * @param float $w width of the rectangle. * @param float $h height of the rectangle. - * @author Andreas W\FCrmser, Nicola Asuni + * @author Andreas W\FCrmser,2026 Nicola Asuni * @since 3.1.000 (2008-06-09) * @protected */ @@ -14963,7 +14964,7 @@ class TCPDF { * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. * @param float $cw indicates whether to go clockwise (default: true). * @param float $o origin of angles (0 for 3 o'clock, 90 for noon, 180 for 9 o'clock, 270 for 6 o'clock). Default: 90. - * @author Maxime Delorme, Nicola Asuni + * @author Maxime Delorme,2026 Nicola Asuni * @since 3.1.000 (2008-06-09) * @public */ @@ -14984,7 +14985,7 @@ class TCPDF { * @param float $cw indicates whether to go clockwise. * @param float $o origin of angles (0 for 3 o'clock, 90 for noon, 180 for 9 o'clock, 270 for 6 o'clock). * @param integer $nc Number of curves used to draw a 90 degrees portion of arc. - * @author Maxime Delorme, Nicola Asuni + * @author Maxime Delorme,2026 Nicola Asuni * @since 3.1.000 (2008-06-09) * @public */ @@ -15028,7 +15029,7 @@ class TCPDF { * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:
  • 0: no border (default)
  • 1: frame
or a string containing some or all of the following characters (in any order):
  • L: left
  • T: top
  • R: right
  • B: bottom
or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))) * @param boolean $fitonpage if true the image is resized to not exceed page dimensions. * @param boolean $fixoutvals if true remove values outside the bounding box. - * @author Valentin Schmidt, Nicola Asuni + * @author Valentin Schmidt,2026 Nicola Asuni * @since 3.1.000 (2008-06-09) * @public */ @@ -16452,7 +16453,7 @@ class TCPDF { * @since 3.2.000 (2008-06-20) */ protected function getHtmlDomArray($html) { - // set inheritable properties fot the first void element + // set inheritable properties for the first void element // possible inheritable properties are: azimuth, border-collapse, border-spacing, caption-side, color, cursor, direction, empty-cells, font, font-family, font-stretch, font-size, font-size-adjust, font-style, font-variant, font-weight, letter-spacing, line-height, list-style, list-style-image, list-style-position, list-style-type, orphans, page, page-break-inside, quotes, speak, speak-header, text-align, text-indent, text-transform, volume, white-space, widows, word-spacing $dom = array( array( @@ -16918,7 +16919,7 @@ class TCPDF { $dom[$key]['height'] = $dom[$key]['style']['height']; } // check for text alignment - if (isset($dom[$key]['style']['text-align'])) { + if (isset($dom[$key]['style']['text-align'][0])) { $dom[$key]['align'] = strtoupper($dom[$key]['style']['text-align'][0]); } // check for CSS border properties @@ -23268,8 +23269,11 @@ class TCPDF { $error_message = sprintf('SVG Error: %s at line %d', xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser)); $this->Error($error_message); } - // free this XML parser - xml_parser_free($parser); + + // free this XML parser (does nothing in PHP >= 8.0) + if (function_exists('xml_parser_free') && PHP_VERSION_ID < 80000) { + xml_parser_free($parser); + } // >= PHP 7.0.0 "explicitly unset the reference to parser to avoid memory leaks" unset($parser); @@ -23500,7 +23504,8 @@ class TCPDF { $gradient['coords'][4] /= $w; } elseif ($gradient['mode'] == 'percentage') { foreach($gradient['coords'] as $key => $val) { - $gradient['coords'][$key] = (intval($val) / 100); + $val = floatval($val) / 100; + $gradient['coords'][$key] = $val; if ($val < 0) { $gradient['coords'][$key] = 0; } elseif ($val > 1) { @@ -23725,9 +23730,11 @@ class TCPDF { } $params = array(); if (isset($val[2])) { - // get curve parameters - preg_match_all('/-?\d*\.?\d+/', trim($val[2]), $matches); - $rawparams = $matches[0]; + // get curve parameters, see https://github.com/tecnickcom/TCPDF/issues/767 + $rawparams = preg_split('/([\,\s]+)/si', trim($val[2])); + $rawparams = array_filter($rawparams, function($p) { + return trim($p) != ''; + }); $params = array(); foreach ($rawparams as $ck => $cp) { $params[$ck] = $this->getHTMLUnitToUnits($cp, 0, $this->svgunit, false); @@ -24424,6 +24431,7 @@ class TCPDF { } $this->StopTransform(); } + break; } case 'ellipse': { @@ -24737,7 +24745,7 @@ class TCPDF { */ protected function endSVGElementHandler($parser, $name) { $name = $this->removeTagNamespace($name); - if ($this->svgdefsmode AND !in_array($name, array('defs', 'clipPath', 'linearGradient', 'radialGradient', 'stop'))) {; + if ($this->svgdefsmode AND !in_array($name, array('defs', 'clipPath', 'linearGradient', 'radialGradient', 'stop'))) { if (end($this->svgdefs) !== FALSE) { $last_svgdefs_id = key($this->svgdefs); if (isset($this->svgdefs[$last_svgdefs_id]['attribs']['child_elements'])) { diff --git a/lib/tecnickcom/tcpdf/tcpdf_autoconfig.php b/lib/tecnickcom/tcpdf/tcpdf_autoconfig.php index d31ee87ed..dd1404e09 100644 --- a/lib/tecnickcom/tcpdf/tcpdf_autoconfig.php +++ b/lib/tecnickcom/tcpdf/tcpdf_autoconfig.php @@ -5,9 +5,9 @@ // Begin : 2013-05-16 // Last Update : 2025-04-18 // Authors : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2011-2025 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2011-2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // @@ -154,7 +154,7 @@ if (!defined('PDF_HEADER_TITLE')) { } if (!defined('PDF_HEADER_STRING')) { - define ('PDF_HEADER_STRING', "by Nicola Asuni - Tecnick.com\nwww.tcpdf.org"); + define ('PDF_HEADER_STRING', "by2026 Nicola Asuni - Tecnick.com\nwww.tcpdf.org"); } if (!defined('PDF_UNIT')) { @@ -206,7 +206,7 @@ if (!defined('PDF_FONT_MONOSPACED')) { } if (!defined('PDF_IMAGE_SCALE_RATIO')) { - define ('PDF_IMAGE_SCALE_RATIO', 1.25); + define ('PDF_IMAGE_SCALE_RATIO', 96/72); } if (!defined('HEAD_MAGNIFICATION')) { diff --git a/lib/tecnickcom/tcpdf/tcpdf_barcodes_1d.php b/lib/tecnickcom/tcpdf/tcpdf_barcodes_1d.php index 45d35616c..34cb6da17 100644 --- a/lib/tecnickcom/tcpdf/tcpdf_barcodes_1d.php +++ b/lib/tecnickcom/tcpdf/tcpdf_barcodes_1d.php @@ -5,9 +5,9 @@ // Begin : 2008-06-09 // Last Update : 2014-10-20 // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2008-2014 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2008-2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // @@ -22,7 +22,7 @@ // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with TCPDF. If not, see . +// along with TCPDF. If not, see . // // See LICENSE.TXT file for more information. // ------------------------------------------------------------------- @@ -234,7 +234,9 @@ class TCPDFBarcode { ob_start(); imagepng($png); $imagedata = ob_get_clean(); - imagedestroy($png); + if (PHP_VERSION_ID < 80000) { + imagedestroy($png); + } return $imagedata; } } diff --git a/lib/tecnickcom/tcpdf/tcpdf_barcodes_2d.php b/lib/tecnickcom/tcpdf/tcpdf_barcodes_2d.php index 730361bd8..0e1163653 100644 --- a/lib/tecnickcom/tcpdf/tcpdf_barcodes_2d.php +++ b/lib/tecnickcom/tcpdf/tcpdf_barcodes_2d.php @@ -5,9 +5,9 @@ // Begin : 2009-04-07 // Last Update : 2014-05-20 // Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2009-2014 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2009-2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // @@ -22,7 +22,7 @@ // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License -// along with TCPDF. If not, see . +// along with TCPDF. If not, see . // // See LICENSE.TXT file for more information. // ------------------------------------------------------------------- @@ -238,7 +238,9 @@ class TCPDF2DBarcode { ob_start(); imagepng($png); $imagedata = ob_get_clean(); - imagedestroy($png); + if (PHP_VERSION_ID < 80000) { + imagedestroy($png); + } return $imagedata; } } diff --git a/lib/tecnickcom/tcpdf/tools/tcpdf_addfont.php b/lib/tecnickcom/tcpdf/tools/tcpdf_addfont.php old mode 100755 new mode 100644 index 2937c7564..e1a2b32e5 --- a/lib/tecnickcom/tcpdf/tools/tcpdf_addfont.php +++ b/lib/tecnickcom/tcpdf/tools/tcpdf_addfont.php @@ -7,9 +7,9 @@ // Last Update : 2013-08-05 // Authors : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com // Remi Collet -// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) +// License : GNU-LGPL v3 (https://www.gnu.org/copyleft/lesser.html) // ------------------------------------------------------------------- -// Copyright (C) 2011-2013 Nicola Asuni - Tecnick.com LTD +// Copyright (C) 2011-2026 Nicola Asuni - Tecnick.com LTD // // This file is part of TCPDF software library. // diff --git a/lib/thenetworg/oauth2-azure/README.md b/lib/thenetworg/oauth2-azure/README.md index ef1546ac2..d0517b7bc 100644 --- a/lib/thenetworg/oauth2-azure/README.md +++ b/lib/thenetworg/oauth2-azure/README.md @@ -228,7 +228,9 @@ With version 1.2.0 you can now use this library to protect your API with Azure A ```php // Assuming you have already initialized the $provider -// Obtain the accessToken - in this case, we are getting it from Authorization header +// Obtain the accessToken - in this case, we are getting it from Authorization header. +// If you're instead using a persisted access token you got from $provider->getAccessToken, +// you'll have to feed its id token to validateAccessToken like so: $provider->validateAccessToken($accessTokenn->getIdToken()); $headers = getallheaders(); // Assuming you got the value of Authorization header as "Bearer [the_access_token]" we parse it $authorization = explode(' ', $headers['Authorization']); diff --git a/lib/thenetworg/oauth2-azure/composer.json b/lib/thenetworg/oauth2-azure/composer.json index 51cdafb5c..cbc79f90a 100644 --- a/lib/thenetworg/oauth2-azure/composer.json +++ b/lib/thenetworg/oauth2-azure/composer.json @@ -26,7 +26,7 @@ "ext-openssl": "*", "php": "^7.1|^8.0", "league/oauth2-client": "~2.0", - "firebase/php-jwt": "~3.0||~4.0||~5.0||~6.0" + "firebase/php-jwt": "~3.0||~4.0||~5.0||~6.0||~7.0" }, "autoload": { "psr-4": { diff --git a/lib/thenetworg/oauth2-azure/src/Grant/JwtBearer.php b/lib/thenetworg/oauth2-azure/src/Grant/JwtBearer.php index c23772855..ec064e1ac 100644 --- a/lib/thenetworg/oauth2-azure/src/Grant/JwtBearer.php +++ b/lib/thenetworg/oauth2-azure/src/Grant/JwtBearer.php @@ -4,12 +4,12 @@ namespace TheNetworg\OAuth2\Client\Grant; class JwtBearer extends \League\OAuth2\Client\Grant\AbstractGrant { - protected function getName() + protected function getName(): string { return 'urn:ietf:params:oauth:grant-type:jwt-bearer'; } - protected function getRequiredRequestParameters() + protected function getRequiredRequestParameters(): array { return [ 'requested_token_use', diff --git a/lib/thenetworg/oauth2-azure/src/Provider/Azure.php b/lib/thenetworg/oauth2-azure/src/Provider/Azure.php index bf9c7539d..9f0ff660f 100644 --- a/lib/thenetworg/oauth2-azure/src/Provider/Azure.php +++ b/lib/thenetworg/oauth2-azure/src/Provider/Azure.php @@ -89,7 +89,7 @@ class Azure extends AbstractProvider if (!array_key_exists($version, $this->openIdConfiguration[$tenant])) { $versionInfix = $this->getVersionUriInfix($version); $openIdConfigurationUri = $this->urlLogin . $tenant . $versionInfix . '/.well-known/openid-configuration?appid=' . $this->clientId; - + $factory = $this->getRequestFactory(); $request = $factory->getRequestWithOptions( 'get', @@ -161,6 +161,11 @@ class Azure extends AbstractProvider $options['resource'] = $this->resource ? $this->resource : $this->urlAPI; } } + + if (empty($options['scope'])) { + $options['scope'] = $this->getDefaultScopes(); + } + return parent::getAccessToken($grant, $options); } @@ -324,7 +329,9 @@ class Azure extends AbstractProvider $logoutUri = $openIdConfiguration['end_session_endpoint']; if (!empty($post_logout_redirect_uri)) { - $logoutUri .= '?post_logout_redirect_uri=' . rawurlencode($post_logout_redirect_uri); + $query = parse_url($logoutUri, PHP_URL_QUERY); + $logoutUri .= $query ? '&' : '?'; + $logoutUri .= 'post_logout_redirect_uri=' . rawurlencode($post_logout_redirect_uri); } return $logoutUri; @@ -356,21 +363,21 @@ class Azure extends AbstractProvider */ public function validateTokenClaims($tokenClaims) { if ($this->getClientId() != $tokenClaims['aud']) { - throw new \RuntimeException('The client_id / audience is invalid!'); + throw new \RuntimeException('The audience claim of the token does not match the configured Client ID.'); } - if ($tokenClaims['nbf'] > time() || $tokenClaims['exp'] < time()) { + if ($tokenClaims['nbf'] > time() + JWT::$leeway || $tokenClaims['exp'] < time() - JWT::$leeway) { // Additional validation is being performed in firebase/JWT itself - throw new \RuntimeException('The id_token is invalid!'); + throw new \RuntimeException(sprintf('The token is not yet valid or has already expired. Verify whether your system clock is skewed, the current time is %s.', date('c'))); } - if ('common' == $this->tenant) { - $this->tenant = $tokenClaims['tid']; + if ('common' === $this->tenant) { + $this->tenant = $tokenClaims['tid'] ?? null; } $version = array_key_exists('ver', $tokenClaims) ? $tokenClaims['ver'] : $this->defaultEndPointVersion; $tenant = $this->getTenantDetails($this->tenant, $version); if ($tokenClaims['iss'] != $tenant['issuer']) { - throw new \RuntimeException('Invalid token issuer (tokenClaims[iss]' . $tokenClaims['iss'] . ', tenant[issuer] ' . $tenant['issuer'] . ')!'); + throw new \RuntimeException(sprintf('The token issuer "%s" does not match the tenant configuration of "%s".', $tokenClaims['iss'], $tenant['issuer'])); } } @@ -526,7 +533,7 @@ class Azure extends AbstractProvider */ protected function createResourceOwner(array $response, \League\OAuth2\Client\Token\AccessToken $token): AzureResourceOwner { - return new AzureResourceOwner($response); + return new AzureResourceOwner($response, $token); } private function wrapResponse($response) diff --git a/lib/thenetworg/oauth2-azure/src/Provider/AzureResourceOwner.php b/lib/thenetworg/oauth2-azure/src/Provider/AzureResourceOwner.php index 337ae5125..b50cf40ef 100644 --- a/lib/thenetworg/oauth2-azure/src/Provider/AzureResourceOwner.php +++ b/lib/thenetworg/oauth2-azure/src/Provider/AzureResourceOwner.php @@ -3,6 +3,7 @@ namespace TheNetworg\OAuth2\Client\Provider; use League\OAuth2\Client\Provider\ResourceOwnerInterface; +use TheNetworg\OAuth2\Client\Token\AccessToken; class AzureResourceOwner implements ResourceOwnerInterface { @@ -13,14 +14,21 @@ class AzureResourceOwner implements ResourceOwnerInterface */ protected $data; + /** + * @var AccessToken + */ + protected $token; + /** * Creates new azure resource owner. * * @param array $data + * @param AccessToken $token */ - public function __construct($data = []) + public function __construct(array $data, AccessToken $token) { $this->data = $data; + $this->token = $token; } /** @@ -53,6 +61,16 @@ class AzureResourceOwner implements ResourceOwnerInterface return $this->claim('family_name'); } + /** + * Retrieves preferred username of resource owner. + * + * @return string|null + */ + public function getPreferredUsername() + { + return $this->claim('preferred_username'); + } + /** * Retrieves user principal name of resource owner. * @@ -63,6 +81,16 @@ class AzureResourceOwner implements ResourceOwnerInterface return $this->claim('upn'); } + /** + * Retrieves email of resource owner. + * + * @return string|null + */ + public function getEmail() + { + return $this->claim('email'); + } + /** * Retrieves tenant id of resource owner. * @@ -94,4 +122,12 @@ class AzureResourceOwner implements ResourceOwnerInterface { return $this->data; } + + /** + * @return AccessToken + */ + public function getToken() + { + return $this->token; + } } diff --git a/tests/php-code-style/composer.lock b/tests/php-code-style/composer.lock index 0584bac3a..a5fde11ff 100644 --- a/tests/php-code-style/composer.lock +++ b/tests/php-code-style/composer.lock @@ -403,16 +403,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.89.0", + "version": "v3.94.2", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "4dd6768cb7558440d27d18f54909eee417317ce9" + "reference": "7787ceff91365ba7d623ec410b8f429cdebb4f63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/4dd6768cb7558440d27d18f54909eee417317ce9", - "reference": "4dd6768cb7558440d27d18f54909eee417317ce9", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/7787ceff91365ba7d623ec410b8f429cdebb4f63", + "reference": "7787ceff91365ba7d623ec410b8f429cdebb4f63", "shasum": "" }, "require": { @@ -429,31 +429,32 @@ "react/event-loop": "^1.5", "react/socket": "^1.16", "react/stream": "^1.4", - "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0", - "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0", - "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0", - "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0", - "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0", - "symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0", + "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0 || ^8.0", + "symfony/console": "^5.4.47 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/event-dispatcher": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/filesystem": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/finder": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", + "symfony/options-resolver": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0", "symfony/polyfill-mbstring": "^1.33", "symfony/polyfill-php80": "^1.33", "symfony/polyfill-php81": "^1.33", "symfony/polyfill-php84": "^1.33", - "symfony/process": "^5.4.47 || ^6.4.24 || ^7.2", - "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0" + "symfony/process": "^5.4.47 || ^6.4.24 || ^7.2 || ^8.0", + "symfony/stopwatch": "^5.4.45 || ^6.4.24 || ^7.0 || ^8.0" }, "require-dev": { - "facile-it/paraunit": "^1.3.1 || ^2.7", - "infection/infection": "^0.31.0", - "justinrainbow/json-schema": "^6.5", - "keradus/cli-executor": "^2.2", + "facile-it/paraunit": "^1.3.1 || ^2.7.1", + "infection/infection": "^0.32.3", + "justinrainbow/json-schema": "^6.6.4", + "keradus/cli-executor": "^2.3", "mikey179/vfsstream": "^1.6.12", - "php-coveralls/php-coveralls": "^2.8", - "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6", - "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6", - "phpunit/phpunit": "^9.6.25 || ^10.5.53 || ^11.5.34", - "symfony/var-dumper": "^5.4.48 || ^6.4.24 || ^7.3.2", - "symfony/yaml": "^5.4.45 || ^6.4.24 || ^7.3.2" + "php-coveralls/php-coveralls": "^2.9.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.7", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.7", + "phpunit/phpunit": "^9.6.34 || ^10.5.63 || ^11.5.51", + "symfony/polyfill-php85": "^1.33", + "symfony/var-dumper": "^5.4.48 || ^6.4.32 || ^7.4.4 || ^8.0.4", + "symfony/yaml": "^5.4.45 || ^6.4.30 || ^7.4.1 || ^8.0.1" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -468,7 +469,7 @@ "PhpCsFixer\\": "src/" }, "exclude-from-classmap": [ - "src/Fixer/Internal/*" + "src/**/Internal/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -494,7 +495,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.89.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.94.2" }, "funding": [ { @@ -502,15 +503,15 @@ "type": "github" } ], - "time": "2025-10-18T19:30:16+00:00" + "time": "2026-02-20T16:13:53+00:00" }, { "name": "phpstan/phpstan", - "version": "2.1.31", + "version": "2.1.40", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ead89849d879fe203ce9292c6ef5e7e76f867b96", - "reference": "ead89849d879fe203ce9292c6ef5e7e76f867b96", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", + "reference": "9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", "shasum": "" }, "require": { @@ -555,26 +556,31 @@ "type": "github" } ], - "time": "2025-10-10T14:14:11+00:00" + "time": "2026-02-23T15:04:35+00:00" }, { "name": "psr/container", - "version": "1.1.2", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -601,9 +607,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "psr/event-dispatcher", @@ -657,30 +663,30 @@ }, { "name": "psr/log", - "version": "1.1.4", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -701,9 +707,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "react/cache", @@ -779,16 +785,16 @@ }, { "name": "react/child-process", - "version": "v0.6.6", + "version": "v0.6.7", "source": { "type": "git", "url": "https://github.com/reactphp/child-process.git", - "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159" + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159", - "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/970f0e71945556422ee4570ccbabaedc3cf04ad3", + "reference": "970f0e71945556422ee4570ccbabaedc3cf04ad3", "shasum": "" }, "require": { @@ -842,7 +848,7 @@ ], "support": { "issues": "https://github.com/reactphp/child-process/issues", - "source": "https://github.com/reactphp/child-process/tree/v0.6.6" + "source": "https://github.com/reactphp/child-process/tree/v0.6.7" }, "funding": [ { @@ -850,20 +856,20 @@ "type": "open_collective" } ], - "time": "2025-01-01T16:37:48+00:00" + "time": "2025-12-23T15:25:20+00:00" }, { "name": "react/dns", - "version": "v1.13.0", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/reactphp/dns.git", - "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", - "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "url": "https://api.github.com/repos/reactphp/dns/zipball/7562c05391f42701c1fccf189c8225fece1cd7c3", + "reference": "7562c05391f42701c1fccf189c8225fece1cd7c3", "shasum": "" }, "require": { @@ -918,7 +924,7 @@ ], "support": { "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.13.0" + "source": "https://github.com/reactphp/dns/tree/v1.14.0" }, "funding": [ { @@ -926,20 +932,20 @@ "type": "open_collective" } ], - "time": "2024-06-13T14:18:03+00:00" + "time": "2025-11-18T19:34:28+00:00" }, { "name": "react/event-loop", - "version": "v1.5.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/reactphp/event-loop.git", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", - "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/ba276bda6083df7e0050fd9b33f66ad7a4ac747a", + "reference": "ba276bda6083df7e0050fd9b33f66ad7a4ac747a", "shasum": "" }, "require": { @@ -990,7 +996,7 @@ ], "support": { "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + "source": "https://github.com/reactphp/event-loop/tree/v1.6.0" }, "funding": [ { @@ -998,7 +1004,7 @@ "type": "open_collective" } ], - "time": "2023-11-13T13:48:05+00:00" + "time": "2025-11-17T20:46:25+00:00" }, { "name": "react/promise", @@ -1075,16 +1081,16 @@ }, { "name": "react/socket", - "version": "v1.16.0", + "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/reactphp/socket.git", - "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", - "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "url": "https://api.github.com/repos/reactphp/socket/zipball/ef5b17b81f6f60504c539313f94f2d826c5faa08", + "reference": "ef5b17b81f6f60504c539313f94f2d826c5faa08", "shasum": "" }, "require": { @@ -1143,7 +1149,7 @@ ], "support": { "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.16.0" + "source": "https://github.com/reactphp/socket/tree/v1.17.0" }, "funding": [ { @@ -1151,7 +1157,7 @@ "type": "open_collective" } ], - "time": "2024-07-26T10:38:09+00:00" + "time": "2025-11-19T20:47:34+00:00" }, { "name": "react/stream", @@ -1233,29 +1239,29 @@ }, { "name": "sebastian/diff", - "version": "4.0.6", + "version": "7.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + "reference": "7ab1ea946c012266ca32390913653d844ecd085f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7ab1ea946c012266ca32390913653d844ecd085f", + "reference": "7ab1ea946c012266ca32390913653d844ecd085f", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.3" }, "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" + "phpunit/phpunit": "^12.0", + "symfony/process": "^7.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -1287,7 +1293,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/7.0.0" }, "funding": [ { @@ -1295,56 +1302,51 @@ "type": "github" } ], - "time": "2024-03-02T06:30:58+00:00" + "time": "2025-02-07T04:55:46+00:00" }, { "name": "symfony/console", - "version": "v5.4.47", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed" + "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", - "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed", + "url": "https://api.github.com/repos/symfony/console/zipball/41e38717ac1dd7a46b6bda7d6a82af2d98a78894", + "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" }, "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { - "psr/log-implementation": "1.0|2.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -1378,7 +1380,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.47" + "source": "https://github.com/symfony/console/tree/v7.4.4" }, "funding": [ { @@ -1389,29 +1391,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-06T11:30:55+00:00" + "time": "2026-01-13T11:36:38+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.4", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918", - "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { @@ -1420,7 +1426,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -1445,7 +1451,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -1461,48 +1467,44 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:11:13+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.45", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9" + "reference": "dc2c0eba1af673e736bb851d747d266108aea746" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9", - "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dc2c0eba1af673e736bb851d747d266108aea746", + "reference": "dc2c0eba1af673e736bb851d747d266108aea746", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/event-dispatcher-contracts": "^2|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<4.4" + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/stopwatch": "^4.4|^5.0|^6.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -1530,7 +1532,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.45" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.4" }, "funding": [ { @@ -1541,34 +1543,35 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:11:13+00:00" + "time": "2026-01-05T11:45:34+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.4", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f" + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", - "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.1", "psr/event-dispatcher": "^1" }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, "type": "library", "extra": { "thanks": { @@ -1576,7 +1579,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -1609,7 +1612,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.4" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -1625,30 +1628,29 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:11:13+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.45", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "57c8294ed37d4a055b77057827c67f9558c95c54" + "reference": "d551b38811096d0be9c4691d406991b47c0c630a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54", - "reference": "57c8294ed37d4a055b77057827c67f9558c95c54", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a", + "reference": "d551b38811096d0be9c4691d406991b47c0c630a", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^5.4|^6.4" + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -1676,7 +1678,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.45" + "source": "https://github.com/symfony/filesystem/tree/v7.4.0" }, "funding": [ { @@ -1687,31 +1689,36 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-10-22T13:05:35+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/finder", - "version": "v5.4.45", + "version": "v7.4.5", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "63741784cd7b9967975eec610b256eed3ede022b" + "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b", - "reference": "63741784cd7b9967975eec610b256eed3ede022b", + "url": "https://api.github.com/repos/symfony/finder/zipball/ad4daa7c38668dcb031e63bc99ea9bd42196a2cb", + "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -1739,7 +1746,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.45" + "source": "https://github.com/symfony/finder/tree/v7.4.5" }, "funding": [ { @@ -1750,32 +1757,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-28T13:32:08+00:00" + "time": "2026-01-26T15:07:59+00:00" }, { "name": "symfony/options-resolver", - "version": "v5.4.45", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6" + "reference": "b38026df55197f9e39a44f3215788edf83187b80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6", - "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b38026df55197f9e39a44f3215788edf83187b80", + "reference": "b38026df55197f9e39a44f3215788edf83187b80", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -1808,7 +1817,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v5.4.45" + "source": "https://github.com/symfony/options-resolver/tree/v7.4.0" }, "funding": [ { @@ -1819,12 +1828,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:11:13+00:00" + "time": "2025-11-12T15:39:26+00:00" }, { "name": "symfony/polyfill-ctype", @@ -2161,86 +2174,6 @@ ], "time": "2024-12-23T08:48:59+00:00" }, - { - "name": "symfony/polyfill-php73", - "version": "v1.33.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", - "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, { "name": "symfony/polyfill-php80", "version": "v1.33.0", @@ -2487,21 +2420,20 @@ }, { "name": "symfony/process", - "version": "v5.4.47", + "version": "v7.4.5", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d" + "reference": "608476f4604102976d687c483ac63a79ba18cc97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d", - "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d", + "url": "https://api.github.com/repos/symfony/process/zipball/608476f4604102976d687c483ac63a79ba18cc97", + "reference": "608476f4604102976d687c483ac63a79ba18cc97", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -2529,7 +2461,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.47" + "source": "https://github.com/symfony/process/tree/v7.4.5" }, "funding": [ { @@ -2540,38 +2472,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-06T11:36:42+00:00" + "time": "2026-01-26T15:07:59+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.4", + "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f37b419f7aea2e9abf10abd261832cace12e3300" + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300", - "reference": "f37b419f7aea2e9abf10abd261832cace12e3300", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "thanks": { @@ -2579,13 +2512,16 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2612,7 +2548,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.4" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" }, "funding": [ { @@ -2623,30 +2559,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:11:13+00:00" + "time": "2025-07-15T11:30:57+00:00" }, { "name": "symfony/stopwatch", - "version": "v5.4.45", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004" + "reference": "8a24af0a2e8a872fb745047180649b8418303084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fb2c199cf302eb207f8c23e7ee174c1c31a5c004", - "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8a24af0a2e8a872fb745047180649b8418303084", + "reference": "8a24af0a2e8a872fb745047180649b8418303084", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1|^2|^3" + "php": ">=8.2", + "symfony/service-contracts": "^2.5|^3" }, "type": "library", "autoload": { @@ -2674,7 +2614,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.4.45" + "source": "https://github.com/symfony/stopwatch/tree/v7.4.0" }, "funding": [ { @@ -2685,43 +2625,48 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:11:13+00:00" + "time": "2025-08-04T07:05:15+00:00" }, { "name": "symfony/string", - "version": "v5.4.47", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "136ca7d72f72b599f2631aca474a4f8e26719799" + "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799", - "reference": "136ca7d72f72b599f2631aca474a4f8e26719799", + "url": "https://api.github.com/repos/symfony/string/zipball/1c4b10461bf2ec27537b5f36105337262f5f5d6f", + "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-grapheme": "~1.33", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": ">=3.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -2760,7 +2705,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.47" + "source": "https://github.com/symfony/string/tree/v7.4.4" }, "funding": [ { @@ -2771,12 +2716,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-11-10T20:33:58+00:00" + "time": "2026-01-12T10:54:30+00:00" } ], "aliases": [],