Merge branch 'rhymix:master' into master

This commit is contained in:
Lastorder 2025-03-06 21:57:47 +09:00 committed by GitHub
commit 81d91f2f83
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
130 changed files with 1590 additions and 1557 deletions

View file

@ -124,9 +124,9 @@ class XeXmlParser
$this->oParser = xml_parser_create('UTF-8'); $this->oParser = xml_parser_create('UTF-8');
xml_set_object($this->oParser, $this); //xml_set_object($this->oParser, $this);
xml_set_element_handler($this->oParser, "_tagOpen", "_tagClosed"); xml_set_element_handler($this->oParser, [$this, "_tagOpen"], [$this, "_tagClosed"]);
xml_set_character_data_handler($this->oParser, "_tagBody"); xml_set_character_data_handler($this->oParser, [$this, "_tagBody"]);
xml_parse($this->oParser, $this->input); xml_parse($this->oParser, $this->input);
xml_parser_free($this->oParser); xml_parser_free($this->oParser);

View file

@ -32,12 +32,9 @@ date_default_timezone_set(@date_default_timezone_get());
* Set the default character encoding. * Set the default character encoding.
*/ */
ini_set('default_charset', 'UTF-8'); ini_set('default_charset', 'UTF-8');
if (function_exists('mb_internal_encoding')) if (function_exists('mb_internal_encoding') && function_exists('mb_regex_encoding'))
{ {
mb_internal_encoding('UTF-8'); mb_internal_encoding('UTF-8');
}
if (function_exists('mb_regex_encoding'))
{
mb_regex_encoding('UTF-8'); mb_regex_encoding('UTF-8');
} }

View file

@ -30,10 +30,10 @@
"egulias/email-validator": "3.2.*", "egulias/email-validator": "3.2.*",
"firebase/php-jwt": "6.4.0", "firebase/php-jwt": "6.4.0",
"enshrined/svg-sanitize": "0.*", "enshrined/svg-sanitize": "0.*",
"ezyang/htmlpurifier": "4.16.*", "ezyang/htmlpurifier": "4.18.*",
"google/auth": "1.26.*", "google/auth": "1.26.*",
"guzzlehttp/guzzle": "7.8.*", "guzzlehttp/guzzle": "7.9.*",
"guzzlehttp/psr7": "2.6.*", "guzzlehttp/psr7": "2.7.*",
"jbbcode/jbbcode": "1.4.*", "jbbcode/jbbcode": "1.4.*",
"leafo/lessphp": "dev-master", "leafo/lessphp": "dev-master",
"league/html-to-markdown": "5.1.*", "league/html-to-markdown": "5.1.*",
@ -43,7 +43,7 @@
"michelf/php-smartypants": "1.8.*", "michelf/php-smartypants": "1.8.*",
"psr/cache": "1.0.1", "psr/cache": "1.0.1",
"rmccue/requests": "1.8.*", "rmccue/requests": "1.8.*",
"scssphp/scssphp": "1.12.*", "scssphp/scssphp": "1.13.*",
"swiftmailer/swiftmailer": "6.3.0", "swiftmailer/swiftmailer": "6.3.0",
"symfony/deprecation-contracts": "2.5.*", "symfony/deprecation-contracts": "2.5.*",
"true/punycode": "2.*" "true/punycode": "2.*"

298
common/composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "5102699547080f96f0a7a1aadc220d80", "content-hash": "cc3a39c7eeea460c330f3a68988c3a8a",
"packages": [ "packages": [
{ {
"name": "bordoni/phpass", "name": "bordoni/phpass",
@ -64,16 +64,16 @@
}, },
{ {
"name": "composer/ca-bundle", "name": "composer/ca-bundle",
"version": "1.5.0", "version": "1.5.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/ca-bundle.git", "url": "https://github.com/composer/ca-bundle.git",
"reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99" "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", "url": "https://api.github.com/repos/composer/ca-bundle/zipball/08c50d5ec4c6ced7d0271d2862dec8c1033283e6",
"reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -83,8 +83,8 @@
}, },
"require-dev": { "require-dev": {
"phpstan/phpstan": "^1.10", "phpstan/phpstan": "^1.10",
"psr/log": "^1.0", "phpunit/phpunit": "^8 || ^9",
"symfony/phpunit-bridge": "^4.2 || ^5", "psr/log": "^1.0 || ^2.0 || ^3.0",
"symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
}, },
"type": "library", "type": "library",
@ -120,7 +120,7 @@
"support": { "support": {
"irc": "irc://irc.freenode.org/composer", "irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/ca-bundle/issues", "issues": "https://github.com/composer/ca-bundle/issues",
"source": "https://github.com/composer/ca-bundle/tree/1.5.0" "source": "https://github.com/composer/ca-bundle/tree/1.5.5"
}, },
"funding": [ "funding": [
{ {
@ -136,7 +136,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-03-15T14:00:32+00:00" "time": "2025-01-08T16:17:16+00:00"
}, },
{ {
"name": "coolsms/php-sdk", "name": "coolsms/php-sdk",
@ -341,25 +341,25 @@
}, },
{ {
"name": "enshrined/svg-sanitize", "name": "enshrined/svg-sanitize",
"version": "0.18.0", "version": "0.21.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/darylldoyle/svg-sanitizer.git", "url": "https://github.com/darylldoyle/svg-sanitizer.git",
"reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0" "reference": "5e477468fac5c5ce933dce53af3e8e4e58dcccc9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/6a2c069dab3843ca4d887ff09c972fc7033888d0", "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/5e477468fac5c5ce933dce53af3e8e4e58dcccc9",
"reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0", "reference": "5e477468fac5c5ce933dce53af3e8e4e58dcccc9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-libxml": "*", "ext-libxml": "*",
"php": "^5.6 || ^7.0 || ^8.0" "php": "^7.1 || ^8.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^5.7 || ^6.5 || ^8.5" "phpunit/phpunit": "^6.5 || ^8.5"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -380,26 +380,26 @@
"description": "An SVG sanitizer for PHP", "description": "An SVG sanitizer for PHP",
"support": { "support": {
"issues": "https://github.com/darylldoyle/svg-sanitizer/issues", "issues": "https://github.com/darylldoyle/svg-sanitizer/issues",
"source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.18.0" "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.21.0"
}, },
"time": "2024-02-22T17:51:05+00:00" "time": "2025-01-13T09:32:25+00:00"
}, },
{ {
"name": "ezyang/htmlpurifier", "name": "ezyang/htmlpurifier",
"version": "v4.16.0", "version": "v4.18.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git", "url": "https://github.com/ezyang/htmlpurifier.git",
"reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8" "reference": "cb56001e54359df7ae76dc522d08845dc741621b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8", "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b",
"reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8", "reference": "cb56001e54359df7ae76dc522d08845dc741621b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
}, },
"require-dev": { "require-dev": {
"cerdic/css-tidy": "^1.7 || ^2.0", "cerdic/css-tidy": "^1.7 || ^2.0",
@ -441,9 +441,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/ezyang/htmlpurifier/issues", "issues": "https://github.com/ezyang/htmlpurifier/issues",
"source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0" "source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0"
}, },
"time": "2022-09-18T07:06:19+00:00" "time": "2024-11-01T03:51:45+00:00"
}, },
{ {
"name": "firebase/php-jwt", "name": "firebase/php-jwt",
@ -568,22 +568,22 @@
}, },
{ {
"name": "guzzlehttp/guzzle", "name": "guzzlehttp/guzzle",
"version": "7.8.1", "version": "7.9.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/guzzle.git", "url": "https://github.com/guzzle/guzzle.git",
"reference": "41042bc7ab002487b876a0683fc8dce04ddce104" "reference": "d281ed313b989f213357e3be1a179f02196ac99b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b",
"reference": "41042bc7ab002487b876a0683fc8dce04ddce104", "reference": "d281ed313b989f213357e3be1a179f02196ac99b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-json": "*", "ext-json": "*",
"guzzlehttp/promises": "^1.5.3 || ^2.0.1", "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
"guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "guzzlehttp/psr7": "^2.7.0",
"php": "^7.2.5 || ^8.0", "php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0", "psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0" "symfony/deprecation-contracts": "^2.2 || ^3.0"
@ -594,9 +594,9 @@
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2", "bamarni/composer-bin-plugin": "^1.8.2",
"ext-curl": "*", "ext-curl": "*",
"php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", "guzzle/client-integration-tests": "3.0.2",
"php-http/message-factory": "^1.1", "php-http/message-factory": "^1.1",
"phpunit/phpunit": "^8.5.36 || ^9.6.15", "phpunit/phpunit": "^8.5.39 || ^9.6.20",
"psr/log": "^1.1 || ^2.0 || ^3.0" "psr/log": "^1.1 || ^2.0 || ^3.0"
}, },
"suggest": { "suggest": {
@ -674,7 +674,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/guzzle/issues", "issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/7.8.1" "source": "https://github.com/guzzle/guzzle/tree/7.9.2"
}, },
"funding": [ "funding": [
{ {
@ -690,20 +690,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-12-03T20:35:24+00:00" "time": "2024-07-24T11:22:20+00:00"
}, },
{ {
"name": "guzzlehttp/promises", "name": "guzzlehttp/promises",
"version": "2.0.2", "version": "2.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/promises.git", "url": "https://github.com/guzzle/promises.git",
"reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
"reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -711,7 +711,7 @@
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2", "bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.36 || ^9.6.15" "phpunit/phpunit": "^8.5.39 || ^9.6.20"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -757,7 +757,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/promises/issues", "issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/2.0.2" "source": "https://github.com/guzzle/promises/tree/2.0.4"
}, },
"funding": [ "funding": [
{ {
@ -773,20 +773,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-12-03T20:19:20+00:00" "time": "2024-10-17T10:06:22+00:00"
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
"version": "2.6.2", "version": "2.7.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/psr7.git", "url": "https://github.com/guzzle/psr7.git",
"reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
"reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -801,8 +801,8 @@
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2", "bamarni/composer-bin-plugin": "^1.8.2",
"http-interop/http-factory-tests": "^0.9", "http-interop/http-factory-tests": "0.9.0",
"phpunit/phpunit": "^8.5.36 || ^9.6.15" "phpunit/phpunit": "^8.5.39 || ^9.6.20"
}, },
"suggest": { "suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
@ -873,7 +873,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/psr7/issues", "issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.6.2" "source": "https://github.com/guzzle/psr7/tree/2.7.0"
}, },
"funding": [ "funding": [
{ {
@ -889,7 +889,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-12-03T20:05:35+00:00" "time": "2024-07-18T11:15:46+00:00"
}, },
{ {
"name": "jbbcode/jbbcode", "name": "jbbcode/jbbcode",
@ -1415,20 +1415,20 @@
}, },
{ {
"name": "psr/http-factory", "name": "psr/http-factory",
"version": "1.0.2", "version": "1.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-fig/http-factory.git", "url": "https://github.com/php-fig/http-factory.git",
"reference": "e616d01114759c4c489f93b099585439f795fe35" "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
"reference": "e616d01114759c4c489f93b099585439f795fe35", "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.0.0", "php": ">=7.1",
"psr/http-message": "^1.0 || ^2.0" "psr/http-message": "^1.0 || ^2.0"
}, },
"type": "library", "type": "library",
@ -1452,7 +1452,7 @@
"homepage": "https://www.php-fig.org/" "homepage": "https://www.php-fig.org/"
} }
], ],
"description": "Common interfaces for PSR-7 HTTP message factories", "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
"keywords": [ "keywords": [
"factory", "factory",
"http", "http",
@ -1464,9 +1464,9 @@
"response" "response"
], ],
"support": { "support": {
"source": "https://github.com/php-fig/http-factory/tree/1.0.2" "source": "https://github.com/php-fig/http-factory"
}, },
"time": "2023-04-10T20:10:41+00:00" "time": "2024-04-15T12:06:14+00:00"
}, },
{ {
"name": "psr/http-message", "name": "psr/http-message",
@ -1627,16 +1627,16 @@
}, },
{ {
"name": "scssphp/scssphp", "name": "scssphp/scssphp",
"version": "v1.12.1", "version": "v1.13.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/scssphp/scssphp.git", "url": "https://github.com/scssphp/scssphp.git",
"reference": "394ed1e960138710a60d035c1a85d43d0bf0faeb" "reference": "63d1157457e5554edf00b0c1fabab4c1511d2520"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/scssphp/scssphp/zipball/394ed1e960138710a60d035c1a85d43d0bf0faeb", "url": "https://api.github.com/repos/scssphp/scssphp/zipball/63d1157457e5554edf00b0c1fabab4c1511d2520",
"reference": "394ed1e960138710a60d035c1a85d43d0bf0faeb", "reference": "63d1157457e5554edf00b0c1fabab4c1511d2520",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1665,8 +1665,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"bamarni-bin": { "bamarni-bin": {
"forward-command": false, "bin-links": false,
"bin-links": false "forward-command": false
} }
}, },
"autoload": { "autoload": {
@ -1701,9 +1701,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/scssphp/scssphp/issues", "issues": "https://github.com/scssphp/scssphp/issues",
"source": "https://github.com/scssphp/scssphp/tree/v1.12.1" "source": "https://github.com/scssphp/scssphp/tree/v1.13.0"
}, },
"time": "2024-01-13T12:36:40+00:00" "time": "2024-08-17T21:02:11+00:00"
}, },
{ {
"name": "swiftmailer/swiftmailer", "name": "swiftmailer/swiftmailer",
@ -1783,16 +1783,16 @@
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v2.5.3", "version": "v2.5.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "80d075412b557d41002320b96a096ca65aa2c98d" "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918",
"reference": "80d075412b557d41002320b96a096ca65aa2c98d", "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1800,12 +1800,12 @@
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": { "branch-alias": {
"dev-main": "2.5-dev" "dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
} }
}, },
"autoload": { "autoload": {
@ -1830,7 +1830,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.3" "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4"
}, },
"funding": [ "funding": [
{ {
@ -1846,24 +1846,24 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-01-24T14:02:46+00:00" "time": "2024-09-25T14:11:13+00:00"
}, },
{ {
"name": "symfony/polyfill-iconv", "name": "symfony/polyfill-iconv",
"version": "v1.29.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-iconv.git", "url": "https://github.com/symfony/polyfill-iconv.git",
"reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f" "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f", "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/48becf00c920479ca2e910c22a5a39e5d47ca956",
"reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f", "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"provide": { "provide": {
"ext-iconv": "*" "ext-iconv": "*"
@ -1874,8 +1874,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -1910,7 +1910,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-iconv/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-iconv/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -1926,26 +1926,25 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-29T20:11:03+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{ {
"name": "symfony/polyfill-intl-idn", "name": "symfony/polyfill-intl-idn",
"version": "v1.29.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git", "url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "a287ed7475f85bf6f61890146edbc932c0fff919" "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
"reference": "a287ed7475f85bf6f61890146edbc932c0fff919", "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1", "php": ">=7.2",
"symfony/polyfill-intl-normalizer": "^1.10", "symfony/polyfill-intl-normalizer": "^1.10"
"symfony/polyfill-php72": "^1.10"
}, },
"suggest": { "suggest": {
"ext-intl": "For best performance" "ext-intl": "For best performance"
@ -1953,8 +1952,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -1994,7 +1993,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -2010,24 +2009,24 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-29T20:11:03+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{ {
"name": "symfony/polyfill-intl-normalizer", "name": "symfony/polyfill-intl-normalizer",
"version": "v1.29.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d" "reference": "3833d7255cc303546435cb650316bff708a1c75c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"suggest": { "suggest": {
"ext-intl": "For best performance" "ext-intl": "For best performance"
@ -2035,8 +2034,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -2075,7 +2074,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -2091,24 +2090,24 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-29T20:11:03+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.29.0", "version": "v1.31.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"provide": { "provide": {
"ext-mbstring": "*" "ext-mbstring": "*"
@ -2119,8 +2118,8 @@
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -2155,7 +2154,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -2171,80 +2170,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-01-29T20:11:03+00:00" "time": "2024-09-09T11:45:10+00:00"
},
{
"name": "symfony/polyfill-php72",
"version": "v1.29.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
"reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25",
"reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php72\\": ""
}
},
"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.2+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-01-29T20:11:03+00:00"
}, },
{ {
"name": "true/punycode", "name": "true/punycode",

View file

@ -258,7 +258,12 @@ class URL
$position = 0; $position = 0;
} }
if (function_exists('idn_to_utf8')) $domain = (string)$domain;
if ($domain === '')
{
$new_domain = '';
}
elseif (function_exists('idn_to_utf8'))
{ {
$new_domain = idn_to_utf8($domain); $new_domain = idn_to_utf8($domain);
} }

View file

@ -248,6 +248,7 @@ return array(
'HTMLPurifier_AttrDef_CSS_Multiple' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php', 'HTMLPurifier_AttrDef_CSS_Multiple' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php',
'HTMLPurifier_AttrDef_CSS_Number' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php', 'HTMLPurifier_AttrDef_CSS_Number' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php',
'HTMLPurifier_AttrDef_CSS_Percentage' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php', 'HTMLPurifier_AttrDef_CSS_Percentage' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php',
'HTMLPurifier_AttrDef_CSS_Ratio' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ratio.php',
'HTMLPurifier_AttrDef_CSS_TextDecoration' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php', 'HTMLPurifier_AttrDef_CSS_TextDecoration' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php',
'HTMLPurifier_AttrDef_CSS_URI' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php', 'HTMLPurifier_AttrDef_CSS_URI' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php',
'HTMLPurifier_AttrDef_Clone' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php', 'HTMLPurifier_AttrDef_Clone' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php',
@ -665,7 +666,6 @@ return array(
'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => $vendorDir . '/symfony/polyfill-intl-idn/Resources/unidata/Regex.php', 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => $vendorDir . '/symfony/polyfill-intl-idn/Resources/unidata/Regex.php',
'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php', 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php',
'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
'Symfony\\Polyfill\\Php72\\Php72' => $vendorDir . '/symfony/polyfill-php72/Php72.php',
'TrueBV\\Exception\\DomainOutOfBoundsException' => $vendorDir . '/true/punycode/src/Exception/DomainOutOfBoundsException.php', 'TrueBV\\Exception\\DomainOutOfBoundsException' => $vendorDir . '/true/punycode/src/Exception/DomainOutOfBoundsException.php',
'TrueBV\\Exception\\LabelOutOfBoundsException' => $vendorDir . '/true/punycode/src/Exception/LabelOutOfBoundsException.php', 'TrueBV\\Exception\\LabelOutOfBoundsException' => $vendorDir . '/true/punycode/src/Exception/LabelOutOfBoundsException.php',
'TrueBV\\Exception\\OutOfBoundsException' => $vendorDir . '/true/punycode/src/Exception/OutOfBoundsException.php', 'TrueBV\\Exception\\OutOfBoundsException' => $vendorDir . '/true/punycode/src/Exception/OutOfBoundsException.php',

View file

@ -8,7 +8,6 @@ $baseDir = dirname($vendorDir);
return array( return array(
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',

View file

@ -8,7 +8,6 @@ $baseDir = dirname($vendorDir);
return array( return array(
'enshrined\\svgSanitize\\' => array($vendorDir . '/enshrined/svg-sanitize/src'), 'enshrined\\svgSanitize\\' => array($vendorDir . '/enshrined/svg-sanitize/src'),
'TrueBV\\' => array($vendorDir . '/true/punycode/src'), 'TrueBV\\' => array($vendorDir . '/true/punycode/src'),
'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'), 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'),
'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'), 'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'),

View file

@ -9,7 +9,6 @@ class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
public static $files = array ( public static $files = array (
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@ -30,7 +29,6 @@ class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
), ),
'S' => 'S' =>
array ( array (
'Symfony\\Polyfill\\Php72\\' => 23,
'Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Mbstring\\' => 26,
'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33, 'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33,
'Symfony\\Polyfill\\Intl\\Idn\\' => 26, 'Symfony\\Polyfill\\Intl\\Idn\\' => 26,
@ -91,10 +89,6 @@ class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
array ( array (
0 => __DIR__ . '/..' . '/true/punycode/src', 0 => __DIR__ . '/..' . '/true/punycode/src',
), ),
'Symfony\\Polyfill\\Php72\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-php72',
),
'Symfony\\Polyfill\\Mbstring\\' => 'Symfony\\Polyfill\\Mbstring\\' =>
array ( array (
0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
@ -460,6 +454,7 @@ class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
'HTMLPurifier_AttrDef_CSS_Multiple' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php', 'HTMLPurifier_AttrDef_CSS_Multiple' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php',
'HTMLPurifier_AttrDef_CSS_Number' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php', 'HTMLPurifier_AttrDef_CSS_Number' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php',
'HTMLPurifier_AttrDef_CSS_Percentage' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php', 'HTMLPurifier_AttrDef_CSS_Percentage' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php',
'HTMLPurifier_AttrDef_CSS_Ratio' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ratio.php',
'HTMLPurifier_AttrDef_CSS_TextDecoration' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php', 'HTMLPurifier_AttrDef_CSS_TextDecoration' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php',
'HTMLPurifier_AttrDef_CSS_URI' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php', 'HTMLPurifier_AttrDef_CSS_URI' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php',
'HTMLPurifier_AttrDef_Clone' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php', 'HTMLPurifier_AttrDef_Clone' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php',
@ -877,7 +872,6 @@ class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Resources/unidata/Regex.php', 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Resources/unidata/Regex.php',
'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php', 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php',
'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',
'Symfony\\Polyfill\\Php72\\Php72' => __DIR__ . '/..' . '/symfony/polyfill-php72/Php72.php',
'TrueBV\\Exception\\DomainOutOfBoundsException' => __DIR__ . '/..' . '/true/punycode/src/Exception/DomainOutOfBoundsException.php', 'TrueBV\\Exception\\DomainOutOfBoundsException' => __DIR__ . '/..' . '/true/punycode/src/Exception/DomainOutOfBoundsException.php',
'TrueBV\\Exception\\LabelOutOfBoundsException' => __DIR__ . '/..' . '/true/punycode/src/Exception/LabelOutOfBoundsException.php', 'TrueBV\\Exception\\LabelOutOfBoundsException' => __DIR__ . '/..' . '/true/punycode/src/Exception/LabelOutOfBoundsException.php',
'TrueBV\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/true/punycode/src/Exception/OutOfBoundsException.php', 'TrueBV\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/true/punycode/src/Exception/OutOfBoundsException.php',

View file

@ -27,9 +27,9 @@
"php": "^7.2 || ^8.0" "php": "^7.2 || ^8.0"
}, },
"require-dev": { "require-dev": {
"symfony/phpunit-bridge": "^4.2 || ^5", "phpunit/phpunit": "^8 || ^9",
"phpstan/phpstan": "^1.10", "phpstan/phpstan": "^1.10",
"psr/log": "^1.0", "psr/log": "^1.0 || ^2.0 || ^3.0",
"symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
}, },
"autoload": { "autoload": {
@ -48,7 +48,7 @@
} }
}, },
"scripts": { "scripts": {
"test": "vendor/bin/simple-phpunit", "test": "@php phpunit",
"phpstan": "vendor/bin/phpstan analyse" "phpstan": "@php phpstan analyse"
} }
} }

View file

@ -1,7 +1,9 @@
## ##
## Bundle of CA Root Certificates ## Bundle of CA Root Certificates
## ##
## Certificate data from Mozilla as of: Mon Mar 11 15:25:27 2024 GMT ## Certificate data from Mozilla as of: Tue Dec 31 04:12:05 2024 GMT
##
## Find updated versions here: https://curl.se/docs/caextract.html
## ##
## This is a bundle of X.509 certificates of public Certificate Authorities ## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates ## (CA). These were automatically extracted from Mozilla's root certificates
@ -14,7 +16,7 @@
## Just configure this file as the SSLCACertificateFile. ## Just configure this file as the SSLCACertificateFile.
## ##
## Conversion done with mk-ca-bundle.pl version 1.29. ## Conversion done with mk-ca-bundle.pl version 1.29.
## SHA256: 4d96bd539f4719e9ace493757afbe4a23ee8579de1c97fbebc50bba3c12e8c1e ## SHA256: c99d6d3f8d3d4e47719ba2b648992f5b58b150128d3aca3c05c566d8dc98e116
## ##
@ -582,27 +584,6 @@ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
-----END CERTIFICATE----- -----END CERTIFICATE-----
SecureSign RootCA11
===================
-----BEGIN CERTIFICATE-----
MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
-----END CERTIFICATE-----
Microsec e-Szigno Root CA 2009 Microsec e-Szigno Root CA 2009
============================== ==============================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -2317,40 +2298,6 @@ hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB
dBb9HxEGmpv0 dBb9HxEGmpv0
-----END CERTIFICATE----- -----END CERTIFICATE-----
Entrust Root Certification Authority - G4
=========================================
-----BEGIN CERTIFICATE-----
MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV
BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu
bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1
dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1
dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT
AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv
cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv
cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D
umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV
3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds
8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ
e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7
ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X
xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV
7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8
dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW
Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n
MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q
jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht
7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK
YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt
jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+
m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW
RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA
JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G
+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT
kcpG2om3PVODLAgfi49T3f+sHw==
-----END CERTIFICATE-----
Microsoft ECC Root Certificate Authority 2017 Microsoft ECC Root Certificate Authority 2017
============================================= =============================================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -3168,36 +3115,6 @@ AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8
rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR
-----END CERTIFICATE----- -----END CERTIFICATE-----
Security Communication RootCA3
==============================
-----BEGIN CERTIFICATE-----
MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw
IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD
b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw
CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE
AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r
hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE
NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2
/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm
npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY
XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK
p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC
3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf
GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw
CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB
/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS
YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu
Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O
H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx
YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ
XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml
+LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn
KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9
dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm
6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg==
-----END CERTIFICATE-----
Security Communication ECC RootCA1 Security Communication ECC RootCA1
================================== ==================================
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
@ -3579,3 +3496,116 @@ wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE
HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0 HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0
o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A= o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
-----END CERTIFICATE----- -----END CERTIFICATE-----
FIRMAPROFESIONAL CA ROOT-A WEB
==============================
-----BEGIN CERTIFICATE-----
MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQswCQYDVQQGEwJF
UzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4
MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2
WhcNNDcwMzMxMDkwMTM2WjBuMQswCQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25h
bCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFM
IENBIFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zfe9MEkVz6
iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6CcyvHZpsKjECcfIr28jlg
st7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FD
Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB
/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgL
cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ
pYXFuXqUPoeovQA=
-----END CERTIFICATE-----
TWCA CYBER Root CA
==================
-----BEGIN CERTIFICATE-----
MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG
EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s
Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh
V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT
o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT
Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK
/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH
IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM
fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF
2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR
wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83
QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB
AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN
c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x
X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR
IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq
/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R
FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe
Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv
It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl
IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X
-----END CERTIFICATE-----
SecureSign Root CA12
====================
-----BEGIN CERTIFICATE-----
MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3
emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc
J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl
fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF
EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef
NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC
AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi
LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce
mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS
vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga
aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA==
-----END CERTIFICATE-----
SecureSign Root CA14
====================
-----BEGIN CERTIFICATE-----
MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG
A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ
BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh
1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn
bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb
1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa
/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE
kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx
jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz
ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0
dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY
AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB
o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq
YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E
rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA
ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds
Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG
FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q
nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/
OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa
OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO
pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN
eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S
-----END CERTIFICATE-----
SecureSign Root CA15
====================
-----BEGIN CERTIFICATE-----
MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE
BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1
cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV
BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj
dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G
dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB
2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J
fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ
SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4=
-----END CERTIFICATE-----

View file

@ -84,23 +84,19 @@ class CaBundle
'/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package) '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package)
'/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package) '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package)
'/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package) '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package)
'/usr/local/share/certs/ca-root-nss.crt', // FreeBSD (ca_root_nss_package)
'/usr/ssl/certs/ca-bundle.crt', // Cygwin '/usr/ssl/certs/ca-bundle.crt', // Cygwin
'/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package
'/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option) '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option)
'/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat? '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat?
'/etc/ssl/cert.pem', // OpenBSD '/etc/ssl/cert.pem', // OpenBSD
'/usr/local/etc/ssl/cert.pem', // FreeBSD 10.x
'/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package
'/usr/local/etc/openssl@1.1/cert.pem', // OS X homebrew, openssl@1.1 package '/usr/local/etc/openssl@1.1/cert.pem', // OS X homebrew, openssl@1.1 package
'/opt/homebrew/etc/openssl@3/cert.pem', // macOS silicon homebrew, openssl@3 package '/opt/homebrew/etc/openssl@3/cert.pem', // macOS silicon homebrew, openssl@3 package
'/opt/homebrew/etc/openssl@1.1/cert.pem', // macOS silicon homebrew, openssl@1.1 package '/opt/homebrew/etc/openssl@1.1/cert.pem', // macOS silicon homebrew, openssl@1.1 package
'/etc/pki/tls/certs',
'/etc/ssl/certs', // FreeBSD
); );
foreach($otherLocations as $location) {
$otherLocations[] = dirname($location);
}
$caBundlePaths = array_merge($caBundlePaths, $otherLocations); $caBundlePaths = array_merge($caBundlePaths, $otherLocations);
foreach ($caBundlePaths as $caBundle) { foreach ($caBundlePaths as $caBundle) {

View file

@ -61,17 +61,17 @@
}, },
{ {
"name": "composer/ca-bundle", "name": "composer/ca-bundle",
"version": "1.5.0", "version": "1.5.5",
"version_normalized": "1.5.0.0", "version_normalized": "1.5.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/ca-bundle.git", "url": "https://github.com/composer/ca-bundle.git",
"reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99" "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", "url": "https://api.github.com/repos/composer/ca-bundle/zipball/08c50d5ec4c6ced7d0271d2862dec8c1033283e6",
"reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", "reference": "08c50d5ec4c6ced7d0271d2862dec8c1033283e6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -81,11 +81,11 @@
}, },
"require-dev": { "require-dev": {
"phpstan/phpstan": "^1.10", "phpstan/phpstan": "^1.10",
"psr/log": "^1.0", "phpunit/phpunit": "^8 || ^9",
"symfony/phpunit-bridge": "^4.2 || ^5", "psr/log": "^1.0 || ^2.0 || ^3.0",
"symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
}, },
"time": "2024-03-15T14:00:32+00:00", "time": "2025-01-08T16:17:16+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@ -120,7 +120,7 @@
"support": { "support": {
"irc": "irc://irc.freenode.org/composer", "irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/ca-bundle/issues", "issues": "https://github.com/composer/ca-bundle/issues",
"source": "https://github.com/composer/ca-bundle/tree/1.5.0" "source": "https://github.com/composer/ca-bundle/tree/1.5.5"
}, },
"funding": [ "funding": [
{ {
@ -346,28 +346,28 @@
}, },
{ {
"name": "enshrined/svg-sanitize", "name": "enshrined/svg-sanitize",
"version": "0.18.0", "version": "0.21.0",
"version_normalized": "0.18.0.0", "version_normalized": "0.21.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/darylldoyle/svg-sanitizer.git", "url": "https://github.com/darylldoyle/svg-sanitizer.git",
"reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0" "reference": "5e477468fac5c5ce933dce53af3e8e4e58dcccc9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/6a2c069dab3843ca4d887ff09c972fc7033888d0", "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/5e477468fac5c5ce933dce53af3e8e4e58dcccc9",
"reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0", "reference": "5e477468fac5c5ce933dce53af3e8e4e58dcccc9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-libxml": "*", "ext-libxml": "*",
"php": "^5.6 || ^7.0 || ^8.0" "php": "^7.1 || ^8.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^5.7 || ^6.5 || ^8.5" "phpunit/phpunit": "^6.5 || ^8.5"
}, },
"time": "2024-02-22T17:51:05+00:00", "time": "2025-01-13T09:32:25+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@ -388,27 +388,27 @@
"description": "An SVG sanitizer for PHP", "description": "An SVG sanitizer for PHP",
"support": { "support": {
"issues": "https://github.com/darylldoyle/svg-sanitizer/issues", "issues": "https://github.com/darylldoyle/svg-sanitizer/issues",
"source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.18.0" "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.21.0"
}, },
"install-path": "../enshrined/svg-sanitize" "install-path": "../enshrined/svg-sanitize"
}, },
{ {
"name": "ezyang/htmlpurifier", "name": "ezyang/htmlpurifier",
"version": "v4.16.0", "version": "v4.18.0",
"version_normalized": "4.16.0.0", "version_normalized": "4.18.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git", "url": "https://github.com/ezyang/htmlpurifier.git",
"reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8" "reference": "cb56001e54359df7ae76dc522d08845dc741621b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/523407fb06eb9e5f3d59889b3978d5bfe94299c8", "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b",
"reference": "523407fb06eb9e5f3d59889b3978d5bfe94299c8", "reference": "cb56001e54359df7ae76dc522d08845dc741621b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
}, },
"require-dev": { "require-dev": {
"cerdic/css-tidy": "^1.7 || ^2.0", "cerdic/css-tidy": "^1.7 || ^2.0",
@ -420,7 +420,7 @@
"ext-iconv": "Converts text to and from non-UTF-8 encodings", "ext-iconv": "Converts text to and from non-UTF-8 encodings",
"ext-tidy": "Used for pretty-printing HTML" "ext-tidy": "Used for pretty-printing HTML"
}, },
"time": "2022-09-18T07:06:19+00:00", "time": "2024-11-01T03:51:45+00:00",
"type": "library", "type": "library",
"installation-source": "dist", "installation-source": "dist",
"autoload": { "autoload": {
@ -452,7 +452,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/ezyang/htmlpurifier/issues", "issues": "https://github.com/ezyang/htmlpurifier/issues",
"source": "https://github.com/ezyang/htmlpurifier/tree/v4.16.0" "source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0"
}, },
"install-path": "../ezyang/htmlpurifier" "install-path": "../ezyang/htmlpurifier"
}, },
@ -585,23 +585,23 @@
}, },
{ {
"name": "guzzlehttp/guzzle", "name": "guzzlehttp/guzzle",
"version": "7.8.1", "version": "7.9.2",
"version_normalized": "7.8.1.0", "version_normalized": "7.9.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/guzzle.git", "url": "https://github.com/guzzle/guzzle.git",
"reference": "41042bc7ab002487b876a0683fc8dce04ddce104" "reference": "d281ed313b989f213357e3be1a179f02196ac99b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b",
"reference": "41042bc7ab002487b876a0683fc8dce04ddce104", "reference": "d281ed313b989f213357e3be1a179f02196ac99b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-json": "*", "ext-json": "*",
"guzzlehttp/promises": "^1.5.3 || ^2.0.1", "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
"guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "guzzlehttp/psr7": "^2.7.0",
"php": "^7.2.5 || ^8.0", "php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0", "psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0" "symfony/deprecation-contracts": "^2.2 || ^3.0"
@ -612,9 +612,9 @@
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2", "bamarni/composer-bin-plugin": "^1.8.2",
"ext-curl": "*", "ext-curl": "*",
"php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", "guzzle/client-integration-tests": "3.0.2",
"php-http/message-factory": "^1.1", "php-http/message-factory": "^1.1",
"phpunit/phpunit": "^8.5.36 || ^9.6.15", "phpunit/phpunit": "^8.5.39 || ^9.6.20",
"psr/log": "^1.1 || ^2.0 || ^3.0" "psr/log": "^1.1 || ^2.0 || ^3.0"
}, },
"suggest": { "suggest": {
@ -622,7 +622,7 @@
"ext-intl": "Required for Internationalized Domain Name (IDN) support", "ext-intl": "Required for Internationalized Domain Name (IDN) support",
"psr/log": "Required for using the Log middleware" "psr/log": "Required for using the Log middleware"
}, },
"time": "2023-12-03T20:35:24+00:00", "time": "2024-07-24T11:22:20+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"bamarni-bin": { "bamarni-bin": {
@ -694,7 +694,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/guzzle/issues", "issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/7.8.1" "source": "https://github.com/guzzle/guzzle/tree/7.9.2"
}, },
"funding": [ "funding": [
{ {
@ -714,17 +714,17 @@
}, },
{ {
"name": "guzzlehttp/promises", "name": "guzzlehttp/promises",
"version": "2.0.2", "version": "2.0.4",
"version_normalized": "2.0.2.0", "version_normalized": "2.0.4.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/promises.git", "url": "https://github.com/guzzle/promises.git",
"reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
"reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -732,9 +732,9 @@
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2", "bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.36 || ^9.6.15" "phpunit/phpunit": "^8.5.39 || ^9.6.20"
}, },
"time": "2023-12-03T20:19:20+00:00", "time": "2024-10-17T10:06:22+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"bamarni-bin": { "bamarni-bin": {
@ -780,7 +780,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/promises/issues", "issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/2.0.2" "source": "https://github.com/guzzle/promises/tree/2.0.4"
}, },
"funding": [ "funding": [
{ {
@ -800,17 +800,17 @@
}, },
{ {
"name": "guzzlehttp/psr7", "name": "guzzlehttp/psr7",
"version": "2.6.2", "version": "2.7.0",
"version_normalized": "2.6.2.0", "version_normalized": "2.7.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/guzzle/psr7.git", "url": "https://github.com/guzzle/psr7.git",
"reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
"reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -825,13 +825,13 @@
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2", "bamarni/composer-bin-plugin": "^1.8.2",
"http-interop/http-factory-tests": "^0.9", "http-interop/http-factory-tests": "0.9.0",
"phpunit/phpunit": "^8.5.36 || ^9.6.15" "phpunit/phpunit": "^8.5.39 || ^9.6.20"
}, },
"suggest": { "suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
}, },
"time": "2023-12-03T20:05:35+00:00", "time": "2024-07-18T11:15:46+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"bamarni-bin": { "bamarni-bin": {
@ -899,7 +899,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/guzzle/psr7/issues", "issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.6.2" "source": "https://github.com/guzzle/psr7/tree/2.7.0"
}, },
"funding": [ "funding": [
{ {
@ -1460,24 +1460,24 @@
}, },
{ {
"name": "psr/http-factory", "name": "psr/http-factory",
"version": "1.0.2", "version": "1.1.0",
"version_normalized": "1.0.2.0", "version_normalized": "1.1.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/php-fig/http-factory.git", "url": "https://github.com/php-fig/http-factory.git",
"reference": "e616d01114759c4c489f93b099585439f795fe35" "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
"reference": "e616d01114759c4c489f93b099585439f795fe35", "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.0.0", "php": ">=7.1",
"psr/http-message": "^1.0 || ^2.0" "psr/http-message": "^1.0 || ^2.0"
}, },
"time": "2023-04-10T20:10:41+00:00", "time": "2024-04-15T12:06:14+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@ -1500,7 +1500,7 @@
"homepage": "https://www.php-fig.org/" "homepage": "https://www.php-fig.org/"
} }
], ],
"description": "Common interfaces for PSR-7 HTTP message factories", "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
"keywords": [ "keywords": [
"factory", "factory",
"http", "http",
@ -1512,7 +1512,7 @@
"response" "response"
], ],
"support": { "support": {
"source": "https://github.com/php-fig/http-factory/tree/1.0.2" "source": "https://github.com/php-fig/http-factory"
}, },
"install-path": "../psr/http-factory" "install-path": "../psr/http-factory"
}, },
@ -1684,17 +1684,17 @@
}, },
{ {
"name": "scssphp/scssphp", "name": "scssphp/scssphp",
"version": "v1.12.1", "version": "v1.13.0",
"version_normalized": "1.12.1.0", "version_normalized": "1.13.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/scssphp/scssphp.git", "url": "https://github.com/scssphp/scssphp.git",
"reference": "394ed1e960138710a60d035c1a85d43d0bf0faeb" "reference": "63d1157457e5554edf00b0c1fabab4c1511d2520"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/scssphp/scssphp/zipball/394ed1e960138710a60d035c1a85d43d0bf0faeb", "url": "https://api.github.com/repos/scssphp/scssphp/zipball/63d1157457e5554edf00b0c1fabab4c1511d2520",
"reference": "394ed1e960138710a60d035c1a85d43d0bf0faeb", "reference": "63d1157457e5554edf00b0c1fabab4c1511d2520",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1717,15 +1717,15 @@
"ext-iconv": "Can be used as fallback when ext-mbstring is not available", "ext-iconv": "Can be used as fallback when ext-mbstring is not available",
"ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv" "ext-mbstring": "For best performance, mbstring should be installed as it is faster than ext-iconv"
}, },
"time": "2024-01-13T12:36:40+00:00", "time": "2024-08-17T21:02:11+00:00",
"bin": [ "bin": [
"bin/pscss" "bin/pscss"
], ],
"type": "library", "type": "library",
"extra": { "extra": {
"bamarni-bin": { "bamarni-bin": {
"forward-command": false, "bin-links": false,
"bin-links": false "forward-command": false
} }
}, },
"installation-source": "dist", "installation-source": "dist",
@ -1761,7 +1761,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/scssphp/scssphp/issues", "issues": "https://github.com/scssphp/scssphp/issues",
"source": "https://github.com/scssphp/scssphp/tree/v1.12.1" "source": "https://github.com/scssphp/scssphp/tree/v1.13.0"
}, },
"install-path": "../scssphp/scssphp" "install-path": "../scssphp/scssphp"
}, },
@ -1846,31 +1846,31 @@
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
"version": "v2.5.3", "version": "v2.5.4",
"version_normalized": "2.5.3.0", "version_normalized": "2.5.4.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git", "url": "https://github.com/symfony/deprecation-contracts.git",
"reference": "80d075412b557d41002320b96a096ca65aa2c98d" "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/605389f2a7e5625f273b53960dc46aeaf9c62918",
"reference": "80d075412b557d41002320b96a096ca65aa2c98d", "reference": "605389f2a7e5625f273b53960dc46aeaf9c62918",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.1"
}, },
"time": "2023-01-24T14:02:46+00:00", "time": "2024-09-25T14:11:13+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": {
"url": "https://github.com/symfony/contracts",
"name": "symfony/contracts"
},
"branch-alias": { "branch-alias": {
"dev-main": "2.5-dev" "dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
"url": "https://github.com/symfony/contracts"
} }
}, },
"installation-source": "dist", "installation-source": "dist",
@ -1896,7 +1896,7 @@
"description": "A generic function and convention to trigger deprecation notices", "description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.3" "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.4"
}, },
"funding": [ "funding": [
{ {
@ -1916,21 +1916,21 @@
}, },
{ {
"name": "symfony/polyfill-iconv", "name": "symfony/polyfill-iconv",
"version": "v1.29.0", "version": "v1.31.0",
"version_normalized": "1.29.0.0", "version_normalized": "1.31.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-iconv.git", "url": "https://github.com/symfony/polyfill-iconv.git",
"reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f" "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f", "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/48becf00c920479ca2e910c22a5a39e5d47ca956",
"reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f", "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"provide": { "provide": {
"ext-iconv": "*" "ext-iconv": "*"
@ -1938,12 +1938,12 @@
"suggest": { "suggest": {
"ext-iconv": "For best performance" "ext-iconv": "For best performance"
}, },
"time": "2024-01-29T20:11:03+00:00", "time": "2024-09-09T11:45:10+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"installation-source": "dist", "installation-source": "dist",
@ -1979,7 +1979,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-iconv/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-iconv/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -1999,33 +1999,32 @@
}, },
{ {
"name": "symfony/polyfill-intl-idn", "name": "symfony/polyfill-intl-idn",
"version": "v1.29.0", "version": "v1.31.0",
"version_normalized": "1.29.0.0", "version_normalized": "1.31.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git", "url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "a287ed7475f85bf6f61890146edbc932c0fff919" "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
"reference": "a287ed7475f85bf6f61890146edbc932c0fff919", "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1", "php": ">=7.2",
"symfony/polyfill-intl-normalizer": "^1.10", "symfony/polyfill-intl-normalizer": "^1.10"
"symfony/polyfill-php72": "^1.10"
}, },
"suggest": { "suggest": {
"ext-intl": "For best performance" "ext-intl": "For best performance"
}, },
"time": "2024-01-29T20:11:03+00:00", "time": "2024-09-09T11:45:10+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"installation-source": "dist", "installation-source": "dist",
@ -2066,7 +2065,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -2086,31 +2085,31 @@
}, },
{ {
"name": "symfony/polyfill-intl-normalizer", "name": "symfony/polyfill-intl-normalizer",
"version": "v1.29.0", "version": "v1.31.0",
"version_normalized": "1.29.0.0", "version_normalized": "1.31.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d" "reference": "3833d7255cc303546435cb650316bff708a1c75c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"suggest": { "suggest": {
"ext-intl": "For best performance" "ext-intl": "For best performance"
}, },
"time": "2024-01-29T20:11:03+00:00", "time": "2024-09-09T11:45:10+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"installation-source": "dist", "installation-source": "dist",
@ -2150,7 +2149,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -2170,21 +2169,21 @@
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.29.0", "version": "v1.31.0",
"version_normalized": "1.29.0.0", "version_normalized": "1.31.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=7.1" "php": ">=7.2"
}, },
"provide": { "provide": {
"ext-mbstring": "*" "ext-mbstring": "*"
@ -2192,12 +2191,12 @@
"suggest": { "suggest": {
"ext-mbstring": "For best performance" "ext-mbstring": "For best performance"
}, },
"time": "2024-01-29T20:11:03+00:00", "time": "2024-09-09T11:45:10+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"thanks": { "thanks": {
"name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill",
"url": "https://github.com/symfony/polyfill" "name": "symfony/polyfill"
} }
}, },
"installation-source": "dist", "installation-source": "dist",
@ -2233,7 +2232,7 @@
"shim" "shim"
], ],
"support": { "support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
}, },
"funding": [ "funding": [
{ {
@ -2251,82 +2250,6 @@
], ],
"install-path": "../symfony/polyfill-mbstring" "install-path": "../symfony/polyfill-mbstring"
}, },
{
"name": "symfony/polyfill-php72",
"version": "v1.29.0",
"version_normalized": "1.29.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
"reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25",
"reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"time": "2024-01-29T20:11:03+00:00",
"type": "library",
"extra": {
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"installation-source": "dist",
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php72\\": ""
}
},
"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.2+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"install-path": "../symfony/polyfill-php72"
},
{ {
"name": "true/punycode", "name": "true/punycode",
"version": "v2.1.1", "version": "v2.1.1",
@ -2377,6 +2300,6 @@
"install-path": "../true/punycode" "install-path": "../true/punycode"
} }
], ],
"dev": true, "dev": false,
"dev-package-names": [] "dev-package-names": []
} }

View file

@ -1,13 +1,13 @@
<?php return array( <?php return array(
'root' => array( 'root' => array(
'name' => 'rhymix/rhymix', 'name' => 'rhymix/rhymix',
'pretty_version' => 'dev-develop', 'pretty_version' => 'dev-master',
'version' => 'dev-develop', 'version' => 'dev-master',
'reference' => 'd8610407663539b1d52d17bc0b8dc88f739db063', 'reference' => '074873d844582d33f53959d8c3595d5019b9ae5c',
'type' => 'project', 'type' => 'project',
'install_path' => __DIR__ . '/../../', 'install_path' => __DIR__ . '/../../',
'aliases' => array(), 'aliases' => array(),
'dev' => true, 'dev' => false,
), ),
'versions' => array( 'versions' => array(
'bordoni/phpass' => array( 'bordoni/phpass' => array(
@ -20,9 +20,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'composer/ca-bundle' => array( 'composer/ca-bundle' => array(
'pretty_version' => '1.5.0', 'pretty_version' => '1.5.5',
'version' => '1.5.0.0', 'version' => '1.5.5.0',
'reference' => '0c5ccfcfea312b5c5a190a21ac5cef93f74baf99', 'reference' => '08c50d5ec4c6ced7d0271d2862dec8c1033283e6',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/./ca-bundle', 'install_path' => __DIR__ . '/./ca-bundle',
'aliases' => array(), 'aliases' => array(),
@ -56,18 +56,18 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'enshrined/svg-sanitize' => array( 'enshrined/svg-sanitize' => array(
'pretty_version' => '0.18.0', 'pretty_version' => '0.21.0',
'version' => '0.18.0.0', 'version' => '0.21.0.0',
'reference' => '6a2c069dab3843ca4d887ff09c972fc7033888d0', 'reference' => '5e477468fac5c5ce933dce53af3e8e4e58dcccc9',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../enshrined/svg-sanitize', 'install_path' => __DIR__ . '/../enshrined/svg-sanitize',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'ezyang/htmlpurifier' => array( 'ezyang/htmlpurifier' => array(
'pretty_version' => 'v4.16.0', 'pretty_version' => 'v4.18.0',
'version' => '4.16.0.0', 'version' => '4.18.0.0',
'reference' => '523407fb06eb9e5f3d59889b3978d5bfe94299c8', 'reference' => 'cb56001e54359df7ae76dc522d08845dc741621b',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../ezyang/htmlpurifier', 'install_path' => __DIR__ . '/../ezyang/htmlpurifier',
'aliases' => array(), 'aliases' => array(),
@ -92,27 +92,27 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'guzzlehttp/guzzle' => array( 'guzzlehttp/guzzle' => array(
'pretty_version' => '7.8.1', 'pretty_version' => '7.9.2',
'version' => '7.8.1.0', 'version' => '7.9.2.0',
'reference' => '41042bc7ab002487b876a0683fc8dce04ddce104', 'reference' => 'd281ed313b989f213357e3be1a179f02196ac99b',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/guzzle', 'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'guzzlehttp/promises' => array( 'guzzlehttp/promises' => array(
'pretty_version' => '2.0.2', 'pretty_version' => '2.0.4',
'version' => '2.0.2.0', 'version' => '2.0.4.0',
'reference' => 'bbff78d96034045e58e13dedd6ad91b5d1253223', 'reference' => 'f9c436286ab2892c7db7be8c8da4ef61ccf7b455',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/promises', 'install_path' => __DIR__ . '/../guzzlehttp/promises',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'guzzlehttp/psr7' => array( 'guzzlehttp/psr7' => array(
'pretty_version' => '2.6.2', 'pretty_version' => '2.7.0',
'version' => '2.6.2.0', 'version' => '2.7.0.0',
'reference' => '45b30f99ac27b5ca93cb4831afe16285f57b8221', 'reference' => 'a70f5c95fb43bc83f07c9c948baa0dc1829bf201',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/psr7', 'install_path' => __DIR__ . '/../guzzlehttp/psr7',
'aliases' => array(), 'aliases' => array(),
@ -214,9 +214,9 @@
), ),
), ),
'psr/http-factory' => array( 'psr/http-factory' => array(
'pretty_version' => '1.0.2', 'pretty_version' => '1.1.0',
'version' => '1.0.2.0', 'version' => '1.1.0.0',
'reference' => 'e616d01114759c4c489f93b099585439f795fe35', 'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../psr/http-factory', 'install_path' => __DIR__ . '/../psr/http-factory',
'aliases' => array(), 'aliases' => array(),
@ -253,9 +253,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'rhymix/rhymix' => array( 'rhymix/rhymix' => array(
'pretty_version' => 'dev-develop', 'pretty_version' => 'dev-master',
'version' => 'dev-develop', 'version' => 'dev-master',
'reference' => 'd8610407663539b1d52d17bc0b8dc88f739db063', 'reference' => '074873d844582d33f53959d8c3595d5019b9ae5c',
'type' => 'project', 'type' => 'project',
'install_path' => __DIR__ . '/../../', 'install_path' => __DIR__ . '/../../',
'aliases' => array(), 'aliases' => array(),
@ -271,9 +271,9 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'scssphp/scssphp' => array( 'scssphp/scssphp' => array(
'pretty_version' => 'v1.12.1', 'pretty_version' => 'v1.13.0',
'version' => '1.12.1.0', 'version' => '1.13.0.0',
'reference' => '394ed1e960138710a60d035c1a85d43d0bf0faeb', 'reference' => '63d1157457e5554edf00b0c1fabab4c1511d2520',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../scssphp/scssphp', 'install_path' => __DIR__ . '/../scssphp/scssphp',
'aliases' => array(), 'aliases' => array(),
@ -289,59 +289,50 @@
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/deprecation-contracts' => array( 'symfony/deprecation-contracts' => array(
'pretty_version' => 'v2.5.3', 'pretty_version' => 'v2.5.4',
'version' => '2.5.3.0', 'version' => '2.5.4.0',
'reference' => '80d075412b557d41002320b96a096ca65aa2c98d', 'reference' => '605389f2a7e5625f273b53960dc46aeaf9c62918',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-iconv' => array( 'symfony/polyfill-iconv' => array(
'pretty_version' => 'v1.29.0', 'pretty_version' => 'v1.31.0',
'version' => '1.29.0.0', 'version' => '1.31.0.0',
'reference' => 'cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f', 'reference' => '48becf00c920479ca2e910c22a5a39e5d47ca956',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-iconv', 'install_path' => __DIR__ . '/../symfony/polyfill-iconv',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-intl-idn' => array( 'symfony/polyfill-intl-idn' => array(
'pretty_version' => 'v1.29.0', 'pretty_version' => 'v1.31.0',
'version' => '1.29.0.0', 'version' => '1.31.0.0',
'reference' => 'a287ed7475f85bf6f61890146edbc932c0fff919', 'reference' => 'c36586dcf89a12315939e00ec9b4474adcb1d773',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-intl-normalizer' => array( 'symfony/polyfill-intl-normalizer' => array(
'pretty_version' => 'v1.29.0', 'pretty_version' => 'v1.31.0',
'version' => '1.29.0.0', 'version' => '1.31.0.0',
'reference' => 'bc45c394692b948b4d383a08d7753968bed9a83d', 'reference' => '3833d7255cc303546435cb650316bff708a1c75c',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-mbstring' => array( 'symfony/polyfill-mbstring' => array(
'pretty_version' => 'v1.29.0', 'pretty_version' => 'v1.31.0',
'version' => '1.29.0.0', 'version' => '1.31.0.0',
'reference' => '9773676c8a1bb1f8d4340a62efe641cf76eda7ec', 'reference' => '85181ba99b2345b0ef10ce42ecac37612d9fd341',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
'aliases' => array(), 'aliases' => array(),
'dev_requirement' => false, 'dev_requirement' => false,
), ),
'symfony/polyfill-php72' => array(
'pretty_version' => 'v1.29.0',
'version' => '1.29.0.0',
'reference' => '861391a8da9a04cbad2d232ddd9e4893220d6e25',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-php72',
'aliases' => array(),
'dev_requirement' => false,
),
'true/punycode' => array( 'true/punycode' => array(
'pretty_version' => 'v2.1.1', 'pretty_version' => 'v2.1.1',
'version' => '2.1.1.0', 'version' => '2.1.1.0',

View file

@ -1,6 +1,6 @@
# svg-sanitizer # svg-sanitizer
[![Build Status](https://travis-ci.org/darylldoyle/svg-sanitizer.svg?branch=master)](https://travis-ci.org/darylldoyle/svg-sanitizer) [![Test Coverage](https://codeclimate.com/github/darylldoyle/svg-sanitizer/badges/coverage.svg)](https://codeclimate.com/github/darylldoyle/svg-sanitizer/coverage) [![Build Status](https://github.com/darylldoyle/svg-sanitizer/actions/workflows/tests.yml/badge.svg?branch=master)](https://travis-ci.org/darylldoyle/svg-sanitizer) [![Test Coverage](https://codeclimate.com/github/darylldoyle/svg-sanitizer/badges/coverage.svg)](https://codeclimate.com/github/darylldoyle/svg-sanitizer/coverage)
This is my attempt at building a decent SVG sanitizer in PHP. The work is largely borrowed from [DOMPurify](https://github.com/cure53/DOMPurify). This is my attempt at building a decent SVG sanitizer in PHP. The work is largely borrowed from [DOMPurify](https://github.com/cure53/DOMPurify).

View file

@ -25,9 +25,9 @@
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-libxml": "*", "ext-libxml": "*",
"php": "^5.6 || ^7.0 || ^8.0" "php": "^7.1 || ^8.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^5.7 || ^6.5 || ^8.5" "phpunit/phpunit": "^6.5 || ^8.5"
} }
} }

View file

@ -18,7 +18,7 @@ class NestingException extends \Exception
* @param Exception|null $previous * @param Exception|null $previous
* @param \DOMElement|null $element * @param \DOMElement|null $element
*/ */
public function __construct($message = "", $code = 0, Exception $previous = null, \DOMElement $element = null) public function __construct($message = "", $code = 0, ?Exception $previous = null, ?\DOMElement $element = null)
{ {
$this->element = $element; $this->element = $element;
parent::__construct($message, $code, $previous); parent::__construct($message, $code, $previous);

View file

@ -220,8 +220,13 @@ class Sanitizer
return ''; return '';
} }
// Strip php tags do {
$dirty = preg_replace('/<\?(=|php)(.+?)\?>/i', '', $dirty); /*
* recursively remove php tags because they can be hidden inside tags
* i.e. <?p<?php test?>hp echo . ' danger! ';?>
*/
$dirty = preg_replace('/<\?(=|php)(.+?)\?>/i', '', $dirty);
} while (preg_match('/<\?(=|php)(.+?)\?>/i', $dirty) != 0);
$this->resetInternal(); $this->resetInternal();
$this->setUpBefore(); $this->setUpBefore();
@ -230,6 +235,7 @@ class Sanitizer
// If we couldn't parse the XML then we go no further. Reset and return false // If we couldn't parse the XML then we go no further. Reset and return false
if (!$loaded) { if (!$loaded) {
$this->xmlIssues = self::getXmlErrors();
$this->resetAfter(); $this->resetAfter();
return false; return false;
} }
@ -363,7 +369,7 @@ class Sanitizer
$breaksOutOfForeignContent = false; $breaksOutOfForeignContent = false;
for ($x = $currentElement->attributes->length - 1; $x >= 0; $x--) { for ($x = $currentElement->attributes->length - 1; $x >= 0; $x--) {
// get attribute name // get attribute name
$attrName = $currentElement->attributes->item( $x )->name; $attrName = $currentElement->attributes->item( $x )->nodeName;
if (in_array(strtolower($attrName), ['face', 'color', 'size'])) { if (in_array(strtolower($attrName), ['face', 'color', 'size'])) {
$breaksOutOfForeignContent = true; $breaksOutOfForeignContent = true;
@ -398,7 +404,7 @@ class Sanitizer
{ {
for ($x = $element->attributes->length - 1; $x >= 0; $x--) { for ($x = $element->attributes->length - 1; $x >= 0; $x--) {
// get attribute name // get attribute name
$attrName = $element->attributes->item($x)->name; $attrName = $element->attributes->item($x)->nodeName;
// Remove attribute if not in whitelist // Remove attribute if not in whitelist
if (!in_array(strtolower($attrName), $this->allowedAttrs) && !$this->isAriaAttribute(strtolower($attrName)) && !$this->isDataAttribute(strtolower($attrName))) { if (!in_array(strtolower($attrName), $this->allowedAttrs) && !$this->isAriaAttribute(strtolower($attrName)) && !$this->isDataAttribute(strtolower($attrName))) {
@ -698,4 +704,21 @@ class Sanitizer
} }
} }
} }
/**
* Retrieve array of errors
* @return array
*/
private static function getXmlErrors()
{
$errors = [];
foreach (libxml_get_errors() as $error) {
$errors[] = [
'message' => trim($error->message),
'line' => $error->line,
];
}
return $errors;
}
} }

View file

@ -143,6 +143,7 @@ class AllowedAttributes implements AttributeInterface
'direction', 'direction',
'display', 'display',
'divisor', 'divisor',
'dominant-baseline',
'dur', 'dur',
'edgemode', 'edgemode',
'elevation', 'elevation',

View file

@ -1,6 +0,0 @@
# [4.16.0](https://github.com/ezyang/htmlpurifier/compare/v4.15.0...v4.16.0) (2022-09-18)
### Features
* add semantic release ([#307](https://github.com/ezyang/htmlpurifier/issues/307)) ([db31243](https://github.com/ezyang/htmlpurifier/commit/db312435cb9d8d73395f75f9642a43ba6de5e903)), closes [#322](https://github.com/ezyang/htmlpurifier/issues/322) [#323](https://github.com/ezyang/htmlpurifier/issues/323) [#326](https://github.com/ezyang/htmlpurifier/issues/326) [#327](https://github.com/ezyang/htmlpurifier/issues/327) [#328](https://github.com/ezyang/htmlpurifier/issues/328) [#329](https://github.com/ezyang/htmlpurifier/issues/329) [#330](https://github.com/ezyang/htmlpurifier/issues/330) [#331](https://github.com/ezyang/htmlpurifier/issues/331) [#332](https://github.com/ezyang/htmlpurifier/issues/332) [#333](https://github.com/ezyang/htmlpurifier/issues/333) [#337](https://github.com/ezyang/htmlpurifier/issues/337) [#335](https://github.com/ezyang/htmlpurifier/issues/335) [ezyang/htmlpurifier#334](https://github.com/ezyang/htmlpurifier/issues/334) [#336](https://github.com/ezyang/htmlpurifier/issues/336) [#338](https://github.com/ezyang/htmlpurifier/issues/338)

View file

@ -1 +1 @@
4.15.0 4.18.0

View file

@ -13,7 +13,7 @@
} }
], ],
"require": { "require": {
"php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0" "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
}, },
"require-dev": { "require-dev": {
"cerdic/css-tidy": "^1.7 || ^2.0", "cerdic/css-tidy": "^1.7 || ^2.0",
@ -38,7 +38,8 @@
"repositories": [ "repositories": [
{ {
"type": "vcs", "type": "vcs",
"url": "https://github.com/ezyang/simpletest.git" "url": "https://github.com/ezyang/simpletest.git",
"no-api": true
} }
] ]
} }

View file

@ -7,7 +7,7 @@
* primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS * primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
* FILE, changes will be overwritten the next time the script is run. * FILE, changes will be overwritten the next time the script is run.
* *
* @version 4.15.0 * @version 4.18.0
* *
* @warning * @warning
* You must *not* include any other HTML Purifier files before this file, * You must *not* include any other HTML Purifier files before this file,
@ -101,6 +101,7 @@ require 'HTMLPurifier/AttrDef/CSS/Length.php';
require 'HTMLPurifier/AttrDef/CSS/ListStyle.php'; require 'HTMLPurifier/AttrDef/CSS/ListStyle.php';
require 'HTMLPurifier/AttrDef/CSS/Multiple.php'; require 'HTMLPurifier/AttrDef/CSS/Multiple.php';
require 'HTMLPurifier/AttrDef/CSS/Percentage.php'; require 'HTMLPurifier/AttrDef/CSS/Percentage.php';
require 'HTMLPurifier/AttrDef/CSS/Ratio.php';
require 'HTMLPurifier/AttrDef/CSS/TextDecoration.php'; require 'HTMLPurifier/AttrDef/CSS/TextDecoration.php';
require 'HTMLPurifier/AttrDef/CSS/URI.php'; require 'HTMLPurifier/AttrDef/CSS/URI.php';
require 'HTMLPurifier/AttrDef/HTML/Bool.php'; require 'HTMLPurifier/AttrDef/HTML/Bool.php';

View file

@ -19,7 +19,7 @@
*/ */
/* /*
HTML Purifier 4.15.0 - Standards Compliant HTML Filtering HTML Purifier 4.18.0 - Standards Compliant HTML Filtering
Copyright (C) 2006-2008 Edward Z. Yang Copyright (C) 2006-2008 Edward Z. Yang
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
@ -58,12 +58,12 @@ class HTMLPurifier
* Version of HTML Purifier. * Version of HTML Purifier.
* @type string * @type string
*/ */
public $version = '4.15.0'; public $version = '4.18.0';
/** /**
* Constant with version of HTML Purifier. * Constant with version of HTML Purifier.
*/ */
const VERSION = '4.15.0'; const VERSION = '4.18.0';
/** /**
* Global configuration object. * Global configuration object.

View file

@ -95,6 +95,7 @@ require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Length.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ListStyle.php'; require_once $__dir . '/HTMLPurifier/AttrDef/CSS/ListStyle.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Multiple.php'; require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Multiple.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Percentage.php'; require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Percentage.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/Ratio.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/TextDecoration.php'; require_once $__dir . '/HTMLPurifier/AttrDef/CSS/TextDecoration.php';
require_once $__dir . '/HTMLPurifier/AttrDef/CSS/URI.php'; require_once $__dir . '/HTMLPurifier/AttrDef/CSS/URI.php';
require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Bool.php'; require_once $__dir . '/HTMLPurifier/AttrDef/HTML/Bool.php';

View file

@ -27,6 +27,13 @@ class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
$definition = $config->getCSSDefinition(); $definition = $config->getCSSDefinition();
$allow_duplicates = $config->get("CSS.AllowDuplicates"); $allow_duplicates = $config->get("CSS.AllowDuplicates");
$universal_attrdef = new HTMLPurifier_AttrDef_Enum(
array(
'initial',
'inherit',
'unset',
)
);
// According to the CSS2.1 spec, the places where a // According to the CSS2.1 spec, the places where a
// non-delimiting semicolon can appear are in strings // non-delimiting semicolon can appear are in strings
@ -96,16 +103,13 @@ class HTMLPurifier_AttrDef_CSS extends HTMLPurifier_AttrDef
if (!$ok) { if (!$ok) {
continue; continue;
} }
// inefficient call, since the validator will do this again $result = $universal_attrdef->validate($value, $config, $context);
if (strtolower(trim($value)) !== 'inherit') { if ($result === false) {
// inherit works for everything (but only on the base property)
$result = $definition->info[$property]->validate( $result = $definition->info[$property]->validate(
$value, $value,
$config, $config,
$context $context
); );
} else {
$result = 'inherit';
} }
if ($result === false) { if ($result === false) {
continue; continue;

View file

@ -10,23 +10,21 @@ class HTMLPurifier_AttrDef_CSS_FontFamily extends HTMLPurifier_AttrDef
public function __construct() public function __construct()
{ {
$this->mask = '_- '; // Lowercase letters
for ($c = 'a'; $c <= 'z'; $c++) { $l = range('a', 'z');
$this->mask .= $c; // Uppercase letters
} $u = range('A', 'Z');
for ($c = 'A'; $c <= 'Z'; $c++) { // Digits
$this->mask .= $c; $d = range('0', '9');
} // Special bytes used by UTF-8
for ($c = '0'; $c <= '9'; $c++) { $b = array_map('chr', range(0x80, 0xFF));
$this->mask .= $c; // All valid characters for the mask
} // cast-y, but should be fine $c = array_merge($l, $u, $d, $b);
// special bytes used by UTF-8 // Concatenate all valid characters into a string
for ($i = 0x80; $i <= 0xFF; $i++) { // Use '_- ' as an initial value
// We don't bother excluding invalid bytes in this range, $this->mask = array_reduce($c, function ($carry, $value) {
// because the our restriction of well-formed UTF-8 will return $carry . $value;
// prevent these from ever occurring. }, '_- ');
$this->mask .= chr($i);
}
/* /*
PHP's internal strcspn implementation is PHP's internal strcspn implementation is

View file

@ -0,0 +1,46 @@
<?php
/**
* Validates a ratio as defined by the CSS spec.
*/
class HTMLPurifier_AttrDef_CSS_Ratio extends HTMLPurifier_AttrDef
{
/**
* @param string $ratio Ratio to validate
* @param HTMLPurifier_Config $config Configuration options
* @param HTMLPurifier_Context $context Context
*
* @return string|boolean
*
* @warning Some contexts do not pass $config, $context. These
* variables should not be used without checking HTMLPurifier_Length
*/
public function validate($ratio, $config, $context)
{
$ratio = $this->parseCDATA($ratio);
$parts = explode('/', $ratio, 2);
$length = count($parts);
if ($length < 1 || $length > 2) {
return false;
}
$num = new \HTMLPurifier_AttrDef_CSS_Number();
if ($length === 1) {
return $num->validate($parts[0], $config, $context);
}
$num1 = $num->validate($parts[0], $config, $context);
$num2 = $num->validate($parts[1], $config, $context);
if ($num1 === false || $num2 === false) {
return false;
}
return $num1 . '/' . $num2;
}
}
// vim: et sw=4 sts=4

View file

@ -63,24 +63,18 @@ class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
// This doesn't match I18N domain names, but we don't have proper IRI support, // This doesn't match I18N domain names, but we don't have proper IRI support,
// so force users to insert Punycode. // so force users to insert Punycode.
// There is not a good sense in which underscores should be // Underscores defined as Unreserved Characters in RFC 3986 are
// allowed, since it's technically not! (And if you go as // allowed in a URI. There are cases where we want to consider a
// far to allow everything as specified by the DNS spec... // URI containing "_" such as "_dmarc.example.com".
// well, that's literally everything, modulo some space limits // Underscores are not allowed in the default. If you want to
// for the components and the overall name (which, by the way, // allow it, set Core.AllowHostnameUnderscore to true.
// we are NOT checking!). So we (arbitrarily) decide this:
// let's allow underscores wherever we would have allowed
// hyphens, if they are enabled. This is a pretty good match
// for browser behavior, for example, a large number of browsers
// cannot handle foo_.example.com, but foo_bar.example.com is
// fairly well supported.
$underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : ''; $underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : '';
// Based off of RFC 1738, but amended so that // Based off of RFC 1738, but amended so that
// as per RFC 3696, the top label need only not be all numeric. // as per RFC 3696, the top label need only not be all numeric.
// The productions describing this are: // The productions describing this are:
$a = '[a-z]'; // alpha $a = '[a-z]'; // alpha
$an = '[a-z0-9]'; // alphanum $an = "[a-z0-9$underscore]"; // alphanum
$and = "[a-z0-9-$underscore]"; // alphanum | "-" $and = "[a-z0-9-$underscore]"; // alphanum | "-"
// domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
$domainlabel = "$an(?:$and*$an)?"; $domainlabel = "$an(?:$and*$an)?";
@ -106,7 +100,7 @@ class HTMLPurifier_AttrDef_URI_Host extends HTMLPurifier_AttrDef
// If we have Net_IDNA2 support, we can support IRIs by // If we have Net_IDNA2 support, we can support IRIs by
// punycoding them. (This is the most portable thing to do, // punycoding them. (This is the most portable thing to do,
// since otherwise we have to assume browsers support // since otherwise we have to assume browsers support
} elseif ($config->get('Core.EnableIDNA')) { } elseif ($config->get('Core.EnableIDNA') && class_exists('Net_IDNA2')) {
$idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true)); $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true));
// we need to encode each period separately // we need to encode each period separately
$parts = explode('.', $string); $parts = explode('.', $string);

View file

@ -33,7 +33,11 @@ class HTMLPurifier_AttrTransform_TargetBlank extends HTMLPurifier_AttrTransform
// XXX Kind of inefficient // XXX Kind of inefficient
$url = $this->parser->parse($attr['href']); $url = $this->parser->parse($attr['href']);
$scheme = $url->getSchemeObj($config, $context);
// Ignore invalid schemes (e.g. `javascript:`)
if (!($scheme = $url->getSchemeObj($config, $context))) {
return $attr;
}
if ($scheme->browsable && !$url->isBenign($config, $context)) { if ($scheme->browsable && !$url->isBenign($config, $context)) {
$attr['target'] = '_blank'; $attr['target'] = '_blank';

View file

@ -79,44 +79,11 @@ class HTMLPurifier_Bootstrap
public static function registerAutoload() public static function registerAutoload()
{ {
$autoload = array('HTMLPurifier_Bootstrap', 'autoload'); $autoload = array('HTMLPurifier_Bootstrap', 'autoload');
if (($funcs = spl_autoload_functions()) === false) { if (spl_autoload_functions() === false) {
spl_autoload_register($autoload); spl_autoload_register($autoload);
} elseif (function_exists('spl_autoload_unregister')) { } else {
if (version_compare(PHP_VERSION, '5.3.0', '>=')) { // prepend flag exists, no need for shenanigans
// prepend flag exists, no need for shenanigans spl_autoload_register($autoload, true, true);
spl_autoload_register($autoload, true, true);
} else {
$buggy = version_compare(PHP_VERSION, '5.2.11', '<');
$compat = version_compare(PHP_VERSION, '5.1.2', '<=') &&
version_compare(PHP_VERSION, '5.1.0', '>=');
foreach ($funcs as $func) {
if ($buggy && is_array($func)) {
// :TRICKY: There are some compatibility issues and some
// places where we need to error out
$reflector = new ReflectionMethod($func[0], $func[1]);
if (!$reflector->isStatic()) {
throw new Exception(
'HTML Purifier autoloader registrar is not compatible
with non-static object methods due to PHP Bug #44144;
Please do not use HTMLPurifier.autoload.php (or any
file that includes this file); instead, place the code:
spl_autoload_register(array(\'HTMLPurifier_Bootstrap\', \'autoload\'))
after your own autoloaders.'
);
}
// Suprisingly, spl_autoload_register supports the
// Class::staticMethod callback format, although call_user_func doesn't
if ($compat) {
$func = implode('::', $func);
}
}
spl_autoload_unregister($func);
}
spl_autoload_register($autoload);
foreach ($funcs as $func) {
spl_autoload_register($func);
}
}
} }
} }
} }

View file

@ -13,7 +13,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
* Assoc array of attribute name to definition object. * Assoc array of attribute name to definition object.
* @type HTMLPurifier_AttrDef[] * @type HTMLPurifier_AttrDef[]
*/ */
public $info = array(); public $info = [];
/** /**
* Constructs the info array. The meat of this class. * Constructs the info array. The meat of this class.
@ -22,7 +22,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
protected function doSetup($config) protected function doSetup($config)
{ {
$this->info['text-align'] = new HTMLPurifier_AttrDef_Enum( $this->info['text-align'] = new HTMLPurifier_AttrDef_Enum(
array('left', 'right', 'center', 'justify'), ['left', 'right', 'center', 'justify'],
false false
); );
@ -31,7 +31,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['border-right-style'] = $this->info['border-right-style'] =
$this->info['border-left-style'] = $this->info['border-left-style'] =
$this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum( $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum(
array( [
'none', 'none',
'hidden', 'hidden',
'dotted', 'dotted',
@ -42,42 +42,42 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'ridge', 'ridge',
'inset', 'inset',
'outset' 'outset'
), ],
false false
); );
$this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style); $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style);
$this->info['clear'] = new HTMLPurifier_AttrDef_Enum( $this->info['clear'] = new HTMLPurifier_AttrDef_Enum(
array('none', 'left', 'right', 'both'), ['none', 'left', 'right', 'both'],
false false
); );
$this->info['float'] = new HTMLPurifier_AttrDef_Enum( $this->info['float'] = new HTMLPurifier_AttrDef_Enum(
array('none', 'left', 'right'), ['none', 'left', 'right'],
false false
); );
$this->info['font-style'] = new HTMLPurifier_AttrDef_Enum( $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum(
array('normal', 'italic', 'oblique'), ['normal', 'italic', 'oblique'],
false false
); );
$this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum( $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum(
array('normal', 'small-caps'), ['normal', 'small-caps'],
false false
); );
$uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite( $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum(array('none')), new HTMLPurifier_AttrDef_Enum(['none']),
new HTMLPurifier_AttrDef_CSS_URI() new HTMLPurifier_AttrDef_CSS_URI()
) ]
); );
$this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum( $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum(
array('inside', 'outside'), ['inside', 'outside'],
false false
); );
$this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum( $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum(
array( [
'disc', 'disc',
'circle', 'circle',
'square', 'square',
@ -87,7 +87,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'lower-alpha', 'lower-alpha',
'upper-alpha', 'upper-alpha',
'none' 'none'
), ],
false false
); );
$this->info['list-style-image'] = $uri_or_none; $this->info['list-style-image'] = $uri_or_none;
@ -95,34 +95,32 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config); $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config);
$this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum( $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum(
array('capitalize', 'uppercase', 'lowercase', 'none'), ['capitalize', 'uppercase', 'lowercase', 'none'],
false false
); );
$this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color(); $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color();
$this->info['background-image'] = $uri_or_none; $this->info['background-image'] = $uri_or_none;
$this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum( $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum(
array('repeat', 'repeat-x', 'repeat-y', 'no-repeat') ['repeat', 'repeat-x', 'repeat-y', 'no-repeat']
); );
$this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum( $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum(
array('scroll', 'fixed') ['scroll', 'fixed']
); );
$this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition();
$this->info['background-size'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['background-size'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum( new HTMLPurifier_AttrDef_Enum(
array( [
'auto', 'auto',
'cover', 'cover',
'contain', 'contain',
'initial', ]
'inherit',
)
), ),
new HTMLPurifier_AttrDef_CSS_Percentage(), new HTMLPurifier_AttrDef_CSS_Percentage(),
new HTMLPurifier_AttrDef_CSS_Length() new HTMLPurifier_AttrDef_CSS_Length()
) ]
); );
$border_color = $border_color =
@ -131,10 +129,10 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['border-left-color'] = $this->info['border-left-color'] =
$this->info['border-right-color'] = $this->info['border-right-color'] =
$this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum(array('transparent')), new HTMLPurifier_AttrDef_Enum(['transparent']),
new HTMLPurifier_AttrDef_CSS_Color() new HTMLPurifier_AttrDef_CSS_Color()
) ]
); );
$this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config); $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config);
@ -146,32 +144,32 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['border-bottom-width'] = $this->info['border-bottom-width'] =
$this->info['border-left-width'] = $this->info['border-left-width'] =
$this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')), new HTMLPurifier_AttrDef_Enum(['thin', 'medium', 'thick']),
new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative
) ]
); );
$this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width); $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width);
$this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum(array('normal')), new HTMLPurifier_AttrDef_Enum(['normal']),
new HTMLPurifier_AttrDef_CSS_Length() new HTMLPurifier_AttrDef_CSS_Length()
) ]
); );
$this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum(array('normal')), new HTMLPurifier_AttrDef_Enum(['normal']),
new HTMLPurifier_AttrDef_CSS_Length() new HTMLPurifier_AttrDef_CSS_Length()
) ]
); );
$this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum( new HTMLPurifier_AttrDef_Enum(
array( [
'xx-small', 'xx-small',
'x-small', 'x-small',
'small', 'small',
@ -181,20 +179,20 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'xx-large', 'xx-large',
'larger', 'larger',
'smaller' 'smaller'
) ]
), ),
new HTMLPurifier_AttrDef_CSS_Percentage(), new HTMLPurifier_AttrDef_CSS_Percentage(),
new HTMLPurifier_AttrDef_CSS_Length() new HTMLPurifier_AttrDef_CSS_Length()
) ]
); );
$this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum(array('normal')), new HTMLPurifier_AttrDef_Enum(['normal']),
new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives
new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true) new HTMLPurifier_AttrDef_CSS_Percentage(true)
) ]
); );
$margin = $margin =
@ -202,11 +200,11 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['margin-bottom'] = $this->info['margin-bottom'] =
$this->info['margin-left'] = $this->info['margin-left'] =
$this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length(), new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage(), new HTMLPurifier_AttrDef_CSS_Percentage(),
new HTMLPurifier_AttrDef_Enum(array('auto')) new HTMLPurifier_AttrDef_Enum(['auto'])
) ]
); );
$this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin); $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin);
@ -217,41 +215,40 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['padding-bottom'] = $this->info['padding-bottom'] =
$this->info['padding-left'] = $this->info['padding-left'] =
$this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true) new HTMLPurifier_AttrDef_CSS_Percentage(true)
) ]
); );
$this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding); $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding);
$this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length(), new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage() new HTMLPurifier_AttrDef_CSS_Percentage()
) ]
); );
$trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite( $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true), new HTMLPurifier_AttrDef_CSS_Percentage(true),
new HTMLPurifier_AttrDef_Enum(array('auto', 'initial', 'inherit')) new HTMLPurifier_AttrDef_Enum(['auto'])
) ]
); );
$trusted_min_wh = new HTMLPurifier_AttrDef_CSS_Composite( $trusted_min_wh = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true), new HTMLPurifier_AttrDef_CSS_Percentage(true),
new HTMLPurifier_AttrDef_Enum(array('initial', 'inherit')) ]
)
); );
$trusted_max_wh = new HTMLPurifier_AttrDef_CSS_Composite( $trusted_max_wh = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0'), new HTMLPurifier_AttrDef_CSS_Length('0'),
new HTMLPurifier_AttrDef_CSS_Percentage(true), new HTMLPurifier_AttrDef_CSS_Percentage(true),
new HTMLPurifier_AttrDef_Enum(array('none', 'initial', 'inherit')) new HTMLPurifier_AttrDef_Enum(['none'])
) ]
); );
$max = $config->get('CSS.MaxImgLength'); $max = $config->get('CSS.MaxImgLength');
@ -263,10 +260,10 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'img', 'img',
// For img tags: // For img tags:
new HTMLPurifier_AttrDef_CSS_Composite( new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0', $max), new HTMLPurifier_AttrDef_CSS_Length('0', $max),
new HTMLPurifier_AttrDef_Enum(array('auto')) new HTMLPurifier_AttrDef_Enum(['auto'])
) ]
), ),
// For everyone else: // For everyone else:
$trusted_wh $trusted_wh
@ -278,12 +275,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
new HTMLPurifier_AttrDef_Switch( new HTMLPurifier_AttrDef_Switch(
'img', 'img',
// For img tags: // For img tags:
new HTMLPurifier_AttrDef_CSS_Composite( new HTMLPurifier_AttrDef_CSS_Length('0', $max),
array(
new HTMLPurifier_AttrDef_CSS_Length('0', $max),
new HTMLPurifier_AttrDef_Enum(array('initial', 'inherit'))
)
),
// For everyone else: // For everyone else:
$trusted_min_wh $trusted_min_wh
); );
@ -295,22 +287,46 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'img', 'img',
// For img tags: // For img tags:
new HTMLPurifier_AttrDef_CSS_Composite( new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length('0', $max), new HTMLPurifier_AttrDef_CSS_Length('0', $max),
new HTMLPurifier_AttrDef_Enum(array('none', 'initial', 'inherit')) new HTMLPurifier_AttrDef_Enum(['none'])
) ]
), ),
// For everyone else: // For everyone else:
$trusted_max_wh $trusted_max_wh
); );
$this->info['aspect-ratio'] = new HTMLPurifier_AttrDef_CSS_Multiple(
new HTMLPurifier_AttrDef_CSS_Composite([
new HTMLPurifier_AttrDef_CSS_Ratio(),
new HTMLPurifier_AttrDef_Enum(['auto']),
])
);
// text-decoration and related shorthands
$this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration(); $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration();
$this->info['text-decoration-line'] = new HTMLPurifier_AttrDef_Enum(
['none', 'underline', 'overline', 'line-through']
);
$this->info['text-decoration-style'] = new HTMLPurifier_AttrDef_Enum(
['solid', 'double', 'dotted', 'dashed', 'wavy']
);
$this->info['text-decoration-color'] = new HTMLPurifier_AttrDef_CSS_Color();
$this->info['text-decoration-thickness'] = new HTMLPurifier_AttrDef_CSS_Composite([
new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage(),
new HTMLPurifier_AttrDef_Enum(['auto', 'from-font'])
]);
$this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily(); $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily();
// this could use specialized code // this could use specialized code
$this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum( $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum(
array( [
'normal', 'normal',
'bold', 'bold',
'bolder', 'bolder',
@ -324,7 +340,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'700', '700',
'800', '800',
'900' '900'
), ],
false false
); );
@ -340,21 +356,21 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
$this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config); $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config);
$this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum( $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum(
array('collapse', 'separate') ['collapse', 'separate']
); );
$this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum( $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum(
array('top', 'bottom') ['top', 'bottom']
); );
$this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum( $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum(
array('auto', 'fixed') ['auto', 'fixed']
); );
$this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Enum( new HTMLPurifier_AttrDef_Enum(
array( [
'baseline', 'baseline',
'sub', 'sub',
'super', 'super',
@ -363,11 +379,11 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'middle', 'middle',
'bottom', 'bottom',
'text-bottom' 'text-bottom'
) ]
), ),
new HTMLPurifier_AttrDef_CSS_Length(), new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage() new HTMLPurifier_AttrDef_CSS_Percentage()
) ]
); );
$this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2); $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2);
@ -375,7 +391,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
// These CSS properties don't work on many browsers, but we live // These CSS properties don't work on many browsers, but we live
// in THE FUTURE! // in THE FUTURE!
$this->info['white-space'] = new HTMLPurifier_AttrDef_Enum( $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(
array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line') ['nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line']
); );
if ($config->get('CSS.Proprietary')) { if ($config->get('CSS.Proprietary')) {
@ -422,21 +438,21 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
// more CSS3 // more CSS3
$this->info['page-break-after'] = $this->info['page-break-after'] =
$this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum( $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum(
array( [
'auto', 'auto',
'always', 'always',
'avoid', 'avoid',
'left', 'left',
'right' 'right'
) ]
); );
$this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid')); $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(['auto', 'avoid']);
$border_radius = new HTMLPurifier_AttrDef_CSS_Composite( $border_radius = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Percentage(true), // disallow negative new HTMLPurifier_AttrDef_CSS_Percentage(true), // disallow negative
new HTMLPurifier_AttrDef_CSS_Length('0') // disallow negative new HTMLPurifier_AttrDef_CSS_Length('0') // disallow negative
)); ]);
$this->info['border-top-left-radius'] = $this->info['border-top-left-radius'] =
$this->info['border-top-right-radius'] = $this->info['border-top-right-radius'] =
@ -453,7 +469,7 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
protected function doSetupTricky($config) protected function doSetupTricky($config)
{ {
$this->info['display'] = new HTMLPurifier_AttrDef_Enum( $this->info['display'] = new HTMLPurifier_AttrDef_Enum(
array( [
'inline', 'inline',
'block', 'block',
'list-item', 'list-item',
@ -472,12 +488,12 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
'table-cell', 'table-cell',
'table-caption', 'table-caption',
'none' 'none'
) ]
); );
$this->info['visibility'] = new HTMLPurifier_AttrDef_Enum( $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum(
array('visible', 'hidden', 'collapse') ['visible', 'hidden', 'collapse']
); );
$this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll')); $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(['visible', 'hidden', 'auto', 'scroll']);
$this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
} }
@ -487,23 +503,23 @@ class HTMLPurifier_CSSDefinition extends HTMLPurifier_Definition
protected function doSetupTrusted($config) protected function doSetupTrusted($config)
{ {
$this->info['position'] = new HTMLPurifier_AttrDef_Enum( $this->info['position'] = new HTMLPurifier_AttrDef_Enum(
array('static', 'relative', 'absolute', 'fixed') ['static', 'relative', 'absolute', 'fixed']
); );
$this->info['top'] = $this->info['top'] =
$this->info['left'] = $this->info['left'] =
$this->info['right'] = $this->info['right'] =
$this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_CSS_Length(), new HTMLPurifier_AttrDef_CSS_Length(),
new HTMLPurifier_AttrDef_CSS_Percentage(), new HTMLPurifier_AttrDef_CSS_Percentage(),
new HTMLPurifier_AttrDef_Enum(array('auto')), new HTMLPurifier_AttrDef_Enum(['auto']),
) ]
); );
$this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite( $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite(
array( [
new HTMLPurifier_AttrDef_Integer(), new HTMLPurifier_AttrDef_Integer(),
new HTMLPurifier_AttrDef_Enum(array('auto')), new HTMLPurifier_AttrDef_Enum(['auto']),
) ]
); );
} }

View file

@ -190,6 +190,9 @@ class HTMLPurifier_ChildDef_Table extends HTMLPurifier_ChildDef
$current_tr_tbody = null; $current_tr_tbody = null;
foreach($content as $node) { foreach($content as $node) {
if (!isset($node->name)) {
continue;
}
switch ($node->name) { switch ($node->name) {
case 'tbody': case 'tbody':
$current_tr_tbody = null; $current_tr_tbody = null;

View file

@ -21,7 +21,7 @@ class HTMLPurifier_Config
* HTML Purifier's version * HTML Purifier's version
* @type string * @type string
*/ */
public $version = '4.15.0'; public $version = '4.18.0';
/** /**
* Whether or not to automatically finalize * Whether or not to automatically finalize

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,10 @@
Core.RemoveBlanks
TYPE: bool
DEFAULT: false
VERSION: 4.18
--DESCRIPTION--
<p>
If set to true, blank nodes will be removed. This can be useful for maintaining
backwards compatibility when upgrading from previous versions of PHP.
</p>
--# vim: et sw=4 sts=4

View file

@ -287,13 +287,14 @@ class HTMLPurifier_DefinitionCache_Serializer extends HTMLPurifier_DefinitionCac
} elseif (filegroup($dir) === posix_getgid()) { } elseif (filegroup($dir) === posix_getgid()) {
$chmod = $chmod | 0070; $chmod = $chmod | 0070;
} else { } else {
// PHP's probably running as nobody, so we'll // PHP's probably running as nobody, it is
// need to give global permissions // not obvious how to fix this (777 is probably
$chmod = $chmod | 0777; // bad if you are multi-user), let the user figure it out
$chmod = null;
} }
trigger_error( trigger_error(
'Directory ' . $dir . ' not writable, ' . 'Directory ' . $dir . ' not writable. ' .
'please chmod to ' . decoct($chmod), ($chmod === null ? '' : 'Please chmod to ' . decoct($chmod)),
E_USER_WARNING E_USER_WARNING
); );
} else { } else {

View file

@ -71,7 +71,7 @@ class HTMLPurifier_DefinitionCacheFactory
return $this->caches[$method][$type]; return $this->caches[$method][$type];
} }
if (isset($this->implementations[$method]) && if (isset($this->implementations[$method]) &&
class_exists($class = $this->implementations[$method], false)) { class_exists($class = $this->implementations[$method])) {
$cache = new $class($type); $cache = new $class($type);
} else { } else {
if ($method != 'Serializer') { if ($method != 'Serializer') {

View file

@ -116,8 +116,8 @@ class HTMLPurifier_EntityParser
protected function entityCallback($matches) protected function entityCallback($matches)
{ {
$entity = $matches[0]; $entity = $matches[0];
$hex_part = @$matches[1]; $hex_part = isset($matches[1]) ? $matches[1] : null;
$dec_part = @$matches[2]; $dec_part = isset($matches[2]) ? $matches[2] : null;
$named_part = empty($matches[3]) ? (empty($matches[4]) ? "" : $matches[4]) : $matches[3]; $named_part = empty($matches[3]) ? (empty($matches[4]) ? "" : $matches[4]) : $matches[3];
if ($hex_part !== NULL && $hex_part !== "") { if ($hex_part !== NULL && $hex_part !== "") {
return HTMLPurifier_Encoder::unichr(hexdec($hex_part)); return HTMLPurifier_Encoder::unichr(hexdec($hex_part));

View file

@ -54,6 +54,11 @@ class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter
*/ */
private $_enum_attrdef; private $_enum_attrdef;
/**
* @type HTMLPurifier_AttrDef_Enum
*/
private $_universal_attrdef;
public function __construct() public function __construct()
{ {
$this->_tidy = new csstidy(); $this->_tidy = new csstidy();
@ -70,6 +75,13 @@ class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter
'focus' 'focus'
) )
); );
$this->_universal_attrdef = new HTMLPurifier_AttrDef_Enum(
array(
'initial',
'inherit',
'unset',
)
);
} }
/** /**
@ -146,175 +158,184 @@ class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter
foreach ($this->_tidy->css as $k => $decls) { foreach ($this->_tidy->css as $k => $decls) {
// $decls are all CSS declarations inside an @ selector // $decls are all CSS declarations inside an @ selector
$new_decls = array(); $new_decls = array();
foreach ($decls as $selector => $style) { if (is_array($decls)) {
$selector = trim($selector); foreach ($decls as $selector => $style) {
if ($selector === '') { $selector = trim($selector);
continue; if ($selector === '') {
} // should not happen continue;
// Parse the selector } // should not happen
// Here is the relevant part of the CSS grammar: // Parse the selector
// // Here is the relevant part of the CSS grammar:
// ruleset //
// : selector [ ',' S* selector ]* '{' ... // ruleset
// selector // : selector [ ',' S* selector ]* '{' ...
// : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]? // selector
// combinator // : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]?
// : '+' S* // combinator
// : '>' S* // : '+' S*
// simple_selector // : '>' S*
// : element_name [ HASH | class | attrib | pseudo ]* // simple_selector
// | [ HASH | class | attrib | pseudo ]+ // : element_name [ HASH | class | attrib | pseudo ]*
// element_name // | [ HASH | class | attrib | pseudo ]+
// : IDENT | '*' // element_name
// ; // : IDENT | '*'
// class // ;
// : '.' IDENT // class
// ; // : '.' IDENT
// attrib // ;
// : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S* // attrib
// [ IDENT | STRING ] S* ]? ']' // : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
// ; // [ IDENT | STRING ] S* ]? ']'
// pseudo // ;
// : ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ] // pseudo
// ; // : ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ]
// // ;
// For reference, here are the relevant tokens: //
// // For reference, here are the relevant tokens:
// HASH #{name} //
// IDENT {ident} // HASH #{name}
// INCLUDES == // IDENT {ident}
// DASHMATCH |= // INCLUDES ==
// STRING {string} // DASHMATCH |=
// FUNCTION {ident}\( // STRING {string}
// // FUNCTION {ident}\(
// And the lexical scanner tokens //
// // And the lexical scanner tokens
// name {nmchar}+ //
// nmchar [_a-z0-9-]|{nonascii}|{escape} // name {nmchar}+
// nonascii [\240-\377] // nmchar [_a-z0-9-]|{nonascii}|{escape}
// escape {unicode}|\\[^\r\n\f0-9a-f] // nonascii [\240-\377]
// unicode \\{h}}{1,6}(\r\n|[ \t\r\n\f])? // escape {unicode}|\\[^\r\n\f0-9a-f]
// ident -?{nmstart}{nmchar*} // unicode \\{h}}{1,6}(\r\n|[ \t\r\n\f])?
// nmstart [_a-z]|{nonascii}|{escape} // ident -?{nmstart}{nmchar*}
// string {string1}|{string2} // nmstart [_a-z]|{nonascii}|{escape}
// string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\" // string {string1}|{string2}
// string2 \'([^\n\r\f\\"]|\\{nl}|{escape})*\' // string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\"
// // string2 \'([^\n\r\f\\"]|\\{nl}|{escape})*\'
// We'll implement a subset (in order to reduce attack //
// surface); in particular: // We'll implement a subset (in order to reduce attack
// // surface); in particular:
// - No Unicode support //
// - No escapes support // - No Unicode support
// - No string support (by proxy no attrib support) // - No escapes support
// - element_name is matched against allowed // - No string support (by proxy no attrib support)
// elements (some people might find this // - element_name is matched against allowed
// annoying...) // elements (some people might find this
// - Pseudo-elements one of :first-child, :link, // annoying...)
// :visited, :active, :hover, :focus // - Pseudo-elements one of :first-child, :link,
// :visited, :active, :hover, :focus
// handle ruleset // handle ruleset
$selectors = array_map('trim', explode(',', $selector)); $selectors = array_map('trim', explode(',', $selector));
$new_selectors = array(); $new_selectors = array();
foreach ($selectors as $sel) { foreach ($selectors as $sel) {
// split on +, > and spaces // split on +, > and spaces
$basic_selectors = preg_split('/\s*([+> ])\s*/', $sel, -1, PREG_SPLIT_DELIM_CAPTURE); $basic_selectors = preg_split('/\s*([+> ])\s*/', $sel, -1, PREG_SPLIT_DELIM_CAPTURE);
// even indices are chunks, odd indices are // even indices are chunks, odd indices are
// delimiters // delimiters
$nsel = null; $nsel = null;
$delim = null; // guaranteed to be non-null after $delim = null; // guaranteed to be non-null after
// two loop iterations // two loop iterations
for ($i = 0, $c = count($basic_selectors); $i < $c; $i++) { for ($i = 0, $c = count($basic_selectors); $i < $c; $i++) {
$x = $basic_selectors[$i]; $x = $basic_selectors[$i];
if ($i % 2) { if ($i % 2) {
// delimiter // delimiter
if ($x === ' ') { if ($x === ' ') {
$delim = ' '; $delim = ' ';
} else {
$delim = ' ' . $x . ' ';
}
} else {
// simple selector
$components = preg_split('/([#.:])/', $x, -1, PREG_SPLIT_DELIM_CAPTURE);
$sdelim = null;
$nx = null;
for ($j = 0, $cc = count($components); $j < $cc; $j++) {
$y = $components[$j];
if ($j === 0) {
if ($y === '*' || isset($html_definition->info[$y = strtolower($y)])) {
$nx = $y;
} else {
// $nx stays null; this matters
// if we don't manage to find
// any valid selector content,
// in which case we ignore the
// outer $delim
}
} elseif ($j % 2) {
// set delimiter
$sdelim = $y;
} else { } else {
$attrdef = null; $delim = ' ' . $x . ' ';
if ($sdelim === '#') {
$attrdef = $this->_id_attrdef;
} elseif ($sdelim === '.') {
$attrdef = $this->_class_attrdef;
} elseif ($sdelim === ':') {
$attrdef = $this->_enum_attrdef;
} else {
throw new HTMLPurifier_Exception('broken invariant sdelim and preg_split');
}
$r = $attrdef->validate($y, $config, $context);
if ($r !== false) {
if ($r !== true) {
$y = $r;
}
if ($nx === null) {
$nx = '';
}
$nx .= $sdelim . $y;
}
}
}
if ($nx !== null) {
if ($nsel === null) {
$nsel = $nx;
} else {
$nsel .= $delim . $nx;
} }
} else { } else {
// delimiters to the left of invalid // simple selector
// basic selector ignored $components = preg_split('/([#.:])/', $x, -1, PREG_SPLIT_DELIM_CAPTURE);
$sdelim = null;
$nx = null;
for ($j = 0, $cc = count($components); $j < $cc; $j++) {
$y = $components[$j];
if ($j === 0) {
if ($y === '*' || isset($html_definition->info[$y = strtolower($y)])) {
$nx = $y;
} else {
// $nx stays null; this matters
// if we don't manage to find
// any valid selector content,
// in which case we ignore the
// outer $delim
}
} elseif ($j % 2) {
// set delimiter
$sdelim = $y;
} else {
$attrdef = null;
if ($sdelim === '#') {
$attrdef = $this->_id_attrdef;
} elseif ($sdelim === '.') {
$attrdef = $this->_class_attrdef;
} elseif ($sdelim === ':') {
$attrdef = $this->_enum_attrdef;
} else {
throw new HTMLPurifier_Exception('broken invariant sdelim and preg_split');
}
$r = $attrdef->validate($y, $config, $context);
if ($r !== false) {
if ($r !== true) {
$y = $r;
}
if ($nx === null) {
$nx = '';
}
$nx .= $sdelim . $y;
}
}
}
if ($nx !== null) {
if ($nsel === null) {
$nsel = $nx;
} else {
$nsel .= $delim . $nx;
}
} else {
// delimiters to the left of invalid
// basic selector ignored
}
}
}
if ($nsel !== null) {
if (!empty($scopes)) {
foreach ($scopes as $s) {
$new_selectors[] = "$s $nsel";
}
} else {
$new_selectors[] = $nsel;
} }
} }
} }
if ($nsel !== null) { if (empty($new_selectors)) {
if (!empty($scopes)) {
foreach ($scopes as $s) {
$new_selectors[] = "$s $nsel";
}
} else {
$new_selectors[] = $nsel;
}
}
}
if (empty($new_selectors)) {
continue;
}
$selector = implode(', ', $new_selectors);
foreach ($style as $name => $value) {
if (!isset($css_definition->info[$name])) {
unset($style[$name]);
continue; continue;
} }
$def = $css_definition->info[$name]; $selector = implode(', ', $new_selectors);
$ret = $def->validate($value, $config, $context); foreach ($style as $name => $value) {
if ($ret === false) { if (!isset($css_definition->info[$name])) {
unset($style[$name]); unset($style[$name]);
} else { continue;
$style[$name] = $ret; }
$uni_ret = $this->_universal_attrdef->validate($value, $config, $context);
if ($uni_ret !== false) {
$style[$name] = $uni_ret;
continue;
}
$def = $css_definition->info[$name];
$ret = $def->validate($value, $config, $context);
if ($ret === false) {
unset($style[$name]);
} else {
$style[$name] = $ret;
}
} }
$new_decls[$selector] = $style;
} }
$new_decls[$selector] = $style; } else {
continue;
} }
$new_css[$k] = $new_decls; $new_css[$k] = $new_decls;
} }

View file

@ -28,22 +28,28 @@ class HTMLPurifier_HTMLModule_Iframe extends HTMLPurifier_HTMLModule
if ($config->get('HTML.SafeIframe')) { if ($config->get('HTML.SafeIframe')) {
$this->safe = true; $this->safe = true;
} }
$attrs = array(
'src' => 'URI#embedded',
'width' => 'Length',
'height' => 'Length',
'name' => 'ID',
'scrolling' => 'Enum#yes,no,auto',
'frameborder' => 'Enum#0,1',
'longdesc' => 'URI',
'marginheight' => 'Pixels',
'marginwidth' => 'Pixels',
);
if ($config->get('HTML.Trusted')) {
$attrs['allowfullscreen'] = 'Bool#allowfullscreen';
}
$this->addElement( $this->addElement(
'iframe', 'iframe',
'Inline', 'Inline',
'Flow', 'Flow',
'Common', 'Common',
array( $attrs
'src' => 'URI#embedded',
'width' => 'Length',
'height' => 'Length',
'name' => 'ID',
'scrolling' => 'Enum#yes,no,auto',
'frameborder' => 'Enum#0,1',
'longdesc' => 'URI',
'marginheight' => 'Pixels',
'marginwidth' => 'Pixels',
)
); );
} }
} }

View file

@ -221,6 +221,7 @@ class HTMLPurifier_HTMLModule_Tidy extends HTMLPurifier_HTMLModule
*/ */
public function makeFixes() public function makeFixes()
{ {
return array();
} }
} }

View file

@ -109,7 +109,7 @@ class HTMLPurifier_LanguageFactory
} else { } else {
$class = 'HTMLPurifier_Language_' . $pcode; $class = 'HTMLPurifier_Language_' . $pcode;
$file = $this->dir . '/Language/classes/' . $code . '.php'; $file = $this->dir . '/Language/classes/' . $code . '.php';
if (file_exists($file) || class_exists($class, false)) { if (file_exists($file) || class_exists($class)) {
$lang = new $class($config, $context); $lang = new $class($config, $context);
} else { } else {
// Go fallback // Go fallback

View file

@ -101,7 +101,7 @@ class HTMLPurifier_Lexer
break; break;
} }
if (class_exists('DOMDocument', false) && if (class_exists('DOMDocument') &&
method_exists('DOMDocument', 'loadHTML') && method_exists('DOMDocument', 'loadHTML') &&
!extension_loaded('domxml') !extension_loaded('domxml')
) { ) {
@ -269,20 +269,6 @@ class HTMLPurifier_Lexer
); );
} }
/**
* Special Internet Explorer conditional comments should be removed.
* @param string $string HTML string to process.
* @return string HTML with conditional comments removed.
*/
protected static function removeIEConditional($string)
{
return preg_replace(
'#<!--\[if [^>]+\]>.*?<!\[endif\]-->#si', // probably should generalize for all strings
'',
$string
);
}
/** /**
* Callback function for escapeCDATA() that does the work. * Callback function for escapeCDATA() that does the work.
* *
@ -323,8 +309,6 @@ class HTMLPurifier_Lexer
// escape CDATA // escape CDATA
$html = $this->escapeCDATA($html); $html = $this->escapeCDATA($html);
$html = $this->removeIEConditional($html);
// extract body from document if applicable // extract body from document if applicable
if ($config->get('Core.ConvertDocumentToFragment')) { if ($config->get('Core.ConvertDocumentToFragment')) {
$e = false; $e = false;

View file

@ -72,6 +72,9 @@ class HTMLPurifier_Lexer_DOMLex extends HTMLPurifier_Lexer
if ($config->get('Core.AllowParseManyTags') && defined('LIBXML_PARSEHUGE')) { if ($config->get('Core.AllowParseManyTags') && defined('LIBXML_PARSEHUGE')) {
$options |= LIBXML_PARSEHUGE; $options |= LIBXML_PARSEHUGE;
} }
if ($config->get('Core.RemoveBlanks') && defined('LIBXML_NOBLANKS')) {
$options |= LIBXML_NOBLANKS;
}
set_error_handler(array($this, 'muteErrorHandler')); set_error_handler(array($this, 'muteErrorHandler'));
// loadHTML() fails on PHP 5.3 when second parameter is given // loadHTML() fails on PHP 5.3 when second parameter is given
@ -104,7 +107,6 @@ class HTMLPurifier_Lexer_DOMLex extends HTMLPurifier_Lexer
* To iterate is human, to recurse divine - L. Peter Deutsch * To iterate is human, to recurse divine - L. Peter Deutsch
* @param DOMNode $node DOMNode to be tokenized. * @param DOMNode $node DOMNode to be tokenized.
* @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens. * @param HTMLPurifier_Token[] $tokens Array-list of already tokenized tokens.
* @return HTMLPurifier_Token of node appended to previously passed tokens.
*/ */
protected function tokenizeDOM($node, &$tokens, $config) protected function tokenizeDOM($node, &$tokens, $config)
{ {

View file

@ -32,6 +32,11 @@ class HTMLPurifier_Printer_ConfigForm extends HTMLPurifier_Printer
*/ */
protected $compress = false; protected $compress = false;
/**
* @var HTMLPurifier_Config
*/
protected $genConfig;
/** /**
* @param string $name Form element name for directives to be stuffed into * @param string $name Form element name for directives to be stuffed into
* @param string $doc_url String documentation URL, will have fragment tagged on * @param string $doc_url String documentation URL, will have fragment tagged on

View file

@ -44,7 +44,7 @@ abstract class HTMLPurifier_Token_Tag extends HTMLPurifier_Token
$this->name = ctype_lower($name) ? $name : strtolower($name); $this->name = ctype_lower($name) ? $name : strtolower($name);
foreach ($attr as $key => $value) { foreach ($attr as $key => $value) {
// normalization only necessary when key is not lowercase // normalization only necessary when key is not lowercase
if (!ctype_lower($key)) { if (!ctype_lower((string)$key)) {
$new_key = strtolower($key); $new_key = strtolower($key);
if (!isset($attr[$new_key])) { if (!isset($attr[$new_key])) {
$attr[$new_key] = $attr[$key]; $attr[$new_key] = $attr[$key];

View file

@ -33,11 +33,11 @@ class HTMLPurifier_URIScheme_tel extends HTMLPurifier_URIScheme
$uri->host = null; $uri->host = null;
$uri->port = null; $uri->port = null;
// Delete all non-numeric characters, non-x characters // Delete all non-numeric characters, commas, and non-x characters
// from phone number, EXCEPT for a leading plus sign. // from phone number, EXCEPT for a leading plus sign.
$uri->path = preg_replace('/(?!^\+)[^\dx]/', '', $uri->path = preg_replace('/(?!^\+)[^\dx,]/', '',
// Normalize e(x)tension to lower-case // Normalize e(x)tension to lower-case
str_replace('X', 'x', $uri->path)); str_replace('X', 'x', rawurldecode($uri->path)));
return true; return true;
} }

View file

@ -261,7 +261,7 @@ class HTMLPurifier_UnitConverter
*/ */
private function round($n, $sigfigs) private function round($n, $sigfigs)
{ {
$new_log = (int)floor(log(abs($n), 10)); // Number of digits left of decimal - 1 $new_log = (int)floor(log(abs((float)$n), 10)); // Number of digits left of decimal - 1
$rp = $sigfigs - $new_log - 1; // Number of decimal places needed $rp = $sigfigs - $new_log - 1; // Number of decimal places needed
$neg = $n < 0 ? '-' : ''; // Negative sign $neg = $n < 0 ? '-' : ''; // Negative sign
if ($this->bcmath) { if ($this->bcmath) {
@ -276,7 +276,7 @@ class HTMLPurifier_UnitConverter
} }
return $n; return $n;
} else { } else {
return $this->scale(round($n, $sigfigs - $new_log - 1), $rp + 1); return $this->scale(round((float)$n, $sigfigs - $new_log - 1), $rp + 1);
} }
} }
@ -300,7 +300,7 @@ class HTMLPurifier_UnitConverter
// Now we return it, truncating the zero that was rounded off. // Now we return it, truncating the zero that was rounded off.
return substr($precise, 0, -1) . str_repeat('0', -$scale + 1); return substr($precise, 0, -1) . str_repeat('0', -$scale + 1);
} }
return sprintf('%.' . $scale . 'f', (float)$r); return number_format((float)$r, $scale, '.', '');
} }
} }

View file

@ -3,6 +3,37 @@
Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version. Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version.
## 7.9.2 - 2024-07-24
### Fixed
- Adjusted handler selection to use cURL if its version is 7.21.2 or higher, rather than 7.34.0
## 7.9.1 - 2024-07-19
### Fixed
- Fix TLS 1.3 check for HTTP/2 requests
## 7.9.0 - 2024-07-18
### Changed
- Improve protocol version checks to provide feedback around unsupported protocols
- Only select the cURL handler by default if 7.34.0 or higher is linked
- Improved `CurlMultiHandler` to avoid busy wait if possible
- Dropped support for EOL `guzzlehttp/psr7` v1
- Improved URI user info redaction in errors
## 7.8.2 - 2024-07-18
### Added
- Support for PHP 8.4
## 7.8.1 - 2023-12-03 ## 7.8.1 - 2023-12-03
### Changed ### Changed

View file

@ -62,11 +62,11 @@ composer require guzzlehttp/guzzle
| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version | | Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version |
|---------|---------------------|---------------------|--------------|---------------------|---------------------|-------|--------------| |---------|---------------------|---------------------|--------------|---------------------|---------------------|-------|--------------|
| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >=5.3.3,<7.0 | | 3.x | EOL (2016-10-31) | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >=5.3.3,<7.0 |
| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >=5.4,<7.0 | | 4.x | EOL (2016-10-31) | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >=5.4,<7.0 |
| 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >=5.4,<7.4 | | 5.x | EOL (2019-10-31) | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >=5.4,<7.4 |
| 6.x | Security fixes only | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >=5.5,<8.0 | | 6.x | EOL (2023-10-31) | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >=5.5,<8.0 |
| 7.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes | >=7.2.5,<8.4 | | 7.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes | >=7.2.5,<8.5 |
[guzzle-3-repo]: https://github.com/guzzle/guzzle3 [guzzle-3-repo]: https://github.com/guzzle/guzzle3
[guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x [guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x

View file

@ -50,11 +50,39 @@
"homepage": "https://github.com/Tobion" "homepage": "https://github.com/Tobion"
} }
], ],
"repositories": [
{
"type": "package",
"package": {
"name": "guzzle/client-integration-tests",
"version": "v3.0.2",
"dist": {
"url": "https://codeload.github.com/guzzle/client-integration-tests/zip/2c025848417c1135031fdf9c728ee53d0a7ceaee",
"type": "zip"
},
"require": {
"php": "^7.2.5 || ^8.0",
"phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.11",
"php-http/message": "^1.0 || ^2.0",
"guzzlehttp/psr7": "^1.7 || ^2.0",
"th3n3rd/cartesian-product": "^0.3"
},
"autoload": {
"psr-4": {
"Http\\Client\\Tests\\": "src/"
}
},
"bin": [
"bin/http_test_server"
]
}
}
],
"require": { "require": {
"php": "^7.2.5 || ^8.0", "php": "^7.2.5 || ^8.0",
"ext-json": "*", "ext-json": "*",
"guzzlehttp/promises": "^1.5.3 || ^2.0.1", "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
"guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "guzzlehttp/psr7": "^2.7.0",
"psr/http-client": "^1.0", "psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0" "symfony/deprecation-contracts": "^2.2 || ^3.0"
}, },
@ -64,9 +92,9 @@
"require-dev": { "require-dev": {
"ext-curl": "*", "ext-curl": "*",
"bamarni/composer-bin-plugin": "^1.8.2", "bamarni/composer-bin-plugin": "^1.8.2",
"php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", "guzzle/client-integration-tests": "3.0.2",
"php-http/message-factory": "^1.1", "php-http/message-factory": "^1.1",
"phpunit/phpunit": "^8.5.36 || ^9.6.15", "phpunit/phpunit": "^8.5.39 || ^9.6.20",
"psr/log": "^1.1 || ^2.0 || ^3.0" "psr/log": "^1.1 || ^2.0 || ^3.0"
}, },
"suggest": { "suggest": {

View file

@ -11,7 +11,7 @@ final class BodySummarizer implements BodySummarizerInterface
*/ */
private $truncateAt; private $truncateAt;
public function __construct(int $truncateAt = null) public function __construct(?int $truncateAt = null)
{ {
$this->truncateAt = $truncateAt; $this->truncateAt = $truncateAt;
} }
@ -22,7 +22,7 @@ final class BodySummarizer implements BodySummarizerInterface
public function summarize(MessageInterface $message): ?string public function summarize(MessageInterface $message): ?string
{ {
return $this->truncateAt === null return $this->truncateAt === null
? \GuzzleHttp\Psr7\Message::bodySummary($message) ? Psr7\Message::bodySummary($message)
: \GuzzleHttp\Psr7\Message::bodySummary($message, $this->truncateAt); : Psr7\Message::bodySummary($message, $this->truncateAt);
} }
} }

View file

@ -52,7 +52,7 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
* *
* @param array $config Client configuration settings. * @param array $config Client configuration settings.
* *
* @see \GuzzleHttp\RequestOptions for a list of available request options. * @see RequestOptions for a list of available request options.
*/ */
public function __construct(array $config = []) public function __construct(array $config = [])
{ {
@ -202,7 +202,7 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
* *
* @deprecated Client::getConfig will be removed in guzzlehttp/guzzle:8.0. * @deprecated Client::getConfig will be removed in guzzlehttp/guzzle:8.0.
*/ */
public function getConfig(string $option = null) public function getConfig(?string $option = null)
{ {
return $option === null return $option === null
? $this->config ? $this->config

View file

@ -80,5 +80,5 @@ interface ClientInterface
* *
* @deprecated ClientInterface::getConfig will be removed in guzzlehttp/guzzle:8.0. * @deprecated ClientInterface::getConfig will be removed in guzzlehttp/guzzle:8.0.
*/ */
public function getConfig(string $option = null); public function getConfig(?string $option = null);
} }

View file

@ -103,7 +103,7 @@ class CookieJar implements CookieJarInterface
}, $this->getIterator()->getArrayCopy()); }, $this->getIterator()->getArrayCopy());
} }
public function clear(string $domain = null, string $path = null, string $name = null): void public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void
{ {
if (!$domain) { if (!$domain) {
$this->cookies = []; $this->cookies = [];

View file

@ -62,7 +62,7 @@ interface CookieJarInterface extends \Countable, \IteratorAggregate
* @param string|null $path Clears cookies matching a domain and path * @param string|null $path Clears cookies matching a domain and path
* @param string|null $name Clears cookies matching a domain, path, and name * @param string|null $name Clears cookies matching a domain, path, and name
*/ */
public function clear(string $domain = null, string $path = null, string $name = null): void; public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void;
/** /**
* Discard all sessions cookies. * Discard all sessions cookies.

View file

@ -14,7 +14,7 @@ class BadResponseException extends RequestException
string $message, string $message,
RequestInterface $request, RequestInterface $request,
ResponseInterface $response, ResponseInterface $response,
\Throwable $previous = null, ?\Throwable $previous = null,
array $handlerContext = [] array $handlerContext = []
) { ) {
parent::__construct($message, $request, $response, $previous, $handlerContext); parent::__construct($message, $request, $response, $previous, $handlerContext);

View file

@ -25,7 +25,7 @@ class ConnectException extends TransferException implements NetworkExceptionInte
public function __construct( public function __construct(
string $message, string $message,
RequestInterface $request, RequestInterface $request,
\Throwable $previous = null, ?\Throwable $previous = null,
array $handlerContext = [] array $handlerContext = []
) { ) {
parent::__construct($message, 0, $previous); parent::__construct($message, 0, $previous);

View file

@ -7,7 +7,6 @@ use GuzzleHttp\BodySummarizerInterface;
use Psr\Http\Client\RequestExceptionInterface; use Psr\Http\Client\RequestExceptionInterface;
use Psr\Http\Message\RequestInterface; use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
/** /**
* HTTP Request exception * HTTP Request exception
@ -32,8 +31,8 @@ class RequestException extends TransferException implements RequestExceptionInte
public function __construct( public function __construct(
string $message, string $message,
RequestInterface $request, RequestInterface $request,
ResponseInterface $response = null, ?ResponseInterface $response = null,
\Throwable $previous = null, ?\Throwable $previous = null,
array $handlerContext = [] array $handlerContext = []
) { ) {
// Set the code of the exception if the response is set and not future. // Set the code of the exception if the response is set and not future.
@ -63,10 +62,10 @@ class RequestException extends TransferException implements RequestExceptionInte
*/ */
public static function create( public static function create(
RequestInterface $request, RequestInterface $request,
ResponseInterface $response = null, ?ResponseInterface $response = null,
\Throwable $previous = null, ?\Throwable $previous = null,
array $handlerContext = [], array $handlerContext = [],
BodySummarizerInterface $bodySummarizer = null ?BodySummarizerInterface $bodySummarizer = null
): self { ): self {
if (!$response) { if (!$response) {
return new self( return new self(
@ -90,8 +89,7 @@ class RequestException extends TransferException implements RequestExceptionInte
$className = __CLASS__; $className = __CLASS__;
} }
$uri = $request->getUri(); $uri = \GuzzleHttp\Psr7\Utils::redactUserInfo($request->getUri());
$uri = static::obfuscateUri($uri);
// Client Error: `GET /` resulted in a `404 Not Found` response: // Client Error: `GET /` resulted in a `404 Not Found` response:
// <html> ... (truncated) // <html> ... (truncated)
@ -113,20 +111,6 @@ class RequestException extends TransferException implements RequestExceptionInte
return new $className($message, $request, $response, $previous, $handlerContext); return new $className($message, $request, $response, $previous, $handlerContext);
} }
/**
* Obfuscates URI if there is a username and a password present
*/
private static function obfuscateUri(UriInterface $uri): UriInterface
{
$userInfo = $uri->getUserInfo();
if (false !== ($pos = \strpos($userInfo, ':'))) {
return $uri->withUserInfo(\substr($userInfo, 0, $pos), '***');
}
return $uri;
}
/** /**
* Get the request that caused the exception * Get the request that caused the exception
*/ */

View file

@ -11,6 +11,7 @@ use GuzzleHttp\Psr7\LazyOpenStream;
use GuzzleHttp\TransferStats; use GuzzleHttp\TransferStats;
use GuzzleHttp\Utils; use GuzzleHttp\Utils;
use Psr\Http\Message\RequestInterface; use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\UriInterface;
/** /**
* Creates curl resources from a request * Creates curl resources from a request
@ -46,6 +47,16 @@ class CurlFactory implements CurlFactoryInterface
public function create(RequestInterface $request, array $options): EasyHandle public function create(RequestInterface $request, array $options): EasyHandle
{ {
$protocolVersion = $request->getProtocolVersion();
if ('2' === $protocolVersion || '2.0' === $protocolVersion) {
if (!self::supportsHttp2()) {
throw new ConnectException('HTTP/2 is supported by the cURL handler, however libcurl is built without HTTP/2 support.', $request);
}
} elseif ('1.0' !== $protocolVersion && '1.1' !== $protocolVersion) {
throw new ConnectException(sprintf('HTTP/%s is not supported by the cURL handler.', $protocolVersion), $request);
}
if (isset($options['curl']['body_as_string'])) { if (isset($options['curl']['body_as_string'])) {
$options['_body_as_string'] = $options['curl']['body_as_string']; $options['_body_as_string'] = $options['curl']['body_as_string'];
unset($options['curl']['body_as_string']); unset($options['curl']['body_as_string']);
@ -72,6 +83,42 @@ class CurlFactory implements CurlFactoryInterface
return $easy; return $easy;
} }
private static function supportsHttp2(): bool
{
static $supportsHttp2 = null;
if (null === $supportsHttp2) {
$supportsHttp2 = self::supportsTls12()
&& defined('CURL_VERSION_HTTP2')
&& (\CURL_VERSION_HTTP2 & \curl_version()['features']);
}
return $supportsHttp2;
}
private static function supportsTls12(): bool
{
static $supportsTls12 = null;
if (null === $supportsTls12) {
$supportsTls12 = \CURL_SSLVERSION_TLSv1_2 & \curl_version()['features'];
}
return $supportsTls12;
}
private static function supportsTls13(): bool
{
static $supportsTls13 = null;
if (null === $supportsTls13) {
$supportsTls13 = defined('CURL_SSLVERSION_TLSv1_3')
&& (\CURL_SSLVERSION_TLSv1_3 & \curl_version()['features']);
}
return $supportsTls13;
}
public function release(EasyHandle $easy): void public function release(EasyHandle $easy): void
{ {
$resource = $easy->handle; $resource = $easy->handle;
@ -147,7 +194,7 @@ class CurlFactory implements CurlFactoryInterface
'error' => \curl_error($easy->handle), 'error' => \curl_error($easy->handle),
'appconnect_time' => \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME), 'appconnect_time' => \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME),
] + \curl_getinfo($easy->handle); ] + \curl_getinfo($easy->handle);
$ctx[self::CURL_VERSION_STR] = \curl_version()['version']; $ctx[self::CURL_VERSION_STR] = self::getCurlVersion();
$factory->release($easy); $factory->release($easy);
// Retry when nothing is present or when curl failed to rewind. // Retry when nothing is present or when curl failed to rewind.
@ -158,6 +205,17 @@ class CurlFactory implements CurlFactoryInterface
return self::createRejection($easy, $ctx); return self::createRejection($easy, $ctx);
} }
private static function getCurlVersion(): string
{
static $curlVersion = null;
if (null === $curlVersion) {
$curlVersion = \curl_version()['version'];
}
return $curlVersion;
}
private static function createRejection(EasyHandle $easy, array $ctx): PromiseInterface private static function createRejection(EasyHandle $easy, array $ctx): PromiseInterface
{ {
static $connectionErrors = [ static $connectionErrors = [
@ -194,15 +252,22 @@ class CurlFactory implements CurlFactoryInterface
); );
} }
$uri = $easy->request->getUri();
$sanitizedError = self::sanitizeCurlError($ctx['error'] ?? '', $uri);
$message = \sprintf( $message = \sprintf(
'cURL error %s: %s (%s)', 'cURL error %s: %s (%s)',
$ctx['errno'], $ctx['errno'],
$ctx['error'], $sanitizedError,
'see https://curl.haxx.se/libcurl/c/libcurl-errors.html' 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html'
); );
$uriString = (string) $easy->request->getUri();
if ($uriString !== '' && false === \strpos($ctx['error'], $uriString)) { if ('' !== $sanitizedError) {
$message .= \sprintf(' for %s', $uriString); $redactedUriString = \GuzzleHttp\Psr7\Utils::redactUserInfo($uri)->__toString();
if ($redactedUriString !== '' && false === \strpos($sanitizedError, $redactedUriString)) {
$message .= \sprintf(' for %s', $redactedUriString);
}
} }
// Create a connection exception if it was a specific error code. // Create a connection exception if it was a specific error code.
@ -213,6 +278,24 @@ class CurlFactory implements CurlFactoryInterface
return P\Create::rejectionFor($error); return P\Create::rejectionFor($error);
} }
private static function sanitizeCurlError(string $error, UriInterface $uri): string
{
if ('' === $error) {
return $error;
}
$baseUri = $uri->withQuery('')->withFragment('');
$baseUriString = $baseUri->__toString();
if ('' === $baseUriString) {
return $error;
}
$redactedUriString = \GuzzleHttp\Psr7\Utils::redactUserInfo($baseUri)->__toString();
return str_replace($baseUriString, $redactedUriString, $error);
}
/** /**
* @return array<int|string, mixed> * @return array<int|string, mixed>
*/ */
@ -232,10 +315,11 @@ class CurlFactory implements CurlFactoryInterface
} }
$version = $easy->request->getProtocolVersion(); $version = $easy->request->getProtocolVersion();
if ($version == 1.1) {
$conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_1; if ('2' === $version || '2.0' === $version) {
} elseif ($version == 2.0) {
$conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2_0; $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2_0;
} elseif ('1.1' === $version) {
$conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_1;
} else { } else {
$conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_0; $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_0;
} }
@ -390,8 +474,10 @@ class CurlFactory implements CurlFactoryInterface
// The empty string enables all available decoders and implicitly // The empty string enables all available decoders and implicitly
// sets a matching 'Accept-Encoding' header. // sets a matching 'Accept-Encoding' header.
$conf[\CURLOPT_ENCODING] = ''; $conf[\CURLOPT_ENCODING] = '';
// But as the user did not specify any acceptable encodings we need // But as the user did not specify any encoding preference,
// to overwrite this implicit header with an empty one. // let's leave it up to server by preventing curl from sending
// the header, which will be interpreted as 'Accept-Encoding: *'.
// https://www.rfc-editor.org/rfc/rfc9110#field.accept-encoding
$conf[\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:'; $conf[\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:';
} }
} }
@ -455,23 +541,35 @@ class CurlFactory implements CurlFactoryInterface
} }
if (isset($options['crypto_method'])) { if (isset($options['crypto_method'])) {
if (\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method']) { $protocolVersion = $easy->request->getProtocolVersion();
if (!defined('CURL_SSLVERSION_TLSv1_0')) {
throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.0 not supported by your version of cURL'); // If HTTP/2, upgrade TLS 1.0 and 1.1 to 1.2
if ('2' === $protocolVersion || '2.0' === $protocolVersion) {
if (
\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method']
|| \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method']
|| \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']
) {
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_2;
} elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) {
if (!self::supportsTls13()) {
throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL');
}
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_3;
} else {
throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided');
} }
} elseif (\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method']) {
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_0; $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_0;
} elseif (\STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method']) { } elseif (\STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT === $options['crypto_method']) {
if (!defined('CURL_SSLVERSION_TLSv1_1')) {
throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.1 not supported by your version of cURL');
}
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_1; $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_1;
} elseif (\STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']) { } elseif (\STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']) {
if (!defined('CURL_SSLVERSION_TLSv1_2')) { if (!self::supportsTls12()) {
throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.2 not supported by your version of cURL'); throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.2 not supported by your version of cURL');
} }
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_2; $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_2;
} elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) { } elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) {
if (!defined('CURL_SSLVERSION_TLSv1_3')) { if (!self::supportsTls13()) {
throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL'); throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.3 not supported by your version of cURL');
} }
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_3; $conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_3;

View file

@ -2,6 +2,7 @@
namespace GuzzleHttp\Handler; namespace GuzzleHttp\Handler;
use Closure;
use GuzzleHttp\Promise as P; use GuzzleHttp\Promise as P;
use GuzzleHttp\Promise\Promise; use GuzzleHttp\Promise\Promise;
use GuzzleHttp\Promise\PromiseInterface; use GuzzleHttp\Promise\PromiseInterface;
@ -159,6 +160,9 @@ class CurlMultiHandler
} }
} }
// Run curl_multi_exec in the queue to enable other async tasks to run
P\Utils::queue()->add(Closure::fromCallable([$this, 'tickInQueue']));
// Step through the task queue which may add additional requests. // Step through the task queue which may add additional requests.
P\Utils::queue()->run(); P\Utils::queue()->run();
@ -169,11 +173,24 @@ class CurlMultiHandler
} }
while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) { while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) {
// Prevent busy looping for slow HTTP requests.
\curl_multi_select($this->_mh, $this->selectTimeout);
} }
$this->processMessages(); $this->processMessages();
} }
/**
* Runs \curl_multi_exec() inside the event loop, to prevent busy looping
*/
private function tickInQueue(): void
{
if (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) {
\curl_multi_select($this->_mh, 0);
P\Utils::queue()->add(Closure::fromCallable([$this, 'tickInQueue']));
}
}
/** /**
* Runs until all outstanding connections have completed. * Runs until all outstanding connections have completed.
*/ */

View file

@ -52,21 +52,21 @@ class MockHandler implements \Countable
* @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled. * @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled.
* @param callable|null $onRejected Callback to invoke when the return value is rejected. * @param callable|null $onRejected Callback to invoke when the return value is rejected.
*/ */
public static function createWithMiddleware(array $queue = null, callable $onFulfilled = null, callable $onRejected = null): HandlerStack public static function createWithMiddleware(?array $queue = null, ?callable $onFulfilled = null, ?callable $onRejected = null): HandlerStack
{ {
return HandlerStack::create(new self($queue, $onFulfilled, $onRejected)); return HandlerStack::create(new self($queue, $onFulfilled, $onRejected));
} }
/** /**
* The passed in value must be an array of * The passed in value must be an array of
* {@see \Psr\Http\Message\ResponseInterface} objects, Exceptions, * {@see ResponseInterface} objects, Exceptions,
* callables, or Promises. * callables, or Promises.
* *
* @param array<int, mixed>|null $queue The parameters to be passed to the append function, as an indexed array. * @param array<int, mixed>|null $queue The parameters to be passed to the append function, as an indexed array.
* @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled. * @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled.
* @param callable|null $onRejected Callback to invoke when the return value is rejected. * @param callable|null $onRejected Callback to invoke when the return value is rejected.
*/ */
public function __construct(array $queue = null, callable $onFulfilled = null, callable $onRejected = null) public function __construct(?array $queue = null, ?callable $onFulfilled = null, ?callable $onRejected = null)
{ {
$this->onFulfilled = $onFulfilled; $this->onFulfilled = $onFulfilled;
$this->onRejected = $onRejected; $this->onRejected = $onRejected;
@ -200,7 +200,7 @@ class MockHandler implements \Countable
private function invokeStats( private function invokeStats(
RequestInterface $request, RequestInterface $request,
array $options, array $options,
ResponseInterface $response = null, ?ResponseInterface $response = null,
$reason = null $reason = null
): void { ): void {
if (isset($options['on_stats'])) { if (isset($options['on_stats'])) {

View file

@ -40,6 +40,12 @@ class StreamHandler
\usleep($options['delay'] * 1000); \usleep($options['delay'] * 1000);
} }
$protocolVersion = $request->getProtocolVersion();
if ('1.0' !== $protocolVersion && '1.1' !== $protocolVersion) {
throw new ConnectException(sprintf('HTTP/%s is not supported by the stream handler.', $protocolVersion), $request);
}
$startTime = isset($options['on_stats']) ? Utils::currentTime() : null; $startTime = isset($options['on_stats']) ? Utils::currentTime() : null;
try { try {
@ -83,8 +89,8 @@ class StreamHandler
array $options, array $options,
RequestInterface $request, RequestInterface $request,
?float $startTime, ?float $startTime,
ResponseInterface $response = null, ?ResponseInterface $response = null,
\Throwable $error = null ?\Throwable $error = null
): void { ): void {
if (isset($options['on_stats'])) { if (isset($options['on_stats'])) {
$stats = new TransferStats($request, $response, Utils::currentTime() - $startTime, $error, []); $stats = new TransferStats($request, $response, Utils::currentTime() - $startTime, $error, []);
@ -273,7 +279,7 @@ class StreamHandler
// HTTP/1.1 streams using the PHP stream wrapper require a // HTTP/1.1 streams using the PHP stream wrapper require a
// Connection: close header // Connection: close header
if ($request->getProtocolVersion() == '1.1' if ($request->getProtocolVersion() === '1.1'
&& !$request->hasHeader('Connection') && !$request->hasHeader('Connection')
) { ) {
$request = $request->withHeader('Connection', 'close'); $request = $request->withHeader('Connection', 'close');

View file

@ -44,7 +44,7 @@ class HandlerStack
* handler is provided, the best handler for your * handler is provided, the best handler for your
* system will be utilized. * system will be utilized.
*/ */
public static function create(callable $handler = null): self public static function create(?callable $handler = null): self
{ {
$stack = new self($handler ?: Utils::chooseHandler()); $stack = new self($handler ?: Utils::chooseHandler());
$stack->push(Middleware::httpErrors(), 'http_errors'); $stack->push(Middleware::httpErrors(), 'http_errors');
@ -58,7 +58,7 @@ class HandlerStack
/** /**
* @param (callable(RequestInterface, array): PromiseInterface)|null $handler Underlying HTTP handler. * @param (callable(RequestInterface, array): PromiseInterface)|null $handler Underlying HTTP handler.
*/ */
public function __construct(callable $handler = null) public function __construct(?callable $handler = null)
{ {
$this->handler = $handler; $this->handler = $handler;
} }
@ -131,7 +131,7 @@ class HandlerStack
* @param callable(callable): callable $middleware Middleware function * @param callable(callable): callable $middleware Middleware function
* @param string $name Name to register for this middleware. * @param string $name Name to register for this middleware.
*/ */
public function unshift(callable $middleware, string $name = null): void public function unshift(callable $middleware, ?string $name = null): void
{ {
\array_unshift($this->stack, [$middleware, $name]); \array_unshift($this->stack, [$middleware, $name]);
$this->cached = null; $this->cached = null;

View file

@ -68,7 +68,7 @@ class MessageFormatter implements MessageFormatterInterface
* @param ResponseInterface|null $response Response that was received * @param ResponseInterface|null $response Response that was received
* @param \Throwable|null $error Exception that was received * @param \Throwable|null $error Exception that was received
*/ */
public function format(RequestInterface $request, ResponseInterface $response = null, \Throwable $error = null): string public function format(RequestInterface $request, ?ResponseInterface $response = null, ?\Throwable $error = null): string
{ {
$cache = []; $cache = [];

View file

@ -14,5 +14,5 @@ interface MessageFormatterInterface
* @param ResponseInterface|null $response Response that was received * @param ResponseInterface|null $response Response that was received
* @param \Throwable|null $error Exception that was received * @param \Throwable|null $error Exception that was received
*/ */
public function format(RequestInterface $request, ResponseInterface $response = null, \Throwable $error = null): string; public function format(RequestInterface $request, ?ResponseInterface $response = null, ?\Throwable $error = null): string;
} }

View file

@ -55,7 +55,7 @@ final class Middleware
* *
* @return callable(callable): callable Returns a function that accepts the next handler. * @return callable(callable): callable Returns a function that accepts the next handler.
*/ */
public static function httpErrors(BodySummarizerInterface $bodySummarizer = null): callable public static function httpErrors(?BodySummarizerInterface $bodySummarizer = null): callable
{ {
return static function (callable $handler) use ($bodySummarizer): callable { return static function (callable $handler) use ($bodySummarizer): callable {
return static function ($request, array $options) use ($handler, $bodySummarizer) { return static function ($request, array $options) use ($handler, $bodySummarizer) {
@ -132,7 +132,7 @@ final class Middleware
* *
* @return callable Returns a function that accepts the next handler. * @return callable Returns a function that accepts the next handler.
*/ */
public static function tap(callable $before = null, callable $after = null): callable public static function tap(?callable $before = null, ?callable $after = null): callable
{ {
return static function (callable $handler) use ($before, $after): callable { return static function (callable $handler) use ($before, $after): callable {
return static function (RequestInterface $request, array $options) use ($handler, $before, $after) { return static function (RequestInterface $request, array $options) use ($handler, $before, $after) {
@ -176,7 +176,7 @@ final class Middleware
* *
* @return callable Returns a function that accepts the next handler. * @return callable Returns a function that accepts the next handler.
*/ */
public static function retry(callable $decider, callable $delay = null): callable public static function retry(callable $decider, ?callable $delay = null): callable
{ {
return static function (callable $handler) use ($decider, $delay): RetryMiddleware { return static function (callable $handler) use ($decider, $delay): RetryMiddleware {
return new RetryMiddleware($decider, $handler, $delay); return new RetryMiddleware($decider, $handler, $delay);

View file

@ -76,8 +76,8 @@ class PrepareBodyMiddleware
$expect = $options['expect'] ?? null; $expect = $options['expect'] ?? null;
// Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0 // Return if disabled or using HTTP/1.0
if ($expect === false || $request->getProtocolVersion() < 1.1) { if ($expect === false || $request->getProtocolVersion() === '1.0') {
return; return;
} }

View file

@ -61,7 +61,7 @@ final class RequestOptions
* Specifies whether or not cookies are used in a request or what cookie * Specifies whether or not cookies are used in a request or what cookie
* jar to use or what cookies to send. This option only works if your * jar to use or what cookies to send. This option only works if your
* handler has the `cookie` middleware. Valid values are `false` and * handler has the `cookie` middleware. Valid values are `false` and
* an instance of {@see \GuzzleHttp\Cookie\CookieJarInterface}. * an instance of {@see Cookie\CookieJarInterface}.
*/ */
public const COOKIES = 'cookies'; public const COOKIES = 'cookies';

View file

@ -40,7 +40,7 @@ class RetryMiddleware
* and returns the number of * and returns the number of
* milliseconds to delay. * milliseconds to delay.
*/ */
public function __construct(callable $decider, callable $nextHandler, callable $delay = null) public function __construct(callable $decider, callable $nextHandler, ?callable $delay = null)
{ {
$this->decider = $decider; $this->decider = $decider;
$this->nextHandler = $nextHandler; $this->nextHandler = $nextHandler;
@ -110,7 +110,7 @@ class RetryMiddleware
}; };
} }
private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null): PromiseInterface private function doRetry(RequestInterface $request, array $options, ?ResponseInterface $response = null): PromiseInterface
{ {
$options['delay'] = ($this->delay)(++$options['retries'], $response, $request); $options['delay'] = ($this->delay)(++$options['retries'], $response, $request);

View file

@ -46,8 +46,8 @@ final class TransferStats
*/ */
public function __construct( public function __construct(
RequestInterface $request, RequestInterface $request,
ResponseInterface $response = null, ?ResponseInterface $response = null,
float $transferTime = null, ?float $transferTime = null,
$handlerErrorData = null, $handlerErrorData = null,
array $handlerStats = [] array $handlerStats = []
) { ) {

View file

@ -71,7 +71,7 @@ final class Utils
return \STDOUT; return \STDOUT;
} }
return \GuzzleHttp\Psr7\Utils::tryFopen('php://output', 'w'); return Psr7\Utils::tryFopen('php://output', 'w');
} }
/** /**
@ -87,7 +87,7 @@ final class Utils
{ {
$handler = null; $handler = null;
if (\defined('CURLOPT_CUSTOMREQUEST')) { if (\defined('CURLOPT_CUSTOMREQUEST') && \function_exists('curl_version') && version_compare(curl_version()['version'], '7.21.2') >= 0) {
if (\function_exists('curl_multi_exec') && \function_exists('curl_exec')) { if (\function_exists('curl_multi_exec') && \function_exists('curl_exec')) {
$handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler()); $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler());
} elseif (\function_exists('curl_exec')) { } elseif (\function_exists('curl_exec')) {

View file

@ -1,6 +1,20 @@
# CHANGELOG # CHANGELOG
## 2.0.4 - 2024-10-17
### Fixed
- Once settled, don't allow further rejection of additional promises
## 2.0.3 - 2024-07-18
### Changed
- PHP 8.4 support
## 2.0.2 - 2023-12-03 ## 2.0.2 - 2023-12-03
### Changed ### Changed

View file

@ -38,10 +38,10 @@ composer require guzzlehttp/promises
## Version Guidance ## Version Guidance
| Version | Status | PHP Version | | Version | Status | PHP Version |
|---------|------------------------|--------------| |---------|---------------------|--------------|
| 1.x | Bug and security fixes | >=5.5,<8.3 | | 1.x | Security fixes only | >=5.5,<8.3 |
| 2.x | Latest | >=7.2.5,<8.4 | | 2.x | Latest | >=7.2.5,<8.5 |
## Quick Start ## Quick Start

View file

@ -30,7 +30,7 @@
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2", "bamarni/composer-bin-plugin": "^1.8.2",
"phpunit/phpunit": "^8.5.36 || ^9.6.15" "phpunit/phpunit": "^8.5.39 || ^9.6.20"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View file

@ -84,8 +84,8 @@ final class Coroutine implements PromiseInterface
} }
public function then( public function then(
callable $onFulfilled = null, ?callable $onFulfilled = null,
callable $onRejected = null ?callable $onRejected = null
): PromiseInterface { ): PromiseInterface {
return $this->result->then($onFulfilled, $onRejected); return $this->result->then($onFulfilled, $onRejected);
} }

View file

@ -23,8 +23,8 @@ final class Each
*/ */
public static function of( public static function of(
$iterable, $iterable,
callable $onFulfilled = null, ?callable $onFulfilled = null,
callable $onRejected = null ?callable $onRejected = null
): PromiseInterface { ): PromiseInterface {
return (new EachPromise($iterable, [ return (new EachPromise($iterable, [
'fulfilled' => $onFulfilled, 'fulfilled' => $onFulfilled,
@ -46,8 +46,8 @@ final class Each
public static function ofLimit( public static function ofLimit(
$iterable, $iterable,
$concurrency, $concurrency,
callable $onFulfilled = null, ?callable $onFulfilled = null,
callable $onRejected = null ?callable $onRejected = null
): PromiseInterface { ): PromiseInterface {
return (new EachPromise($iterable, [ return (new EachPromise($iterable, [
'fulfilled' => $onFulfilled, 'fulfilled' => $onFulfilled,
@ -67,7 +67,7 @@ final class Each
public static function ofLimitAll( public static function ofLimitAll(
$iterable, $iterable,
$concurrency, $concurrency,
callable $onFulfilled = null ?callable $onFulfilled = null
): PromiseInterface { ): PromiseInterface {
return self::ofLimit( return self::ofLimit(
$iterable, $iterable,

View file

@ -31,8 +31,8 @@ class FulfilledPromise implements PromiseInterface
} }
public function then( public function then(
callable $onFulfilled = null, ?callable $onFulfilled = null,
callable $onRejected = null ?callable $onRejected = null
): PromiseInterface { ): PromiseInterface {
// Return itself if there is no onFulfilled function. // Return itself if there is no onFulfilled function.
if (!$onFulfilled) { if (!$onFulfilled) {

View file

@ -25,16 +25,16 @@ class Promise implements PromiseInterface
* @param callable $cancelFn Fn that when invoked cancels the promise. * @param callable $cancelFn Fn that when invoked cancels the promise.
*/ */
public function __construct( public function __construct(
callable $waitFn = null, ?callable $waitFn = null,
callable $cancelFn = null ?callable $cancelFn = null
) { ) {
$this->waitFn = $waitFn; $this->waitFn = $waitFn;
$this->cancelFn = $cancelFn; $this->cancelFn = $cancelFn;
} }
public function then( public function then(
callable $onFulfilled = null, ?callable $onFulfilled = null,
callable $onRejected = null ?callable $onRejected = null
): PromiseInterface { ): PromiseInterface {
if ($this->state === self::PENDING) { if ($this->state === self::PENDING) {
$p = new Promise(null, [$this, 'cancel']); $p = new Promise(null, [$this, 'cancel']);

View file

@ -27,8 +27,8 @@ interface PromiseInterface
* @param callable $onRejected Invoked when the promise is rejected. * @param callable $onRejected Invoked when the promise is rejected.
*/ */
public function then( public function then(
callable $onFulfilled = null, ?callable $onFulfilled = null,
callable $onRejected = null ?callable $onRejected = null
): PromiseInterface; ): PromiseInterface;
/** /**

View file

@ -31,8 +31,8 @@ class RejectedPromise implements PromiseInterface
} }
public function then( public function then(
callable $onFulfilled = null, ?callable $onFulfilled = null,
callable $onRejected = null ?callable $onRejected = null
): PromiseInterface { ): PromiseInterface {
// If there's no onRejected callback then just return self. // If there's no onRejected callback then just return self.
if (!$onRejected) { if (!$onRejected) {

View file

@ -18,7 +18,7 @@ class RejectionException extends \RuntimeException
* @param mixed $reason Rejection reason. * @param mixed $reason Rejection reason.
* @param string|null $description Optional description. * @param string|null $description Optional description.
*/ */
public function __construct($reason, string $description = null) public function __construct($reason, ?string $description = null)
{ {
$this->reason = $reason; $this->reason = $reason;

View file

@ -21,7 +21,7 @@ final class Utils
* *
* @param TaskQueueInterface|null $assign Optionally specify a new queue instance. * @param TaskQueueInterface|null $assign Optionally specify a new queue instance.
*/ */
public static function queue(TaskQueueInterface $assign = null): TaskQueueInterface public static function queue(?TaskQueueInterface $assign = null): TaskQueueInterface
{ {
static $queue; static $queue;
@ -144,7 +144,9 @@ final class Utils
$results[$idx] = $value; $results[$idx] = $value;
}, },
function ($reason, $idx, Promise $aggregate): void { function ($reason, $idx, Promise $aggregate): void {
$aggregate->reject($reason); if (Is::pending($aggregate)) {
$aggregate->reject($reason);
}
} }
)->then(function () use (&$results) { )->then(function () use (&$results) {
ksort($results); ksort($results);

View file

@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## 2.7.0 - 2024-07-18
### Added
- Add `Utils::redactUserInfo()` method
- Add ability to encode bools as ints in `Query::build`
## 2.6.3 - 2024-07-18
### Fixed
- Make `StreamWrapper::stream_stat()` return `false` if inner stream's size is `null`
### Changed
- PHP 8.4 support
## 2.6.2 - 2023-12-03 ## 2.6.2 - 2023-12-03
### Fixed ### Fixed

View file

@ -24,8 +24,8 @@ composer require guzzlehttp/psr7
| Version | Status | PHP Version | | Version | Status | PHP Version |
|---------|---------------------|--------------| |---------|---------------------|--------------|
| 1.x | Security fixes only | >=5.4,<8.1 | | 1.x | EOL (2024-06-30) | >=5.4,<8.2 |
| 2.x | Latest | >=7.2.5,<8.4 | | 2.x | Latest | >=7.2.5,<8.5 |
## AppendStream ## AppendStream
@ -436,7 +436,7 @@ will be parsed into `['foo[a]' => '1', 'foo[b]' => '2'])`.
## `GuzzleHttp\Psr7\Query::build` ## `GuzzleHttp\Psr7\Query::build`
`public static function build(array $params, int|false $encoding = PHP_QUERY_RFC3986): string` `public static function build(array $params, int|false $encoding = PHP_QUERY_RFC3986, bool $treatBoolsAsInts = true): string`
Build a query string from an array of key value pairs. Build a query string from an array of key value pairs.
@ -498,11 +498,18 @@ a message.
## `GuzzleHttp\Psr7\Utils::readLine` ## `GuzzleHttp\Psr7\Utils::readLine`
`public static function readLine(StreamInterface $stream, int $maxLength = null): string` `public static function readLine(StreamInterface $stream, ?int $maxLength = null): string`
Read a line from the stream up to the maximum allowed buffer length. Read a line from the stream up to the maximum allowed buffer length.
## `GuzzleHttp\Psr7\Utils::redactUserInfo`
`public static function redactUserInfo(UriInterface $uri): UriInterface`
Redact the password in the user info part of a URI.
## `GuzzleHttp\Psr7\Utils::streamFor` ## `GuzzleHttp\Psr7\Utils::streamFor`
`public static function streamFor(resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource = '', array $options = []): StreamInterface` `public static function streamFor(resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource = '', array $options = []): StreamInterface`
@ -674,7 +681,7 @@ termed a relative-path reference.
### `GuzzleHttp\Psr7\Uri::isSameDocumentReference` ### `GuzzleHttp\Psr7\Uri::isSameDocumentReference`
`public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool` `public static function isSameDocumentReference(UriInterface $uri, ?UriInterface $base = null): bool`
Whether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its Whether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its
fragment component, identical to the base URI. When no base URI is given, only an empty URI reference fragment component, identical to the base URI. When no base URI is given, only an empty URI reference

View file

@ -61,8 +61,8 @@
}, },
"require-dev": { "require-dev": {
"bamarni/composer-bin-plugin": "^1.8.2", "bamarni/composer-bin-plugin": "^1.8.2",
"http-interop/http-factory-tests": "^0.9", "http-interop/http-factory-tests": "0.9.0",
"phpunit/phpunit": "^8.5.36 || ^9.6.15" "phpunit/phpunit": "^8.5.39 || ^9.6.20"
}, },
"suggest": { "suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"

View file

@ -33,7 +33,7 @@ final class CachingStream implements StreamInterface
*/ */
public function __construct( public function __construct(
StreamInterface $stream, StreamInterface $stream,
StreamInterface $target = null ?StreamInterface $target = null
) { ) {
$this->remoteStream = $stream; $this->remoteStream = $stream;
$this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+')); $this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+'));

View file

@ -27,10 +27,10 @@ final class HttpFactory implements RequestFactoryInterface, ResponseFactoryInter
{ {
public function createUploadedFile( public function createUploadedFile(
StreamInterface $stream, StreamInterface $stream,
int $size = null, ?int $size = null,
int $error = \UPLOAD_ERR_OK, int $error = \UPLOAD_ERR_OK,
string $clientFilename = null, ?string $clientFilename = null,
string $clientMediaType = null ?string $clientMediaType = null
): UploadedFileInterface { ): UploadedFileInterface {
if ($size === null) { if ($size === null) {
$size = $stream->getSize(); $size = $stream->getSize();

View file

@ -32,7 +32,7 @@ final class MultipartStream implements StreamInterface
* *
* @throws \InvalidArgumentException * @throws \InvalidArgumentException
*/ */
public function __construct(array $elements = [], string $boundary = null) public function __construct(array $elements = [], ?string $boundary = null)
{ {
$this->boundary = $boundary ?: bin2hex(random_bytes(20)); $this->boundary = $boundary ?: bin2hex(random_bytes(20));
$this->stream = $this->createStream($elements); $this->stream = $this->createStream($elements);

View file

@ -63,12 +63,15 @@ final class Query
* string. This function does not modify the provided keys when an array is * string. This function does not modify the provided keys when an array is
* encountered (like `http_build_query()` would). * encountered (like `http_build_query()` would).
* *
* @param array $params Query string parameters. * @param array $params Query string parameters.
* @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 * @param int|false $encoding Set to false to not encode,
* to encode using RFC3986, or PHP_QUERY_RFC1738 * PHP_QUERY_RFC3986 to encode using
* to encode using RFC1738. * RFC3986, or PHP_QUERY_RFC1738 to
* encode using RFC1738.
* @param bool $treatBoolsAsInts Set to true to encode as 0/1, and
* false as false/true.
*/ */
public static function build(array $params, $encoding = PHP_QUERY_RFC3986): string public static function build(array $params, $encoding = PHP_QUERY_RFC3986, bool $treatBoolsAsInts = true): string
{ {
if (!$params) { if (!$params) {
return ''; return '';
@ -86,12 +89,14 @@ final class Query
throw new \InvalidArgumentException('Invalid type'); throw new \InvalidArgumentException('Invalid type');
} }
$castBool = $treatBoolsAsInts ? static function ($v) { return (int) $v; } : static function ($v) { return $v ? 'true' : 'false'; };
$qs = ''; $qs = '';
foreach ($params as $k => $v) { foreach ($params as $k => $v) {
$k = $encoder((string) $k); $k = $encoder((string) $k);
if (!is_array($v)) { if (!is_array($v)) {
$qs .= $k; $qs .= $k;
$v = is_bool($v) ? (int) $v : $v; $v = is_bool($v) ? $castBool($v) : $v;
if ($v !== null) { if ($v !== null) {
$qs .= '='.$encoder((string) $v); $qs .= '='.$encoder((string) $v);
} }
@ -99,7 +104,7 @@ final class Query
} else { } else {
foreach ($v as $vv) { foreach ($v as $vv) {
$qs .= $k; $qs .= $k;
$vv = is_bool($vv) ? (int) $vv : $vv; $vv = is_bool($vv) ? $castBool($vv) : $vv;
if ($vv !== null) { if ($vv !== null) {
$qs .= '='.$encoder((string) $vv); $qs .= '='.$encoder((string) $vv);
} }

View file

@ -96,7 +96,7 @@ class Response implements ResponseInterface
array $headers = [], array $headers = [],
$body = null, $body = null,
string $version = '1.1', string $version = '1.1',
string $reason = null ?string $reason = null
) { ) {
$this->assertStatusCodeRange($status); $this->assertStatusCodeRange($status);

View file

@ -69,7 +69,7 @@ final class StreamWrapper
} }
} }
public function stream_open(string $path, string $mode, int $options, string &$opened_path = null): bool public function stream_open(string $path, string $mode, int $options, ?string &$opened_path = null): bool
{ {
$options = stream_context_get_options($this->context); $options = stream_context_get_options($this->context);
@ -136,10 +136,14 @@ final class StreamWrapper
* ctime: int, * ctime: int,
* blksize: int, * blksize: int,
* blocks: int * blocks: int
* } * }|false
*/ */
public function stream_stat(): array public function stream_stat()
{ {
if ($this->stream->getSize() === null) {
return false;
}
static $modeMap = [ static $modeMap = [
'r' => 33060, 'r' => 33060,
'rb' => 33060, 'rb' => 33060,

View file

@ -64,8 +64,8 @@ class UploadedFile implements UploadedFileInterface
$streamOrFile, $streamOrFile,
?int $size, ?int $size,
int $errorStatus, int $errorStatus,
string $clientFilename = null, ?string $clientFilename = null,
string $clientMediaType = null ?string $clientMediaType = null
) { ) {
$this->setError($errorStatus); $this->setError($errorStatus);
$this->size = $size; $this->size = $size;

View file

@ -279,7 +279,7 @@ class Uri implements UriInterface, \JsonSerializable
* *
* @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.4 * @see https://datatracker.ietf.org/doc/html/rfc3986#section-4.4
*/ */
public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool public static function isSameDocumentReference(UriInterface $uri, ?UriInterface $base = null): bool
{ {
if ($base !== null) { if ($base !== null) {
$uri = UriResolver::resolve($base, $uri); $uri = UriResolver::resolve($base, $uri);

View file

@ -231,7 +231,7 @@ final class Utils
* @param StreamInterface $stream Stream to read from * @param StreamInterface $stream Stream to read from
* @param int|null $maxLength Maximum buffer length * @param int|null $maxLength Maximum buffer length
*/ */
public static function readLine(StreamInterface $stream, int $maxLength = null): string public static function readLine(StreamInterface $stream, ?int $maxLength = null): string
{ {
$buffer = ''; $buffer = '';
$size = 0; $size = 0;
@ -250,6 +250,20 @@ final class Utils
return $buffer; return $buffer;
} }
/**
* Redact the password in the user info part of a URI.
*/
public static function redactUserInfo(UriInterface $uri): UriInterface
{
$userInfo = $uri->getUserInfo();
if (false !== ($pos = \strpos($userInfo, ':'))) {
return $uri->withUserInfo(\substr($userInfo, 0, $pos), '***');
}
return $uri;
}
/** /**
* Create a new stream based on the input type. * Create a new stream based on the input type.
* *

View file

@ -1,6 +1,6 @@
{ {
"name": "psr/http-factory", "name": "psr/http-factory",
"description": "Common interfaces for PSR-7 HTTP message factories", "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
"keywords": [ "keywords": [
"psr", "psr",
"psr-7", "psr-7",
@ -18,8 +18,11 @@
"homepage": "https://www.php-fig.org/" "homepage": "https://www.php-fig.org/"
} }
], ],
"support": {
"source": "https://github.com/php-fig/http-factory"
},
"require": { "require": {
"php": ">=7.0.0", "php": ">=7.1",
"psr/http-message": "^1.0 || ^2.0" "psr/http-message": "^1.0 || ^2.0"
}, },
"autoload": { "autoload": {

View file

@ -15,10 +15,10 @@ interface UploadedFileFactoryInterface
* *
* @param StreamInterface $stream Underlying stream representing the * @param StreamInterface $stream Underlying stream representing the
* uploaded file content. * uploaded file content.
* @param int $size in bytes * @param int|null $size in bytes
* @param int $error PHP file upload error * @param int $error PHP file upload error
* @param string $clientFilename Filename as provided by the client, if any. * @param string|null $clientFilename Filename as provided by the client, if any.
* @param string $clientMediaType Media type as provided by the client, if any. * @param string|null $clientMediaType Media type as provided by the client, if any.
* *
* @return UploadedFileInterface * @return UploadedFileInterface
* *
@ -26,9 +26,9 @@ interface UploadedFileFactoryInterface
*/ */
public function createUploadedFile( public function createUploadedFile(
StreamInterface $stream, StreamInterface $stream,
int $size = null, ?int $size = null,
int $error = \UPLOAD_ERR_OK, int $error = \UPLOAD_ERR_OK,
string $clientFilename = null, ?string $clientFilename = null,
string $clientMediaType = null ?string $clientMediaType = null
): UploadedFileInterface; ): UploadedFileInterface;
} }

View file

@ -13,6 +13,7 @@
namespace ScssPhp\ScssPhp\Block; namespace ScssPhp\ScssPhp\Block;
use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block;
use ScssPhp\ScssPhp\Node\Number;
use ScssPhp\ScssPhp\Type; use ScssPhp\ScssPhp\Type;
/** /**
@ -26,7 +27,7 @@ class DirectiveBlock extends Block
public $name; public $name;
/** /**
* @var string|array|null * @var array|Number|null
*/ */
public $value; public $value;

View file

@ -13,6 +13,7 @@
namespace ScssPhp\ScssPhp\Block; namespace ScssPhp\ScssPhp\Block;
use ScssPhp\ScssPhp\Block; use ScssPhp\ScssPhp\Block;
use ScssPhp\ScssPhp\Node\Number;
use ScssPhp\ScssPhp\Type; use ScssPhp\ScssPhp\Type;
/** /**
@ -26,7 +27,7 @@ class EachBlock extends Block
public $vars = []; public $vars = [];
/** /**
* @var array * @var array|Number
*/ */
public $list; public $list;

Some files were not shown because too many files have changed in this diff Show more