mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-04-02 01:52:10 +09:00
Add google/auth and related libraries, and update other dependencies
This commit is contained in:
parent
d861040766
commit
d39434d426
217 changed files with 13266 additions and 2110 deletions
|
|
@ -28,18 +28,21 @@
|
||||||
"coolsms/php-sdk": "2.*",
|
"coolsms/php-sdk": "2.*",
|
||||||
"doctrine/lexer": "1.*",
|
"doctrine/lexer": "1.*",
|
||||||
"egulias/email-validator": "3.2.*",
|
"egulias/email-validator": "3.2.*",
|
||||||
|
"firebase/php-jwt": "6.4.0",
|
||||||
"enshrined/svg-sanitize": "0.*",
|
"enshrined/svg-sanitize": "0.*",
|
||||||
"ezyang/htmlpurifier": "4.16.*",
|
"ezyang/htmlpurifier": "4.16.*",
|
||||||
"guzzlehttp/guzzle": "7.5.*",
|
"google/auth": "1.26.*",
|
||||||
|
"guzzlehttp/guzzle": "7.8.*",
|
||||||
"jbbcode/jbbcode": "1.4.*",
|
"jbbcode/jbbcode": "1.4.*",
|
||||||
"leafo/lessphp": "dev-master",
|
"leafo/lessphp": "dev-master",
|
||||||
"league/html-to-markdown": "5.*",
|
"league/html-to-markdown": "5.1.*",
|
||||||
"matthiasmullie/minify": "1.3.*",
|
"matthiasmullie/minify": "1.3.*",
|
||||||
"matthiasmullie/path-converter": "1.1.*",
|
"matthiasmullie/path-converter": "1.1.*",
|
||||||
"michelf/php-markdown": "1.9.*",
|
"michelf/php-markdown": "1.9.*",
|
||||||
"michelf/php-smartypants": "1.8.*",
|
"michelf/php-smartypants": "1.8.*",
|
||||||
|
"psr/cache": "1.0.1",
|
||||||
"rmccue/requests": "1.8.*",
|
"rmccue/requests": "1.8.*",
|
||||||
"scssphp/scssphp": "1.11.*",
|
"scssphp/scssphp": "1.12.*",
|
||||||
"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.*"
|
||||||
|
|
|
||||||
451
common/composer.lock
generated
451
common/composer.lock
generated
|
|
@ -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": "e26a63ac7dd69995f36b22fd491b44f8",
|
"content-hash": "5102699547080f96f0a7a1aadc220d80",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "bordoni/phpass",
|
"name": "bordoni/phpass",
|
||||||
|
|
@ -64,28 +64,28 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "composer/ca-bundle",
|
"name": "composer/ca-bundle",
|
||||||
"version": "1.3.5",
|
"version": "1.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": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd"
|
"reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd",
|
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99",
|
||||||
"reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd",
|
"reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-openssl": "*",
|
"ext-openssl": "*",
|
||||||
"ext-pcre": "*",
|
"ext-pcre": "*",
|
||||||
"php": "^5.3.2 || ^7.0 || ^8.0"
|
"php": "^7.2 || ^8.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpstan/phpstan": "^0.12.55",
|
"phpstan/phpstan": "^1.10",
|
||||||
"psr/log": "^1.0",
|
"psr/log": "^1.0",
|
||||||
"symfony/phpunit-bridge": "^4.2 || ^5",
|
"symfony/phpunit-bridge": "^4.2 || ^5",
|
||||||
"symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
|
"symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
|
|
@ -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.3.5"
|
"source": "https://github.com/composer/ca-bundle/tree/1.5.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -136,7 +136,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2023-01-11T08:27:00+00:00"
|
"time": "2024-03-15T14:00:32+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "coolsms/php-sdk",
|
"name": "coolsms/php-sdk",
|
||||||
|
|
@ -274,16 +274,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "egulias/email-validator",
|
"name": "egulias/email-validator",
|
||||||
"version": "3.2.5",
|
"version": "3.2.6",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/egulias/EmailValidator.git",
|
"url": "https://github.com/egulias/EmailValidator.git",
|
||||||
"reference": "b531a2311709443320c786feb4519cfaf94af796"
|
"reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b531a2311709443320c786feb4519cfaf94af796",
|
"url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7",
|
||||||
"reference": "b531a2311709443320c786feb4519cfaf94af796",
|
"reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -329,7 +329,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/egulias/EmailValidator/issues",
|
"issues": "https://github.com/egulias/EmailValidator/issues",
|
||||||
"source": "https://github.com/egulias/EmailValidator/tree/3.2.5"
|
"source": "https://github.com/egulias/EmailValidator/tree/3.2.6"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -337,26 +337,25 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2023-01-02T17:26:14+00:00"
|
"time": "2023-06-01T07:04:22+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "enshrined/svg-sanitize",
|
"name": "enshrined/svg-sanitize",
|
||||||
"version": "0.16.0",
|
"version": "0.18.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/darylldoyle/svg-sanitizer.git",
|
"url": "https://github.com/darylldoyle/svg-sanitizer.git",
|
||||||
"reference": "239e257605e2141265b429e40987b2ee51bba4b4"
|
"reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/239e257605e2141265b429e40987b2ee51bba4b4",
|
"url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/6a2c069dab3843ca4d887ff09c972fc7033888d0",
|
||||||
"reference": "239e257605e2141265b429e40987b2ee51bba4b4",
|
"reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-dom": "*",
|
"ext-dom": "*",
|
||||||
"ext-libxml": "*",
|
"ext-libxml": "*",
|
||||||
"ezyang/htmlpurifier": "^4.16",
|
|
||||||
"php": "^5.6 || ^7.0 || ^8.0"
|
"php": "^5.6 || ^7.0 || ^8.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
|
|
@ -381,9 +380,9 @@
|
||||||
"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.16.0"
|
"source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.18.0"
|
||||||
},
|
},
|
||||||
"time": "2023-03-20T10:51:12+00:00"
|
"time": "2024-02-22T17:51:05+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "ezyang/htmlpurifier",
|
"name": "ezyang/htmlpurifier",
|
||||||
|
|
@ -447,23 +446,144 @@
|
||||||
"time": "2022-09-18T07:06:19+00:00"
|
"time": "2022-09-18T07:06:19+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/guzzle",
|
"name": "firebase/php-jwt",
|
||||||
"version": "7.5.1",
|
"version": "v6.4.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/guzzle.git",
|
"url": "https://github.com/firebase/php-jwt.git",
|
||||||
"reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9"
|
"reference": "4dd1e007f22a927ac77da5a3fbb067b42d3bc224"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/b964ca597e86b752cd994f27293e9fa6b6a95ed9",
|
"url": "https://api.github.com/repos/firebase/php-jwt/zipball/4dd1e007f22a927ac77da5a3fbb067b42d3bc224",
|
||||||
"reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9",
|
"reference": "4dd1e007f22a927ac77da5a3fbb067b42d3bc224",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^7.1||^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"guzzlehttp/guzzle": "^6.5||^7.4",
|
||||||
|
"phpspec/prophecy-phpunit": "^1.1",
|
||||||
|
"phpunit/phpunit": "^7.5||^9.5",
|
||||||
|
"psr/cache": "^1.0||^2.0",
|
||||||
|
"psr/http-client": "^1.0",
|
||||||
|
"psr/http-factory": "^1.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-sodium": "Support EdDSA (Ed25519) signatures",
|
||||||
|
"paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Firebase\\JWT\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Neuman Vong",
|
||||||
|
"email": "neuman+pear@twilio.com",
|
||||||
|
"role": "Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Anant Narayanan",
|
||||||
|
"email": "anant@php.net",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
|
||||||
|
"homepage": "https://github.com/firebase/php-jwt",
|
||||||
|
"keywords": [
|
||||||
|
"jwt",
|
||||||
|
"php"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/firebase/php-jwt/issues",
|
||||||
|
"source": "https://github.com/firebase/php-jwt/tree/v6.4.0"
|
||||||
|
},
|
||||||
|
"time": "2023-02-09T21:01:23+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "google/auth",
|
||||||
|
"version": "v1.26.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/googleapis/google-auth-library-php.git",
|
||||||
|
"reference": "f1f0d0319e2e7750ebfaa523c78819792a9ed9f7"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/f1f0d0319e2e7750ebfaa523c78819792a9ed9f7",
|
||||||
|
"reference": "f1f0d0319e2e7750ebfaa523c78819792a9ed9f7",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"firebase/php-jwt": "^5.5||^6.0",
|
||||||
|
"guzzlehttp/guzzle": "^6.2.1|^7.0",
|
||||||
|
"guzzlehttp/psr7": "^1.7|^2.0",
|
||||||
|
"php": "^7.1||^8.0",
|
||||||
|
"psr/cache": "^1.0|^2.0|^3.0",
|
||||||
|
"psr/http-message": "^1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"guzzlehttp/promises": "0.1.1|^1.3",
|
||||||
|
"kelvinmo/simplejwt": "0.7.0",
|
||||||
|
"phpseclib/phpseclib": "^2.0.31||^3.0",
|
||||||
|
"phpspec/prophecy-phpunit": "^1.1||^2.0",
|
||||||
|
"phpunit/phpunit": "^7.5||^9.0.0",
|
||||||
|
"sebastian/comparator": ">=1.2.3",
|
||||||
|
"squizlabs/php_codesniffer": "^3.5"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2."
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Google\\Auth\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"Apache-2.0"
|
||||||
|
],
|
||||||
|
"description": "Google Auth Library for PHP",
|
||||||
|
"homepage": "http://github.com/google/google-auth-library-php",
|
||||||
|
"keywords": [
|
||||||
|
"Authentication",
|
||||||
|
"google",
|
||||||
|
"oauth2"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"docs": "https://googleapis.github.io/google-auth-library-php/main/",
|
||||||
|
"issues": "https://github.com/googleapis/google-auth-library-php/issues",
|
||||||
|
"source": "https://github.com/googleapis/google-auth-library-php/tree/v1.26.0"
|
||||||
|
},
|
||||||
|
"time": "2023-04-05T15:11:57+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "guzzlehttp/guzzle",
|
||||||
|
"version": "7.8.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/guzzle/guzzle.git",
|
||||||
|
"reference": "41042bc7ab002487b876a0683fc8dce04ddce104"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104",
|
||||||
|
"reference": "41042bc7ab002487b876a0683fc8dce04ddce104",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"guzzlehttp/promises": "^1.5",
|
"guzzlehttp/promises": "^1.5.3 || ^2.0.1",
|
||||||
"guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
|
"guzzlehttp/psr7": "^1.9.1 || ^2.5.1",
|
||||||
"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"
|
||||||
|
|
@ -472,10 +592,11 @@
|
||||||
"psr/http-client-implementation": "1.0"
|
"psr/http-client-implementation": "1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"bamarni/composer-bin-plugin": "^1.8.1",
|
"bamarni/composer-bin-plugin": "^1.8.2",
|
||||||
"ext-curl": "*",
|
"ext-curl": "*",
|
||||||
"php-http/client-integration-tests": "^3.0",
|
"php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
|
||||||
"phpunit/phpunit": "^8.5.29 || ^9.5.23",
|
"php-http/message-factory": "^1.1",
|
||||||
|
"phpunit/phpunit": "^8.5.36 || ^9.6.15",
|
||||||
"psr/log": "^1.1 || ^2.0 || ^3.0"
|
"psr/log": "^1.1 || ^2.0 || ^3.0"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
|
|
@ -488,9 +609,6 @@
|
||||||
"bamarni-bin": {
|
"bamarni-bin": {
|
||||||
"bin-links": true,
|
"bin-links": true,
|
||||||
"forward-command": false
|
"forward-command": false
|
||||||
},
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "7.5-dev"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
|
|
@ -556,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.5.1"
|
"source": "https://github.com/guzzle/guzzle/tree/7.8.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -572,38 +690,37 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2023-04-17T16:30:08+00:00"
|
"time": "2023-12-03T20:35:24+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/promises",
|
"name": "guzzlehttp/promises",
|
||||||
"version": "1.5.2",
|
"version": "2.0.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/promises.git",
|
"url": "https://github.com/guzzle/promises.git",
|
||||||
"reference": "b94b2807d85443f9719887892882d0329d1e2598"
|
"reference": "bbff78d96034045e58e13dedd6ad91b5d1253223"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598",
|
"url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223",
|
||||||
"reference": "b94b2807d85443f9719887892882d0329d1e2598",
|
"reference": "bbff78d96034045e58e13dedd6ad91b5d1253223",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.5"
|
"php": "^7.2.5 || ^8.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/phpunit-bridge": "^4.4 || ^5.1"
|
"bamarni/composer-bin-plugin": "^1.8.2",
|
||||||
|
"phpunit/phpunit": "^8.5.36 || ^9.6.15"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"bamarni-bin": {
|
||||||
"dev-master": "1.5-dev"
|
"bin-links": true,
|
||||||
|
"forward-command": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"files": [
|
|
||||||
"src/functions_include.php"
|
|
||||||
],
|
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"GuzzleHttp\\Promise\\": "src/"
|
"GuzzleHttp\\Promise\\": "src/"
|
||||||
}
|
}
|
||||||
|
|
@ -640,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/1.5.2"
|
"source": "https://github.com/guzzle/promises/tree/2.0.2"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -656,20 +773,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-08-28T14:55:35+00:00"
|
"time": "2023-12-03T20:19:20+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/psr7",
|
"name": "guzzlehttp/psr7",
|
||||||
"version": "2.5.0",
|
"version": "2.6.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/psr7.git",
|
"url": "https://github.com/guzzle/psr7.git",
|
||||||
"reference": "b635f279edd83fc275f822a1188157ffea568ff6"
|
"reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6",
|
"url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221",
|
||||||
"reference": "b635f279edd83fc275f822a1188157ffea568ff6",
|
"reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -683,9 +800,9 @@
|
||||||
"psr/http-message-implementation": "1.0"
|
"psr/http-message-implementation": "1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"bamarni/composer-bin-plugin": "^1.8.1",
|
"bamarni/composer-bin-plugin": "^1.8.2",
|
||||||
"http-interop/http-factory-tests": "^0.9",
|
"http-interop/http-factory-tests": "^0.9",
|
||||||
"phpunit/phpunit": "^8.5.29 || ^9.5.23"
|
"phpunit/phpunit": "^8.5.36 || ^9.6.15"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
|
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
|
||||||
|
|
@ -756,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.5.0"
|
"source": "https://github.com/guzzle/psr7/tree/2.6.2"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -772,7 +889,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2023-04-17T16:11:26+00:00"
|
"time": "2023-12-03T20:05:35+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "jbbcode/jbbcode",
|
"name": "jbbcode/jbbcode",
|
||||||
|
|
@ -877,16 +994,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "league/html-to-markdown",
|
"name": "league/html-to-markdown",
|
||||||
"version": "5.1.0",
|
"version": "5.1.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/thephpleague/html-to-markdown.git",
|
"url": "https://github.com/thephpleague/html-to-markdown.git",
|
||||||
"reference": "e0fc8cf07bdabbcd3765341ecb50c34c271d64e1"
|
"reference": "0b4066eede55c48f38bcee4fb8f0aa85654390fd"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/e0fc8cf07bdabbcd3765341ecb50c34c271d64e1",
|
"url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/0b4066eede55c48f38bcee4fb8f0aa85654390fd",
|
||||||
"reference": "e0fc8cf07bdabbcd3765341ecb50c34c271d64e1",
|
"reference": "0b4066eede55c48f38bcee4fb8f0aa85654390fd",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -896,11 +1013,11 @@
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"mikehaertl/php-shellcommand": "^1.1.0",
|
"mikehaertl/php-shellcommand": "^1.1.0",
|
||||||
"phpstan/phpstan": "^0.12.99",
|
"phpstan/phpstan": "^1.8.8",
|
||||||
"phpunit/phpunit": "^8.5 || ^9.2",
|
"phpunit/phpunit": "^8.5 || ^9.2",
|
||||||
"scrutinizer/ocular": "^1.6",
|
"scrutinizer/ocular": "^1.6",
|
||||||
"unleashedtech/php-coding-standard": "^2.7",
|
"unleashedtech/php-coding-standard": "^2.7 || ^3.0",
|
||||||
"vimeo/psalm": "^4.22"
|
"vimeo/psalm": "^4.22 || ^5.0"
|
||||||
},
|
},
|
||||||
"bin": [
|
"bin": [
|
||||||
"bin/html-to-markdown"
|
"bin/html-to-markdown"
|
||||||
|
|
@ -942,7 +1059,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/thephpleague/html-to-markdown/issues",
|
"issues": "https://github.com/thephpleague/html-to-markdown/issues",
|
||||||
"source": "https://github.com/thephpleague/html-to-markdown/tree/5.1.0"
|
"source": "https://github.com/thephpleague/html-to-markdown/tree/5.1.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -962,20 +1079,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-03-02T17:24:08+00:00"
|
"time": "2023-07-12T21:21:09+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "matthiasmullie/minify",
|
"name": "matthiasmullie/minify",
|
||||||
"version": "1.3.70",
|
"version": "1.3.73",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/matthiasmullie/minify.git",
|
"url": "https://github.com/matthiasmullie/minify.git",
|
||||||
"reference": "2807d9f9bece6877577ad44acb5c801bb3ae536b"
|
"reference": "cb7a9297b4ab070909cefade30ee95054d4ae87a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/matthiasmullie/minify/zipball/2807d9f9bece6877577ad44acb5c801bb3ae536b",
|
"url": "https://api.github.com/repos/matthiasmullie/minify/zipball/cb7a9297b4ab070909cefade30ee95054d4ae87a",
|
||||||
"reference": "2807d9f9bece6877577ad44acb5c801bb3ae536b",
|
"reference": "cb7a9297b4ab070909cefade30ee95054d4ae87a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1025,7 +1142,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/matthiasmullie/minify/issues",
|
"issues": "https://github.com/matthiasmullie/minify/issues",
|
||||||
"source": "https://github.com/matthiasmullie/minify/tree/1.3.70"
|
"source": "https://github.com/matthiasmullie/minify/tree/1.3.73"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -1033,7 +1150,7 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-12-09T12:56:44+00:00"
|
"time": "2024-03-15T10:27:10+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "matthiasmullie/path-converter",
|
"name": "matthiasmullie/path-converter",
|
||||||
|
|
@ -1196,17 +1313,66 @@
|
||||||
"time": "2016-12-13T01:01:17+00:00"
|
"time": "2016-12-13T01:01:17+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/http-client",
|
"name": "psr/cache",
|
||||||
"version": "1.0.2",
|
"version": "1.0.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/php-fig/http-client.git",
|
"url": "https://github.com/php-fig/cache.git",
|
||||||
"reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31"
|
"reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31",
|
"url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
|
||||||
"reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31",
|
"reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Cache\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "http://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common interface for caching libraries",
|
||||||
|
"keywords": [
|
||||||
|
"cache",
|
||||||
|
"psr",
|
||||||
|
"psr-6"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/php-fig/cache/tree/master"
|
||||||
|
},
|
||||||
|
"time": "2016-08-06T20:24:11+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/http-client",
|
||||||
|
"version": "1.0.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/http-client.git",
|
||||||
|
"reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
|
||||||
|
"reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1243,9 +1409,9 @@
|
||||||
"psr-18"
|
"psr-18"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/php-fig/http-client/tree/1.0.2"
|
"source": "https://github.com/php-fig/http-client"
|
||||||
},
|
},
|
||||||
"time": "2023-04-10T20:12:12+00:00"
|
"time": "2023-09-23T14:17:50+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/http-factory",
|
"name": "psr/http-factory",
|
||||||
|
|
@ -1304,16 +1470,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/http-message",
|
"name": "psr/http-message",
|
||||||
"version": "2.0",
|
"version": "1.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/php-fig/http-message.git",
|
"url": "https://github.com/php-fig/http-message.git",
|
||||||
"reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
|
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
|
"url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
|
||||||
"reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
|
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1322,7 +1488,7 @@
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "2.0.x-dev"
|
"dev-master": "1.1.x-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
|
|
@ -1337,7 +1503,7 @@
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "PHP-FIG",
|
"name": "PHP-FIG",
|
||||||
"homepage": "https://www.php-fig.org/"
|
"homepage": "http://www.php-fig.org/"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "Common interface for HTTP messages",
|
"description": "Common interface for HTTP messages",
|
||||||
|
|
@ -1351,9 +1517,9 @@
|
||||||
"response"
|
"response"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/php-fig/http-message/tree/2.0"
|
"source": "https://github.com/php-fig/http-message/tree/1.1"
|
||||||
},
|
},
|
||||||
"time": "2023-04-04T09:54:51+00:00"
|
"time": "2023-04-04T09:50:52+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "ralouphie/getallheaders",
|
"name": "ralouphie/getallheaders",
|
||||||
|
|
@ -1461,16 +1627,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "scssphp/scssphp",
|
"name": "scssphp/scssphp",
|
||||||
"version": "v1.11.0",
|
"version": "v1.12.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/scssphp/scssphp.git",
|
"url": "https://github.com/scssphp/scssphp.git",
|
||||||
"reference": "33749d12c2569bb24071f94e9af828662dabb068"
|
"reference": "394ed1e960138710a60d035c1a85d43d0bf0faeb"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/scssphp/scssphp/zipball/33749d12c2569bb24071f94e9af828662dabb068",
|
"url": "https://api.github.com/repos/scssphp/scssphp/zipball/394ed1e960138710a60d035c1a85d43d0bf0faeb",
|
||||||
"reference": "33749d12c2569bb24071f94e9af828662dabb068",
|
"reference": "394ed1e960138710a60d035c1a85d43d0bf0faeb",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1487,7 +1653,7 @@
|
||||||
"thoughtbot/bourbon": "^7.0",
|
"thoughtbot/bourbon": "^7.0",
|
||||||
"twbs/bootstrap": "~5.0",
|
"twbs/bootstrap": "~5.0",
|
||||||
"twbs/bootstrap4": "4.6.1",
|
"twbs/bootstrap4": "4.6.1",
|
||||||
"zurb/foundation": "~6.5"
|
"zurb/foundation": "~6.7.0"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"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",
|
||||||
|
|
@ -1535,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.11.0"
|
"source": "https://github.com/scssphp/scssphp/tree/v1.12.1"
|
||||||
},
|
},
|
||||||
"time": "2022-09-02T21:24:55+00:00"
|
"time": "2024-01-13T12:36:40+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "swiftmailer/swiftmailer",
|
"name": "swiftmailer/swiftmailer",
|
||||||
|
|
@ -1617,16 +1783,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/deprecation-contracts",
|
"name": "symfony/deprecation-contracts",
|
||||||
"version": "v2.5.2",
|
"version": "v2.5.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/deprecation-contracts.git",
|
"url": "https://github.com/symfony/deprecation-contracts.git",
|
||||||
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
|
"reference": "80d075412b557d41002320b96a096ca65aa2c98d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
|
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d",
|
||||||
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
|
"reference": "80d075412b557d41002320b96a096ca65aa2c98d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1664,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.2"
|
"source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -1680,20 +1846,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-01-02T09:53:40+00:00"
|
"time": "2023-01-24T14:02:46+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-iconv",
|
"name": "symfony/polyfill-iconv",
|
||||||
"version": "v1.27.0",
|
"version": "v1.29.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-iconv.git",
|
"url": "https://github.com/symfony/polyfill-iconv.git",
|
||||||
"reference": "927013f3aac555983a5059aada98e1907d842695"
|
"reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/927013f3aac555983a5059aada98e1907d842695",
|
"url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f",
|
||||||
"reference": "927013f3aac555983a5059aada98e1907d842695",
|
"reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1707,9 +1873,6 @@
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
|
||||||
"dev-main": "1.27-dev"
|
|
||||||
},
|
|
||||||
"thanks": {
|
"thanks": {
|
||||||
"name": "symfony/polyfill",
|
"name": "symfony/polyfill",
|
||||||
"url": "https://github.com/symfony/polyfill"
|
"url": "https://github.com/symfony/polyfill"
|
||||||
|
|
@ -1747,7 +1910,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-iconv/tree/v1.27.0"
|
"source": "https://github.com/symfony/polyfill-iconv/tree/v1.29.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -1763,20 +1926,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-11-03T14:55:06+00:00"
|
"time": "2024-01-29T20:11:03+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-idn",
|
"name": "symfony/polyfill-intl-idn",
|
||||||
"version": "v1.27.0",
|
"version": "v1.29.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": "639084e360537a19f9ee352433b84ce831f3d2da"
|
"reference": "a287ed7475f85bf6f61890146edbc932c0fff919"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da",
|
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919",
|
||||||
"reference": "639084e360537a19f9ee352433b84ce831f3d2da",
|
"reference": "a287ed7475f85bf6f61890146edbc932c0fff919",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1789,9 +1952,6 @@
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
|
||||||
"dev-main": "1.27-dev"
|
|
||||||
},
|
|
||||||
"thanks": {
|
"thanks": {
|
||||||
"name": "symfony/polyfill",
|
"name": "symfony/polyfill",
|
||||||
"url": "https://github.com/symfony/polyfill"
|
"url": "https://github.com/symfony/polyfill"
|
||||||
|
|
@ -1834,7 +1994,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0"
|
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -1850,20 +2010,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-11-03T14:55:06+00:00"
|
"time": "2024-01-29T20:11:03+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-normalizer",
|
"name": "symfony/polyfill-intl-normalizer",
|
||||||
"version": "v1.27.0",
|
"version": "v1.29.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": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
|
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
|
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d",
|
||||||
"reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
|
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1874,9 +2034,6 @@
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
|
||||||
"dev-main": "1.27-dev"
|
|
||||||
},
|
|
||||||
"thanks": {
|
"thanks": {
|
||||||
"name": "symfony/polyfill",
|
"name": "symfony/polyfill",
|
||||||
"url": "https://github.com/symfony/polyfill"
|
"url": "https://github.com/symfony/polyfill"
|
||||||
|
|
@ -1918,7 +2075,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
|
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -1934,20 +2091,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-11-03T14:55:06+00:00"
|
"time": "2024-01-29T20:11:03+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-mbstring",
|
"name": "symfony/polyfill-mbstring",
|
||||||
"version": "v1.27.0",
|
"version": "v1.29.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||||
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
|
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
|
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
|
||||||
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
|
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1961,9 +2118,6 @@
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
|
||||||
"dev-main": "1.27-dev"
|
|
||||||
},
|
|
||||||
"thanks": {
|
"thanks": {
|
||||||
"name": "symfony/polyfill",
|
"name": "symfony/polyfill",
|
||||||
"url": "https://github.com/symfony/polyfill"
|
"url": "https://github.com/symfony/polyfill"
|
||||||
|
|
@ -2001,7 +2155,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
|
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -2017,20 +2171,20 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-11-03T14:55:06+00:00"
|
"time": "2024-01-29T20:11:03+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-php72",
|
"name": "symfony/polyfill-php72",
|
||||||
"version": "v1.27.0",
|
"version": "v1.29.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-php72.git",
|
"url": "https://github.com/symfony/polyfill-php72.git",
|
||||||
"reference": "869329b1e9894268a8a61dabb69153029b7a8c97"
|
"reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97",
|
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25",
|
||||||
"reference": "869329b1e9894268a8a61dabb69153029b7a8c97",
|
"reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -2038,9 +2192,6 @@
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
|
||||||
"dev-main": "1.27-dev"
|
|
||||||
},
|
|
||||||
"thanks": {
|
"thanks": {
|
||||||
"name": "symfony/polyfill",
|
"name": "symfony/polyfill",
|
||||||
"url": "https://github.com/symfony/polyfill"
|
"url": "https://github.com/symfony/polyfill"
|
||||||
|
|
@ -2077,7 +2228,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0"
|
"source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -2093,7 +2244,7 @@
|
||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-11-03T14:55:06+00:00"
|
"time": "2024-01-29T20:11:03+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "true/punycode",
|
"name": "true/punycode",
|
||||||
|
|
@ -2167,5 +2318,5 @@
|
||||||
"ext-xml": "*"
|
"ext-xml": "*"
|
||||||
},
|
},
|
||||||
"platform-dev": [],
|
"platform-dev": [],
|
||||||
"plugin-api-version": "2.3.0"
|
"plugin-api-version": "2.6.0"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
5
common/vendor/bin/html-to-markdown
vendored
5
common/vendor/bin/html-to-markdown
vendored
|
|
@ -112,9 +112,8 @@ if (PHP_VERSION_ID < 80000) {
|
||||||
(function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
|
(function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
|
||||||
|| (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
|
|| (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
|
||||||
) {
|
) {
|
||||||
include("phpvfscomposer://" . __DIR__ . '/..'.'/league/html-to-markdown/bin/html-to-markdown');
|
return include("phpvfscomposer://" . __DIR__ . '/..'.'/league/html-to-markdown/bin/html-to-markdown');
|
||||||
exit(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
include __DIR__ . '/..'.'/league/html-to-markdown/bin/html-to-markdown';
|
return include __DIR__ . '/..'.'/league/html-to-markdown/bin/html-to-markdown';
|
||||||
|
|
|
||||||
5
common/vendor/bin/minifycss
vendored
5
common/vendor/bin/minifycss
vendored
|
|
@ -112,9 +112,8 @@ if (PHP_VERSION_ID < 80000) {
|
||||||
(function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
|
(function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
|
||||||
|| (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
|
|| (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
|
||||||
) {
|
) {
|
||||||
include("phpvfscomposer://" . __DIR__ . '/..'.'/matthiasmullie/minify/bin/minifycss');
|
return include("phpvfscomposer://" . __DIR__ . '/..'.'/matthiasmullie/minify/bin/minifycss');
|
||||||
exit(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
include __DIR__ . '/..'.'/matthiasmullie/minify/bin/minifycss';
|
return include __DIR__ . '/..'.'/matthiasmullie/minify/bin/minifycss';
|
||||||
|
|
|
||||||
5
common/vendor/bin/minifyjs
vendored
5
common/vendor/bin/minifyjs
vendored
|
|
@ -112,9 +112,8 @@ if (PHP_VERSION_ID < 80000) {
|
||||||
(function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
|
(function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
|
||||||
|| (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
|
|| (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
|
||||||
) {
|
) {
|
||||||
include("phpvfscomposer://" . __DIR__ . '/..'.'/matthiasmullie/minify/bin/minifyjs');
|
return include("phpvfscomposer://" . __DIR__ . '/..'.'/matthiasmullie/minify/bin/minifyjs');
|
||||||
exit(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
include __DIR__ . '/..'.'/matthiasmullie/minify/bin/minifyjs';
|
return include __DIR__ . '/..'.'/matthiasmullie/minify/bin/minifyjs';
|
||||||
|
|
|
||||||
5
common/vendor/bin/pscss
vendored
5
common/vendor/bin/pscss
vendored
|
|
@ -112,9 +112,8 @@ if (PHP_VERSION_ID < 80000) {
|
||||||
(function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
|
(function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
|
||||||
|| (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
|
|| (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
|
||||||
) {
|
) {
|
||||||
include("phpvfscomposer://" . __DIR__ . '/..'.'/scssphp/scssphp/bin/pscss');
|
return include("phpvfscomposer://" . __DIR__ . '/..'.'/scssphp/scssphp/bin/pscss');
|
||||||
exit(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
include __DIR__ . '/..'.'/scssphp/scssphp/bin/pscss';
|
return include __DIR__ . '/..'.'/scssphp/scssphp/bin/pscss';
|
||||||
|
|
|
||||||
49
common/vendor/composer/autoload_classmap.php
vendored
49
common/vendor/composer/autoload_classmap.php
vendored
|
|
@ -96,6 +96,50 @@ return array(
|
||||||
'Egulias\\EmailValidator\\Warning\\QuotedString' => $vendorDir . '/egulias/email-validator/src/Warning/QuotedString.php',
|
'Egulias\\EmailValidator\\Warning\\QuotedString' => $vendorDir . '/egulias/email-validator/src/Warning/QuotedString.php',
|
||||||
'Egulias\\EmailValidator\\Warning\\TLD' => $vendorDir . '/egulias/email-validator/src/Warning/TLD.php',
|
'Egulias\\EmailValidator\\Warning\\TLD' => $vendorDir . '/egulias/email-validator/src/Warning/TLD.php',
|
||||||
'Egulias\\EmailValidator\\Warning\\Warning' => $vendorDir . '/egulias/email-validator/src/Warning/Warning.php',
|
'Egulias\\EmailValidator\\Warning\\Warning' => $vendorDir . '/egulias/email-validator/src/Warning/Warning.php',
|
||||||
|
'Firebase\\JWT\\BeforeValidException' => $vendorDir . '/firebase/php-jwt/src/BeforeValidException.php',
|
||||||
|
'Firebase\\JWT\\CachedKeySet' => $vendorDir . '/firebase/php-jwt/src/CachedKeySet.php',
|
||||||
|
'Firebase\\JWT\\ExpiredException' => $vendorDir . '/firebase/php-jwt/src/ExpiredException.php',
|
||||||
|
'Firebase\\JWT\\JWK' => $vendorDir . '/firebase/php-jwt/src/JWK.php',
|
||||||
|
'Firebase\\JWT\\JWT' => $vendorDir . '/firebase/php-jwt/src/JWT.php',
|
||||||
|
'Firebase\\JWT\\Key' => $vendorDir . '/firebase/php-jwt/src/Key.php',
|
||||||
|
'Firebase\\JWT\\SignatureInvalidException' => $vendorDir . '/firebase/php-jwt/src/SignatureInvalidException.php',
|
||||||
|
'Google\\Auth\\AccessToken' => $vendorDir . '/google/auth/src/AccessToken.php',
|
||||||
|
'Google\\Auth\\ApplicationDefaultCredentials' => $vendorDir . '/google/auth/src/ApplicationDefaultCredentials.php',
|
||||||
|
'Google\\Auth\\CacheTrait' => $vendorDir . '/google/auth/src/CacheTrait.php',
|
||||||
|
'Google\\Auth\\Cache\\InvalidArgumentException' => $vendorDir . '/google/auth/src/Cache/InvalidArgumentException.php',
|
||||||
|
'Google\\Auth\\Cache\\Item' => $vendorDir . '/google/auth/src/Cache/Item.php',
|
||||||
|
'Google\\Auth\\Cache\\MemoryCacheItemPool' => $vendorDir . '/google/auth/src/Cache/MemoryCacheItemPool.php',
|
||||||
|
'Google\\Auth\\Cache\\SysVCacheItemPool' => $vendorDir . '/google/auth/src/Cache/SysVCacheItemPool.php',
|
||||||
|
'Google\\Auth\\Cache\\TypedItem' => $vendorDir . '/google/auth/src/Cache/TypedItem.php',
|
||||||
|
'Google\\Auth\\CredentialsLoader' => $vendorDir . '/google/auth/src/CredentialsLoader.php',
|
||||||
|
'Google\\Auth\\Credentials\\AppIdentityCredentials' => $vendorDir . '/google/auth/src/Credentials/AppIdentityCredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\GCECredentials' => $vendorDir . '/google/auth/src/Credentials/GCECredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\IAMCredentials' => $vendorDir . '/google/auth/src/Credentials/IAMCredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\ImpersonatedServiceAccountCredentials' => $vendorDir . '/google/auth/src/Credentials/ImpersonatedServiceAccountCredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\InsecureCredentials' => $vendorDir . '/google/auth/src/Credentials/InsecureCredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\ServiceAccountCredentials' => $vendorDir . '/google/auth/src/Credentials/ServiceAccountCredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\ServiceAccountJwtAccessCredentials' => $vendorDir . '/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\UserRefreshCredentials' => $vendorDir . '/google/auth/src/Credentials/UserRefreshCredentials.php',
|
||||||
|
'Google\\Auth\\FetchAuthTokenCache' => $vendorDir . '/google/auth/src/FetchAuthTokenCache.php',
|
||||||
|
'Google\\Auth\\FetchAuthTokenInterface' => $vendorDir . '/google/auth/src/FetchAuthTokenInterface.php',
|
||||||
|
'Google\\Auth\\GCECache' => $vendorDir . '/google/auth/src/GCECache.php',
|
||||||
|
'Google\\Auth\\GetQuotaProjectInterface' => $vendorDir . '/google/auth/src/GetQuotaProjectInterface.php',
|
||||||
|
'Google\\Auth\\HttpHandler\\Guzzle5HttpHandler' => $vendorDir . '/google/auth/src/HttpHandler/Guzzle5HttpHandler.php',
|
||||||
|
'Google\\Auth\\HttpHandler\\Guzzle6HttpHandler' => $vendorDir . '/google/auth/src/HttpHandler/Guzzle6HttpHandler.php',
|
||||||
|
'Google\\Auth\\HttpHandler\\Guzzle7HttpHandler' => $vendorDir . '/google/auth/src/HttpHandler/Guzzle7HttpHandler.php',
|
||||||
|
'Google\\Auth\\HttpHandler\\HttpClientCache' => $vendorDir . '/google/auth/src/HttpHandler/HttpClientCache.php',
|
||||||
|
'Google\\Auth\\HttpHandler\\HttpHandlerFactory' => $vendorDir . '/google/auth/src/HttpHandler/HttpHandlerFactory.php',
|
||||||
|
'Google\\Auth\\Iam' => $vendorDir . '/google/auth/src/Iam.php',
|
||||||
|
'Google\\Auth\\IamSignerTrait' => $vendorDir . '/google/auth/src/IamSignerTrait.php',
|
||||||
|
'Google\\Auth\\Middleware\\AuthTokenMiddleware' => $vendorDir . '/google/auth/src/Middleware/AuthTokenMiddleware.php',
|
||||||
|
'Google\\Auth\\Middleware\\ProxyAuthTokenMiddleware' => $vendorDir . '/google/auth/src/Middleware/ProxyAuthTokenMiddleware.php',
|
||||||
|
'Google\\Auth\\Middleware\\ScopedAccessTokenMiddleware' => $vendorDir . '/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php',
|
||||||
|
'Google\\Auth\\Middleware\\SimpleMiddleware' => $vendorDir . '/google/auth/src/Middleware/SimpleMiddleware.php',
|
||||||
|
'Google\\Auth\\OAuth2' => $vendorDir . '/google/auth/src/OAuth2.php',
|
||||||
|
'Google\\Auth\\ProjectIdProviderInterface' => $vendorDir . '/google/auth/src/ProjectIdProviderInterface.php',
|
||||||
|
'Google\\Auth\\ServiceAccountSignerTrait' => $vendorDir . '/google/auth/src/ServiceAccountSignerTrait.php',
|
||||||
|
'Google\\Auth\\SignBlobInterface' => $vendorDir . '/google/auth/src/SignBlobInterface.php',
|
||||||
|
'Google\\Auth\\UpdateMetadataInterface' => $vendorDir . '/google/auth/src/UpdateMetadataInterface.php',
|
||||||
'GuzzleHttp\\BodySummarizer' => $vendorDir . '/guzzlehttp/guzzle/src/BodySummarizer.php',
|
'GuzzleHttp\\BodySummarizer' => $vendorDir . '/guzzlehttp/guzzle/src/BodySummarizer.php',
|
||||||
'GuzzleHttp\\BodySummarizerInterface' => $vendorDir . '/guzzlehttp/guzzle/src/BodySummarizerInterface.php',
|
'GuzzleHttp\\BodySummarizerInterface' => $vendorDir . '/guzzlehttp/guzzle/src/BodySummarizerInterface.php',
|
||||||
'GuzzleHttp\\Client' => $vendorDir . '/guzzlehttp/guzzle/src/Client.php',
|
'GuzzleHttp\\Client' => $vendorDir . '/guzzlehttp/guzzle/src/Client.php',
|
||||||
|
|
@ -433,6 +477,7 @@ return array(
|
||||||
'JBBCode\\visitors\\NestLimitVisitor' => $vendorDir . '/jbbcode/jbbcode/JBBCode/visitors/NestLimitVisitor.php',
|
'JBBCode\\visitors\\NestLimitVisitor' => $vendorDir . '/jbbcode/jbbcode/JBBCode/visitors/NestLimitVisitor.php',
|
||||||
'JBBCode\\visitors\\SmileyVisitor' => $vendorDir . '/jbbcode/jbbcode/JBBCode/visitors/SmileyVisitor.php',
|
'JBBCode\\visitors\\SmileyVisitor' => $vendorDir . '/jbbcode/jbbcode/JBBCode/visitors/SmileyVisitor.php',
|
||||||
'JBBCode\\visitors\\TagCountingVisitor' => $vendorDir . '/jbbcode/jbbcode/JBBCode/visitors/TagCountingVisitor.php',
|
'JBBCode\\visitors\\TagCountingVisitor' => $vendorDir . '/jbbcode/jbbcode/JBBCode/visitors/TagCountingVisitor.php',
|
||||||
|
'League\\HTMLToMarkdown\\Coerce' => $vendorDir . '/league/html-to-markdown/src/Coerce.php',
|
||||||
'League\\HTMLToMarkdown\\Configuration' => $vendorDir . '/league/html-to-markdown/src/Configuration.php',
|
'League\\HTMLToMarkdown\\Configuration' => $vendorDir . '/league/html-to-markdown/src/Configuration.php',
|
||||||
'League\\HTMLToMarkdown\\ConfigurationAwareInterface' => $vendorDir . '/league/html-to-markdown/src/ConfigurationAwareInterface.php',
|
'League\\HTMLToMarkdown\\ConfigurationAwareInterface' => $vendorDir . '/league/html-to-markdown/src/ConfigurationAwareInterface.php',
|
||||||
'League\\HTMLToMarkdown\\Converter\\BlockquoteConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/BlockquoteConverter.php',
|
'League\\HTMLToMarkdown\\Converter\\BlockquoteConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/BlockquoteConverter.php',
|
||||||
|
|
@ -484,6 +529,10 @@ return array(
|
||||||
'Nurigo\\Exceptions\\CoolsmsSDKException' => $vendorDir . '/coolsms/php-sdk/app/Nurigo/Exceptions/CoolsmsSDKException.php',
|
'Nurigo\\Exceptions\\CoolsmsSDKException' => $vendorDir . '/coolsms/php-sdk/app/Nurigo/Exceptions/CoolsmsSDKException.php',
|
||||||
'Nurigo\\Exceptions\\CoolsmsServerException' => $vendorDir . '/coolsms/php-sdk/app/Nurigo/Exceptions/CoolsmsServerException.php',
|
'Nurigo\\Exceptions\\CoolsmsServerException' => $vendorDir . '/coolsms/php-sdk/app/Nurigo/Exceptions/CoolsmsServerException.php',
|
||||||
'Nurigo\\Exceptions\\CoolsmsSystemException' => $vendorDir . '/coolsms/php-sdk/app/Nurigo/Exceptions/CoolsmsSystemException.php',
|
'Nurigo\\Exceptions\\CoolsmsSystemException' => $vendorDir . '/coolsms/php-sdk/app/Nurigo/Exceptions/CoolsmsSystemException.php',
|
||||||
|
'Psr\\Cache\\CacheException' => $vendorDir . '/psr/cache/src/CacheException.php',
|
||||||
|
'Psr\\Cache\\CacheItemInterface' => $vendorDir . '/psr/cache/src/CacheItemInterface.php',
|
||||||
|
'Psr\\Cache\\CacheItemPoolInterface' => $vendorDir . '/psr/cache/src/CacheItemPoolInterface.php',
|
||||||
|
'Psr\\Cache\\InvalidArgumentException' => $vendorDir . '/psr/cache/src/InvalidArgumentException.php',
|
||||||
'Psr\\Http\\Client\\ClientExceptionInterface' => $vendorDir . '/psr/http-client/src/ClientExceptionInterface.php',
|
'Psr\\Http\\Client\\ClientExceptionInterface' => $vendorDir . '/psr/http-client/src/ClientExceptionInterface.php',
|
||||||
'Psr\\Http\\Client\\ClientInterface' => $vendorDir . '/psr/http-client/src/ClientInterface.php',
|
'Psr\\Http\\Client\\ClientInterface' => $vendorDir . '/psr/http-client/src/ClientInterface.php',
|
||||||
'Psr\\Http\\Client\\NetworkExceptionInterface' => $vendorDir . '/psr/http-client/src/NetworkExceptionInterface.php',
|
'Psr\\Http\\Client\\NetworkExceptionInterface' => $vendorDir . '/psr/http-client/src/NetworkExceptionInterface.php',
|
||||||
|
|
|
||||||
9
common/vendor/composer/autoload_files.php
vendored
9
common/vendor/composer/autoload_files.php
vendored
|
|
@ -6,15 +6,14 @@ $vendorDir = dirname(__DIR__);
|
||||||
$baseDir = dirname($vendorDir);
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
|
'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',
|
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
|
||||||
'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',
|
'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',
|
||||||
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
|
|
||||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
|
|
||||||
'2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
|
|
||||||
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
|
|
||||||
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
|
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
|
||||||
'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php',
|
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||||
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
|
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
|
||||||
|
'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php',
|
||||||
|
'2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
|
||||||
'2c102faa651ef8ea5874edb585946bce' => $vendorDir . '/swiftmailer/swiftmailer/lib/swift_required.php',
|
'2c102faa651ef8ea5874edb585946bce' => $vendorDir . '/swiftmailer/swiftmailer/lib/swift_required.php',
|
||||||
);
|
);
|
||||||
|
|
|
||||||
3
common/vendor/composer/autoload_psr4.php
vendored
3
common/vendor/composer/autoload_psr4.php
vendored
|
|
@ -16,6 +16,7 @@ return array(
|
||||||
'ScssPhp\\ScssPhp\\' => array($vendorDir . '/scssphp/scssphp/src'),
|
'ScssPhp\\ScssPhp\\' => array($vendorDir . '/scssphp/scssphp/src'),
|
||||||
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'),
|
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'),
|
||||||
'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'),
|
'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'),
|
||||||
|
'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
|
||||||
'Nurigo\\' => array($vendorDir . '/coolsms/php-sdk/app/Nurigo'),
|
'Nurigo\\' => array($vendorDir . '/coolsms/php-sdk/app/Nurigo'),
|
||||||
'Michelf\\' => array($vendorDir . '/michelf/php-markdown/Michelf'),
|
'Michelf\\' => array($vendorDir . '/michelf/php-markdown/Michelf'),
|
||||||
'MatthiasMullie\\PathConverter\\' => array($vendorDir . '/matthiasmullie/path-converter/src'),
|
'MatthiasMullie\\PathConverter\\' => array($vendorDir . '/matthiasmullie/path-converter/src'),
|
||||||
|
|
@ -24,6 +25,8 @@ return array(
|
||||||
'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
|
'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
|
||||||
'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
|
'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
|
||||||
'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
|
'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
|
||||||
|
'Google\\Auth\\' => array($vendorDir . '/google/auth/src'),
|
||||||
|
'Firebase\\JWT\\' => array($vendorDir . '/firebase/php-jwt/src'),
|
||||||
'Egulias\\EmailValidator\\' => array($vendorDir . '/egulias/email-validator/src'),
|
'Egulias\\EmailValidator\\' => array($vendorDir . '/egulias/email-validator/src'),
|
||||||
'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib/Doctrine/Common/Lexer'),
|
'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib/Doctrine/Common/Lexer'),
|
||||||
'Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'),
|
'Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'),
|
||||||
|
|
|
||||||
76
common/vendor/composer/autoload_static.php
vendored
76
common/vendor/composer/autoload_static.php
vendored
|
|
@ -7,16 +7,15 @@ namespace Composer\Autoload;
|
||||||
class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
|
class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
|
||||||
{
|
{
|
||||||
public static $files = array (
|
public static $files = array (
|
||||||
|
'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',
|
'25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
|
||||||
'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',
|
'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',
|
||||||
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
|
|
||||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
|
|
||||||
'2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
|
|
||||||
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
|
|
||||||
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
|
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
|
||||||
'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php',
|
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||||
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
|
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
|
||||||
|
'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php',
|
||||||
|
'2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
|
||||||
'2c102faa651ef8ea5874edb585946bce' => __DIR__ . '/..' . '/swiftmailer/swiftmailer/lib/swift_required.php',
|
'2c102faa651ef8ea5874edb585946bce' => __DIR__ . '/..' . '/swiftmailer/swiftmailer/lib/swift_required.php',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -42,6 +41,7 @@ class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
|
||||||
array (
|
array (
|
||||||
'Psr\\Http\\Message\\' => 17,
|
'Psr\\Http\\Message\\' => 17,
|
||||||
'Psr\\Http\\Client\\' => 16,
|
'Psr\\Http\\Client\\' => 16,
|
||||||
|
'Psr\\Cache\\' => 10,
|
||||||
),
|
),
|
||||||
'N' =>
|
'N' =>
|
||||||
array (
|
array (
|
||||||
|
|
@ -62,6 +62,11 @@ class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
|
||||||
'GuzzleHttp\\Psr7\\' => 16,
|
'GuzzleHttp\\Psr7\\' => 16,
|
||||||
'GuzzleHttp\\Promise\\' => 19,
|
'GuzzleHttp\\Promise\\' => 19,
|
||||||
'GuzzleHttp\\' => 11,
|
'GuzzleHttp\\' => 11,
|
||||||
|
'Google\\Auth\\' => 12,
|
||||||
|
),
|
||||||
|
'F' =>
|
||||||
|
array (
|
||||||
|
'Firebase\\JWT\\' => 13,
|
||||||
),
|
),
|
||||||
'E' =>
|
'E' =>
|
||||||
array (
|
array (
|
||||||
|
|
@ -119,6 +124,10 @@ class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
|
||||||
array (
|
array (
|
||||||
0 => __DIR__ . '/..' . '/psr/http-client/src',
|
0 => __DIR__ . '/..' . '/psr/http-client/src',
|
||||||
),
|
),
|
||||||
|
'Psr\\Cache\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/psr/cache/src',
|
||||||
|
),
|
||||||
'Nurigo\\' =>
|
'Nurigo\\' =>
|
||||||
array (
|
array (
|
||||||
0 => __DIR__ . '/..' . '/coolsms/php-sdk/app/Nurigo',
|
0 => __DIR__ . '/..' . '/coolsms/php-sdk/app/Nurigo',
|
||||||
|
|
@ -151,6 +160,14 @@ class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
|
||||||
array (
|
array (
|
||||||
0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src',
|
0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src',
|
||||||
),
|
),
|
||||||
|
'Google\\Auth\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/google/auth/src',
|
||||||
|
),
|
||||||
|
'Firebase\\JWT\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/firebase/php-jwt/src',
|
||||||
|
),
|
||||||
'Egulias\\EmailValidator\\' =>
|
'Egulias\\EmailValidator\\' =>
|
||||||
array (
|
array (
|
||||||
0 => __DIR__ . '/..' . '/egulias/email-validator/src',
|
0 => __DIR__ . '/..' . '/egulias/email-validator/src',
|
||||||
|
|
@ -291,6 +308,50 @@ class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
|
||||||
'Egulias\\EmailValidator\\Warning\\QuotedString' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/QuotedString.php',
|
'Egulias\\EmailValidator\\Warning\\QuotedString' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/QuotedString.php',
|
||||||
'Egulias\\EmailValidator\\Warning\\TLD' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/TLD.php',
|
'Egulias\\EmailValidator\\Warning\\TLD' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/TLD.php',
|
||||||
'Egulias\\EmailValidator\\Warning\\Warning' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/Warning.php',
|
'Egulias\\EmailValidator\\Warning\\Warning' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/Warning.php',
|
||||||
|
'Firebase\\JWT\\BeforeValidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/BeforeValidException.php',
|
||||||
|
'Firebase\\JWT\\CachedKeySet' => __DIR__ . '/..' . '/firebase/php-jwt/src/CachedKeySet.php',
|
||||||
|
'Firebase\\JWT\\ExpiredException' => __DIR__ . '/..' . '/firebase/php-jwt/src/ExpiredException.php',
|
||||||
|
'Firebase\\JWT\\JWK' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWK.php',
|
||||||
|
'Firebase\\JWT\\JWT' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWT.php',
|
||||||
|
'Firebase\\JWT\\Key' => __DIR__ . '/..' . '/firebase/php-jwt/src/Key.php',
|
||||||
|
'Firebase\\JWT\\SignatureInvalidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/SignatureInvalidException.php',
|
||||||
|
'Google\\Auth\\AccessToken' => __DIR__ . '/..' . '/google/auth/src/AccessToken.php',
|
||||||
|
'Google\\Auth\\ApplicationDefaultCredentials' => __DIR__ . '/..' . '/google/auth/src/ApplicationDefaultCredentials.php',
|
||||||
|
'Google\\Auth\\CacheTrait' => __DIR__ . '/..' . '/google/auth/src/CacheTrait.php',
|
||||||
|
'Google\\Auth\\Cache\\InvalidArgumentException' => __DIR__ . '/..' . '/google/auth/src/Cache/InvalidArgumentException.php',
|
||||||
|
'Google\\Auth\\Cache\\Item' => __DIR__ . '/..' . '/google/auth/src/Cache/Item.php',
|
||||||
|
'Google\\Auth\\Cache\\MemoryCacheItemPool' => __DIR__ . '/..' . '/google/auth/src/Cache/MemoryCacheItemPool.php',
|
||||||
|
'Google\\Auth\\Cache\\SysVCacheItemPool' => __DIR__ . '/..' . '/google/auth/src/Cache/SysVCacheItemPool.php',
|
||||||
|
'Google\\Auth\\Cache\\TypedItem' => __DIR__ . '/..' . '/google/auth/src/Cache/TypedItem.php',
|
||||||
|
'Google\\Auth\\CredentialsLoader' => __DIR__ . '/..' . '/google/auth/src/CredentialsLoader.php',
|
||||||
|
'Google\\Auth\\Credentials\\AppIdentityCredentials' => __DIR__ . '/..' . '/google/auth/src/Credentials/AppIdentityCredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\GCECredentials' => __DIR__ . '/..' . '/google/auth/src/Credentials/GCECredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\IAMCredentials' => __DIR__ . '/..' . '/google/auth/src/Credentials/IAMCredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\ImpersonatedServiceAccountCredentials' => __DIR__ . '/..' . '/google/auth/src/Credentials/ImpersonatedServiceAccountCredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\InsecureCredentials' => __DIR__ . '/..' . '/google/auth/src/Credentials/InsecureCredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\ServiceAccountCredentials' => __DIR__ . '/..' . '/google/auth/src/Credentials/ServiceAccountCredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\ServiceAccountJwtAccessCredentials' => __DIR__ . '/..' . '/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php',
|
||||||
|
'Google\\Auth\\Credentials\\UserRefreshCredentials' => __DIR__ . '/..' . '/google/auth/src/Credentials/UserRefreshCredentials.php',
|
||||||
|
'Google\\Auth\\FetchAuthTokenCache' => __DIR__ . '/..' . '/google/auth/src/FetchAuthTokenCache.php',
|
||||||
|
'Google\\Auth\\FetchAuthTokenInterface' => __DIR__ . '/..' . '/google/auth/src/FetchAuthTokenInterface.php',
|
||||||
|
'Google\\Auth\\GCECache' => __DIR__ . '/..' . '/google/auth/src/GCECache.php',
|
||||||
|
'Google\\Auth\\GetQuotaProjectInterface' => __DIR__ . '/..' . '/google/auth/src/GetQuotaProjectInterface.php',
|
||||||
|
'Google\\Auth\\HttpHandler\\Guzzle5HttpHandler' => __DIR__ . '/..' . '/google/auth/src/HttpHandler/Guzzle5HttpHandler.php',
|
||||||
|
'Google\\Auth\\HttpHandler\\Guzzle6HttpHandler' => __DIR__ . '/..' . '/google/auth/src/HttpHandler/Guzzle6HttpHandler.php',
|
||||||
|
'Google\\Auth\\HttpHandler\\Guzzle7HttpHandler' => __DIR__ . '/..' . '/google/auth/src/HttpHandler/Guzzle7HttpHandler.php',
|
||||||
|
'Google\\Auth\\HttpHandler\\HttpClientCache' => __DIR__ . '/..' . '/google/auth/src/HttpHandler/HttpClientCache.php',
|
||||||
|
'Google\\Auth\\HttpHandler\\HttpHandlerFactory' => __DIR__ . '/..' . '/google/auth/src/HttpHandler/HttpHandlerFactory.php',
|
||||||
|
'Google\\Auth\\Iam' => __DIR__ . '/..' . '/google/auth/src/Iam.php',
|
||||||
|
'Google\\Auth\\IamSignerTrait' => __DIR__ . '/..' . '/google/auth/src/IamSignerTrait.php',
|
||||||
|
'Google\\Auth\\Middleware\\AuthTokenMiddleware' => __DIR__ . '/..' . '/google/auth/src/Middleware/AuthTokenMiddleware.php',
|
||||||
|
'Google\\Auth\\Middleware\\ProxyAuthTokenMiddleware' => __DIR__ . '/..' . '/google/auth/src/Middleware/ProxyAuthTokenMiddleware.php',
|
||||||
|
'Google\\Auth\\Middleware\\ScopedAccessTokenMiddleware' => __DIR__ . '/..' . '/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php',
|
||||||
|
'Google\\Auth\\Middleware\\SimpleMiddleware' => __DIR__ . '/..' . '/google/auth/src/Middleware/SimpleMiddleware.php',
|
||||||
|
'Google\\Auth\\OAuth2' => __DIR__ . '/..' . '/google/auth/src/OAuth2.php',
|
||||||
|
'Google\\Auth\\ProjectIdProviderInterface' => __DIR__ . '/..' . '/google/auth/src/ProjectIdProviderInterface.php',
|
||||||
|
'Google\\Auth\\ServiceAccountSignerTrait' => __DIR__ . '/..' . '/google/auth/src/ServiceAccountSignerTrait.php',
|
||||||
|
'Google\\Auth\\SignBlobInterface' => __DIR__ . '/..' . '/google/auth/src/SignBlobInterface.php',
|
||||||
|
'Google\\Auth\\UpdateMetadataInterface' => __DIR__ . '/..' . '/google/auth/src/UpdateMetadataInterface.php',
|
||||||
'GuzzleHttp\\BodySummarizer' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/BodySummarizer.php',
|
'GuzzleHttp\\BodySummarizer' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/BodySummarizer.php',
|
||||||
'GuzzleHttp\\BodySummarizerInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/BodySummarizerInterface.php',
|
'GuzzleHttp\\BodySummarizerInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/BodySummarizerInterface.php',
|
||||||
'GuzzleHttp\\Client' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Client.php',
|
'GuzzleHttp\\Client' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Client.php',
|
||||||
|
|
@ -628,6 +689,7 @@ class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
|
||||||
'JBBCode\\visitors\\NestLimitVisitor' => __DIR__ . '/..' . '/jbbcode/jbbcode/JBBCode/visitors/NestLimitVisitor.php',
|
'JBBCode\\visitors\\NestLimitVisitor' => __DIR__ . '/..' . '/jbbcode/jbbcode/JBBCode/visitors/NestLimitVisitor.php',
|
||||||
'JBBCode\\visitors\\SmileyVisitor' => __DIR__ . '/..' . '/jbbcode/jbbcode/JBBCode/visitors/SmileyVisitor.php',
|
'JBBCode\\visitors\\SmileyVisitor' => __DIR__ . '/..' . '/jbbcode/jbbcode/JBBCode/visitors/SmileyVisitor.php',
|
||||||
'JBBCode\\visitors\\TagCountingVisitor' => __DIR__ . '/..' . '/jbbcode/jbbcode/JBBCode/visitors/TagCountingVisitor.php',
|
'JBBCode\\visitors\\TagCountingVisitor' => __DIR__ . '/..' . '/jbbcode/jbbcode/JBBCode/visitors/TagCountingVisitor.php',
|
||||||
|
'League\\HTMLToMarkdown\\Coerce' => __DIR__ . '/..' . '/league/html-to-markdown/src/Coerce.php',
|
||||||
'League\\HTMLToMarkdown\\Configuration' => __DIR__ . '/..' . '/league/html-to-markdown/src/Configuration.php',
|
'League\\HTMLToMarkdown\\Configuration' => __DIR__ . '/..' . '/league/html-to-markdown/src/Configuration.php',
|
||||||
'League\\HTMLToMarkdown\\ConfigurationAwareInterface' => __DIR__ . '/..' . '/league/html-to-markdown/src/ConfigurationAwareInterface.php',
|
'League\\HTMLToMarkdown\\ConfigurationAwareInterface' => __DIR__ . '/..' . '/league/html-to-markdown/src/ConfigurationAwareInterface.php',
|
||||||
'League\\HTMLToMarkdown\\Converter\\BlockquoteConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/BlockquoteConverter.php',
|
'League\\HTMLToMarkdown\\Converter\\BlockquoteConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/BlockquoteConverter.php',
|
||||||
|
|
@ -679,6 +741,10 @@ class ComposerStaticInit1e37ff09eb6590c7436f139ffd9070de
|
||||||
'Nurigo\\Exceptions\\CoolsmsSDKException' => __DIR__ . '/..' . '/coolsms/php-sdk/app/Nurigo/Exceptions/CoolsmsSDKException.php',
|
'Nurigo\\Exceptions\\CoolsmsSDKException' => __DIR__ . '/..' . '/coolsms/php-sdk/app/Nurigo/Exceptions/CoolsmsSDKException.php',
|
||||||
'Nurigo\\Exceptions\\CoolsmsServerException' => __DIR__ . '/..' . '/coolsms/php-sdk/app/Nurigo/Exceptions/CoolsmsServerException.php',
|
'Nurigo\\Exceptions\\CoolsmsServerException' => __DIR__ . '/..' . '/coolsms/php-sdk/app/Nurigo/Exceptions/CoolsmsServerException.php',
|
||||||
'Nurigo\\Exceptions\\CoolsmsSystemException' => __DIR__ . '/..' . '/coolsms/php-sdk/app/Nurigo/Exceptions/CoolsmsSystemException.php',
|
'Nurigo\\Exceptions\\CoolsmsSystemException' => __DIR__ . '/..' . '/coolsms/php-sdk/app/Nurigo/Exceptions/CoolsmsSystemException.php',
|
||||||
|
'Psr\\Cache\\CacheException' => __DIR__ . '/..' . '/psr/cache/src/CacheException.php',
|
||||||
|
'Psr\\Cache\\CacheItemInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemInterface.php',
|
||||||
|
'Psr\\Cache\\CacheItemPoolInterface' => __DIR__ . '/..' . '/psr/cache/src/CacheItemPoolInterface.php',
|
||||||
|
'Psr\\Cache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/cache/src/InvalidArgumentException.php',
|
||||||
'Psr\\Http\\Client\\ClientExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientExceptionInterface.php',
|
'Psr\\Http\\Client\\ClientExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientExceptionInterface.php',
|
||||||
'Psr\\Http\\Client\\ClientInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientInterface.php',
|
'Psr\\Http\\Client\\ClientInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientInterface.php',
|
||||||
'Psr\\Http\\Client\\NetworkExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/NetworkExceptionInterface.php',
|
'Psr\\Http\\Client\\NetworkExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/NetworkExceptionInterface.php',
|
||||||
|
|
|
||||||
|
|
@ -24,13 +24,13 @@
|
||||||
"require": {
|
"require": {
|
||||||
"ext-openssl": "*",
|
"ext-openssl": "*",
|
||||||
"ext-pcre": "*",
|
"ext-pcre": "*",
|
||||||
"php": "^5.3.2 || ^7.0 || ^8.0"
|
"php": "^7.2 || ^8.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/phpunit-bridge": "^4.2 || ^5",
|
"symfony/phpunit-bridge": "^4.2 || ^5",
|
||||||
"phpstan/phpstan": "^0.12.55",
|
"phpstan/phpstan": "^1.10",
|
||||||
"psr/log": "^1.0",
|
"psr/log": "^1.0",
|
||||||
"symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
|
"symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
|
|
@ -48,7 +48,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1 vendor/bin/simple-phpunit",
|
"test": "vendor/bin/simple-phpunit",
|
||||||
"phpstan": "vendor/bin/phpstan analyse"
|
"phpstan": "vendor/bin/phpstan analyse"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
527
common/vendor/composer/ca-bundle/res/cacert.pem
vendored
527
common/vendor/composer/ca-bundle/res/cacert.pem
vendored
|
|
@ -1,7 +1,7 @@
|
||||||
##
|
##
|
||||||
## Bundle of CA Root Certificates
|
## Bundle of CA Root Certificates
|
||||||
##
|
##
|
||||||
## Certificate data from Mozilla as of: Tue Jan 10 04:12:06 2023 GMT
|
## Certificate data from Mozilla as of: Mon Mar 11 15:25:27 2024 GMT
|
||||||
##
|
##
|
||||||
## 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 +14,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: 90c470e705b4b5f36f09684dc50e2b79c8b86989a848b62cd1a7bd6460ee65f6
|
## SHA256: 4d96bd539f4719e9ace493757afbe4a23ee8579de1c97fbebc50bba3c12e8c1e
|
||||||
##
|
##
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -200,27 +200,6 @@ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
|
||||||
qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
|
qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
Security Communication Root CA
|
|
||||||
==============================
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
|
|
||||||
U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
|
|
||||||
HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
|
|
||||||
U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
|
|
||||||
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
|
|
||||||
8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
|
|
||||||
DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
|
|
||||||
5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
|
|
||||||
DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
|
|
||||||
JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
|
|
||||||
DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
|
|
||||||
0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
|
|
||||||
mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
|
|
||||||
s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
|
|
||||||
6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
|
|
||||||
FL39vmwLAw==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
XRamp Global CA Root
|
XRamp Global CA Root
|
||||||
====================
|
====================
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
|
|
@ -603,26 +582,6 @@ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
|
||||||
dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
|
dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
Hongkong Post Root CA 1
|
|
||||||
=======================
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
|
|
||||||
DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
|
|
||||||
NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
|
|
||||||
IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
|
|
||||||
AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
|
|
||||||
ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
|
|
||||||
auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
|
|
||||||
qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
|
|
||||||
V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
|
|
||||||
HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
|
|
||||||
h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
|
|
||||||
l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
|
|
||||||
IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
|
|
||||||
T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
|
|
||||||
c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
SecureSign RootCA11
|
SecureSign RootCA11
|
||||||
===================
|
===================
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
|
|
@ -689,39 +648,6 @@ YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
|
||||||
kpeDMdmztcpHWD9f
|
kpeDMdmztcpHWD9f
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
Autoridad de Certificacion Firmaprofesional CIF A62634068
|
|
||||||
=========================================================
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
|
|
||||||
BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
|
|
||||||
MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
|
|
||||||
QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
|
|
||||||
NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
|
|
||||||
Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
|
|
||||||
B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
|
|
||||||
7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
|
|
||||||
ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
|
|
||||||
plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
|
|
||||||
MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
|
|
||||||
LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
|
|
||||||
bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
|
|
||||||
vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
|
|
||||||
EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
|
|
||||||
DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
|
|
||||||
cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
|
|
||||||
bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
|
|
||||||
ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
|
|
||||||
51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
|
|
||||||
R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
|
|
||||||
T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
|
|
||||||
Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
|
|
||||||
osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
|
|
||||||
crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
|
|
||||||
saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
|
|
||||||
KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
|
|
||||||
6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
Izenpe.com
|
Izenpe.com
|
||||||
==========
|
==========
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
|
|
@ -1261,40 +1187,6 @@ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
|
||||||
WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
|
WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
E-Tugra Certification Authority
|
|
||||||
===============================
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
|
|
||||||
DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
|
|
||||||
ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
|
|
||||||
ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
|
|
||||||
NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
|
|
||||||
QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
|
|
||||||
cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
|
|
||||||
DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
|
|
||||||
MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
|
|
||||||
hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
|
|
||||||
CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
|
|
||||||
ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
|
|
||||||
BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
|
|
||||||
E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
|
|
||||||
rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
|
|
||||||
jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
|
|
||||||
rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
|
|
||||||
dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
|
|
||||||
/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
|
|
||||||
MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
|
|
||||||
kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
|
|
||||||
XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
|
|
||||||
VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
|
|
||||||
a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
|
|
||||||
dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
|
|
||||||
KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
|
|
||||||
Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
|
|
||||||
8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
|
|
||||||
C7TbO6Orb1wdtn7os4I07QZcJA==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
T-TeleSec GlobalRoot Class 2
|
T-TeleSec GlobalRoot Class 2
|
||||||
============================
|
============================
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
|
|
@ -3276,55 +3168,6 @@ AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8
|
||||||
rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR
|
rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
E-Tugra Global Root CA RSA v3
|
|
||||||
=============================
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIF8zCCA9ugAwIBAgIUDU3FzRYilZYIfrgLfxUGNPt5EDQwDQYJKoZIhvcNAQELBQAwgYAxCzAJ
|
|
||||||
BgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAb
|
|
||||||
BgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290
|
|
||||||
IENBIFJTQSB2MzAeFw0yMDAzMTgwOTA3MTdaFw00NTAzMTIwOTA3MTdaMIGAMQswCQYDVQQGEwJU
|
|
||||||
UjEPMA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRF
|
|
||||||
LVR1Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBSU0Eg
|
|
||||||
djMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCiZvCJt3J77gnJY9LTQ91ew6aEOErx
|
|
||||||
jYG7FL1H6EAX8z3DeEVypi6Q3po61CBxyryfHUuXCscxuj7X/iWpKo429NEvx7epXTPcMHD4QGxL
|
|
||||||
sqYxYdE0PD0xesevxKenhOGXpOhL9hd87jwH7eKKV9y2+/hDJVDqJ4GohryPUkqWOmAalrv9c/SF
|
|
||||||
/YP9f4RtNGx/ardLAQO/rWm31zLZ9Vdq6YaCPqVmMbMWPcLzJmAy01IesGykNz709a/r4d+ABs8q
|
|
||||||
QedmCeFLl+d3vSFtKbZnwy1+7dZ5ZdHPOrbRsV5WYVB6Ws5OUDGAA5hH5+QYfERaxqSzO8bGwzrw
|
|
||||||
bMOLyKSRBfP12baqBqG3q+Sx6iEUXIOk/P+2UNOMEiaZdnDpwA+mdPy70Bt4znKS4iicvObpCdg6
|
|
||||||
04nmvi533wEKb5b25Y08TVJ2Glbhc34XrD2tbKNSEhhw5oBOM/J+JjKsBY04pOZ2PJ8QaQ5tndLB
|
|
||||||
eSBrW88zjdGUdjXnXVXHt6woq0bM5zshtQoK5EpZ3IE1S0SVEgpnpaH/WwAH0sDM+T/8nzPyAPiM
|
|
||||||
bIedBi3x7+PmBvrFZhNb/FAHnnGGstpvdDDPk1Po3CLW3iAfYY2jLqN4MpBs3KwytQXk9TwzDdbg
|
|
||||||
h3cXTJ2w2AmoDVf3RIXwyAS+XF1a4xeOVGNpf0l0ZAWMowIDAQABo2MwYTAPBgNVHRMBAf8EBTAD
|
|
||||||
AQH/MB8GA1UdIwQYMBaAFLK0ruYt9ybVqnUtdkvAG1Mh0EjvMB0GA1UdDgQWBBSytK7mLfcm1ap1
|
|
||||||
LXZLwBtTIdBI7zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAImocn+M684uGMQQ
|
|
||||||
gC0QDP/7FM0E4BQ8Tpr7nym/Ip5XuYJzEmMmtcyQ6dIqKe6cLcwsmb5FJ+Sxce3kOJUxQfJ9emN4
|
|
||||||
38o2Fi+CiJ+8EUdPdk3ILY7r3y18Tjvarvbj2l0Upq7ohUSdBm6O++96SmotKygY/r+QLHUWnw/q
|
|
||||||
ln0F7psTpURs+APQ3SPh/QMSEgj0GDSz4DcLdxEBSL9htLX4GdnLTeqjjO/98Aa1bZL0SmFQhO3s
|
|
||||||
SdPkvmjmLuMxC1QLGpLWgti2omU8ZgT5Vdps+9u1FGZNlIM7zR6mK7L+d0CGq+ffCsn99t2HVhjY
|
|
||||||
sCxVYJb6CH5SkPVLpi6HfMsg2wY+oF0Dd32iPBMbKaITVaA9FCKvb7jQmhty3QUBjYZgv6Rn7rWl
|
|
||||||
DdF/5horYmbDB7rnoEgcOMPpRfunf/ztAmgayncSd6YAVSgU7NbHEqIbZULpkejLPoeJVF3Zr52X
|
|
||||||
nGnnCv8PWniLYypMfUeUP95L6VPQMPHF9p5J3zugkaOj/s1YzOrfr28oO6Bpm4/srK4rVJ2bBLFH
|
|
||||||
IK+WEj5jlB0E5y67hscMmoi/dkfv97ALl2bSRM9gUgfh1SxKOidhd8rXj+eHDjD/DLsE4mHDosiX
|
|
||||||
YY60MGo8bcIHX0pzLz/5FooBZu+6kcpSV3uu1OYP3Qt6f4ueJiDPO++BcYNZ
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
E-Tugra Global Root CA ECC v3
|
|
||||||
=============================
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMwgYAxCzAJBgNV
|
|
||||||
BAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAbBgNV
|
|
||||||
BAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENB
|
|
||||||
IEVDQyB2MzAeFw0yMDAzMTgwOTQ2NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEP
|
|
||||||
MA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1
|
|
||||||
Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBFQ0MgdjMw
|
|
||||||
djAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQKczLWYHMjLiSF4mDKpL2
|
|
||||||
w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YKfWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31
|
|
||||||
Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQ
|
|
||||||
zPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO
|
|
||||||
PQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4W
|
|
||||||
Aie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
Security Communication RootCA3
|
Security Communication RootCA3
|
||||||
==============================
|
==============================
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
|
|
@ -3370,3 +3213,369 @@ BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L
|
||||||
snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e
|
snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e
|
||||||
N9k=
|
N9k=
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
BJCA Global Root CA1
|
||||||
|
====================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG
|
||||||
|
EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK
|
||||||
|
Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG
|
||||||
|
A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD
|
||||||
|
DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm
|
||||||
|
CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS
|
||||||
|
sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn
|
||||||
|
P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW
|
||||||
|
yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj
|
||||||
|
eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn
|
||||||
|
MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b
|
||||||
|
OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh
|
||||||
|
GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK
|
||||||
|
H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB
|
||||||
|
AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G
|
||||||
|
A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4
|
||||||
|
YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ
|
||||||
|
dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8
|
||||||
|
60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh
|
||||||
|
TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW
|
||||||
|
4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp
|
||||||
|
GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx
|
||||||
|
4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps
|
||||||
|
3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S
|
||||||
|
SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
BJCA Global Root CA2
|
||||||
|
====================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD
|
||||||
|
TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg
|
||||||
|
R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE
|
||||||
|
BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC
|
||||||
|
SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl
|
||||||
|
SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK
|
||||||
|
/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI
|
||||||
|
1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8
|
||||||
|
W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g
|
||||||
|
UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
Sectigo Public Server Authentication Root E46
|
||||||
|
=============================================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH
|
||||||
|
QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2
|
||||||
|
ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5
|
||||||
|
WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0
|
||||||
|
aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr
|
||||||
|
gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0
|
||||||
|
NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud
|
||||||
|
DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
|
||||||
|
/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH
|
||||||
|
lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U
|
||||||
|
SAGKcw==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
Sectigo Public Server Authentication Root R46
|
||||||
|
=============================================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG
|
||||||
|
EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT
|
||||||
|
ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1
|
||||||
|
OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T
|
||||||
|
ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3
|
||||||
|
DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k
|
||||||
|
1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf
|
||||||
|
GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP
|
||||||
|
FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu
|
||||||
|
ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz
|
||||||
|
Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A
|
||||||
|
wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF
|
||||||
|
plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ
|
||||||
|
EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW
|
||||||
|
6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI
|
||||||
|
IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c
|
||||||
|
mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp
|
||||||
|
E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4
|
||||||
|
exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M
|
||||||
|
0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI
|
||||||
|
84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m
|
||||||
|
pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd
|
||||||
|
Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b
|
||||||
|
E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm
|
||||||
|
J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
SSL.com TLS RSA Root CA 2022
|
||||||
|
============================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG
|
||||||
|
EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg
|
||||||
|
Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC
|
||||||
|
VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv
|
||||||
|
b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u
|
||||||
|
9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y
|
||||||
|
7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac
|
||||||
|
oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M
|
||||||
|
R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG
|
||||||
|
D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW
|
||||||
|
TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk
|
||||||
|
8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq
|
||||||
|
g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk
|
||||||
|
7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud
|
||||||
|
EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu
|
||||||
|
N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt
|
||||||
|
hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN
|
||||||
|
j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by
|
||||||
|
iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU
|
||||||
|
o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo
|
||||||
|
ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib
|
||||||
|
MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi
|
||||||
|
vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7
|
||||||
|
P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0
|
||||||
|
9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
SSL.com TLS ECC Root CA 2022
|
||||||
|
============================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV
|
||||||
|
UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v
|
||||||
|
dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx
|
||||||
|
GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg
|
||||||
|
Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy
|
||||||
|
JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1
|
||||||
|
5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7
|
||||||
|
81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG
|
||||||
|
MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w
|
||||||
|
7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5
|
||||||
|
Zn6g6g==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
Atos TrustedRoot Root CA ECC TLS 2021
|
||||||
|
=====================================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB
|
||||||
|
dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD
|
||||||
|
VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg
|
||||||
|
VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT
|
||||||
|
AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K
|
||||||
|
DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS
|
||||||
|
b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX
|
||||||
|
NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+
|
||||||
|
uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY
|
||||||
|
a3cpetskz2VAv9LcjBHo9H1/IISpQuQo
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
Atos TrustedRoot Root CA RSA TLS 2021
|
||||||
|
=====================================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD
|
||||||
|
DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw
|
||||||
|
CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0
|
||||||
|
b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV
|
||||||
|
BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB
|
||||||
|
l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG
|
||||||
|
vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK
|
||||||
|
ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt
|
||||||
|
0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK
|
||||||
|
PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY
|
||||||
|
sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY
|
||||||
|
Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+
|
||||||
|
rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa
|
||||||
|
fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/
|
||||||
|
BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G
|
||||||
|
CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS
|
||||||
|
4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl
|
||||||
|
Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX
|
||||||
|
AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G
|
||||||
|
slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt
|
||||||
|
afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q
|
||||||
|
TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj
|
||||||
|
1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l
|
||||||
|
PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W
|
||||||
|
HYMfRsCbvUOZ58SWLs5fyQ==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
TrustAsia Global Root CA G3
|
||||||
|
===========================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG
|
||||||
|
A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM
|
||||||
|
G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw
|
||||||
|
MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu
|
||||||
|
MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA
|
||||||
|
A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz
|
||||||
|
lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ
|
||||||
|
Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V
|
||||||
|
P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag
|
||||||
|
dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm
|
||||||
|
9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc
|
||||||
|
D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg
|
||||||
|
WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea
|
||||||
|
mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF
|
||||||
|
TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj
|
||||||
|
7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E
|
||||||
|
BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1
|
||||||
|
D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T
|
||||||
|
G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj
|
||||||
|
duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl
|
||||||
|
cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys
|
||||||
|
+TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli
|
||||||
|
2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y
|
||||||
|
aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS
|
||||||
|
ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR
|
||||||
|
JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
TrustAsia Global Root CA G4
|
||||||
|
===========================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE
|
||||||
|
BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry
|
||||||
|
dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa
|
||||||
|
MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw
|
||||||
|
IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
|
||||||
|
AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8
|
||||||
|
m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF
|
||||||
|
MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/
|
||||||
|
pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA
|
||||||
|
bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk
|
||||||
|
dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
CommScope Public Trust ECC Root-01
|
||||||
|
==================================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkGA1UE
|
||||||
|
BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz
|
||||||
|
dCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYT
|
||||||
|
AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg
|
||||||
|
RUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLx
|
||||||
|
eP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJEhRGnSjot
|
||||||
|
6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
|
||||||
|
A1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggqhkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2
|
||||||
|
Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liW
|
||||||
|
pDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7LR47QjRE=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
CommScope Public Trust ECC Root-02
|
||||||
|
==================================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkGA1UE
|
||||||
|
BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz
|
||||||
|
dCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYT
|
||||||
|
AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg
|
||||||
|
RUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/M
|
||||||
|
MDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmUv4RDsNuE
|
||||||
|
SgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
|
||||||
|
A1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggqhkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9
|
||||||
|
Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs7
|
||||||
|
3u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ0LKOag==
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
CommScope Public Trust RSA Root-01
|
||||||
|
==================================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjELMAkG
|
||||||
|
A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU
|
||||||
|
cnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNV
|
||||||
|
BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1
|
||||||
|
c3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45Ft
|
||||||
|
nYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslhsuitQDy6
|
||||||
|
uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0alDrJLpA6lfO741GIDuZNq
|
||||||
|
ihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3OjWiE260f6GBfZumbCk6SP/F2krfxQapWs
|
||||||
|
vCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/c
|
||||||
|
Zip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTif
|
||||||
|
BSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9
|
||||||
|
lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeo
|
||||||
|
KFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH
|
||||||
|
+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAP
|
||||||
|
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm4
|
||||||
|
5P3luG0wDQYJKoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6
|
||||||
|
NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM
|
||||||
|
3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck
|
||||||
|
jXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg+Mkf
|
||||||
|
Foom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/W
|
||||||
|
NyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+
|
||||||
|
o/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0wlREQKC6/
|
||||||
|
oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHnYfkUyq+Dj7+vsQpZXdxc
|
||||||
|
1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3SgazNNtQEo/a2tiRc7ppqEvOuM
|
||||||
|
6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
CommScope Public Trust RSA Root-02
|
||||||
|
==================================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjELMAkG
|
||||||
|
A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU
|
||||||
|
cnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNV
|
||||||
|
BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1
|
||||||
|
c3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3V
|
||||||
|
rCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0kyI9p+Kx
|
||||||
|
7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1CrWDaSWqVcN3SAOLMV2MC
|
||||||
|
e5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxzhkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2W
|
||||||
|
Wy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rp
|
||||||
|
M9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIf
|
||||||
|
hs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMr
|
||||||
|
eyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycE
|
||||||
|
VS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4t
|
||||||
|
Vn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAP
|
||||||
|
BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7Gx
|
||||||
|
cJXvYXowDQYJKoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB
|
||||||
|
KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF
|
||||||
|
1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa
|
||||||
|
MS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xd
|
||||||
|
gSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2O
|
||||||
|
HG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+Nm
|
||||||
|
YWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2dlklyALKr
|
||||||
|
dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ
|
||||||
|
iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN
|
||||||
|
lM47ni3niAIi9G7oyOzWPPO5std3eqx7
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
Telekom Security TLS ECC Root 2020
|
||||||
|
==================================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE
|
||||||
|
RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl
|
||||||
|
a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz
|
||||||
|
NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg
|
||||||
|
R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG
|
||||||
|
SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1
|
||||||
|
2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC
|
||||||
|
MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
|
||||||
|
AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ
|
||||||
|
Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU
|
||||||
|
ga/sf+Rn27iQ7t0l
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
|
Telekom Security TLS RSA Root 2023
|
||||||
|
==================================
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQG
|
||||||
|
EwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJU
|
||||||
|
ZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAyMDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMy
|
||||||
|
NzIzNTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJp
|
||||||
|
dHkgR21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIw
|
||||||
|
DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9cUD/h3VC
|
||||||
|
KSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHVcp6R+SPWcHu79ZvB7JPP
|
||||||
|
GeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMAU6DksquDOFczJZSfvkgdmOGjup5czQRx
|
||||||
|
UX11eKvzWarE4GC+j4NSuHUaQTXtvPM6Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWo
|
||||||
|
l8hHD/BeEIvnHRz+sTugBTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9
|
||||||
|
FIS3R/qy8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73Jco4v
|
||||||
|
zLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg8qKrBC7m8kwOFjQg
|
||||||
|
rIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8rFEz0ciD0cmfHdRHNCk+y7AO+oML
|
||||||
|
KFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7S
|
||||||
|
WWO/gLCMk3PLNaaZlSJhZQNg+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNV
|
||||||
|
HQ4EFgQUtqeXgj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2
|
||||||
|
p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQpGv7qHBFfLp+
|
||||||
|
sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm9S3ul0A8Yute1hTWjOKWi0Fp
|
||||||
|
kzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErwM807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy
|
||||||
|
/SKE8YXJN3nptT+/XOR0so8RYgDdGGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4
|
||||||
|
mZqTuXNnQkYRIer+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtz
|
||||||
|
aL1txKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+w6jv/naa
|
||||||
|
oqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aKL4x35bcF7DvB7L6Gs4a8
|
||||||
|
wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE
|
||||||
|
HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0
|
||||||
|
o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
|
|
||||||
142
common/vendor/composer/ca-bundle/src/CaBundle.php
vendored
142
common/vendor/composer/ca-bundle/src/CaBundle.php
vendored
|
|
@ -24,8 +24,6 @@ class CaBundle
|
||||||
private static $caPath;
|
private static $caPath;
|
||||||
/** @var array<string, bool> */
|
/** @var array<string, bool> */
|
||||||
private static $caFileValidity = array();
|
private static $caFileValidity = array();
|
||||||
/** @var bool|null */
|
|
||||||
private static $useOpensslParse;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the system CA bundle path, or a path to the bundled one
|
* Returns the system CA bundle path, or a path to the bundled one
|
||||||
|
|
@ -64,7 +62,7 @@ class CaBundle
|
||||||
* @param LoggerInterface $logger optional logger for information about which CA files were loaded
|
* @param LoggerInterface $logger optional logger for information about which CA files were loaded
|
||||||
* @return string path to a CA bundle file or directory
|
* @return string path to a CA bundle file or directory
|
||||||
*/
|
*/
|
||||||
public static function getSystemCaRootBundlePath(LoggerInterface $logger = null)
|
public static function getSystemCaRootBundlePath(?LoggerInterface $logger = null)
|
||||||
{
|
{
|
||||||
if (self::$caPath !== null) {
|
if (self::$caPath !== null) {
|
||||||
return self::$caPath;
|
return self::$caPath;
|
||||||
|
|
@ -95,6 +93,8 @@ class CaBundle
|
||||||
'/usr/local/etc/ssl/cert.pem', // FreeBSD 10.x
|
'/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@1.1/cert.pem', // macOS silicon homebrew, openssl@1.1 package
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach($otherLocations as $location) {
|
foreach($otherLocations as $location) {
|
||||||
|
|
@ -158,7 +158,7 @@ class CaBundle
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function validateCaFile($filename, LoggerInterface $logger = null)
|
public static function validateCaFile($filename, ?LoggerInterface $logger = null)
|
||||||
{
|
{
|
||||||
static $warned = false;
|
static $warned = false;
|
||||||
|
|
||||||
|
|
@ -168,19 +168,7 @@ class CaBundle
|
||||||
|
|
||||||
$contents = file_get_contents($filename);
|
$contents = file_get_contents($filename);
|
||||||
|
|
||||||
// assume the CA is valid if php is vulnerable to
|
if (is_string($contents) && strlen($contents) > 0) {
|
||||||
// https://www.sektioneins.de/advisories/advisory-012013-php-openssl_x509_parse-memory-corruption-vulnerability.html
|
|
||||||
if (!static::isOpensslParseSafe()) {
|
|
||||||
if (!$warned && $logger) {
|
|
||||||
$logger->warning(sprintf(
|
|
||||||
'Your version of PHP, %s, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.',
|
|
||||||
PHP_VERSION
|
|
||||||
));
|
|
||||||
$warned = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$isValid = !empty($contents);
|
|
||||||
} elseif (is_string($contents) && strlen($contents) > 0) {
|
|
||||||
$contents = preg_replace("/^(\\-+(?:BEGIN|END))\\s+TRUSTED\\s+(CERTIFICATE\\-+)\$/m", '$1 $2', $contents);
|
$contents = preg_replace("/^(\\-+(?:BEGIN|END))\\s+TRUSTED\\s+(CERTIFICATE\\-+)\$/m", '$1 $2', $contents);
|
||||||
if (null === $contents) {
|
if (null === $contents) {
|
||||||
// regex extraction failed
|
// regex extraction failed
|
||||||
|
|
@ -209,100 +197,7 @@ class CaBundle
|
||||||
*/
|
*/
|
||||||
public static function isOpensslParseSafe()
|
public static function isOpensslParseSafe()
|
||||||
{
|
{
|
||||||
if (null !== self::$useOpensslParse) {
|
return true;
|
||||||
return self::$useOpensslParse;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PHP_VERSION_ID >= 50600) {
|
|
||||||
return self::$useOpensslParse = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Vulnerable:
|
|
||||||
// PHP 5.3.0 - PHP 5.3.27
|
|
||||||
// PHP 5.4.0 - PHP 5.4.22
|
|
||||||
// PHP 5.5.0 - PHP 5.5.6
|
|
||||||
if (
|
|
||||||
(PHP_VERSION_ID < 50400 && PHP_VERSION_ID >= 50328)
|
|
||||||
|| (PHP_VERSION_ID < 50500 && PHP_VERSION_ID >= 50423)
|
|
||||||
|| PHP_VERSION_ID >= 50507
|
|
||||||
) {
|
|
||||||
// This version of PHP has the fix for CVE-2013-6420 applied.
|
|
||||||
return self::$useOpensslParse = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (defined('PHP_WINDOWS_VERSION_BUILD')) {
|
|
||||||
// Windows is probably insecure in this case.
|
|
||||||
return self::$useOpensslParse = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$compareDistroVersionPrefix = function ($prefix, $fixedVersion) {
|
|
||||||
$regex = '{^'.preg_quote($prefix).'([0-9]+)$}';
|
|
||||||
|
|
||||||
if (preg_match($regex, PHP_VERSION, $m)) {
|
|
||||||
return ((int) $m[1]) >= $fixedVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Hard coded list of PHP distributions with the fix backported.
|
|
||||||
if (
|
|
||||||
$compareDistroVersionPrefix('5.3.3-7+squeeze', 18) // Debian 6 (Squeeze)
|
|
||||||
|| $compareDistroVersionPrefix('5.4.4-14+deb7u', 7) // Debian 7 (Wheezy)
|
|
||||||
|| $compareDistroVersionPrefix('5.3.10-1ubuntu3.', 9) // Ubuntu 12.04 (Precise)
|
|
||||||
) {
|
|
||||||
return self::$useOpensslParse = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Symfony Process component is missing so we assume it is unsafe at this point
|
|
||||||
if (!class_exists('Symfony\Component\Process\PhpProcess')) {
|
|
||||||
return self::$useOpensslParse = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is where things get crazy, because distros backport security
|
|
||||||
// fixes the chances are on NIX systems the fix has been applied but
|
|
||||||
// it's not possible to verify that from the PHP version.
|
|
||||||
//
|
|
||||||
// To verify exec a new PHP process and run the issue testcase with
|
|
||||||
// known safe input that replicates the bug.
|
|
||||||
|
|
||||||
// Based on testcase in https://github.com/php/php-src/commit/c1224573c773b6845e83505f717fbf820fc18415
|
|
||||||
// changes in https://github.com/php/php-src/commit/76a7fd893b7d6101300cc656058704a73254d593
|
|
||||||
$cert = 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVwRENDQTR5Z0F3SUJBZ0lKQUp6dThyNnU2ZUJjTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhETVFzd0NRWUQKVlFRR0V3SkVSVEVjTUJvR0ExVUVDQXdUVG05eVpISm9aV2x1TFZkbGMzUm1ZV3hsYmpFUU1BNEdBMVVFQnd3SApTOE9Ed3Jac2JqRVVNQklHQTFVRUNnd0xVMlZyZEdsdmJrVnBibk14SHpBZEJnTlZCQXNNRmsxaGJHbGphVzkxCmN5QkRaWEowSUZObFkzUnBiMjR4SVRBZkJnTlZCQU1NR0cxaGJHbGphVzkxY3k1elpXdDBhVzl1WldsdWN5NWsKWlRFcU1DZ0dDU3FHU0liM0RRRUpBUlliYzNSbFptRnVMbVZ6YzJWeVFITmxhM1JwYjI1bGFXNXpMbVJsTUhVWQpaREU1TnpBd01UQXhNREF3TURBd1dnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKQUFBQUFBQVhEVEUwTVRFeU9ERXhNemt6TlZvd2djTXhDekFKQmdOVkJBWVRBa1JGTVJ3d0dnWURWUVFJREJOTwpiM0prY21obGFXNHRWMlZ6ZEdaaGJHVnVNUkF3RGdZRFZRUUhEQWRMdzRQQ3RteHVNUlF3RWdZRFZRUUtEQXRUClpXdDBhVzl1UldsdWN6RWZNQjBHQTFVRUN3d1dUV0ZzYVdOcGIzVnpJRU5sY25RZ1UyVmpkR2x2YmpFaE1COEcKQTFVRUF3d1liV0ZzYVdOcGIzVnpMbk5sYTNScGIyNWxhVzV6TG1SbE1Tb3dLQVlKS29aSWh2Y05BUWtCRmh0egpkR1ZtWVc0dVpYTnpaWEpBYzJWcmRHbHZibVZwYm5NdVpHVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCCkR3QXdnZ0VLQW9JQkFRRERBZjNobDdKWTBYY0ZuaXlFSnBTU0RxbjBPcUJyNlFQNjV1c0pQUnQvOFBhRG9xQnUKd0VZVC9OYSs2ZnNnUGpDMHVLOURaZ1dnMnRIV1dvYW5TYmxBTW96NVBINlorUzRTSFJaN2UyZERJalBqZGhqaAowbUxnMlVNTzV5cDBWNzk3R2dzOWxOdDZKUmZIODFNTjJvYlhXczROdHp0TE11RDZlZ3FwcjhkRGJyMzRhT3M4CnBrZHVpNVVhd1Raa3N5NXBMUEhxNWNNaEZHbTA2djY1Q0xvMFYyUGQ5K0tBb2tQclBjTjVLTEtlYno3bUxwazYKU01lRVhPS1A0aWRFcXh5UTdPN2ZCdUhNZWRzUWh1K3ByWTNzaTNCVXlLZlF0UDVDWm5YMmJwMHdLSHhYMTJEWAoxbmZGSXQ5RGJHdkhUY3lPdU4rblpMUEJtM3ZXeG50eUlJdlZBZ01CQUFHalFqQkFNQWtHQTFVZEV3UUNNQUF3CkVRWUpZSVpJQVliNFFnRUJCQVFEQWdlQU1Bc0dBMVVkRHdRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUYKQlFjREFqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFHMGZaWVlDVGJkajFYWWMrMVNub2FQUit2SThDOENhRAo4KzBVWWhkbnlVNGdnYTBCQWNEclk5ZTk0ZUVBdTZacXljRjZGakxxWFhkQWJvcHBXb2NyNlQ2R0QxeDMzQ2tsClZBcnpHL0t4UW9oR0QySmVxa2hJTWxEb214SE83a2EzOStPYThpMnZXTFZ5alU4QVp2V01BcnVIYTRFRU55RzcKbFcyQWFnYUZLRkNyOVRuWFRmcmR4R1ZFYnY3S1ZRNmJkaGc1cDVTanBXSDErTXEwM3VSM1pYUEJZZHlWODMxOQpvMGxWajFLRkkyRENML2xpV2lzSlJvb2YrMWNSMzVDdGQwd1lCY3BCNlRac2xNY09QbDc2ZHdLd0pnZUpvMlFnClpzZm1jMnZDMS9xT2xOdU5xLzBUenprVkd2OEVUVDNDZ2FVK1VYZTRYT1Z2a2NjZWJKbjJkZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K';
|
|
||||||
$script = <<<'EOT'
|
|
||||||
|
|
||||||
error_reporting(-1);
|
|
||||||
$info = openssl_x509_parse(base64_decode('%s'));
|
|
||||||
var_dump(PHP_VERSION, $info['issuer']['emailAddress'], $info['validFrom_time_t']);
|
|
||||||
|
|
||||||
EOT;
|
|
||||||
$script = '<'."?php\n".sprintf($script, $cert);
|
|
||||||
|
|
||||||
try {
|
|
||||||
$process = new PhpProcess($script);
|
|
||||||
$process->mustRun();
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
// In the case of any exceptions just accept it is not possible to
|
|
||||||
// determine the safety of openssl_x509_parse and bail out.
|
|
||||||
return self::$useOpensslParse = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$output = preg_split('{\r?\n}', trim($process->getOutput()));
|
|
||||||
$errorOutput = trim($process->getErrorOutput());
|
|
||||||
|
|
||||||
if (
|
|
||||||
is_array($output)
|
|
||||||
&& count($output) === 3
|
|
||||||
&& $output[0] === sprintf('string(%d) "%s"', strlen(PHP_VERSION), PHP_VERSION)
|
|
||||||
&& $output[1] === 'string(27) "stefan.esser@sektioneins.de"'
|
|
||||||
&& $output[2] === 'int(-1)'
|
|
||||||
&& preg_match('{openssl_x509_parse\(\): illegal (?:ASN1 data type for|length in) timestamp in - on line \d+}', $errorOutput)
|
|
||||||
) {
|
|
||||||
// This PHP has the fix backported probably by a distro security team.
|
|
||||||
return self::$useOpensslParse = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return self::$useOpensslParse = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -313,7 +208,6 @@ EOT;
|
||||||
{
|
{
|
||||||
self::$caFileValidity = array();
|
self::$caFileValidity = array();
|
||||||
self::$caPath = null;
|
self::$caPath = null;
|
||||||
self::$useOpensslParse = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -338,12 +232,12 @@ EOT;
|
||||||
* @param LoggerInterface|null $logger
|
* @param LoggerInterface|null $logger
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
private static function caFileUsable($certFile, LoggerInterface $logger = null)
|
private static function caFileUsable($certFile, ?LoggerInterface $logger = null)
|
||||||
{
|
{
|
||||||
return $certFile
|
return $certFile
|
||||||
&& static::isFile($certFile, $logger)
|
&& self::isFile($certFile, $logger)
|
||||||
&& static::isReadable($certFile, $logger)
|
&& self::isReadable($certFile, $logger)
|
||||||
&& static::validateCaFile($certFile, $logger);
|
&& self::validateCaFile($certFile, $logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -351,12 +245,12 @@ EOT;
|
||||||
* @param LoggerInterface|null $logger
|
* @param LoggerInterface|null $logger
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
private static function caDirUsable($certDir, LoggerInterface $logger = null)
|
private static function caDirUsable($certDir, ?LoggerInterface $logger = null)
|
||||||
{
|
{
|
||||||
return $certDir
|
return $certDir
|
||||||
&& static::isDir($certDir, $logger)
|
&& self::isDir($certDir, $logger)
|
||||||
&& static::isReadable($certDir, $logger)
|
&& self::isReadable($certDir, $logger)
|
||||||
&& static::glob($certDir . '/*', $logger);
|
&& self::glob($certDir . '/*', $logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -364,7 +258,7 @@ EOT;
|
||||||
* @param LoggerInterface|null $logger
|
* @param LoggerInterface|null $logger
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
private static function isFile($certFile, LoggerInterface $logger = null)
|
private static function isFile($certFile, ?LoggerInterface $logger = null)
|
||||||
{
|
{
|
||||||
$isFile = @is_file($certFile);
|
$isFile = @is_file($certFile);
|
||||||
if (!$isFile && $logger) {
|
if (!$isFile && $logger) {
|
||||||
|
|
@ -379,7 +273,7 @@ EOT;
|
||||||
* @param LoggerInterface|null $logger
|
* @param LoggerInterface|null $logger
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
private static function isDir($certDir, LoggerInterface $logger = null)
|
private static function isDir($certDir, ?LoggerInterface $logger = null)
|
||||||
{
|
{
|
||||||
$isDir = @is_dir($certDir);
|
$isDir = @is_dir($certDir);
|
||||||
if (!$isDir && $logger) {
|
if (!$isDir && $logger) {
|
||||||
|
|
@ -394,7 +288,7 @@ EOT;
|
||||||
* @param LoggerInterface|null $logger
|
* @param LoggerInterface|null $logger
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
private static function isReadable($certFileOrDir, LoggerInterface $logger = null)
|
private static function isReadable($certFileOrDir, ?LoggerInterface $logger = null)
|
||||||
{
|
{
|
||||||
$isReadable = @is_readable($certFileOrDir);
|
$isReadable = @is_readable($certFileOrDir);
|
||||||
if (!$isReadable && $logger) {
|
if (!$isReadable && $logger) {
|
||||||
|
|
@ -409,7 +303,7 @@ EOT;
|
||||||
* @param LoggerInterface|null $logger
|
* @param LoggerInterface|null $logger
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
private static function glob($pattern, LoggerInterface $logger = null)
|
private static function glob($pattern, ?LoggerInterface $logger = null)
|
||||||
{
|
{
|
||||||
$certs = glob($pattern);
|
$certs = glob($pattern);
|
||||||
if ($certs === false) {
|
if ($certs === false) {
|
||||||
|
|
|
||||||
490
common/vendor/composer/installed.json
vendored
490
common/vendor/composer/installed.json
vendored
|
|
@ -61,31 +61,31 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "composer/ca-bundle",
|
"name": "composer/ca-bundle",
|
||||||
"version": "1.3.5",
|
"version": "1.5.0",
|
||||||
"version_normalized": "1.3.5.0",
|
"version_normalized": "1.5.0.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/composer/ca-bundle.git",
|
"url": "https://github.com/composer/ca-bundle.git",
|
||||||
"reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd"
|
"reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd",
|
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99",
|
||||||
"reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd",
|
"reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-openssl": "*",
|
"ext-openssl": "*",
|
||||||
"ext-pcre": "*",
|
"ext-pcre": "*",
|
||||||
"php": "^5.3.2 || ^7.0 || ^8.0"
|
"php": "^7.2 || ^8.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpstan/phpstan": "^0.12.55",
|
"phpstan/phpstan": "^1.10",
|
||||||
"psr/log": "^1.0",
|
"psr/log": "^1.0",
|
||||||
"symfony/phpunit-bridge": "^4.2 || ^5",
|
"symfony/phpunit-bridge": "^4.2 || ^5",
|
||||||
"symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
|
"symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
|
||||||
},
|
},
|
||||||
"time": "2023-01-11T08:27:00+00:00",
|
"time": "2024-03-15T14:00:32+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.3.5"
|
"source": "https://github.com/composer/ca-bundle/tree/1.5.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -276,17 +276,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "egulias/email-validator",
|
"name": "egulias/email-validator",
|
||||||
"version": "3.2.5",
|
"version": "3.2.6",
|
||||||
"version_normalized": "3.2.5.0",
|
"version_normalized": "3.2.6.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/egulias/EmailValidator.git",
|
"url": "https://github.com/egulias/EmailValidator.git",
|
||||||
"reference": "b531a2311709443320c786feb4519cfaf94af796"
|
"reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/egulias/EmailValidator/zipball/b531a2311709443320c786feb4519cfaf94af796",
|
"url": "https://api.github.com/repos/egulias/EmailValidator/zipball/e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7",
|
||||||
"reference": "b531a2311709443320c786feb4519cfaf94af796",
|
"reference": "e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -301,7 +301,7 @@
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
|
"ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
|
||||||
},
|
},
|
||||||
"time": "2023-01-02T17:26:14+00:00",
|
"time": "2023-06-01T07:04:22+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
|
|
@ -334,7 +334,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/egulias/EmailValidator/issues",
|
"issues": "https://github.com/egulias/EmailValidator/issues",
|
||||||
"source": "https://github.com/egulias/EmailValidator/tree/3.2.5"
|
"source": "https://github.com/egulias/EmailValidator/tree/3.2.6"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -346,29 +346,28 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "enshrined/svg-sanitize",
|
"name": "enshrined/svg-sanitize",
|
||||||
"version": "0.16.0",
|
"version": "0.18.0",
|
||||||
"version_normalized": "0.16.0.0",
|
"version_normalized": "0.18.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": "239e257605e2141265b429e40987b2ee51bba4b4"
|
"reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/239e257605e2141265b429e40987b2ee51bba4b4",
|
"url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/6a2c069dab3843ca4d887ff09c972fc7033888d0",
|
||||||
"reference": "239e257605e2141265b429e40987b2ee51bba4b4",
|
"reference": "6a2c069dab3843ca4d887ff09c972fc7033888d0",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-dom": "*",
|
"ext-dom": "*",
|
||||||
"ext-libxml": "*",
|
"ext-libxml": "*",
|
||||||
"ezyang/htmlpurifier": "^4.16",
|
|
||||||
"php": "^5.6 || ^7.0 || ^8.0"
|
"php": "^5.6 || ^7.0 || ^8.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "^5.7 || ^6.5 || ^8.5"
|
"phpunit/phpunit": "^5.7 || ^6.5 || ^8.5"
|
||||||
},
|
},
|
||||||
"time": "2023-03-20T10:51:12+00:00",
|
"time": "2024-02-22T17:51:05+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"installation-source": "dist",
|
"installation-source": "dist",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
|
|
@ -389,7 +388,7 @@
|
||||||
"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.16.0"
|
"source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.18.0"
|
||||||
},
|
},
|
||||||
"install-path": "../enshrined/svg-sanitize"
|
"install-path": "../enshrined/svg-sanitize"
|
||||||
},
|
},
|
||||||
|
|
@ -458,24 +457,151 @@
|
||||||
"install-path": "../ezyang/htmlpurifier"
|
"install-path": "../ezyang/htmlpurifier"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/guzzle",
|
"name": "firebase/php-jwt",
|
||||||
"version": "7.5.1",
|
"version": "v6.4.0",
|
||||||
"version_normalized": "7.5.1.0",
|
"version_normalized": "6.4.0.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/guzzle.git",
|
"url": "https://github.com/firebase/php-jwt.git",
|
||||||
"reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9"
|
"reference": "4dd1e007f22a927ac77da5a3fbb067b42d3bc224"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/b964ca597e86b752cd994f27293e9fa6b6a95ed9",
|
"url": "https://api.github.com/repos/firebase/php-jwt/zipball/4dd1e007f22a927ac77da5a3fbb067b42d3bc224",
|
||||||
"reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9",
|
"reference": "4dd1e007f22a927ac77da5a3fbb067b42d3bc224",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^7.1||^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"guzzlehttp/guzzle": "^6.5||^7.4",
|
||||||
|
"phpspec/prophecy-phpunit": "^1.1",
|
||||||
|
"phpunit/phpunit": "^7.5||^9.5",
|
||||||
|
"psr/cache": "^1.0||^2.0",
|
||||||
|
"psr/http-client": "^1.0",
|
||||||
|
"psr/http-factory": "^1.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-sodium": "Support EdDSA (Ed25519) signatures",
|
||||||
|
"paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
|
||||||
|
},
|
||||||
|
"time": "2023-02-09T21:01:23+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Firebase\\JWT\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Neuman Vong",
|
||||||
|
"email": "neuman+pear@twilio.com",
|
||||||
|
"role": "Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Anant Narayanan",
|
||||||
|
"email": "anant@php.net",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
|
||||||
|
"homepage": "https://github.com/firebase/php-jwt",
|
||||||
|
"keywords": [
|
||||||
|
"jwt",
|
||||||
|
"php"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/firebase/php-jwt/issues",
|
||||||
|
"source": "https://github.com/firebase/php-jwt/tree/v6.4.0"
|
||||||
|
},
|
||||||
|
"install-path": "../firebase/php-jwt"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "google/auth",
|
||||||
|
"version": "v1.26.0",
|
||||||
|
"version_normalized": "1.26.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/googleapis/google-auth-library-php.git",
|
||||||
|
"reference": "f1f0d0319e2e7750ebfaa523c78819792a9ed9f7"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/f1f0d0319e2e7750ebfaa523c78819792a9ed9f7",
|
||||||
|
"reference": "f1f0d0319e2e7750ebfaa523c78819792a9ed9f7",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"firebase/php-jwt": "^5.5||^6.0",
|
||||||
|
"guzzlehttp/guzzle": "^6.2.1|^7.0",
|
||||||
|
"guzzlehttp/psr7": "^1.7|^2.0",
|
||||||
|
"php": "^7.1||^8.0",
|
||||||
|
"psr/cache": "^1.0|^2.0|^3.0",
|
||||||
|
"psr/http-message": "^1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"guzzlehttp/promises": "0.1.1|^1.3",
|
||||||
|
"kelvinmo/simplejwt": "0.7.0",
|
||||||
|
"phpseclib/phpseclib": "^2.0.31||^3.0",
|
||||||
|
"phpspec/prophecy-phpunit": "^1.1||^2.0",
|
||||||
|
"phpunit/phpunit": "^7.5||^9.0.0",
|
||||||
|
"sebastian/comparator": ">=1.2.3",
|
||||||
|
"squizlabs/php_codesniffer": "^3.5"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2."
|
||||||
|
},
|
||||||
|
"time": "2023-04-05T15:11:57+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Google\\Auth\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"Apache-2.0"
|
||||||
|
],
|
||||||
|
"description": "Google Auth Library for PHP",
|
||||||
|
"homepage": "http://github.com/google/google-auth-library-php",
|
||||||
|
"keywords": [
|
||||||
|
"Authentication",
|
||||||
|
"google",
|
||||||
|
"oauth2"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"docs": "https://googleapis.github.io/google-auth-library-php/main/",
|
||||||
|
"issues": "https://github.com/googleapis/google-auth-library-php/issues",
|
||||||
|
"source": "https://github.com/googleapis/google-auth-library-php/tree/v1.26.0"
|
||||||
|
},
|
||||||
|
"install-path": "../google/auth"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "guzzlehttp/guzzle",
|
||||||
|
"version": "7.8.1",
|
||||||
|
"version_normalized": "7.8.1.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/guzzle/guzzle.git",
|
||||||
|
"reference": "41042bc7ab002487b876a0683fc8dce04ddce104"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104",
|
||||||
|
"reference": "41042bc7ab002487b876a0683fc8dce04ddce104",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"guzzlehttp/promises": "^1.5",
|
"guzzlehttp/promises": "^1.5.3 || ^2.0.1",
|
||||||
"guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
|
"guzzlehttp/psr7": "^1.9.1 || ^2.5.1",
|
||||||
"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"
|
||||||
|
|
@ -484,10 +610,11 @@
|
||||||
"psr/http-client-implementation": "1.0"
|
"psr/http-client-implementation": "1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"bamarni/composer-bin-plugin": "^1.8.1",
|
"bamarni/composer-bin-plugin": "^1.8.2",
|
||||||
"ext-curl": "*",
|
"ext-curl": "*",
|
||||||
"php-http/client-integration-tests": "^3.0",
|
"php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
|
||||||
"phpunit/phpunit": "^8.5.29 || ^9.5.23",
|
"php-http/message-factory": "^1.1",
|
||||||
|
"phpunit/phpunit": "^8.5.36 || ^9.6.15",
|
||||||
"psr/log": "^1.1 || ^2.0 || ^3.0"
|
"psr/log": "^1.1 || ^2.0 || ^3.0"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
|
|
@ -495,15 +622,12 @@
|
||||||
"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-04-17T16:30:08+00:00",
|
"time": "2023-12-03T20:35:24+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"bamarni-bin": {
|
"bamarni-bin": {
|
||||||
"bin-links": true,
|
"bin-links": true,
|
||||||
"forward-command": false
|
"forward-command": false
|
||||||
},
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "7.5-dev"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"installation-source": "dist",
|
"installation-source": "dist",
|
||||||
|
|
@ -570,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.5.1"
|
"source": "https://github.com/guzzle/guzzle/tree/7.8.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -590,37 +714,36 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/promises",
|
"name": "guzzlehttp/promises",
|
||||||
"version": "1.5.2",
|
"version": "2.0.2",
|
||||||
"version_normalized": "1.5.2.0",
|
"version_normalized": "2.0.2.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/promises.git",
|
"url": "https://github.com/guzzle/promises.git",
|
||||||
"reference": "b94b2807d85443f9719887892882d0329d1e2598"
|
"reference": "bbff78d96034045e58e13dedd6ad91b5d1253223"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598",
|
"url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223",
|
||||||
"reference": "b94b2807d85443f9719887892882d0329d1e2598",
|
"reference": "bbff78d96034045e58e13dedd6ad91b5d1253223",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.5"
|
"php": "^7.2.5 || ^8.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/phpunit-bridge": "^4.4 || ^5.1"
|
"bamarni/composer-bin-plugin": "^1.8.2",
|
||||||
|
"phpunit/phpunit": "^8.5.36 || ^9.6.15"
|
||||||
},
|
},
|
||||||
"time": "2022-08-28T14:55:35+00:00",
|
"time": "2023-12-03T20:19:20+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"bamarni-bin": {
|
||||||
"dev-master": "1.5-dev"
|
"bin-links": true,
|
||||||
|
"forward-command": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"installation-source": "dist",
|
"installation-source": "dist",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"files": [
|
|
||||||
"src/functions_include.php"
|
|
||||||
],
|
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"GuzzleHttp\\Promise\\": "src/"
|
"GuzzleHttp\\Promise\\": "src/"
|
||||||
}
|
}
|
||||||
|
|
@ -657,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/1.5.2"
|
"source": "https://github.com/guzzle/promises/tree/2.0.2"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -677,17 +800,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "guzzlehttp/psr7",
|
"name": "guzzlehttp/psr7",
|
||||||
"version": "2.5.0",
|
"version": "2.6.2",
|
||||||
"version_normalized": "2.5.0.0",
|
"version_normalized": "2.6.2.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/guzzle/psr7.git",
|
"url": "https://github.com/guzzle/psr7.git",
|
||||||
"reference": "b635f279edd83fc275f822a1188157ffea568ff6"
|
"reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6",
|
"url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221",
|
||||||
"reference": "b635f279edd83fc275f822a1188157ffea568ff6",
|
"reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -701,14 +824,14 @@
|
||||||
"psr/http-message-implementation": "1.0"
|
"psr/http-message-implementation": "1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"bamarni/composer-bin-plugin": "^1.8.1",
|
"bamarni/composer-bin-plugin": "^1.8.2",
|
||||||
"http-interop/http-factory-tests": "^0.9",
|
"http-interop/http-factory-tests": "^0.9",
|
||||||
"phpunit/phpunit": "^8.5.29 || ^9.5.23"
|
"phpunit/phpunit": "^8.5.36 || ^9.6.15"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
|
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
|
||||||
},
|
},
|
||||||
"time": "2023-04-17T16:11:26+00:00",
|
"time": "2023-12-03T20:05:35+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"bamarni-bin": {
|
"bamarni-bin": {
|
||||||
|
|
@ -776,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.5.0"
|
"source": "https://github.com/guzzle/psr7/tree/2.6.2"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -903,17 +1026,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "league/html-to-markdown",
|
"name": "league/html-to-markdown",
|
||||||
"version": "5.1.0",
|
"version": "5.1.1",
|
||||||
"version_normalized": "5.1.0.0",
|
"version_normalized": "5.1.1.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/thephpleague/html-to-markdown.git",
|
"url": "https://github.com/thephpleague/html-to-markdown.git",
|
||||||
"reference": "e0fc8cf07bdabbcd3765341ecb50c34c271d64e1"
|
"reference": "0b4066eede55c48f38bcee4fb8f0aa85654390fd"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/e0fc8cf07bdabbcd3765341ecb50c34c271d64e1",
|
"url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/0b4066eede55c48f38bcee4fb8f0aa85654390fd",
|
||||||
"reference": "e0fc8cf07bdabbcd3765341ecb50c34c271d64e1",
|
"reference": "0b4066eede55c48f38bcee4fb8f0aa85654390fd",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -923,13 +1046,13 @@
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"mikehaertl/php-shellcommand": "^1.1.0",
|
"mikehaertl/php-shellcommand": "^1.1.0",
|
||||||
"phpstan/phpstan": "^0.12.99",
|
"phpstan/phpstan": "^1.8.8",
|
||||||
"phpunit/phpunit": "^8.5 || ^9.2",
|
"phpunit/phpunit": "^8.5 || ^9.2",
|
||||||
"scrutinizer/ocular": "^1.6",
|
"scrutinizer/ocular": "^1.6",
|
||||||
"unleashedtech/php-coding-standard": "^2.7",
|
"unleashedtech/php-coding-standard": "^2.7 || ^3.0",
|
||||||
"vimeo/psalm": "^4.22"
|
"vimeo/psalm": "^4.22 || ^5.0"
|
||||||
},
|
},
|
||||||
"time": "2022-03-02T17:24:08+00:00",
|
"time": "2023-07-12T21:21:09+00:00",
|
||||||
"bin": [
|
"bin": [
|
||||||
"bin/html-to-markdown"
|
"bin/html-to-markdown"
|
||||||
],
|
],
|
||||||
|
|
@ -971,7 +1094,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/thephpleague/html-to-markdown/issues",
|
"issues": "https://github.com/thephpleague/html-to-markdown/issues",
|
||||||
"source": "https://github.com/thephpleague/html-to-markdown/tree/5.1.0"
|
"source": "https://github.com/thephpleague/html-to-markdown/tree/5.1.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -995,17 +1118,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "matthiasmullie/minify",
|
"name": "matthiasmullie/minify",
|
||||||
"version": "1.3.70",
|
"version": "1.3.73",
|
||||||
"version_normalized": "1.3.70.0",
|
"version_normalized": "1.3.73.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/matthiasmullie/minify.git",
|
"url": "https://github.com/matthiasmullie/minify.git",
|
||||||
"reference": "2807d9f9bece6877577ad44acb5c801bb3ae536b"
|
"reference": "cb7a9297b4ab070909cefade30ee95054d4ae87a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/matthiasmullie/minify/zipball/2807d9f9bece6877577ad44acb5c801bb3ae536b",
|
"url": "https://api.github.com/repos/matthiasmullie/minify/zipball/cb7a9297b4ab070909cefade30ee95054d4ae87a",
|
||||||
"reference": "2807d9f9bece6877577ad44acb5c801bb3ae536b",
|
"reference": "cb7a9297b4ab070909cefade30ee95054d4ae87a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1022,7 +1145,7 @@
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"psr/cache-implementation": "Cache implementation to use with Minify::cache"
|
"psr/cache-implementation": "Cache implementation to use with Minify::cache"
|
||||||
},
|
},
|
||||||
"time": "2022-12-09T12:56:44+00:00",
|
"time": "2024-03-15T10:27:10+00:00",
|
||||||
"bin": [
|
"bin": [
|
||||||
"bin/minifycss",
|
"bin/minifycss",
|
||||||
"bin/minifyjs"
|
"bin/minifyjs"
|
||||||
|
|
@ -1057,7 +1180,7 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/matthiasmullie/minify/issues",
|
"issues": "https://github.com/matthiasmullie/minify/issues",
|
||||||
"source": "https://github.com/matthiasmullie/minify/tree/1.3.70"
|
"source": "https://github.com/matthiasmullie/minify/tree/1.3.73"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -1229,25 +1352,77 @@
|
||||||
"install-path": "../michelf/php-smartypants"
|
"install-path": "../michelf/php-smartypants"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/http-client",
|
"name": "psr/cache",
|
||||||
"version": "1.0.2",
|
"version": "1.0.1",
|
||||||
"version_normalized": "1.0.2.0",
|
"version_normalized": "1.0.1.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/php-fig/http-client.git",
|
"url": "https://github.com/php-fig/cache.git",
|
||||||
"reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31"
|
"reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31",
|
"url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
|
||||||
"reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31",
|
"reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"time": "2016-08-06T20:24:11+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Cache\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "http://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common interface for caching libraries",
|
||||||
|
"keywords": [
|
||||||
|
"cache",
|
||||||
|
"psr",
|
||||||
|
"psr-6"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/php-fig/cache/tree/master"
|
||||||
|
},
|
||||||
|
"install-path": "../psr/cache"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/http-client",
|
||||||
|
"version": "1.0.3",
|
||||||
|
"version_normalized": "1.0.3.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/http-client.git",
|
||||||
|
"reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
|
||||||
|
"reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.0 || ^8.0",
|
"php": "^7.0 || ^8.0",
|
||||||
"psr/http-message": "^1.0 || ^2.0"
|
"psr/http-message": "^1.0 || ^2.0"
|
||||||
},
|
},
|
||||||
"time": "2023-04-10T20:12:12+00:00",
|
"time": "2023-09-23T14:17:50+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
|
|
@ -1279,7 +1454,7 @@
|
||||||
"psr-18"
|
"psr-18"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/php-fig/http-client/tree/1.0.2"
|
"source": "https://github.com/php-fig/http-client"
|
||||||
},
|
},
|
||||||
"install-path": "../psr/http-client"
|
"install-path": "../psr/http-client"
|
||||||
},
|
},
|
||||||
|
|
@ -1343,27 +1518,27 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "psr/http-message",
|
"name": "psr/http-message",
|
||||||
"version": "2.0",
|
"version": "1.1",
|
||||||
"version_normalized": "2.0.0.0",
|
"version_normalized": "1.1.0.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/php-fig/http-message.git",
|
"url": "https://github.com/php-fig/http-message.git",
|
||||||
"reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
|
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
|
"url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
|
||||||
"reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
|
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.2 || ^8.0"
|
"php": "^7.2 || ^8.0"
|
||||||
},
|
},
|
||||||
"time": "2023-04-04T09:54:51+00:00",
|
"time": "2023-04-04T09:50:52+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "2.0.x-dev"
|
"dev-master": "1.1.x-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"installation-source": "dist",
|
"installation-source": "dist",
|
||||||
|
|
@ -1379,7 +1554,7 @@
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "PHP-FIG",
|
"name": "PHP-FIG",
|
||||||
"homepage": "https://www.php-fig.org/"
|
"homepage": "http://www.php-fig.org/"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"description": "Common interface for HTTP messages",
|
"description": "Common interface for HTTP messages",
|
||||||
|
|
@ -1393,7 +1568,7 @@
|
||||||
"response"
|
"response"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/php-fig/http-message/tree/2.0"
|
"source": "https://github.com/php-fig/http-message/tree/1.1"
|
||||||
},
|
},
|
||||||
"install-path": "../psr/http-message"
|
"install-path": "../psr/http-message"
|
||||||
},
|
},
|
||||||
|
|
@ -1509,17 +1684,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "scssphp/scssphp",
|
"name": "scssphp/scssphp",
|
||||||
"version": "v1.11.0",
|
"version": "v1.12.1",
|
||||||
"version_normalized": "1.11.0.0",
|
"version_normalized": "1.12.1.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/scssphp/scssphp.git",
|
"url": "https://github.com/scssphp/scssphp.git",
|
||||||
"reference": "33749d12c2569bb24071f94e9af828662dabb068"
|
"reference": "394ed1e960138710a60d035c1a85d43d0bf0faeb"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/scssphp/scssphp/zipball/33749d12c2569bb24071f94e9af828662dabb068",
|
"url": "https://api.github.com/repos/scssphp/scssphp/zipball/394ed1e960138710a60d035c1a85d43d0bf0faeb",
|
||||||
"reference": "33749d12c2569bb24071f94e9af828662dabb068",
|
"reference": "394ed1e960138710a60d035c1a85d43d0bf0faeb",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1536,13 +1711,13 @@
|
||||||
"thoughtbot/bourbon": "^7.0",
|
"thoughtbot/bourbon": "^7.0",
|
||||||
"twbs/bootstrap": "~5.0",
|
"twbs/bootstrap": "~5.0",
|
||||||
"twbs/bootstrap4": "4.6.1",
|
"twbs/bootstrap4": "4.6.1",
|
||||||
"zurb/foundation": "~6.5"
|
"zurb/foundation": "~6.7.0"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"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": "2022-09-02T21:24:55+00:00",
|
"time": "2024-01-13T12:36:40+00:00",
|
||||||
"bin": [
|
"bin": [
|
||||||
"bin/pscss"
|
"bin/pscss"
|
||||||
],
|
],
|
||||||
|
|
@ -1586,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.11.0"
|
"source": "https://github.com/scssphp/scssphp/tree/v1.12.1"
|
||||||
},
|
},
|
||||||
"install-path": "../scssphp/scssphp"
|
"install-path": "../scssphp/scssphp"
|
||||||
},
|
},
|
||||||
|
|
@ -1671,23 +1846,23 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/deprecation-contracts",
|
"name": "symfony/deprecation-contracts",
|
||||||
"version": "v2.5.2",
|
"version": "v2.5.3",
|
||||||
"version_normalized": "2.5.2.0",
|
"version_normalized": "2.5.3.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/deprecation-contracts.git",
|
"url": "https://github.com/symfony/deprecation-contracts.git",
|
||||||
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
|
"reference": "80d075412b557d41002320b96a096ca65aa2c98d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
|
"url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d",
|
||||||
"reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
|
"reference": "80d075412b557d41002320b96a096ca65aa2c98d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1"
|
"php": ">=7.1"
|
||||||
},
|
},
|
||||||
"time": "2022-01-02T09:53:40+00:00",
|
"time": "2023-01-24T14:02:46+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
|
|
@ -1721,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.2"
|
"source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.3"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -1741,17 +1916,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-iconv",
|
"name": "symfony/polyfill-iconv",
|
||||||
"version": "v1.27.0",
|
"version": "v1.29.0",
|
||||||
"version_normalized": "1.27.0.0",
|
"version_normalized": "1.29.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": "927013f3aac555983a5059aada98e1907d842695"
|
"reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/927013f3aac555983a5059aada98e1907d842695",
|
"url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f",
|
||||||
"reference": "927013f3aac555983a5059aada98e1907d842695",
|
"reference": "cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1763,12 +1938,9 @@
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-iconv": "For best performance"
|
"ext-iconv": "For best performance"
|
||||||
},
|
},
|
||||||
"time": "2022-11-03T14:55:06+00:00",
|
"time": "2024-01-29T20:11:03+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
|
||||||
"dev-main": "1.27-dev"
|
|
||||||
},
|
|
||||||
"thanks": {
|
"thanks": {
|
||||||
"name": "symfony/polyfill",
|
"name": "symfony/polyfill",
|
||||||
"url": "https://github.com/symfony/polyfill"
|
"url": "https://github.com/symfony/polyfill"
|
||||||
|
|
@ -1807,7 +1979,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-iconv/tree/v1.27.0"
|
"source": "https://github.com/symfony/polyfill-iconv/tree/v1.29.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -1827,17 +1999,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-idn",
|
"name": "symfony/polyfill-intl-idn",
|
||||||
"version": "v1.27.0",
|
"version": "v1.29.0",
|
||||||
"version_normalized": "1.27.0.0",
|
"version_normalized": "1.29.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": "639084e360537a19f9ee352433b84ce831f3d2da"
|
"reference": "a287ed7475f85bf6f61890146edbc932c0fff919"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da",
|
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919",
|
||||||
"reference": "639084e360537a19f9ee352433b84ce831f3d2da",
|
"reference": "a287ed7475f85bf6f61890146edbc932c0fff919",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1848,12 +2020,9 @@
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-intl": "For best performance"
|
"ext-intl": "For best performance"
|
||||||
},
|
},
|
||||||
"time": "2022-11-03T14:55:06+00:00",
|
"time": "2024-01-29T20:11:03+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
|
||||||
"dev-main": "1.27-dev"
|
|
||||||
},
|
|
||||||
"thanks": {
|
"thanks": {
|
||||||
"name": "symfony/polyfill",
|
"name": "symfony/polyfill",
|
||||||
"url": "https://github.com/symfony/polyfill"
|
"url": "https://github.com/symfony/polyfill"
|
||||||
|
|
@ -1897,7 +2066,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0"
|
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -1917,17 +2086,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-intl-normalizer",
|
"name": "symfony/polyfill-intl-normalizer",
|
||||||
"version": "v1.27.0",
|
"version": "v1.29.0",
|
||||||
"version_normalized": "1.27.0.0",
|
"version_normalized": "1.29.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": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
|
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
|
"url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d",
|
||||||
"reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
|
"reference": "bc45c394692b948b4d383a08d7753968bed9a83d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -1936,12 +2105,9 @@
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-intl": "For best performance"
|
"ext-intl": "For best performance"
|
||||||
},
|
},
|
||||||
"time": "2022-11-03T14:55:06+00:00",
|
"time": "2024-01-29T20:11:03+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
|
||||||
"dev-main": "1.27-dev"
|
|
||||||
},
|
|
||||||
"thanks": {
|
"thanks": {
|
||||||
"name": "symfony/polyfill",
|
"name": "symfony/polyfill",
|
||||||
"url": "https://github.com/symfony/polyfill"
|
"url": "https://github.com/symfony/polyfill"
|
||||||
|
|
@ -1984,7 +2150,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
|
"source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -2004,17 +2170,17 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-mbstring",
|
"name": "symfony/polyfill-mbstring",
|
||||||
"version": "v1.27.0",
|
"version": "v1.29.0",
|
||||||
"version_normalized": "1.27.0.0",
|
"version_normalized": "1.29.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": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
|
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
|
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
|
||||||
"reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
|
"reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
|
@ -2026,12 +2192,9 @@
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-mbstring": "For best performance"
|
"ext-mbstring": "For best performance"
|
||||||
},
|
},
|
||||||
"time": "2022-11-03T14:55:06+00:00",
|
"time": "2024-01-29T20:11:03+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
|
||||||
"dev-main": "1.27-dev"
|
|
||||||
},
|
|
||||||
"thanks": {
|
"thanks": {
|
||||||
"name": "symfony/polyfill",
|
"name": "symfony/polyfill",
|
||||||
"url": "https://github.com/symfony/polyfill"
|
"url": "https://github.com/symfony/polyfill"
|
||||||
|
|
@ -2070,7 +2233,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
|
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
@ -2090,28 +2253,25 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/polyfill-php72",
|
"name": "symfony/polyfill-php72",
|
||||||
"version": "v1.27.0",
|
"version": "v1.29.0",
|
||||||
"version_normalized": "1.27.0.0",
|
"version_normalized": "1.29.0.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/polyfill-php72.git",
|
"url": "https://github.com/symfony/polyfill-php72.git",
|
||||||
"reference": "869329b1e9894268a8a61dabb69153029b7a8c97"
|
"reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97",
|
"url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25",
|
||||||
"reference": "869329b1e9894268a8a61dabb69153029b7a8c97",
|
"reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=7.1"
|
"php": ">=7.1"
|
||||||
},
|
},
|
||||||
"time": "2022-11-03T14:55:06+00:00",
|
"time": "2024-01-29T20:11:03+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
|
||||||
"dev-main": "1.27-dev"
|
|
||||||
},
|
|
||||||
"thanks": {
|
"thanks": {
|
||||||
"name": "symfony/polyfill",
|
"name": "symfony/polyfill",
|
||||||
"url": "https://github.com/symfony/polyfill"
|
"url": "https://github.com/symfony/polyfill"
|
||||||
|
|
@ -2149,7 +2309,7 @@
|
||||||
"shim"
|
"shim"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0"
|
"source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
|
|
|
||||||
133
common/vendor/composer/installed.php
vendored
133
common/vendor/composer/installed.php
vendored
|
|
@ -3,7 +3,7 @@
|
||||||
'name' => 'rhymix/rhymix',
|
'name' => 'rhymix/rhymix',
|
||||||
'pretty_version' => 'dev-develop',
|
'pretty_version' => 'dev-develop',
|
||||||
'version' => 'dev-develop',
|
'version' => 'dev-develop',
|
||||||
'reference' => 'ee440eff536be5e932d0d9d3e5c0ced24d9294e7',
|
'reference' => 'd8610407663539b1d52d17bc0b8dc88f739db063',
|
||||||
'type' => 'project',
|
'type' => 'project',
|
||||||
'install_path' => __DIR__ . '/../../',
|
'install_path' => __DIR__ . '/../../',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
@ -20,9 +20,9 @@
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'composer/ca-bundle' => array(
|
'composer/ca-bundle' => array(
|
||||||
'pretty_version' => '1.3.5',
|
'pretty_version' => '1.5.0',
|
||||||
'version' => '1.3.5.0',
|
'version' => '1.5.0.0',
|
||||||
'reference' => '74780ccf8c19d6acb8d65c5f39cd72110e132bbd',
|
'reference' => '0c5ccfcfea312b5c5a190a21ac5cef93f74baf99',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/./ca-bundle',
|
'install_path' => __DIR__ . '/./ca-bundle',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
@ -47,18 +47,18 @@
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'egulias/email-validator' => array(
|
'egulias/email-validator' => array(
|
||||||
'pretty_version' => '3.2.5',
|
'pretty_version' => '3.2.6',
|
||||||
'version' => '3.2.5.0',
|
'version' => '3.2.6.0',
|
||||||
'reference' => 'b531a2311709443320c786feb4519cfaf94af796',
|
'reference' => 'e5997fa97e8790cdae03a9cbd5e78e45e3c7bda7',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../egulias/email-validator',
|
'install_path' => __DIR__ . '/../egulias/email-validator',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'enshrined/svg-sanitize' => array(
|
'enshrined/svg-sanitize' => array(
|
||||||
'pretty_version' => '0.16.0',
|
'pretty_version' => '0.18.0',
|
||||||
'version' => '0.16.0.0',
|
'version' => '0.18.0.0',
|
||||||
'reference' => '239e257605e2141265b429e40987b2ee51bba4b4',
|
'reference' => '6a2c069dab3843ca4d887ff09c972fc7033888d0',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../enshrined/svg-sanitize',
|
'install_path' => __DIR__ . '/../enshrined/svg-sanitize',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
@ -73,28 +73,46 @@
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
|
'firebase/php-jwt' => array(
|
||||||
|
'pretty_version' => 'v6.4.0',
|
||||||
|
'version' => '6.4.0.0',
|
||||||
|
'reference' => '4dd1e007f22a927ac77da5a3fbb067b42d3bc224',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../firebase/php-jwt',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
'google/auth' => array(
|
||||||
|
'pretty_version' => 'v1.26.0',
|
||||||
|
'version' => '1.26.0.0',
|
||||||
|
'reference' => 'f1f0d0319e2e7750ebfaa523c78819792a9ed9f7',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../google/auth',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
'guzzlehttp/guzzle' => array(
|
'guzzlehttp/guzzle' => array(
|
||||||
'pretty_version' => '7.5.1',
|
'pretty_version' => '7.8.1',
|
||||||
'version' => '7.5.1.0',
|
'version' => '7.8.1.0',
|
||||||
'reference' => 'b964ca597e86b752cd994f27293e9fa6b6a95ed9',
|
'reference' => '41042bc7ab002487b876a0683fc8dce04ddce104',
|
||||||
'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' => '1.5.2',
|
'pretty_version' => '2.0.2',
|
||||||
'version' => '1.5.2.0',
|
'version' => '2.0.2.0',
|
||||||
'reference' => 'b94b2807d85443f9719887892882d0329d1e2598',
|
'reference' => 'bbff78d96034045e58e13dedd6ad91b5d1253223',
|
||||||
'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.5.0',
|
'pretty_version' => '2.6.2',
|
||||||
'version' => '2.5.0.0',
|
'version' => '2.6.2.0',
|
||||||
'reference' => 'b635f279edd83fc275f822a1188157ffea568ff6',
|
'reference' => '45b30f99ac27b5ca93cb4831afe16285f57b8221',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../guzzlehttp/psr7',
|
'install_path' => __DIR__ . '/../guzzlehttp/psr7',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
@ -127,18 +145,18 @@
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'league/html-to-markdown' => array(
|
'league/html-to-markdown' => array(
|
||||||
'pretty_version' => '5.1.0',
|
'pretty_version' => '5.1.1',
|
||||||
'version' => '5.1.0.0',
|
'version' => '5.1.1.0',
|
||||||
'reference' => 'e0fc8cf07bdabbcd3765341ecb50c34c271d64e1',
|
'reference' => '0b4066eede55c48f38bcee4fb8f0aa85654390fd',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../league/html-to-markdown',
|
'install_path' => __DIR__ . '/../league/html-to-markdown',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'matthiasmullie/minify' => array(
|
'matthiasmullie/minify' => array(
|
||||||
'pretty_version' => '1.3.70',
|
'pretty_version' => '1.3.73',
|
||||||
'version' => '1.3.70.0',
|
'version' => '1.3.73.0',
|
||||||
'reference' => '2807d9f9bece6877577ad44acb5c801bb3ae536b',
|
'reference' => 'cb7a9297b4ab070909cefade30ee95054d4ae87a',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../matthiasmullie/minify',
|
'install_path' => __DIR__ . '/../matthiasmullie/minify',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
@ -171,10 +189,19 @@
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
|
'psr/cache' => array(
|
||||||
|
'pretty_version' => '1.0.1',
|
||||||
|
'version' => '1.0.1.0',
|
||||||
|
'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../psr/cache',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
'psr/http-client' => array(
|
'psr/http-client' => array(
|
||||||
'pretty_version' => '1.0.2',
|
'pretty_version' => '1.0.3',
|
||||||
'version' => '1.0.2.0',
|
'version' => '1.0.3.0',
|
||||||
'reference' => '0955afe48220520692d2d09f7ab7e0f93ffd6a31',
|
'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../psr/http-client',
|
'install_path' => __DIR__ . '/../psr/http-client',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
@ -202,9 +229,9 @@
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
'psr/http-message' => array(
|
'psr/http-message' => array(
|
||||||
'pretty_version' => '2.0',
|
'pretty_version' => '1.1',
|
||||||
'version' => '2.0.0.0',
|
'version' => '1.1.0.0',
|
||||||
'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71',
|
'reference' => 'cb6ce4845ce34a8ad9e68117c10ee90a29919eba',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../psr/http-message',
|
'install_path' => __DIR__ . '/../psr/http-message',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
@ -228,7 +255,7 @@
|
||||||
'rhymix/rhymix' => array(
|
'rhymix/rhymix' => array(
|
||||||
'pretty_version' => 'dev-develop',
|
'pretty_version' => 'dev-develop',
|
||||||
'version' => 'dev-develop',
|
'version' => 'dev-develop',
|
||||||
'reference' => 'ee440eff536be5e932d0d9d3e5c0ced24d9294e7',
|
'reference' => 'd8610407663539b1d52d17bc0b8dc88f739db063',
|
||||||
'type' => 'project',
|
'type' => 'project',
|
||||||
'install_path' => __DIR__ . '/../../',
|
'install_path' => __DIR__ . '/../../',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
@ -244,9 +271,9 @@
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'scssphp/scssphp' => array(
|
'scssphp/scssphp' => array(
|
||||||
'pretty_version' => 'v1.11.0',
|
'pretty_version' => 'v1.12.1',
|
||||||
'version' => '1.11.0.0',
|
'version' => '1.12.1.0',
|
||||||
'reference' => '33749d12c2569bb24071f94e9af828662dabb068',
|
'reference' => '394ed1e960138710a60d035c1a85d43d0bf0faeb',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../scssphp/scssphp',
|
'install_path' => __DIR__ . '/../scssphp/scssphp',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
@ -262,54 +289,54 @@
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
'symfony/deprecation-contracts' => array(
|
'symfony/deprecation-contracts' => array(
|
||||||
'pretty_version' => 'v2.5.2',
|
'pretty_version' => 'v2.5.3',
|
||||||
'version' => '2.5.2.0',
|
'version' => '2.5.3.0',
|
||||||
'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66',
|
'reference' => '80d075412b557d41002320b96a096ca65aa2c98d',
|
||||||
'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.27.0',
|
'pretty_version' => 'v1.29.0',
|
||||||
'version' => '1.27.0.0',
|
'version' => '1.29.0.0',
|
||||||
'reference' => '927013f3aac555983a5059aada98e1907d842695',
|
'reference' => 'cd4226d140ecd3d0f13d32ed0a4a095ffe871d2f',
|
||||||
'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.27.0',
|
'pretty_version' => 'v1.29.0',
|
||||||
'version' => '1.27.0.0',
|
'version' => '1.29.0.0',
|
||||||
'reference' => '639084e360537a19f9ee352433b84ce831f3d2da',
|
'reference' => 'a287ed7475f85bf6f61890146edbc932c0fff919',
|
||||||
'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.27.0',
|
'pretty_version' => 'v1.29.0',
|
||||||
'version' => '1.27.0.0',
|
'version' => '1.29.0.0',
|
||||||
'reference' => '19bd1e4fcd5b91116f14d8533c57831ed00571b6',
|
'reference' => 'bc45c394692b948b4d383a08d7753968bed9a83d',
|
||||||
'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.27.0',
|
'pretty_version' => 'v1.29.0',
|
||||||
'version' => '1.27.0.0',
|
'version' => '1.29.0.0',
|
||||||
'reference' => '8ad114f6b39e2c98a8b0e3bd907732c207c2b534',
|
'reference' => '9773676c8a1bb1f8d4340a62efe641cf76eda7ec',
|
||||||
'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(
|
'symfony/polyfill-php72' => array(
|
||||||
'pretty_version' => 'v1.27.0',
|
'pretty_version' => 'v1.29.0',
|
||||||
'version' => '1.27.0.0',
|
'version' => '1.29.0.0',
|
||||||
'reference' => '869329b1e9894268a8a61dabb69153029b7a8c97',
|
'reference' => '861391a8da9a04cbad2d232ddd9e4893220d6e25',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../symfony/polyfill-php72',
|
'install_path' => __DIR__ . '/../symfony/polyfill-php72',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
|
||||||
|
|
@ -213,13 +213,11 @@ class EmailLexer extends AbstractLexer
|
||||||
public function moveNext() : bool
|
public function moveNext() : bool
|
||||||
{
|
{
|
||||||
if ($this->hasToRecord && $this->previous === self::$nullToken) {
|
if ($this->hasToRecord && $this->previous === self::$nullToken) {
|
||||||
$this->accumulator .= $this->token['value'];
|
$this->accumulator .= ((array) $this->token)['value'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->previous = $this->token instanceof Token
|
$this->previous = (array) $this->token;
|
||||||
? ['value' => $this->token->value, 'type' => $this->token->type, 'position' => $this->token->position]
|
|
||||||
: $this->token;
|
|
||||||
|
|
||||||
if($this->lookahead === null) {
|
if($this->lookahead === null) {
|
||||||
$this->lookahead = self::$nullToken;
|
$this->lookahead = self::$nullToken;
|
||||||
}
|
}
|
||||||
|
|
@ -227,7 +225,7 @@ class EmailLexer extends AbstractLexer
|
||||||
$hasNext = parent::moveNext();
|
$hasNext = parent::moveNext();
|
||||||
|
|
||||||
if ($this->hasToRecord) {
|
if ($this->hasToRecord) {
|
||||||
$this->accumulator .= $this->token['value'];
|
$this->accumulator .= ((array) $this->token)['value'];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $hasNext;
|
return $hasNext;
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ abstract class Parser
|
||||||
|
|
||||||
public function __construct(EmailLexer $lexer)
|
public function __construct(EmailLexer $lexer)
|
||||||
{
|
{
|
||||||
$this->lexer = $lexer;
|
$this->lexer = $lexer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function parse(string $str) : Result
|
public function parse(string $str) : Result
|
||||||
|
|
@ -51,7 +51,7 @@ abstract class Parser
|
||||||
return $localPartResult;
|
return $localPartResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
$domainPartResult = $this->parseRightFromAt();
|
$domainPartResult = $this->parseRightFromAt();
|
||||||
|
|
||||||
if ($domainPartResult->isInvalid()) {
|
if ($domainPartResult->isInvalid()) {
|
||||||
return $domainPartResult;
|
return $domainPartResult;
|
||||||
|
|
@ -73,6 +73,6 @@ abstract class Parser
|
||||||
$this->lexer->moveNext();
|
$this->lexer->moveNext();
|
||||||
$this->lexer->moveNext();
|
$this->lexer->moveNext();
|
||||||
|
|
||||||
return $this->lexer->token['type'] !== EmailLexer::S_AT;
|
return ((array) $this->lexer->token)['type'] !== EmailLexer::S_AT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,15 +31,15 @@ class Comment extends PartParser
|
||||||
|
|
||||||
public function parse() : Result
|
public function parse() : Result
|
||||||
{
|
{
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENPARENTHESIS) {
|
||||||
$this->openedParenthesis++;
|
$this->openedParenthesis++;
|
||||||
if($this->noClosingParenthesis()) {
|
if($this->noClosingParenthesis()) {
|
||||||
return new InvalidEmail(new UnclosedComment(), $this->lexer->token['value']);
|
return new InvalidEmail(new UnclosedComment(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_CLOSEPARENTHESIS) {
|
||||||
return new InvalidEmail(new UnOpenedComment(), $this->lexer->token['value']);
|
return new InvalidEmail(new UnOpenedComment(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->warnings[WarningComment::CODE] = new WarningComment();
|
$this->warnings[WarningComment::CODE] = new WarningComment();
|
||||||
|
|
@ -58,10 +58,10 @@ class Comment extends PartParser
|
||||||
}
|
}
|
||||||
|
|
||||||
if($this->openedParenthesis >= 1) {
|
if($this->openedParenthesis >= 1) {
|
||||||
return new InvalidEmail(new UnclosedComment(), $this->lexer->token['value']);
|
return new InvalidEmail(new UnclosedComment(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
if ($this->openedParenthesis < 0) {
|
if ($this->openedParenthesis < 0) {
|
||||||
return new InvalidEmail(new UnOpenedComment(), $this->lexer->token['value']);
|
return new InvalidEmail(new UnOpenedComment(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$finalValidations = $this->commentStrategy->endOfLoopValidations($this->lexer);
|
$finalValidations = $this->commentStrategy->endOfLoopValidations($this->lexer);
|
||||||
|
|
@ -78,7 +78,7 @@ class Comment extends PartParser
|
||||||
private function warnEscaping() : bool
|
private function warnEscaping() : bool
|
||||||
{
|
{
|
||||||
//Backslash found
|
//Backslash found
|
||||||
if ($this->lexer->token['type'] !== EmailLexer::S_BACKSLASH) {
|
if (((array) $this->lexer->token)['type'] !== EmailLexer::S_BACKSLASH) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -87,12 +87,12 @@ class Comment extends PartParser
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->warnings[QuotedPart::CODE] =
|
$this->warnings[QuotedPart::CODE] =
|
||||||
new QuotedPart($this->lexer->getPrevious()['type'], $this->lexer->token['type']);
|
new QuotedPart($this->lexer->getPrevious()['type'], ((array) $this->lexer->token)['type']);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function noClosingParenthesis() : bool
|
private function noClosingParenthesis() : bool
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$this->lexer->find(EmailLexer::S_CLOSEPARENTHESIS);
|
$this->lexer->find(EmailLexer::S_CLOSEPARENTHESIS);
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ class DomainComment implements CommentStrategy
|
||||||
{
|
{
|
||||||
//test for end of string
|
//test for end of string
|
||||||
if (!$lexer->isNextToken(EmailLexer::S_DOT)) {
|
if (!$lexer->isNextToken(EmailLexer::S_DOT)) {
|
||||||
return new InvalidEmail(new ExpectingATEXT('DOT not found near CLOSEPARENTHESIS'), $lexer->token['value']);
|
return new InvalidEmail(new ExpectingATEXT('DOT not found near CLOSEPARENTHESIS'), ((array) $lexer->token)['value']);
|
||||||
}
|
}
|
||||||
//add warning
|
//add warning
|
||||||
//Address is valid within the message but cannot be used unmodified for the envelope
|
//Address is valid within the message but cannot be used unmodified for the envelope
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ class LocalComment implements CommentStrategy
|
||||||
public function endOfLoopValidations(EmailLexer $lexer) : Result
|
public function endOfLoopValidations(EmailLexer $lexer) : Result
|
||||||
{
|
{
|
||||||
if (!$lexer->isNextToken(EmailLexer::S_AT)) {
|
if (!$lexer->isNextToken(EmailLexer::S_AT)) {
|
||||||
return new InvalidEmail(new ExpectingATEXT('ATEX is not expected after closing comments'), $lexer->token['value']);
|
return new InvalidEmail(new ExpectingATEXT('ATEX is not expected after closing comments'), ((array) $lexer->token)['value']);
|
||||||
}
|
}
|
||||||
$this->warnings[CFWSNearAt::CODE] = new CFWSNearAt();
|
$this->warnings[CFWSNearAt::CODE] = new CFWSNearAt();
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
|
|
|
||||||
|
|
@ -39,14 +39,14 @@ class DomainLiteral extends PartParser
|
||||||
$addressLiteral = '';
|
$addressLiteral = '';
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if ($this->lexer->token['type'] === EmailLexer::C_NUL) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::C_NUL) {
|
||||||
return new InvalidEmail(new ExpectingDTEXT(), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingDTEXT(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->addObsoleteWarnings();
|
$this->addObsoleteWarnings();
|
||||||
|
|
||||||
if ($this->lexer->isNextTokenAny(array(EmailLexer::S_OPENBRACKET, EmailLexer::S_OPENBRACKET))) {
|
if ($this->lexer->isNextTokenAny(array(EmailLexer::S_OPENBRACKET, EmailLexer::S_OPENBRACKET))) {
|
||||||
return new InvalidEmail(new ExpectingDTEXT(), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingDTEXT(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->isNextTokenAny(
|
if ($this->lexer->isNextTokenAny(
|
||||||
|
|
@ -57,21 +57,21 @@ class DomainLiteral extends PartParser
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->isNextToken(EmailLexer::S_CR)) {
|
if ($this->lexer->isNextToken(EmailLexer::S_CR)) {
|
||||||
return new InvalidEmail(new CRNoLF(), $this->lexer->token['value']);
|
return new InvalidEmail(new CRNoLF(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_BACKSLASH) {
|
||||||
return new InvalidEmail(new UnusualElements($this->lexer->token['value']), $this->lexer->token['value']);
|
return new InvalidEmail(new UnusualElements(((array) $this->lexer->token)['value']), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_IPV6TAG) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_IPV6TAG) {
|
||||||
$IPv6TAG = true;
|
$IPv6TAG = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_CLOSEBRACKET) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_CLOSEBRACKET) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$addressLiteral .= $this->lexer->token['value'];
|
$addressLiteral .= ((array) $this->lexer->token)['value'];
|
||||||
|
|
||||||
} while ($this->lexer->moveNext());
|
} while ($this->lexer->moveNext());
|
||||||
|
|
||||||
|
|
@ -144,7 +144,7 @@ class DomainLiteral extends PartParser
|
||||||
$this->warnings[IPV6Deprecated::CODE] = new IPV6Deprecated();
|
$this->warnings[IPV6Deprecated::CODE] = new IPV6Deprecated();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function convertIPv4ToIPv6(string $addressLiteralIPv4) : string
|
public function convertIPv4ToIPv6(string $addressLiteralIPv4) : string
|
||||||
{
|
{
|
||||||
$matchesIP = [];
|
$matchesIP = [];
|
||||||
|
|
@ -189,7 +189,7 @@ class DomainLiteral extends PartParser
|
||||||
|
|
||||||
private function addObsoleteWarnings() : void
|
private function addObsoleteWarnings() : void
|
||||||
{
|
{
|
||||||
if(in_array($this->lexer->token['type'], self::OBSOLETE_WARNINGS)) {
|
if(in_array(((array) $this->lexer->token)['type'], self::OBSOLETE_WARNINGS)) {
|
||||||
$this->warnings[ObsoleteDTEXT::CODE] = new ObsoleteDTEXT();
|
$this->warnings[ObsoleteDTEXT::CODE] = new ObsoleteDTEXT();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,8 +50,8 @@ class DomainPart extends PartParser
|
||||||
return $domainChecks;
|
return $domainChecks;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_AT) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_AT) {
|
||||||
return new InvalidEmail(new ConsecutiveAt(), $this->lexer->token['value']);
|
return new InvalidEmail(new ConsecutiveAt(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = $this->doParseDomainPart();
|
$result = $this->doParseDomainPart();
|
||||||
|
|
@ -69,7 +69,7 @@ class DomainPart extends PartParser
|
||||||
|
|
||||||
$length = strlen($this->domainPart);
|
$length = strlen($this->domainPart);
|
||||||
if ($length > self::DOMAIN_MAX_LENGTH) {
|
if ($length > self::DOMAIN_MAX_LENGTH) {
|
||||||
return new InvalidEmail(new DomainTooLong(), $this->lexer->token['value']);
|
return new InvalidEmail(new DomainTooLong(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
|
|
@ -79,13 +79,13 @@ class DomainPart extends PartParser
|
||||||
{
|
{
|
||||||
$prev = $this->lexer->getPrevious();
|
$prev = $this->lexer->getPrevious();
|
||||||
if ($prev['type'] === EmailLexer::S_DOT) {
|
if ($prev['type'] === EmailLexer::S_DOT) {
|
||||||
return new InvalidEmail(new DotAtEnd(), $this->lexer->token['value']);
|
return new InvalidEmail(new DotAtEnd(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
if ($prev['type'] === EmailLexer::S_HYPHEN) {
|
if ($prev['type'] === EmailLexer::S_HYPHEN) {
|
||||||
return new InvalidEmail(new DomainHyphened('Hypen found at the end of the domain'), $prev['value']);
|
return new InvalidEmail(new DomainHyphened('Hypen found at the end of the domain'), $prev['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_SP) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_SP) {
|
||||||
return new InvalidEmail(new CRLFAtTheEnd(), $prev['value']);
|
return new InvalidEmail(new CRLFAtTheEnd(), $prev['value']);
|
||||||
}
|
}
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
|
|
@ -98,13 +98,13 @@ class DomainPart extends PartParser
|
||||||
if ($invalidTokens->isInvalid()) {
|
if ($invalidTokens->isInvalid()) {
|
||||||
return $invalidTokens;
|
return $invalidTokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
$missingDomain = $this->checkEmptyDomain();
|
$missingDomain = $this->checkEmptyDomain();
|
||||||
if ($missingDomain->isInvalid()) {
|
if ($missingDomain->isInvalid()) {
|
||||||
return $missingDomain;
|
return $missingDomain;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENPARENTHESIS) {
|
||||||
$this->warnings[DeprecatedComment::CODE] = new DeprecatedComment();
|
$this->warnings[DeprecatedComment::CODE] = new DeprecatedComment();
|
||||||
}
|
}
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
|
|
@ -112,12 +112,12 @@ class DomainPart extends PartParser
|
||||||
|
|
||||||
private function checkEmptyDomain() : Result
|
private function checkEmptyDomain() : Result
|
||||||
{
|
{
|
||||||
$thereIsNoDomain = $this->lexer->token['type'] === EmailLexer::S_EMPTY ||
|
$thereIsNoDomain = ((array) $this->lexer->token)['type'] === EmailLexer::S_EMPTY ||
|
||||||
($this->lexer->token['type'] === EmailLexer::S_SP &&
|
(((array) $this->lexer->token)['type'] === EmailLexer::S_SP &&
|
||||||
!$this->lexer->isNextToken(EmailLexer::GENERIC));
|
!$this->lexer->isNextToken(EmailLexer::GENERIC));
|
||||||
|
|
||||||
if ($thereIsNoDomain) {
|
if ($thereIsNoDomain) {
|
||||||
return new InvalidEmail(new NoDomainPart(), $this->lexer->token['value']);
|
return new InvalidEmail(new NoDomainPart(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
|
|
@ -125,11 +125,11 @@ class DomainPart extends PartParser
|
||||||
|
|
||||||
private function checkInvalidTokensAfterAT() : Result
|
private function checkInvalidTokensAfterAT() : Result
|
||||||
{
|
{
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_DOT) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT) {
|
||||||
return new InvalidEmail(new DotAtStart(), $this->lexer->token['value']);
|
return new InvalidEmail(new DotAtStart(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_HYPHEN) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_HYPHEN) {
|
||||||
return new InvalidEmail(new DomainHyphened('After AT'), $this->lexer->token['value']);
|
return new InvalidEmail(new DomainHyphened('After AT'), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
}
|
}
|
||||||
|
|
@ -156,8 +156,8 @@ class DomainPart extends PartParser
|
||||||
return $notAllowedChars;
|
return $notAllowedChars;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS ||
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENPARENTHESIS ||
|
||||||
$this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS ) {
|
((array) $this->lexer->token)['type'] === EmailLexer::S_CLOSEPARENTHESIS ) {
|
||||||
$hasComments = true;
|
$hasComments = true;
|
||||||
$commentsResult = $this->parseComments();
|
$commentsResult = $this->parseComments();
|
||||||
|
|
||||||
|
|
@ -172,7 +172,7 @@ class DomainPart extends PartParser
|
||||||
return $dotsResult;
|
return $dotsResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_OPENBRACKET) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENBRACKET) {
|
||||||
$literalResult = $this->parseDomainLiteral();
|
$literalResult = $this->parseDomainLiteral();
|
||||||
|
|
||||||
$this->addTLDWarnings($tldMissing);
|
$this->addTLDWarnings($tldMissing);
|
||||||
|
|
@ -189,9 +189,9 @@ class DomainPart extends PartParser
|
||||||
return $FwsResult;
|
return $FwsResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
$domain .= $this->lexer->token['value'];
|
$domain .= ((array) $this->lexer->token)['value'];
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::GENERIC)) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::GENERIC)) {
|
||||||
$tldMissing = false;
|
$tldMissing = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -201,7 +201,7 @@ class DomainPart extends PartParser
|
||||||
}
|
}
|
||||||
$this->lexer->moveNext();
|
$this->lexer->moveNext();
|
||||||
|
|
||||||
} while (null !== $this->lexer->token['type']);
|
} while (null !== ((array) $this->lexer->token)['type']);
|
||||||
|
|
||||||
$labelCheck = $this->checkLabelLength(true);
|
$labelCheck = $this->checkLabelLength(true);
|
||||||
if ($labelCheck->isInvalid()) {
|
if ($labelCheck->isInvalid()) {
|
||||||
|
|
@ -219,8 +219,8 @@ class DomainPart extends PartParser
|
||||||
private function checkNotAllowedChars($token) : Result
|
private function checkNotAllowedChars($token) : Result
|
||||||
{
|
{
|
||||||
$notAllowed = [EmailLexer::S_BACKSLASH => true, EmailLexer::S_SLASH=> true];
|
$notAllowed = [EmailLexer::S_BACKSLASH => true, EmailLexer::S_SLASH=> true];
|
||||||
if (isset($notAllowed[$token['type']])) {
|
if (isset($notAllowed[((array) $token)['type']])) {
|
||||||
return new InvalidEmail(new CharNotAllowed(), $token['value']);
|
return new InvalidEmail(new CharNotAllowed(), ((array) $token)['value']);
|
||||||
}
|
}
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
}
|
}
|
||||||
|
|
@ -233,7 +233,7 @@ class DomainPart extends PartParser
|
||||||
try {
|
try {
|
||||||
$this->lexer->find(EmailLexer::S_CLOSEBRACKET);
|
$this->lexer->find(EmailLexer::S_CLOSEBRACKET);
|
||||||
} catch (\RuntimeException $e) {
|
} catch (\RuntimeException $e) {
|
||||||
return new InvalidEmail(new ExpectingDomainLiteralClose(), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingDomainLiteralClose(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$domainLiteralParser = new DomainLiteralParser($this->lexer);
|
$domainLiteralParser = new DomainLiteralParser($this->lexer);
|
||||||
|
|
@ -244,17 +244,17 @@ class DomainPart extends PartParser
|
||||||
|
|
||||||
protected function checkDomainPartExceptions(array $prev, bool $hasComments) : Result
|
protected function checkDomainPartExceptions(array $prev, bool $hasComments) : Result
|
||||||
{
|
{
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_OPENBRACKET && $prev['type'] !== EmailLexer::S_AT) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENBRACKET && $prev['type'] !== EmailLexer::S_AT) {
|
||||||
return new InvalidEmail(new ExpectingATEXT('OPENBRACKET not after AT'), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingATEXT('OPENBRACKET not after AT'), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_HYPHEN && $this->lexer->isNextToken(EmailLexer::S_DOT)) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_HYPHEN && $this->lexer->isNextToken(EmailLexer::S_DOT)) {
|
||||||
return new InvalidEmail(new DomainHyphened('Hypen found near DOT'), $this->lexer->token['value']);
|
return new InvalidEmail(new DomainHyphened('Hypen found near DOT'), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_BACKSLASH
|
||||||
&& $this->lexer->isNextToken(EmailLexer::GENERIC)) {
|
&& $this->lexer->isNextToken(EmailLexer::GENERIC)) {
|
||||||
return new InvalidEmail(new ExpectingATEXT('Escaping following "ATOM"'), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingATEXT('Escaping following "ATOM"'), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->validateTokens($hasComments);
|
return $this->validateTokens($hasComments);
|
||||||
|
|
@ -273,8 +273,8 @@ class DomainPart extends PartParser
|
||||||
$validDomainTokens[EmailLexer::S_CLOSEPARENTHESIS] = true;
|
$validDomainTokens[EmailLexer::S_CLOSEPARENTHESIS] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isset($validDomainTokens[$this->lexer->token['type']])) {
|
if (!isset($validDomainTokens[((array) $this->lexer->token)['type']])) {
|
||||||
return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . $this->lexer->token['value']), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . ((array) $this->lexer->token)['value']), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
|
|
@ -282,13 +282,13 @@ class DomainPart extends PartParser
|
||||||
|
|
||||||
private function checkLabelLength(bool $isEndOfDomain = false) : Result
|
private function checkLabelLength(bool $isEndOfDomain = false) : Result
|
||||||
{
|
{
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_DOT || $isEndOfDomain) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT || $isEndOfDomain) {
|
||||||
if ($this->isLabelTooLong($this->label)) {
|
if ($this->isLabelTooLong($this->label)) {
|
||||||
return new InvalidEmail(new LabelTooLong(), $this->lexer->token['value']);
|
return new InvalidEmail(new LabelTooLong(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
$this->label = '';
|
$this->label = '';
|
||||||
}
|
}
|
||||||
$this->label .= $this->lexer->token['value'];
|
$this->label .= ((array) $this->lexer->token)['value'];
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,24 +30,24 @@ class DoubleQuote extends PartParser
|
||||||
EmailLexer::S_CR => true,
|
EmailLexer::S_CR => true,
|
||||||
EmailLexer::S_LF => true
|
EmailLexer::S_LF => true
|
||||||
];
|
];
|
||||||
|
|
||||||
$setSpecialsWarning = true;
|
$setSpecialsWarning = true;
|
||||||
|
|
||||||
$this->lexer->moveNext();
|
$this->lexer->moveNext();
|
||||||
|
|
||||||
while ($this->lexer->token['type'] !== EmailLexer::S_DQUOTE && null !== $this->lexer->token['type']) {
|
while (((array) $this->lexer->token)['type'] !== EmailLexer::S_DQUOTE && null !== ((array) $this->lexer->token)['type']) {
|
||||||
if (isset($special[$this->lexer->token['type']]) && $setSpecialsWarning) {
|
if (isset($special[((array) $this->lexer->token)['type']]) && $setSpecialsWarning) {
|
||||||
$this->warnings[CFWSWithFWS::CODE] = new CFWSWithFWS();
|
$this->warnings[CFWSWithFWS::CODE] = new CFWSWithFWS();
|
||||||
$setSpecialsWarning = false;
|
$setSpecialsWarning = false;
|
||||||
}
|
}
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH && $this->lexer->isNextToken(EmailLexer::S_DQUOTE)) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_BACKSLASH && $this->lexer->isNextToken(EmailLexer::S_DQUOTE)) {
|
||||||
$this->lexer->moveNext();
|
$this->lexer->moveNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->lexer->moveNext();
|
$this->lexer->moveNext();
|
||||||
|
|
||||||
if (!$this->escaped() && isset($invalid[$this->lexer->token['type']])) {
|
if (!$this->escaped() && isset($invalid[((array) $this->lexer->token)['type']])) {
|
||||||
return new InvalidEmail(new ExpectingATEXT("Expecting ATEXT between DQUOTE"), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingATEXT("Expecting ATEXT between DQUOTE"), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,7 +59,7 @@ class DoubleQuote extends PartParser
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->lexer->isNextToken(EmailLexer::S_AT) && $prev['type'] !== EmailLexer::S_BACKSLASH) {
|
if (!$this->lexer->isNextToken(EmailLexer::S_AT) && $prev['type'] !== EmailLexer::S_BACKSLASH) {
|
||||||
return new InvalidEmail(new ExpectingATEXT("Expecting ATEXT between DQUOTE"), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingATEXT("Expecting ATEXT between DQUOTE"), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
|
|
@ -71,15 +71,15 @@ class DoubleQuote extends PartParser
|
||||||
|
|
||||||
if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type'] === EmailLexer::GENERIC) {
|
if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type'] === EmailLexer::GENERIC) {
|
||||||
$description = 'https://tools.ietf.org/html/rfc5322#section-3.2.4 - quoted string should be a unit';
|
$description = 'https://tools.ietf.org/html/rfc5322#section-3.2.4 - quoted string should be a unit';
|
||||||
return new InvalidEmail(new ExpectingATEXT($description), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingATEXT($description), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->lexer->find(EmailLexer::S_DQUOTE);
|
$this->lexer->find(EmailLexer::S_DQUOTE);
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return new InvalidEmail(new UnclosedQuotedString(), $this->lexer->token['value']);
|
return new InvalidEmail(new UnclosedQuotedString(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
$this->warnings[QuotedString::CODE] = new QuotedString($previous['value'], $this->lexer->token['value']);
|
$this->warnings[QuotedString::CODE] = new QuotedString($previous['value'], ((array) $this->lexer->token)['value']);
|
||||||
|
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,16 +36,16 @@ class FoldingWhiteSpace extends PartParser
|
||||||
return $resultCRLF;
|
return $resultCRLF;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_CR) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_CR) {
|
||||||
return new InvalidEmail(new CRNoLF(), $this->lexer->token['value']);
|
return new InvalidEmail(new CRNoLF(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type'] !== EmailLexer::S_AT) {
|
if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type'] !== EmailLexer::S_AT) {
|
||||||
return new InvalidEmail(new AtextAfterCFWS(), $this->lexer->token['value']);
|
return new InvalidEmail(new AtextAfterCFWS(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_LF || $this->lexer->token['type'] === EmailLexer::C_NUL) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_LF || ((array) $this->lexer->token)['type'] === EmailLexer::C_NUL) {
|
||||||
return new InvalidEmail(new ExpectingCTEXT(), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingCTEXT(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->isNextToken(EmailLexer::S_AT) || $previous['type'] === EmailLexer::S_AT) {
|
if ($this->lexer->isNextToken(EmailLexer::S_AT) || $previous['type'] === EmailLexer::S_AT) {
|
||||||
|
|
@ -59,28 +59,28 @@ class FoldingWhiteSpace extends PartParser
|
||||||
|
|
||||||
protected function checkCRLFInFWS() : Result
|
protected function checkCRLFInFWS() : Result
|
||||||
{
|
{
|
||||||
if ($this->lexer->token['type'] !== EmailLexer::CRLF) {
|
if (((array) $this->lexer->token)['type'] !== EmailLexer::CRLF) {
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) {
|
if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) {
|
||||||
return new InvalidEmail(new CRLFX2(), $this->lexer->token['value']);
|
return new InvalidEmail(new CRLFX2(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
//this has no coverage. Condition is repeated from above one
|
//this has no coverage. Condition is repeated from above one
|
||||||
if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) {
|
if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) {
|
||||||
return new InvalidEmail(new CRLFAtTheEnd(), $this->lexer->token['value']);
|
return new InvalidEmail(new CRLFAtTheEnd(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function isFWS() : bool
|
protected function isFWS() : bool
|
||||||
{
|
{
|
||||||
if ($this->escaped()) {
|
if ($this->escaped()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return in_array($this->lexer->token['type'], self::FWS_TYPES);
|
return in_array(((array) $this->lexer->token)['type'], self::FWS_TYPES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,6 @@ class IDLeftPart extends LocalPart
|
||||||
{
|
{
|
||||||
protected function parseComments(): Result
|
protected function parseComments(): Result
|
||||||
{
|
{
|
||||||
return new InvalidEmail(new CommentsInIDRight(), $this->lexer->token['value']);
|
return new InvalidEmail(new CommentsInIDRight(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,9 @@ class IDRightPart extends DomainPart
|
||||||
EmailLexer::S_GREATERTHAN => true,
|
EmailLexer::S_GREATERTHAN => true,
|
||||||
EmailLexer::S_LOWERTHAN => true,
|
EmailLexer::S_LOWERTHAN => true,
|
||||||
];
|
];
|
||||||
|
|
||||||
if (isset($invalidDomainTokens[$this->lexer->token['type']])) {
|
if (isset($invalidDomainTokens[((array) $this->lexer->token)['type']])) {
|
||||||
return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . $this->lexer->token['value']), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . ((array) $this->lexer->token)['value']), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,12 +36,12 @@ class LocalPart extends PartParser
|
||||||
{
|
{
|
||||||
$this->lexer->startRecording();
|
$this->lexer->startRecording();
|
||||||
|
|
||||||
while ($this->lexer->token['type'] !== EmailLexer::S_AT && null !== $this->lexer->token['type']) {
|
while (((array) $this->lexer->token)['type'] !== EmailLexer::S_AT && null !== ((array) $this->lexer->token)['type']) {
|
||||||
if ($this->hasDotAtStart()) {
|
if ($this->hasDotAtStart()) {
|
||||||
return new InvalidEmail(new DotAtStart(), $this->lexer->token['value']);
|
return new InvalidEmail(new DotAtStart(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_DQUOTE) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_DQUOTE) {
|
||||||
$dquoteParsingResult = $this->parseDoubleQuote();
|
$dquoteParsingResult = $this->parseDoubleQuote();
|
||||||
|
|
||||||
//Invalid double quote parsing
|
//Invalid double quote parsing
|
||||||
|
|
@ -50,8 +50,8 @@ class LocalPart extends PartParser
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS ||
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_OPENPARENTHESIS ||
|
||||||
$this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS ) {
|
((array) $this->lexer->token)['type'] === EmailLexer::S_CLOSEPARENTHESIS ) {
|
||||||
$commentsResult = $this->parseComments();
|
$commentsResult = $this->parseComments();
|
||||||
|
|
||||||
//Invalid comment parsing
|
//Invalid comment parsing
|
||||||
|
|
@ -60,14 +60,14 @@ class LocalPart extends PartParser
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) {
|
||||||
return new InvalidEmail(new ConsecutiveDot(), $this->lexer->token['value']);
|
return new InvalidEmail(new ConsecutiveDot(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_DOT &&
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT &&
|
||||||
$this->lexer->isNextToken(EmailLexer::S_AT)
|
$this->lexer->isNextToken(EmailLexer::S_AT)
|
||||||
) {
|
) {
|
||||||
return new InvalidEmail(new DotAtEnd(), $this->lexer->token['value']);
|
return new InvalidEmail(new DotAtEnd(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$resultEscaping = $this->validateEscaping();
|
$resultEscaping = $this->validateEscaping();
|
||||||
|
|
@ -99,8 +99,8 @@ class LocalPart extends PartParser
|
||||||
|
|
||||||
protected function validateTokens(bool $hasComments) : Result
|
protected function validateTokens(bool $hasComments) : Result
|
||||||
{
|
{
|
||||||
if (isset(self::INVALID_TOKENS[$this->lexer->token['type']])) {
|
if (isset(self::INVALID_TOKENS[((array) $this->lexer->token)['type']])) {
|
||||||
return new InvalidEmail(new ExpectingATEXT('Invalid token found'), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingATEXT('Invalid token found'), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
}
|
}
|
||||||
|
|
@ -110,7 +110,7 @@ class LocalPart extends PartParser
|
||||||
return $this->localPart;
|
return $this->localPart;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function parseLocalFWS() : Result
|
private function parseLocalFWS() : Result
|
||||||
{
|
{
|
||||||
$foldingWS = new FoldingWhiteSpace($this->lexer);
|
$foldingWS = new FoldingWhiteSpace($this->lexer);
|
||||||
$resultFWS = $foldingWS->parse();
|
$resultFWS = $foldingWS->parse();
|
||||||
|
|
@ -122,7 +122,7 @@ class LocalPart extends PartParser
|
||||||
|
|
||||||
private function hasDotAtStart() : bool
|
private function hasDotAtStart() : bool
|
||||||
{
|
{
|
||||||
return $this->lexer->token['type'] === EmailLexer::S_DOT && null === $this->lexer->getPrevious()['type'];
|
return ((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && null === $this->lexer->getPrevious()['type'];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function parseDoubleQuote() : Result
|
private function parseDoubleQuote() : Result
|
||||||
|
|
@ -148,12 +148,12 @@ class LocalPart extends PartParser
|
||||||
private function validateEscaping() : Result
|
private function validateEscaping() : Result
|
||||||
{
|
{
|
||||||
//Backslash found
|
//Backslash found
|
||||||
if ($this->lexer->token['type'] !== EmailLexer::S_BACKSLASH) {
|
if (((array) $this->lexer->token)['type'] !== EmailLexer::S_BACKSLASH) {
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->lexer->isNextToken(EmailLexer::GENERIC)) {
|
if ($this->lexer->isNextToken(EmailLexer::GENERIC)) {
|
||||||
return new InvalidEmail(new ExpectingATEXT('Found ATOM after escaping'), $this->lexer->token['value']);
|
return new InvalidEmail(new ExpectingATEXT('Found ATOM after escaping'), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB, EmailLexer::C_DEL))) {
|
if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB, EmailLexer::C_DEL))) {
|
||||||
|
|
|
||||||
|
|
@ -45,8 +45,8 @@ abstract class PartParser
|
||||||
|
|
||||||
protected function checkConsecutiveDots() : Result
|
protected function checkConsecutiveDots() : Result
|
||||||
{
|
{
|
||||||
if ($this->lexer->token['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) {
|
if (((array) $this->lexer->token)['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) {
|
||||||
return new InvalidEmail(new ConsecutiveDot(), $this->lexer->token['value']);
|
return new InvalidEmail(new ConsecutiveDot(), ((array) $this->lexer->token)['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ValidEmail();
|
return new ValidEmail();
|
||||||
|
|
@ -58,6 +58,6 @@ abstract class PartParser
|
||||||
|
|
||||||
return $previous && $previous['type'] === EmailLexer::S_BACKSLASH
|
return $previous && $previous['type'] === EmailLexer::S_BACKSLASH
|
||||||
&&
|
&&
|
||||||
$this->lexer->token['type'] !== EmailLexer::GENERIC;
|
((array) $this->lexer->token)['type'] !== EmailLexer::GENERIC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,8 +25,7 @@
|
||||||
"require": {
|
"require": {
|
||||||
"ext-dom": "*",
|
"ext-dom": "*",
|
||||||
"ext-libxml": "*",
|
"ext-libxml": "*",
|
||||||
"php": "^5.6 || ^7.0 || ^8.0",
|
"php": "^5.6 || ^7.0 || ^8.0"
|
||||||
"ezyang/htmlpurifier": "^4.16"
|
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "^5.7 || ^6.5 || ^8.5"
|
"phpunit/phpunit": "^5.7 || ^6.5 || ^8.5"
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,6 @@ use enshrined\svgSanitize\data\AttributeInterface;
|
||||||
use enshrined\svgSanitize\data\TagInterface;
|
use enshrined\svgSanitize\data\TagInterface;
|
||||||
use enshrined\svgSanitize\data\XPath;
|
use enshrined\svgSanitize\data\XPath;
|
||||||
use enshrined\svgSanitize\ElementReference\Resolver;
|
use enshrined\svgSanitize\ElementReference\Resolver;
|
||||||
use HTMLPurifier;
|
|
||||||
use HTMLPurifier_Config;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Sanitizer
|
* Class Sanitizer
|
||||||
|
|
@ -38,6 +36,11 @@ class Sanitizer
|
||||||
*/
|
*/
|
||||||
protected $xmlLoaderValue;
|
protected $xmlLoaderValue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
protected $xmlErrorHandlerPreviousValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var bool
|
* @var bool
|
||||||
*/
|
*/
|
||||||
|
|
@ -78,6 +81,11 @@ class Sanitizer
|
||||||
*/
|
*/
|
||||||
protected $useNestingLimit = 15;
|
protected $useNestingLimit = 15;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
protected $allowHugeFiles = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
@ -180,6 +188,24 @@ class Sanitizer
|
||||||
return $this->xmlIssues;
|
return $this->xmlIssues;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Can we allow huge files?
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function getAllowHugeFiles() {
|
||||||
|
return $this->allowHugeFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set whether we can allow huge files.
|
||||||
|
*
|
||||||
|
* @param bool $allowHugeFiles
|
||||||
|
*/
|
||||||
|
public function setAllowHugeFiles( $allowHugeFiles ) {
|
||||||
|
$this->allowHugeFiles = $allowHugeFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sanitize the passed string
|
* Sanitize the passed string
|
||||||
|
|
@ -200,7 +226,7 @@ class Sanitizer
|
||||||
$this->resetInternal();
|
$this->resetInternal();
|
||||||
$this->setUpBefore();
|
$this->setUpBefore();
|
||||||
|
|
||||||
$loaded = $this->xmlDocument->loadXML($dirty);
|
$loaded = $this->xmlDocument->loadXML($dirty, $this->getAllowHugeFiles() ? LIBXML_PARSEHUGE : 0);
|
||||||
|
|
||||||
// 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) {
|
||||||
|
|
@ -247,8 +273,9 @@ class Sanitizer
|
||||||
$this->xmlLoaderValue = libxml_disable_entity_loader(true);
|
$this->xmlLoaderValue = libxml_disable_entity_loader(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Suppress the errors because we don't really have to worry about formation before cleansing
|
// Suppress the errors because we don't really have to worry about formation before cleansing.
|
||||||
libxml_use_internal_errors(true);
|
// See reset in resetAfter().
|
||||||
|
$this->xmlErrorHandlerPreviousValue = libxml_use_internal_errors(true);
|
||||||
|
|
||||||
// Reset array of altered XML
|
// Reset array of altered XML
|
||||||
$this->xmlIssues = array();
|
$this->xmlIssues = array();
|
||||||
|
|
@ -265,6 +292,9 @@ class Sanitizer
|
||||||
// Reset the entity loader
|
// Reset the entity loader
|
||||||
libxml_disable_entity_loader($this->xmlLoaderValue);
|
libxml_disable_entity_loader($this->xmlLoaderValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
libxml_clear_errors();
|
||||||
|
libxml_use_internal_errors($this->xmlErrorHandlerPreviousValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -648,9 +678,7 @@ class Sanitizer
|
||||||
protected function cleanUnsafeNodes(\DOMNode $currentElement) {
|
protected function cleanUnsafeNodes(\DOMNode $currentElement) {
|
||||||
// Replace CDATA node with encoded text node
|
// Replace CDATA node with encoded text node
|
||||||
if ($currentElement instanceof \DOMCdataSection) {
|
if ($currentElement instanceof \DOMCdataSection) {
|
||||||
$purifier = new HTMLPurifier(HTMLPurifier_Config::createDefault());
|
$textNode = $currentElement->ownerDocument->createTextNode($currentElement->nodeValue);
|
||||||
$clean_html = $purifier->purify($currentElement->nodeValue);
|
|
||||||
$textNode = $currentElement->ownerDocument->createTextNode($clean_html);
|
|
||||||
$currentElement->parentNode->replaceChild($textNode, $currentElement);
|
$currentElement->parentNode->replaceChild($textNode, $currentElement);
|
||||||
// If the element doesn't have a tagname, remove it and continue with next iteration
|
// If the element doesn't have a tagname, remove it and continue with next iteration
|
||||||
} elseif (!$currentElement instanceof \DOMElement && !$currentElement instanceof \DOMText) {
|
} elseif (!$currentElement instanceof \DOMElement && !$currentElement instanceof \DOMText) {
|
||||||
|
|
|
||||||
105
common/vendor/firebase/php-jwt/CHANGELOG.md
vendored
Normal file
105
common/vendor/firebase/php-jwt/CHANGELOG.md
vendored
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
# Changelog
|
||||||
|
|
||||||
|
## [6.4.0](https://github.com/firebase/php-jwt/compare/v6.3.2...v6.4.0) (2023-02-08)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add support for W3C ES256K ([#462](https://github.com/firebase/php-jwt/issues/462)) ([213924f](https://github.com/firebase/php-jwt/commit/213924f51936291fbbca99158b11bd4ae56c2c95))
|
||||||
|
* improve caching by only decoding jwks when necessary ([#486](https://github.com/firebase/php-jwt/issues/486)) ([78d3ed1](https://github.com/firebase/php-jwt/commit/78d3ed1073553f7d0bbffa6c2010009a0d483d5c))
|
||||||
|
|
||||||
|
## [6.3.2](https://github.com/firebase/php-jwt/compare/v6.3.1...v6.3.2) (2022-11-01)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* check kid before using as array index ([bad1b04](https://github.com/firebase/php-jwt/commit/bad1b040d0c736bbf86814c6b5ae614f517cf7bd))
|
||||||
|
|
||||||
|
## [6.3.1](https://github.com/firebase/php-jwt/compare/v6.3.0...v6.3.1) (2022-11-01)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* casing of GET for PSR compat ([#451](https://github.com/firebase/php-jwt/issues/451)) ([60b52b7](https://github.com/firebase/php-jwt/commit/60b52b71978790eafcf3b95cfbd83db0439e8d22))
|
||||||
|
* string interpolation format for php 8.2 ([#446](https://github.com/firebase/php-jwt/issues/446)) ([2e07d8a](https://github.com/firebase/php-jwt/commit/2e07d8a1524d12b69b110ad649f17461d068b8f2))
|
||||||
|
|
||||||
|
## 6.3.0 / 2022-07-15
|
||||||
|
|
||||||
|
- Added ES256 support to JWK parsing ([#399](https://github.com/firebase/php-jwt/pull/399))
|
||||||
|
- Fixed potential caching error in `CachedKeySet` by caching jwks as strings ([#435](https://github.com/firebase/php-jwt/pull/435))
|
||||||
|
|
||||||
|
## 6.2.0 / 2022-05-14
|
||||||
|
|
||||||
|
- Added `CachedKeySet` ([#397](https://github.com/firebase/php-jwt/pull/397))
|
||||||
|
- Added `$defaultAlg` parameter to `JWT::parseKey` and `JWT::parseKeySet` ([#426](https://github.com/firebase/php-jwt/pull/426)).
|
||||||
|
|
||||||
|
## 6.1.0 / 2022-03-23
|
||||||
|
|
||||||
|
- Drop support for PHP 5.3, 5.4, 5.5, 5.6, and 7.0
|
||||||
|
- Add parameter typing and return types where possible
|
||||||
|
|
||||||
|
## 6.0.0 / 2022-01-24
|
||||||
|
|
||||||
|
- **Backwards-Compatibility Breaking Changes**: See the [Release Notes](https://github.com/firebase/php-jwt/releases/tag/v6.0.0) for more information.
|
||||||
|
- New Key object to prevent key/algorithm type confusion (#365)
|
||||||
|
- Add JWK support (#273)
|
||||||
|
- Add ES256 support (#256)
|
||||||
|
- Add ES384 support (#324)
|
||||||
|
- Add Ed25519 support (#343)
|
||||||
|
|
||||||
|
## 5.0.0 / 2017-06-26
|
||||||
|
- Support RS384 and RS512.
|
||||||
|
See [#117](https://github.com/firebase/php-jwt/pull/117). Thanks [@joostfaassen](https://github.com/joostfaassen)!
|
||||||
|
- Add an example for RS256 openssl.
|
||||||
|
See [#125](https://github.com/firebase/php-jwt/pull/125). Thanks [@akeeman](https://github.com/akeeman)!
|
||||||
|
- Detect invalid Base64 encoding in signature.
|
||||||
|
See [#162](https://github.com/firebase/php-jwt/pull/162). Thanks [@psignoret](https://github.com/psignoret)!
|
||||||
|
- Update `JWT::verify` to handle OpenSSL errors.
|
||||||
|
See [#159](https://github.com/firebase/php-jwt/pull/159). Thanks [@bshaffer](https://github.com/bshaffer)!
|
||||||
|
- Add `array` type hinting to `decode` method
|
||||||
|
See [#101](https://github.com/firebase/php-jwt/pull/101). Thanks [@hywak](https://github.com/hywak)!
|
||||||
|
- Add all JSON error types.
|
||||||
|
See [#110](https://github.com/firebase/php-jwt/pull/110). Thanks [@gbalduzzi](https://github.com/gbalduzzi)!
|
||||||
|
- Bugfix 'kid' not in given key list.
|
||||||
|
See [#129](https://github.com/firebase/php-jwt/pull/129). Thanks [@stampycode](https://github.com/stampycode)!
|
||||||
|
- Miscellaneous cleanup, documentation and test fixes.
|
||||||
|
See [#107](https://github.com/firebase/php-jwt/pull/107), [#115](https://github.com/firebase/php-jwt/pull/115),
|
||||||
|
[#160](https://github.com/firebase/php-jwt/pull/160), [#161](https://github.com/firebase/php-jwt/pull/161), and
|
||||||
|
[#165](https://github.com/firebase/php-jwt/pull/165). Thanks [@akeeman](https://github.com/akeeman),
|
||||||
|
[@chinedufn](https://github.com/chinedufn), and [@bshaffer](https://github.com/bshaffer)!
|
||||||
|
|
||||||
|
## 4.0.0 / 2016-07-17
|
||||||
|
- Add support for late static binding. See [#88](https://github.com/firebase/php-jwt/pull/88) for details. Thanks to [@chappy84](https://github.com/chappy84)!
|
||||||
|
- Use static `$timestamp` instead of `time()` to improve unit testing. See [#93](https://github.com/firebase/php-jwt/pull/93) for details. Thanks to [@josephmcdermott](https://github.com/josephmcdermott)!
|
||||||
|
- Fixes to exceptions classes. See [#81](https://github.com/firebase/php-jwt/pull/81) for details. Thanks to [@Maks3w](https://github.com/Maks3w)!
|
||||||
|
- Fixes to PHPDoc. See [#76](https://github.com/firebase/php-jwt/pull/76) for details. Thanks to [@akeeman](https://github.com/akeeman)!
|
||||||
|
|
||||||
|
## 3.0.0 / 2015-07-22
|
||||||
|
- Minimum PHP version updated from `5.2.0` to `5.3.0`.
|
||||||
|
- Add `\Firebase\JWT` namespace. See
|
||||||
|
[#59](https://github.com/firebase/php-jwt/pull/59) for details. Thanks to
|
||||||
|
[@Dashron](https://github.com/Dashron)!
|
||||||
|
- Require a non-empty key to decode and verify a JWT. See
|
||||||
|
[#60](https://github.com/firebase/php-jwt/pull/60) for details. Thanks to
|
||||||
|
[@sjones608](https://github.com/sjones608)!
|
||||||
|
- Cleaner documentation blocks in the code. See
|
||||||
|
[#62](https://github.com/firebase/php-jwt/pull/62) for details. Thanks to
|
||||||
|
[@johanderuijter](https://github.com/johanderuijter)!
|
||||||
|
|
||||||
|
## 2.2.0 / 2015-06-22
|
||||||
|
- Add support for adding custom, optional JWT headers to `JWT::encode()`. See
|
||||||
|
[#53](https://github.com/firebase/php-jwt/pull/53/files) for details. Thanks to
|
||||||
|
[@mcocaro](https://github.com/mcocaro)!
|
||||||
|
|
||||||
|
## 2.1.0 / 2015-05-20
|
||||||
|
- Add support for adding a leeway to `JWT:decode()` that accounts for clock skew
|
||||||
|
between signing and verifying entities. Thanks to [@lcabral](https://github.com/lcabral)!
|
||||||
|
- Add support for passing an object implementing the `ArrayAccess` interface for
|
||||||
|
`$keys` argument in `JWT::decode()`. Thanks to [@aztech-dev](https://github.com/aztech-dev)!
|
||||||
|
|
||||||
|
## 2.0.0 / 2015-04-01
|
||||||
|
- **Note**: It is strongly recommended that you update to > v2.0.0 to address
|
||||||
|
known security vulnerabilities in prior versions when both symmetric and
|
||||||
|
asymmetric keys are used together.
|
||||||
|
- Update signature for `JWT::decode(...)` to require an array of supported
|
||||||
|
algorithms to use when verifying token signatures.
|
||||||
30
common/vendor/firebase/php-jwt/LICENSE
vendored
Normal file
30
common/vendor/firebase/php-jwt/LICENSE
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
Copyright (c) 2011, Neuman Vong
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following
|
||||||
|
disclaimer in the documentation and/or other materials provided
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
* Neither the name of the copyright holder nor the names of other
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
332
common/vendor/firebase/php-jwt/README.md
vendored
Normal file
332
common/vendor/firebase/php-jwt/README.md
vendored
Normal file
|
|
@ -0,0 +1,332 @@
|
||||||
|

|
||||||
|
[](https://packagist.org/packages/firebase/php-jwt)
|
||||||
|
[](https://packagist.org/packages/firebase/php-jwt)
|
||||||
|
[](https://packagist.org/packages/firebase/php-jwt)
|
||||||
|
|
||||||
|
PHP-JWT
|
||||||
|
=======
|
||||||
|
A simple library to encode and decode JSON Web Tokens (JWT) in PHP, conforming to [RFC 7519](https://tools.ietf.org/html/rfc7519).
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
Use composer to manage your dependencies and download PHP-JWT:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer require firebase/php-jwt
|
||||||
|
```
|
||||||
|
|
||||||
|
Optionally, install the `paragonie/sodium_compat` package from composer if your
|
||||||
|
php is < 7.2 or does not have libsodium installed:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer require paragonie/sodium_compat
|
||||||
|
```
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
```php
|
||||||
|
use Firebase\JWT\JWT;
|
||||||
|
use Firebase\JWT\Key;
|
||||||
|
|
||||||
|
$key = 'example_key';
|
||||||
|
$payload = [
|
||||||
|
'iss' => 'http://example.org',
|
||||||
|
'aud' => 'http://example.com',
|
||||||
|
'iat' => 1356999524,
|
||||||
|
'nbf' => 1357000000
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IMPORTANT:
|
||||||
|
* You must specify supported algorithms for your application. See
|
||||||
|
* https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
|
||||||
|
* for a list of spec-compliant algorithms.
|
||||||
|
*/
|
||||||
|
$jwt = JWT::encode($payload, $key, 'HS256');
|
||||||
|
$decoded = JWT::decode($jwt, new Key($key, 'HS256'));
|
||||||
|
|
||||||
|
print_r($decoded);
|
||||||
|
|
||||||
|
/*
|
||||||
|
NOTE: This will now be an object instead of an associative array. To get
|
||||||
|
an associative array, you will need to cast it as such:
|
||||||
|
*/
|
||||||
|
|
||||||
|
$decoded_array = (array) $decoded;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* You can add a leeway to account for when there is a clock skew times between
|
||||||
|
* the signing and verifying servers. It is recommended that this leeway should
|
||||||
|
* not be bigger than a few minutes.
|
||||||
|
*
|
||||||
|
* Source: http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#nbfDef
|
||||||
|
*/
|
||||||
|
JWT::$leeway = 60; // $leeway in seconds
|
||||||
|
$decoded = JWT::decode($jwt, new Key($key, 'HS256'));
|
||||||
|
```
|
||||||
|
Example with RS256 (openssl)
|
||||||
|
----------------------------
|
||||||
|
```php
|
||||||
|
use Firebase\JWT\JWT;
|
||||||
|
use Firebase\JWT\Key;
|
||||||
|
|
||||||
|
$privateKey = <<<EOD
|
||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIICXAIBAAKBgQC8kGa1pSjbSYZVebtTRBLxBz5H4i2p/llLCrEeQhta5kaQu/Rn
|
||||||
|
vuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t0tyazyZ8JXw+KgXTxldMPEL9
|
||||||
|
5+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4ehde/zUxo6UvS7UrBQIDAQAB
|
||||||
|
AoGAb/MXV46XxCFRxNuB8LyAtmLDgi/xRnTAlMHjSACddwkyKem8//8eZtw9fzxz
|
||||||
|
bWZ/1/doQOuHBGYZU8aDzzj59FZ78dyzNFoF91hbvZKkg+6wGyd/LrGVEB+Xre0J
|
||||||
|
Nil0GReM2AHDNZUYRv+HYJPIOrB0CRczLQsgFJ8K6aAD6F0CQQDzbpjYdx10qgK1
|
||||||
|
cP59UHiHjPZYC0loEsk7s+hUmT3QHerAQJMZWC11Qrn2N+ybwwNblDKv+s5qgMQ5
|
||||||
|
5tNoQ9IfAkEAxkyffU6ythpg/H0Ixe1I2rd0GbF05biIzO/i77Det3n4YsJVlDck
|
||||||
|
ZkcvY3SK2iRIL4c9yY6hlIhs+K9wXTtGWwJBAO9Dskl48mO7woPR9uD22jDpNSwe
|
||||||
|
k90OMepTjzSvlhjbfuPN1IdhqvSJTDychRwn1kIJ7LQZgQ8fVz9OCFZ/6qMCQGOb
|
||||||
|
qaGwHmUK6xzpUbbacnYrIM6nLSkXgOAwv7XXCojvY614ILTK3iXiLBOxPu5Eu13k
|
||||||
|
eUz9sHyD6vkgZzjtxXECQAkp4Xerf5TGfQXGXhxIX52yH+N2LtujCdkQZjXAsGdm
|
||||||
|
B2zNzvrlgRmgBrklMTrMYgm1NPcW+bRLGcwgW2PTvNM=
|
||||||
|
-----END RSA PRIVATE KEY-----
|
||||||
|
EOD;
|
||||||
|
|
||||||
|
$publicKey = <<<EOD
|
||||||
|
-----BEGIN PUBLIC KEY-----
|
||||||
|
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8kGa1pSjbSYZVebtTRBLxBz5H
|
||||||
|
4i2p/llLCrEeQhta5kaQu/RnvuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t
|
||||||
|
0tyazyZ8JXw+KgXTxldMPEL95+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4
|
||||||
|
ehde/zUxo6UvS7UrBQIDAQAB
|
||||||
|
-----END PUBLIC KEY-----
|
||||||
|
EOD;
|
||||||
|
|
||||||
|
$payload = [
|
||||||
|
'iss' => 'example.org',
|
||||||
|
'aud' => 'example.com',
|
||||||
|
'iat' => 1356999524,
|
||||||
|
'nbf' => 1357000000
|
||||||
|
];
|
||||||
|
|
||||||
|
$jwt = JWT::encode($payload, $privateKey, 'RS256');
|
||||||
|
echo "Encode:\n" . print_r($jwt, true) . "\n";
|
||||||
|
|
||||||
|
$decoded = JWT::decode($jwt, new Key($publicKey, 'RS256'));
|
||||||
|
|
||||||
|
/*
|
||||||
|
NOTE: This will now be an object instead of an associative array. To get
|
||||||
|
an associative array, you will need to cast it as such:
|
||||||
|
*/
|
||||||
|
|
||||||
|
$decoded_array = (array) $decoded;
|
||||||
|
echo "Decode:\n" . print_r($decoded_array, true) . "\n";
|
||||||
|
```
|
||||||
|
|
||||||
|
Example with a passphrase
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Firebase\JWT\JWT;
|
||||||
|
use Firebase\JWT\Key;
|
||||||
|
|
||||||
|
// Your passphrase
|
||||||
|
$passphrase = '[YOUR_PASSPHRASE]';
|
||||||
|
|
||||||
|
// Your private key file with passphrase
|
||||||
|
// Can be generated with "ssh-keygen -t rsa -m pem"
|
||||||
|
$privateKeyFile = '/path/to/key-with-passphrase.pem';
|
||||||
|
|
||||||
|
// Create a private key of type "resource"
|
||||||
|
$privateKey = openssl_pkey_get_private(
|
||||||
|
file_get_contents($privateKeyFile),
|
||||||
|
$passphrase
|
||||||
|
);
|
||||||
|
|
||||||
|
$payload = [
|
||||||
|
'iss' => 'example.org',
|
||||||
|
'aud' => 'example.com',
|
||||||
|
'iat' => 1356999524,
|
||||||
|
'nbf' => 1357000000
|
||||||
|
];
|
||||||
|
|
||||||
|
$jwt = JWT::encode($payload, $privateKey, 'RS256');
|
||||||
|
echo "Encode:\n" . print_r($jwt, true) . "\n";
|
||||||
|
|
||||||
|
// Get public key from the private key, or pull from from a file.
|
||||||
|
$publicKey = openssl_pkey_get_details($privateKey)['key'];
|
||||||
|
|
||||||
|
$decoded = JWT::decode($jwt, new Key($publicKey, 'RS256'));
|
||||||
|
echo "Decode:\n" . print_r((array) $decoded, true) . "\n";
|
||||||
|
```
|
||||||
|
|
||||||
|
Example with EdDSA (libsodium and Ed25519 signature)
|
||||||
|
----------------------------
|
||||||
|
```php
|
||||||
|
use Firebase\JWT\JWT;
|
||||||
|
use Firebase\JWT\Key;
|
||||||
|
|
||||||
|
// Public and private keys are expected to be Base64 encoded. The last
|
||||||
|
// non-empty line is used so that keys can be generated with
|
||||||
|
// sodium_crypto_sign_keypair(). The secret keys generated by other tools may
|
||||||
|
// need to be adjusted to match the input expected by libsodium.
|
||||||
|
|
||||||
|
$keyPair = sodium_crypto_sign_keypair();
|
||||||
|
|
||||||
|
$privateKey = base64_encode(sodium_crypto_sign_secretkey($keyPair));
|
||||||
|
|
||||||
|
$publicKey = base64_encode(sodium_crypto_sign_publickey($keyPair));
|
||||||
|
|
||||||
|
$payload = [
|
||||||
|
'iss' => 'example.org',
|
||||||
|
'aud' => 'example.com',
|
||||||
|
'iat' => 1356999524,
|
||||||
|
'nbf' => 1357000000
|
||||||
|
];
|
||||||
|
|
||||||
|
$jwt = JWT::encode($payload, $privateKey, 'EdDSA');
|
||||||
|
echo "Encode:\n" . print_r($jwt, true) . "\n";
|
||||||
|
|
||||||
|
$decoded = JWT::decode($jwt, new Key($publicKey, 'EdDSA'));
|
||||||
|
echo "Decode:\n" . print_r((array) $decoded, true) . "\n";
|
||||||
|
````
|
||||||
|
|
||||||
|
Using JWKs
|
||||||
|
----------
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Firebase\JWT\JWK;
|
||||||
|
use Firebase\JWT\JWT;
|
||||||
|
|
||||||
|
// Set of keys. The "keys" key is required. For example, the JSON response to
|
||||||
|
// this endpoint: https://www.gstatic.com/iap/verify/public_key-jwk
|
||||||
|
$jwks = ['keys' => []];
|
||||||
|
|
||||||
|
// JWK::parseKeySet($jwks) returns an associative array of **kid** to Firebase\JWT\Key
|
||||||
|
// objects. Pass this as the second parameter to JWT::decode.
|
||||||
|
JWT::decode($payload, JWK::parseKeySet($jwks));
|
||||||
|
```
|
||||||
|
|
||||||
|
Using Cached Key Sets
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
The `CachedKeySet` class can be used to fetch and cache JWKS (JSON Web Key Sets) from a public URI.
|
||||||
|
This has the following advantages:
|
||||||
|
|
||||||
|
1. The results are cached for performance.
|
||||||
|
2. If an unrecognized key is requested, the cache is refreshed, to accomodate for key rotation.
|
||||||
|
3. If rate limiting is enabled, the JWKS URI will not make more than 10 requests a second.
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Firebase\JWT\CachedKeySet;
|
||||||
|
use Firebase\JWT\JWT;
|
||||||
|
|
||||||
|
// The URI for the JWKS you wish to cache the results from
|
||||||
|
$jwksUri = 'https://www.gstatic.com/iap/verify/public_key-jwk';
|
||||||
|
|
||||||
|
// Create an HTTP client (can be any PSR-7 compatible HTTP client)
|
||||||
|
$httpClient = new GuzzleHttp\Client();
|
||||||
|
|
||||||
|
// Create an HTTP request factory (can be any PSR-17 compatible HTTP request factory)
|
||||||
|
$httpFactory = new GuzzleHttp\Psr\HttpFactory();
|
||||||
|
|
||||||
|
// Create a cache item pool (can be any PSR-6 compatible cache item pool)
|
||||||
|
$cacheItemPool = Phpfastcache\CacheManager::getInstance('files');
|
||||||
|
|
||||||
|
$keySet = new CachedKeySet(
|
||||||
|
$jwksUri,
|
||||||
|
$httpClient,
|
||||||
|
$httpFactory,
|
||||||
|
$cacheItemPool,
|
||||||
|
null, // $expiresAfter int seconds to set the JWKS to expire
|
||||||
|
true // $rateLimit true to enable rate limit of 10 RPS on lookup of invalid keys
|
||||||
|
);
|
||||||
|
|
||||||
|
$jwt = 'eyJhbGci...'; // Some JWT signed by a key from the $jwkUri above
|
||||||
|
$decoded = JWT::decode($jwt, $keySet);
|
||||||
|
```
|
||||||
|
|
||||||
|
Miscellaneous
|
||||||
|
-------------
|
||||||
|
|
||||||
|
#### Exception Handling
|
||||||
|
|
||||||
|
When a call to `JWT::decode` is invalid, it will throw one of the following exceptions:
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Firebase\JWT\JWT;
|
||||||
|
use Firebase\JWT\SignatureInvalidException;
|
||||||
|
use Firebase\JWT\BeforeValidException;
|
||||||
|
use Firebase\JWT\ExpiredException;
|
||||||
|
use DomainException;
|
||||||
|
use InvalidArgumentException;
|
||||||
|
use UnexpectedValueException;
|
||||||
|
|
||||||
|
try {
|
||||||
|
$decoded = JWT::decode($payload, $keys);
|
||||||
|
} catch (InvalidArgumentException $e) {
|
||||||
|
// provided key/key-array is empty or malformed.
|
||||||
|
} catch (DomainException $e) {
|
||||||
|
// provided algorithm is unsupported OR
|
||||||
|
// provided key is invalid OR
|
||||||
|
// unknown error thrown in openSSL or libsodium OR
|
||||||
|
// libsodium is required but not available.
|
||||||
|
} catch (SignatureInvalidException $e) {
|
||||||
|
// provided JWT signature verification failed.
|
||||||
|
} catch (BeforeValidException $e) {
|
||||||
|
// provided JWT is trying to be used before "nbf" claim OR
|
||||||
|
// provided JWT is trying to be used before "iat" claim.
|
||||||
|
} catch (ExpiredException $e) {
|
||||||
|
// provided JWT is trying to be used after "exp" claim.
|
||||||
|
} catch (UnexpectedValueException $e) {
|
||||||
|
// provided JWT is malformed OR
|
||||||
|
// provided JWT is missing an algorithm / using an unsupported algorithm OR
|
||||||
|
// provided JWT algorithm does not match provided key OR
|
||||||
|
// provided key ID in key/key-array is empty or invalid.
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
All exceptions in the `Firebase\JWT` namespace extend `UnexpectedValueException`, and can be simplified
|
||||||
|
like this:
|
||||||
|
|
||||||
|
```php
|
||||||
|
try {
|
||||||
|
$decoded = JWT::decode($payload, $keys);
|
||||||
|
} catch (LogicException $e) {
|
||||||
|
// errors having to do with environmental setup or malformed JWT Keys
|
||||||
|
} catch (UnexpectedValueException $e) {
|
||||||
|
// errors having to do with JWT signature and claims
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Casting to array
|
||||||
|
|
||||||
|
The return value of `JWT::decode` is the generic PHP object `stdClass`. If you'd like to handle with arrays
|
||||||
|
instead, you can do the following:
|
||||||
|
|
||||||
|
```php
|
||||||
|
// return type is stdClass
|
||||||
|
$decoded = JWT::decode($payload, $keys);
|
||||||
|
|
||||||
|
// cast to array
|
||||||
|
$decoded = json_decode(json_encode($decoded), true);
|
||||||
|
```
|
||||||
|
|
||||||
|
Tests
|
||||||
|
-----
|
||||||
|
Run the tests using phpunit:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ pear install PHPUnit
|
||||||
|
$ phpunit --configuration phpunit.xml.dist
|
||||||
|
PHPUnit 3.7.10 by Sebastian Bergmann.
|
||||||
|
.....
|
||||||
|
Time: 0 seconds, Memory: 2.50Mb
|
||||||
|
OK (5 tests, 5 assertions)
|
||||||
|
```
|
||||||
|
|
||||||
|
New Lines in private keys
|
||||||
|
-----
|
||||||
|
|
||||||
|
If your private key contains `\n` characters, be sure to wrap it in double quotes `""`
|
||||||
|
and not single quotes `''` in order to properly interpret the escaped characters.
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
[3-Clause BSD](http://opensource.org/licenses/BSD-3-Clause).
|
||||||
42
common/vendor/firebase/php-jwt/composer.json
vendored
Normal file
42
common/vendor/firebase/php-jwt/composer.json
vendored
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
"name": "firebase/php-jwt",
|
||||||
|
"description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
|
||||||
|
"homepage": "https://github.com/firebase/php-jwt",
|
||||||
|
"keywords": [
|
||||||
|
"php",
|
||||||
|
"jwt"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Neuman Vong",
|
||||||
|
"email": "neuman+pear@twilio.com",
|
||||||
|
"role": "Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Anant Narayanan",
|
||||||
|
"email": "anant@php.net",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
|
"require": {
|
||||||
|
"php": "^7.1||^8.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present",
|
||||||
|
"ext-sodium": "Support EdDSA (Ed25519) signatures"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Firebase\\JWT\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"guzzlehttp/guzzle": "^6.5||^7.4",
|
||||||
|
"phpspec/prophecy-phpunit": "^1.1",
|
||||||
|
"phpunit/phpunit": "^7.5||^9.5",
|
||||||
|
"psr/cache": "^1.0||^2.0",
|
||||||
|
"psr/http-client": "^1.0",
|
||||||
|
"psr/http-factory": "^1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
7
common/vendor/firebase/php-jwt/src/BeforeValidException.php
vendored
Normal file
7
common/vendor/firebase/php-jwt/src/BeforeValidException.php
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Firebase\JWT;
|
||||||
|
|
||||||
|
class BeforeValidException extends \UnexpectedValueException
|
||||||
|
{
|
||||||
|
}
|
||||||
258
common/vendor/firebase/php-jwt/src/CachedKeySet.php
vendored
Normal file
258
common/vendor/firebase/php-jwt/src/CachedKeySet.php
vendored
Normal file
|
|
@ -0,0 +1,258 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Firebase\JWT;
|
||||||
|
|
||||||
|
use ArrayAccess;
|
||||||
|
use InvalidArgumentException;
|
||||||
|
use LogicException;
|
||||||
|
use OutOfBoundsException;
|
||||||
|
use Psr\Cache\CacheItemInterface;
|
||||||
|
use Psr\Cache\CacheItemPoolInterface;
|
||||||
|
use Psr\Http\Client\ClientInterface;
|
||||||
|
use Psr\Http\Message\RequestFactoryInterface;
|
||||||
|
use RuntimeException;
|
||||||
|
use UnexpectedValueException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @implements ArrayAccess<string, Key>
|
||||||
|
*/
|
||||||
|
class CachedKeySet implements ArrayAccess
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $jwksUri;
|
||||||
|
/**
|
||||||
|
* @var ClientInterface
|
||||||
|
*/
|
||||||
|
private $httpClient;
|
||||||
|
/**
|
||||||
|
* @var RequestFactoryInterface
|
||||||
|
*/
|
||||||
|
private $httpFactory;
|
||||||
|
/**
|
||||||
|
* @var CacheItemPoolInterface
|
||||||
|
*/
|
||||||
|
private $cache;
|
||||||
|
/**
|
||||||
|
* @var ?int
|
||||||
|
*/
|
||||||
|
private $expiresAfter;
|
||||||
|
/**
|
||||||
|
* @var ?CacheItemInterface
|
||||||
|
*/
|
||||||
|
private $cacheItem;
|
||||||
|
/**
|
||||||
|
* @var array<string, array<mixed>>
|
||||||
|
*/
|
||||||
|
private $keySet;
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $cacheKey;
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $cacheKeyPrefix = 'jwks';
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
private $maxKeyLength = 64;
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private $rateLimit;
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $rateLimitCacheKey;
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
private $maxCallsPerMinute = 10;
|
||||||
|
/**
|
||||||
|
* @var string|null
|
||||||
|
*/
|
||||||
|
private $defaultAlg;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
string $jwksUri,
|
||||||
|
ClientInterface $httpClient,
|
||||||
|
RequestFactoryInterface $httpFactory,
|
||||||
|
CacheItemPoolInterface $cache,
|
||||||
|
int $expiresAfter = null,
|
||||||
|
bool $rateLimit = false,
|
||||||
|
string $defaultAlg = null
|
||||||
|
) {
|
||||||
|
$this->jwksUri = $jwksUri;
|
||||||
|
$this->httpClient = $httpClient;
|
||||||
|
$this->httpFactory = $httpFactory;
|
||||||
|
$this->cache = $cache;
|
||||||
|
$this->expiresAfter = $expiresAfter;
|
||||||
|
$this->rateLimit = $rateLimit;
|
||||||
|
$this->defaultAlg = $defaultAlg;
|
||||||
|
$this->setCacheKeys();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $keyId
|
||||||
|
* @return Key
|
||||||
|
*/
|
||||||
|
public function offsetGet($keyId): Key
|
||||||
|
{
|
||||||
|
if (!$this->keyIdExists($keyId)) {
|
||||||
|
throw new OutOfBoundsException('Key ID not found');
|
||||||
|
}
|
||||||
|
return JWK::parseKey($this->keySet[$keyId], $this->defaultAlg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $keyId
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function offsetExists($keyId): bool
|
||||||
|
{
|
||||||
|
return $this->keyIdExists($keyId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $offset
|
||||||
|
* @param Key $value
|
||||||
|
*/
|
||||||
|
public function offsetSet($offset, $value): void
|
||||||
|
{
|
||||||
|
throw new LogicException('Method not implemented');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $offset
|
||||||
|
*/
|
||||||
|
public function offsetUnset($offset): void
|
||||||
|
{
|
||||||
|
throw new LogicException('Method not implemented');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
private function formatJwksForCache(string $jwks): array
|
||||||
|
{
|
||||||
|
$jwks = json_decode($jwks, true);
|
||||||
|
|
||||||
|
if (!isset($jwks['keys'])) {
|
||||||
|
throw new UnexpectedValueException('"keys" member must exist in the JWK Set');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($jwks['keys'])) {
|
||||||
|
throw new InvalidArgumentException('JWK Set did not contain any keys');
|
||||||
|
}
|
||||||
|
|
||||||
|
$keys = [];
|
||||||
|
foreach ($jwks['keys'] as $k => $v) {
|
||||||
|
$kid = isset($v['kid']) ? $v['kid'] : $k;
|
||||||
|
$keys[(string) $kid] = $v;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function keyIdExists(string $keyId): bool
|
||||||
|
{
|
||||||
|
if (null === $this->keySet) {
|
||||||
|
$item = $this->getCacheItem();
|
||||||
|
// Try to load keys from cache
|
||||||
|
if ($item->isHit()) {
|
||||||
|
// item found! retrieve it
|
||||||
|
$this->keySet = $item->get();
|
||||||
|
// If the cached item is a string, the JWKS response was cached (previous behavior).
|
||||||
|
// Parse this into expected format array<kid, jwk> instead.
|
||||||
|
if (\is_string($this->keySet)) {
|
||||||
|
$this->keySet = $this->formatJwksForCache($this->keySet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($this->keySet[$keyId])) {
|
||||||
|
if ($this->rateLimitExceeded()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$request = $this->httpFactory->createRequest('GET', $this->jwksUri);
|
||||||
|
$jwksResponse = $this->httpClient->sendRequest($request);
|
||||||
|
$this->keySet = $this->formatJwksForCache((string) $jwksResponse->getBody());
|
||||||
|
|
||||||
|
if (!isset($this->keySet[$keyId])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$item = $this->getCacheItem();
|
||||||
|
$item->set($this->keySet);
|
||||||
|
if ($this->expiresAfter) {
|
||||||
|
$item->expiresAfter($this->expiresAfter);
|
||||||
|
}
|
||||||
|
$this->cache->save($item);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function rateLimitExceeded(): bool
|
||||||
|
{
|
||||||
|
if (!$this->rateLimit) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$cacheItem = $this->cache->getItem($this->rateLimitCacheKey);
|
||||||
|
if (!$cacheItem->isHit()) {
|
||||||
|
$cacheItem->expiresAfter(1); // # of calls are cached each minute
|
||||||
|
}
|
||||||
|
|
||||||
|
$callsPerMinute = (int) $cacheItem->get();
|
||||||
|
if (++$callsPerMinute > $this->maxCallsPerMinute) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
$cacheItem->set($callsPerMinute);
|
||||||
|
$this->cache->save($cacheItem);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getCacheItem(): CacheItemInterface
|
||||||
|
{
|
||||||
|
if (\is_null($this->cacheItem)) {
|
||||||
|
$this->cacheItem = $this->cache->getItem($this->cacheKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->cacheItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function setCacheKeys(): void
|
||||||
|
{
|
||||||
|
if (empty($this->jwksUri)) {
|
||||||
|
throw new RuntimeException('JWKS URI is empty');
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure we do not have illegal characters
|
||||||
|
$key = preg_replace('|[^a-zA-Z0-9_\.!]|', '', $this->jwksUri);
|
||||||
|
|
||||||
|
// add prefix
|
||||||
|
$key = $this->cacheKeyPrefix . $key;
|
||||||
|
|
||||||
|
// Hash keys if they exceed $maxKeyLength of 64
|
||||||
|
if (\strlen($key) > $this->maxKeyLength) {
|
||||||
|
$key = substr(hash('sha256', $key), 0, $this->maxKeyLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->cacheKey = $key;
|
||||||
|
|
||||||
|
if ($this->rateLimit) {
|
||||||
|
// add prefix
|
||||||
|
$rateLimitKey = $this->cacheKeyPrefix . 'ratelimit' . $key;
|
||||||
|
|
||||||
|
// Hash keys if they exceed $maxKeyLength of 64
|
||||||
|
if (\strlen($rateLimitKey) > $this->maxKeyLength) {
|
||||||
|
$rateLimitKey = substr(hash('sha256', $rateLimitKey), 0, $this->maxKeyLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->rateLimitCacheKey = $rateLimitKey;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
7
common/vendor/firebase/php-jwt/src/ExpiredException.php
vendored
Normal file
7
common/vendor/firebase/php-jwt/src/ExpiredException.php
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Firebase\JWT;
|
||||||
|
|
||||||
|
class ExpiredException extends \UnexpectedValueException
|
||||||
|
{
|
||||||
|
}
|
||||||
323
common/vendor/firebase/php-jwt/src/JWK.php
vendored
Normal file
323
common/vendor/firebase/php-jwt/src/JWK.php
vendored
Normal file
|
|
@ -0,0 +1,323 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Firebase\JWT;
|
||||||
|
|
||||||
|
use DomainException;
|
||||||
|
use InvalidArgumentException;
|
||||||
|
use UnexpectedValueException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JSON Web Key implementation, based on this spec:
|
||||||
|
* https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41
|
||||||
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* @category Authentication
|
||||||
|
* @package Authentication_JWT
|
||||||
|
* @author Bui Sy Nguyen <nguyenbs@gmail.com>
|
||||||
|
* @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD
|
||||||
|
* @link https://github.com/firebase/php-jwt
|
||||||
|
*/
|
||||||
|
class JWK
|
||||||
|
{
|
||||||
|
private const OID = '1.2.840.10045.2.1';
|
||||||
|
private const ASN1_OBJECT_IDENTIFIER = 0x06;
|
||||||
|
private const ASN1_SEQUENCE = 0x10; // also defined in JWT
|
||||||
|
private const ASN1_BIT_STRING = 0x03;
|
||||||
|
private const EC_CURVES = [
|
||||||
|
'P-256' => '1.2.840.10045.3.1.7', // Len: 64
|
||||||
|
'secp256k1' => '1.3.132.0.10', // Len: 64
|
||||||
|
// 'P-384' => '1.3.132.0.34', // Len: 96 (not yet supported)
|
||||||
|
// 'P-521' => '1.3.132.0.35', // Len: 132 (not supported)
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a set of JWK keys
|
||||||
|
*
|
||||||
|
* @param array<mixed> $jwks The JSON Web Key Set as an associative array
|
||||||
|
* @param string $defaultAlg The algorithm for the Key object if "alg" is not set in the
|
||||||
|
* JSON Web Key Set
|
||||||
|
*
|
||||||
|
* @return array<string, Key> An associative array of key IDs (kid) to Key objects
|
||||||
|
*
|
||||||
|
* @throws InvalidArgumentException Provided JWK Set is empty
|
||||||
|
* @throws UnexpectedValueException Provided JWK Set was invalid
|
||||||
|
* @throws DomainException OpenSSL failure
|
||||||
|
*
|
||||||
|
* @uses parseKey
|
||||||
|
*/
|
||||||
|
public static function parseKeySet(array $jwks, string $defaultAlg = null): array
|
||||||
|
{
|
||||||
|
$keys = [];
|
||||||
|
|
||||||
|
if (!isset($jwks['keys'])) {
|
||||||
|
throw new UnexpectedValueException('"keys" member must exist in the JWK Set');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($jwks['keys'])) {
|
||||||
|
throw new InvalidArgumentException('JWK Set did not contain any keys');
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($jwks['keys'] as $k => $v) {
|
||||||
|
$kid = isset($v['kid']) ? $v['kid'] : $k;
|
||||||
|
if ($key = self::parseKey($v, $defaultAlg)) {
|
||||||
|
$keys[(string) $kid] = $key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 === \count($keys)) {
|
||||||
|
throw new UnexpectedValueException('No supported algorithms found in JWK Set');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a JWK key
|
||||||
|
*
|
||||||
|
* @param array<mixed> $jwk An individual JWK
|
||||||
|
* @param string $defaultAlg The algorithm for the Key object if "alg" is not set in the
|
||||||
|
* JSON Web Key Set
|
||||||
|
*
|
||||||
|
* @return Key The key object for the JWK
|
||||||
|
*
|
||||||
|
* @throws InvalidArgumentException Provided JWK is empty
|
||||||
|
* @throws UnexpectedValueException Provided JWK was invalid
|
||||||
|
* @throws DomainException OpenSSL failure
|
||||||
|
*
|
||||||
|
* @uses createPemFromModulusAndExponent
|
||||||
|
*/
|
||||||
|
public static function parseKey(array $jwk, string $defaultAlg = null): ?Key
|
||||||
|
{
|
||||||
|
if (empty($jwk)) {
|
||||||
|
throw new InvalidArgumentException('JWK must not be empty');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($jwk['kty'])) {
|
||||||
|
throw new UnexpectedValueException('JWK must contain a "kty" parameter');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($jwk['alg'])) {
|
||||||
|
if (\is_null($defaultAlg)) {
|
||||||
|
// The "alg" parameter is optional in a KTY, but an algorithm is required
|
||||||
|
// for parsing in this library. Use the $defaultAlg parameter when parsing the
|
||||||
|
// key set in order to prevent this error.
|
||||||
|
// @see https://datatracker.ietf.org/doc/html/rfc7517#section-4.4
|
||||||
|
throw new UnexpectedValueException('JWK must contain an "alg" parameter');
|
||||||
|
}
|
||||||
|
$jwk['alg'] = $defaultAlg;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($jwk['kty']) {
|
||||||
|
case 'RSA':
|
||||||
|
if (!empty($jwk['d'])) {
|
||||||
|
throw new UnexpectedValueException('RSA private keys are not supported');
|
||||||
|
}
|
||||||
|
if (!isset($jwk['n']) || !isset($jwk['e'])) {
|
||||||
|
throw new UnexpectedValueException('RSA keys must contain values for both "n" and "e"');
|
||||||
|
}
|
||||||
|
|
||||||
|
$pem = self::createPemFromModulusAndExponent($jwk['n'], $jwk['e']);
|
||||||
|
$publicKey = \openssl_pkey_get_public($pem);
|
||||||
|
if (false === $publicKey) {
|
||||||
|
throw new DomainException(
|
||||||
|
'OpenSSL error: ' . \openssl_error_string()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return new Key($publicKey, $jwk['alg']);
|
||||||
|
case 'EC':
|
||||||
|
if (isset($jwk['d'])) {
|
||||||
|
// The key is actually a private key
|
||||||
|
throw new UnexpectedValueException('Key data must be for a public key');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($jwk['crv'])) {
|
||||||
|
throw new UnexpectedValueException('crv not set');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset(self::EC_CURVES[$jwk['crv']])) {
|
||||||
|
throw new DomainException('Unrecognised or unsupported EC curve');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($jwk['x']) || empty($jwk['y'])) {
|
||||||
|
throw new UnexpectedValueException('x and y not set');
|
||||||
|
}
|
||||||
|
|
||||||
|
$publicKey = self::createPemFromCrvAndXYCoordinates($jwk['crv'], $jwk['x'], $jwk['y']);
|
||||||
|
return new Key($publicKey, $jwk['alg']);
|
||||||
|
default:
|
||||||
|
// Currently only RSA is supported
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts the EC JWK values to pem format.
|
||||||
|
*
|
||||||
|
* @param string $crv The EC curve (only P-256 is supported)
|
||||||
|
* @param string $x The EC x-coordinate
|
||||||
|
* @param string $y The EC y-coordinate
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private static function createPemFromCrvAndXYCoordinates(string $crv, string $x, string $y): string
|
||||||
|
{
|
||||||
|
$pem =
|
||||||
|
self::encodeDER(
|
||||||
|
self::ASN1_SEQUENCE,
|
||||||
|
self::encodeDER(
|
||||||
|
self::ASN1_SEQUENCE,
|
||||||
|
self::encodeDER(
|
||||||
|
self::ASN1_OBJECT_IDENTIFIER,
|
||||||
|
self::encodeOID(self::OID)
|
||||||
|
)
|
||||||
|
. self::encodeDER(
|
||||||
|
self::ASN1_OBJECT_IDENTIFIER,
|
||||||
|
self::encodeOID(self::EC_CURVES[$crv])
|
||||||
|
)
|
||||||
|
) .
|
||||||
|
self::encodeDER(
|
||||||
|
self::ASN1_BIT_STRING,
|
||||||
|
\chr(0x00) . \chr(0x04)
|
||||||
|
. JWT::urlsafeB64Decode($x)
|
||||||
|
. JWT::urlsafeB64Decode($y)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return sprintf(
|
||||||
|
"-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----\n",
|
||||||
|
wordwrap(base64_encode($pem), 64, "\n", true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a public key represented in PEM format from RSA modulus and exponent information
|
||||||
|
*
|
||||||
|
* @param string $n The RSA modulus encoded in Base64
|
||||||
|
* @param string $e The RSA exponent encoded in Base64
|
||||||
|
*
|
||||||
|
* @return string The RSA public key represented in PEM format
|
||||||
|
*
|
||||||
|
* @uses encodeLength
|
||||||
|
*/
|
||||||
|
private static function createPemFromModulusAndExponent(
|
||||||
|
string $n,
|
||||||
|
string $e
|
||||||
|
): string {
|
||||||
|
$mod = JWT::urlsafeB64Decode($n);
|
||||||
|
$exp = JWT::urlsafeB64Decode($e);
|
||||||
|
|
||||||
|
$modulus = \pack('Ca*a*', 2, self::encodeLength(\strlen($mod)), $mod);
|
||||||
|
$publicExponent = \pack('Ca*a*', 2, self::encodeLength(\strlen($exp)), $exp);
|
||||||
|
|
||||||
|
$rsaPublicKey = \pack(
|
||||||
|
'Ca*a*a*',
|
||||||
|
48,
|
||||||
|
self::encodeLength(\strlen($modulus) + \strlen($publicExponent)),
|
||||||
|
$modulus,
|
||||||
|
$publicExponent
|
||||||
|
);
|
||||||
|
|
||||||
|
// sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption.
|
||||||
|
$rsaOID = \pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
|
||||||
|
$rsaPublicKey = \chr(0) . $rsaPublicKey;
|
||||||
|
$rsaPublicKey = \chr(3) . self::encodeLength(\strlen($rsaPublicKey)) . $rsaPublicKey;
|
||||||
|
|
||||||
|
$rsaPublicKey = \pack(
|
||||||
|
'Ca*a*',
|
||||||
|
48,
|
||||||
|
self::encodeLength(\strlen($rsaOID . $rsaPublicKey)),
|
||||||
|
$rsaOID . $rsaPublicKey
|
||||||
|
);
|
||||||
|
|
||||||
|
return "-----BEGIN PUBLIC KEY-----\r\n" .
|
||||||
|
\chunk_split(\base64_encode($rsaPublicKey), 64) .
|
||||||
|
'-----END PUBLIC KEY-----';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DER-encode the length
|
||||||
|
*
|
||||||
|
* DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See
|
||||||
|
* {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information.
|
||||||
|
*
|
||||||
|
* @param int $length
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private static function encodeLength(int $length): string
|
||||||
|
{
|
||||||
|
if ($length <= 0x7F) {
|
||||||
|
return \chr($length);
|
||||||
|
}
|
||||||
|
|
||||||
|
$temp = \ltrim(\pack('N', $length), \chr(0));
|
||||||
|
|
||||||
|
return \pack('Ca*', 0x80 | \strlen($temp), $temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes a value into a DER object.
|
||||||
|
* Also defined in Firebase\JWT\JWT
|
||||||
|
*
|
||||||
|
* @param int $type DER tag
|
||||||
|
* @param string $value the value to encode
|
||||||
|
* @return string the encoded object
|
||||||
|
*/
|
||||||
|
private static function encodeDER(int $type, string $value): string
|
||||||
|
{
|
||||||
|
$tag_header = 0;
|
||||||
|
if ($type === self::ASN1_SEQUENCE) {
|
||||||
|
$tag_header |= 0x20;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Type
|
||||||
|
$der = \chr($tag_header | $type);
|
||||||
|
|
||||||
|
// Length
|
||||||
|
$der .= \chr(\strlen($value));
|
||||||
|
|
||||||
|
return $der . $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes a string into a DER-encoded OID.
|
||||||
|
*
|
||||||
|
* @param string $oid the OID string
|
||||||
|
* @return string the binary DER-encoded OID
|
||||||
|
*/
|
||||||
|
private static function encodeOID(string $oid): string
|
||||||
|
{
|
||||||
|
$octets = explode('.', $oid);
|
||||||
|
|
||||||
|
// Get the first octet
|
||||||
|
$first = (int) array_shift($octets);
|
||||||
|
$second = (int) array_shift($octets);
|
||||||
|
$oid = \chr($first * 40 + $second);
|
||||||
|
|
||||||
|
// Iterate over subsequent octets
|
||||||
|
foreach ($octets as $octet) {
|
||||||
|
if ($octet == 0) {
|
||||||
|
$oid .= \chr(0x00);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$bin = '';
|
||||||
|
|
||||||
|
while ($octet) {
|
||||||
|
$bin .= \chr(0x80 | ($octet & 0x7f));
|
||||||
|
$octet >>= 7;
|
||||||
|
}
|
||||||
|
$bin[0] = $bin[0] & \chr(0x7f);
|
||||||
|
|
||||||
|
// Convert to big endian if necessary
|
||||||
|
if (pack('V', 65534) == pack('L', 65534)) {
|
||||||
|
$oid .= strrev($bin);
|
||||||
|
} else {
|
||||||
|
$oid .= $bin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $oid;
|
||||||
|
}
|
||||||
|
}
|
||||||
638
common/vendor/firebase/php-jwt/src/JWT.php
vendored
Normal file
638
common/vendor/firebase/php-jwt/src/JWT.php
vendored
Normal file
|
|
@ -0,0 +1,638 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Firebase\JWT;
|
||||||
|
|
||||||
|
use ArrayAccess;
|
||||||
|
use DateTime;
|
||||||
|
use DomainException;
|
||||||
|
use Exception;
|
||||||
|
use InvalidArgumentException;
|
||||||
|
use OpenSSLAsymmetricKey;
|
||||||
|
use OpenSSLCertificate;
|
||||||
|
use stdClass;
|
||||||
|
use UnexpectedValueException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JSON Web Token implementation, based on this spec:
|
||||||
|
* https://tools.ietf.org/html/rfc7519
|
||||||
|
*
|
||||||
|
* PHP version 5
|
||||||
|
*
|
||||||
|
* @category Authentication
|
||||||
|
* @package Authentication_JWT
|
||||||
|
* @author Neuman Vong <neuman@twilio.com>
|
||||||
|
* @author Anant Narayanan <anant@php.net>
|
||||||
|
* @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD
|
||||||
|
* @link https://github.com/firebase/php-jwt
|
||||||
|
*/
|
||||||
|
class JWT
|
||||||
|
{
|
||||||
|
private const ASN1_INTEGER = 0x02;
|
||||||
|
private const ASN1_SEQUENCE = 0x10;
|
||||||
|
private const ASN1_BIT_STRING = 0x03;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When checking nbf, iat or expiration times,
|
||||||
|
* we want to provide some extra leeway time to
|
||||||
|
* account for clock skew.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
public static $leeway = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow the current timestamp to be specified.
|
||||||
|
* Useful for fixing a value within unit testing.
|
||||||
|
* Will default to PHP time() value if null.
|
||||||
|
*
|
||||||
|
* @var ?int
|
||||||
|
*/
|
||||||
|
public static $timestamp = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<string, string[]>
|
||||||
|
*/
|
||||||
|
public static $supported_algs = [
|
||||||
|
'ES384' => ['openssl', 'SHA384'],
|
||||||
|
'ES256' => ['openssl', 'SHA256'],
|
||||||
|
'ES256K' => ['openssl', 'SHA256'],
|
||||||
|
'HS256' => ['hash_hmac', 'SHA256'],
|
||||||
|
'HS384' => ['hash_hmac', 'SHA384'],
|
||||||
|
'HS512' => ['hash_hmac', 'SHA512'],
|
||||||
|
'RS256' => ['openssl', 'SHA256'],
|
||||||
|
'RS384' => ['openssl', 'SHA384'],
|
||||||
|
'RS512' => ['openssl', 'SHA512'],
|
||||||
|
'EdDSA' => ['sodium_crypto', 'EdDSA'],
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decodes a JWT string into a PHP object.
|
||||||
|
*
|
||||||
|
* @param string $jwt The JWT
|
||||||
|
* @param Key|array<string,Key> $keyOrKeyArray The Key or associative array of key IDs (kid) to Key objects.
|
||||||
|
* If the algorithm used is asymmetric, this is the public key
|
||||||
|
* Each Key object contains an algorithm and matching key.
|
||||||
|
* Supported algorithms are 'ES384','ES256', 'HS256', 'HS384',
|
||||||
|
* 'HS512', 'RS256', 'RS384', and 'RS512'
|
||||||
|
*
|
||||||
|
* @return stdClass The JWT's payload as a PHP object
|
||||||
|
*
|
||||||
|
* @throws InvalidArgumentException Provided key/key-array was empty or malformed
|
||||||
|
* @throws DomainException Provided JWT is malformed
|
||||||
|
* @throws UnexpectedValueException Provided JWT was invalid
|
||||||
|
* @throws SignatureInvalidException Provided JWT was invalid because the signature verification failed
|
||||||
|
* @throws BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf'
|
||||||
|
* @throws BeforeValidException Provided JWT is trying to be used before it's been created as defined by 'iat'
|
||||||
|
* @throws ExpiredException Provided JWT has since expired, as defined by the 'exp' claim
|
||||||
|
*
|
||||||
|
* @uses jsonDecode
|
||||||
|
* @uses urlsafeB64Decode
|
||||||
|
*/
|
||||||
|
public static function decode(
|
||||||
|
string $jwt,
|
||||||
|
$keyOrKeyArray
|
||||||
|
): stdClass {
|
||||||
|
// Validate JWT
|
||||||
|
$timestamp = \is_null(static::$timestamp) ? \time() : static::$timestamp;
|
||||||
|
|
||||||
|
if (empty($keyOrKeyArray)) {
|
||||||
|
throw new InvalidArgumentException('Key may not be empty');
|
||||||
|
}
|
||||||
|
$tks = \explode('.', $jwt);
|
||||||
|
if (\count($tks) !== 3) {
|
||||||
|
throw new UnexpectedValueException('Wrong number of segments');
|
||||||
|
}
|
||||||
|
list($headb64, $bodyb64, $cryptob64) = $tks;
|
||||||
|
$headerRaw = static::urlsafeB64Decode($headb64);
|
||||||
|
if (null === ($header = static::jsonDecode($headerRaw))) {
|
||||||
|
throw new UnexpectedValueException('Invalid header encoding');
|
||||||
|
}
|
||||||
|
$payloadRaw = static::urlsafeB64Decode($bodyb64);
|
||||||
|
if (null === ($payload = static::jsonDecode($payloadRaw))) {
|
||||||
|
throw new UnexpectedValueException('Invalid claims encoding');
|
||||||
|
}
|
||||||
|
if (\is_array($payload)) {
|
||||||
|
// prevent PHP Fatal Error in edge-cases when payload is empty array
|
||||||
|
$payload = (object) $payload;
|
||||||
|
}
|
||||||
|
if (!$payload instanceof stdClass) {
|
||||||
|
throw new UnexpectedValueException('Payload must be a JSON object');
|
||||||
|
}
|
||||||
|
$sig = static::urlsafeB64Decode($cryptob64);
|
||||||
|
if (empty($header->alg)) {
|
||||||
|
throw new UnexpectedValueException('Empty algorithm');
|
||||||
|
}
|
||||||
|
if (empty(static::$supported_algs[$header->alg])) {
|
||||||
|
throw new UnexpectedValueException('Algorithm not supported');
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = self::getKey($keyOrKeyArray, property_exists($header, 'kid') ? $header->kid : null);
|
||||||
|
|
||||||
|
// Check the algorithm
|
||||||
|
if (!self::constantTimeEquals($key->getAlgorithm(), $header->alg)) {
|
||||||
|
// See issue #351
|
||||||
|
throw new UnexpectedValueException('Incorrect key for this algorithm');
|
||||||
|
}
|
||||||
|
if (\in_array($header->alg, ['ES256', 'ES256K', 'ES384'], true)) {
|
||||||
|
// OpenSSL expects an ASN.1 DER sequence for ES256/ES256K/ES384 signatures
|
||||||
|
$sig = self::signatureToDER($sig);
|
||||||
|
}
|
||||||
|
if (!self::verify("{$headb64}.{$bodyb64}", $sig, $key->getKeyMaterial(), $header->alg)) {
|
||||||
|
throw new SignatureInvalidException('Signature verification failed');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the nbf if it is defined. This is the time that the
|
||||||
|
// token can actually be used. If it's not yet that time, abort.
|
||||||
|
if (isset($payload->nbf) && $payload->nbf > ($timestamp + static::$leeway)) {
|
||||||
|
throw new BeforeValidException(
|
||||||
|
'Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->nbf)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that this token has been created before 'now'. This prevents
|
||||||
|
// using tokens that have been created for later use (and haven't
|
||||||
|
// correctly used the nbf claim).
|
||||||
|
if (isset($payload->iat) && $payload->iat > ($timestamp + static::$leeway)) {
|
||||||
|
throw new BeforeValidException(
|
||||||
|
'Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->iat)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if this token has expired.
|
||||||
|
if (isset($payload->exp) && ($timestamp - static::$leeway) >= $payload->exp) {
|
||||||
|
throw new ExpiredException('Expired token');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts and signs a PHP array into a JWT string.
|
||||||
|
*
|
||||||
|
* @param array<mixed> $payload PHP array
|
||||||
|
* @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key.
|
||||||
|
* @param string $alg Supported algorithms are 'ES384','ES256', 'ES256K', 'HS256',
|
||||||
|
* 'HS384', 'HS512', 'RS256', 'RS384', and 'RS512'
|
||||||
|
* @param string $keyId
|
||||||
|
* @param array<string, string> $head An array with header elements to attach
|
||||||
|
*
|
||||||
|
* @return string A signed JWT
|
||||||
|
*
|
||||||
|
* @uses jsonEncode
|
||||||
|
* @uses urlsafeB64Encode
|
||||||
|
*/
|
||||||
|
public static function encode(
|
||||||
|
array $payload,
|
||||||
|
$key,
|
||||||
|
string $alg,
|
||||||
|
string $keyId = null,
|
||||||
|
array $head = null
|
||||||
|
): string {
|
||||||
|
$header = ['typ' => 'JWT', 'alg' => $alg];
|
||||||
|
if ($keyId !== null) {
|
||||||
|
$header['kid'] = $keyId;
|
||||||
|
}
|
||||||
|
if (isset($head) && \is_array($head)) {
|
||||||
|
$header = \array_merge($head, $header);
|
||||||
|
}
|
||||||
|
$segments = [];
|
||||||
|
$segments[] = static::urlsafeB64Encode((string) static::jsonEncode($header));
|
||||||
|
$segments[] = static::urlsafeB64Encode((string) static::jsonEncode($payload));
|
||||||
|
$signing_input = \implode('.', $segments);
|
||||||
|
|
||||||
|
$signature = static::sign($signing_input, $key, $alg);
|
||||||
|
$segments[] = static::urlsafeB64Encode($signature);
|
||||||
|
|
||||||
|
return \implode('.', $segments);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign a string with a given key and algorithm.
|
||||||
|
*
|
||||||
|
* @param string $msg The message to sign
|
||||||
|
* @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key.
|
||||||
|
* @param string $alg Supported algorithms are 'ES384','ES256', 'ES256K', 'HS256',
|
||||||
|
* 'HS384', 'HS512', 'RS256', 'RS384', and 'RS512'
|
||||||
|
*
|
||||||
|
* @return string An encrypted message
|
||||||
|
*
|
||||||
|
* @throws DomainException Unsupported algorithm or bad key was specified
|
||||||
|
*/
|
||||||
|
public static function sign(
|
||||||
|
string $msg,
|
||||||
|
$key,
|
||||||
|
string $alg
|
||||||
|
): string {
|
||||||
|
if (empty(static::$supported_algs[$alg])) {
|
||||||
|
throw new DomainException('Algorithm not supported');
|
||||||
|
}
|
||||||
|
list($function, $algorithm) = static::$supported_algs[$alg];
|
||||||
|
switch ($function) {
|
||||||
|
case 'hash_hmac':
|
||||||
|
if (!\is_string($key)) {
|
||||||
|
throw new InvalidArgumentException('key must be a string when using hmac');
|
||||||
|
}
|
||||||
|
return \hash_hmac($algorithm, $msg, $key, true);
|
||||||
|
case 'openssl':
|
||||||
|
$signature = '';
|
||||||
|
$success = \openssl_sign($msg, $signature, $key, $algorithm); // @phpstan-ignore-line
|
||||||
|
if (!$success) {
|
||||||
|
throw new DomainException('OpenSSL unable to sign data');
|
||||||
|
}
|
||||||
|
if ($alg === 'ES256' || $alg === 'ES256K') {
|
||||||
|
$signature = self::signatureFromDER($signature, 256);
|
||||||
|
} elseif ($alg === 'ES384') {
|
||||||
|
$signature = self::signatureFromDER($signature, 384);
|
||||||
|
}
|
||||||
|
return $signature;
|
||||||
|
case 'sodium_crypto':
|
||||||
|
if (!\function_exists('sodium_crypto_sign_detached')) {
|
||||||
|
throw new DomainException('libsodium is not available');
|
||||||
|
}
|
||||||
|
if (!\is_string($key)) {
|
||||||
|
throw new InvalidArgumentException('key must be a string when using EdDSA');
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// The last non-empty line is used as the key.
|
||||||
|
$lines = array_filter(explode("\n", $key));
|
||||||
|
$key = base64_decode((string) end($lines));
|
||||||
|
if (\strlen($key) === 0) {
|
||||||
|
throw new DomainException('Key cannot be empty string');
|
||||||
|
}
|
||||||
|
return sodium_crypto_sign_detached($msg, $key);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
throw new DomainException($e->getMessage(), 0, $e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new DomainException('Algorithm not supported');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify a signature with the message, key and method. Not all methods
|
||||||
|
* are symmetric, so we must have a separate verify and sign method.
|
||||||
|
*
|
||||||
|
* @param string $msg The original message (header and body)
|
||||||
|
* @param string $signature The original signature
|
||||||
|
* @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial For HS*, a string key works. for RS*, must be an instance of OpenSSLAsymmetricKey
|
||||||
|
* @param string $alg The algorithm
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*
|
||||||
|
* @throws DomainException Invalid Algorithm, bad key, or OpenSSL failure
|
||||||
|
*/
|
||||||
|
private static function verify(
|
||||||
|
string $msg,
|
||||||
|
string $signature,
|
||||||
|
$keyMaterial,
|
||||||
|
string $alg
|
||||||
|
): bool {
|
||||||
|
if (empty(static::$supported_algs[$alg])) {
|
||||||
|
throw new DomainException('Algorithm not supported');
|
||||||
|
}
|
||||||
|
|
||||||
|
list($function, $algorithm) = static::$supported_algs[$alg];
|
||||||
|
switch ($function) {
|
||||||
|
case 'openssl':
|
||||||
|
$success = \openssl_verify($msg, $signature, $keyMaterial, $algorithm); // @phpstan-ignore-line
|
||||||
|
if ($success === 1) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ($success === 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// returns 1 on success, 0 on failure, -1 on error.
|
||||||
|
throw new DomainException(
|
||||||
|
'OpenSSL error: ' . \openssl_error_string()
|
||||||
|
);
|
||||||
|
case 'sodium_crypto':
|
||||||
|
if (!\function_exists('sodium_crypto_sign_verify_detached')) {
|
||||||
|
throw new DomainException('libsodium is not available');
|
||||||
|
}
|
||||||
|
if (!\is_string($keyMaterial)) {
|
||||||
|
throw new InvalidArgumentException('key must be a string when using EdDSA');
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// The last non-empty line is used as the key.
|
||||||
|
$lines = array_filter(explode("\n", $keyMaterial));
|
||||||
|
$key = base64_decode((string) end($lines));
|
||||||
|
if (\strlen($key) === 0) {
|
||||||
|
throw new DomainException('Key cannot be empty string');
|
||||||
|
}
|
||||||
|
if (\strlen($signature) === 0) {
|
||||||
|
throw new DomainException('Signature cannot be empty string');
|
||||||
|
}
|
||||||
|
return sodium_crypto_sign_verify_detached($signature, $msg, $key);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
throw new DomainException($e->getMessage(), 0, $e);
|
||||||
|
}
|
||||||
|
case 'hash_hmac':
|
||||||
|
default:
|
||||||
|
if (!\is_string($keyMaterial)) {
|
||||||
|
throw new InvalidArgumentException('key must be a string when using hmac');
|
||||||
|
}
|
||||||
|
$hash = \hash_hmac($algorithm, $msg, $keyMaterial, true);
|
||||||
|
return self::constantTimeEquals($hash, $signature);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode a JSON string into a PHP object.
|
||||||
|
*
|
||||||
|
* @param string $input JSON string
|
||||||
|
*
|
||||||
|
* @return mixed The decoded JSON string
|
||||||
|
*
|
||||||
|
* @throws DomainException Provided string was invalid JSON
|
||||||
|
*/
|
||||||
|
public static function jsonDecode(string $input)
|
||||||
|
{
|
||||||
|
$obj = \json_decode($input, false, 512, JSON_BIGINT_AS_STRING);
|
||||||
|
|
||||||
|
if ($errno = \json_last_error()) {
|
||||||
|
self::handleJsonError($errno);
|
||||||
|
} elseif ($obj === null && $input !== 'null') {
|
||||||
|
throw new DomainException('Null result with non-null input');
|
||||||
|
}
|
||||||
|
return $obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode a PHP array into a JSON string.
|
||||||
|
*
|
||||||
|
* @param array<mixed> $input A PHP array
|
||||||
|
*
|
||||||
|
* @return string JSON representation of the PHP array
|
||||||
|
*
|
||||||
|
* @throws DomainException Provided object could not be encoded to valid JSON
|
||||||
|
*/
|
||||||
|
public static function jsonEncode(array $input): string
|
||||||
|
{
|
||||||
|
if (PHP_VERSION_ID >= 50400) {
|
||||||
|
$json = \json_encode($input, \JSON_UNESCAPED_SLASHES);
|
||||||
|
} else {
|
||||||
|
// PHP 5.3 only
|
||||||
|
$json = \json_encode($input);
|
||||||
|
}
|
||||||
|
if ($errno = \json_last_error()) {
|
||||||
|
self::handleJsonError($errno);
|
||||||
|
} elseif ($json === 'null' && $input !== null) {
|
||||||
|
throw new DomainException('Null result with non-null input');
|
||||||
|
}
|
||||||
|
if ($json === false) {
|
||||||
|
throw new DomainException('Provided object could not be encoded to valid JSON');
|
||||||
|
}
|
||||||
|
return $json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode a string with URL-safe Base64.
|
||||||
|
*
|
||||||
|
* @param string $input A Base64 encoded string
|
||||||
|
*
|
||||||
|
* @return string A decoded string
|
||||||
|
*
|
||||||
|
* @throws InvalidArgumentException invalid base64 characters
|
||||||
|
*/
|
||||||
|
public static function urlsafeB64Decode(string $input): string
|
||||||
|
{
|
||||||
|
$remainder = \strlen($input) % 4;
|
||||||
|
if ($remainder) {
|
||||||
|
$padlen = 4 - $remainder;
|
||||||
|
$input .= \str_repeat('=', $padlen);
|
||||||
|
}
|
||||||
|
return \base64_decode(\strtr($input, '-_', '+/'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode a string with URL-safe Base64.
|
||||||
|
*
|
||||||
|
* @param string $input The string you want encoded
|
||||||
|
*
|
||||||
|
* @return string The base64 encode of what you passed in
|
||||||
|
*/
|
||||||
|
public static function urlsafeB64Encode(string $input): string
|
||||||
|
{
|
||||||
|
return \str_replace('=', '', \strtr(\base64_encode($input), '+/', '-_'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if an algorithm has been provided for each Key
|
||||||
|
*
|
||||||
|
* @param Key|ArrayAccess<string,Key>|array<string,Key> $keyOrKeyArray
|
||||||
|
* @param string|null $kid
|
||||||
|
*
|
||||||
|
* @throws UnexpectedValueException
|
||||||
|
*
|
||||||
|
* @return Key
|
||||||
|
*/
|
||||||
|
private static function getKey(
|
||||||
|
$keyOrKeyArray,
|
||||||
|
?string $kid
|
||||||
|
): Key {
|
||||||
|
if ($keyOrKeyArray instanceof Key) {
|
||||||
|
return $keyOrKeyArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($kid)) {
|
||||||
|
throw new UnexpectedValueException('"kid" empty, unable to lookup correct key');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($keyOrKeyArray instanceof CachedKeySet) {
|
||||||
|
// Skip "isset" check, as this will automatically refresh if not set
|
||||||
|
return $keyOrKeyArray[$kid];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($keyOrKeyArray[$kid])) {
|
||||||
|
throw new UnexpectedValueException('"kid" invalid, unable to lookup correct key');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $keyOrKeyArray[$kid];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $left The string of known length to compare against
|
||||||
|
* @param string $right The user-supplied string
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function constantTimeEquals(string $left, string $right): bool
|
||||||
|
{
|
||||||
|
if (\function_exists('hash_equals')) {
|
||||||
|
return \hash_equals($left, $right);
|
||||||
|
}
|
||||||
|
$len = \min(self::safeStrlen($left), self::safeStrlen($right));
|
||||||
|
|
||||||
|
$status = 0;
|
||||||
|
for ($i = 0; $i < $len; $i++) {
|
||||||
|
$status |= (\ord($left[$i]) ^ \ord($right[$i]));
|
||||||
|
}
|
||||||
|
$status |= (self::safeStrlen($left) ^ self::safeStrlen($right));
|
||||||
|
|
||||||
|
return ($status === 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to create a JSON error.
|
||||||
|
*
|
||||||
|
* @param int $errno An error number from json_last_error()
|
||||||
|
*
|
||||||
|
* @throws DomainException
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private static function handleJsonError(int $errno): void
|
||||||
|
{
|
||||||
|
$messages = [
|
||||||
|
JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
|
||||||
|
JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON',
|
||||||
|
JSON_ERROR_CTRL_CHAR => 'Unexpected control character found',
|
||||||
|
JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON',
|
||||||
|
JSON_ERROR_UTF8 => 'Malformed UTF-8 characters' //PHP >= 5.3.3
|
||||||
|
];
|
||||||
|
throw new DomainException(
|
||||||
|
isset($messages[$errno])
|
||||||
|
? $messages[$errno]
|
||||||
|
: 'Unknown JSON error: ' . $errno
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the number of bytes in cryptographic strings.
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
private static function safeStrlen(string $str): int
|
||||||
|
{
|
||||||
|
if (\function_exists('mb_strlen')) {
|
||||||
|
return \mb_strlen($str, '8bit');
|
||||||
|
}
|
||||||
|
return \strlen($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an ECDSA signature to an ASN.1 DER sequence
|
||||||
|
*
|
||||||
|
* @param string $sig The ECDSA signature to convert
|
||||||
|
* @return string The encoded DER object
|
||||||
|
*/
|
||||||
|
private static function signatureToDER(string $sig): string
|
||||||
|
{
|
||||||
|
// Separate the signature into r-value and s-value
|
||||||
|
$length = max(1, (int) (\strlen($sig) / 2));
|
||||||
|
list($r, $s) = \str_split($sig, $length);
|
||||||
|
|
||||||
|
// Trim leading zeros
|
||||||
|
$r = \ltrim($r, "\x00");
|
||||||
|
$s = \ltrim($s, "\x00");
|
||||||
|
|
||||||
|
// Convert r-value and s-value from unsigned big-endian integers to
|
||||||
|
// signed two's complement
|
||||||
|
if (\ord($r[0]) > 0x7f) {
|
||||||
|
$r = "\x00" . $r;
|
||||||
|
}
|
||||||
|
if (\ord($s[0]) > 0x7f) {
|
||||||
|
$s = "\x00" . $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::encodeDER(
|
||||||
|
self::ASN1_SEQUENCE,
|
||||||
|
self::encodeDER(self::ASN1_INTEGER, $r) .
|
||||||
|
self::encodeDER(self::ASN1_INTEGER, $s)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes a value into a DER object.
|
||||||
|
*
|
||||||
|
* @param int $type DER tag
|
||||||
|
* @param string $value the value to encode
|
||||||
|
*
|
||||||
|
* @return string the encoded object
|
||||||
|
*/
|
||||||
|
private static function encodeDER(int $type, string $value): string
|
||||||
|
{
|
||||||
|
$tag_header = 0;
|
||||||
|
if ($type === self::ASN1_SEQUENCE) {
|
||||||
|
$tag_header |= 0x20;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Type
|
||||||
|
$der = \chr($tag_header | $type);
|
||||||
|
|
||||||
|
// Length
|
||||||
|
$der .= \chr(\strlen($value));
|
||||||
|
|
||||||
|
return $der . $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes signature from a DER object.
|
||||||
|
*
|
||||||
|
* @param string $der binary signature in DER format
|
||||||
|
* @param int $keySize the number of bits in the key
|
||||||
|
*
|
||||||
|
* @return string the signature
|
||||||
|
*/
|
||||||
|
private static function signatureFromDER(string $der, int $keySize): string
|
||||||
|
{
|
||||||
|
// OpenSSL returns the ECDSA signatures as a binary ASN.1 DER SEQUENCE
|
||||||
|
list($offset, $_) = self::readDER($der);
|
||||||
|
list($offset, $r) = self::readDER($der, $offset);
|
||||||
|
list($offset, $s) = self::readDER($der, $offset);
|
||||||
|
|
||||||
|
// Convert r-value and s-value from signed two's compliment to unsigned
|
||||||
|
// big-endian integers
|
||||||
|
$r = \ltrim($r, "\x00");
|
||||||
|
$s = \ltrim($s, "\x00");
|
||||||
|
|
||||||
|
// Pad out r and s so that they are $keySize bits long
|
||||||
|
$r = \str_pad($r, $keySize / 8, "\x00", STR_PAD_LEFT);
|
||||||
|
$s = \str_pad($s, $keySize / 8, "\x00", STR_PAD_LEFT);
|
||||||
|
|
||||||
|
return $r . $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads binary DER-encoded data and decodes into a single object
|
||||||
|
*
|
||||||
|
* @param string $der the binary data in DER format
|
||||||
|
* @param int $offset the offset of the data stream containing the object
|
||||||
|
* to decode
|
||||||
|
*
|
||||||
|
* @return array{int, string|null} the new offset and the decoded object
|
||||||
|
*/
|
||||||
|
private static function readDER(string $der, int $offset = 0): array
|
||||||
|
{
|
||||||
|
$pos = $offset;
|
||||||
|
$size = \strlen($der);
|
||||||
|
$constructed = (\ord($der[$pos]) >> 5) & 0x01;
|
||||||
|
$type = \ord($der[$pos++]) & 0x1f;
|
||||||
|
|
||||||
|
// Length
|
||||||
|
$len = \ord($der[$pos++]);
|
||||||
|
if ($len & 0x80) {
|
||||||
|
$n = $len & 0x1f;
|
||||||
|
$len = 0;
|
||||||
|
while ($n-- && $pos < $size) {
|
||||||
|
$len = ($len << 8) | \ord($der[$pos++]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value
|
||||||
|
if ($type === self::ASN1_BIT_STRING) {
|
||||||
|
$pos++; // Skip the first contents octet (padding indicator)
|
||||||
|
$data = \substr($der, $pos, $len - 1);
|
||||||
|
$pos += $len - 1;
|
||||||
|
} elseif (!$constructed) {
|
||||||
|
$data = \substr($der, $pos, $len);
|
||||||
|
$pos += $len;
|
||||||
|
} else {
|
||||||
|
$data = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [$pos, $data];
|
||||||
|
}
|
||||||
|
}
|
||||||
64
common/vendor/firebase/php-jwt/src/Key.php
vendored
Normal file
64
common/vendor/firebase/php-jwt/src/Key.php
vendored
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Firebase\JWT;
|
||||||
|
|
||||||
|
use InvalidArgumentException;
|
||||||
|
use OpenSSLAsymmetricKey;
|
||||||
|
use OpenSSLCertificate;
|
||||||
|
use TypeError;
|
||||||
|
|
||||||
|
class Key
|
||||||
|
{
|
||||||
|
/** @var string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate */
|
||||||
|
private $keyMaterial;
|
||||||
|
/** @var string */
|
||||||
|
private $algorithm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial
|
||||||
|
* @param string $algorithm
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
$keyMaterial,
|
||||||
|
string $algorithm
|
||||||
|
) {
|
||||||
|
if (
|
||||||
|
!\is_string($keyMaterial)
|
||||||
|
&& !$keyMaterial instanceof OpenSSLAsymmetricKey
|
||||||
|
&& !$keyMaterial instanceof OpenSSLCertificate
|
||||||
|
&& !\is_resource($keyMaterial)
|
||||||
|
) {
|
||||||
|
throw new TypeError('Key material must be a string, resource, or OpenSSLAsymmetricKey');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($keyMaterial)) {
|
||||||
|
throw new InvalidArgumentException('Key material must not be empty');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($algorithm)) {
|
||||||
|
throw new InvalidArgumentException('Algorithm must not be empty');
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Remove in PHP 8.0 in favor of class constructor property promotion
|
||||||
|
$this->keyMaterial = $keyMaterial;
|
||||||
|
$this->algorithm = $algorithm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the algorithm valid for this key
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getAlgorithm(): string
|
||||||
|
{
|
||||||
|
return $this->algorithm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate
|
||||||
|
*/
|
||||||
|
public function getKeyMaterial()
|
||||||
|
{
|
||||||
|
return $this->keyMaterial;
|
||||||
|
}
|
||||||
|
}
|
||||||
7
common/vendor/firebase/php-jwt/src/SignatureInvalidException.php
vendored
Normal file
7
common/vendor/firebase/php-jwt/src/SignatureInvalidException.php
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Firebase\JWT;
|
||||||
|
|
||||||
|
class SignatureInvalidException extends \UnexpectedValueException
|
||||||
|
{
|
||||||
|
}
|
||||||
202
common/vendor/google/auth/COPYING
vendored
Normal file
202
common/vendor/google/auth/COPYING
vendored
Normal file
|
|
@ -0,0 +1,202 @@
|
||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright 2015 Google Inc.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
203
common/vendor/google/auth/LICENSE
vendored
Normal file
203
common/vendor/google/auth/LICENSE
vendored
Normal file
|
|
@ -0,0 +1,203 @@
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
|
||||||
312
common/vendor/google/auth/README.md
vendored
Normal file
312
common/vendor/google/auth/README.md
vendored
Normal file
|
|
@ -0,0 +1,312 @@
|
||||||
|
# Google Auth Library for PHP
|
||||||
|
|
||||||
|
<dl>
|
||||||
|
<dt>Homepage</dt><dd><a href="http://www.github.com/google/google-auth-library-php">http://www.github.com/google/google-auth-library-php</a></dd>
|
||||||
|
<dt>Reference Docs</dt><dd><a href="https://googleapis.github.io/google-auth-library-php/main/">https://googleapis.github.io/google-auth-library-php/main/</a></dd>
|
||||||
|
<dt>Authors</dt>
|
||||||
|
<dd><a href="mailto:temiola@google.com">Tim Emiola</a></dd>
|
||||||
|
<dd><a href="mailto:stanleycheung@google.com">Stanley Cheung</a></dd>
|
||||||
|
<dd><a href="mailto:betterbrent@google.com">Brent Shaffer</a></dd>
|
||||||
|
<dt>Copyright</dt><dd>Copyright © 2015 Google, Inc.</dd>
|
||||||
|
<dt>License</dt><dd>Apache 2.0</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
This is Google's officially supported PHP client library for using OAuth 2.0
|
||||||
|
authorization and authentication with Google APIs.
|
||||||
|
|
||||||
|
### Installing via Composer
|
||||||
|
|
||||||
|
The recommended way to install the google auth library is through
|
||||||
|
[Composer](http://getcomposer.org).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install Composer
|
||||||
|
curl -sS https://getcomposer.org/installer | php
|
||||||
|
```
|
||||||
|
|
||||||
|
Next, run the Composer command to install the latest stable version:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer.phar require google/auth
|
||||||
|
```
|
||||||
|
|
||||||
|
## Application Default Credentials
|
||||||
|
|
||||||
|
This library provides an implementation of
|
||||||
|
[application default credentials][application default credentials] for PHP.
|
||||||
|
|
||||||
|
The Application Default Credentials provide a simple way to get authorization
|
||||||
|
credentials for use in calling Google APIs.
|
||||||
|
|
||||||
|
They are best suited for cases when the call needs to have the same identity
|
||||||
|
and authorization level for the application independent of the user. This is
|
||||||
|
the recommended approach to authorize calls to Cloud APIs, particularly when
|
||||||
|
you're building an application that uses Google Compute Engine.
|
||||||
|
|
||||||
|
#### Download your Service Account Credentials JSON file
|
||||||
|
|
||||||
|
To use `Application Default Credentials`, You first need to download a set of
|
||||||
|
JSON credentials for your project. Go to **APIs & Services** > **Credentials** in
|
||||||
|
the [Google Developers Console][developer console] and select
|
||||||
|
**Service account** from the **Add credentials** dropdown.
|
||||||
|
|
||||||
|
> This file is your *only copy* of these credentials. It should never be
|
||||||
|
> committed with your source code, and should be stored securely.
|
||||||
|
|
||||||
|
Once downloaded, store the path to this file in the
|
||||||
|
`GOOGLE_APPLICATION_CREDENTIALS` environment variable.
|
||||||
|
|
||||||
|
```php
|
||||||
|
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/credentials.json');
|
||||||
|
```
|
||||||
|
|
||||||
|
> PHP's `putenv` function is just one way to set an environment variable.
|
||||||
|
> Consider using `.htaccess` or apache configuration files as well.
|
||||||
|
|
||||||
|
#### Enable the API you want to use
|
||||||
|
|
||||||
|
Before making your API call, you must be sure the API you're calling has been
|
||||||
|
enabled. Go to **APIs & Auth** > **APIs** in the
|
||||||
|
[Google Developers Console][developer console] and enable the APIs you'd like to
|
||||||
|
call. For the example below, you must enable the `Drive API`.
|
||||||
|
|
||||||
|
#### Call the APIs
|
||||||
|
|
||||||
|
As long as you update the environment variable below to point to *your* JSON
|
||||||
|
credentials file, the following code should output a list of your Drive files.
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Google\Auth\ApplicationDefaultCredentials;
|
||||||
|
use GuzzleHttp\Client;
|
||||||
|
use GuzzleHttp\HandlerStack;
|
||||||
|
|
||||||
|
// specify the path to your application credentials
|
||||||
|
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/credentials.json');
|
||||||
|
|
||||||
|
// define the scopes for your API call
|
||||||
|
$scopes = ['https://www.googleapis.com/auth/drive.readonly'];
|
||||||
|
|
||||||
|
// create middleware
|
||||||
|
$middleware = ApplicationDefaultCredentials::getMiddleware($scopes);
|
||||||
|
$stack = HandlerStack::create();
|
||||||
|
$stack->push($middleware);
|
||||||
|
|
||||||
|
// create the HTTP client
|
||||||
|
$client = new Client([
|
||||||
|
'handler' => $stack,
|
||||||
|
'base_uri' => 'https://www.googleapis.com',
|
||||||
|
'auth' => 'google_auth' // authorize all requests
|
||||||
|
]);
|
||||||
|
|
||||||
|
// make the request
|
||||||
|
$response = $client->get('drive/v2/files');
|
||||||
|
|
||||||
|
// show the result!
|
||||||
|
print_r((string) $response->getBody());
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Guzzle 5 Compatibility
|
||||||
|
|
||||||
|
If you are using [Guzzle 5][Guzzle 5], replace the `create middleware` and
|
||||||
|
`create the HTTP Client` steps with the following:
|
||||||
|
|
||||||
|
```php
|
||||||
|
// create the HTTP client
|
||||||
|
$client = new Client([
|
||||||
|
'base_url' => 'https://www.googleapis.com',
|
||||||
|
'auth' => 'google_auth' // authorize all requests
|
||||||
|
]);
|
||||||
|
|
||||||
|
// create subscriber
|
||||||
|
$subscriber = ApplicationDefaultCredentials::getSubscriber($scopes);
|
||||||
|
$client->getEmitter()->attach($subscriber);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Call using an ID Token
|
||||||
|
If your application is running behind Cloud Run, or using Cloud Identity-Aware
|
||||||
|
Proxy (IAP), you will need to fetch an ID token to access your application. For
|
||||||
|
this, use the static method `getIdTokenMiddleware` on
|
||||||
|
`ApplicationDefaultCredentials`.
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Google\Auth\ApplicationDefaultCredentials;
|
||||||
|
use GuzzleHttp\Client;
|
||||||
|
use GuzzleHttp\HandlerStack;
|
||||||
|
|
||||||
|
// specify the path to your application credentials
|
||||||
|
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/credentials.json');
|
||||||
|
|
||||||
|
// Provide the ID token audience. This can be a Client ID associated with an IAP application,
|
||||||
|
// Or the URL associated with a CloudRun App
|
||||||
|
// $targetAudience = 'IAP_CLIENT_ID.apps.googleusercontent.com';
|
||||||
|
// $targetAudience = 'https://service-1234-uc.a.run.app';
|
||||||
|
$targetAudience = 'YOUR_ID_TOKEN_AUDIENCE';
|
||||||
|
|
||||||
|
// create middleware
|
||||||
|
$middleware = ApplicationDefaultCredentials::getIdTokenMiddleware($targetAudience);
|
||||||
|
$stack = HandlerStack::create();
|
||||||
|
$stack->push($middleware);
|
||||||
|
|
||||||
|
// create the HTTP client
|
||||||
|
$client = new Client([
|
||||||
|
'handler' => $stack,
|
||||||
|
'auth' => 'google_auth',
|
||||||
|
// Cloud Run, IAP, or custom resource URL
|
||||||
|
'base_uri' => 'https://YOUR_PROTECTED_RESOURCE',
|
||||||
|
]);
|
||||||
|
|
||||||
|
// make the request
|
||||||
|
$response = $client->get('/');
|
||||||
|
|
||||||
|
// show the result!
|
||||||
|
print_r((string) $response->getBody());
|
||||||
|
```
|
||||||
|
|
||||||
|
For invoking Cloud Run services, your service account will need the
|
||||||
|
[`Cloud Run Invoker`](https://cloud.google.com/run/docs/authenticating/service-to-service)
|
||||||
|
IAM permission.
|
||||||
|
|
||||||
|
For invoking Cloud Identity-Aware Proxy, you will need to pass the Client ID
|
||||||
|
used when you set up your protected resource as the target audience. See how to
|
||||||
|
[secure your IAP app with signed headers](https://cloud.google.com/iap/docs/signed-headers-howto).
|
||||||
|
|
||||||
|
#### Call using a specific JSON key
|
||||||
|
If you want to use a specific JSON key instead of using `GOOGLE_APPLICATION_CREDENTIALS` environment variable, you can
|
||||||
|
do this:
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Google\Auth\CredentialsLoader;
|
||||||
|
use Google\Auth\Middleware\AuthTokenMiddleware;
|
||||||
|
use GuzzleHttp\Client;
|
||||||
|
use GuzzleHttp\HandlerStack;
|
||||||
|
|
||||||
|
// Define the Google Application Credentials array
|
||||||
|
$jsonKey = ['key' => 'value'];
|
||||||
|
|
||||||
|
// define the scopes for your API call
|
||||||
|
$scopes = ['https://www.googleapis.com/auth/drive.readonly'];
|
||||||
|
|
||||||
|
// Load credentials
|
||||||
|
$creds = CredentialsLoader::makeCredentials($scopes, $jsonKey);
|
||||||
|
|
||||||
|
// optional caching
|
||||||
|
// $creds = new FetchAuthTokenCache($creds, $cacheConfig, $cache);
|
||||||
|
|
||||||
|
// create middleware
|
||||||
|
$middleware = new AuthTokenMiddleware($creds);
|
||||||
|
$stack = HandlerStack::create();
|
||||||
|
$stack->push($middleware);
|
||||||
|
|
||||||
|
// create the HTTP client
|
||||||
|
$client = new Client([
|
||||||
|
'handler' => $stack,
|
||||||
|
'base_uri' => 'https://www.googleapis.com',
|
||||||
|
'auth' => 'google_auth' // authorize all requests
|
||||||
|
]);
|
||||||
|
|
||||||
|
// make the request
|
||||||
|
$response = $client->get('drive/v2/files');
|
||||||
|
|
||||||
|
// show the result!
|
||||||
|
print_r((string) $response->getBody());
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Call using Proxy-Authorization Header
|
||||||
|
If your application is behind a proxy such as [Google Cloud IAP][iap-proxy-header],
|
||||||
|
and your application occupies the `Authorization` request header,
|
||||||
|
you can include the ID token in a `Proxy-Authorization: Bearer`
|
||||||
|
header instead. If a valid ID token is found in a `Proxy-Authorization` header,
|
||||||
|
IAP authorizes the request with it. After authorizing the request, IAP passes
|
||||||
|
the Authorization header to your application without processing the content.
|
||||||
|
For this, use the static method `getProxyIdTokenMiddleware` on
|
||||||
|
`ApplicationDefaultCredentials`.
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Google\Auth\ApplicationDefaultCredentials;
|
||||||
|
use GuzzleHttp\Client;
|
||||||
|
use GuzzleHttp\HandlerStack;
|
||||||
|
|
||||||
|
// specify the path to your application credentials
|
||||||
|
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/credentials.json');
|
||||||
|
|
||||||
|
// Provide the ID token audience. This can be a Client ID associated with an IAP application
|
||||||
|
// $targetAudience = 'IAP_CLIENT_ID.apps.googleusercontent.com';
|
||||||
|
$targetAudience = 'YOUR_ID_TOKEN_AUDIENCE';
|
||||||
|
|
||||||
|
// create middleware
|
||||||
|
$middleware = ApplicationDefaultCredentials::getProxyIdTokenMiddleware($targetAudience);
|
||||||
|
$stack = HandlerStack::create();
|
||||||
|
$stack->push($middleware);
|
||||||
|
|
||||||
|
// create the HTTP client
|
||||||
|
$client = new Client([
|
||||||
|
'handler' => $stack,
|
||||||
|
'auth' => ['username', 'pass'], // auth option handled by your application
|
||||||
|
'proxy_auth' => 'google_auth',
|
||||||
|
]);
|
||||||
|
|
||||||
|
// make the request
|
||||||
|
$response = $client->get('/');
|
||||||
|
|
||||||
|
// show the result!
|
||||||
|
print_r((string) $response->getBody());
|
||||||
|
```
|
||||||
|
|
||||||
|
[iap-proxy-header]: https://cloud.google.com/iap/docs/authentication-howto#authenticating_from_proxy-authorization_header
|
||||||
|
|
||||||
|
#### Verifying JWTs
|
||||||
|
|
||||||
|
If you are [using Google ID tokens to authenticate users][google-id-tokens], use
|
||||||
|
the `Google\Auth\AccessToken` class to verify the ID token:
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Google\Auth\AccessToken;
|
||||||
|
|
||||||
|
$auth = new AccessToken();
|
||||||
|
$auth->verify($idToken);
|
||||||
|
```
|
||||||
|
|
||||||
|
If your app is running behind [Google Identity-Aware Proxy][iap-id-tokens]
|
||||||
|
(IAP), you can verify the ID token coming from the IAP server by pointing to the
|
||||||
|
appropriate certificate URL for IAP. This is because IAP signs the ID
|
||||||
|
tokens with a different key than the Google Identity service:
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Google\Auth\AccessToken;
|
||||||
|
|
||||||
|
$auth = new AccessToken();
|
||||||
|
$auth->verify($idToken, [
|
||||||
|
'certsLocation' => AccessToken::IAP_CERT_URL
|
||||||
|
]);
|
||||||
|
```
|
||||||
|
|
||||||
|
[google-id-tokens]: https://developers.google.com/identity/sign-in/web/backend-auth
|
||||||
|
[iap-id-tokens]: https://cloud.google.com/iap/docs/signed-headers-howto
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This library is licensed under Apache 2.0. Full license text is
|
||||||
|
available in [COPYING][copying].
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
See [CONTRIBUTING][contributing].
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
Please
|
||||||
|
[report bugs at the project on Github](https://github.com/google/google-auth-library-php/issues). Don't
|
||||||
|
hesitate to
|
||||||
|
[ask questions](http://stackoverflow.com/questions/tagged/google-auth-library-php)
|
||||||
|
about the client or APIs on [StackOverflow](http://stackoverflow.com).
|
||||||
|
|
||||||
|
[google-apis-php-client]: https://github.com/google/google-api-php-client
|
||||||
|
[application default credentials]: https://developers.google.com/accounts/docs/application-default-credentials
|
||||||
|
[contributing]: https://github.com/google/google-auth-library-php/tree/main/.github/CONTRIBUTING.md
|
||||||
|
[copying]: https://github.com/google/google-auth-library-php/tree/main/COPYING
|
||||||
|
[Guzzle]: https://github.com/guzzle/guzzle
|
||||||
|
[Guzzle 5]: http://docs.guzzlephp.org/en/5.3
|
||||||
|
[developer console]: https://console.developers.google.com
|
||||||
7
common/vendor/google/auth/SECURITY.md
vendored
Normal file
7
common/vendor/google/auth/SECURITY.md
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Security Policy
|
||||||
|
|
||||||
|
To report a security issue, please use [g.co/vulnz](https://g.co/vulnz).
|
||||||
|
|
||||||
|
The Google Security Team will respond within 5 working days of your report on g.co/vulnz.
|
||||||
|
|
||||||
|
We use g.co/vulnz for our intake, and do coordination and disclosure here using GitHub Security Advisory to privately discuss and fix the issue.
|
||||||
34
common/vendor/google/auth/autoload.php
vendored
Normal file
34
common/vendor/google/auth/autoload.php
vendored
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function oauth2client_php_autoload($className)
|
||||||
|
{
|
||||||
|
$classPath = explode('_', $className);
|
||||||
|
if ($classPath[0] != 'Google') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (count($classPath) > 3) {
|
||||||
|
// Maximum class file path depth in this project is 3.
|
||||||
|
$classPath = array_slice($classPath, 0, 3);
|
||||||
|
}
|
||||||
|
$filePath = dirname(__FILE__) . '/src/' . implode('/', $classPath) . '.php';
|
||||||
|
if (file_exists($filePath)) {
|
||||||
|
require_once $filePath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
spl_autoload_register('oauth2client_php_autoload');
|
||||||
41
common/vendor/google/auth/composer.json
vendored
Normal file
41
common/vendor/google/auth/composer.json
vendored
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
{
|
||||||
|
"name": "google/auth",
|
||||||
|
"type": "library",
|
||||||
|
"description": "Google Auth Library for PHP",
|
||||||
|
"keywords": ["google", "oauth2", "authentication"],
|
||||||
|
"homepage": "http://github.com/google/google-auth-library-php",
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"support": {
|
||||||
|
"docs": "https://googleapis.github.io/google-auth-library-php/main/"
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^7.1||^8.0",
|
||||||
|
"firebase/php-jwt": "^5.5||^6.0",
|
||||||
|
"guzzlehttp/guzzle": "^6.2.1|^7.0",
|
||||||
|
"guzzlehttp/psr7": "^1.7|^2.0",
|
||||||
|
"psr/http-message": "^1.0",
|
||||||
|
"psr/cache": "^1.0|^2.0|^3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"guzzlehttp/promises": "0.1.1|^1.3",
|
||||||
|
"squizlabs/php_codesniffer": "^3.5",
|
||||||
|
"phpunit/phpunit": "^7.5||^9.0.0",
|
||||||
|
"phpspec/prophecy-phpunit": "^1.1||^2.0",
|
||||||
|
"sebastian/comparator": ">=1.2.3",
|
||||||
|
"phpseclib/phpseclib": "^2.0.31||^3.0",
|
||||||
|
"kelvinmo/simplejwt": "0.7.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2."
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Google\\Auth\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"psr-4": {
|
||||||
|
"Google\\Auth\\Tests\\": "tests"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
513
common/vendor/google/auth/src/AccessToken.php
vendored
Normal file
513
common/vendor/google/auth/src/AccessToken.php
vendored
Normal file
|
|
@ -0,0 +1,513 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
|
use Exception;
|
||||||
|
use Firebase\JWT\ExpiredException;
|
||||||
|
use Firebase\JWT\JWT;
|
||||||
|
use Firebase\JWT\Key;
|
||||||
|
use Firebase\JWT\SignatureInvalidException;
|
||||||
|
use Google\Auth\Cache\MemoryCacheItemPool;
|
||||||
|
use Google\Auth\HttpHandler\HttpClientCache;
|
||||||
|
use Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||||
|
use GuzzleHttp\Psr7\Request;
|
||||||
|
use GuzzleHttp\Psr7\Utils;
|
||||||
|
use InvalidArgumentException;
|
||||||
|
use phpseclib\Crypt\RSA;
|
||||||
|
use phpseclib\Math\BigInteger as BigInteger2;
|
||||||
|
use phpseclib3\Crypt\PublicKeyLoader;
|
||||||
|
use phpseclib3\Math\BigInteger as BigInteger3;
|
||||||
|
use Psr\Cache\CacheItemPoolInterface;
|
||||||
|
use RuntimeException;
|
||||||
|
use SimpleJWT\InvalidTokenException;
|
||||||
|
use SimpleJWT\JWT as SimpleJWT;
|
||||||
|
use SimpleJWT\Keys\KeyFactory;
|
||||||
|
use SimpleJWT\Keys\KeySet;
|
||||||
|
use UnexpectedValueException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper around Google Access Tokens which provides convenience functions.
|
||||||
|
*
|
||||||
|
* @experimental
|
||||||
|
*/
|
||||||
|
class AccessToken
|
||||||
|
{
|
||||||
|
const FEDERATED_SIGNON_CERT_URL = 'https://www.googleapis.com/oauth2/v3/certs';
|
||||||
|
const IAP_CERT_URL = 'https://www.gstatic.com/iap/verify/public_key-jwk';
|
||||||
|
const IAP_ISSUER = 'https://cloud.google.com/iap';
|
||||||
|
const OAUTH2_ISSUER = 'accounts.google.com';
|
||||||
|
const OAUTH2_ISSUER_HTTPS = 'https://accounts.google.com';
|
||||||
|
const OAUTH2_REVOKE_URI = 'https://oauth2.googleapis.com/revoke';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var callable
|
||||||
|
*/
|
||||||
|
private $httpHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var CacheItemPoolInterface
|
||||||
|
*/
|
||||||
|
private $cache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param callable $httpHandler [optional] An HTTP Handler to deliver PSR-7 requests.
|
||||||
|
* @param CacheItemPoolInterface $cache [optional] A PSR-6 compatible cache implementation.
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
callable $httpHandler = null,
|
||||||
|
CacheItemPoolInterface $cache = null
|
||||||
|
) {
|
||||||
|
$this->httpHandler = $httpHandler
|
||||||
|
?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||||
|
$this->cache = $cache ?: new MemoryCacheItemPool();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies an id token and returns the authenticated apiLoginTicket.
|
||||||
|
* Throws an exception if the id token is not valid.
|
||||||
|
* The audience parameter can be used to control which id tokens are
|
||||||
|
* accepted. By default, the id token must have been issued to this OAuth2 client.
|
||||||
|
*
|
||||||
|
* @param string $token The JSON Web Token to be verified.
|
||||||
|
* @param array<mixed> $options [optional] {
|
||||||
|
* Configuration options.
|
||||||
|
* @type string $audience The indended recipient of the token.
|
||||||
|
* @type string $issuer The intended issuer of the token.
|
||||||
|
* @type string $cacheKey The cache key of the cached certs. Defaults to
|
||||||
|
* the sha1 of $certsLocation if provided, otherwise is set to
|
||||||
|
* "federated_signon_certs_v3".
|
||||||
|
* @type string $certsLocation The location (remote or local) from which
|
||||||
|
* to retrieve certificates, if not cached. This value should only be
|
||||||
|
* provided in limited circumstances in which you are sure of the
|
||||||
|
* behavior.
|
||||||
|
* @type bool $throwException Whether the function should throw an
|
||||||
|
* exception if the verification fails. This is useful for
|
||||||
|
* determining the reason verification failed.
|
||||||
|
* }
|
||||||
|
* @return array<mixed>|false the token payload, if successful, or false if not.
|
||||||
|
* @throws InvalidArgumentException If certs could not be retrieved from a local file.
|
||||||
|
* @throws InvalidArgumentException If received certs are in an invalid format.
|
||||||
|
* @throws InvalidArgumentException If the cert alg is not supported.
|
||||||
|
* @throws RuntimeException If certs could not be retrieved from a remote location.
|
||||||
|
* @throws UnexpectedValueException If the token issuer does not match.
|
||||||
|
* @throws UnexpectedValueException If the token audience does not match.
|
||||||
|
*/
|
||||||
|
public function verify($token, array $options = [])
|
||||||
|
{
|
||||||
|
$audience = isset($options['audience'])
|
||||||
|
? $options['audience']
|
||||||
|
: null;
|
||||||
|
$issuer = isset($options['issuer'])
|
||||||
|
? $options['issuer']
|
||||||
|
: null;
|
||||||
|
$certsLocation = isset($options['certsLocation'])
|
||||||
|
? $options['certsLocation']
|
||||||
|
: self::FEDERATED_SIGNON_CERT_URL;
|
||||||
|
$cacheKey = isset($options['cacheKey'])
|
||||||
|
? $options['cacheKey']
|
||||||
|
: $this->getCacheKeyFromCertLocation($certsLocation);
|
||||||
|
$throwException = isset($options['throwException'])
|
||||||
|
? $options['throwException']
|
||||||
|
: false; // for backwards compatibility
|
||||||
|
|
||||||
|
// Check signature against each available cert.
|
||||||
|
$certs = $this->getCerts($certsLocation, $cacheKey, $options);
|
||||||
|
$alg = $this->determineAlg($certs);
|
||||||
|
if (!in_array($alg, ['RS256', 'ES256'])) {
|
||||||
|
throw new InvalidArgumentException(
|
||||||
|
'unrecognized "alg" in certs, expected ES256 or RS256'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if ($alg == 'RS256') {
|
||||||
|
return $this->verifyRs256($token, $certs, $audience, $issuer);
|
||||||
|
}
|
||||||
|
return $this->verifyEs256($token, $certs, $audience, $issuer);
|
||||||
|
} catch (ExpiredException $e) { // firebase/php-jwt 5+
|
||||||
|
} catch (SignatureInvalidException $e) { // firebase/php-jwt 5+
|
||||||
|
} catch (InvalidTokenException $e) { // simplejwt
|
||||||
|
} catch (InvalidArgumentException $e) {
|
||||||
|
} catch (UnexpectedValueException $e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($throwException) {
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Identifies the expected algorithm to verify by looking at the "alg" key
|
||||||
|
* of the provided certs.
|
||||||
|
*
|
||||||
|
* @param array<mixed> $certs Certificate array according to the JWK spec (see
|
||||||
|
* https://tools.ietf.org/html/rfc7517).
|
||||||
|
* @return string The expected algorithm, such as "ES256" or "RS256".
|
||||||
|
*/
|
||||||
|
private function determineAlg(array $certs)
|
||||||
|
{
|
||||||
|
$alg = null;
|
||||||
|
foreach ($certs as $cert) {
|
||||||
|
if (empty($cert['alg'])) {
|
||||||
|
throw new InvalidArgumentException(
|
||||||
|
'certs expects "alg" to be set'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$alg = $alg ?: $cert['alg'];
|
||||||
|
|
||||||
|
if ($alg != $cert['alg']) {
|
||||||
|
throw new InvalidArgumentException(
|
||||||
|
'More than one alg detected in certs'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $alg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies an ES256-signed JWT.
|
||||||
|
*
|
||||||
|
* @param string $token The JSON Web Token to be verified.
|
||||||
|
* @param array<mixed> $certs Certificate array according to the JWK spec (see
|
||||||
|
* https://tools.ietf.org/html/rfc7517).
|
||||||
|
* @param string|null $audience If set, returns false if the provided
|
||||||
|
* audience does not match the "aud" claim on the JWT.
|
||||||
|
* @param string|null $issuer If set, returns false if the provided
|
||||||
|
* issuer does not match the "iss" claim on the JWT.
|
||||||
|
* @return array<mixed> the token payload, if successful, or false if not.
|
||||||
|
*/
|
||||||
|
private function verifyEs256($token, array $certs, $audience = null, $issuer = null)
|
||||||
|
{
|
||||||
|
$this->checkSimpleJwt();
|
||||||
|
|
||||||
|
$jwkset = new KeySet();
|
||||||
|
foreach ($certs as $cert) {
|
||||||
|
$jwkset->add(KeyFactory::create($cert, 'php'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate the signature using the key set and ES256 algorithm.
|
||||||
|
$jwt = $this->callSimpleJwtDecode([$token, $jwkset, 'ES256']);
|
||||||
|
$payload = $jwt->getClaims();
|
||||||
|
|
||||||
|
if ($audience) {
|
||||||
|
if (!isset($payload['aud']) || $payload['aud'] != $audience) {
|
||||||
|
throw new UnexpectedValueException('Audience does not match');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// @see https://cloud.google.com/iap/docs/signed-headers-howto#verifying_the_jwt_payload
|
||||||
|
$issuer = $issuer ?: self::IAP_ISSUER;
|
||||||
|
if (!isset($payload['iss']) || $payload['iss'] !== $issuer) {
|
||||||
|
throw new UnexpectedValueException('Issuer does not match');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies an RS256-signed JWT.
|
||||||
|
*
|
||||||
|
* @param string $token The JSON Web Token to be verified.
|
||||||
|
* @param array<mixed> $certs Certificate array according to the JWK spec (see
|
||||||
|
* https://tools.ietf.org/html/rfc7517).
|
||||||
|
* @param string|null $audience If set, returns false if the provided
|
||||||
|
* audience does not match the "aud" claim on the JWT.
|
||||||
|
* @param string|null $issuer If set, returns false if the provided
|
||||||
|
* issuer does not match the "iss" claim on the JWT.
|
||||||
|
* @return array<mixed> the token payload, if successful, or false if not.
|
||||||
|
*/
|
||||||
|
private function verifyRs256($token, array $certs, $audience = null, $issuer = null)
|
||||||
|
{
|
||||||
|
$this->checkAndInitializePhpsec();
|
||||||
|
$keys = [];
|
||||||
|
foreach ($certs as $cert) {
|
||||||
|
if (empty($cert['kid'])) {
|
||||||
|
throw new InvalidArgumentException(
|
||||||
|
'certs expects "kid" to be set'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (empty($cert['n']) || empty($cert['e'])) {
|
||||||
|
throw new InvalidArgumentException(
|
||||||
|
'RSA certs expects "n" and "e" to be set'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$publicKey = $this->loadPhpsecPublicKey($cert['n'], $cert['e']);
|
||||||
|
|
||||||
|
// create an array of key IDs to certs for the JWT library
|
||||||
|
$keys[$cert['kid']] = new Key($publicKey, 'RS256');
|
||||||
|
}
|
||||||
|
|
||||||
|
$payload = $this->callJwtStatic('decode', [
|
||||||
|
$token,
|
||||||
|
$keys,
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($audience) {
|
||||||
|
if (!property_exists($payload, 'aud') || $payload->aud != $audience) {
|
||||||
|
throw new UnexpectedValueException('Audience does not match');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// support HTTP and HTTPS issuers
|
||||||
|
// @see https://developers.google.com/identity/sign-in/web/backend-auth
|
||||||
|
$issuers = $issuer ? [$issuer] : [self::OAUTH2_ISSUER, self::OAUTH2_ISSUER_HTTPS];
|
||||||
|
if (!isset($payload->iss) || !in_array($payload->iss, $issuers)) {
|
||||||
|
throw new UnexpectedValueException('Issuer does not match');
|
||||||
|
}
|
||||||
|
|
||||||
|
return (array) $payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Revoke an OAuth2 access token or refresh token. This method will revoke the current access
|
||||||
|
* token, if a token isn't provided.
|
||||||
|
*
|
||||||
|
* @param string|array<mixed> $token The token (access token or a refresh token) that should be revoked.
|
||||||
|
* @param array<mixed> $options [optional] Configuration options.
|
||||||
|
* @return bool Returns True if the revocation was successful, otherwise False.
|
||||||
|
*/
|
||||||
|
public function revoke($token, array $options = [])
|
||||||
|
{
|
||||||
|
if (is_array($token)) {
|
||||||
|
if (isset($token['refresh_token'])) {
|
||||||
|
$token = $token['refresh_token'];
|
||||||
|
} else {
|
||||||
|
$token = $token['access_token'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$body = Utils::streamFor(http_build_query(['token' => $token]));
|
||||||
|
$request = new Request('POST', self::OAUTH2_REVOKE_URI, [
|
||||||
|
'Cache-Control' => 'no-store',
|
||||||
|
'Content-Type' => 'application/x-www-form-urlencoded',
|
||||||
|
], $body);
|
||||||
|
|
||||||
|
$httpHandler = $this->httpHandler;
|
||||||
|
|
||||||
|
$response = $httpHandler($request, $options);
|
||||||
|
|
||||||
|
return $response->getStatusCode() == 200;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets federated sign-on certificates to use for verifying identity tokens.
|
||||||
|
* Returns certs as array structure, where keys are key ids, and values
|
||||||
|
* are PEM encoded certificates.
|
||||||
|
*
|
||||||
|
* @param string $location The location from which to retrieve certs.
|
||||||
|
* @param string $cacheKey The key under which to cache the retrieved certs.
|
||||||
|
* @param array<mixed> $options [optional] Configuration options.
|
||||||
|
* @return array<mixed>
|
||||||
|
* @throws InvalidArgumentException If received certs are in an invalid format.
|
||||||
|
*/
|
||||||
|
private function getCerts($location, $cacheKey, array $options = [])
|
||||||
|
{
|
||||||
|
$cacheItem = $this->cache->getItem($cacheKey);
|
||||||
|
$certs = $cacheItem ? $cacheItem->get() : null;
|
||||||
|
|
||||||
|
$gotNewCerts = false;
|
||||||
|
if (!$certs) {
|
||||||
|
$certs = $this->retrieveCertsFromLocation($location, $options);
|
||||||
|
|
||||||
|
$gotNewCerts = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($certs['keys'])) {
|
||||||
|
if ($location !== self::IAP_CERT_URL) {
|
||||||
|
throw new InvalidArgumentException(
|
||||||
|
'federated sign-on certs expects "keys" to be set'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
throw new InvalidArgumentException(
|
||||||
|
'certs expects "keys" to be set'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Push caching off until after verifying certs are in a valid format.
|
||||||
|
// Don't want to cache bad data.
|
||||||
|
if ($gotNewCerts) {
|
||||||
|
$cacheItem->expiresAt(new DateTime('+1 hour'));
|
||||||
|
$cacheItem->set($certs);
|
||||||
|
$this->cache->save($cacheItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $certs['keys'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve and cache a certificates file.
|
||||||
|
*
|
||||||
|
* @param string $url location
|
||||||
|
* @param array<mixed> $options [optional] Configuration options.
|
||||||
|
* @return array<mixed> certificates
|
||||||
|
* @throws InvalidArgumentException If certs could not be retrieved from a local file.
|
||||||
|
* @throws RuntimeException If certs could not be retrieved from a remote location.
|
||||||
|
*/
|
||||||
|
private function retrieveCertsFromLocation($url, array $options = [])
|
||||||
|
{
|
||||||
|
// If we're retrieving a local file, just grab it.
|
||||||
|
if (strpos($url, 'http') !== 0) {
|
||||||
|
if (!file_exists($url)) {
|
||||||
|
throw new InvalidArgumentException(sprintf(
|
||||||
|
'Failed to retrieve verification certificates from path: %s.',
|
||||||
|
$url
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return json_decode((string) file_get_contents($url), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$httpHandler = $this->httpHandler;
|
||||||
|
$response = $httpHandler(new Request('GET', $url), $options);
|
||||||
|
|
||||||
|
if ($response->getStatusCode() == 200) {
|
||||||
|
return json_decode((string) $response->getBody(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new RuntimeException(sprintf(
|
||||||
|
'Failed to retrieve verification certificates: "%s".',
|
||||||
|
$response->getBody()->getContents()
|
||||||
|
), $response->getStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function checkAndInitializePhpsec()
|
||||||
|
{
|
||||||
|
if (!$this->checkAndInitializePhpsec2() && !$this->checkPhpsec3()) {
|
||||||
|
throw new RuntimeException('Please require phpseclib/phpseclib v2 or v3 to use this utility.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function loadPhpsecPublicKey(string $modulus, string $exponent): string
|
||||||
|
{
|
||||||
|
if (class_exists(RSA::class) && class_exists(BigInteger2::class)) {
|
||||||
|
$key = new RSA();
|
||||||
|
$key->loadKey([
|
||||||
|
'n' => new BigInteger2($this->callJwtStatic('urlsafeB64Decode', [
|
||||||
|
$modulus,
|
||||||
|
]), 256),
|
||||||
|
'e' => new BigInteger2($this->callJwtStatic('urlsafeB64Decode', [
|
||||||
|
$exponent
|
||||||
|
]), 256),
|
||||||
|
]);
|
||||||
|
return $key->getPublicKey();
|
||||||
|
}
|
||||||
|
$key = PublicKeyLoader::load([
|
||||||
|
'n' => new BigInteger3($this->callJwtStatic('urlsafeB64Decode', [
|
||||||
|
$modulus,
|
||||||
|
]), 256),
|
||||||
|
'e' => new BigInteger3($this->callJwtStatic('urlsafeB64Decode', [
|
||||||
|
$exponent
|
||||||
|
]), 256),
|
||||||
|
]);
|
||||||
|
return $key->toString('PKCS1');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function checkAndInitializePhpsec2(): bool
|
||||||
|
{
|
||||||
|
if (!class_exists('phpseclib\Crypt\RSA')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* phpseclib calls "phpinfo" by default, which requires special
|
||||||
|
* whitelisting in the AppEngine VM environment. This function
|
||||||
|
* sets constants to bypass the need for phpseclib to check phpinfo
|
||||||
|
*
|
||||||
|
* @see phpseclib/Math/BigInteger
|
||||||
|
* @see https://github.com/GoogleCloudPlatform/getting-started-php/issues/85
|
||||||
|
* @codeCoverageIgnore
|
||||||
|
*/
|
||||||
|
if (filter_var(getenv('GAE_VM'), FILTER_VALIDATE_BOOLEAN)) {
|
||||||
|
if (!defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) {
|
||||||
|
define('MATH_BIGINTEGER_OPENSSL_ENABLED', true);
|
||||||
|
}
|
||||||
|
if (!defined('CRYPT_RSA_MODE')) {
|
||||||
|
define('CRYPT_RSA_MODE', RSA::MODE_OPENSSL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function checkPhpsec3(): bool
|
||||||
|
{
|
||||||
|
return class_exists('phpseclib3\Crypt\RSA');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function checkSimpleJwt()
|
||||||
|
{
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
|
if (!class_exists(SimpleJwt::class)) {
|
||||||
|
throw new RuntimeException('Please require kelvinmo/simplejwt ^0.2 to use this utility.');
|
||||||
|
}
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provide a hook to mock calls to the JWT static methods.
|
||||||
|
*
|
||||||
|
* @param string $method
|
||||||
|
* @param array<mixed> $args
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
protected function callJwtStatic($method, array $args = [])
|
||||||
|
{
|
||||||
|
return call_user_func_array([JWT::class, $method], $args); // @phpstan-ignore-line
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provide a hook to mock calls to the JWT static methods.
|
||||||
|
*
|
||||||
|
* @param array<mixed> $args
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
protected function callSimpleJwtDecode(array $args = [])
|
||||||
|
{
|
||||||
|
return call_user_func_array([SimpleJwt::class, 'decode'], $args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a cache key based on the cert location using sha1 with the
|
||||||
|
* exception of using "federated_signon_certs_v3" to preserve BC.
|
||||||
|
*
|
||||||
|
* @param string $certsLocation
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function getCacheKeyFromCertLocation($certsLocation)
|
||||||
|
{
|
||||||
|
$key = $certsLocation === self::FEDERATED_SIGNON_CERT_URL
|
||||||
|
? 'federated_signon_certs_v3'
|
||||||
|
: sha1($certsLocation);
|
||||||
|
|
||||||
|
return 'google_auth_certs_cache|' . $key;
|
||||||
|
}
|
||||||
|
}
|
||||||
345
common/vendor/google/auth/src/ApplicationDefaultCredentials.php
vendored
Normal file
345
common/vendor/google/auth/src/ApplicationDefaultCredentials.php
vendored
Normal file
|
|
@ -0,0 +1,345 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
use DomainException;
|
||||||
|
use Google\Auth\Credentials\AppIdentityCredentials;
|
||||||
|
use Google\Auth\Credentials\GCECredentials;
|
||||||
|
use Google\Auth\Credentials\ServiceAccountCredentials;
|
||||||
|
use Google\Auth\HttpHandler\HttpClientCache;
|
||||||
|
use Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||||
|
use Google\Auth\Middleware\AuthTokenMiddleware;
|
||||||
|
use Google\Auth\Middleware\ProxyAuthTokenMiddleware;
|
||||||
|
use Google\Auth\Subscriber\AuthTokenSubscriber;
|
||||||
|
use GuzzleHttp\Client;
|
||||||
|
use InvalidArgumentException;
|
||||||
|
use Psr\Cache\CacheItemPoolInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ApplicationDefaultCredentials obtains the default credentials for
|
||||||
|
* authorizing a request to a Google service.
|
||||||
|
*
|
||||||
|
* Application Default Credentials are described here:
|
||||||
|
* https://developers.google.com/accounts/docs/application-default-credentials
|
||||||
|
*
|
||||||
|
* This class implements the search for the application default credentials as
|
||||||
|
* described in the link.
|
||||||
|
*
|
||||||
|
* It provides three factory methods:
|
||||||
|
* - #get returns the computed credentials object
|
||||||
|
* - #getSubscriber returns an AuthTokenSubscriber built from the credentials object
|
||||||
|
* - #getMiddleware returns an AuthTokenMiddleware built from the credentials object
|
||||||
|
*
|
||||||
|
* This allows it to be used as follows with GuzzleHttp\Client:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* use Google\Auth\ApplicationDefaultCredentials;
|
||||||
|
* use GuzzleHttp\Client;
|
||||||
|
* use GuzzleHttp\HandlerStack;
|
||||||
|
*
|
||||||
|
* $middleware = ApplicationDefaultCredentials::getMiddleware(
|
||||||
|
* 'https://www.googleapis.com/auth/taskqueue'
|
||||||
|
* );
|
||||||
|
* $stack = HandlerStack::create();
|
||||||
|
* $stack->push($middleware);
|
||||||
|
*
|
||||||
|
* $client = new Client([
|
||||||
|
* 'handler' => $stack,
|
||||||
|
* 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
|
||||||
|
* 'auth' => 'google_auth' // authorize all requests
|
||||||
|
* ]);
|
||||||
|
*
|
||||||
|
* $res = $client->get('myproject/taskqueues/myqueue');
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
class ApplicationDefaultCredentials
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*
|
||||||
|
* Obtains an AuthTokenSubscriber that uses the default FetchAuthTokenInterface
|
||||||
|
* implementation to use in this environment.
|
||||||
|
*
|
||||||
|
* If supplied, $scope is used to in creating the credentials instance if
|
||||||
|
* this does not fallback to the compute engine defaults.
|
||||||
|
*
|
||||||
|
* @param string|string[] $scope the scope of the access request, expressed
|
||||||
|
* either as an Array or as a space-delimited String.
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||||
|
* @param CacheItemPoolInterface $cache A cache implementation, may be
|
||||||
|
* provided if you have one already available for use.
|
||||||
|
* @return AuthTokenSubscriber
|
||||||
|
* @throws DomainException if no implementation can be obtained.
|
||||||
|
*/
|
||||||
|
public static function getSubscriber(// @phpstan-ignore-line
|
||||||
|
$scope = null,
|
||||||
|
callable $httpHandler = null,
|
||||||
|
array $cacheConfig = null,
|
||||||
|
CacheItemPoolInterface $cache = null
|
||||||
|
) {
|
||||||
|
$creds = self::getCredentials($scope, $httpHandler, $cacheConfig, $cache);
|
||||||
|
|
||||||
|
/** @phpstan-ignore-next-line */
|
||||||
|
return new AuthTokenSubscriber($creds, $httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains an AuthTokenMiddleware that uses the default FetchAuthTokenInterface
|
||||||
|
* implementation to use in this environment.
|
||||||
|
*
|
||||||
|
* If supplied, $scope is used to in creating the credentials instance if
|
||||||
|
* this does not fallback to the compute engine defaults.
|
||||||
|
*
|
||||||
|
* @param string|string[] $scope the scope of the access request, expressed
|
||||||
|
* either as an Array or as a space-delimited String.
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||||
|
* @param CacheItemPoolInterface $cache A cache implementation, may be
|
||||||
|
* provided if you have one already available for use.
|
||||||
|
* @param string $quotaProject specifies a project to bill for access
|
||||||
|
* charges associated with the request.
|
||||||
|
* @return AuthTokenMiddleware
|
||||||
|
* @throws DomainException if no implementation can be obtained.
|
||||||
|
*/
|
||||||
|
public static function getMiddleware(
|
||||||
|
$scope = null,
|
||||||
|
callable $httpHandler = null,
|
||||||
|
array $cacheConfig = null,
|
||||||
|
CacheItemPoolInterface $cache = null,
|
||||||
|
$quotaProject = null
|
||||||
|
) {
|
||||||
|
$creds = self::getCredentials($scope, $httpHandler, $cacheConfig, $cache, $quotaProject);
|
||||||
|
|
||||||
|
return new AuthTokenMiddleware($creds, $httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains the default FetchAuthTokenInterface implementation to use
|
||||||
|
* in this environment.
|
||||||
|
*
|
||||||
|
* @param string|string[] $scope the scope of the access request, expressed
|
||||||
|
* either as an Array or as a space-delimited String.
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||||
|
* @param CacheItemPoolInterface $cache A cache implementation, may be
|
||||||
|
* provided if you have one already available for use.
|
||||||
|
* @param string $quotaProject specifies a project to bill for access
|
||||||
|
* charges associated with the request.
|
||||||
|
* @param string|string[] $defaultScope The default scope to use if no
|
||||||
|
* user-defined scopes exist, expressed either as an Array or as a
|
||||||
|
* space-delimited string.
|
||||||
|
*
|
||||||
|
* @return FetchAuthTokenInterface
|
||||||
|
* @throws DomainException if no implementation can be obtained.
|
||||||
|
*/
|
||||||
|
public static function getCredentials(
|
||||||
|
$scope = null,
|
||||||
|
callable $httpHandler = null,
|
||||||
|
array $cacheConfig = null,
|
||||||
|
CacheItemPoolInterface $cache = null,
|
||||||
|
$quotaProject = null,
|
||||||
|
$defaultScope = null
|
||||||
|
) {
|
||||||
|
$creds = null;
|
||||||
|
$jsonKey = CredentialsLoader::fromEnv()
|
||||||
|
?: CredentialsLoader::fromWellKnownFile();
|
||||||
|
$anyScope = $scope ?: $defaultScope;
|
||||||
|
|
||||||
|
if (!$httpHandler) {
|
||||||
|
if (!($client = HttpClientCache::getHttpClient())) {
|
||||||
|
$client = new Client();
|
||||||
|
HttpClientCache::setHttpClient($client);
|
||||||
|
}
|
||||||
|
|
||||||
|
$httpHandler = HttpHandlerFactory::build($client);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_null($jsonKey)) {
|
||||||
|
if ($quotaProject) {
|
||||||
|
$jsonKey['quota_project_id'] = $quotaProject;
|
||||||
|
}
|
||||||
|
$creds = CredentialsLoader::makeCredentials(
|
||||||
|
$scope,
|
||||||
|
$jsonKey,
|
||||||
|
$defaultScope
|
||||||
|
);
|
||||||
|
} elseif (AppIdentityCredentials::onAppEngine() && !GCECredentials::onAppEngineFlexible()) {
|
||||||
|
$creds = new AppIdentityCredentials($anyScope);
|
||||||
|
} elseif (self::onGce($httpHandler, $cacheConfig, $cache)) {
|
||||||
|
$creds = new GCECredentials(null, $anyScope, null, $quotaProject);
|
||||||
|
$creds->setIsOnGce(true); // save the credentials a trip to the metadata server
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($creds)) {
|
||||||
|
throw new DomainException(self::notFound());
|
||||||
|
}
|
||||||
|
if (!is_null($cache)) {
|
||||||
|
$creds = new FetchAuthTokenCache($creds, $cacheConfig, $cache);
|
||||||
|
}
|
||||||
|
return $creds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains an AuthTokenMiddleware which will fetch an ID token to use in the
|
||||||
|
* Authorization header. The middleware is configured with the default
|
||||||
|
* FetchAuthTokenInterface implementation to use in this environment.
|
||||||
|
*
|
||||||
|
* If supplied, $targetAudience is used to set the "aud" on the resulting
|
||||||
|
* ID token.
|
||||||
|
*
|
||||||
|
* @param string $targetAudience The audience for the ID token.
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||||
|
* @param CacheItemPoolInterface $cache A cache implementation, may be
|
||||||
|
* provided if you have one already available for use.
|
||||||
|
* @return AuthTokenMiddleware
|
||||||
|
* @throws DomainException if no implementation can be obtained.
|
||||||
|
*/
|
||||||
|
public static function getIdTokenMiddleware(
|
||||||
|
$targetAudience,
|
||||||
|
callable $httpHandler = null,
|
||||||
|
array $cacheConfig = null,
|
||||||
|
CacheItemPoolInterface $cache = null
|
||||||
|
) {
|
||||||
|
$creds = self::getIdTokenCredentials($targetAudience, $httpHandler, $cacheConfig, $cache);
|
||||||
|
|
||||||
|
return new AuthTokenMiddleware($creds, $httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains an ProxyAuthTokenMiddleware which will fetch an ID token to use in the
|
||||||
|
* Authorization header. The middleware is configured with the default
|
||||||
|
* FetchAuthTokenInterface implementation to use in this environment.
|
||||||
|
*
|
||||||
|
* If supplied, $targetAudience is used to set the "aud" on the resulting
|
||||||
|
* ID token.
|
||||||
|
*
|
||||||
|
* @param string $targetAudience The audience for the ID token.
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||||
|
* @param CacheItemPoolInterface $cache A cache implementation, may be
|
||||||
|
* provided if you have one already available for use.
|
||||||
|
* @return ProxyAuthTokenMiddleware
|
||||||
|
* @throws DomainException if no implementation can be obtained.
|
||||||
|
*/
|
||||||
|
public static function getProxyIdTokenMiddleware(
|
||||||
|
$targetAudience,
|
||||||
|
callable $httpHandler = null,
|
||||||
|
array $cacheConfig = null,
|
||||||
|
CacheItemPoolInterface $cache = null
|
||||||
|
) {
|
||||||
|
$creds = self::getIdTokenCredentials($targetAudience, $httpHandler, $cacheConfig, $cache);
|
||||||
|
|
||||||
|
return new ProxyAuthTokenMiddleware($creds, $httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains the default FetchAuthTokenInterface implementation to use
|
||||||
|
* in this environment, configured with a $targetAudience for fetching an ID
|
||||||
|
* token.
|
||||||
|
*
|
||||||
|
* @param string $targetAudience The audience for the ID token.
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||||
|
* @param CacheItemPoolInterface $cache A cache implementation, may be
|
||||||
|
* provided if you have one already available for use.
|
||||||
|
* @return FetchAuthTokenInterface
|
||||||
|
* @throws DomainException if no implementation can be obtained.
|
||||||
|
* @throws InvalidArgumentException if JSON "type" key is invalid
|
||||||
|
*/
|
||||||
|
public static function getIdTokenCredentials(
|
||||||
|
$targetAudience,
|
||||||
|
callable $httpHandler = null,
|
||||||
|
array $cacheConfig = null,
|
||||||
|
CacheItemPoolInterface $cache = null
|
||||||
|
) {
|
||||||
|
$creds = null;
|
||||||
|
$jsonKey = CredentialsLoader::fromEnv()
|
||||||
|
?: CredentialsLoader::fromWellKnownFile();
|
||||||
|
|
||||||
|
if (!$httpHandler) {
|
||||||
|
if (!($client = HttpClientCache::getHttpClient())) {
|
||||||
|
$client = new Client();
|
||||||
|
HttpClientCache::setHttpClient($client);
|
||||||
|
}
|
||||||
|
|
||||||
|
$httpHandler = HttpHandlerFactory::build($client);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_null($jsonKey)) {
|
||||||
|
if (!array_key_exists('type', $jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException('json key is missing the type field');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($jsonKey['type'] == 'authorized_user') {
|
||||||
|
throw new InvalidArgumentException('ID tokens are not supported for end user credentials');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($jsonKey['type'] != 'service_account') {
|
||||||
|
throw new InvalidArgumentException('invalid value in the type field');
|
||||||
|
}
|
||||||
|
|
||||||
|
$creds = new ServiceAccountCredentials(null, $jsonKey, null, $targetAudience);
|
||||||
|
} elseif (self::onGce($httpHandler, $cacheConfig, $cache)) {
|
||||||
|
$creds = new GCECredentials(null, null, $targetAudience);
|
||||||
|
$creds->setIsOnGce(true); // save the credentials a trip to the metadata server
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_null($creds)) {
|
||||||
|
throw new DomainException(self::notFound());
|
||||||
|
}
|
||||||
|
if (!is_null($cache)) {
|
||||||
|
$creds = new FetchAuthTokenCache($creds, $cacheConfig, $cache);
|
||||||
|
}
|
||||||
|
return $creds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private static function notFound()
|
||||||
|
{
|
||||||
|
$msg = 'Your default credentials were not found. To set up ';
|
||||||
|
$msg .= 'Application Default Credentials, see ';
|
||||||
|
$msg .= 'https://cloud.google.com/docs/authentication/external/set-up-adc';
|
||||||
|
|
||||||
|
return $msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param callable $httpHandler
|
||||||
|
* @param array<mixed> $cacheConfig
|
||||||
|
* @param CacheItemPoolInterface $cache
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private static function onGce(
|
||||||
|
callable $httpHandler = null,
|
||||||
|
array $cacheConfig = null,
|
||||||
|
CacheItemPoolInterface $cache = null
|
||||||
|
) {
|
||||||
|
$gceCacheConfig = [];
|
||||||
|
foreach (['lifetime', 'prefix'] as $key) {
|
||||||
|
if (isset($cacheConfig['gce_' . $key])) {
|
||||||
|
$gceCacheConfig[$key] = $cacheConfig['gce_' . $key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (new GCECache($gceCacheConfig, $cache))->onGce($httpHandler);
|
||||||
|
}
|
||||||
|
}
|
||||||
24
common/vendor/google/auth/src/Cache/InvalidArgumentException.php
vendored
Normal file
24
common/vendor/google/auth/src/Cache/InvalidArgumentException.php
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2016 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Cache;
|
||||||
|
|
||||||
|
use Psr\Cache\InvalidArgumentException as PsrInvalidArgumentException;
|
||||||
|
|
||||||
|
class InvalidArgumentException extends \InvalidArgumentException implements PsrInvalidArgumentException
|
||||||
|
{
|
||||||
|
}
|
||||||
174
common/vendor/google/auth/src/Cache/Item.php
vendored
Normal file
174
common/vendor/google/auth/src/Cache/Item.php
vendored
Normal file
|
|
@ -0,0 +1,174 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2016 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Cache;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
|
use DateTimeInterface;
|
||||||
|
use DateTimeZone;
|
||||||
|
use Psr\Cache\CacheItemInterface;
|
||||||
|
use TypeError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A cache item.
|
||||||
|
*
|
||||||
|
* This class will be used by MemoryCacheItemPool and SysVCacheItemPool
|
||||||
|
* on PHP 7.4 and below. It is compatible with psr/cache 1.0 and 2.0 (PSR-6).
|
||||||
|
* @see TypedItem for compatiblity with psr/cache 3.0.
|
||||||
|
*/
|
||||||
|
final class Item implements CacheItemInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var mixed
|
||||||
|
*/
|
||||||
|
private $value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var DateTimeInterface|null
|
||||||
|
*/
|
||||||
|
private $expiration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private $isHit = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $key
|
||||||
|
*/
|
||||||
|
public function __construct($key)
|
||||||
|
{
|
||||||
|
$this->key = $key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getKey()
|
||||||
|
{
|
||||||
|
return $this->key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function get()
|
||||||
|
{
|
||||||
|
return $this->isHit() ? $this->value : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function isHit()
|
||||||
|
{
|
||||||
|
if (!$this->isHit) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->expiration === null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->currentTime()->getTimestamp() < $this->expiration->getTimestamp();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function set($value)
|
||||||
|
{
|
||||||
|
$this->isHit = true;
|
||||||
|
$this->value = $value;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function expiresAt($expiration)
|
||||||
|
{
|
||||||
|
if ($this->isValidExpiration($expiration)) {
|
||||||
|
$this->expiration = $expiration;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
$error = sprintf(
|
||||||
|
'Argument 1 passed to %s::expiresAt() must implement interface DateTimeInterface, %s given',
|
||||||
|
get_class($this),
|
||||||
|
gettype($expiration)
|
||||||
|
);
|
||||||
|
|
||||||
|
throw new TypeError($error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function expiresAfter($time)
|
||||||
|
{
|
||||||
|
if (is_int($time)) {
|
||||||
|
$this->expiration = $this->currentTime()->add(new \DateInterval("PT{$time}S"));
|
||||||
|
} elseif ($time instanceof \DateInterval) {
|
||||||
|
$this->expiration = $this->currentTime()->add($time);
|
||||||
|
} elseif ($time === null) {
|
||||||
|
$this->expiration = $time;
|
||||||
|
} else {
|
||||||
|
$message = 'Argument 1 passed to %s::expiresAfter() must be an ' .
|
||||||
|
'instance of DateInterval or of the type integer, %s given';
|
||||||
|
$error = sprintf($message, get_class($this), gettype($time));
|
||||||
|
|
||||||
|
throw new TypeError($error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if an expiration is valid based on the rules defined by PSR6.
|
||||||
|
*
|
||||||
|
* @param mixed $expiration
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function isValidExpiration($expiration)
|
||||||
|
{
|
||||||
|
if ($expiration === null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($expiration instanceof DateTimeInterface) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return DateTime
|
||||||
|
*/
|
||||||
|
protected function currentTime()
|
||||||
|
{
|
||||||
|
return new DateTime('now', new DateTimeZone('UTC'));
|
||||||
|
}
|
||||||
|
}
|
||||||
183
common/vendor/google/auth/src/Cache/MemoryCacheItemPool.php
vendored
Normal file
183
common/vendor/google/auth/src/Cache/MemoryCacheItemPool.php
vendored
Normal file
|
|
@ -0,0 +1,183 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2016 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Cache;
|
||||||
|
|
||||||
|
use Psr\Cache\CacheItemInterface;
|
||||||
|
use Psr\Cache\CacheItemPoolInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple in-memory cache implementation.
|
||||||
|
*/
|
||||||
|
final class MemoryCacheItemPool implements CacheItemPoolInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var CacheItemInterface[]
|
||||||
|
*/
|
||||||
|
private $items;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var CacheItemInterface[]
|
||||||
|
*/
|
||||||
|
private $deferredItems;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @return CacheItemInterface The corresponding Cache Item.
|
||||||
|
*/
|
||||||
|
public function getItem($key): CacheItemInterface
|
||||||
|
{
|
||||||
|
return current($this->getItems([$key])); // @phpstan-ignore-line
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @return iterable<CacheItemInterface>
|
||||||
|
* A traversable collection of Cache Items keyed by the cache keys of
|
||||||
|
* each item. A Cache item will be returned for each key, even if that
|
||||||
|
* key is not found. However, if no keys are specified then an empty
|
||||||
|
* traversable MUST be returned instead.
|
||||||
|
*/
|
||||||
|
public function getItems(array $keys = []): iterable
|
||||||
|
{
|
||||||
|
$items = [];
|
||||||
|
$itemClass = \PHP_VERSION_ID >= 80000 ? TypedItem::class : Item::class;
|
||||||
|
foreach ($keys as $key) {
|
||||||
|
$items[$key] = $this->hasItem($key) ? clone $this->items[$key] : new $itemClass($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $items;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
* True if item exists in the cache, false otherwise.
|
||||||
|
*/
|
||||||
|
public function hasItem($key): bool
|
||||||
|
{
|
||||||
|
$this->isValidKey($key);
|
||||||
|
|
||||||
|
return isset($this->items[$key]) && $this->items[$key]->isHit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
* True if the pool was successfully cleared. False if there was an error.
|
||||||
|
*/
|
||||||
|
public function clear(): bool
|
||||||
|
{
|
||||||
|
$this->items = [];
|
||||||
|
$this->deferredItems = [];
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
* True if the item was successfully removed. False if there was an error.
|
||||||
|
*/
|
||||||
|
public function deleteItem($key): bool
|
||||||
|
{
|
||||||
|
return $this->deleteItems([$key]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
* True if the items were successfully removed. False if there was an error.
|
||||||
|
*/
|
||||||
|
public function deleteItems(array $keys): bool
|
||||||
|
{
|
||||||
|
array_walk($keys, [$this, 'isValidKey']);
|
||||||
|
|
||||||
|
foreach ($keys as $key) {
|
||||||
|
unset($this->items[$key]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
* True if the item was successfully persisted. False if there was an error.
|
||||||
|
*/
|
||||||
|
public function save(CacheItemInterface $item): bool
|
||||||
|
{
|
||||||
|
$this->items[$item->getKey()] = $item;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
* False if the item could not be queued or if a commit was attempted and failed. True otherwise.
|
||||||
|
*/
|
||||||
|
public function saveDeferred(CacheItemInterface $item): bool
|
||||||
|
{
|
||||||
|
$this->deferredItems[$item->getKey()] = $item;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
* True if all not-yet-saved items were successfully saved or there were none. False otherwise.
|
||||||
|
*/
|
||||||
|
public function commit(): bool
|
||||||
|
{
|
||||||
|
foreach ($this->deferredItems as $item) {
|
||||||
|
$this->save($item);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->deferredItems = [];
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if the provided key is valid.
|
||||||
|
*
|
||||||
|
* @param string $key
|
||||||
|
* @return bool
|
||||||
|
* @throws InvalidArgumentException
|
||||||
|
*/
|
||||||
|
private function isValidKey($key)
|
||||||
|
{
|
||||||
|
$invalidCharacters = '{}()/\\\\@:';
|
||||||
|
|
||||||
|
if (!is_string($key) || preg_match("#[$invalidCharacters]#", $key)) {
|
||||||
|
throw new InvalidArgumentException('The provided key is not valid: ' . var_export($key, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
249
common/vendor/google/auth/src/Cache/SysVCacheItemPool.php
vendored
Normal file
249
common/vendor/google/auth/src/Cache/SysVCacheItemPool.php
vendored
Normal file
|
|
@ -0,0 +1,249 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright 2018 Google Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
namespace Google\Auth\Cache;
|
||||||
|
|
||||||
|
use Psr\Cache\CacheItemInterface;
|
||||||
|
use Psr\Cache\CacheItemPoolInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SystemV shared memory based CacheItemPool implementation.
|
||||||
|
*
|
||||||
|
* This CacheItemPool implementation can be used among multiple processes, but
|
||||||
|
* it doesn't provide any locking mechanism. If multiple processes write to
|
||||||
|
* this ItemPool, you have to avoid race condition manually in your code.
|
||||||
|
*/
|
||||||
|
class SysVCacheItemPool implements CacheItemPoolInterface
|
||||||
|
{
|
||||||
|
const VAR_KEY = 1;
|
||||||
|
|
||||||
|
const DEFAULT_PROJ = 'A';
|
||||||
|
|
||||||
|
const DEFAULT_MEMSIZE = 10000;
|
||||||
|
|
||||||
|
const DEFAULT_PERM = 0600;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
private $sysvKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var CacheItemInterface[]
|
||||||
|
*/
|
||||||
|
private $items;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var CacheItemInterface[]
|
||||||
|
*/
|
||||||
|
private $deferredItems;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<mixed>
|
||||||
|
*/
|
||||||
|
private $options;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private $hasLoadedItems = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a SystemV shared memory based CacheItemPool.
|
||||||
|
*
|
||||||
|
* @param array<mixed> $options {
|
||||||
|
* [optional] Configuration options.
|
||||||
|
*
|
||||||
|
* @type int $variableKey The variable key for getting the data from the shared memory. **Defaults to** 1.
|
||||||
|
* @type string $proj The project identifier for ftok. This needs to be a one character string.
|
||||||
|
* **Defaults to** 'A'.
|
||||||
|
* @type int $memsize The memory size in bytes for shm_attach. **Defaults to** 10000.
|
||||||
|
* @type int $perm The permission for shm_attach. **Defaults to** 0600.
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
public function __construct($options = [])
|
||||||
|
{
|
||||||
|
if (! extension_loaded('sysvshm')) {
|
||||||
|
throw new \RuntimeException(
|
||||||
|
'sysvshm extension is required to use this ItemPool'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$this->options = $options + [
|
||||||
|
'variableKey' => self::VAR_KEY,
|
||||||
|
'proj' => self::DEFAULT_PROJ,
|
||||||
|
'memsize' => self::DEFAULT_MEMSIZE,
|
||||||
|
'perm' => self::DEFAULT_PERM
|
||||||
|
];
|
||||||
|
$this->items = [];
|
||||||
|
$this->deferredItems = [];
|
||||||
|
$this->sysvKey = ftok(__FILE__, $this->options['proj']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $key
|
||||||
|
* @return CacheItemInterface
|
||||||
|
*/
|
||||||
|
public function getItem($key): CacheItemInterface
|
||||||
|
{
|
||||||
|
$this->loadItems();
|
||||||
|
return current($this->getItems([$key])); // @phpstan-ignore-line
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<mixed> $keys
|
||||||
|
* @return iterable<CacheItemInterface>
|
||||||
|
*/
|
||||||
|
public function getItems(array $keys = []): iterable
|
||||||
|
{
|
||||||
|
$this->loadItems();
|
||||||
|
$items = [];
|
||||||
|
$itemClass = \PHP_VERSION_ID >= 80000 ? TypedItem::class : Item::class;
|
||||||
|
foreach ($keys as $key) {
|
||||||
|
$items[$key] = $this->hasItem($key) ?
|
||||||
|
clone $this->items[$key] :
|
||||||
|
new $itemClass($key);
|
||||||
|
}
|
||||||
|
return $items;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function hasItem($key): bool
|
||||||
|
{
|
||||||
|
$this->loadItems();
|
||||||
|
return isset($this->items[$key]) && $this->items[$key]->isHit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function clear(): bool
|
||||||
|
{
|
||||||
|
$this->items = [];
|
||||||
|
$this->deferredItems = [];
|
||||||
|
return $this->saveCurrentItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function deleteItem($key): bool
|
||||||
|
{
|
||||||
|
return $this->deleteItems([$key]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function deleteItems(array $keys): bool
|
||||||
|
{
|
||||||
|
if (!$this->hasLoadedItems) {
|
||||||
|
$this->loadItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($keys as $key) {
|
||||||
|
unset($this->items[$key]);
|
||||||
|
}
|
||||||
|
return $this->saveCurrentItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function save(CacheItemInterface $item): bool
|
||||||
|
{
|
||||||
|
if (!$this->hasLoadedItems) {
|
||||||
|
$this->loadItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->items[$item->getKey()] = $item;
|
||||||
|
return $this->saveCurrentItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function saveDeferred(CacheItemInterface $item): bool
|
||||||
|
{
|
||||||
|
$this->deferredItems[$item->getKey()] = $item;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function commit(): bool
|
||||||
|
{
|
||||||
|
foreach ($this->deferredItems as $item) {
|
||||||
|
if ($this->save($item) === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->deferredItems = [];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the current items.
|
||||||
|
*
|
||||||
|
* @return bool true when success, false upon failure
|
||||||
|
*/
|
||||||
|
private function saveCurrentItems()
|
||||||
|
{
|
||||||
|
$shmid = shm_attach(
|
||||||
|
$this->sysvKey,
|
||||||
|
$this->options['memsize'],
|
||||||
|
$this->options['perm']
|
||||||
|
);
|
||||||
|
if ($shmid !== false) {
|
||||||
|
$ret = shm_put_var(
|
||||||
|
$shmid,
|
||||||
|
$this->options['variableKey'],
|
||||||
|
$this->items
|
||||||
|
);
|
||||||
|
shm_detach($shmid);
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the items from the shared memory.
|
||||||
|
*
|
||||||
|
* @return bool true when success, false upon failure
|
||||||
|
*/
|
||||||
|
private function loadItems()
|
||||||
|
{
|
||||||
|
$shmid = shm_attach(
|
||||||
|
$this->sysvKey,
|
||||||
|
$this->options['memsize'],
|
||||||
|
$this->options['perm']
|
||||||
|
);
|
||||||
|
if ($shmid !== false) {
|
||||||
|
$data = @shm_get_var($shmid, $this->options['variableKey']);
|
||||||
|
if (!empty($data)) {
|
||||||
|
$this->items = $data;
|
||||||
|
} else {
|
||||||
|
$this->items = [];
|
||||||
|
}
|
||||||
|
shm_detach($shmid);
|
||||||
|
$this->hasLoadedItems = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
170
common/vendor/google/auth/src/Cache/TypedItem.php
vendored
Normal file
170
common/vendor/google/auth/src/Cache/TypedItem.php
vendored
Normal file
|
|
@ -0,0 +1,170 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2022 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Cache;
|
||||||
|
|
||||||
|
use Psr\Cache\CacheItemInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A cache item.
|
||||||
|
*
|
||||||
|
* This class will be used by MemoryCacheItemPool and SysVCacheItemPool
|
||||||
|
* on PHP 8.0 and above. It is compatible with psr/cache 3.0 (PSR-6).
|
||||||
|
* @see Item for compatiblity with previous versions of PHP.
|
||||||
|
*/
|
||||||
|
final class TypedItem implements CacheItemInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var mixed
|
||||||
|
*/
|
||||||
|
private mixed $value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \DateTimeInterface|null
|
||||||
|
*/
|
||||||
|
private ?\DateTimeInterface $expiration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private bool $isHit = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $key
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
private string $key
|
||||||
|
) {
|
||||||
|
$this->key = $key;
|
||||||
|
$this->expiration = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getKey(): string
|
||||||
|
{
|
||||||
|
return $this->key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function get(): mixed
|
||||||
|
{
|
||||||
|
return $this->isHit() ? $this->value : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function isHit(): bool
|
||||||
|
{
|
||||||
|
if (!$this->isHit) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->expiration === null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->currentTime()->getTimestamp() < $this->expiration->getTimestamp();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function set(mixed $value): static
|
||||||
|
{
|
||||||
|
$this->isHit = true;
|
||||||
|
$this->value = $value;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function expiresAt($expiration): static
|
||||||
|
{
|
||||||
|
if ($this->isValidExpiration($expiration)) {
|
||||||
|
$this->expiration = $expiration;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
$error = sprintf(
|
||||||
|
'Argument 1 passed to %s::expiresAt() must implement interface DateTimeInterface, %s given',
|
||||||
|
get_class($this),
|
||||||
|
gettype($expiration)
|
||||||
|
);
|
||||||
|
|
||||||
|
throw new \TypeError($error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function expiresAfter($time): static
|
||||||
|
{
|
||||||
|
if (is_int($time)) {
|
||||||
|
$this->expiration = $this->currentTime()->add(new \DateInterval("PT{$time}S"));
|
||||||
|
} elseif ($time instanceof \DateInterval) {
|
||||||
|
$this->expiration = $this->currentTime()->add($time);
|
||||||
|
} elseif ($time === null) {
|
||||||
|
$this->expiration = $time;
|
||||||
|
} else {
|
||||||
|
$message = 'Argument 1 passed to %s::expiresAfter() must be an ' .
|
||||||
|
'instance of DateInterval or of the type integer, %s given';
|
||||||
|
$error = sprintf($message, get_class($this), gettype($time));
|
||||||
|
|
||||||
|
throw new \TypeError($error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if an expiration is valid based on the rules defined by PSR6.
|
||||||
|
*
|
||||||
|
* @param mixed $expiration
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function isValidExpiration($expiration)
|
||||||
|
{
|
||||||
|
if ($expiration === null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We test for two types here due to the fact the DateTimeInterface
|
||||||
|
// was not introduced until PHP 5.5. Checking for the DateTime type as
|
||||||
|
// well allows us to support 5.4.
|
||||||
|
if ($expiration instanceof \DateTimeInterface) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \DateTime
|
||||||
|
*/
|
||||||
|
protected function currentTime()
|
||||||
|
{
|
||||||
|
return new \DateTime('now', new \DateTimeZone('UTC'));
|
||||||
|
}
|
||||||
|
}
|
||||||
110
common/vendor/google/auth/src/CacheTrait.php
vendored
Normal file
110
common/vendor/google/auth/src/CacheTrait.php
vendored
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
use Psr\Cache\CacheItemPoolInterface;
|
||||||
|
|
||||||
|
trait CacheTrait
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
private $maxKeyLength = 64;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<mixed>
|
||||||
|
*/
|
||||||
|
private $cacheConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var ?CacheItemPoolInterface
|
||||||
|
*/
|
||||||
|
private $cache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the cached value if it is present in the cache when that is
|
||||||
|
* available.
|
||||||
|
*
|
||||||
|
* @param mixed $k
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
private function getCachedValue($k)
|
||||||
|
{
|
||||||
|
if (is_null($this->cache)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = $this->getFullCacheKey($k);
|
||||||
|
if (is_null($key)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$cacheItem = $this->cache->getItem($key);
|
||||||
|
if ($cacheItem->isHit()) {
|
||||||
|
return $cacheItem->get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Saves the value in the cache when that is available.
|
||||||
|
*
|
||||||
|
* @param mixed $k
|
||||||
|
* @param mixed $v
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
private function setCachedValue($k, $v)
|
||||||
|
{
|
||||||
|
if (is_null($this->cache)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = $this->getFullCacheKey($k);
|
||||||
|
if (is_null($key)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$cacheItem = $this->cache->getItem($key);
|
||||||
|
$cacheItem->set($v);
|
||||||
|
$cacheItem->expiresAfter($this->cacheConfig['lifetime']);
|
||||||
|
return $this->cache->save($cacheItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param null|string $key
|
||||||
|
* @return null|string
|
||||||
|
*/
|
||||||
|
private function getFullCacheKey($key)
|
||||||
|
{
|
||||||
|
if (is_null($key)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = $this->cacheConfig['prefix'] . $key;
|
||||||
|
|
||||||
|
// ensure we do not have illegal characters
|
||||||
|
$key = preg_replace('|[^a-zA-Z0-9_\.!]|', '', $key);
|
||||||
|
|
||||||
|
// Hash keys if they exceed $maxKeyLength (defaults to 64)
|
||||||
|
if ($this->maxKeyLength && strlen($key) > $this->maxKeyLength) {
|
||||||
|
$key = substr(hash('sha256', $key), 0, $this->maxKeyLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $key;
|
||||||
|
}
|
||||||
|
}
|
||||||
238
common/vendor/google/auth/src/Credentials/AppIdentityCredentials.php
vendored
Normal file
238
common/vendor/google/auth/src/Credentials/AppIdentityCredentials.php
vendored
Normal file
|
|
@ -0,0 +1,238 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Credentials;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The AppIdentityService class is automatically defined on App Engine,
|
||||||
|
* so including this dependency is not necessary, and will result in a
|
||||||
|
* PHP fatal error in the App Engine environment.
|
||||||
|
*/
|
||||||
|
use google\appengine\api\app_identity\AppIdentityService;
|
||||||
|
use Google\Auth\CredentialsLoader;
|
||||||
|
use Google\Auth\ProjectIdProviderInterface;
|
||||||
|
use Google\Auth\SignBlobInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*
|
||||||
|
* AppIdentityCredentials supports authorization on Google App Engine.
|
||||||
|
*
|
||||||
|
* It can be used to authorize requests using the AuthTokenMiddleware or
|
||||||
|
* AuthTokenSubscriber, but will only succeed if being run on App Engine:
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* ```
|
||||||
|
* use Google\Auth\Credentials\AppIdentityCredentials;
|
||||||
|
* use Google\Auth\Middleware\AuthTokenMiddleware;
|
||||||
|
* use GuzzleHttp\Client;
|
||||||
|
* use GuzzleHttp\HandlerStack;
|
||||||
|
*
|
||||||
|
* $gae = new AppIdentityCredentials('https://www.googleapis.com/auth/books');
|
||||||
|
* $middleware = new AuthTokenMiddleware($gae);
|
||||||
|
* $stack = HandlerStack::create();
|
||||||
|
* $stack->push($middleware);
|
||||||
|
*
|
||||||
|
* $client = new Client([
|
||||||
|
* 'handler' => $stack,
|
||||||
|
* 'base_uri' => 'https://www.googleapis.com/books/v1',
|
||||||
|
* 'auth' => 'google_auth'
|
||||||
|
* ]);
|
||||||
|
*
|
||||||
|
* $res = $client->get('volumes?q=Henry+David+Thoreau&country=US');
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
class AppIdentityCredentials extends CredentialsLoader implements
|
||||||
|
SignBlobInterface,
|
||||||
|
ProjectIdProviderInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Result of fetchAuthToken.
|
||||||
|
*
|
||||||
|
* @var array<mixed>
|
||||||
|
*/
|
||||||
|
protected $lastReceivedToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of OAuth2 scopes to be requested.
|
||||||
|
*
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
|
private $scope;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $clientName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string|string[] $scope One or more scopes.
|
||||||
|
*/
|
||||||
|
public function __construct($scope = [])
|
||||||
|
{
|
||||||
|
$this->scope = is_array($scope) ? $scope : explode(' ', (string) $scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if this an App Engine instance, by accessing the
|
||||||
|
* SERVER_SOFTWARE environment variable (prod) or the APPENGINE_RUNTIME
|
||||||
|
* environment variable (dev).
|
||||||
|
*
|
||||||
|
* @return bool true if this an App Engine Instance, false otherwise
|
||||||
|
*/
|
||||||
|
public static function onAppEngine()
|
||||||
|
{
|
||||||
|
$appEngineProduction = isset($_SERVER['SERVER_SOFTWARE']) &&
|
||||||
|
0 === strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine');
|
||||||
|
if ($appEngineProduction) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
$appEngineDevAppServer = isset($_SERVER['APPENGINE_RUNTIME']) &&
|
||||||
|
$_SERVER['APPENGINE_RUNTIME'] == 'php';
|
||||||
|
if ($appEngineDevAppServer) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements FetchAuthTokenInterface#fetchAuthToken.
|
||||||
|
*
|
||||||
|
* Fetches the auth tokens using the AppIdentityService if available.
|
||||||
|
* As the AppIdentityService uses protobufs to fetch the access token,
|
||||||
|
* the GuzzleHttp\ClientInterface instance passed in will not be used.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @return array<mixed> {
|
||||||
|
* A set of auth related metadata, containing the following
|
||||||
|
*
|
||||||
|
* @type string $access_token
|
||||||
|
* @type string $expiration_time
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
public function fetchAuthToken(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->checkAppEngineContext();
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @phpstan-ignore-next-line */
|
||||||
|
$token = AppIdentityService::getAccessToken($this->scope);
|
||||||
|
$this->lastReceivedToken = $token;
|
||||||
|
|
||||||
|
return $token;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign a string using AppIdentityService.
|
||||||
|
*
|
||||||
|
* @param string $stringToSign The string to sign.
|
||||||
|
* @param bool $forceOpenSsl [optional] Does not apply to this credentials
|
||||||
|
* type.
|
||||||
|
* @return string The signature, base64-encoded.
|
||||||
|
* @throws \Exception If AppEngine SDK or mock is not available.
|
||||||
|
*/
|
||||||
|
public function signBlob($stringToSign, $forceOpenSsl = false)
|
||||||
|
{
|
||||||
|
$this->checkAppEngineContext();
|
||||||
|
|
||||||
|
/** @phpstan-ignore-next-line */
|
||||||
|
return base64_encode(AppIdentityService::signForApp($stringToSign)['signature']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the project ID from AppIdentityService.
|
||||||
|
*
|
||||||
|
* Returns null if AppIdentityService is unavailable.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler Not used by this type.
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getProjectId(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->checkAppEngineContext();
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @phpstan-ignore-next-line */
|
||||||
|
return AppIdentityService::getApplicationId();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the client name from AppIdentityService.
|
||||||
|
*
|
||||||
|
* Subsequent calls to this method will return a cached value.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler Not used in this implementation.
|
||||||
|
* @return string
|
||||||
|
* @throws \Exception If AppEngine SDK or mock is not available.
|
||||||
|
*/
|
||||||
|
public function getClientName(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
$this->checkAppEngineContext();
|
||||||
|
|
||||||
|
if (!$this->clientName) {
|
||||||
|
/** @phpstan-ignore-next-line */
|
||||||
|
$this->clientName = AppIdentityService::getServiceAccountName();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->clientName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array{access_token:string,expires_at:int}|null
|
||||||
|
*/
|
||||||
|
public function getLastReceivedToken()
|
||||||
|
{
|
||||||
|
if ($this->lastReceivedToken) {
|
||||||
|
return [
|
||||||
|
'access_token' => $this->lastReceivedToken['access_token'],
|
||||||
|
'expires_at' => $this->lastReceivedToken['expiration_time'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Caching is handled by the underlying AppIdentityService, return empty string
|
||||||
|
* to prevent caching.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCacheKey()
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function checkAppEngineContext()
|
||||||
|
{
|
||||||
|
if (!self::onAppEngine() || !class_exists('google\appengine\api\app_identity\AppIdentityService')) {
|
||||||
|
throw new \Exception(
|
||||||
|
'This class must be run in App Engine, or you must include the AppIdentityService '
|
||||||
|
. 'mock class defined in tests/mocks/AppIdentityService.php'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
527
common/vendor/google/auth/src/Credentials/GCECredentials.php
vendored
Normal file
527
common/vendor/google/auth/src/Credentials/GCECredentials.php
vendored
Normal file
|
|
@ -0,0 +1,527 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Credentials;
|
||||||
|
|
||||||
|
use Google\Auth\CredentialsLoader;
|
||||||
|
use Google\Auth\GetQuotaProjectInterface;
|
||||||
|
use Google\Auth\HttpHandler\HttpClientCache;
|
||||||
|
use Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||||
|
use Google\Auth\Iam;
|
||||||
|
use Google\Auth\IamSignerTrait;
|
||||||
|
use Google\Auth\ProjectIdProviderInterface;
|
||||||
|
use Google\Auth\SignBlobInterface;
|
||||||
|
use GuzzleHttp\Exception\ClientException;
|
||||||
|
use GuzzleHttp\Exception\ConnectException;
|
||||||
|
use GuzzleHttp\Exception\RequestException;
|
||||||
|
use GuzzleHttp\Exception\ServerException;
|
||||||
|
use GuzzleHttp\Psr7\Request;
|
||||||
|
use InvalidArgumentException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GCECredentials supports authorization on Google Compute Engine.
|
||||||
|
*
|
||||||
|
* It can be used to authorize requests using the AuthTokenMiddleware, but will
|
||||||
|
* only succeed if being run on GCE:
|
||||||
|
*
|
||||||
|
* use Google\Auth\Credentials\GCECredentials;
|
||||||
|
* use Google\Auth\Middleware\AuthTokenMiddleware;
|
||||||
|
* use GuzzleHttp\Client;
|
||||||
|
* use GuzzleHttp\HandlerStack;
|
||||||
|
*
|
||||||
|
* $gce = new GCECredentials();
|
||||||
|
* $middleware = new AuthTokenMiddleware($gce);
|
||||||
|
* $stack = HandlerStack::create();
|
||||||
|
* $stack->push($middleware);
|
||||||
|
*
|
||||||
|
* $client = new Client([
|
||||||
|
* 'handler' => $stack,
|
||||||
|
* 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
|
||||||
|
* 'auth' => 'google_auth'
|
||||||
|
* ]);
|
||||||
|
*
|
||||||
|
* $res = $client->get('myproject/taskqueues/myqueue');
|
||||||
|
*/
|
||||||
|
class GCECredentials extends CredentialsLoader implements
|
||||||
|
SignBlobInterface,
|
||||||
|
ProjectIdProviderInterface,
|
||||||
|
GetQuotaProjectInterface
|
||||||
|
{
|
||||||
|
use IamSignerTrait;
|
||||||
|
|
||||||
|
// phpcs:disable
|
||||||
|
const cacheKey = 'GOOGLE_AUTH_PHP_GCE';
|
||||||
|
// phpcs:enable
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The metadata IP address on appengine instances.
|
||||||
|
*
|
||||||
|
* The IP is used instead of the domain 'metadata' to avoid slow responses
|
||||||
|
* when not on Compute Engine.
|
||||||
|
*/
|
||||||
|
const METADATA_IP = '169.254.169.254';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The metadata path of the default token.
|
||||||
|
*/
|
||||||
|
const TOKEN_URI_PATH = 'v1/instance/service-accounts/default/token';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The metadata path of the default id token.
|
||||||
|
*/
|
||||||
|
const ID_TOKEN_URI_PATH = 'v1/instance/service-accounts/default/identity';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The metadata path of the client ID.
|
||||||
|
*/
|
||||||
|
const CLIENT_ID_URI_PATH = 'v1/instance/service-accounts/default/email';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The metadata path of the project ID.
|
||||||
|
*/
|
||||||
|
const PROJECT_ID_URI_PATH = 'v1/project/project-id';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The header whose presence indicates GCE presence.
|
||||||
|
*/
|
||||||
|
const FLAVOR_HEADER = 'Metadata-Flavor';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Note: the explicit `timeout` and `tries` below is a workaround. The underlying
|
||||||
|
* issue is that resolving an unknown host on some networks will take
|
||||||
|
* 20-30 seconds; making this timeout short fixes the issue, but
|
||||||
|
* could lead to false negatives in the event that we are on GCE, but
|
||||||
|
* the metadata resolution was particularly slow. The latter case is
|
||||||
|
* "unlikely" since the expected 4-nines time is about 0.5 seconds.
|
||||||
|
* This allows us to limit the total ping maximum timeout to 1.5 seconds
|
||||||
|
* for developer desktop scenarios.
|
||||||
|
*/
|
||||||
|
const MAX_COMPUTE_PING_TRIES = 3;
|
||||||
|
const COMPUTE_PING_CONNECTION_TIMEOUT_S = 0.5;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag used to ensure that the onGCE test is only done once;.
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private $hasCheckedOnGce = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag that stores the value of the onGCE check.
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private $isOnGce = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result of fetchAuthToken.
|
||||||
|
*
|
||||||
|
* @var array<mixed>
|
||||||
|
*/
|
||||||
|
protected $lastReceivedToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|null
|
||||||
|
*/
|
||||||
|
private $clientName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|null
|
||||||
|
*/
|
||||||
|
private $projectId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $tokenUri;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $targetAudience;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|null
|
||||||
|
*/
|
||||||
|
private $quotaProject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|null
|
||||||
|
*/
|
||||||
|
private $serviceAccountIdentity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Iam $iam [optional] An IAM instance.
|
||||||
|
* @param string|string[] $scope [optional] the scope of the access request,
|
||||||
|
* expressed either as an array or as a space-delimited string.
|
||||||
|
* @param string $targetAudience [optional] The audience for the ID token.
|
||||||
|
* @param string $quotaProject [optional] Specifies a project to bill for access
|
||||||
|
* charges associated with the request.
|
||||||
|
* @param string $serviceAccountIdentity [optional] Specify a service
|
||||||
|
* account identity name to use instead of "default".
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
Iam $iam = null,
|
||||||
|
$scope = null,
|
||||||
|
$targetAudience = null,
|
||||||
|
$quotaProject = null,
|
||||||
|
$serviceAccountIdentity = null
|
||||||
|
) {
|
||||||
|
$this->iam = $iam;
|
||||||
|
|
||||||
|
if ($scope && $targetAudience) {
|
||||||
|
throw new InvalidArgumentException(
|
||||||
|
'Scope and targetAudience cannot both be supplied'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$tokenUri = self::getTokenUri($serviceAccountIdentity);
|
||||||
|
if ($scope) {
|
||||||
|
if (is_string($scope)) {
|
||||||
|
$scope = explode(' ', $scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope = implode(',', $scope);
|
||||||
|
|
||||||
|
$tokenUri = $tokenUri . '?scopes=' . $scope;
|
||||||
|
} elseif ($targetAudience) {
|
||||||
|
$tokenUri = self::getIdTokenUri($serviceAccountIdentity);
|
||||||
|
$tokenUri = $tokenUri . '?audience=' . $targetAudience;
|
||||||
|
$this->targetAudience = $targetAudience;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->tokenUri = $tokenUri;
|
||||||
|
$this->quotaProject = $quotaProject;
|
||||||
|
$this->serviceAccountIdentity = $serviceAccountIdentity;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The full uri for accessing the default token.
|
||||||
|
*
|
||||||
|
* @param string $serviceAccountIdentity [optional] Specify a service
|
||||||
|
* account identity name to use instead of "default".
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function getTokenUri($serviceAccountIdentity = null)
|
||||||
|
{
|
||||||
|
$base = 'http://' . self::METADATA_IP . '/computeMetadata/';
|
||||||
|
$base .= self::TOKEN_URI_PATH;
|
||||||
|
|
||||||
|
if ($serviceAccountIdentity) {
|
||||||
|
return str_replace(
|
||||||
|
'/default/',
|
||||||
|
'/' . $serviceAccountIdentity . '/',
|
||||||
|
$base
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $base;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The full uri for accessing the default service account.
|
||||||
|
*
|
||||||
|
* @param string $serviceAccountIdentity [optional] Specify a service
|
||||||
|
* account identity name to use instead of "default".
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function getClientNameUri($serviceAccountIdentity = null)
|
||||||
|
{
|
||||||
|
$base = 'http://' . self::METADATA_IP . '/computeMetadata/';
|
||||||
|
$base .= self::CLIENT_ID_URI_PATH;
|
||||||
|
|
||||||
|
if ($serviceAccountIdentity) {
|
||||||
|
return str_replace(
|
||||||
|
'/default/',
|
||||||
|
'/' . $serviceAccountIdentity . '/',
|
||||||
|
$base
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $base;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The full uri for accesesing the default identity token.
|
||||||
|
*
|
||||||
|
* @param string $serviceAccountIdentity [optional] Specify a service
|
||||||
|
* account identity name to use instead of "default".
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private static function getIdTokenUri($serviceAccountIdentity = null)
|
||||||
|
{
|
||||||
|
$base = 'http://' . self::METADATA_IP . '/computeMetadata/';
|
||||||
|
$base .= self::ID_TOKEN_URI_PATH;
|
||||||
|
|
||||||
|
if ($serviceAccountIdentity) {
|
||||||
|
return str_replace(
|
||||||
|
'/default/',
|
||||||
|
'/' . $serviceAccountIdentity . '/',
|
||||||
|
$base
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $base;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The full uri for accessing the default project ID.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private static function getProjectIdUri()
|
||||||
|
{
|
||||||
|
$base = 'http://' . self::METADATA_IP . '/computeMetadata/';
|
||||||
|
|
||||||
|
return $base . self::PROJECT_ID_URI_PATH;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if this an App Engine Flexible instance, by accessing the
|
||||||
|
* GAE_INSTANCE environment variable.
|
||||||
|
*
|
||||||
|
* @return bool true if this an App Engine Flexible Instance, false otherwise
|
||||||
|
*/
|
||||||
|
public static function onAppEngineFlexible()
|
||||||
|
{
|
||||||
|
return substr((string) getenv('GAE_INSTANCE'), 0, 4) === 'aef-';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if this a GCE instance, by accessing the expected metadata
|
||||||
|
* host.
|
||||||
|
* If $httpHandler is not specified a the default HttpHandler is used.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @return bool True if this a GCEInstance, false otherwise
|
||||||
|
*/
|
||||||
|
public static function onGce(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
$httpHandler = $httpHandler
|
||||||
|
?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||||
|
|
||||||
|
$checkUri = 'http://' . self::METADATA_IP;
|
||||||
|
for ($i = 1; $i <= self::MAX_COMPUTE_PING_TRIES; $i++) {
|
||||||
|
try {
|
||||||
|
// Comment from: oauth2client/client.py
|
||||||
|
//
|
||||||
|
// Note: the explicit `timeout` below is a workaround. The underlying
|
||||||
|
// issue is that resolving an unknown host on some networks will take
|
||||||
|
// 20-30 seconds; making this timeout short fixes the issue, but
|
||||||
|
// could lead to false negatives in the event that we are on GCE, but
|
||||||
|
// the metadata resolution was particularly slow. The latter case is
|
||||||
|
// "unlikely".
|
||||||
|
$resp = $httpHandler(
|
||||||
|
new Request(
|
||||||
|
'GET',
|
||||||
|
$checkUri,
|
||||||
|
[self::FLAVOR_HEADER => 'Google']
|
||||||
|
),
|
||||||
|
['timeout' => self::COMPUTE_PING_CONNECTION_TIMEOUT_S]
|
||||||
|
);
|
||||||
|
|
||||||
|
return $resp->getHeaderLine(self::FLAVOR_HEADER) == 'Google';
|
||||||
|
} catch (ClientException $e) {
|
||||||
|
} catch (ServerException $e) {
|
||||||
|
} catch (RequestException $e) {
|
||||||
|
} catch (ConnectException $e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements FetchAuthTokenInterface#fetchAuthToken.
|
||||||
|
*
|
||||||
|
* Fetches the auth tokens from the GCE metadata host if it is available.
|
||||||
|
* If $httpHandler is not specified a the default HttpHandler is used.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
*
|
||||||
|
* @return array<mixed> {
|
||||||
|
* A set of auth related metadata, based on the token type.
|
||||||
|
*
|
||||||
|
* @type string $access_token for access tokens
|
||||||
|
* @type int $expires_in for access tokens
|
||||||
|
* @type string $token_type for access tokens
|
||||||
|
* @type string $id_token for ID tokens
|
||||||
|
* }
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
public function fetchAuthToken(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
$httpHandler = $httpHandler
|
||||||
|
?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||||
|
|
||||||
|
if (!$this->hasCheckedOnGce) {
|
||||||
|
$this->isOnGce = self::onGce($httpHandler);
|
||||||
|
$this->hasCheckedOnGce = true;
|
||||||
|
}
|
||||||
|
if (!$this->isOnGce) {
|
||||||
|
return []; // return an empty array with no access token
|
||||||
|
}
|
||||||
|
|
||||||
|
$response = $this->getFromMetadata($httpHandler, $this->tokenUri);
|
||||||
|
|
||||||
|
if ($this->targetAudience) {
|
||||||
|
return ['id_token' => $response];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null === $json = json_decode($response, true)) {
|
||||||
|
throw new \Exception('Invalid JSON response');
|
||||||
|
}
|
||||||
|
|
||||||
|
$json['expires_at'] = time() + $json['expires_in'];
|
||||||
|
|
||||||
|
// store this so we can retrieve it later
|
||||||
|
$this->lastReceivedToken = $json;
|
||||||
|
|
||||||
|
return $json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCacheKey()
|
||||||
|
{
|
||||||
|
return self::cacheKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array{access_token:string,expires_at:int}|null
|
||||||
|
*/
|
||||||
|
public function getLastReceivedToken()
|
||||||
|
{
|
||||||
|
if ($this->lastReceivedToken) {
|
||||||
|
return [
|
||||||
|
'access_token' => $this->lastReceivedToken['access_token'],
|
||||||
|
'expires_at' => $this->lastReceivedToken['expires_at'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the client name from GCE metadata.
|
||||||
|
*
|
||||||
|
* Subsequent calls will return a cached value.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getClientName(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
if ($this->clientName) {
|
||||||
|
return $this->clientName;
|
||||||
|
}
|
||||||
|
|
||||||
|
$httpHandler = $httpHandler
|
||||||
|
?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||||
|
|
||||||
|
if (!$this->hasCheckedOnGce) {
|
||||||
|
$this->isOnGce = self::onGce($httpHandler);
|
||||||
|
$this->hasCheckedOnGce = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$this->isOnGce) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->clientName = $this->getFromMetadata(
|
||||||
|
$httpHandler,
|
||||||
|
self::getClientNameUri($this->serviceAccountIdentity)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->clientName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch the default Project ID from compute engine.
|
||||||
|
*
|
||||||
|
* Returns null if called outside GCE.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler Callback which delivers psr7 request
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getProjectId(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
if ($this->projectId) {
|
||||||
|
return $this->projectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
$httpHandler = $httpHandler
|
||||||
|
?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||||
|
|
||||||
|
if (!$this->hasCheckedOnGce) {
|
||||||
|
$this->isOnGce = self::onGce($httpHandler);
|
||||||
|
$this->hasCheckedOnGce = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$this->isOnGce) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->projectId = $this->getFromMetadata($httpHandler, self::getProjectIdUri());
|
||||||
|
return $this->projectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch the value of a GCE metadata server URI.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler An HTTP Handler to deliver PSR7 requests.
|
||||||
|
* @param string $uri The metadata URI.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function getFromMetadata(callable $httpHandler, $uri)
|
||||||
|
{
|
||||||
|
$resp = $httpHandler(
|
||||||
|
new Request(
|
||||||
|
'GET',
|
||||||
|
$uri,
|
||||||
|
[self::FLAVOR_HEADER => 'Google']
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return (string) $resp->getBody();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the quota project used for this API request
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getQuotaProject()
|
||||||
|
{
|
||||||
|
return $this->quotaProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set whether or not we've already checked the GCE environment.
|
||||||
|
*
|
||||||
|
* @param bool $isOnGce
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setIsOnGce($isOnGce)
|
||||||
|
{
|
||||||
|
// Implicitly set hasCheckedGce to true
|
||||||
|
$this->hasCheckedOnGce = true;
|
||||||
|
|
||||||
|
// Set isOnGce
|
||||||
|
$this->isOnGce = $isOnGce;
|
||||||
|
}
|
||||||
|
}
|
||||||
91
common/vendor/google/auth/src/Credentials/IAMCredentials.php
vendored
Normal file
91
common/vendor/google/auth/src/Credentials/IAMCredentials.php
vendored
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Credentials;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Authenticates requests using IAM credentials.
|
||||||
|
*/
|
||||||
|
class IAMCredentials
|
||||||
|
{
|
||||||
|
const SELECTOR_KEY = 'x-goog-iam-authority-selector';
|
||||||
|
const TOKEN_KEY = 'x-goog-iam-authorization-token';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $selector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $token;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $selector the IAM selector
|
||||||
|
* @param string $token the IAM token
|
||||||
|
*/
|
||||||
|
public function __construct($selector, $token)
|
||||||
|
{
|
||||||
|
if (!is_string($selector)) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'selector must be a string'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (!is_string($token)) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'token must be a string'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->selector = $selector;
|
||||||
|
$this->token = $token;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* export a callback function which updates runtime metadata.
|
||||||
|
*
|
||||||
|
* @return callable updateMetadata function
|
||||||
|
*/
|
||||||
|
public function getUpdateMetadataFunc()
|
||||||
|
{
|
||||||
|
return [$this, 'updateMetadata'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates metadata with the appropriate header metadata.
|
||||||
|
*
|
||||||
|
* @param array<mixed> $metadata metadata hashmap
|
||||||
|
* @param string $unusedAuthUri optional auth uri
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* Note: this param is unused here, only included here for
|
||||||
|
* consistency with other credentials class
|
||||||
|
*
|
||||||
|
* @return array<mixed> updated metadata hashmap
|
||||||
|
*/
|
||||||
|
public function updateMetadata(
|
||||||
|
$metadata,
|
||||||
|
$unusedAuthUri = null,
|
||||||
|
callable $httpHandler = null
|
||||||
|
) {
|
||||||
|
$metadata_copy = $metadata;
|
||||||
|
$metadata_copy[self::SELECTOR_KEY] = $this->selector;
|
||||||
|
$metadata_copy[self::TOKEN_KEY] = $this->token;
|
||||||
|
|
||||||
|
return $metadata_copy;
|
||||||
|
}
|
||||||
|
}
|
||||||
132
common/vendor/google/auth/src/Credentials/ImpersonatedServiceAccountCredentials.php
vendored
Normal file
132
common/vendor/google/auth/src/Credentials/ImpersonatedServiceAccountCredentials.php
vendored
Normal file
|
|
@ -0,0 +1,132 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2022 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Credentials;
|
||||||
|
|
||||||
|
use Google\Auth\CredentialsLoader;
|
||||||
|
use Google\Auth\IamSignerTrait;
|
||||||
|
use Google\Auth\SignBlobInterface;
|
||||||
|
|
||||||
|
class ImpersonatedServiceAccountCredentials extends CredentialsLoader implements SignBlobInterface
|
||||||
|
{
|
||||||
|
use IamSignerTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $impersonatedServiceAccountName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var UserRefreshCredentials
|
||||||
|
*/
|
||||||
|
protected $sourceCredentials;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiate an instance of ImpersonatedServiceAccountCredentials from a credentials file that has be created with
|
||||||
|
* the --impersonated-service-account flag.
|
||||||
|
*
|
||||||
|
* @param string|string[] $scope the scope of the access request, expressed
|
||||||
|
* either as an Array or as a space-delimited String.
|
||||||
|
* @param string|array<mixed> $jsonKey JSON credential file path or JSON credentials
|
||||||
|
* as an associative array
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
$scope,
|
||||||
|
$jsonKey
|
||||||
|
) {
|
||||||
|
if (is_string($jsonKey)) {
|
||||||
|
if (!file_exists($jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException('file does not exist');
|
||||||
|
}
|
||||||
|
$json = file_get_contents($jsonKey);
|
||||||
|
if (!$jsonKey = json_decode((string) $json, true)) {
|
||||||
|
throw new \LogicException('invalid json for auth config');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!array_key_exists('service_account_impersonation_url', $jsonKey)) {
|
||||||
|
throw new \LogicException('json key is missing the service_account_impersonation_url field');
|
||||||
|
}
|
||||||
|
if (!array_key_exists('source_credentials', $jsonKey)) {
|
||||||
|
throw new \LogicException('json key is missing the source_credentials field');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->impersonatedServiceAccountName = $this->getImpersonatedServiceAccountNameFromUrl($jsonKey['service_account_impersonation_url']);
|
||||||
|
|
||||||
|
$this->sourceCredentials = new UserRefreshCredentials($scope, $jsonKey['source_credentials']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function for extracting the Server Account Name from the URL saved in the account credentials file
|
||||||
|
* @param $serviceAccountImpersonationUrl string URL from the 'service_account_impersonation_url' field
|
||||||
|
* @return string Service account email or ID.
|
||||||
|
*/
|
||||||
|
private function getImpersonatedServiceAccountNameFromUrl(string $serviceAccountImpersonationUrl)
|
||||||
|
{
|
||||||
|
$fields = explode('/', $serviceAccountImpersonationUrl);
|
||||||
|
$lastField = end($fields);
|
||||||
|
$splitter = explode(':', $lastField);
|
||||||
|
return $splitter[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the client name from the keyfile
|
||||||
|
*
|
||||||
|
* In this implementation, it will return the issuers email from the oauth token.
|
||||||
|
*
|
||||||
|
* @param callable|null $unusedHttpHandler not used by this credentials type.
|
||||||
|
* @return string Token issuer email
|
||||||
|
*/
|
||||||
|
public function getClientName(callable $unusedHttpHandler = null)
|
||||||
|
{
|
||||||
|
return $this->impersonatedServiceAccountName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param callable $httpHandler
|
||||||
|
*
|
||||||
|
* @return array<mixed> {
|
||||||
|
* A set of auth related metadata, containing the following
|
||||||
|
*
|
||||||
|
* @type string $access_token
|
||||||
|
* @type int $expires_in
|
||||||
|
* @type string $scope
|
||||||
|
* @type string $token_type
|
||||||
|
* @type string $id_token
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
public function fetchAuthToken(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
return $this->sourceCredentials->fetchAuthToken($httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCacheKey()
|
||||||
|
{
|
||||||
|
return $this->sourceCredentials->getCacheKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function getLastReceivedToken()
|
||||||
|
{
|
||||||
|
return $this->sourceCredentials->getLastReceivedToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
68
common/vendor/google/auth/src/Credentials/InsecureCredentials.php
vendored
Normal file
68
common/vendor/google/auth/src/Credentials/InsecureCredentials.php
vendored
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2018 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Credentials;
|
||||||
|
|
||||||
|
use Google\Auth\FetchAuthTokenInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a set of credentials that will always return an empty access token.
|
||||||
|
* This is useful for APIs which do not require authentication, for local
|
||||||
|
* service emulators, and for testing.
|
||||||
|
*/
|
||||||
|
class InsecureCredentials implements FetchAuthTokenInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var array{access_token:string}
|
||||||
|
*/
|
||||||
|
private $token = [
|
||||||
|
'access_token' => ''
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches the auth token. In this case it returns an empty string.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler
|
||||||
|
* @return array{access_token:string} A set of auth related metadata
|
||||||
|
*/
|
||||||
|
public function fetchAuthToken(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
return $this->token;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the cache key. In this case it returns a null value, disabling
|
||||||
|
* caching.
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getCacheKey()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches the last received token. In this case, it returns the same empty string
|
||||||
|
* auth token.
|
||||||
|
*
|
||||||
|
* @return array{access_token:string}
|
||||||
|
*/
|
||||||
|
public function getLastReceivedToken()
|
||||||
|
{
|
||||||
|
return $this->token;
|
||||||
|
}
|
||||||
|
}
|
||||||
349
common/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php
vendored
Normal file
349
common/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php
vendored
Normal file
|
|
@ -0,0 +1,349 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Credentials;
|
||||||
|
|
||||||
|
use Google\Auth\CredentialsLoader;
|
||||||
|
use Google\Auth\GetQuotaProjectInterface;
|
||||||
|
use Google\Auth\OAuth2;
|
||||||
|
use Google\Auth\ProjectIdProviderInterface;
|
||||||
|
use Google\Auth\ServiceAccountSignerTrait;
|
||||||
|
use Google\Auth\SignBlobInterface;
|
||||||
|
use InvalidArgumentException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ServiceAccountCredentials supports authorization using a Google service
|
||||||
|
* account.
|
||||||
|
*
|
||||||
|
* (cf https://developers.google.com/accounts/docs/OAuth2ServiceAccount)
|
||||||
|
*
|
||||||
|
* It's initialized using the json key file that's downloadable from developer
|
||||||
|
* console, which should contain a private_key and client_email fields that it
|
||||||
|
* uses.
|
||||||
|
*
|
||||||
|
* Use it with AuthTokenMiddleware to authorize http requests:
|
||||||
|
*
|
||||||
|
* use Google\Auth\Credentials\ServiceAccountCredentials;
|
||||||
|
* use Google\Auth\Middleware\AuthTokenMiddleware;
|
||||||
|
* use GuzzleHttp\Client;
|
||||||
|
* use GuzzleHttp\HandlerStack;
|
||||||
|
*
|
||||||
|
* $sa = new ServiceAccountCredentials(
|
||||||
|
* 'https://www.googleapis.com/auth/taskqueue',
|
||||||
|
* '/path/to/your/json/key_file.json'
|
||||||
|
* );
|
||||||
|
* $middleware = new AuthTokenMiddleware($sa);
|
||||||
|
* $stack = HandlerStack::create();
|
||||||
|
* $stack->push($middleware);
|
||||||
|
*
|
||||||
|
* $client = new Client([
|
||||||
|
* 'handler' => $stack,
|
||||||
|
* 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
|
||||||
|
* 'auth' => 'google_auth' // authorize all requests
|
||||||
|
* ]);
|
||||||
|
*
|
||||||
|
* $res = $client->get('myproject/taskqueues/myqueue');
|
||||||
|
*/
|
||||||
|
class ServiceAccountCredentials extends CredentialsLoader implements
|
||||||
|
GetQuotaProjectInterface,
|
||||||
|
SignBlobInterface,
|
||||||
|
ProjectIdProviderInterface
|
||||||
|
{
|
||||||
|
use ServiceAccountSignerTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The OAuth2 instance used to conduct authorization.
|
||||||
|
*
|
||||||
|
* @var OAuth2
|
||||||
|
*/
|
||||||
|
protected $auth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The quota project associated with the JSON credentials
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $quotaProject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string|null
|
||||||
|
*/
|
||||||
|
protected $projectId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<mixed>|null
|
||||||
|
*/
|
||||||
|
private $lastReceivedJwtAccessToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private $useJwtAccessWithScope = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var ServiceAccountJwtAccessCredentials|null
|
||||||
|
*/
|
||||||
|
private $jwtAccessCredentials;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new ServiceAccountCredentials.
|
||||||
|
*
|
||||||
|
* @param string|string[]|null $scope the scope of the access request, expressed
|
||||||
|
* either as an Array or as a space-delimited String.
|
||||||
|
* @param string|array<mixed> $jsonKey JSON credential file path or JSON credentials
|
||||||
|
* as an associative array
|
||||||
|
* @param string $sub an email address account to impersonate, in situations when
|
||||||
|
* the service account has been delegated domain wide access.
|
||||||
|
* @param string $targetAudience The audience for the ID token.
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
$scope,
|
||||||
|
$jsonKey,
|
||||||
|
$sub = null,
|
||||||
|
$targetAudience = null
|
||||||
|
) {
|
||||||
|
if (is_string($jsonKey)) {
|
||||||
|
if (!file_exists($jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException('file does not exist');
|
||||||
|
}
|
||||||
|
$jsonKeyStream = file_get_contents($jsonKey);
|
||||||
|
if (!$jsonKey = json_decode((string) $jsonKeyStream, true)) {
|
||||||
|
throw new \LogicException('invalid json for auth config');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!array_key_exists('client_email', $jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'json key is missing the client_email field'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (!array_key_exists('private_key', $jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'json key is missing the private_key field'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (array_key_exists('quota_project_id', $jsonKey)) {
|
||||||
|
$this->quotaProject = (string) $jsonKey['quota_project_id'];
|
||||||
|
}
|
||||||
|
if ($scope && $targetAudience) {
|
||||||
|
throw new InvalidArgumentException(
|
||||||
|
'Scope and targetAudience cannot both be supplied'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$additionalClaims = [];
|
||||||
|
if ($targetAudience) {
|
||||||
|
$additionalClaims = ['target_audience' => $targetAudience];
|
||||||
|
}
|
||||||
|
$this->auth = new OAuth2([
|
||||||
|
'audience' => self::TOKEN_CREDENTIAL_URI,
|
||||||
|
'issuer' => $jsonKey['client_email'],
|
||||||
|
'scope' => $scope,
|
||||||
|
'signingAlgorithm' => 'RS256',
|
||||||
|
'signingKey' => $jsonKey['private_key'],
|
||||||
|
'sub' => $sub,
|
||||||
|
'tokenCredentialUri' => self::TOKEN_CREDENTIAL_URI,
|
||||||
|
'additionalClaims' => $additionalClaims,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->projectId = isset($jsonKey['project_id'])
|
||||||
|
? $jsonKey['project_id']
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When called, the ServiceAccountCredentials will use an instance of
|
||||||
|
* ServiceAccountJwtAccessCredentials to fetch (self-sign) an access token
|
||||||
|
* even when only scopes are supplied. Otherwise,
|
||||||
|
* ServiceAccountJwtAccessCredentials is only called when no scopes and an
|
||||||
|
* authUrl (audience) is suppled.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function useJwtAccessWithScope()
|
||||||
|
{
|
||||||
|
$this->useJwtAccessWithScope = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param callable $httpHandler
|
||||||
|
*
|
||||||
|
* @return array<mixed> {
|
||||||
|
* A set of auth related metadata, containing the following
|
||||||
|
*
|
||||||
|
* @type string $access_token
|
||||||
|
* @type int $expires_in
|
||||||
|
* @type string $token_type
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
public function fetchAuthToken(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
if ($this->useSelfSignedJwt()) {
|
||||||
|
$jwtCreds = $this->createJwtAccessCredentials();
|
||||||
|
|
||||||
|
$accessToken = $jwtCreds->fetchAuthToken($httpHandler);
|
||||||
|
|
||||||
|
if ($lastReceivedToken = $jwtCreds->getLastReceivedToken()) {
|
||||||
|
// Keep self-signed JWTs in memory as the last received token
|
||||||
|
$this->lastReceivedJwtAccessToken = $lastReceivedToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $accessToken;
|
||||||
|
}
|
||||||
|
return $this->auth->fetchAuthToken($httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCacheKey()
|
||||||
|
{
|
||||||
|
$key = $this->auth->getIssuer() . ':' . $this->auth->getCacheKey();
|
||||||
|
if ($sub = $this->auth->getSub()) {
|
||||||
|
$key .= ':' . $sub;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function getLastReceivedToken()
|
||||||
|
{
|
||||||
|
// If self-signed JWTs are being used, fetch the last received token
|
||||||
|
// from memory. Else, fetch it from OAuth2
|
||||||
|
return $this->useSelfSignedJwt()
|
||||||
|
? $this->lastReceivedJwtAccessToken
|
||||||
|
: $this->auth->getLastReceivedToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the project ID from the service account keyfile.
|
||||||
|
*
|
||||||
|
* Returns null if the project ID does not exist in the keyfile.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler Not used by this credentials type.
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getProjectId(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
return $this->projectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates metadata with the authorization token.
|
||||||
|
*
|
||||||
|
* @param array<mixed> $metadata metadata hashmap
|
||||||
|
* @param string $authUri optional auth uri
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @return array<mixed> updated metadata hashmap
|
||||||
|
*/
|
||||||
|
public function updateMetadata(
|
||||||
|
$metadata,
|
||||||
|
$authUri = null,
|
||||||
|
callable $httpHandler = null
|
||||||
|
) {
|
||||||
|
// scope exists. use oauth implementation
|
||||||
|
if (!$this->useSelfSignedJwt()) {
|
||||||
|
return parent::updateMetadata($metadata, $authUri, $httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
$jwtCreds = $this->createJwtAccessCredentials();
|
||||||
|
if ($this->auth->getScope()) {
|
||||||
|
// Prefer user-provided "scope" to "audience"
|
||||||
|
$updatedMetadata = $jwtCreds->updateMetadata($metadata, null, $httpHandler);
|
||||||
|
} else {
|
||||||
|
$updatedMetadata = $jwtCreds->updateMetadata($metadata, $authUri, $httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($lastReceivedToken = $jwtCreds->getLastReceivedToken()) {
|
||||||
|
// Keep self-signed JWTs in memory as the last received token
|
||||||
|
$this->lastReceivedJwtAccessToken = $lastReceivedToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $updatedMetadata;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return ServiceAccountJwtAccessCredentials
|
||||||
|
*/
|
||||||
|
private function createJwtAccessCredentials()
|
||||||
|
{
|
||||||
|
if (!$this->jwtAccessCredentials) {
|
||||||
|
// Create credentials for self-signing a JWT (JwtAccess)
|
||||||
|
$credJson = [
|
||||||
|
'private_key' => $this->auth->getSigningKey(),
|
||||||
|
'client_email' => $this->auth->getIssuer(),
|
||||||
|
];
|
||||||
|
$this->jwtAccessCredentials = new ServiceAccountJwtAccessCredentials(
|
||||||
|
$credJson,
|
||||||
|
$this->auth->getScope()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->jwtAccessCredentials;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $sub an email address account to impersonate, in situations when
|
||||||
|
* the service account has been delegated domain wide access.
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setSub($sub)
|
||||||
|
{
|
||||||
|
$this->auth->setSub($sub);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the client name from the keyfile.
|
||||||
|
*
|
||||||
|
* In this case, it returns the keyfile's client_email key.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler Not used by this credentials type.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getClientName(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
return $this->auth->getIssuer();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the quota project used for this API request
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getQuotaProject()
|
||||||
|
{
|
||||||
|
return $this->quotaProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function useSelfSignedJwt()
|
||||||
|
{
|
||||||
|
// If claims are set, this call is for "id_tokens"
|
||||||
|
if ($this->auth->getAdditionalClaims()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// When true, ServiceAccountCredentials will always use JwtAccess for access tokens
|
||||||
|
if ($this->useJwtAccessWithScope) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return is_null($this->auth->getScope());
|
||||||
|
}
|
||||||
|
}
|
||||||
210
common/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php
vendored
Normal file
210
common/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php
vendored
Normal file
|
|
@ -0,0 +1,210 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Credentials;
|
||||||
|
|
||||||
|
use Google\Auth\CredentialsLoader;
|
||||||
|
use Google\Auth\GetQuotaProjectInterface;
|
||||||
|
use Google\Auth\OAuth2;
|
||||||
|
use Google\Auth\ProjectIdProviderInterface;
|
||||||
|
use Google\Auth\ServiceAccountSignerTrait;
|
||||||
|
use Google\Auth\SignBlobInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Authenticates requests using Google's Service Account credentials via
|
||||||
|
* JWT Access.
|
||||||
|
*
|
||||||
|
* This class allows authorizing requests for service accounts directly
|
||||||
|
* from credentials from a json key file downloaded from the developer
|
||||||
|
* console (via 'Generate new Json Key'). It is not part of any OAuth2
|
||||||
|
* flow, rather it creates a JWT and sends that as a credential.
|
||||||
|
*/
|
||||||
|
class ServiceAccountJwtAccessCredentials extends CredentialsLoader implements
|
||||||
|
GetQuotaProjectInterface,
|
||||||
|
SignBlobInterface,
|
||||||
|
ProjectIdProviderInterface
|
||||||
|
{
|
||||||
|
use ServiceAccountSignerTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The OAuth2 instance used to conduct authorization.
|
||||||
|
*
|
||||||
|
* @var OAuth2
|
||||||
|
*/
|
||||||
|
protected $auth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The quota project associated with the JSON credentials
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $quotaProject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $projectId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new ServiceAccountJwtAccessCredentials.
|
||||||
|
*
|
||||||
|
* @param string|array<mixed> $jsonKey JSON credential file path or JSON credentials
|
||||||
|
* as an associative array
|
||||||
|
* @param string|string[] $scope the scope of the access request, expressed
|
||||||
|
* either as an Array or as a space-delimited String.
|
||||||
|
*/
|
||||||
|
public function __construct($jsonKey, $scope = null)
|
||||||
|
{
|
||||||
|
if (is_string($jsonKey)) {
|
||||||
|
if (!file_exists($jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException('file does not exist');
|
||||||
|
}
|
||||||
|
$jsonKeyStream = file_get_contents($jsonKey);
|
||||||
|
if (!$jsonKey = json_decode((string) $jsonKeyStream, true)) {
|
||||||
|
throw new \LogicException('invalid json for auth config');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!array_key_exists('client_email', $jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'json key is missing the client_email field'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (!array_key_exists('private_key', $jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'json key is missing the private_key field'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (array_key_exists('quota_project_id', $jsonKey)) {
|
||||||
|
$this->quotaProject = (string) $jsonKey['quota_project_id'];
|
||||||
|
}
|
||||||
|
$this->auth = new OAuth2([
|
||||||
|
'issuer' => $jsonKey['client_email'],
|
||||||
|
'sub' => $jsonKey['client_email'],
|
||||||
|
'signingAlgorithm' => 'RS256',
|
||||||
|
'signingKey' => $jsonKey['private_key'],
|
||||||
|
'scope' => $scope,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->projectId = isset($jsonKey['project_id'])
|
||||||
|
? $jsonKey['project_id']
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates metadata with the authorization token.
|
||||||
|
*
|
||||||
|
* @param array<mixed> $metadata metadata hashmap
|
||||||
|
* @param string $authUri optional auth uri
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @return array<mixed> updated metadata hashmap
|
||||||
|
*/
|
||||||
|
public function updateMetadata(
|
||||||
|
$metadata,
|
||||||
|
$authUri = null,
|
||||||
|
callable $httpHandler = null
|
||||||
|
) {
|
||||||
|
$scope = $this->auth->getScope();
|
||||||
|
if (empty($authUri) && empty($scope)) {
|
||||||
|
return $metadata;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->auth->setAudience($authUri);
|
||||||
|
|
||||||
|
return parent::updateMetadata($metadata, $authUri, $httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements FetchAuthTokenInterface#fetchAuthToken.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler
|
||||||
|
*
|
||||||
|
* @return null|array{access_token:string} A set of auth related metadata
|
||||||
|
*/
|
||||||
|
public function fetchAuthToken(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
$audience = $this->auth->getAudience();
|
||||||
|
$scope = $this->auth->getScope();
|
||||||
|
if (empty($audience) && empty($scope)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($audience) && !empty($scope)) {
|
||||||
|
throw new \UnexpectedValueException(
|
||||||
|
'Cannot sign both audience and scope in JwtAccess'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$access_token = $this->auth->toJwt();
|
||||||
|
|
||||||
|
// Set the self-signed access token in OAuth2 for getLastReceivedToken
|
||||||
|
$this->auth->setAccessToken($access_token);
|
||||||
|
|
||||||
|
return ['access_token' => $access_token];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCacheKey()
|
||||||
|
{
|
||||||
|
return $this->auth->getCacheKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function getLastReceivedToken()
|
||||||
|
{
|
||||||
|
return $this->auth->getLastReceivedToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the project ID from the service account keyfile.
|
||||||
|
*
|
||||||
|
* Returns null if the project ID does not exist in the keyfile.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler Not used by this credentials type.
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getProjectId(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
return $this->projectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the client name from the keyfile.
|
||||||
|
*
|
||||||
|
* In this case, it returns the keyfile's client_email key.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler Not used by this credentials type.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getClientName(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
return $this->auth->getIssuer();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the quota project used for this API request
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getQuotaProject()
|
||||||
|
{
|
||||||
|
return $this->quotaProject;
|
||||||
|
}
|
||||||
|
}
|
||||||
152
common/vendor/google/auth/src/Credentials/UserRefreshCredentials.php
vendored
Normal file
152
common/vendor/google/auth/src/Credentials/UserRefreshCredentials.php
vendored
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Credentials;
|
||||||
|
|
||||||
|
use Google\Auth\CredentialsLoader;
|
||||||
|
use Google\Auth\GetQuotaProjectInterface;
|
||||||
|
use Google\Auth\OAuth2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Authenticates requests using User Refresh credentials.
|
||||||
|
*
|
||||||
|
* This class allows authorizing requests from user refresh tokens.
|
||||||
|
*
|
||||||
|
* This the end of the result of a 3LO flow. E.g, the end result of
|
||||||
|
* 'gcloud auth login' saves a file with these contents in well known
|
||||||
|
* location
|
||||||
|
*
|
||||||
|
* @see [Application Default Credentials](http://goo.gl/mkAHpZ)
|
||||||
|
*/
|
||||||
|
class UserRefreshCredentials extends CredentialsLoader implements GetQuotaProjectInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The OAuth2 instance used to conduct authorization.
|
||||||
|
*
|
||||||
|
* @var OAuth2
|
||||||
|
*/
|
||||||
|
protected $auth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The quota project associated with the JSON credentials
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $quotaProject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new UserRefreshCredentials.
|
||||||
|
*
|
||||||
|
* @param string|string[] $scope the scope of the access request, expressed
|
||||||
|
* either as an Array or as a space-delimited String.
|
||||||
|
* @param string|array<mixed> $jsonKey JSON credential file path or JSON credentials
|
||||||
|
* as an associative array
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
$scope,
|
||||||
|
$jsonKey
|
||||||
|
) {
|
||||||
|
if (is_string($jsonKey)) {
|
||||||
|
if (!file_exists($jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException('file does not exist');
|
||||||
|
}
|
||||||
|
$json = file_get_contents($jsonKey);
|
||||||
|
if (!$jsonKey = json_decode((string) $json, true)) {
|
||||||
|
throw new \LogicException('invalid json for auth config');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!array_key_exists('client_id', $jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'json key is missing the client_id field'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (!array_key_exists('client_secret', $jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'json key is missing the client_secret field'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (!array_key_exists('refresh_token', $jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'json key is missing the refresh_token field'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$this->auth = new OAuth2([
|
||||||
|
'clientId' => $jsonKey['client_id'],
|
||||||
|
'clientSecret' => $jsonKey['client_secret'],
|
||||||
|
'refresh_token' => $jsonKey['refresh_token'],
|
||||||
|
'scope' => $scope,
|
||||||
|
'tokenCredentialUri' => self::TOKEN_CREDENTIAL_URI,
|
||||||
|
]);
|
||||||
|
if (array_key_exists('quota_project_id', $jsonKey)) {
|
||||||
|
$this->quotaProject = (string) $jsonKey['quota_project_id'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param callable $httpHandler
|
||||||
|
*
|
||||||
|
* @return array<mixed> {
|
||||||
|
* A set of auth related metadata, containing the following
|
||||||
|
*
|
||||||
|
* @type string $access_token
|
||||||
|
* @type int $expires_in
|
||||||
|
* @type string $scope
|
||||||
|
* @type string $token_type
|
||||||
|
* @type string $id_token
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
public function fetchAuthToken(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
return $this->auth->fetchAuthToken($httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCacheKey()
|
||||||
|
{
|
||||||
|
return $this->auth->getClientId() . ':' . $this->auth->getCacheKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function getLastReceivedToken()
|
||||||
|
{
|
||||||
|
return $this->auth->getLastReceivedToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the quota project used for this API request
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getQuotaProject()
|
||||||
|
{
|
||||||
|
return $this->quotaProject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the granted scopes (if they exist) for the last fetched token.
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getGrantedScope()
|
||||||
|
{
|
||||||
|
return $this->auth->getGrantedScope();
|
||||||
|
}
|
||||||
|
}
|
||||||
293
common/vendor/google/auth/src/CredentialsLoader.php
vendored
Normal file
293
common/vendor/google/auth/src/CredentialsLoader.php
vendored
Normal file
|
|
@ -0,0 +1,293 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
use Google\Auth\Credentials\ImpersonatedServiceAccountCredentials;
|
||||||
|
use Google\Auth\Credentials\InsecureCredentials;
|
||||||
|
use Google\Auth\Credentials\ServiceAccountCredentials;
|
||||||
|
use Google\Auth\Credentials\UserRefreshCredentials;
|
||||||
|
use RuntimeException;
|
||||||
|
use UnexpectedValueException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CredentialsLoader contains the behaviour used to locate and find default
|
||||||
|
* credentials files on the file system.
|
||||||
|
*/
|
||||||
|
abstract class CredentialsLoader implements
|
||||||
|
FetchAuthTokenInterface,
|
||||||
|
UpdateMetadataInterface
|
||||||
|
{
|
||||||
|
const TOKEN_CREDENTIAL_URI = 'https://oauth2.googleapis.com/token';
|
||||||
|
const ENV_VAR = 'GOOGLE_APPLICATION_CREDENTIALS';
|
||||||
|
const WELL_KNOWN_PATH = 'gcloud/application_default_credentials.json';
|
||||||
|
const NON_WINDOWS_WELL_KNOWN_PATH_BASE = '.config';
|
||||||
|
const MTLS_WELL_KNOWN_PATH = '.secureConnect/context_aware_metadata.json';
|
||||||
|
const MTLS_CERT_ENV_VAR = 'GOOGLE_API_USE_CLIENT_CERTIFICATE';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $cause
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private static function unableToReadEnv($cause)
|
||||||
|
{
|
||||||
|
$msg = 'Unable to read the credential file specified by ';
|
||||||
|
$msg .= ' GOOGLE_APPLICATION_CREDENTIALS: ';
|
||||||
|
$msg .= $cause;
|
||||||
|
|
||||||
|
return $msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private static function isOnWindows()
|
||||||
|
{
|
||||||
|
return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a JSON key from the path specified in the environment.
|
||||||
|
*
|
||||||
|
* Load a JSON key from the path specified in the environment
|
||||||
|
* variable GOOGLE_APPLICATION_CREDENTIALS. Return null if
|
||||||
|
* GOOGLE_APPLICATION_CREDENTIALS is not specified.
|
||||||
|
*
|
||||||
|
* @return array<mixed>|null JSON key | null
|
||||||
|
*/
|
||||||
|
public static function fromEnv()
|
||||||
|
{
|
||||||
|
$path = getenv(self::ENV_VAR);
|
||||||
|
if (empty($path)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (!file_exists($path)) {
|
||||||
|
$cause = 'file ' . $path . ' does not exist';
|
||||||
|
throw new \DomainException(self::unableToReadEnv($cause));
|
||||||
|
}
|
||||||
|
$jsonKey = file_get_contents($path);
|
||||||
|
return json_decode((string) $jsonKey, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a JSON key from a well known path.
|
||||||
|
*
|
||||||
|
* The well known path is OS dependent:
|
||||||
|
*
|
||||||
|
* * windows: %APPDATA%/gcloud/application_default_credentials.json
|
||||||
|
* * others: $HOME/.config/gcloud/application_default_credentials.json
|
||||||
|
*
|
||||||
|
* If the file does not exist, this returns null.
|
||||||
|
*
|
||||||
|
* @return array<mixed>|null JSON key | null
|
||||||
|
*/
|
||||||
|
public static function fromWellKnownFile()
|
||||||
|
{
|
||||||
|
$rootEnv = self::isOnWindows() ? 'APPDATA' : 'HOME';
|
||||||
|
$path = [getenv($rootEnv)];
|
||||||
|
if (!self::isOnWindows()) {
|
||||||
|
$path[] = self::NON_WINDOWS_WELL_KNOWN_PATH_BASE;
|
||||||
|
}
|
||||||
|
$path[] = self::WELL_KNOWN_PATH;
|
||||||
|
$path = implode(DIRECTORY_SEPARATOR, $path);
|
||||||
|
if (!file_exists($path)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$jsonKey = file_get_contents($path);
|
||||||
|
return json_decode((string) $jsonKey, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new Credentials instance.
|
||||||
|
*
|
||||||
|
* @param string|string[] $scope the scope of the access request, expressed
|
||||||
|
* either as an Array or as a space-delimited String.
|
||||||
|
* @param array<mixed> $jsonKey the JSON credentials.
|
||||||
|
* @param string|string[] $defaultScope The default scope to use if no
|
||||||
|
* user-defined scopes exist, expressed either as an Array or as a
|
||||||
|
* space-delimited string.
|
||||||
|
*
|
||||||
|
* @return ServiceAccountCredentials|UserRefreshCredentials|ImpersonatedServiceAccountCredentials
|
||||||
|
*/
|
||||||
|
public static function makeCredentials(
|
||||||
|
$scope,
|
||||||
|
array $jsonKey,
|
||||||
|
$defaultScope = null
|
||||||
|
) {
|
||||||
|
if (!array_key_exists('type', $jsonKey)) {
|
||||||
|
throw new \InvalidArgumentException('json key is missing the type field');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($jsonKey['type'] == 'service_account') {
|
||||||
|
// Do not pass $defaultScope to ServiceAccountCredentials
|
||||||
|
return new ServiceAccountCredentials($scope, $jsonKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($jsonKey['type'] == 'authorized_user') {
|
||||||
|
$anyScope = $scope ?: $defaultScope;
|
||||||
|
return new UserRefreshCredentials($anyScope, $jsonKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($jsonKey['type'] == 'impersonated_service_account') {
|
||||||
|
$anyScope = $scope ?: $defaultScope;
|
||||||
|
return new ImpersonatedServiceAccountCredentials($anyScope, $jsonKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \InvalidArgumentException('invalid value in the type field');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an authorized HTTP Client from an instance of FetchAuthTokenInterface.
|
||||||
|
*
|
||||||
|
* @param FetchAuthTokenInterface $fetcher is used to fetch the auth token
|
||||||
|
* @param array<mixed> $httpClientOptions (optional) Array of request options to apply.
|
||||||
|
* @param callable $httpHandler (optional) http client to fetch the token.
|
||||||
|
* @param callable $tokenCallback (optional) function to be called when a new token is fetched.
|
||||||
|
* @return \GuzzleHttp\Client
|
||||||
|
*/
|
||||||
|
public static function makeHttpClient(
|
||||||
|
FetchAuthTokenInterface $fetcher,
|
||||||
|
array $httpClientOptions = [],
|
||||||
|
callable $httpHandler = null,
|
||||||
|
callable $tokenCallback = null
|
||||||
|
) {
|
||||||
|
$middleware = new Middleware\AuthTokenMiddleware(
|
||||||
|
$fetcher,
|
||||||
|
$httpHandler,
|
||||||
|
$tokenCallback
|
||||||
|
);
|
||||||
|
$stack = \GuzzleHttp\HandlerStack::create();
|
||||||
|
$stack->push($middleware);
|
||||||
|
|
||||||
|
return new \GuzzleHttp\Client([
|
||||||
|
'handler' => $stack,
|
||||||
|
'auth' => 'google_auth',
|
||||||
|
] + $httpClientOptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new instance of InsecureCredentials.
|
||||||
|
*
|
||||||
|
* @return InsecureCredentials
|
||||||
|
*/
|
||||||
|
public static function makeInsecureCredentials()
|
||||||
|
{
|
||||||
|
return new InsecureCredentials();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* export a callback function which updates runtime metadata.
|
||||||
|
*
|
||||||
|
* @return callable updateMetadata function
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
public function getUpdateMetadataFunc()
|
||||||
|
{
|
||||||
|
return [$this, 'updateMetadata'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates metadata with the authorization token.
|
||||||
|
*
|
||||||
|
* @param array<mixed> $metadata metadata hashmap
|
||||||
|
* @param string $authUri optional auth uri
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @return array<mixed> updated metadata hashmap
|
||||||
|
*/
|
||||||
|
public function updateMetadata(
|
||||||
|
$metadata,
|
||||||
|
$authUri = null,
|
||||||
|
callable $httpHandler = null
|
||||||
|
) {
|
||||||
|
if (isset($metadata[self::AUTH_METADATA_KEY])) {
|
||||||
|
// Auth metadata has already been set
|
||||||
|
return $metadata;
|
||||||
|
}
|
||||||
|
$result = $this->fetchAuthToken($httpHandler);
|
||||||
|
$metadata_copy = $metadata;
|
||||||
|
if (isset($result['access_token'])) {
|
||||||
|
$metadata_copy[self::AUTH_METADATA_KEY] = ['Bearer ' . $result['access_token']];
|
||||||
|
} elseif (isset($result['id_token'])) {
|
||||||
|
$metadata_copy[self::AUTH_METADATA_KEY] = ['Bearer ' . $result['id_token']];
|
||||||
|
}
|
||||||
|
return $metadata_copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a callable which returns the default device certification.
|
||||||
|
*
|
||||||
|
* @throws UnexpectedValueException
|
||||||
|
* @return callable|null
|
||||||
|
*/
|
||||||
|
public static function getDefaultClientCertSource()
|
||||||
|
{
|
||||||
|
if (!$clientCertSourceJson = self::loadDefaultClientCertSourceFile()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$clientCertSourceCmd = $clientCertSourceJson['cert_provider_command'];
|
||||||
|
|
||||||
|
return function () use ($clientCertSourceCmd) {
|
||||||
|
$cmd = array_map('escapeshellarg', $clientCertSourceCmd);
|
||||||
|
exec(implode(' ', $cmd), $output, $returnVar);
|
||||||
|
|
||||||
|
if (0 === $returnVar) {
|
||||||
|
return implode(PHP_EOL, $output);
|
||||||
|
}
|
||||||
|
throw new RuntimeException(
|
||||||
|
'"cert_provider_command" failed with a nonzero exit code'
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines whether or not the default device certificate should be loaded.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function shouldLoadClientCertSource()
|
||||||
|
{
|
||||||
|
return filter_var(getenv(self::MTLS_CERT_ENV_VAR), FILTER_VALIDATE_BOOLEAN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array{cert_provider_command:string[]}|null
|
||||||
|
*/
|
||||||
|
private static function loadDefaultClientCertSourceFile()
|
||||||
|
{
|
||||||
|
$rootEnv = self::isOnWindows() ? 'APPDATA' : 'HOME';
|
||||||
|
$path = sprintf('%s/%s', getenv($rootEnv), self::MTLS_WELL_KNOWN_PATH);
|
||||||
|
if (!file_exists($path)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$jsonKey = file_get_contents($path);
|
||||||
|
$clientCertSourceJson = json_decode((string) $jsonKey, true);
|
||||||
|
if (!$clientCertSourceJson) {
|
||||||
|
throw new UnexpectedValueException('Invalid client cert source JSON');
|
||||||
|
}
|
||||||
|
if (!isset($clientCertSourceJson['cert_provider_command'])) {
|
||||||
|
throw new UnexpectedValueException(
|
||||||
|
'cert source requires "cert_provider_command"'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (!is_array($clientCertSourceJson['cert_provider_command'])) {
|
||||||
|
throw new UnexpectedValueException(
|
||||||
|
'cert source expects "cert_provider_command" to be an array'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $clientCertSourceJson;
|
||||||
|
}
|
||||||
|
}
|
||||||
292
common/vendor/google/auth/src/FetchAuthTokenCache.php
vendored
Normal file
292
common/vendor/google/auth/src/FetchAuthTokenCache.php
vendored
Normal file
|
|
@ -0,0 +1,292 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2010 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
use Psr\Cache\CacheItemPoolInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class to implement caching for any object implementing
|
||||||
|
* FetchAuthTokenInterface
|
||||||
|
*/
|
||||||
|
class FetchAuthTokenCache implements
|
||||||
|
FetchAuthTokenInterface,
|
||||||
|
GetQuotaProjectInterface,
|
||||||
|
SignBlobInterface,
|
||||||
|
ProjectIdProviderInterface,
|
||||||
|
UpdateMetadataInterface
|
||||||
|
{
|
||||||
|
use CacheTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var FetchAuthTokenInterface
|
||||||
|
*/
|
||||||
|
private $fetcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
private $eagerRefreshThresholdSeconds = 10;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param FetchAuthTokenInterface $fetcher A credentials fetcher
|
||||||
|
* @param array<mixed> $cacheConfig Configuration for the cache
|
||||||
|
* @param CacheItemPoolInterface $cache
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
FetchAuthTokenInterface $fetcher,
|
||||||
|
array $cacheConfig = null,
|
||||||
|
CacheItemPoolInterface $cache
|
||||||
|
) {
|
||||||
|
$this->fetcher = $fetcher;
|
||||||
|
$this->cache = $cache;
|
||||||
|
$this->cacheConfig = array_merge([
|
||||||
|
'lifetime' => 1500,
|
||||||
|
'prefix' => '',
|
||||||
|
], (array) $cacheConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return FetchAuthTokenInterface
|
||||||
|
*/
|
||||||
|
public function getFetcher()
|
||||||
|
{
|
||||||
|
return $this->fetcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements FetchAuthTokenInterface#fetchAuthToken.
|
||||||
|
*
|
||||||
|
* Checks the cache for a valid auth token and fetches the auth tokens
|
||||||
|
* from the supplied fetcher.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @return array<mixed> the response
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
public function fetchAuthToken(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
if ($cached = $this->fetchAuthTokenFromCache()) {
|
||||||
|
return $cached;
|
||||||
|
}
|
||||||
|
|
||||||
|
$auth_token = $this->fetcher->fetchAuthToken($httpHandler);
|
||||||
|
|
||||||
|
$this->saveAuthTokenInCache($auth_token);
|
||||||
|
|
||||||
|
return $auth_token;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getCacheKey()
|
||||||
|
{
|
||||||
|
return $this->getFullCacheKey($this->fetcher->getCacheKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<mixed>|null
|
||||||
|
*/
|
||||||
|
public function getLastReceivedToken()
|
||||||
|
{
|
||||||
|
return $this->fetcher->getLastReceivedToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the client name from the fetcher.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler An HTTP handler to deliver PSR7 requests.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getClientName(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
if (!$this->fetcher instanceof SignBlobInterface) {
|
||||||
|
throw new \RuntimeException(
|
||||||
|
'Credentials fetcher does not implement ' .
|
||||||
|
'Google\Auth\SignBlobInterface'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->fetcher->getClientName($httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign a blob using the fetcher.
|
||||||
|
*
|
||||||
|
* @param string $stringToSign The string to sign.
|
||||||
|
* @param bool $forceOpenSsl Require use of OpenSSL for local signing. Does
|
||||||
|
* not apply to signing done using external services. **Defaults to**
|
||||||
|
* `false`.
|
||||||
|
* @return string The resulting signature.
|
||||||
|
* @throws \RuntimeException If the fetcher does not implement
|
||||||
|
* `Google\Auth\SignBlobInterface`.
|
||||||
|
*/
|
||||||
|
public function signBlob($stringToSign, $forceOpenSsl = false)
|
||||||
|
{
|
||||||
|
if (!$this->fetcher instanceof SignBlobInterface) {
|
||||||
|
throw new \RuntimeException(
|
||||||
|
'Credentials fetcher does not implement ' .
|
||||||
|
'Google\Auth\SignBlobInterface'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pass the access token from cache to GCECredentials for signing a blob.
|
||||||
|
// This saves a call to the metadata server when a cached token exists.
|
||||||
|
if ($this->fetcher instanceof Credentials\GCECredentials) {
|
||||||
|
$cached = $this->fetchAuthTokenFromCache();
|
||||||
|
$accessToken = isset($cached['access_token']) ? $cached['access_token'] : null;
|
||||||
|
return $this->fetcher->signBlob($stringToSign, $forceOpenSsl, $accessToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->fetcher->signBlob($stringToSign, $forceOpenSsl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the quota project used for this API request from the credentials
|
||||||
|
* fetcher.
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getQuotaProject()
|
||||||
|
{
|
||||||
|
if ($this->fetcher instanceof GetQuotaProjectInterface) {
|
||||||
|
return $this->fetcher->getQuotaProject();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get the Project ID from the fetcher.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler Callback which delivers psr7 request
|
||||||
|
* @return string|null
|
||||||
|
* @throws \RuntimeException If the fetcher does not implement
|
||||||
|
* `Google\Auth\ProvidesProjectIdInterface`.
|
||||||
|
*/
|
||||||
|
public function getProjectId(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
if (!$this->fetcher instanceof ProjectIdProviderInterface) {
|
||||||
|
throw new \RuntimeException(
|
||||||
|
'Credentials fetcher does not implement ' .
|
||||||
|
'Google\Auth\ProvidesProjectIdInterface'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->fetcher->getProjectId($httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates metadata with the authorization token.
|
||||||
|
*
|
||||||
|
* @param array<mixed> $metadata metadata hashmap
|
||||||
|
* @param string $authUri optional auth uri
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @return array<mixed> updated metadata hashmap
|
||||||
|
* @throws \RuntimeException If the fetcher does not implement
|
||||||
|
* `Google\Auth\UpdateMetadataInterface`.
|
||||||
|
*/
|
||||||
|
public function updateMetadata(
|
||||||
|
$metadata,
|
||||||
|
$authUri = null,
|
||||||
|
callable $httpHandler = null
|
||||||
|
) {
|
||||||
|
if (!$this->fetcher instanceof UpdateMetadataInterface) {
|
||||||
|
throw new \RuntimeException(
|
||||||
|
'Credentials fetcher does not implement ' .
|
||||||
|
'Google\Auth\UpdateMetadataInterface'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$cached = $this->fetchAuthTokenFromCache($authUri);
|
||||||
|
if ($cached) {
|
||||||
|
// Set the access token in the `Authorization` metadata header so
|
||||||
|
// the downstream call to updateMetadata know they don't need to
|
||||||
|
// fetch another token.
|
||||||
|
if (isset($cached['access_token'])) {
|
||||||
|
$metadata[self::AUTH_METADATA_KEY] = [
|
||||||
|
'Bearer ' . $cached['access_token']
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$newMetadata = $this->fetcher->updateMetadata(
|
||||||
|
$metadata,
|
||||||
|
$authUri,
|
||||||
|
$httpHandler
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!$cached && $token = $this->fetcher->getLastReceivedToken()) {
|
||||||
|
$this->saveAuthTokenInCache($token, $authUri);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $newMetadata;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string|null $authUri
|
||||||
|
* @return array<mixed>|null
|
||||||
|
*/
|
||||||
|
private function fetchAuthTokenFromCache($authUri = null)
|
||||||
|
{
|
||||||
|
// Use the cached value if its available.
|
||||||
|
//
|
||||||
|
// TODO: correct caching; update the call to setCachedValue to set the expiry
|
||||||
|
// to the value returned with the auth token.
|
||||||
|
//
|
||||||
|
// TODO: correct caching; enable the cache to be cleared.
|
||||||
|
|
||||||
|
// if $authUri is set, use it as the cache key
|
||||||
|
$cacheKey = $authUri
|
||||||
|
? $this->getFullCacheKey($authUri)
|
||||||
|
: $this->fetcher->getCacheKey();
|
||||||
|
|
||||||
|
$cached = $this->getCachedValue($cacheKey);
|
||||||
|
if (is_array($cached)) {
|
||||||
|
if (empty($cached['expires_at'])) {
|
||||||
|
// If there is no expiration data, assume token is not expired.
|
||||||
|
// (for JwtAccess and ID tokens)
|
||||||
|
return $cached;
|
||||||
|
}
|
||||||
|
if ((time() + $this->eagerRefreshThresholdSeconds) < $cached['expires_at']) {
|
||||||
|
// access token is not expired
|
||||||
|
return $cached;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<mixed> $authToken
|
||||||
|
* @param string|null $authUri
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function saveAuthTokenInCache($authToken, $authUri = null)
|
||||||
|
{
|
||||||
|
if (isset($authToken['access_token']) ||
|
||||||
|
isset($authToken['id_token'])) {
|
||||||
|
// if $authUri is set, use it as the cache key
|
||||||
|
$cacheKey = $authUri
|
||||||
|
? $this->getFullCacheKey($authUri)
|
||||||
|
: $this->fetcher->getCacheKey();
|
||||||
|
|
||||||
|
$this->setCachedValue($cacheKey, $authToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
54
common/vendor/google/auth/src/FetchAuthTokenInterface.php
vendored
Normal file
54
common/vendor/google/auth/src/FetchAuthTokenInterface.php
vendored
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An interface implemented by objects that can fetch auth tokens.
|
||||||
|
*/
|
||||||
|
interface FetchAuthTokenInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Fetches the auth tokens based on the current state.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @return array<mixed> a hash of auth tokens
|
||||||
|
*/
|
||||||
|
public function fetchAuthToken(callable $httpHandler = null);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains a key that can used to cache the results of #fetchAuthToken.
|
||||||
|
*
|
||||||
|
* If the value is empty, the auth token is not cached.
|
||||||
|
*
|
||||||
|
* @return string a key that may be used to cache the auth token.
|
||||||
|
*/
|
||||||
|
public function getCacheKey();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an associative array with the token and
|
||||||
|
* expiration time.
|
||||||
|
*
|
||||||
|
* @return null|array<mixed> {
|
||||||
|
* The last received access token.
|
||||||
|
*
|
||||||
|
* @type string $access_token The access token string.
|
||||||
|
* @type int $expires_at The time the token expires as a UNIX timestamp.
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
public function getLastReceivedToken();
|
||||||
|
}
|
||||||
82
common/vendor/google/auth/src/GCECache.php
vendored
Normal file
82
common/vendor/google/auth/src/GCECache.php
vendored
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2020 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
use Google\Auth\Credentials\GCECredentials;
|
||||||
|
use Psr\Cache\CacheItemPoolInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class to implement caching for calls to GCECredentials::onGce. This class
|
||||||
|
* is used automatically when you pass a `Psr\Cache\CacheItemPoolInterface`
|
||||||
|
* cache object to `ApplicationDefaultCredentials::getCredentials`.
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* $sysvCache = new Google\Auth\SysvCacheItemPool();
|
||||||
|
* $creds = Google\Auth\ApplicationDefaultCredentials::getCredentials(
|
||||||
|
* $scope,
|
||||||
|
* null,
|
||||||
|
* null,
|
||||||
|
* $sysvCache
|
||||||
|
* );
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
class GCECache
|
||||||
|
{
|
||||||
|
const GCE_CACHE_KEY = 'google_auth_on_gce_cache';
|
||||||
|
|
||||||
|
use CacheTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<mixed> $cacheConfig Configuration for the cache
|
||||||
|
* @param CacheItemPoolInterface $cache
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
array $cacheConfig = null,
|
||||||
|
CacheItemPoolInterface $cache = null
|
||||||
|
) {
|
||||||
|
$this->cache = $cache;
|
||||||
|
$this->cacheConfig = array_merge([
|
||||||
|
'lifetime' => 1500,
|
||||||
|
'prefix' => '',
|
||||||
|
], (array) $cacheConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Caches the result of onGce so the metadata server is not called multiple
|
||||||
|
* times.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @return bool True if this a GCEInstance, false otherwise
|
||||||
|
*/
|
||||||
|
public function onGce(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
if (is_null($this->cache)) {
|
||||||
|
return GCECredentials::onGce($httpHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
$cacheKey = self::GCE_CACHE_KEY;
|
||||||
|
$onGce = $this->getCachedValue($cacheKey);
|
||||||
|
|
||||||
|
if (is_null($onGce)) {
|
||||||
|
$onGce = GCECredentials::onGce($httpHandler);
|
||||||
|
$this->setCachedValue($cacheKey, $onGce);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $onGce;
|
||||||
|
}
|
||||||
|
}
|
||||||
33
common/vendor/google/auth/src/GetQuotaProjectInterface.php
vendored
Normal file
33
common/vendor/google/auth/src/GetQuotaProjectInterface.php
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An interface implemented by objects that can get quota projects.
|
||||||
|
*/
|
||||||
|
interface GetQuotaProjectInterface
|
||||||
|
{
|
||||||
|
const X_GOOG_USER_PROJECT_HEADER = 'X-Goog-User-Project';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the quota project used for this API request
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getQuotaProject();
|
||||||
|
}
|
||||||
129
common/vendor/google/auth/src/HttpHandler/Guzzle5HttpHandler.php
vendored
Normal file
129
common/vendor/google/auth/src/HttpHandler/Guzzle5HttpHandler.php
vendored
Normal file
|
|
@ -0,0 +1,129 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright 2015 Google Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
namespace Google\Auth\HttpHandler;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
use GuzzleHttp\ClientInterface;
|
||||||
|
use GuzzleHttp\Message\ResponseInterface as Guzzle5ResponseInterface;
|
||||||
|
use GuzzleHttp\Promise\Promise;
|
||||||
|
use GuzzleHttp\Promise\RejectedPromise;
|
||||||
|
use GuzzleHttp\Psr7\Response;
|
||||||
|
use Psr\Http\Message\RequestInterface;
|
||||||
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
class Guzzle5HttpHandler
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var ClientInterface
|
||||||
|
*/
|
||||||
|
private $client;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ClientInterface $client
|
||||||
|
*/
|
||||||
|
public function __construct(ClientInterface $client)
|
||||||
|
{
|
||||||
|
$this->client = $client;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accepts a PSR-7 Request and an array of options and returns a PSR-7 response.
|
||||||
|
*
|
||||||
|
* @param RequestInterface $request
|
||||||
|
* @param array $options
|
||||||
|
* @return ResponseInterface
|
||||||
|
*/
|
||||||
|
public function __invoke(RequestInterface $request, array $options = [])
|
||||||
|
{
|
||||||
|
$response = $this->client->send(
|
||||||
|
$this->createGuzzle5Request($request, $options)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->createPsr7Response($response);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accepts a PSR-7 request and an array of options and returns a PromiseInterface
|
||||||
|
*
|
||||||
|
* @param RequestInterface $request
|
||||||
|
* @param array $options
|
||||||
|
* @return Promise
|
||||||
|
*/
|
||||||
|
public function async(RequestInterface $request, array $options = [])
|
||||||
|
{
|
||||||
|
if (!class_exists('GuzzleHttp\Promise\Promise')) {
|
||||||
|
throw new Exception('Install guzzlehttp/promises to use async with Guzzle 5');
|
||||||
|
}
|
||||||
|
|
||||||
|
$futureResponse = $this->client->send(
|
||||||
|
$this->createGuzzle5Request(
|
||||||
|
$request,
|
||||||
|
['future' => true] + $options
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$promise = new Promise(
|
||||||
|
function () use ($futureResponse) {
|
||||||
|
try {
|
||||||
|
$futureResponse->wait();
|
||||||
|
} catch (Exception $e) {
|
||||||
|
// The promise is already delivered when the exception is
|
||||||
|
// thrown, so don't rethrow it.
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[$futureResponse, 'cancel']
|
||||||
|
);
|
||||||
|
|
||||||
|
$futureResponse->then([$promise, 'resolve'], [$promise, 'reject']);
|
||||||
|
|
||||||
|
return $promise->then(
|
||||||
|
function (Guzzle5ResponseInterface $response) {
|
||||||
|
// Adapt the Guzzle 5 Response to a PSR-7 Response.
|
||||||
|
return $this->createPsr7Response($response);
|
||||||
|
},
|
||||||
|
function (Exception $e) {
|
||||||
|
return new RejectedPromise($e);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function createGuzzle5Request(RequestInterface $request, array $options)
|
||||||
|
{
|
||||||
|
return $this->client->createRequest(
|
||||||
|
$request->getMethod(),
|
||||||
|
$request->getUri(),
|
||||||
|
array_merge_recursive([
|
||||||
|
'headers' => $request->getHeaders(),
|
||||||
|
'body' => $request->getBody(),
|
||||||
|
], $options)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function createPsr7Response(Guzzle5ResponseInterface $response)
|
||||||
|
{
|
||||||
|
return new Response(
|
||||||
|
$response->getStatusCode(),
|
||||||
|
$response->getHeaders() ?: [],
|
||||||
|
$response->getBody(),
|
||||||
|
$response->getProtocolVersion(),
|
||||||
|
$response->getReasonPhrase()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
62
common/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php
vendored
Normal file
62
common/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php
vendored
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright 2015 Google Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
namespace Google\Auth\HttpHandler;
|
||||||
|
|
||||||
|
use GuzzleHttp\ClientInterface;
|
||||||
|
use Psr\Http\Message\RequestInterface;
|
||||||
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
|
||||||
|
class Guzzle6HttpHandler
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var ClientInterface
|
||||||
|
*/
|
||||||
|
private $client;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ClientInterface $client
|
||||||
|
*/
|
||||||
|
public function __construct(ClientInterface $client)
|
||||||
|
{
|
||||||
|
$this->client = $client;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accepts a PSR-7 request and an array of options and returns a PSR-7 response.
|
||||||
|
*
|
||||||
|
* @param RequestInterface $request
|
||||||
|
* @param array<mixed> $options
|
||||||
|
* @return ResponseInterface
|
||||||
|
*/
|
||||||
|
public function __invoke(RequestInterface $request, array $options = [])
|
||||||
|
{
|
||||||
|
return $this->client->send($request, $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accepts a PSR-7 request and an array of options and returns a PromiseInterface
|
||||||
|
*
|
||||||
|
* @param RequestInterface $request
|
||||||
|
* @param array<mixed> $options
|
||||||
|
*
|
||||||
|
* @return \GuzzleHttp\Promise\PromiseInterface
|
||||||
|
*/
|
||||||
|
public function async(RequestInterface $request, array $options = [])
|
||||||
|
{
|
||||||
|
return $this->client->sendAsync($request, $options);
|
||||||
|
}
|
||||||
|
}
|
||||||
21
common/vendor/google/auth/src/HttpHandler/Guzzle7HttpHandler.php
vendored
Normal file
21
common/vendor/google/auth/src/HttpHandler/Guzzle7HttpHandler.php
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright 2020 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
namespace Google\Auth\HttpHandler;
|
||||||
|
|
||||||
|
class Guzzle7HttpHandler extends Guzzle6HttpHandler
|
||||||
|
{
|
||||||
|
}
|
||||||
54
common/vendor/google/auth/src/HttpHandler/HttpClientCache.php
vendored
Normal file
54
common/vendor/google/auth/src/HttpHandler/HttpClientCache.php
vendored
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\HttpHandler;
|
||||||
|
|
||||||
|
use GuzzleHttp\ClientInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stores an HTTP Client in order to prevent multiple instantiations.
|
||||||
|
*/
|
||||||
|
class HttpClientCache
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var ClientInterface|null
|
||||||
|
*/
|
||||||
|
private static $httpClient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache an HTTP Client for later calls.
|
||||||
|
*
|
||||||
|
* Passing null will unset the cached client.
|
||||||
|
*
|
||||||
|
* @param ClientInterface|null $client
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setHttpClient(ClientInterface $client = null)
|
||||||
|
{
|
||||||
|
self::$httpClient = $client;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the stored HTTP Client, or null.
|
||||||
|
*
|
||||||
|
* @return ClientInterface|null
|
||||||
|
*/
|
||||||
|
public static function getHttpClient()
|
||||||
|
{
|
||||||
|
return self::$httpClient;
|
||||||
|
}
|
||||||
|
}
|
||||||
66
common/vendor/google/auth/src/HttpHandler/HttpHandlerFactory.php
vendored
Normal file
66
common/vendor/google/auth/src/HttpHandler/HttpHandlerFactory.php
vendored
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright 2015 Google Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
namespace Google\Auth\HttpHandler;
|
||||||
|
|
||||||
|
use GuzzleHttp\BodySummarizer;
|
||||||
|
use GuzzleHttp\Client;
|
||||||
|
use GuzzleHttp\ClientInterface;
|
||||||
|
use GuzzleHttp\HandlerStack;
|
||||||
|
use GuzzleHttp\Middleware;
|
||||||
|
|
||||||
|
class HttpHandlerFactory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Builds out a default http handler for the installed version of guzzle.
|
||||||
|
*
|
||||||
|
* @param ClientInterface $client
|
||||||
|
* @return Guzzle5HttpHandler|Guzzle6HttpHandler|Guzzle7HttpHandler
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
public static function build(ClientInterface $client = null)
|
||||||
|
{
|
||||||
|
if (is_null($client)) {
|
||||||
|
$stack = null;
|
||||||
|
if (class_exists(BodySummarizer::class)) {
|
||||||
|
// double the # of characters before truncation by default
|
||||||
|
$bodySummarizer = new BodySummarizer(240);
|
||||||
|
$stack = HandlerStack::create();
|
||||||
|
$stack->remove('http_errors');
|
||||||
|
$stack->unshift(Middleware::httpErrors($bodySummarizer), 'http_errors');
|
||||||
|
}
|
||||||
|
$client = new Client(['handler' => $stack]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$version = null;
|
||||||
|
if (defined('GuzzleHttp\ClientInterface::MAJOR_VERSION')) {
|
||||||
|
$version = ClientInterface::MAJOR_VERSION;
|
||||||
|
} elseif (defined('GuzzleHttp\ClientInterface::VERSION')) {
|
||||||
|
$version = (int) substr(ClientInterface::VERSION, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($version) {
|
||||||
|
case 5:
|
||||||
|
return new Guzzle5HttpHandler($client);
|
||||||
|
case 6:
|
||||||
|
return new Guzzle6HttpHandler($client);
|
||||||
|
case 7:
|
||||||
|
return new Guzzle7HttpHandler($client);
|
||||||
|
default:
|
||||||
|
throw new \Exception('Version not supported');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
100
common/vendor/google/auth/src/Iam.php
vendored
Normal file
100
common/vendor/google/auth/src/Iam.php
vendored
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
use Google\Auth\HttpHandler\HttpClientCache;
|
||||||
|
use Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||||
|
use GuzzleHttp\Psr7;
|
||||||
|
use GuzzleHttp\Psr7\Utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tools for using the IAM API.
|
||||||
|
*
|
||||||
|
* @see https://cloud.google.com/iam/docs IAM Documentation
|
||||||
|
*/
|
||||||
|
class Iam
|
||||||
|
{
|
||||||
|
const IAM_API_ROOT = 'https://iamcredentials.googleapis.com/v1';
|
||||||
|
const SIGN_BLOB_PATH = '%s:signBlob?alt=json';
|
||||||
|
const SERVICE_ACCOUNT_NAME = 'projects/-/serviceAccounts/%s';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var callable
|
||||||
|
*/
|
||||||
|
private $httpHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param callable $httpHandler [optional] The HTTP Handler to send requests.
|
||||||
|
*/
|
||||||
|
public function __construct(callable $httpHandler = null)
|
||||||
|
{
|
||||||
|
$this->httpHandler = $httpHandler
|
||||||
|
?: HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign a string using the IAM signBlob API.
|
||||||
|
*
|
||||||
|
* Note that signing using IAM requires your service account to have the
|
||||||
|
* `iam.serviceAccounts.signBlob` permission, part of the "Service Account
|
||||||
|
* Token Creator" IAM role.
|
||||||
|
*
|
||||||
|
* @param string $email The service account email.
|
||||||
|
* @param string $accessToken An access token from the service account.
|
||||||
|
* @param string $stringToSign The string to be signed.
|
||||||
|
* @param array<string> $delegates [optional] A list of service account emails to
|
||||||
|
* add to the delegate chain. If omitted, the value of `$email` will
|
||||||
|
* be used.
|
||||||
|
* @return string The signed string, base64-encoded.
|
||||||
|
*/
|
||||||
|
public function signBlob($email, $accessToken, $stringToSign, array $delegates = [])
|
||||||
|
{
|
||||||
|
$httpHandler = $this->httpHandler;
|
||||||
|
$name = sprintf(self::SERVICE_ACCOUNT_NAME, $email);
|
||||||
|
$uri = self::IAM_API_ROOT . '/' . sprintf(self::SIGN_BLOB_PATH, $name);
|
||||||
|
|
||||||
|
if ($delegates) {
|
||||||
|
foreach ($delegates as &$delegate) {
|
||||||
|
$delegate = sprintf(self::SERVICE_ACCOUNT_NAME, $delegate);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$delegates = [$name];
|
||||||
|
}
|
||||||
|
|
||||||
|
$body = [
|
||||||
|
'delegates' => $delegates,
|
||||||
|
'payload' => base64_encode($stringToSign),
|
||||||
|
];
|
||||||
|
|
||||||
|
$headers = [
|
||||||
|
'Authorization' => 'Bearer ' . $accessToken
|
||||||
|
];
|
||||||
|
|
||||||
|
$request = new Psr7\Request(
|
||||||
|
'POST',
|
||||||
|
$uri,
|
||||||
|
$headers,
|
||||||
|
Utils::streamFor(json_encode($body))
|
||||||
|
);
|
||||||
|
|
||||||
|
$res = $httpHandler($request);
|
||||||
|
$body = json_decode((string) $res->getBody(), true);
|
||||||
|
|
||||||
|
return $body['signedBlob'];
|
||||||
|
}
|
||||||
|
}
|
||||||
67
common/vendor/google/auth/src/IamSignerTrait.php
vendored
Normal file
67
common/vendor/google/auth/src/IamSignerTrait.php
vendored
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2022 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
use Google\Auth\HttpHandler\HttpClientCache;
|
||||||
|
use Google\Auth\HttpHandler\HttpHandlerFactory;
|
||||||
|
|
||||||
|
trait IamSignerTrait
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Iam|null
|
||||||
|
*/
|
||||||
|
private $iam;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign a string using the default service account private key.
|
||||||
|
*
|
||||||
|
* This implementation uses IAM's signBlob API.
|
||||||
|
*
|
||||||
|
* @see https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/signBlob SignBlob
|
||||||
|
*
|
||||||
|
* @param string $stringToSign The string to sign.
|
||||||
|
* @param bool $forceOpenSsl [optional] Does not apply to this credentials
|
||||||
|
* type.
|
||||||
|
* @param string $accessToken The access token to use to sign the blob. If
|
||||||
|
* provided, saves a call to the metadata server for a new access
|
||||||
|
* token. **Defaults to** `null`.
|
||||||
|
* @return string
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public function signBlob($stringToSign, $forceOpenSsl = false, $accessToken = null)
|
||||||
|
{
|
||||||
|
$httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient());
|
||||||
|
|
||||||
|
// Providing a signer is useful for testing, but it's undocumented
|
||||||
|
// because it's not something a user would generally need to do.
|
||||||
|
$signer = $this->iam ?: new Iam($httpHandler);
|
||||||
|
|
||||||
|
$email = $this->getClientName($httpHandler);
|
||||||
|
|
||||||
|
if (is_null($accessToken)) {
|
||||||
|
$previousToken = $this->getLastReceivedToken();
|
||||||
|
$accessToken = $previousToken
|
||||||
|
? $previousToken['access_token']
|
||||||
|
: $this->fetchAuthToken($httpHandler)['access_token'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $signer->signBlob($email, $accessToken, $stringToSign);
|
||||||
|
}
|
||||||
|
}
|
||||||
155
common/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php
vendored
Normal file
155
common/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php
vendored
Normal file
|
|
@ -0,0 +1,155 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Middleware;
|
||||||
|
|
||||||
|
use Google\Auth\FetchAuthTokenInterface;
|
||||||
|
use Google\Auth\GetQuotaProjectInterface;
|
||||||
|
use Psr\Http\Message\RequestInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AuthTokenMiddleware is a Guzzle Middleware that adds an Authorization header
|
||||||
|
* provided by an object implementing FetchAuthTokenInterface.
|
||||||
|
*
|
||||||
|
* The FetchAuthTokenInterface#fetchAuthToken is used to obtain a hash; one of
|
||||||
|
* the values value in that hash is added as the authorization header.
|
||||||
|
*
|
||||||
|
* Requests will be accessed with the authorization header:
|
||||||
|
*
|
||||||
|
* 'authorization' 'Bearer <value of auth_token>'
|
||||||
|
*/
|
||||||
|
class AuthTokenMiddleware
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var callable
|
||||||
|
*/
|
||||||
|
private $httpHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var FetchAuthTokenInterface
|
||||||
|
*/
|
||||||
|
private $fetcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var ?callable
|
||||||
|
*/
|
||||||
|
private $tokenCallback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new AuthTokenMiddleware.
|
||||||
|
*
|
||||||
|
* @param FetchAuthTokenInterface $fetcher is used to fetch the auth token
|
||||||
|
* @param callable $httpHandler (optional) callback which delivers psr7 request
|
||||||
|
* @param callable $tokenCallback (optional) function to be called when a new token is fetched.
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
FetchAuthTokenInterface $fetcher,
|
||||||
|
callable $httpHandler = null,
|
||||||
|
callable $tokenCallback = null
|
||||||
|
) {
|
||||||
|
$this->fetcher = $fetcher;
|
||||||
|
$this->httpHandler = $httpHandler;
|
||||||
|
$this->tokenCallback = $tokenCallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the request with an Authorization header when auth is 'google_auth'.
|
||||||
|
*
|
||||||
|
* use Google\Auth\Middleware\AuthTokenMiddleware;
|
||||||
|
* use Google\Auth\OAuth2;
|
||||||
|
* use GuzzleHttp\Client;
|
||||||
|
* use GuzzleHttp\HandlerStack;
|
||||||
|
*
|
||||||
|
* $config = [..<oauth config param>.];
|
||||||
|
* $oauth2 = new OAuth2($config)
|
||||||
|
* $middleware = new AuthTokenMiddleware($oauth2);
|
||||||
|
* $stack = HandlerStack::create();
|
||||||
|
* $stack->push($middleware);
|
||||||
|
*
|
||||||
|
* $client = new Client([
|
||||||
|
* 'handler' => $stack,
|
||||||
|
* 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
|
||||||
|
* 'auth' => 'google_auth' // authorize all requests
|
||||||
|
* ]);
|
||||||
|
*
|
||||||
|
* $res = $client->get('myproject/taskqueues/myqueue');
|
||||||
|
*
|
||||||
|
* @param callable $handler
|
||||||
|
* @return \Closure
|
||||||
|
*/
|
||||||
|
public function __invoke(callable $handler)
|
||||||
|
{
|
||||||
|
return function (RequestInterface $request, array $options) use ($handler) {
|
||||||
|
// Requests using "auth"="google_auth" will be authorized.
|
||||||
|
if (!isset($options['auth']) || $options['auth'] !== 'google_auth') {
|
||||||
|
return $handler($request, $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
$request = $request->withHeader('authorization', 'Bearer ' . $this->fetchToken());
|
||||||
|
|
||||||
|
if ($quotaProject = $this->getQuotaProject()) {
|
||||||
|
$request = $request->withHeader(
|
||||||
|
GetQuotaProjectInterface::X_GOOG_USER_PROJECT_HEADER,
|
||||||
|
$quotaProject
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $handler($request, $options);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call fetcher to fetch the token.
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
private function fetchToken()
|
||||||
|
{
|
||||||
|
$auth_tokens = (array) $this->fetcher->fetchAuthToken($this->httpHandler);
|
||||||
|
|
||||||
|
if (array_key_exists('access_token', $auth_tokens)) {
|
||||||
|
// notify the callback if applicable
|
||||||
|
if ($this->tokenCallback) {
|
||||||
|
call_user_func(
|
||||||
|
$this->tokenCallback,
|
||||||
|
$this->fetcher->getCacheKey(),
|
||||||
|
$auth_tokens['access_token']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $auth_tokens['access_token'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('id_token', $auth_tokens)) {
|
||||||
|
return $auth_tokens['id_token'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
private function getQuotaProject()
|
||||||
|
{
|
||||||
|
if ($this->fetcher instanceof GetQuotaProjectInterface) {
|
||||||
|
return $this->fetcher->getQuotaProject();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
155
common/vendor/google/auth/src/Middleware/ProxyAuthTokenMiddleware.php
vendored
Normal file
155
common/vendor/google/auth/src/Middleware/ProxyAuthTokenMiddleware.php
vendored
Normal file
|
|
@ -0,0 +1,155 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Middleware;
|
||||||
|
|
||||||
|
use Google\Auth\FetchAuthTokenInterface;
|
||||||
|
use Google\Auth\GetQuotaProjectInterface;
|
||||||
|
use Psr\Http\Message\RequestInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ProxyAuthTokenMiddleware is a Guzzle Middleware that adds an Authorization header
|
||||||
|
* provided by an object implementing FetchAuthTokenInterface.
|
||||||
|
*
|
||||||
|
* The FetchAuthTokenInterface#fetchAuthToken is used to obtain a hash; one of
|
||||||
|
* the values value in that hash is added as the authorization header.
|
||||||
|
*
|
||||||
|
* Requests will be accessed with the authorization header:
|
||||||
|
*
|
||||||
|
* 'proxy-authorization' 'Bearer <value of auth_token>'
|
||||||
|
*/
|
||||||
|
class ProxyAuthTokenMiddleware
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var callable
|
||||||
|
*/
|
||||||
|
private $httpHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var FetchAuthTokenInterface
|
||||||
|
*/
|
||||||
|
private $fetcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var ?callable
|
||||||
|
*/
|
||||||
|
private $tokenCallback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new ProxyAuthTokenMiddleware.
|
||||||
|
*
|
||||||
|
* @param FetchAuthTokenInterface $fetcher is used to fetch the auth token
|
||||||
|
* @param callable $httpHandler (optional) callback which delivers psr7 request
|
||||||
|
* @param callable $tokenCallback (optional) function to be called when a new token is fetched.
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
FetchAuthTokenInterface $fetcher,
|
||||||
|
callable $httpHandler = null,
|
||||||
|
callable $tokenCallback = null
|
||||||
|
) {
|
||||||
|
$this->fetcher = $fetcher;
|
||||||
|
$this->httpHandler = $httpHandler;
|
||||||
|
$this->tokenCallback = $tokenCallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the request with an Authorization header when auth is 'google_auth'.
|
||||||
|
*
|
||||||
|
* use Google\Auth\Middleware\ProxyAuthTokenMiddleware;
|
||||||
|
* use Google\Auth\OAuth2;
|
||||||
|
* use GuzzleHttp\Client;
|
||||||
|
* use GuzzleHttp\HandlerStack;
|
||||||
|
*
|
||||||
|
* $config = [..<oauth config param>.];
|
||||||
|
* $oauth2 = new OAuth2($config)
|
||||||
|
* $middleware = new ProxyAuthTokenMiddleware($oauth2);
|
||||||
|
* $stack = HandlerStack::create();
|
||||||
|
* $stack->push($middleware);
|
||||||
|
*
|
||||||
|
* $client = new Client([
|
||||||
|
* 'handler' => $stack,
|
||||||
|
* 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
|
||||||
|
* 'proxy_auth' => 'google_auth' // authorize all requests
|
||||||
|
* ]);
|
||||||
|
*
|
||||||
|
* $res = $client->get('myproject/taskqueues/myqueue');
|
||||||
|
*
|
||||||
|
* @param callable $handler
|
||||||
|
* @return \Closure
|
||||||
|
*/
|
||||||
|
public function __invoke(callable $handler)
|
||||||
|
{
|
||||||
|
return function (RequestInterface $request, array $options) use ($handler) {
|
||||||
|
// Requests using "proxy_auth"="google_auth" will be authorized.
|
||||||
|
if (!isset($options['proxy_auth']) || $options['proxy_auth'] !== 'google_auth') {
|
||||||
|
return $handler($request, $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
$request = $request->withHeader('proxy-authorization', 'Bearer ' . $this->fetchToken());
|
||||||
|
|
||||||
|
if ($quotaProject = $this->getQuotaProject()) {
|
||||||
|
$request = $request->withHeader(
|
||||||
|
GetQuotaProjectInterface::X_GOOG_USER_PROJECT_HEADER,
|
||||||
|
$quotaProject
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $handler($request, $options);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call fetcher to fetch the token.
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
private function fetchToken()
|
||||||
|
{
|
||||||
|
$auth_tokens = $this->fetcher->fetchAuthToken($this->httpHandler);
|
||||||
|
|
||||||
|
if (array_key_exists('access_token', $auth_tokens)) {
|
||||||
|
// notify the callback if applicable
|
||||||
|
if ($this->tokenCallback) {
|
||||||
|
call_user_func(
|
||||||
|
$this->tokenCallback,
|
||||||
|
$this->fetcher->getCacheKey(),
|
||||||
|
$auth_tokens['access_token']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $auth_tokens['access_token'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array_key_exists('id_token', $auth_tokens)) {
|
||||||
|
return $auth_tokens['id_token'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string|null;
|
||||||
|
*/
|
||||||
|
private function getQuotaProject()
|
||||||
|
{
|
||||||
|
if ($this->fetcher instanceof GetQuotaProjectInterface) {
|
||||||
|
return $this->fetcher->getQuotaProject();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
165
common/vendor/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php
vendored
Normal file
165
common/vendor/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php
vendored
Normal file
|
|
@ -0,0 +1,165 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Middleware;
|
||||||
|
|
||||||
|
use Google\Auth\CacheTrait;
|
||||||
|
use Psr\Cache\CacheItemPoolInterface;
|
||||||
|
use Psr\Http\Message\RequestInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ScopedAccessTokenMiddleware is a Guzzle Middleware that adds an Authorization
|
||||||
|
* header provided by a closure.
|
||||||
|
*
|
||||||
|
* The closure returns an access token, taking the scope, either a single
|
||||||
|
* string or an array of strings, as its value. If provided, a cache will be
|
||||||
|
* used to preserve the access token for a given lifetime.
|
||||||
|
*
|
||||||
|
* Requests will be accessed with the authorization header:
|
||||||
|
*
|
||||||
|
* 'authorization' 'Bearer <value of auth_token>'
|
||||||
|
*/
|
||||||
|
class ScopedAccessTokenMiddleware
|
||||||
|
{
|
||||||
|
use CacheTrait;
|
||||||
|
|
||||||
|
const DEFAULT_CACHE_LIFETIME = 1500;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var callable
|
||||||
|
*/
|
||||||
|
private $tokenFunc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<string>|string
|
||||||
|
*/
|
||||||
|
private $scopes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new ScopedAccessTokenMiddleware.
|
||||||
|
*
|
||||||
|
* @param callable $tokenFunc a token generator function
|
||||||
|
* @param array<string>|string $scopes the token authentication scopes
|
||||||
|
* @param array<mixed> $cacheConfig configuration for the cache when it's present
|
||||||
|
* @param CacheItemPoolInterface $cache an implementation of CacheItemPoolInterface
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
callable $tokenFunc,
|
||||||
|
$scopes,
|
||||||
|
array $cacheConfig = null,
|
||||||
|
CacheItemPoolInterface $cache = null
|
||||||
|
) {
|
||||||
|
$this->tokenFunc = $tokenFunc;
|
||||||
|
if (!(is_string($scopes) || is_array($scopes))) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'wants scope should be string or array'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$this->scopes = $scopes;
|
||||||
|
|
||||||
|
if (!is_null($cache)) {
|
||||||
|
$this->cache = $cache;
|
||||||
|
$this->cacheConfig = array_merge([
|
||||||
|
'lifetime' => self::DEFAULT_CACHE_LIFETIME,
|
||||||
|
'prefix' => '',
|
||||||
|
], $cacheConfig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the request with an Authorization header when auth is 'scoped'.
|
||||||
|
*
|
||||||
|
* E.g this could be used to authenticate using the AppEngine
|
||||||
|
* AppIdentityService.
|
||||||
|
*
|
||||||
|
* use google\appengine\api\app_identity\AppIdentityService;
|
||||||
|
* use Google\Auth\Middleware\ScopedAccessTokenMiddleware;
|
||||||
|
* use GuzzleHttp\Client;
|
||||||
|
* use GuzzleHttp\HandlerStack;
|
||||||
|
*
|
||||||
|
* $scope = 'https://www.googleapis.com/auth/taskqueue'
|
||||||
|
* $middleware = new ScopedAccessTokenMiddleware(
|
||||||
|
* 'AppIdentityService::getAccessToken',
|
||||||
|
* $scope,
|
||||||
|
* [ 'prefix' => 'Google\Auth\ScopedAccessToken::' ],
|
||||||
|
* $cache = new Memcache()
|
||||||
|
* );
|
||||||
|
* $stack = HandlerStack::create();
|
||||||
|
* $stack->push($middleware);
|
||||||
|
*
|
||||||
|
* $client = new Client([
|
||||||
|
* 'handler' => $stack,
|
||||||
|
* 'base_url' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/',
|
||||||
|
* 'auth' => 'scoped' // authorize all requests
|
||||||
|
* ]);
|
||||||
|
*
|
||||||
|
* $res = $client->get('myproject/taskqueues/myqueue');
|
||||||
|
*
|
||||||
|
* @param callable $handler
|
||||||
|
* @return \Closure
|
||||||
|
*/
|
||||||
|
public function __invoke(callable $handler)
|
||||||
|
{
|
||||||
|
return function (RequestInterface $request, array $options) use ($handler) {
|
||||||
|
// Requests using "auth"="scoped" will be authorized.
|
||||||
|
if (!isset($options['auth']) || $options['auth'] !== 'scoped') {
|
||||||
|
return $handler($request, $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
$request = $request->withHeader('authorization', 'Bearer ' . $this->fetchToken());
|
||||||
|
|
||||||
|
return $handler($request, $options);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function getCacheKey()
|
||||||
|
{
|
||||||
|
$key = null;
|
||||||
|
|
||||||
|
if (is_string($this->scopes)) {
|
||||||
|
$key .= $this->scopes;
|
||||||
|
} elseif (is_array($this->scopes)) {
|
||||||
|
$key .= implode(':', $this->scopes);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if token is available in the cache, if not call tokenFunc to
|
||||||
|
* fetch it.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function fetchToken()
|
||||||
|
{
|
||||||
|
$cacheKey = $this->getCacheKey();
|
||||||
|
$cached = $this->getCachedValue($cacheKey);
|
||||||
|
|
||||||
|
if (!empty($cached)) {
|
||||||
|
return $cached;
|
||||||
|
}
|
||||||
|
|
||||||
|
$token = call_user_func($this->tokenFunc, $this->scopes);
|
||||||
|
$this->setCachedValue($cacheKey, $token);
|
||||||
|
|
||||||
|
return $token;
|
||||||
|
}
|
||||||
|
}
|
||||||
92
common/vendor/google/auth/src/Middleware/SimpleMiddleware.php
vendored
Normal file
92
common/vendor/google/auth/src/Middleware/SimpleMiddleware.php
vendored
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2015 Google Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth\Middleware;
|
||||||
|
|
||||||
|
use GuzzleHttp\Psr7\Query;
|
||||||
|
use Psr\Http\Message\RequestInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SimpleMiddleware is a Guzzle Middleware that implements Google's Simple API
|
||||||
|
* access.
|
||||||
|
*
|
||||||
|
* Requests are accessed using the Simple API access developer key.
|
||||||
|
*/
|
||||||
|
class SimpleMiddleware
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var array<mixed>
|
||||||
|
*/
|
||||||
|
private $config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new Simple plugin.
|
||||||
|
*
|
||||||
|
* The configuration array expects one option
|
||||||
|
* - key: required, otherwise InvalidArgumentException is thrown
|
||||||
|
*
|
||||||
|
* @param array<mixed> $config Configuration array
|
||||||
|
*/
|
||||||
|
public function __construct(array $config)
|
||||||
|
{
|
||||||
|
if (!isset($config['key'])) {
|
||||||
|
throw new \InvalidArgumentException('requires a key to have been set');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->config = array_merge(['key' => null], $config);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the request query with the developer key if auth is set to simple.
|
||||||
|
*
|
||||||
|
* use Google\Auth\Middleware\SimpleMiddleware;
|
||||||
|
* use GuzzleHttp\Client;
|
||||||
|
* use GuzzleHttp\HandlerStack;
|
||||||
|
*
|
||||||
|
* $my_key = 'is not the same as yours';
|
||||||
|
* $middleware = new SimpleMiddleware(['key' => $my_key]);
|
||||||
|
* $stack = HandlerStack::create();
|
||||||
|
* $stack->push($middleware);
|
||||||
|
*
|
||||||
|
* $client = new Client([
|
||||||
|
* 'handler' => $stack,
|
||||||
|
* 'base_uri' => 'https://www.googleapis.com/discovery/v1/',
|
||||||
|
* 'auth' => 'simple'
|
||||||
|
* ]);
|
||||||
|
*
|
||||||
|
* $res = $client->get('drive/v2/rest');
|
||||||
|
*
|
||||||
|
* @param callable $handler
|
||||||
|
* @return \Closure
|
||||||
|
*/
|
||||||
|
public function __invoke(callable $handler)
|
||||||
|
{
|
||||||
|
return function (RequestInterface $request, array $options) use ($handler) {
|
||||||
|
// Requests using "auth"="scoped" will be authorized.
|
||||||
|
if (!isset($options['auth']) || $options['auth'] !== 'simple') {
|
||||||
|
return $handler($request, $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = Query::parse($request->getUri()->getQuery());
|
||||||
|
$params = array_merge($query, $this->config);
|
||||||
|
$uri = $request->getUri()->withQuery(Query::build($params));
|
||||||
|
$request = $request->withUri($uri);
|
||||||
|
|
||||||
|
return $handler($request, $options);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
1591
common/vendor/google/auth/src/OAuth2.php
vendored
Normal file
1591
common/vendor/google/auth/src/OAuth2.php
vendored
Normal file
File diff suppressed because it is too large
Load diff
32
common/vendor/google/auth/src/ProjectIdProviderInterface.php
vendored
Normal file
32
common/vendor/google/auth/src/ProjectIdProviderInterface.php
vendored
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2020 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes a Credentials object which supports fetching the project ID.
|
||||||
|
*/
|
||||||
|
interface ProjectIdProviderInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Get the project ID.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler Callback which delivers psr7 request
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getProjectId(callable $httpHandler = null);
|
||||||
|
}
|
||||||
57
common/vendor/google/auth/src/ServiceAccountSignerTrait.php
vendored
Normal file
57
common/vendor/google/auth/src/ServiceAccountSignerTrait.php
vendored
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
use phpseclib\Crypt\RSA;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign a string using a Service Account private key.
|
||||||
|
*/
|
||||||
|
trait ServiceAccountSignerTrait
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Sign a string using the service account private key.
|
||||||
|
*
|
||||||
|
* @param string $stringToSign
|
||||||
|
* @param bool $forceOpenssl Whether to use OpenSSL regardless of
|
||||||
|
* whether phpseclib is installed. **Defaults to** `false`.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function signBlob($stringToSign, $forceOpenssl = false)
|
||||||
|
{
|
||||||
|
$privateKey = $this->auth->getSigningKey();
|
||||||
|
|
||||||
|
$signedString = '';
|
||||||
|
if (class_exists('\\phpseclib\\Crypt\\RSA') && !$forceOpenssl) {
|
||||||
|
$rsa = new RSA();
|
||||||
|
$rsa->loadKey($privateKey);
|
||||||
|
$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
|
||||||
|
$rsa->setHash('sha256');
|
||||||
|
|
||||||
|
$signedString = $rsa->sign($stringToSign);
|
||||||
|
} elseif (extension_loaded('openssl')) {
|
||||||
|
openssl_sign($stringToSign, $signedString, $privateKey, 'sha256WithRSAEncryption');
|
||||||
|
} else {
|
||||||
|
// @codeCoverageIgnoreStart
|
||||||
|
throw new \RuntimeException('OpenSSL is not installed.');
|
||||||
|
}
|
||||||
|
// @codeCoverageIgnoreEnd
|
||||||
|
|
||||||
|
return base64_encode($signedString);
|
||||||
|
}
|
||||||
|
}
|
||||||
44
common/vendor/google/auth/src/SignBlobInterface.php
vendored
Normal file
44
common/vendor/google/auth/src/SignBlobInterface.php
vendored
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2019 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes a class which supports signing arbitrary strings.
|
||||||
|
*/
|
||||||
|
interface SignBlobInterface extends FetchAuthTokenInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Sign a string using the method which is best for a given credentials type.
|
||||||
|
*
|
||||||
|
* @param string $stringToSign The string to sign.
|
||||||
|
* @param bool $forceOpenssl Require use of OpenSSL for local signing. Does
|
||||||
|
* not apply to signing done using external services. **Defaults to**
|
||||||
|
* `false`.
|
||||||
|
* @return string The resulting signature. Value should be base64-encoded.
|
||||||
|
*/
|
||||||
|
public function signBlob($stringToSign, $forceOpenssl = false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current Client Name.
|
||||||
|
*
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request, if
|
||||||
|
* one is required to obtain a client name.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getClientName(callable $httpHandler = null);
|
||||||
|
}
|
||||||
41
common/vendor/google/auth/src/UpdateMetadataInterface.php
vendored
Normal file
41
common/vendor/google/auth/src/UpdateMetadataInterface.php
vendored
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Copyright 2020 Google LLC
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Google\Auth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes a Credentials object which supports updating request metadata
|
||||||
|
* (request headers).
|
||||||
|
*/
|
||||||
|
interface UpdateMetadataInterface
|
||||||
|
{
|
||||||
|
const AUTH_METADATA_KEY = 'authorization';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates metadata with the authorization token.
|
||||||
|
*
|
||||||
|
* @param array<mixed> $metadata metadata hashmap
|
||||||
|
* @param string $authUri optional auth uri
|
||||||
|
* @param callable $httpHandler callback which delivers psr7 request
|
||||||
|
* @return array<mixed> updated metadata hashmap
|
||||||
|
*/
|
||||||
|
public function updateMetadata(
|
||||||
|
$metadata,
|
||||||
|
$authUri = null,
|
||||||
|
callable $httpHandler = null
|
||||||
|
);
|
||||||
|
}
|
||||||
104
common/vendor/guzzlehttp/guzzle/CHANGELOG.md
vendored
104
common/vendor/guzzlehttp/guzzle/CHANGELOG.md
vendored
|
|
@ -2,6 +2,64 @@
|
||||||
|
|
||||||
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.8.1 - 2023-12-03
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Updated links in docs to their canonical versions
|
||||||
|
- Replaced `call_user_func*` with native calls
|
||||||
|
|
||||||
|
|
||||||
|
## 7.8.0 - 2023-08-27
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Support for PHP 8.3
|
||||||
|
- Added automatic closing of handles on `CurlFactory` object destruction
|
||||||
|
|
||||||
|
|
||||||
|
## 7.7.1 - 2023-08-27
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Remove the need for `AllowDynamicProperties` in `CurlMultiHandler`
|
||||||
|
|
||||||
|
|
||||||
|
## 7.7.0 - 2023-05-21
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Support `guzzlehttp/promises` v2
|
||||||
|
|
||||||
|
|
||||||
|
## 7.6.1 - 2023-05-15
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix `SetCookie::fromString` MaxAge deprecation warning and skip invalid MaxAge values
|
||||||
|
|
||||||
|
|
||||||
|
## 7.6.0 - 2023-05-14
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Support for setting the minimum TLS version in a unified way
|
||||||
|
- Apply on request the version set in options parameters
|
||||||
|
|
||||||
|
|
||||||
|
## 7.5.2 - 2023-05-14
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed set cookie constructor validation
|
||||||
|
- Fixed handling of files with `'0'` body
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Corrected docs and default connect timeout value to 300 seconds
|
||||||
|
|
||||||
|
|
||||||
## 7.5.1 - 2023-04-17
|
## 7.5.1 - 2023-04-17
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
@ -12,6 +70,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
|
||||||
|
|
||||||
- Adjusted `guzzlehttp/psr7` version constraint to `^1.9.1 || ^2.4.5`
|
- Adjusted `guzzlehttp/psr7` version constraint to `^1.9.1 || ^2.4.5`
|
||||||
|
|
||||||
|
|
||||||
## 7.5.0 - 2022-08-28
|
## 7.5.0 - 2022-08-28
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
@ -19,6 +78,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
|
||||||
- Support PHP 8.2
|
- Support PHP 8.2
|
||||||
- Add request to delay closure params
|
- Add request to delay closure params
|
||||||
|
|
||||||
|
|
||||||
## 7.4.5 - 2022-06-20
|
## 7.4.5 - 2022-06-20
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
@ -26,6 +86,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
|
||||||
* Fix change in port should be considered a change in origin
|
* Fix change in port should be considered a change in origin
|
||||||
* Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin
|
* Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin
|
||||||
|
|
||||||
|
|
||||||
## 7.4.4 - 2022-06-09
|
## 7.4.4 - 2022-06-09
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
@ -33,12 +94,14 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
|
||||||
* Fix failure to strip Authorization header on HTTP downgrade
|
* Fix failure to strip Authorization header on HTTP downgrade
|
||||||
* Fix failure to strip the Cookie header on change in host or HTTP downgrade
|
* Fix failure to strip the Cookie header on change in host or HTTP downgrade
|
||||||
|
|
||||||
|
|
||||||
## 7.4.3 - 2022-05-25
|
## 7.4.3 - 2022-05-25
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
* Fix cross-domain cookie leakage
|
* Fix cross-domain cookie leakage
|
||||||
|
|
||||||
|
|
||||||
## 7.4.2 - 2022-03-20
|
## 7.4.2 - 2022-03-20
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
@ -47,6 +110,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
|
||||||
- Reject non-HTTP schemes in StreamHandler
|
- Reject non-HTTP schemes in StreamHandler
|
||||||
- Set a default ssl.peer_name context in StreamHandler to allow `force_ip_resolve`
|
- Set a default ssl.peer_name context in StreamHandler to allow `force_ip_resolve`
|
||||||
|
|
||||||
|
|
||||||
## 7.4.1 - 2021-12-06
|
## 7.4.1 - 2021-12-06
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
@ -58,6 +122,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
|
||||||
|
|
||||||
- Only close curl handle if it's done [#2950](https://github.com/guzzle/guzzle/pull/2950)
|
- Only close curl handle if it's done [#2950](https://github.com/guzzle/guzzle/pull/2950)
|
||||||
|
|
||||||
|
|
||||||
## 7.4.0 - 2021-10-18
|
## 7.4.0 - 2021-10-18
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
@ -75,6 +140,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
|
||||||
|
|
||||||
- Be more strict with types [#2914](https://github.com/guzzle/guzzle/pull/2914), [#2917](https://github.com/guzzle/guzzle/pull/2917), [#2919](https://github.com/guzzle/guzzle/pull/2919), [#2945](https://github.com/guzzle/guzzle/pull/2945)
|
- Be more strict with types [#2914](https://github.com/guzzle/guzzle/pull/2914), [#2917](https://github.com/guzzle/guzzle/pull/2917), [#2919](https://github.com/guzzle/guzzle/pull/2919), [#2945](https://github.com/guzzle/guzzle/pull/2945)
|
||||||
|
|
||||||
|
|
||||||
## 7.3.0 - 2021-03-23
|
## 7.3.0 - 2021-03-23
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
@ -87,6 +153,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
|
||||||
|
|
||||||
- Handle exceptions on invalid header consistently between PHP versions and handlers [#2872](https://github.com/guzzle/guzzle/pull/2872)
|
- Handle exceptions on invalid header consistently between PHP versions and handlers [#2872](https://github.com/guzzle/guzzle/pull/2872)
|
||||||
|
|
||||||
|
|
||||||
## 7.2.0 - 2020-10-10
|
## 7.2.0 - 2020-10-10
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
@ -109,6 +176,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
|
||||||
|
|
||||||
- Using environment variable GUZZLE_CURL_SELECT_TIMEOUT [#2786](https://github.com/guzzle/guzzle/pull/2786)
|
- Using environment variable GUZZLE_CURL_SELECT_TIMEOUT [#2786](https://github.com/guzzle/guzzle/pull/2786)
|
||||||
|
|
||||||
|
|
||||||
## 7.1.1 - 2020-09-30
|
## 7.1.1 - 2020-09-30
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
@ -120,6 +188,7 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
|
||||||
- We dont connect curl `sink` on HEAD requests.
|
- We dont connect curl `sink` on HEAD requests.
|
||||||
- Removed some PHP 5 workarounds
|
- Removed some PHP 5 workarounds
|
||||||
|
|
||||||
|
|
||||||
## 7.1.0 - 2020-09-22
|
## 7.1.0 - 2020-09-22
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
@ -142,14 +211,17 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version
|
||||||
- `Utils::defaultCaBundle()`
|
- `Utils::defaultCaBundle()`
|
||||||
- `CurlFactory::LOW_CURL_VERSION_NUMBER`
|
- `CurlFactory::LOW_CURL_VERSION_NUMBER`
|
||||||
|
|
||||||
|
|
||||||
## 7.0.1 - 2020-06-27
|
## 7.0.1 - 2020-06-27
|
||||||
|
|
||||||
* Fix multiply defined functions fatal error [#2699](https://github.com/guzzle/guzzle/pull/2699)
|
* Fix multiply defined functions fatal error [#2699](https://github.com/guzzle/guzzle/pull/2699)
|
||||||
|
|
||||||
|
|
||||||
## 7.0.0 - 2020-06-27
|
## 7.0.0 - 2020-06-27
|
||||||
|
|
||||||
No changes since 7.0.0-rc1.
|
No changes since 7.0.0-rc1.
|
||||||
|
|
||||||
|
|
||||||
## 7.0.0-rc1 - 2020-06-15
|
## 7.0.0-rc1 - 2020-06-15
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
@ -157,6 +229,7 @@ No changes since 7.0.0-rc1.
|
||||||
* Use error level for logging errors in Middleware [#2629](https://github.com/guzzle/guzzle/pull/2629)
|
* Use error level for logging errors in Middleware [#2629](https://github.com/guzzle/guzzle/pull/2629)
|
||||||
* Disabled IDN support by default and require ext-intl to use it [#2675](https://github.com/guzzle/guzzle/pull/2675)
|
* Disabled IDN support by default and require ext-intl to use it [#2675](https://github.com/guzzle/guzzle/pull/2675)
|
||||||
|
|
||||||
|
|
||||||
## 7.0.0-beta2 - 2020-05-25
|
## 7.0.0-beta2 - 2020-05-25
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
@ -182,6 +255,7 @@ No changes since 7.0.0-rc1.
|
||||||
|
|
||||||
* Pool option `pool_size` [#2528](https://github.com/guzzle/guzzle/pull/2528)
|
* Pool option `pool_size` [#2528](https://github.com/guzzle/guzzle/pull/2528)
|
||||||
|
|
||||||
|
|
||||||
## 7.0.0-beta1 - 2019-12-30
|
## 7.0.0-beta1 - 2019-12-30
|
||||||
|
|
||||||
The diff might look very big but 95% of Guzzle users will be able to upgrade without modification.
|
The diff might look very big but 95% of Guzzle users will be able to upgrade without modification.
|
||||||
|
|
@ -215,15 +289,18 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* `uri_template()` and `UriTemplate` [#2440](https://github.com/guzzle/guzzle/pull/2440)
|
* `uri_template()` and `UriTemplate` [#2440](https://github.com/guzzle/guzzle/pull/2440)
|
||||||
* Request options `save_to` and `exceptions` [#2464](https://github.com/guzzle/guzzle/pull/2464)
|
* Request options `save_to` and `exceptions` [#2464](https://github.com/guzzle/guzzle/pull/2464)
|
||||||
|
|
||||||
|
|
||||||
## 6.5.2 - 2019-12-23
|
## 6.5.2 - 2019-12-23
|
||||||
|
|
||||||
* idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489)
|
* idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489)
|
||||||
|
|
||||||
|
|
||||||
## 6.5.1 - 2019-12-21
|
## 6.5.1 - 2019-12-21
|
||||||
|
|
||||||
* Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454)
|
* Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454)
|
||||||
* IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424)
|
* IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424)
|
||||||
|
|
||||||
|
|
||||||
## 6.5.0 - 2019-12-07
|
## 6.5.0 - 2019-12-07
|
||||||
|
|
||||||
* Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143)
|
* Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143)
|
||||||
|
|
@ -233,11 +310,13 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348)
|
* Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348)
|
||||||
* Deprecated `ClientInterface::VERSION`
|
* Deprecated `ClientInterface::VERSION`
|
||||||
|
|
||||||
|
|
||||||
## 6.4.1 - 2019-10-23
|
## 6.4.1 - 2019-10-23
|
||||||
|
|
||||||
* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that
|
* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that
|
||||||
* Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar`
|
* Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar`
|
||||||
|
|
||||||
|
|
||||||
## 6.4.0 - 2019-10-23
|
## 6.4.0 - 2019-10-23
|
||||||
|
|
||||||
* Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108)
|
* Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108)
|
||||||
|
|
@ -250,6 +329,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335)
|
* Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335)
|
||||||
* Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362)
|
* Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362)
|
||||||
|
|
||||||
|
|
||||||
## 6.3.3 - 2018-04-22
|
## 6.3.3 - 2018-04-22
|
||||||
|
|
||||||
* Fix: Default headers when decode_content is specified
|
* Fix: Default headers when decode_content is specified
|
||||||
|
|
@ -291,13 +371,14 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684)
|
* Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684)
|
||||||
* Improvement: Use `\GuzzleHttp\Promise\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827)
|
* Improvement: Use `\GuzzleHttp\Promise\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827)
|
||||||
|
|
||||||
|
|
||||||
+ Minor code cleanups, documentation fixes and clarifications.
|
+ Minor code cleanups, documentation fixes and clarifications.
|
||||||
|
|
||||||
|
|
||||||
## 6.2.3 - 2017-02-28
|
## 6.2.3 - 2017-02-28
|
||||||
|
|
||||||
* Fix deprecations with guzzle/psr7 version 1.4
|
* Fix deprecations with guzzle/psr7 version 1.4
|
||||||
|
|
||||||
|
|
||||||
## 6.2.2 - 2016-10-08
|
## 6.2.2 - 2016-10-08
|
||||||
|
|
||||||
* Allow to pass nullable Response to delay callable
|
* Allow to pass nullable Response to delay callable
|
||||||
|
|
@ -305,6 +386,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* Fix drain case where content-length is the literal string zero
|
* Fix drain case where content-length is the literal string zero
|
||||||
* Obfuscate in-URL credentials in exceptions
|
* Obfuscate in-URL credentials in exceptions
|
||||||
|
|
||||||
|
|
||||||
## 6.2.1 - 2016-07-18
|
## 6.2.1 - 2016-07-18
|
||||||
|
|
||||||
* Address HTTP_PROXY security vulnerability, CVE-2016-5385:
|
* Address HTTP_PROXY security vulnerability, CVE-2016-5385:
|
||||||
|
|
@ -315,6 +397,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
a server does not honor `Connection: close`.
|
a server does not honor `Connection: close`.
|
||||||
* Ignore URI fragment when sending requests.
|
* Ignore URI fragment when sending requests.
|
||||||
|
|
||||||
|
|
||||||
## 6.2.0 - 2016-03-21
|
## 6.2.0 - 2016-03-21
|
||||||
|
|
||||||
* Feature: added `GuzzleHttp\json_encode` and `GuzzleHttp\json_decode`.
|
* Feature: added `GuzzleHttp\json_encode` and `GuzzleHttp\json_decode`.
|
||||||
|
|
@ -334,6 +417,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* Bug fix: provide an empty string to `http_build_query` for HHVM workaround.
|
* Bug fix: provide an empty string to `http_build_query` for HHVM workaround.
|
||||||
https://github.com/guzzle/guzzle/pull/1367
|
https://github.com/guzzle/guzzle/pull/1367
|
||||||
|
|
||||||
|
|
||||||
## 6.1.1 - 2015-11-22
|
## 6.1.1 - 2015-11-22
|
||||||
|
|
||||||
* Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler
|
* Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler
|
||||||
|
|
@ -349,6 +433,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* Bug fix: fixed regression where MockHandler was not using `sink`.
|
* Bug fix: fixed regression where MockHandler was not using `sink`.
|
||||||
https://github.com/guzzle/guzzle/pull/1292
|
https://github.com/guzzle/guzzle/pull/1292
|
||||||
|
|
||||||
|
|
||||||
## 6.1.0 - 2015-09-08
|
## 6.1.0 - 2015-09-08
|
||||||
|
|
||||||
* Feature: Added the `on_stats` request option to provide access to transfer
|
* Feature: Added the `on_stats` request option to provide access to transfer
|
||||||
|
|
@ -383,6 +468,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set.
|
* Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set.
|
||||||
https://github.com/guzzle/guzzle/pull/1189
|
https://github.com/guzzle/guzzle/pull/1189
|
||||||
|
|
||||||
|
|
||||||
## 6.0.2 - 2015-07-04
|
## 6.0.2 - 2015-07-04
|
||||||
|
|
||||||
* Fixed a memory leak in the curl handlers in which references to callbacks
|
* Fixed a memory leak in the curl handlers in which references to callbacks
|
||||||
|
|
@ -400,6 +486,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* Functions are now conditionally required using an additional level of
|
* Functions are now conditionally required using an additional level of
|
||||||
indirection to help with global Composer installations.
|
indirection to help with global Composer installations.
|
||||||
|
|
||||||
|
|
||||||
## 6.0.1 - 2015-05-27
|
## 6.0.1 - 2015-05-27
|
||||||
|
|
||||||
* Fixed a bug with serializing the `query` request option where the `&`
|
* Fixed a bug with serializing the `query` request option where the `&`
|
||||||
|
|
@ -408,6 +495,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
use `form_params` or `multipart` instead.
|
use `form_params` or `multipart` instead.
|
||||||
* Various doc fixes.
|
* Various doc fixes.
|
||||||
|
|
||||||
|
|
||||||
## 6.0.0 - 2015-05-26
|
## 6.0.0 - 2015-05-26
|
||||||
|
|
||||||
* See the UPGRADING.md document for more information.
|
* See the UPGRADING.md document for more information.
|
||||||
|
|
@ -432,6 +520,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* `$maxHandles` has been removed from CurlMultiHandler.
|
* `$maxHandles` has been removed from CurlMultiHandler.
|
||||||
* `MultipartPostBody` is now part of the `guzzlehttp/psr7` package.
|
* `MultipartPostBody` is now part of the `guzzlehttp/psr7` package.
|
||||||
|
|
||||||
|
|
||||||
## 5.3.0 - 2015-05-19
|
## 5.3.0 - 2015-05-19
|
||||||
|
|
||||||
* Mock now supports `save_to`
|
* Mock now supports `save_to`
|
||||||
|
|
@ -442,6 +531,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* Marked `GuzzleHttp\Client::getDefaultUserAgent` as deprecated.
|
* Marked `GuzzleHttp\Client::getDefaultUserAgent` as deprecated.
|
||||||
* URL scheme is now always lowercased.
|
* URL scheme is now always lowercased.
|
||||||
|
|
||||||
|
|
||||||
## 6.0.0-beta.1
|
## 6.0.0-beta.1
|
||||||
|
|
||||||
* Requires PHP >= 5.5
|
* Requires PHP >= 5.5
|
||||||
|
|
@ -494,6 +584,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* `GuzzleHttp\QueryParser` has been replaced with the
|
* `GuzzleHttp\QueryParser` has been replaced with the
|
||||||
`GuzzleHttp\Psr7\parse_query`.
|
`GuzzleHttp\Psr7\parse_query`.
|
||||||
|
|
||||||
|
|
||||||
## 5.2.0 - 2015-01-27
|
## 5.2.0 - 2015-01-27
|
||||||
|
|
||||||
* Added `AppliesHeadersInterface` to make applying headers to a request based
|
* Added `AppliesHeadersInterface` to make applying headers to a request based
|
||||||
|
|
@ -504,6 +595,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
RingBridge.
|
RingBridge.
|
||||||
* Added a guard in the Pool class to not use recursion for request retries.
|
* Added a guard in the Pool class to not use recursion for request retries.
|
||||||
|
|
||||||
|
|
||||||
## 5.1.0 - 2014-12-19
|
## 5.1.0 - 2014-12-19
|
||||||
|
|
||||||
* Pool class no longer uses recursion when a request is intercepted.
|
* Pool class no longer uses recursion when a request is intercepted.
|
||||||
|
|
@ -524,6 +616,7 @@ Please see [the upgrade document](UPGRADING.md) that describes all BC breaking c
|
||||||
* Exceptions thrown in the `end` event are now correctly wrapped with Guzzle
|
* Exceptions thrown in the `end` event are now correctly wrapped with Guzzle
|
||||||
specific exceptions if necessary.
|
specific exceptions if necessary.
|
||||||
|
|
||||||
|
|
||||||
## 5.0.3 - 2014-11-03
|
## 5.0.3 - 2014-11-03
|
||||||
|
|
||||||
This change updates query strings so that they are treated as un-encoded values
|
This change updates query strings so that they are treated as un-encoded values
|
||||||
|
|
@ -538,6 +631,7 @@ string that should not be parsed or encoded (unless a call to getQuery() is
|
||||||
subsequently made, forcing the query-string to be converted into a Query
|
subsequently made, forcing the query-string to be converted into a Query
|
||||||
object).
|
object).
|
||||||
|
|
||||||
|
|
||||||
## 5.0.2 - 2014-10-30
|
## 5.0.2 - 2014-10-30
|
||||||
|
|
||||||
* Added a trailing `\r\n` to multipart/form-data payloads. See
|
* Added a trailing `\r\n` to multipart/form-data payloads. See
|
||||||
|
|
@ -557,7 +651,9 @@ object).
|
||||||
* Note: This has been changed in 5.0.3 to now encode query string values by
|
* Note: This has been changed in 5.0.3 to now encode query string values by
|
||||||
default unless the `rawString` argument is provided when setting the query
|
default unless the `rawString` argument is provided when setting the query
|
||||||
string on a URL: Now allowing many more characters to be present in the
|
string on a URL: Now allowing many more characters to be present in the
|
||||||
query string without being percent encoded. See https://tools.ietf.org/html/rfc3986#appendix-A
|
query string without being percent encoded. See
|
||||||
|
https://datatracker.ietf.org/doc/html/rfc3986#appendix-A
|
||||||
|
|
||||||
|
|
||||||
## 5.0.1 - 2014-10-16
|
## 5.0.1 - 2014-10-16
|
||||||
|
|
||||||
|
|
@ -570,6 +666,7 @@ Bugfix release.
|
||||||
* Fixed an issue where transfer statistics were not being populated in the
|
* Fixed an issue where transfer statistics were not being populated in the
|
||||||
RingBridge. https://github.com/guzzle/guzzle/issues/866
|
RingBridge. https://github.com/guzzle/guzzle/issues/866
|
||||||
|
|
||||||
|
|
||||||
## 5.0.0 - 2014-10-12
|
## 5.0.0 - 2014-10-12
|
||||||
|
|
||||||
Adding support for non-blocking responses and some minor API cleanup.
|
Adding support for non-blocking responses and some minor API cleanup.
|
||||||
|
|
@ -651,6 +748,7 @@ interfaces.
|
||||||
argument. They now accept an associative array of options, including the
|
argument. They now accept an associative array of options, including the
|
||||||
"size" key and "metadata" key which can be used to provide custom metadata.
|
"size" key and "metadata" key which can be used to provide custom metadata.
|
||||||
|
|
||||||
|
|
||||||
## 4.2.2 - 2014-09-08
|
## 4.2.2 - 2014-09-08
|
||||||
|
|
||||||
* Fixed a memory leak in the CurlAdapter when reusing cURL handles.
|
* Fixed a memory leak in the CurlAdapter when reusing cURL handles.
|
||||||
|
|
@ -1093,7 +1191,7 @@ interfaces.
|
||||||
|
|
||||||
## 3.4.0 - 2013-04-11
|
## 3.4.0 - 2013-04-11
|
||||||
|
|
||||||
* Bug fix: URLs are now resolved correctly based on https://tools.ietf.org/html/rfc3986#section-5.2. #289
|
* Bug fix: URLs are now resolved correctly based on https://datatracker.ietf.org/doc/html/rfc3986#section-5.2. #289
|
||||||
* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289
|
* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289
|
||||||
* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263
|
* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263
|
||||||
* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264.
|
* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264.
|
||||||
|
|
|
||||||
16
common/vendor/guzzlehttp/guzzle/README.md
vendored
16
common/vendor/guzzlehttp/guzzle/README.md
vendored
|
|
@ -3,7 +3,7 @@
|
||||||
# Guzzle, PHP HTTP client
|
# Guzzle, PHP HTTP client
|
||||||
|
|
||||||
[](https://github.com/guzzle/guzzle/releases)
|
[](https://github.com/guzzle/guzzle/releases)
|
||||||
[](https://github.com/guzzle/guzzle/actions?query=workflow%3ACI)
|
[](https://github.com/guzzle/guzzle/actions?query=workflow%3ACI)
|
||||||
[](https://packagist.org/packages/guzzlehttp/guzzle)
|
[](https://packagist.org/packages/guzzlehttp/guzzle)
|
||||||
|
|
||||||
Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and
|
Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and
|
||||||
|
|
@ -60,13 +60,13 @@ composer require guzzlehttp/guzzle
|
||||||
|
|
||||||
## Version Guidance
|
## Version Guidance
|
||||||
|
|
||||||
| 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 | `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 | `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 | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >=5.4,<7.4 |
|
||||||
| 6.x | Security fixes | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >=5.5,<8.0 |
|
| 6.x | Security fixes only | `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.3 |
|
| 7.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes | >=7.2.5,<8.4 |
|
||||||
|
|
||||||
[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
|
||||||
|
|
|
||||||
16
common/vendor/guzzlehttp/guzzle/UPGRADING.md
vendored
16
common/vendor/guzzlehttp/guzzle/UPGRADING.md
vendored
|
|
@ -27,7 +27,7 @@ Please make sure:
|
||||||
- Function `GuzzleHttp\Exception\RequestException::getResponseBodySummary` is removed.
|
- Function `GuzzleHttp\Exception\RequestException::getResponseBodySummary` is removed.
|
||||||
Use `\GuzzleHttp\Psr7\get_message_body_summary` as an alternative.
|
Use `\GuzzleHttp\Psr7\get_message_body_summary` as an alternative.
|
||||||
- Function `GuzzleHttp\Cookie\CookieJar::getCookieValue` is removed.
|
- Function `GuzzleHttp\Cookie\CookieJar::getCookieValue` is removed.
|
||||||
- Request option `exception` is removed. Please use `http_errors`.
|
- Request option `exceptions` is removed. Please use `http_errors`.
|
||||||
- Request option `save_to` is removed. Please use `sink`.
|
- Request option `save_to` is removed. Please use `sink`.
|
||||||
- Pool option `pool_size` is removed. Please use `concurrency`.
|
- Pool option `pool_size` is removed. Please use `concurrency`.
|
||||||
- We now look for environment variables in the `$_SERVER` super global, due to thread safety issues with `getenv`. We continue to fallback to `getenv` in CLI environments, for maximum compatibility.
|
- We now look for environment variables in the `$_SERVER` super global, due to thread safety issues with `getenv`. We continue to fallback to `getenv` in CLI environments, for maximum compatibility.
|
||||||
|
|
@ -189,11 +189,11 @@ $client = new GuzzleHttp\Client(['handler' => $handler]);
|
||||||
|
|
||||||
## POST Requests
|
## POST Requests
|
||||||
|
|
||||||
This version added the [`form_params`](http://guzzle.readthedocs.org/en/latest/request-options.html#form_params)
|
This version added the [`form_params`](https://docs.guzzlephp.org/en/latest/request-options.html#form_params)
|
||||||
and `multipart` request options. `form_params` is an associative array of
|
and `multipart` request options. `form_params` is an associative array of
|
||||||
strings or array of strings and is used to serialize an
|
strings or array of strings and is used to serialize an
|
||||||
`application/x-www-form-urlencoded` POST request. The
|
`application/x-www-form-urlencoded` POST request. The
|
||||||
[`multipart`](http://guzzle.readthedocs.org/en/latest/request-options.html#multipart)
|
[`multipart`](https://docs.guzzlephp.org/en/latest/request-options.html#multipart)
|
||||||
option is now used to send a multipart/form-data POST request.
|
option is now used to send a multipart/form-data POST request.
|
||||||
|
|
||||||
`GuzzleHttp\Post\PostFile` has been removed. Use the `multipart` option to add
|
`GuzzleHttp\Post\PostFile` has been removed. Use the `multipart` option to add
|
||||||
|
|
@ -209,7 +209,7 @@ The `base_url` option has been renamed to `base_uri`.
|
||||||
|
|
||||||
## Rewritten Adapter Layer
|
## Rewritten Adapter Layer
|
||||||
|
|
||||||
Guzzle now uses [RingPHP](http://ringphp.readthedocs.org/en/latest) to send
|
Guzzle now uses [RingPHP](https://ringphp.readthedocs.org/en/latest) to send
|
||||||
HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor
|
HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor
|
||||||
is still supported, but it has now been renamed to `handler`. Instead of
|
is still supported, but it has now been renamed to `handler`. Instead of
|
||||||
passing a `GuzzleHttp\Adapter\AdapterInterface`, you must now pass a PHP
|
passing a `GuzzleHttp\Adapter\AdapterInterface`, you must now pass a PHP
|
||||||
|
|
@ -575,7 +575,7 @@ You can intercept a request and inject a response using the `intercept()` event
|
||||||
of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and
|
of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and
|
||||||
`GuzzleHttp\Event\ErrorEvent` event.
|
`GuzzleHttp\Event\ErrorEvent` event.
|
||||||
|
|
||||||
See: http://docs.guzzlephp.org/en/latest/events.html
|
See: https://docs.guzzlephp.org/en/latest/events.html
|
||||||
|
|
||||||
## Inflection
|
## Inflection
|
||||||
|
|
||||||
|
|
@ -668,9 +668,9 @@ in separate repositories:
|
||||||
|
|
||||||
The service description layer of Guzzle has moved into two separate packages:
|
The service description layer of Guzzle has moved into two separate packages:
|
||||||
|
|
||||||
- http://github.com/guzzle/command Provides a high level abstraction over web
|
- https://github.com/guzzle/command Provides a high level abstraction over web
|
||||||
services by representing web service operations using commands.
|
services by representing web service operations using commands.
|
||||||
- http://github.com/guzzle/guzzle-services Provides an implementation of
|
- https://github.com/guzzle/guzzle-services Provides an implementation of
|
||||||
guzzle/command that provides request serialization and response parsing using
|
guzzle/command that provides request serialization and response parsing using
|
||||||
Guzzle service descriptions.
|
Guzzle service descriptions.
|
||||||
|
|
||||||
|
|
@ -870,7 +870,7 @@ HeaderInterface (e.g. toArray(), getAll(), etc.).
|
||||||
3.3 to 3.4
|
3.3 to 3.4
|
||||||
----------
|
----------
|
||||||
|
|
||||||
Base URLs of a client now follow the rules of https://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs.
|
Base URLs of a client now follow the rules of https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.2 when merging URLs.
|
||||||
|
|
||||||
3.2 to 3.3
|
3.2 to 3.3
|
||||||
----------
|
----------
|
||||||
|
|
|
||||||
14
common/vendor/guzzlehttp/guzzle/composer.json
vendored
14
common/vendor/guzzlehttp/guzzle/composer.json
vendored
|
|
@ -53,8 +53,8 @@
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.2.5 || ^8.0",
|
"php": "^7.2.5 || ^8.0",
|
||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"guzzlehttp/promises": "^1.5",
|
"guzzlehttp/promises": "^1.5.3 || ^2.0.1",
|
||||||
"guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
|
"guzzlehttp/psr7": "^1.9.1 || ^2.5.1",
|
||||||
"psr/http-client": "^1.0",
|
"psr/http-client": "^1.0",
|
||||||
"symfony/deprecation-contracts": "^2.2 || ^3.0"
|
"symfony/deprecation-contracts": "^2.2 || ^3.0"
|
||||||
},
|
},
|
||||||
|
|
@ -63,9 +63,10 @@
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"ext-curl": "*",
|
"ext-curl": "*",
|
||||||
"bamarni/composer-bin-plugin": "^1.8.1",
|
"bamarni/composer-bin-plugin": "^1.8.2",
|
||||||
"php-http/client-integration-tests": "^3.0",
|
"php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
|
||||||
"phpunit/phpunit": "^8.5.29 || ^9.5.23",
|
"php-http/message-factory": "^1.1",
|
||||||
|
"phpunit/phpunit": "^8.5.36 || ^9.6.15",
|
||||||
"psr/log": "^1.1 || ^2.0 || ^3.0"
|
"psr/log": "^1.1 || ^2.0 || ^3.0"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
|
|
@ -84,9 +85,6 @@
|
||||||
"bamarni-bin": {
|
"bamarni-bin": {
|
||||||
"bin-links": true,
|
"bin-links": true,
|
||||||
"forward-command": false
|
"forward-command": false
|
||||||
},
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "7.5-dev"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
|
|
|
||||||
40
common/vendor/guzzlehttp/guzzle/src/Client.php
vendored
40
common/vendor/guzzlehttp/guzzle/src/Client.php
vendored
|
|
@ -120,13 +120,14 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
|
||||||
public function send(RequestInterface $request, array $options = []): ResponseInterface
|
public function send(RequestInterface $request, array $options = []): ResponseInterface
|
||||||
{
|
{
|
||||||
$options[RequestOptions::SYNCHRONOUS] = true;
|
$options[RequestOptions::SYNCHRONOUS] = true;
|
||||||
|
|
||||||
return $this->sendAsync($request, $options)->wait();
|
return $this->sendAsync($request, $options)->wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The HttpClient PSR (PSR-18) specify this method.
|
* The HttpClient PSR (PSR-18) specify this method.
|
||||||
*
|
*
|
||||||
* @inheritDoc
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
public function sendRequest(RequestInterface $request): ResponseInterface
|
public function sendRequest(RequestInterface $request): ResponseInterface
|
||||||
{
|
{
|
||||||
|
|
@ -184,6 +185,7 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
|
||||||
public function request(string $method, $uri = '', array $options = []): ResponseInterface
|
public function request(string $method, $uri = '', array $options = []): ResponseInterface
|
||||||
{
|
{
|
||||||
$options[RequestOptions::SYNCHRONOUS] = true;
|
$options[RequestOptions::SYNCHRONOUS] = true;
|
||||||
|
|
||||||
return $this->requestAsync($method, $uri, $options)->wait();
|
return $this->requestAsync($method, $uri, $options)->wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -200,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
|
||||||
|
|
@ -228,11 +230,11 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
|
||||||
{
|
{
|
||||||
$defaults = [
|
$defaults = [
|
||||||
'allow_redirects' => RedirectMiddleware::$defaultSettings,
|
'allow_redirects' => RedirectMiddleware::$defaultSettings,
|
||||||
'http_errors' => true,
|
'http_errors' => true,
|
||||||
'decode_content' => true,
|
'decode_content' => true,
|
||||||
'verify' => true,
|
'verify' => true,
|
||||||
'cookies' => false,
|
'cookies' => false,
|
||||||
'idn_conversion' => false,
|
'idn_conversion' => false,
|
||||||
];
|
];
|
||||||
|
|
||||||
// Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.
|
// Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set.
|
||||||
|
|
@ -354,10 +356,10 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
|
||||||
if (isset($options['form_params'])) {
|
if (isset($options['form_params'])) {
|
||||||
if (isset($options['multipart'])) {
|
if (isset($options['multipart'])) {
|
||||||
throw new InvalidArgumentException('You cannot use '
|
throw new InvalidArgumentException('You cannot use '
|
||||||
. 'form_params and multipart at the same time. Use the '
|
.'form_params and multipart at the same time. Use the '
|
||||||
. 'form_params option if you want to send application/'
|
.'form_params option if you want to send application/'
|
||||||
. 'x-www-form-urlencoded requests, and the multipart '
|
.'x-www-form-urlencoded requests, and the multipart '
|
||||||
. 'option to send multipart/form-data requests.');
|
.'option to send multipart/form-data requests.');
|
||||||
}
|
}
|
||||||
$options['body'] = \http_build_query($options['form_params'], '', '&');
|
$options['body'] = \http_build_query($options['form_params'], '', '&');
|
||||||
unset($options['form_params']);
|
unset($options['form_params']);
|
||||||
|
|
@ -403,7 +405,7 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
|
||||||
// Ensure that we don't have the header in different case and set the new value.
|
// Ensure that we don't have the header in different case and set the new value.
|
||||||
$modify['set_headers'] = Psr7\Utils::caselessRemove(['Authorization'], $modify['set_headers']);
|
$modify['set_headers'] = Psr7\Utils::caselessRemove(['Authorization'], $modify['set_headers']);
|
||||||
$modify['set_headers']['Authorization'] = 'Basic '
|
$modify['set_headers']['Authorization'] = 'Basic '
|
||||||
. \base64_encode("$value[0]:$value[1]");
|
.\base64_encode("$value[0]:$value[1]");
|
||||||
break;
|
break;
|
||||||
case 'digest':
|
case 'digest':
|
||||||
// @todo: Do not rely on curl
|
// @todo: Do not rely on curl
|
||||||
|
|
@ -437,13 +439,17 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isset($options['version'])) {
|
||||||
|
$modify['version'] = $options['version'];
|
||||||
|
}
|
||||||
|
|
||||||
$request = Psr7\Utils::modifyRequest($request, $modify);
|
$request = Psr7\Utils::modifyRequest($request, $modify);
|
||||||
if ($request->getBody() instanceof Psr7\MultipartStream) {
|
if ($request->getBody() instanceof Psr7\MultipartStream) {
|
||||||
// Use a multipart/form-data POST if a Content-Type is not set.
|
// Use a multipart/form-data POST if a Content-Type is not set.
|
||||||
// Ensure that we don't have the header in different case and set the new value.
|
// Ensure that we don't have the header in different case and set the new value.
|
||||||
$options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']);
|
$options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']);
|
||||||
$options['_conditional']['Content-Type'] = 'multipart/form-data; boundary='
|
$options['_conditional']['Content-Type'] = 'multipart/form-data; boundary='
|
||||||
. $request->getBody()->getBoundary();
|
.$request->getBody()->getBoundary();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Merge in conditional headers if they are not present.
|
// Merge in conditional headers if they are not present.
|
||||||
|
|
@ -469,9 +475,9 @@ class Client implements ClientInterface, \Psr\Http\Client\ClientInterface
|
||||||
private function invalidBody(): InvalidArgumentException
|
private function invalidBody(): InvalidArgumentException
|
||||||
{
|
{
|
||||||
return new InvalidArgumentException('Passing in the "body" request '
|
return new InvalidArgumentException('Passing in the "body" request '
|
||||||
. 'option as an array to send a request is not supported. '
|
.'option as an array to send a request is not supported. '
|
||||||
. 'Please use the "form_params" request option to send a '
|
.'Please use the "form_params" request option to send a '
|
||||||
. 'application/x-www-form-urlencoded request, or the "multipart" '
|
.'application/x-www-form-urlencoded request, or the "multipart" '
|
||||||
. 'request option to send a multipart/form-data request.');
|
.'request option to send a multipart/form-data request.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -50,10 +50,10 @@ class CookieJar implements CookieJarInterface
|
||||||
$cookieJar = new self();
|
$cookieJar = new self();
|
||||||
foreach ($cookies as $name => $value) {
|
foreach ($cookies as $name => $value) {
|
||||||
$cookieJar->setCookie(new SetCookie([
|
$cookieJar->setCookie(new SetCookie([
|
||||||
'Domain' => $domain,
|
'Domain' => $domain,
|
||||||
'Name' => $name,
|
'Name' => $name,
|
||||||
'Value' => $value,
|
'Value' => $value,
|
||||||
'Discard' => true
|
'Discard' => true,
|
||||||
]));
|
]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -96,9 +96,6 @@ class CookieJar implements CookieJarInterface
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function toArray(): array
|
public function toArray(): array
|
||||||
{
|
{
|
||||||
return \array_map(static function (SetCookie $cookie): array {
|
return \array_map(static function (SetCookie $cookie): array {
|
||||||
|
|
@ -106,13 +103,11 @@ class CookieJar implements CookieJarInterface
|
||||||
}, $this->getIterator()->getArrayCopy());
|
}, $this->getIterator()->getArrayCopy());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function clear(string $domain = null, string $path = null, string $name = null): void
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void
|
|
||||||
{
|
{
|
||||||
if (!$domain) {
|
if (!$domain) {
|
||||||
$this->cookies = [];
|
$this->cookies = [];
|
||||||
|
|
||||||
return;
|
return;
|
||||||
} elseif (!$path) {
|
} elseif (!$path) {
|
||||||
$this->cookies = \array_filter(
|
$this->cookies = \array_filter(
|
||||||
|
|
@ -125,25 +120,22 @@ class CookieJar implements CookieJarInterface
|
||||||
$this->cookies = \array_filter(
|
$this->cookies = \array_filter(
|
||||||
$this->cookies,
|
$this->cookies,
|
||||||
static function (SetCookie $cookie) use ($path, $domain): bool {
|
static function (SetCookie $cookie) use ($path, $domain): bool {
|
||||||
return !($cookie->matchesPath($path) &&
|
return !($cookie->matchesPath($path)
|
||||||
$cookie->matchesDomain($domain));
|
&& $cookie->matchesDomain($domain));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$this->cookies = \array_filter(
|
$this->cookies = \array_filter(
|
||||||
$this->cookies,
|
$this->cookies,
|
||||||
static function (SetCookie $cookie) use ($path, $domain, $name) {
|
static function (SetCookie $cookie) use ($path, $domain, $name) {
|
||||||
return !($cookie->getName() == $name &&
|
return !($cookie->getName() == $name
|
||||||
$cookie->matchesPath($path) &&
|
&& $cookie->matchesPath($path)
|
||||||
$cookie->matchesDomain($domain));
|
&& $cookie->matchesDomain($domain));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function clearSessionCookies(): void
|
public function clearSessionCookies(): void
|
||||||
{
|
{
|
||||||
$this->cookies = \array_filter(
|
$this->cookies = \array_filter(
|
||||||
|
|
@ -154,9 +146,6 @@ class CookieJar implements CookieJarInterface
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function setCookie(SetCookie $cookie): bool
|
public function setCookie(SetCookie $cookie): bool
|
||||||
{
|
{
|
||||||
// If the name string is empty (but not 0), ignore the set-cookie
|
// If the name string is empty (but not 0), ignore the set-cookie
|
||||||
|
|
@ -170,9 +159,10 @@ class CookieJar implements CookieJarInterface
|
||||||
$result = $cookie->validate();
|
$result = $cookie->validate();
|
||||||
if ($result !== true) {
|
if ($result !== true) {
|
||||||
if ($this->strictMode) {
|
if ($this->strictMode) {
|
||||||
throw new \RuntimeException('Invalid cookie: ' . $result);
|
throw new \RuntimeException('Invalid cookie: '.$result);
|
||||||
}
|
}
|
||||||
$this->removeCookieIfEmpty($cookie);
|
$this->removeCookieIfEmpty($cookie);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -180,9 +170,9 @@ class CookieJar implements CookieJarInterface
|
||||||
foreach ($this->cookies as $i => $c) {
|
foreach ($this->cookies as $i => $c) {
|
||||||
// Two cookies are identical, when their path, and domain are
|
// Two cookies are identical, when their path, and domain are
|
||||||
// identical.
|
// identical.
|
||||||
if ($c->getPath() != $cookie->getPath() ||
|
if ($c->getPath() != $cookie->getPath()
|
||||||
$c->getDomain() != $cookie->getDomain() ||
|
|| $c->getDomain() != $cookie->getDomain()
|
||||||
$c->getName() != $cookie->getName()
|
|| $c->getName() != $cookie->getName()
|
||||||
) {
|
) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -253,7 +243,7 @@ class CookieJar implements CookieJarInterface
|
||||||
/**
|
/**
|
||||||
* Computes cookie path following RFC 6265 section 5.1.4
|
* Computes cookie path following RFC 6265 section 5.1.4
|
||||||
*
|
*
|
||||||
* @link https://tools.ietf.org/html/rfc6265#section-5.1.4
|
* @see https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.4
|
||||||
*/
|
*/
|
||||||
private function getCookiePathFromRequest(RequestInterface $request): string
|
private function getCookiePathFromRequest(RequestInterface $request): string
|
||||||
{
|
{
|
||||||
|
|
@ -284,13 +274,13 @@ class CookieJar implements CookieJarInterface
|
||||||
$path = $uri->getPath() ?: '/';
|
$path = $uri->getPath() ?: '/';
|
||||||
|
|
||||||
foreach ($this->cookies as $cookie) {
|
foreach ($this->cookies as $cookie) {
|
||||||
if ($cookie->matchesPath($path) &&
|
if ($cookie->matchesPath($path)
|
||||||
$cookie->matchesDomain($host) &&
|
&& $cookie->matchesDomain($host)
|
||||||
!$cookie->isExpired() &&
|
&& !$cookie->isExpired()
|
||||||
(!$cookie->getSecure() || $scheme === 'https')
|
&& (!$cookie->getSecure() || $scheme === 'https')
|
||||||
) {
|
) {
|
||||||
$values[] = $cookie->getName() . '='
|
$values[] = $cookie->getName().'='
|
||||||
. $cookie->getValue();
|
.$cookie->getValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,8 @@ use Psr\Http\Message\ResponseInterface;
|
||||||
* necessary. Subclasses are also responsible for storing and retrieving
|
* necessary. Subclasses are also responsible for storing and retrieving
|
||||||
* cookies from a file, database, etc.
|
* cookies from a file, database, etc.
|
||||||
*
|
*
|
||||||
* @link https://docs.python.org/2/library/cookielib.html Inspiration
|
* @see https://docs.python.org/2/library/cookielib.html Inspiration
|
||||||
|
*
|
||||||
* @extends \IteratorAggregate<SetCookie>
|
* @extends \IteratorAggregate<SetCookie>
|
||||||
*/
|
*/
|
||||||
interface CookieJarInterface extends \Countable, \IteratorAggregate
|
interface CookieJarInterface extends \Countable, \IteratorAggregate
|
||||||
|
|
@ -61,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.
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ class SessionCookieJar extends CookieJar
|
||||||
$this->setCookie(new SetCookie($cookie));
|
$this->setCookie(new SetCookie($cookie));
|
||||||
}
|
}
|
||||||
} elseif (\strlen($data)) {
|
} elseif (\strlen($data)) {
|
||||||
throw new \RuntimeException("Invalid cookie data");
|
throw new \RuntimeException('Invalid cookie data');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,15 +11,15 @@ class SetCookie
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
private static $defaults = [
|
private static $defaults = [
|
||||||
'Name' => null,
|
'Name' => null,
|
||||||
'Value' => null,
|
'Value' => null,
|
||||||
'Domain' => null,
|
'Domain' => null,
|
||||||
'Path' => '/',
|
'Path' => '/',
|
||||||
'Max-Age' => null,
|
'Max-Age' => null,
|
||||||
'Expires' => null,
|
'Expires' => null,
|
||||||
'Secure' => false,
|
'Secure' => false,
|
||||||
'Discard' => false,
|
'Discard' => false,
|
||||||
'HttpOnly' => false
|
'HttpOnly' => false,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -58,7 +58,13 @@ class SetCookie
|
||||||
} else {
|
} else {
|
||||||
foreach (\array_keys(self::$defaults) as $search) {
|
foreach (\array_keys(self::$defaults) as $search) {
|
||||||
if (!\strcasecmp($search, $key)) {
|
if (!\strcasecmp($search, $key)) {
|
||||||
$data[$search] = $value;
|
if ($search === 'Max-Age') {
|
||||||
|
if (is_numeric($value)) {
|
||||||
|
$data[$search] = (int) $value;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$data[$search] = $value;
|
||||||
|
}
|
||||||
continue 2;
|
continue 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -74,13 +80,49 @@ class SetCookie
|
||||||
*/
|
*/
|
||||||
public function __construct(array $data = [])
|
public function __construct(array $data = [])
|
||||||
{
|
{
|
||||||
/** @var array|null $replaced will be null in case of replace error */
|
$this->data = self::$defaults;
|
||||||
$replaced = \array_replace(self::$defaults, $data);
|
|
||||||
if ($replaced === null) {
|
if (isset($data['Name'])) {
|
||||||
throw new \InvalidArgumentException('Unable to replace the default values for the Cookie.');
|
$this->setName($data['Name']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($data['Value'])) {
|
||||||
|
$this->setValue($data['Value']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($data['Domain'])) {
|
||||||
|
$this->setDomain($data['Domain']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($data['Path'])) {
|
||||||
|
$this->setPath($data['Path']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($data['Max-Age'])) {
|
||||||
|
$this->setMaxAge($data['Max-Age']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($data['Expires'])) {
|
||||||
|
$this->setExpires($data['Expires']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($data['Secure'])) {
|
||||||
|
$this->setSecure($data['Secure']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($data['Discard'])) {
|
||||||
|
$this->setDiscard($data['Discard']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($data['HttpOnly'])) {
|
||||||
|
$this->setHttpOnly($data['HttpOnly']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the remaining values that don't have extra validation logic
|
||||||
|
foreach (array_diff(array_keys($data), array_keys(self::$defaults)) as $key) {
|
||||||
|
$this->data[$key] = $data[$key];
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->data = $replaced;
|
|
||||||
// Extract the Expires value and turn it into a UNIX timestamp if needed
|
// Extract the Expires value and turn it into a UNIX timestamp if needed
|
||||||
if (!$this->getExpires() && $this->getMaxAge()) {
|
if (!$this->getExpires() && $this->getMaxAge()) {
|
||||||
// Calculate the Expires date
|
// Calculate the Expires date
|
||||||
|
|
@ -92,13 +134,13 @@ class SetCookie
|
||||||
|
|
||||||
public function __toString()
|
public function __toString()
|
||||||
{
|
{
|
||||||
$str = $this->data['Name'] . '=' . ($this->data['Value'] ?? '') . '; ';
|
$str = $this->data['Name'].'='.($this->data['Value'] ?? '').'; ';
|
||||||
foreach ($this->data as $k => $v) {
|
foreach ($this->data as $k => $v) {
|
||||||
if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) {
|
if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) {
|
||||||
if ($k === 'Expires') {
|
if ($k === 'Expires') {
|
||||||
$str .= 'Expires=' . \gmdate('D, d M Y H:i:s \G\M\T', $v) . '; ';
|
$str .= 'Expires='.\gmdate('D, d M Y H:i:s \G\M\T', $v).'; ';
|
||||||
} else {
|
} else {
|
||||||
$str .= ($v === true ? $k : "{$k}={$v}") . '; ';
|
$str .= ($v === true ? $k : "{$k}={$v}").'; ';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -378,7 +420,7 @@ class SetCookie
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove the leading '.' as per spec in RFC 6265.
|
// Remove the leading '.' as per spec in RFC 6265.
|
||||||
// https://tools.ietf.org/html/rfc6265#section-5.2.3
|
// https://datatracker.ietf.org/doc/html/rfc6265#section-5.2.3
|
||||||
$cookieDomain = \ltrim(\strtolower($cookieDomain), '.');
|
$cookieDomain = \ltrim(\strtolower($cookieDomain), '.');
|
||||||
|
|
||||||
$domain = \strtolower($domain);
|
$domain = \strtolower($domain);
|
||||||
|
|
@ -389,12 +431,12 @@ class SetCookie
|
||||||
}
|
}
|
||||||
|
|
||||||
// Matching the subdomain according to RFC 6265.
|
// Matching the subdomain according to RFC 6265.
|
||||||
// https://tools.ietf.org/html/rfc6265#section-5.1.3
|
// https://datatracker.ietf.org/doc/html/rfc6265#section-5.1.3
|
||||||
if (\filter_var($domain, \FILTER_VALIDATE_IP)) {
|
if (\filter_var($domain, \FILTER_VALIDATE_IP)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (bool) \preg_match('/\.' . \preg_quote($cookieDomain, '/') . '$/', $domain);
|
return (bool) \preg_match('/\.'.\preg_quote($cookieDomain, '/').'$/', $domain);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -423,8 +465,8 @@ class SetCookie
|
||||||
$name
|
$name
|
||||||
)) {
|
)) {
|
||||||
return 'Cookie name must not contain invalid characters: ASCII '
|
return 'Cookie name must not contain invalid characters: ASCII '
|
||||||
. 'Control characters (0-31;127), space, tab and the '
|
.'Control characters (0-31;127), space, tab and the '
|
||||||
. 'following characters: ()<>@,;:\"/?={}';
|
.'following characters: ()<>@,;:\"/?={}';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Value must not be null. 0 and empty string are valid. Empty strings
|
// Value must not be null. 0 and empty string are valid. Empty strings
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
unset($options['curl']['body_as_string']);
|
unset($options['curl']['body_as_string']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$easy = new EasyHandle;
|
$easy = new EasyHandle();
|
||||||
$easy->request = $request;
|
$easy->request = $request;
|
||||||
$easy->options = $options;
|
$easy->options = $options;
|
||||||
$conf = $this->getDefaultConf($easy);
|
$conf = $this->getDefaultConf($easy);
|
||||||
|
|
@ -161,11 +161,11 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
private static function createRejection(EasyHandle $easy, array $ctx): PromiseInterface
|
private static function createRejection(EasyHandle $easy, array $ctx): PromiseInterface
|
||||||
{
|
{
|
||||||
static $connectionErrors = [
|
static $connectionErrors = [
|
||||||
\CURLE_OPERATION_TIMEOUTED => true,
|
\CURLE_OPERATION_TIMEOUTED => true,
|
||||||
\CURLE_COULDNT_RESOLVE_HOST => true,
|
\CURLE_COULDNT_RESOLVE_HOST => true,
|
||||||
\CURLE_COULDNT_CONNECT => true,
|
\CURLE_COULDNT_CONNECT => true,
|
||||||
\CURLE_SSL_CONNECT_ERROR => true,
|
\CURLE_SSL_CONNECT_ERROR => true,
|
||||||
\CURLE_GOT_NOTHING => true,
|
\CURLE_GOT_NOTHING => true,
|
||||||
];
|
];
|
||||||
|
|
||||||
if ($easy->createResponseException) {
|
if ($easy->createResponseException) {
|
||||||
|
|
@ -219,12 +219,12 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
private function getDefaultConf(EasyHandle $easy): array
|
private function getDefaultConf(EasyHandle $easy): array
|
||||||
{
|
{
|
||||||
$conf = [
|
$conf = [
|
||||||
'_headers' => $easy->request->getHeaders(),
|
'_headers' => $easy->request->getHeaders(),
|
||||||
\CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(),
|
\CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(),
|
||||||
\CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''),
|
\CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''),
|
||||||
\CURLOPT_RETURNTRANSFER => false,
|
\CURLOPT_RETURNTRANSFER => false,
|
||||||
\CURLOPT_HEADER => false,
|
\CURLOPT_HEADER => false,
|
||||||
\CURLOPT_CONNECTTIMEOUT => 150,
|
\CURLOPT_CONNECTTIMEOUT => 300,
|
||||||
];
|
];
|
||||||
|
|
||||||
if (\defined('CURLOPT_PROTOCOLS')) {
|
if (\defined('CURLOPT_PROTOCOLS')) {
|
||||||
|
|
@ -250,12 +250,13 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
|
|
||||||
if ($size === null || $size > 0) {
|
if ($size === null || $size > 0) {
|
||||||
$this->applyBody($easy->request, $easy->options, $conf);
|
$this->applyBody($easy->request, $easy->options, $conf);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$method = $easy->request->getMethod();
|
$method = $easy->request->getMethod();
|
||||||
if ($method === 'PUT' || $method === 'POST') {
|
if ($method === 'PUT' || $method === 'POST') {
|
||||||
// See https://tools.ietf.org/html/rfc7230#section-3.3.2
|
// See https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.2
|
||||||
if (!$easy->request->hasHeader('Content-Length')) {
|
if (!$easy->request->hasHeader('Content-Length')) {
|
||||||
$conf[\CURLOPT_HTTPHEADER][] = 'Content-Length: 0';
|
$conf[\CURLOPT_HTTPHEADER][] = 'Content-Length: 0';
|
||||||
}
|
}
|
||||||
|
|
@ -341,6 +342,7 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
foreach (\array_keys($options['_headers']) as $key) {
|
foreach (\array_keys($options['_headers']) as $key) {
|
||||||
if (!\strcasecmp($key, $name)) {
|
if (!\strcasecmp($key, $name)) {
|
||||||
unset($options['_headers'][$key]);
|
unset($options['_headers'][$key]);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -365,11 +367,11 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
// If it's a directory or a link to a directory use CURLOPT_CAPATH.
|
// If it's a directory or a link to a directory use CURLOPT_CAPATH.
|
||||||
// If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO.
|
// If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO.
|
||||||
if (
|
if (
|
||||||
\is_dir($options['verify']) ||
|
\is_dir($options['verify'])
|
||||||
(
|
|| (
|
||||||
\is_link($options['verify']) === true &&
|
\is_link($options['verify']) === true
|
||||||
($verifyLink = \readlink($options['verify'])) !== false &&
|
&& ($verifyLink = \readlink($options['verify'])) !== false
|
||||||
\is_dir($verifyLink)
|
&& \is_dir($verifyLink)
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
$conf[\CURLOPT_CAPATH] = $options['verify'];
|
$conf[\CURLOPT_CAPATH] = $options['verify'];
|
||||||
|
|
@ -452,6 +454,32 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isset($options['crypto_method'])) {
|
||||||
|
if (\STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT === $options['crypto_method']) {
|
||||||
|
if (!defined('CURL_SSLVERSION_TLSv1_0')) {
|
||||||
|
throw new \InvalidArgumentException('Invalid crypto_method request option: TLS 1.0 not supported by your version of cURL');
|
||||||
|
}
|
||||||
|
$conf[\CURLOPT_SSLVERSION] = \CURL_SSLVERSION_TLSv1_0;
|
||||||
|
} 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;
|
||||||
|
} elseif (\STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT === $options['crypto_method']) {
|
||||||
|
if (!defined('CURL_SSLVERSION_TLSv1_2')) {
|
||||||
|
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;
|
||||||
|
} elseif (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT === $options['crypto_method']) {
|
||||||
|
if (!defined('CURL_SSLVERSION_TLSv1_3')) {
|
||||||
|
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');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (isset($options['cert'])) {
|
if (isset($options['cert'])) {
|
||||||
$cert = $options['cert'];
|
$cert = $options['cert'];
|
||||||
if (\is_array($cert)) {
|
if (\is_array($cert)) {
|
||||||
|
|
@ -461,8 +489,8 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
if (!\file_exists($cert)) {
|
if (!\file_exists($cert)) {
|
||||||
throw new \InvalidArgumentException("SSL certificate not found: {$cert}");
|
throw new \InvalidArgumentException("SSL certificate not found: {$cert}");
|
||||||
}
|
}
|
||||||
# OpenSSL (versions 0.9.3 and later) also support "P12" for PKCS#12-encoded files.
|
// OpenSSL (versions 0.9.3 and later) also support "P12" for PKCS#12-encoded files.
|
||||||
# see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html
|
// see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html
|
||||||
$ext = pathinfo($cert, \PATHINFO_EXTENSION);
|
$ext = pathinfo($cert, \PATHINFO_EXTENSION);
|
||||||
if (preg_match('#^(der|p12)$#i', $ext)) {
|
if (preg_match('#^(der|p12)$#i', $ext)) {
|
||||||
$conf[\CURLOPT_SSLCERTTYPE] = strtoupper($ext);
|
$conf[\CURLOPT_SSLCERTTYPE] = strtoupper($ext);
|
||||||
|
|
@ -525,9 +553,10 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
}
|
}
|
||||||
} catch (\RuntimeException $e) {
|
} catch (\RuntimeException $e) {
|
||||||
$ctx['error'] = 'The connection unexpectedly failed without '
|
$ctx['error'] = 'The connection unexpectedly failed without '
|
||||||
. 'providing an error. The request would have been retried, '
|
.'providing an error. The request would have been retried, '
|
||||||
. 'but attempting to rewind the request body failed. '
|
.'but attempting to rewind the request body failed. '
|
||||||
. 'Exception: ' . $e;
|
.'Exception: '.$e;
|
||||||
|
|
||||||
return self::createRejection($easy, $ctx);
|
return self::createRejection($easy, $ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -536,14 +565,15 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
$easy->options['_curl_retries'] = 1;
|
$easy->options['_curl_retries'] = 1;
|
||||||
} elseif ($easy->options['_curl_retries'] == 2) {
|
} elseif ($easy->options['_curl_retries'] == 2) {
|
||||||
$ctx['error'] = 'The cURL request was retried 3 times '
|
$ctx['error'] = 'The cURL request was retried 3 times '
|
||||||
. 'and did not succeed. The most likely reason for the failure '
|
.'and did not succeed. The most likely reason for the failure '
|
||||||
. 'is that cURL was unable to rewind the body of the request '
|
.'is that cURL was unable to rewind the body of the request '
|
||||||
. 'and subsequent retries resulted in the same error. Turn on '
|
.'and subsequent retries resulted in the same error. Turn on '
|
||||||
. 'the debug option to see what went wrong. See '
|
.'the debug option to see what went wrong. See '
|
||||||
. 'https://bugs.php.net/bug.php?id=47204 for more information.';
|
.'https://bugs.php.net/bug.php?id=47204 for more information.';
|
||||||
|
|
||||||
return self::createRejection($easy, $ctx);
|
return self::createRejection($easy, $ctx);
|
||||||
} else {
|
} else {
|
||||||
$easy->options['_curl_retries']++;
|
++$easy->options['_curl_retries'];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $handler($easy->request, $easy->options);
|
return $handler($easy->request, $easy->options);
|
||||||
|
|
@ -573,6 +603,7 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
$easy->createResponse();
|
$easy->createResponse();
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$easy->createResponseException = $e;
|
$easy->createResponseException = $e;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if ($onHeaders !== null) {
|
if ($onHeaders !== null) {
|
||||||
|
|
@ -582,6 +613,7 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
// Associate the exception with the handle and trigger
|
// Associate the exception with the handle and trigger
|
||||||
// a curl header write error by returning 0.
|
// a curl header write error by returning 0.
|
||||||
$easy->onHeadersException = $e;
|
$easy->onHeadersException = $e;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -591,7 +623,16 @@ class CurlFactory implements CurlFactoryInterface
|
||||||
} else {
|
} else {
|
||||||
$easy->headers[] = $value;
|
$easy->headers[] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
return \strlen($h);
|
return \strlen($h);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function __destruct()
|
||||||
|
{
|
||||||
|
foreach ($this->handles as $id => $handle) {
|
||||||
|
\curl_close($handle);
|
||||||
|
unset($this->handles[$id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,11 +15,8 @@ use Psr\Http\Message\RequestInterface;
|
||||||
* associative array of curl option constants mapping to values in the
|
* associative array of curl option constants mapping to values in the
|
||||||
* **curl** key of the provided request options.
|
* **curl** key of the provided request options.
|
||||||
*
|
*
|
||||||
* @property resource|\CurlMultiHandle $_mh Internal use only. Lazy loaded multi-handle.
|
|
||||||
*
|
|
||||||
* @final
|
* @final
|
||||||
*/
|
*/
|
||||||
#[\AllowDynamicProperties]
|
|
||||||
class CurlMultiHandler
|
class CurlMultiHandler
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
@ -56,6 +53,9 @@ class CurlMultiHandler
|
||||||
*/
|
*/
|
||||||
private $options = [];
|
private $options = [];
|
||||||
|
|
||||||
|
/** @var resource|\CurlMultiHandle */
|
||||||
|
private $_mh;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This handler accepts the following options:
|
* This handler accepts the following options:
|
||||||
*
|
*
|
||||||
|
|
@ -79,6 +79,10 @@ class CurlMultiHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->options = $options['options'] ?? [];
|
$this->options = $options['options'] ?? [];
|
||||||
|
|
||||||
|
// unsetting the property forces the first access to go through
|
||||||
|
// __get().
|
||||||
|
unset($this->_mh);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -164,7 +168,8 @@ class CurlMultiHandler
|
||||||
\usleep(250);
|
\usleep(250);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM);
|
while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) {
|
||||||
|
}
|
||||||
|
|
||||||
$this->processMessages();
|
$this->processMessages();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,7 @@ final class EasyHandle
|
||||||
*/
|
*/
|
||||||
public function __get($name)
|
public function __get($name)
|
||||||
{
|
{
|
||||||
$msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: ' . $name;
|
$msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: '.$name;
|
||||||
throw new \BadMethodCallException($msg);
|
throw new \BadMethodCallException($msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,9 @@ final class HeaderProcessor
|
||||||
*
|
*
|
||||||
* @param string[] $headers
|
* @param string[] $headers
|
||||||
*
|
*
|
||||||
* @throws \RuntimeException
|
|
||||||
*
|
|
||||||
* @return array{0:string, 1:int, 2:?string, 3:array}
|
* @return array{0:string, 1:int, 2:?string, 3:array}
|
||||||
|
*
|
||||||
|
* @throws \RuntimeException
|
||||||
*/
|
*/
|
||||||
public static function parseHeaders(array $headers): array
|
public static function parseHeaders(array $headers): array
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,7 @@ class MockHandler implements \Countable
|
||||||
if ($this->onRejected) {
|
if ($this->onRejected) {
|
||||||
($this->onRejected)($reason);
|
($this->onRejected)($reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
return P\Create::rejectionFor($reason);
|
return P\Create::rejectionFor($reason);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
@ -159,7 +160,7 @@ class MockHandler implements \Countable
|
||||||
) {
|
) {
|
||||||
$this->queue[] = $value;
|
$this->queue[] = $value;
|
||||||
} else {
|
} else {
|
||||||
throw new \TypeError('Expected a Response, Promise, Throwable or callable. Found ' . Utils::describeType($value));
|
throw new \TypeError('Expected a Response, Promise, Throwable or callable. Found '.Utils::describeType($value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ class StreamHandler
|
||||||
if (false !== \strpos($message, 'getaddrinfo') // DNS lookup failed
|
if (false !== \strpos($message, 'getaddrinfo') // DNS lookup failed
|
||||||
|| false !== \strpos($message, 'Connection refused')
|
|| false !== \strpos($message, 'Connection refused')
|
||||||
|| false !== \strpos($message, "couldn't connect to host") // error on HHVM
|
|| false !== \strpos($message, "couldn't connect to host") // error on HHVM
|
||||||
|| false !== \strpos($message, "connection attempt failed")
|
|| false !== \strpos($message, 'connection attempt failed')
|
||||||
) {
|
) {
|
||||||
$e = new ConnectException($e->getMessage(), $request, $e);
|
$e = new ConnectException($e->getMessage(), $request, $e);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -231,9 +231,10 @@ class StreamHandler
|
||||||
\set_error_handler(static function ($_, $msg, $file, $line) use (&$errors): bool {
|
\set_error_handler(static function ($_, $msg, $file, $line) use (&$errors): bool {
|
||||||
$errors[] = [
|
$errors[] = [
|
||||||
'message' => $msg,
|
'message' => $msg,
|
||||||
'file' => $file,
|
'file' => $file,
|
||||||
'line' => $line
|
'line' => $line,
|
||||||
];
|
];
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -247,7 +248,7 @@ class StreamHandler
|
||||||
$message = 'Error creating resource: ';
|
$message = 'Error creating resource: ';
|
||||||
foreach ($errors as $err) {
|
foreach ($errors as $err) {
|
||||||
foreach ($err as $key => $value) {
|
foreach ($err as $key => $value) {
|
||||||
$message .= "[$key] $value" . \PHP_EOL;
|
$message .= "[$key] $value".\PHP_EOL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new \RuntimeException(\trim($message));
|
throw new \RuntimeException(\trim($message));
|
||||||
|
|
@ -350,6 +351,7 @@ class StreamHandler
|
||||||
if (false === $records || !isset($records[0]['ip'])) {
|
if (false === $records || !isset($records[0]['ip'])) {
|
||||||
throw new ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request);
|
throw new ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $uri->withHost($records[0]['ip']);
|
return $uri->withHost($records[0]['ip']);
|
||||||
}
|
}
|
||||||
if ('v6' === $options['force_ip_resolve']) {
|
if ('v6' === $options['force_ip_resolve']) {
|
||||||
|
|
@ -357,7 +359,8 @@ class StreamHandler
|
||||||
if (false === $records || !isset($records[0]['ipv6'])) {
|
if (false === $records || !isset($records[0]['ipv6'])) {
|
||||||
throw new ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request);
|
throw new ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request);
|
||||||
}
|
}
|
||||||
return $uri->withHost('[' . $records[0]['ipv6'] . ']');
|
|
||||||
|
return $uri->withHost('['.$records[0]['ipv6'].']');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -375,11 +378,11 @@ class StreamHandler
|
||||||
|
|
||||||
$context = [
|
$context = [
|
||||||
'http' => [
|
'http' => [
|
||||||
'method' => $request->getMethod(),
|
'method' => $request->getMethod(),
|
||||||
'header' => $headers,
|
'header' => $headers,
|
||||||
'protocol_version' => $request->getProtocolVersion(),
|
'protocol_version' => $request->getProtocolVersion(),
|
||||||
'ignore_errors' => true,
|
'ignore_errors' => true,
|
||||||
'follow_location' => 0,
|
'follow_location' => 0,
|
||||||
],
|
],
|
||||||
'ssl' => [
|
'ssl' => [
|
||||||
'peer_name' => $request->getUri()->getHost(),
|
'peer_name' => $request->getUri()->getHost(),
|
||||||
|
|
@ -388,7 +391,7 @@ class StreamHandler
|
||||||
|
|
||||||
$body = (string) $request->getBody();
|
$body = (string) $request->getBody();
|
||||||
|
|
||||||
if (!empty($body)) {
|
if ('' !== $body) {
|
||||||
$context['http']['content'] = $body;
|
$context['http']['content'] = $body;
|
||||||
// Prevent the HTTP handler from adding a Content-Type header.
|
// Prevent the HTTP handler from adding a Content-Type header.
|
||||||
if (!$request->hasHeader('Content-Type')) {
|
if (!$request->hasHeader('Content-Type')) {
|
||||||
|
|
@ -472,6 +475,25 @@ class StreamHandler
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $value as passed via Request transfer options.
|
||||||
|
*/
|
||||||
|
private function add_crypto_method(RequestInterface $request, array &$options, $value, array &$params): void
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
$value === \STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT
|
||||||
|
|| $value === \STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
|
||||||
|
|| $value === \STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
|
||||||
|
|| (defined('STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT') && $value === \STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT)
|
||||||
|
) {
|
||||||
|
$options['http']['crypto_method'] = $value;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \InvalidArgumentException('Invalid crypto_method request option: unknown version provided');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mixed $value as passed via Request transfer options.
|
* @param mixed $value as passed via Request transfer options.
|
||||||
*/
|
*/
|
||||||
|
|
@ -542,27 +564,27 @@ class StreamHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
static $map = [
|
static $map = [
|
||||||
\STREAM_NOTIFY_CONNECT => 'CONNECT',
|
\STREAM_NOTIFY_CONNECT => 'CONNECT',
|
||||||
\STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED',
|
\STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED',
|
||||||
\STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT',
|
\STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT',
|
||||||
\STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS',
|
\STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS',
|
||||||
\STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS',
|
\STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS',
|
||||||
\STREAM_NOTIFY_REDIRECTED => 'REDIRECTED',
|
\STREAM_NOTIFY_REDIRECTED => 'REDIRECTED',
|
||||||
\STREAM_NOTIFY_PROGRESS => 'PROGRESS',
|
\STREAM_NOTIFY_PROGRESS => 'PROGRESS',
|
||||||
\STREAM_NOTIFY_FAILURE => 'FAILURE',
|
\STREAM_NOTIFY_FAILURE => 'FAILURE',
|
||||||
\STREAM_NOTIFY_COMPLETED => 'COMPLETED',
|
\STREAM_NOTIFY_COMPLETED => 'COMPLETED',
|
||||||
\STREAM_NOTIFY_RESOLVE => 'RESOLVE',
|
\STREAM_NOTIFY_RESOLVE => 'RESOLVE',
|
||||||
];
|
];
|
||||||
static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max'];
|
static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max'];
|
||||||
|
|
||||||
$value = Utils::debugResource($value);
|
$value = Utils::debugResource($value);
|
||||||
$ident = $request->getMethod() . ' ' . $request->getUri()->withFragment('');
|
$ident = $request->getMethod().' '.$request->getUri()->withFragment('');
|
||||||
self::addNotification(
|
self::addNotification(
|
||||||
$params,
|
$params,
|
||||||
static function (int $code, ...$passed) use ($ident, $value, $map, $args): void {
|
static function (int $code, ...$passed) use ($ident, $value, $map, $args): void {
|
||||||
\fprintf($value, '<%s> [%s] ', $ident, $map[$code]);
|
\fprintf($value, '<%s> [%s] ', $ident, $map[$code]);
|
||||||
foreach (\array_filter($passed) as $i => $v) {
|
foreach (\array_filter($passed) as $i => $v) {
|
||||||
\fwrite($value, $args[$i] . ': "' . $v . '" ');
|
\fwrite($value, $args[$i].': "'.$v.'" ');
|
||||||
}
|
}
|
||||||
\fwrite($value, "\n");
|
\fwrite($value, "\n");
|
||||||
}
|
}
|
||||||
|
|
@ -577,7 +599,7 @@ class StreamHandler
|
||||||
} else {
|
} else {
|
||||||
$params['notification'] = self::callArray([
|
$params['notification'] = self::callArray([
|
||||||
$params['notification'],
|
$params['notification'],
|
||||||
$notify
|
$notify,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue