From 7253c57095b2409f4f54ed1310b1e6a273a6e360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dino=20Pejakovi=C4=87?= Date: Sun, 12 Jun 2022 21:44:42 +0200 Subject: [PATCH 01/13] Update lcobucci/jwt to 4.1.5 --- composer.json | 7 ++- composer.lock | 163 +++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 140 insertions(+), 30 deletions(-) diff --git a/composer.json b/composer.json index abc8438..7e7cdb2 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ ], "require": { "php": ">= 7.4", - "lcobucci/jwt": "^3.4", + "lcobucci/jwt": "^4.1", "league/oauth2-client": "^2.0", "webmozart/assert": "^1.10" }, @@ -25,6 +25,11 @@ "roave/security-advisories": "dev-master", "squizlabs/php_codesniffer": "^3.6" }, + "config": { + "allow-plugins": { + "ergebnis/composer-normalize": true + } + }, "autoload": { "psr-4": { "OpenIDConnectClient\\": "src/" diff --git a/composer.lock b/composer.lock index 77aa7a6..73afe46 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "11bcfe434106185c14073b925fcc9469", + "content-hash": "433689a61bcbd9734f875e4f8bf3a6e8", "packages": [ { "name": "guzzlehttp/guzzle", @@ -329,50 +329,108 @@ ], "time": "2021-10-06T17:43:30+00:00" }, + { + "name": "lcobucci/clock", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/clock.git", + "reference": "fb533e093fd61321bfcbac08b131ce805fe183d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/fb533e093fd61321bfcbac08b131ce805fe183d3", + "reference": "fb533e093fd61321bfcbac08b131ce805fe183d3", + "shasum": "" + }, + "require": { + "php": "^8.0", + "stella-maris/clock": "^0.1.4" + }, + "require-dev": { + "infection/infection": "^0.26", + "lcobucci/coding-standard": "^8.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\Clock\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com" + } + ], + "description": "Yet another clock abstraction", + "support": { + "issues": "https://github.com/lcobucci/clock/issues", + "source": "https://github.com/lcobucci/clock/tree/2.2.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2022-04-19T19:34:17+00:00" + }, { "name": "lcobucci/jwt", - "version": "3.4.6", + "version": "4.1.5", "source": { "type": "git", "url": "https://github.com/lcobucci/jwt.git", - "reference": "3ef8657a78278dfeae7707d51747251db4176240" + "reference": "fe2d89f2eaa7087af4aa166c6f480ef04e000582" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/3ef8657a78278dfeae7707d51747251db4176240", - "reference": "3ef8657a78278dfeae7707d51747251db4176240", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/fe2d89f2eaa7087af4aa166c6f480ef04e000582", + "reference": "fe2d89f2eaa7087af4aa166c6f480ef04e000582", "shasum": "" }, "require": { + "ext-hash": "*", + "ext-json": "*", "ext-mbstring": "*", "ext-openssl": "*", - "php": "^5.6 || ^7.0" + "ext-sodium": "*", + "lcobucci/clock": "^2.0", + "php": "^7.4 || ^8.0" }, "require-dev": { - "mikey179/vfsstream": "~1.5", - "phpmd/phpmd": "~2.2", - "phpunit/php-invoker": "~1.1", - "phpunit/phpunit": "^5.7 || ^7.3", - "squizlabs/php_codesniffer": "~2.3" - }, - "suggest": { - "lcobucci/clock": "*" + "infection/infection": "^0.21", + "lcobucci/coding-standard": "^6.0", + "mikey179/vfsstream": "^1.6.7", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/php-invoker": "^3.1", + "phpunit/phpunit": "^9.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, "autoload": { "psr-4": { "Lcobucci\\JWT\\": "src" - }, - "files": [ - "compat/class-aliases.php", - "compat/json-exception-polyfill.php", - "compat/lcobucci-clock-polyfill.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -380,7 +438,7 @@ ], "authors": [ { - "name": "Luís Otávio Cobucci Oblonczyk", + "name": "Luís Cobucci", "email": "lcobucci@gmail.com", "role": "Developer" } @@ -392,7 +450,7 @@ ], "support": { "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/3.4.6" + "source": "https://github.com/lcobucci/jwt/tree/4.1.5" }, "funding": [ { @@ -404,7 +462,7 @@ "type": "patreon" } ], - "time": "2021-09-28T19:18:28+00:00" + "time": "2021-09-28T19:34:56+00:00" }, { "name": "league/oauth2-client", @@ -730,6 +788,53 @@ }, "time": "2019-03-08T08:55:37+00:00" }, + { + "name": "stella-maris/clock", + "version": "0.1.4", + "source": { + "type": "git", + "url": "https://gitlab.com/stella-maris/clock.git", + "reference": "8a0a967896df4c63417385dc69328a0aec84d9cf" + }, + "dist": { + "type": "zip", + "url": "https://gitlab.com/api/v4/projects/stella-maris%2Fclock/repository/archive.zip?sha=8a0a967896df4c63417385dc69328a0aec84d9cf", + "reference": "8a0a967896df4c63417385dc69328a0aec84d9cf", + "shasum": "" + }, + "require": { + "php": "^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "StellaMaris\\Clock\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Heigl", + "role": "Maintainer" + } + ], + "description": "A pre-release of the proposed PSR-20 Clock-Interface", + "homepage": "https://gitlab.com/stella-maris/clock", + "keywords": [ + "clock", + "datetime", + "point in time", + "psr20" + ], + "support": { + "issues": "https://gitlab.com/stella-maris/clock/-/issues", + "source": "https://gitlab.com/stella-maris/clock/-/tree/0.1.4" + }, + "time": "2022-04-17T14:12:26+00:00" + }, { "name": "symfony/deprecation-contracts", "version": "v2.4.0", @@ -5043,5 +5148,5 @@ "php": ">= 7.4" }, "platform-dev": [], - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.3.0" } From 96b0ab4c78c6196ed306aab8973c4599b79f4f23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dino=20Pejakovi=C4=87?= Date: Sun, 12 Jun 2022 21:46:48 +0200 Subject: [PATCH 02/13] Fix incompatibilities after lcobucci/jwt upgrade --- src/AccessToken.php | 7 +++++-- src/OpenIDConnectProvider.php | 33 ++++++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/AccessToken.php b/src/AccessToken.php index 5997a36..f69c926 100644 --- a/src/AccessToken.php +++ b/src/AccessToken.php @@ -4,7 +4,7 @@ namespace OpenIDConnectClient; -use Lcobucci\JWT\Parser; +use Lcobucci\JWT\Configuration; use Lcobucci\JWT\Token; use League\OAuth2\Client\Token\AccessToken as LeagueAccessToken; @@ -17,7 +17,10 @@ public function __construct(array $options = []) parent::__construct($options); if (isset($this->values['id_token'])) { - $this->idToken = (new Parser())->parse($this->values['id_token']); + // Signature is validated outside, this just parses the token + $this->idToken = Configuration::forUnsecuredSigner() + ->parser() + ->parse($this->values['id_token']); unset($this->values['id_token']); } } diff --git a/src/OpenIDConnectProvider.php b/src/OpenIDConnectProvider.php index 671b9a7..d624ca8 100644 --- a/src/OpenIDConnectProvider.php +++ b/src/OpenIDConnectProvider.php @@ -4,8 +4,12 @@ namespace OpenIDConnectClient; +use Lcobucci\JWT\Configuration; use Lcobucci\JWT\Signer; use Lcobucci\JWT\Signer\Key; +use Lcobucci\JWT\Signer\Key\InMemory; +use Lcobucci\JWT\Token; +use Lcobucci\JWT\Validation\Constraint\SignedWith; use League\OAuth2\Client\Grant\AbstractGrant; use League\OAuth2\Client\Provider\GenericProvider; use OpenIDConnectClient\Exception\InvalidTokenException; @@ -88,15 +92,25 @@ protected function getRequiredOptions(): array public function getPublicKey(): array { if (is_array($this->publicKey)) { + $self = $this; return array_map( - static function (string $key): Key { - return new Key($key); + static function (string $key) use ($self): Key { + return $self->constructKey($key); }, $this->publicKey, ); } - return [new Key($this->publicKey)]; + return [$this->constructKey($this->publicKey)]; + } + + private function constructKey(string $content): Key + { + if (strpos($content, 'file://') === 0) { + return InMemory::file($content); + } + + return InMemory::plainText($content); } /** @@ -127,7 +141,7 @@ public function getAccessToken($grant, array $options = []) // id_token_signed_response_alg parameter during Registration. $verified = false; foreach ($this->getPublicKey() as $key) { - if ($token->verify($this->signer, $key) !== false) { + if ($this->validateSignature($token, $key) !== false) { $verified = true; break; } @@ -174,7 +188,7 @@ public function getAccessToken($grant, array $options = []) // If the ID Token contains multiple audiences, the Client SHOULD verify that an azp Claim is present. // If an azp (authorized party) Claim is present, // the Client SHOULD verify that its client_id is the Claim Value. - if ($token->hasClaim('azp')) { + if ($token->claims()->has('azp')) { $data['azp'] = $this->clientId; } @@ -185,6 +199,15 @@ public function getAccessToken($grant, array $options = []) return $accessToken; } + protected function validateSignature(Token $token, Key $key): bool + { + $validatorConfig = Configuration::forAsymmetricSigner($this->signer, $key, $key); + $validatorConfig->setValidationConstraints(new SignedWith($this->signer, $key)); + $validator = $validatorConfig->validator(); + + return $validator->validate($token, ...$validatorConfig->validationConstraints()); + } + /** * Overload parent as OpenID Connect specification states scopes shall be separated by spaces */ From acf761b540c8923eccb0f218a8393f06c34ba103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dino=20Pejakovi=C4=87?= Date: Sun, 12 Jun 2022 21:47:35 +0200 Subject: [PATCH 03/13] Fix timestamp validation The new version of lcobucci/jwt seems convert timestamps to DateTimeImmutable. All the code currently expects a unix timestamp so this breaks. Fixed by simply checking for DateTimeInterface and converting them back to unix timestamps before validation. --- src/Validator/ValidatorChain.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Validator/ValidatorChain.php b/src/Validator/ValidatorChain.php index efaf512..61cb7f3 100644 --- a/src/Validator/ValidatorChain.php +++ b/src/Validator/ValidatorChain.php @@ -55,7 +55,14 @@ public function validate(array $data, Token $token): bool continue; } - if (!$validator->isValid($data[$claim], $claims->get($claim))) { + // All timestamps will be converted to DateTimeImmutable + // Convert them back to unix timestamp here so we can compare as numbers + $claimValue = $claims->get($claim); + if ($claimValue instanceof \DateTimeInterface) { + $claimValue = $claimValue->getTimestamp(); + } + + if (!$validator->isValid($data[$claim], $claimValue)) { $valid = false; $this->messages[$claim] = $validator->getMessage(); } From f70f2f70baab1577575862ca3066805e1ea8c9fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dino=20Pejakovi=C4=87?= Date: Sun, 12 Jun 2022 21:49:46 +0200 Subject: [PATCH 04/13] Fix tests after upgrades --- tests/Unit/OpenIDConnectProviderTest.php | 6 +++--- tests/Unit/Validator/ValidatorChainTest.php | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/Unit/OpenIDConnectProviderTest.php b/tests/Unit/OpenIDConnectProviderTest.php index c442d7e..8829198 100644 --- a/tests/Unit/OpenIDConnectProviderTest.php +++ b/tests/Unit/OpenIDConnectProviderTest.php @@ -170,7 +170,7 @@ public function testGetAccessToken(): void // OpenIDConnectProvider::getAccessToken $this->signer ->expects(self::once()) - ->method('getAlgorithmId') + ->method('algorithmId') ->willReturn('HS256'); $this->signer @@ -222,7 +222,7 @@ public function testGetAccessTokenThrowsExceptionForInvalidKey(): void // OpenIDConnectProvider::getAccessToken $this->signer ->expects(self::exactly(2)) - ->method('getAlgorithmId') + ->method('algorithmId') ->willReturn('HS256'); $this->signer @@ -253,7 +253,7 @@ public function testGetAccessTokenThrowsExceptionForInvalidChain(): void // OpenIDConnectProvider::getAccessToken $this->signer ->expects(self::once()) - ->method('getAlgorithmId') + ->method('algorithmId') ->willReturn('HS256'); $this->signer diff --git a/tests/Unit/Validator/ValidatorChainTest.php b/tests/Unit/Validator/ValidatorChainTest.php index ee36474..fc6937e 100644 --- a/tests/Unit/Validator/ValidatorChainTest.php +++ b/tests/Unit/Validator/ValidatorChainTest.php @@ -7,6 +7,7 @@ use InvalidArgumentException; use Lcobucci\JWT\Token; use Lcobucci\JWT\Token\DataSet; +use Lcobucci\JWT\Token\Plain; use OpenIDConnectClient\Validator\ValidatorChain; use OpenIDConnectClient\Validator\ValidatorInterface; use PHPUnit\Framework\TestCase; @@ -128,7 +129,7 @@ public function testExecuteValidValidators(): void $this->chain->addValidator($firstValidator); $this->chain->addValidator($secondValidator); - $token = $this->createMock(Token::class); + $token = $this->createMock(Plain::class); $claims = $this->createMock(DataSet::class); $token ->expects(self::once()) @@ -230,7 +231,7 @@ public function testExecuteInValidValidators(): void $this->chain->addValidator($thirdValidator); $this->chain->addValidator($fourthValidator); - $token = $this->createMock(Token::class); + $token = $this->createMock(Plain::class); $claims = $this->createMock(DataSet::class); $token ->expects(self::once()) From c992008504516f5ffff09eaf3c4172e2f8eee355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dino=20Pejakovi=C4=87?= Date: Sun, 12 Jun 2022 21:51:54 +0200 Subject: [PATCH 05/13] Update supported PHP versions in README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3a5fe1a..a59c575 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@ This package uses the PHP League's [OAuth2 Client](https://github.com/thephpleag The following versions of PHP are supported. * PHP 7.4 -* PHP 8.0 (coming soon, needs use `lcobucci\jwt:v4.1`) +* PHP 8.0 +* PHP 8.1 ## Usage You may test your OpenID Connect Client against [bshaffer's demo oauth2 server](https://github.com/bshaffer/oauth2-demo-php). From 5c24a15085a88ec67f25460bbefd0cf6e65f9ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dino=20Pejakovi=C4=87?= Date: Sun, 12 Jun 2022 22:05:03 +0200 Subject: [PATCH 06/13] Use more precise types Replace the Token interface with Plain because we need to use claims(), which only exist on Plain anyway. Getting any other token now throws errors. Also assert that our token type, AccessToken is returned in getAccessToken. This helps with static analysis tools and IDE autocomplete both for us and users. --- src/AccessToken.php | 16 ++++++++++++---- src/OpenIDConnectProvider.php | 4 ++++ src/Validator/ValidatorChain.php | 4 ++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/AccessToken.php b/src/AccessToken.php index f69c926..8770b14 100644 --- a/src/AccessToken.php +++ b/src/AccessToken.php @@ -5,27 +5,35 @@ namespace OpenIDConnectClient; use Lcobucci\JWT\Configuration; -use Lcobucci\JWT\Token; +use Lcobucci\JWT\Token\Plain; use League\OAuth2\Client\Token\AccessToken as LeagueAccessToken; +use OpenIDConnectClient\Exception\InvalidTokenException; final class AccessToken extends LeagueAccessToken { - private Token $idToken; + private ?Plain $idToken; public function __construct(array $options = []) { parent::__construct($options); + $this->idToken = null; if (isset($this->values['id_token'])) { // Signature is validated outside, this just parses the token - $this->idToken = Configuration::forUnsecuredSigner() + $token = Configuration::forUnsecuredSigner() ->parser() ->parse($this->values['id_token']); + + if (!$token instanceof Plain) { + throw new InvalidTokenException('Received wrong token type (expected Plain)'); + } + $this->idToken = $token; + unset($this->values['id_token']); } } - public function getIdToken(): ?Token + public function getIdToken(): ?Plain { return $this->idToken ?? null; } diff --git a/src/OpenIDConnectProvider.php b/src/OpenIDConnectProvider.php index d624ca8..bd9f502 100644 --- a/src/OpenIDConnectProvider.php +++ b/src/OpenIDConnectProvider.php @@ -123,6 +123,10 @@ private function constructKey(string $content): Key public function getAccessToken($grant, array $options = []) { $accessToken = parent::getAccessToken($grant, $options); + if (!$accessToken instanceof AccessToken) { + throw new InvalidTokenException('Received wrong access token type'); + } + $token = $accessToken->getIdToken(); // id_token is empty. diff --git a/src/Validator/ValidatorChain.php b/src/Validator/ValidatorChain.php index 61cb7f3..dc35fd4 100644 --- a/src/Validator/ValidatorChain.php +++ b/src/Validator/ValidatorChain.php @@ -4,7 +4,7 @@ namespace OpenIDConnectClient\Validator; -use Lcobucci\JWT\Token; +use Lcobucci\JWT\Token\Plain; use OpenIDConnectClient\Exception\UnknownValidatorRequestedException; use Webmozart\Assert\Assert; @@ -39,7 +39,7 @@ public function addValidator(ValidatorInterface $validator): self return $this; } - public function validate(array $data, Token $token): bool + public function validate(array $data, Plain $token): bool { $valid = true; $claims = $token->claims(); From 49f0e3418619ecc2061abb4d31986ffa6ae135ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dino=20Pejakovi=C4=87?= Date: Sun, 12 Jun 2022 22:17:10 +0200 Subject: [PATCH 07/13] Relax lcobucci/jwt version constraint Both 4.0 and 4.1 work --- composer.json | 2 +- composer.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 7e7cdb2..eb5aa69 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ ], "require": { "php": ">= 7.4", - "lcobucci/jwt": "^4.1", + "lcobucci/jwt": "~4.0", "league/oauth2-client": "^2.0", "webmozart/assert": "^1.10" }, diff --git a/composer.lock b/composer.lock index 73afe46..f45d8be 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "433689a61bcbd9734f875e4f8bf3a6e8", + "content-hash": "7ce2b42aa5cdceefead923e21b2e3d03", "packages": [ { "name": "guzzlehttp/guzzle", From 2e35a66a0ac38ad62d54606a8d01f4d120d387fb Mon Sep 17 00:00:00 2001 From: Floris Westerman Date: Thu, 19 Aug 2021 17:42:19 +0200 Subject: [PATCH 08/13] Implement automatic OpenID Connect Discovery --- composer.json | 1 + .../InvalidConfigurationException.php | 8 ++ src/OpenIDConnectProvider.php | 126 ++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 src/Exception/InvalidConfigurationException.php diff --git a/composer.json b/composer.json index abc8438..efeaf59 100644 --- a/composer.json +++ b/composer.json @@ -12,6 +12,7 @@ "php": ">= 7.4", "lcobucci/jwt": "^3.4", "league/oauth2-client": "^2.0", + "codercat/jwk-to-pem": "^1.1", "webmozart/assert": "^1.10" }, "require-dev": { diff --git a/src/Exception/InvalidConfigurationException.php b/src/Exception/InvalidConfigurationException.php new file mode 100644 index 0000000..58947ab --- /dev/null +++ b/src/Exception/InvalidConfigurationException.php @@ -0,0 +1,8 @@ +discoverConfiguration($options["issuer"], $options); + } + parent::__construct($options, $collaborators); } @@ -218,4 +241,107 @@ protected function createAccessToken(array $response, AbstractGrant $grant): Acc { return new AccessToken($response); } + + /** + * Retrieves OpenID Connect configuration from a discovery endpoint + * (<$issuer>/.well-known/openid-configuration) and merges it into + * a given options array + * + * @param string $issuer + * @param array $options + * @return array + * @throws InvalidConfigurationException + * @throws Base64DecodeException + * @throws JWKConverterException + * @throws IdentityProviderException + */ + protected function discoverConfiguration($issuer, $options) + { + $uri = $issuer . '/.well-known/openid-configuration'; + $request = $this->getRequest(self::METHOD_GET, $uri); + $response = $this->getParsedResponse($request); + if (false === is_array($response)) { + throw new InvalidConfigurationException( + 'Invalid response received from discovery. Expected JSON.' + ); + } + + // Map configuration to options + $optionMapping = [ + 'idTokenIssuer' => [ + 'name' => 'issuer', + 'required' => true + ], + 'urlAuthorize' => [ + 'name' => 'authorization_endpoint', + 'required' => true + ], + 'urlAccessToken' => [ + 'name' => 'token_endpoint', + 'required' => true + ], + 'urlResourceOwnerDetails' => [ + 'name' => 'userinfo_endpoint', + 'required' => false + ], + ]; + + foreach($optionMapping as $optionKey => $responseKey) { + if($responseKey['required'] && !isset($response[$responseKey['name']])) { + throw new InvalidConfigurationException( + "Parameter {$responseKey['name']} missing in discovery configuration at $uri" + ); + } + + $options[$optionKey] = $response[$responseKey['name']]; + } + + // Validate scopes + $scopesSupported = $response["scopes_supported"]; + if(isset($scopesSupported)) { + foreach($options['scopes'] as $scope) { + if(!in_array($scope, $scopesSupported)) { + throw new InvalidConfigurationException( + "Scope $scope is not supported in discovery configuration at $uri" + ); + } + } + } + + // Set public key + if(!isset($response["jwks_uri"])) { + throw new InvalidConfigurationException( + "Parameter jwks_uri missing in discovery configuration at $uri" + ); + } + $jwksUri = $response["jwks_uri"]; + + $jwksRequest = $this->getRequest(self::METHOD_GET, $jwksUri); + $jwksResponse = $this->getParsedResponse($jwksRequest); + if (false === is_array($jwksResponse) || false === is_array($jwksResponse['keys'])) { + throw new InvalidConfigurationException( + 'Invalid response received from discovery. Expected JSON.' + ); + } + + // We will only need signature keys supported by our signer + $jwks = array_filter($jwksResponse['keys'], function($jwk) { + if(!is_array($jwk)) return false; + if(isset($jwk['use']) && $jwk['use'] !== 'sig') return false; + if($jwk['alg'] !== $this->signer->getAlgorithmId()) return false; + + return true; + }); + + if(count($jwks) === 0) { + throw new InvalidConfigurationException( + "No valid signing keys found in discovery at $uri" + ); + } + + $jwkConverter = new JWKConverter(); + $options['publicKey'] = $jwkConverter->toPEM($jwks[0]); + + return $options; + } } From 617c016b5e421dc5237509c8cfcdbbd9c70c6883 Mon Sep 17 00:00:00 2001 From: Floris Westerman Date: Thu, 19 Aug 2021 17:46:11 +0200 Subject: [PATCH 09/13] Support multiple keys --- src/OpenIDConnectProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenIDConnectProvider.php b/src/OpenIDConnectProvider.php index 48567fd..4cdc472 100644 --- a/src/OpenIDConnectProvider.php +++ b/src/OpenIDConnectProvider.php @@ -340,7 +340,7 @@ protected function discoverConfiguration($issuer, $options) } $jwkConverter = new JWKConverter(); - $options['publicKey'] = $jwkConverter->toPEM($jwks[0]); + $options['publicKey'] = $jwkConverter->multipleToPEM($jwks); return $options; } From 57f24075e39c42b0b2c059ee0d50b2aaaf27ea4f Mon Sep 17 00:00:00 2001 From: Floris Westerman Date: Thu, 19 Aug 2021 17:52:06 +0200 Subject: [PATCH 10/13] Add some documentation in README --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3a5fe1a..b2c210a 100644 --- a/README.md +++ b/README.md @@ -17,16 +17,22 @@ $signer = new \Lcobucci\JWT\Signer\Rsa\Sha256(); $provider = new \OpenIDConnectClient\OpenIDConnectProvider([ 'clientId' => 'demoapp', 'clientSecret' => 'demopass', - // the issuer of the identity token (id_token) this will be compared with what is returned in the token. - 'idTokenIssuer' => 'brentertainment.com', // Your server 'redirectUri' => 'http://example.com/your-redirect-url/', + + // Settings of the OP (OpenID provider) + // The issuer of the identity token (id_token) this will be compared with what is returned in the token. + 'idTokenIssuer' => 'brentertainment.com', 'urlAuthorize' => 'http://brentertainment.com/oauth2/lockdin/authorize', 'urlAccessToken' => 'http://brentertainment.com/oauth2/lockdin/token', 'urlResourceOwnerDetails' => 'http://brentertainment.com/oauth2/lockdin/resource', // Find the public key here: https://github.com/bshaffer/oauth2-demo-php/blob/master/data/pubkey.pem // to test against brentertainment.com - 'publicKey' => 'file:///myproj/data/public.key', + 'publicKey' => 'file:///myproj/data/public.key', + + // Alternatively, you can use automatic discovery as long as your server + // has the /.well-known/openid-configuration endpoint + 'issuer' => 'http://example.com/oauth2' ], [ 'signer' => $signer From 159afdba361826cc79e2ad903a8a79ce8e33b5fe Mon Sep 17 00:00:00 2001 From: Floris Westerman Date: Sun, 14 Aug 2022 21:26:54 +0200 Subject: [PATCH 11/13] Update code style, add unit tests for discovery --- composer.json | 3 +- composer.lock | 1553 ++++++++++------- .../InvalidConfigurationException.php | 5 +- src/OpenIDConnectProvider.php | 29 +- tests/Unit/OpenIDConnectProviderTest.php | 102 +- 5 files changed, 1069 insertions(+), 623 deletions(-) diff --git a/composer.json b/composer.json index efeaf59..4ec9769 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,8 @@ "php-parallel-lint/php-parallel-lint": "^1.3", "phpunit/phpunit": "^9.5", "roave/security-advisories": "dev-master", - "squizlabs/php_codesniffer": "^3.6" + "squizlabs/php_codesniffer": "^3.6", + "ext-json": "*" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 77aa7a6..15ac984 100644 --- a/composer.lock +++ b/composer.lock @@ -4,29 +4,73 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "11bcfe434106185c14073b925fcc9469", + "content-hash": "451f39af9978862f7fc8033df80dde6f", "packages": [ + { + "name": "codercat/jwk-to-pem", + "version": "1.1", + "source": { + "type": "git", + "url": "https://github.com/acodercat/php-jwk-to-pem.git", + "reference": "4b3cdcf5f87b9b074f132f763a6b7b82c7d3ff1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/acodercat/php-jwk-to-pem/zipball/4b3cdcf5f87b9b074f132f763a6b7b82c7d3ff1d", + "reference": "4b3cdcf5f87b9b074f132f763a6b7b82c7d3ff1d", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "phpseclib/phpseclib": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "CoderCat\\JWKToPEM\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "codercat", + "email": "1067302838@qq.com" + } + ], + "description": "Convert JWK to PEM format.", + "support": { + "issues": "https://github.com/acodercat/php-jwk-to-pem/issues", + "source": "https://github.com/acodercat/php-jwk-to-pem/tree/1.1" + }, + "time": "2021-04-28T07:37:03+00:00" + }, { "name": "guzzlehttp/guzzle", - "version": "7.4.0", + "version": "7.4.5", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94" + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/868b3571a039f0ebc11ac8f344f4080babe2cb94", - "reference": "868b3571a039f0ebc11ac8f344f4080babe2cb94", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.8.3 || ^2.1", + "guzzlehttp/psr7": "^1.9 || ^2.4", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2" + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "provide": { "psr/http-client-implementation": "1.0" @@ -50,12 +94,12 @@ } }, "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -112,7 +156,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.0" + "source": "https://github.com/guzzle/guzzle/tree/7.4.5" }, "funding": [ { @@ -128,7 +172,7 @@ "type": "tidelift" } ], - "time": "2021-10-18T09:52:00+00:00" + "time": "2022-06-20T22:16:13+00:00" }, { "name": "guzzlehttp/promises", @@ -157,12 +201,12 @@ } }, "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -216,16 +260,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.1.0", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72" + "reference": "13388f00956b1503577598873fffb5ae994b5737" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/089edd38f5b8abba6cb01567c2a8aaa47cec4c72", - "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/13388f00956b1503577598873fffb5ae994b5737", + "reference": "13388f00956b1503577598873fffb5ae994b5737", "shasum": "" }, "require": { @@ -249,7 +293,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "2.4-dev" } }, "autoload": { @@ -311,7 +355,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.1.0" + "source": "https://github.com/guzzle/psr7/tree/2.4.0" }, "funding": [ { @@ -327,7 +371,7 @@ "type": "tidelift" } ], - "time": "2021-10-06T17:43:30+00:00" + "time": "2022-06-20T21:43:11+00:00" }, { "name": "lcobucci/jwt", @@ -365,14 +409,14 @@ } }, "autoload": { - "psr-4": { - "Lcobucci\\JWT\\": "src" - }, "files": [ "compat/class-aliases.php", "compat/json-exception-polyfill.php", "compat/lcobucci-clock-polyfill.php" - ] + ], + "psr-4": { + "Lcobucci\\JWT\\": "src" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -408,16 +452,16 @@ }, { "name": "league/oauth2-client", - "version": "2.6.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/thephpleague/oauth2-client.git", - "reference": "badb01e62383430706433191b82506b6df24ad98" + "reference": "2334c249907190c132364f5dae0287ab8666aa19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/badb01e62383430706433191b82506b6df24ad98", - "reference": "badb01e62383430706433191b82506b6df24ad98", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/2334c249907190c132364f5dae0287ab8666aa19", + "reference": "2334c249907190c132364f5dae0287ab8666aa19", "shasum": "" }, "require": { @@ -426,9 +470,9 @@ "php": "^5.6 || ^7.0 || ^8.0" }, "require-dev": { - "mockery/mockery": "^1.3", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpunit/phpunit": "^5.7 || ^6.0 || ^9.3", + "mockery/mockery": "^1.3.5", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpunit/phpunit": "^5.7 || ^6.0 || ^9.5", "squizlabs/php_codesniffer": "^2.3 || ^3.0" }, "type": "library", @@ -472,9 +516,76 @@ ], "support": { "issues": "https://github.com/thephpleague/oauth2-client/issues", - "source": "https://github.com/thephpleague/oauth2-client/tree/2.6.0" + "source": "https://github.com/thephpleague/oauth2-client/tree/2.6.1" + }, + "time": "2021-12-22T16:42:49+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "58c3f47f650c94ec05a151692652a868995d2938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "shasum": "" + }, + "require": { + "php": "^7|^8" }, - "time": "2020-10-28T02:03:40+00:00" + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2022-06-14T06:56:20+00:00" }, { "name": "paragonie/random_compat", @@ -526,6 +637,115 @@ }, "time": "2020-10-15T08:29:30+00:00" }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.14", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "2f0b7af658cbea265cbb4a791d6c29a6613f98ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/2f0b7af658cbea265cbb4a791d6c29a6613f98ef", + "reference": "2f0b7af658cbea265cbb4a791d6c29a6613f98ef", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.14" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2022-04-04T05:15:45+00:00" + }, { "name": "psr/http-client", "version": "1.0.1", @@ -732,16 +952,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { @@ -750,7 +970,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -779,7 +999,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -795,104 +1015,25 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "webmozart/assert", - "version": "1.10.0", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" + "ext-ctype": "*", + "php": "^7.2 || ^8.0" }, "conflict": { "phpstan/phpstan": "<0.12.20", @@ -930,9 +1071,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" + "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, - "time": "2021-03-09T10:59:23+00:00" + "time": "2022-06-03T18:03:27+00:00" } ], "packages-dev": [ @@ -991,29 +1132,30 @@ }, { "name": "doctrine/instantiator", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^8.0", + "doctrine/coding-standard": "^9", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" }, "type": "library", "autoload": { @@ -1040,7 +1182,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + "source": "https://github.com/doctrine/instantiator/tree/1.4.1" }, "funding": [ { @@ -1056,34 +1198,34 @@ "type": "tidelift" } ], - "time": "2020-11-10T18:47:58+00:00" + "time": "2022-03-03T08:28:38+00:00" }, { "name": "enlightn/security-checker", - "version": "v1.9.0", + "version": "v1.10.0", "source": { "type": "git", "url": "https://github.com/enlightn/security-checker.git", - "reference": "dc5bce653fa4d9c792e9dcffa728c0642847c1e1" + "reference": "196bacc76e7a72a63d0e1220926dbb190272db97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/enlightn/security-checker/zipball/dc5bce653fa4d9c792e9dcffa728c0642847c1e1", - "reference": "dc5bce653fa4d9c792e9dcffa728c0642847c1e1", + "url": "https://api.github.com/repos/enlightn/security-checker/zipball/196bacc76e7a72a63d0e1220926dbb190272db97", + "reference": "196bacc76e7a72a63d0e1220926dbb190272db97", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/guzzle": "^6.3|^7.0", "php": ">=5.6", - "symfony/console": "^3.4|^4|^5", - "symfony/finder": "^3|^4|^5", - "symfony/process": "^3.4|^4|^5", - "symfony/yaml": "^3.4|^4|^5" + "symfony/console": "^3.4|^4|^5|^6", + "symfony/finder": "^3|^4|^5|^6", + "symfony/process": "^3.4|^4|^5|^6", + "symfony/yaml": "^3.4|^4|^5|^6" }, "require-dev": { "ext-zip": "*", - "friendsofphp/php-cs-fixer": "^2.18", + "friendsofphp/php-cs-fixer": "^2.18|^3.0", "phpunit/phpunit": "^5.5|^6|^7|^8|^9" }, "bin": [ @@ -1120,47 +1262,41 @@ ], "support": { "issues": "https://github.com/enlightn/security-checker/issues", - "source": "https://github.com/enlightn/security-checker/tree/v1.9.0" + "source": "https://github.com/enlightn/security-checker/tree/v1.10.0" }, - "time": "2021-05-06T09:03:35+00:00" + "time": "2022-02-21T22:40:16+00:00" }, { "name": "ergebnis/composer-normalize", - "version": "2.15.0", + "version": "2.28.3", "source": { "type": "git", "url": "https://github.com/ergebnis/composer-normalize.git", - "reference": "d469a15b916441959446d52a0f5d3fc9f7720317" + "reference": "ec75a2bf751f6fec165e9ea0262655b8ca397e5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/d469a15b916441959446d52a0f5d3fc9f7720317", - "reference": "d469a15b916441959446d52a0f5d3fc9f7720317", + "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/ec75a2bf751f6fec165e9ea0262655b8ca397e5c", + "reference": "ec75a2bf751f6fec165e9ea0262655b8ca397e5c", "shasum": "" }, "require": { - "composer-plugin-api": "^1.1.0 || ^2.0.0", - "ergebnis/json-normalizer": "^1.0.3", - "ergebnis/json-printer": "^3.1.1", - "justinrainbow/json-schema": "^5.2.10", + "composer-plugin-api": "^2.0.0", + "ergebnis/json-normalizer": "~2.1.0", + "ergebnis/json-printer": "^3.2.0", + "justinrainbow/json-schema": "^5.2.12", "localheinz/diff": "^1.1.1", - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { - "composer/composer": "^1.10.22 || ^2.0.13", - "ergebnis/license": "^1.1.0", - "ergebnis/php-cs-fixer-config": "^2.14.0", - "ergebnis/phpstan-rules": "~0.15.3", - "ergebnis/test-util": "^1.5.0", - "phpstan/extension-installer": "^1.1.0", - "phpstan/phpstan": "~0.12.89", - "phpstan/phpstan-deprecation-rules": "~0.12.6", - "phpstan/phpstan-phpunit": "~0.12.19", - "phpstan/phpstan-strict-rules": "~0.12.9", - "phpunit/phpunit": "^8.5.16", - "psalm/plugin-phpunit": "~0.16.0", - "symfony/filesystem": "^5.3.0", - "vimeo/psalm": "^4.7.3" + "composer/composer": "^2.3.9", + "ergebnis/license": "^1.2.0", + "ergebnis/php-cs-fixer-config": "^4.4.0", + "fakerphp/faker": "^1.19.0", + "phpunit/phpunit": "^9.5.21", + "psalm/plugin-phpunit": "~0.17.0", + "symfony/filesystem": "^5.4.9", + "vimeo/psalm": "^4.24.0" }, "type": "composer-plugin", "extra": { @@ -1197,49 +1333,38 @@ "issues": "https://github.com/ergebnis/composer-normalize/issues", "source": "https://github.com/ergebnis/composer-normalize" }, - "funding": [ - { - "url": "https://github.com/localheinz", - "type": "github" - } - ], - "time": "2021-06-15T08:06:45+00:00" + "time": "2022-07-05T16:09:10+00:00" }, { "name": "ergebnis/json-normalizer", - "version": "1.0.3", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-normalizer.git", - "reference": "4a7f064ce34d5a2e382564565cdd433dbc5b9494" + "reference": "2039eb11131a243b9204bf51219baa08935e6b1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/4a7f064ce34d5a2e382564565cdd433dbc5b9494", - "reference": "4a7f064ce34d5a2e382564565cdd433dbc5b9494", + "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/2039eb11131a243b9204bf51219baa08935e6b1d", + "reference": "2039eb11131a243b9204bf51219baa08935e6b1d", "shasum": "" }, "require": { - "ergebnis/json-printer": "^3.1.1", + "ergebnis/json-printer": "^3.2.0", + "ergebnis/json-schema-validator": "^2.0.0", "ext-json": "*", - "justinrainbow/json-schema": "^5.2.10", - "php": "^7.2 || ^8.0" + "justinrainbow/json-schema": "^5.2.11", + "php": "^7.4 || ^8.0" }, "require-dev": { - "ergebnis/license": "^1.1.0", - "ergebnis/php-cs-fixer-config": "^2.10.0", - "ergebnis/phpstan-rules": "~0.15.3", - "ergebnis/test-util": "^1.4.0", - "infection/infection": "~0.15.3", - "jangregor/phpstan-prophecy": "~0.8.1", - "phpstan/extension-installer": "^1.1.0", - "phpstan/phpstan": "~0.12.80", - "phpstan/phpstan-deprecation-rules": "~0.12.6", - "phpstan/phpstan-phpunit": "~0.12.17", - "phpstan/phpstan-strict-rules": "~0.12.9", - "phpunit/phpunit": "^8.5.14", - "psalm/plugin-phpunit": "~0.12.2", - "vimeo/psalm": "^3.18" + "ergebnis/data-provider": "^1.0.0", + "ergebnis/license": "^1.2.0", + "ergebnis/php-cs-fixer-config": "^3.4.0", + "fakerphp/faker": "^1.17.0", + "infection/infection": "~0.25.5", + "phpunit/phpunit": "^9.5.11", + "psalm/plugin-phpunit": "~0.16.1", + "vimeo/psalm": "^4.17.0" }, "type": "library", "autoload": { @@ -1273,41 +1398,35 @@ "type": "github" } ], - "time": "2021-03-06T13:33:57+00:00" + "time": "2022-01-04T11:19:55+00:00" }, { "name": "ergebnis/json-printer", - "version": "3.1.1", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-printer.git", - "reference": "e4190dadd9937a77d8afcaf2b6c42a528ab367d6" + "reference": "651cab2b7604a6b338d0d16749f5ea0851a68005" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/e4190dadd9937a77d8afcaf2b6c42a528ab367d6", - "reference": "e4190dadd9937a77d8afcaf2b6c42a528ab367d6", + "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/651cab2b7604a6b338d0d16749f5ea0851a68005", + "reference": "651cab2b7604a6b338d0d16749f5ea0851a68005", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { - "ergebnis/license": "^1.0.0", - "ergebnis/php-cs-fixer-config": "^2.2.1", - "ergebnis/phpstan-rules": "~0.15.2", - "ergebnis/test-util": "^1.1.0", - "infection/infection": "~0.15.3", - "phpstan/extension-installer": "^1.0.4", - "phpstan/phpstan": "~0.12.40", - "phpstan/phpstan-deprecation-rules": "~0.12.5", - "phpstan/phpstan-phpunit": "~0.12.16", - "phpstan/phpstan-strict-rules": "~0.12.4", - "phpunit/phpunit": "^8.5.8", - "psalm/plugin-phpunit": "~0.11.0", - "vimeo/psalm": "^3.14.2" + "ergebnis/license": "^1.1.0", + "ergebnis/php-cs-fixer-config": "^3.4.0", + "fakerphp/faker": "^1.17.0", + "infection/infection": "~0.25.5", + "phpunit/phpunit": "^9.5.11", + "psalm/plugin-phpunit": "~0.16.1", + "vimeo/psalm": "^4.16.1" }, "type": "library", "autoload": { @@ -1342,27 +1461,98 @@ "type": "github" } ], - "time": "2020-08-30T12:17:03+00:00" + "time": "2021-12-27T12:39:13+00:00" + }, + { + "name": "ergebnis/json-schema-validator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/json-schema-validator.git", + "reference": "dacd8a47c1cc2c426ec71e952da3609ebe901fac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/dacd8a47c1cc2c426ec71e952da3609ebe901fac", + "reference": "dacd8a47c1cc2c426ec71e952da3609ebe901fac", + "shasum": "" + }, + "require": { + "ext-json": "*", + "justinrainbow/json-schema": "^5.2.10", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.18.0", + "ergebnis/data-provider": "^1.0.0", + "ergebnis/license": "^1.1.0", + "ergebnis/php-cs-fixer-config": "~3.4.0", + "fakerphp/faker": "^1.17.0", + "infection/infection": "~0.25.3", + "phpunit/phpunit": "~9.5.10", + "psalm/plugin-phpunit": "~0.16.1", + "vimeo/psalm": "^4.15.0" + }, + "type": "library", + "extra": { + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Ergebnis\\Json\\SchemaValidator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com" + } + ], + "description": "Provides a JSON schema validator, building on top of justinrainbow/json-schema.", + "homepage": "https://github.com/ergebnis/json-schema-validator", + "keywords": [ + "json", + "schema", + "validator" + ], + "support": { + "issues": "https://github.com/ergebnis/json-schema-validator/issues", + "source": "https://github.com/ergebnis/json-schema-validator" + }, + "funding": [ + { + "url": "https://github.com/localheinz", + "type": "github" + } + ], + "time": "2021-12-13T16:54:56+00:00" }, { "name": "insolita/unused-scanner", - "version": "2.3.0", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/Insolita/unused-scanner.git", - "reference": "c52f871b138f24a8d98e000ca9f02b51f81fa900" + "reference": "ffefb5877fe9b3b3ceabdcd49d27ae85b9058597" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Insolita/unused-scanner/zipball/c52f871b138f24a8d98e000ca9f02b51f81fa900", - "reference": "c52f871b138f24a8d98e000ca9f02b51f81fa900", + "url": "https://api.github.com/repos/Insolita/unused-scanner/zipball/ffefb5877fe9b3b3ceabdcd49d27ae85b9058597", + "reference": "ffefb5877fe9b3b3ceabdcd49d27ae85b9058597", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", "php": ">=7.1", - "symfony/finder": "^3.4|^4.0|^5.0" + "symfony/finder": "^3.4|^4.0|^5.0|^6.0" }, "require-dev": { "php-mock/php-mock-phpunit": "^2.6", @@ -1380,9 +1570,9 @@ }, "autoload": { "psr-4": { + "tests\\": "tests", "insolita\\Scanner\\Lib\\": "Lib", - "insolita\\Scanner\\Exceptions\\": "Exceptions", - "tests\\": "tests" + "insolita\\Scanner\\Exceptions\\": "Exceptions" } }, "notification-url": "https://packagist.org/downloads/", @@ -1398,22 +1588,22 @@ "description": "Detect unused composer dependencies", "support": { "issues": "https://github.com/Insolita/unused-scanner/issues", - "source": "https://github.com/Insolita/unused-scanner/tree/2.3.0" + "source": "https://github.com/Insolita/unused-scanner/tree/2.4.0" }, - "time": "2021-04-15T15:59:31+00:00" + "time": "2022-01-05T22:07:21+00:00" }, { "name": "justinrainbow/json-schema", - "version": "5.2.11", + "version": "5.2.12", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, "require": { @@ -1468,9 +1658,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" }, - "time": "2021-07-22T09:24:00+00:00" + "time": "2022-04-13T08:02:27+00:00" }, { "name": "localheinz/diff", @@ -1534,35 +1724,36 @@ }, { "name": "maglnet/composer-require-checker", - "version": "3.3.0", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/maglnet/ComposerRequireChecker.git", - "reference": "4063254c611acf34f1c15b29b6bcc47d2e7a9a9e" + "reference": "537138b833ab0f9ad72b667a72bece2a765e88ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maglnet/ComposerRequireChecker/zipball/4063254c611acf34f1c15b29b6bcc47d2e7a9a9e", - "reference": "4063254c611acf34f1c15b29b6bcc47d2e7a9a9e", + "url": "https://api.github.com/repos/maglnet/ComposerRequireChecker/zipball/537138b833ab0f9ad72b667a72bece2a765e88ab", + "reference": "537138b833ab0f9ad72b667a72bece2a765e88ab", "shasum": "" }, "require": { "composer-runtime-api": "^2.0.0", "ext-json": "*", "ext-phar": "*", - "nikic/php-parser": "^4.10.2", + "nikic/php-parser": "^4.13.0", "php": "^7.4 || ^8.0", - "symfony/console": "^5.2.6", + "symfony/console": "^5.4.0", "webmozart/assert": "^1.9.1", - "webmozart/glob": "^4.3.0" + "webmozart/glob": "^4.4.0" }, "require-dev": { "doctrine/coding-standard": "^9.0.0", "ext-zend-opcache": "*", - "mikey179/vfsstream": "^1.6.8", - "phpstan/phpstan": "^0.12.85", - "phpunit/phpunit": "^9.5.4", - "vimeo/psalm": "^4.7.0" + "mikey179/vfsstream": "^1.6.10", + "phing/phing": "^2.17.0", + "phpstan/phpstan": "^1.2.0", + "phpunit/phpunit": "^9.5.10", + "vimeo/psalm": "^4.14.0" }, "bin": [ "bin/composer-require-checker" @@ -1607,43 +1798,44 @@ ], "support": { "issues": "https://github.com/maglnet/ComposerRequireChecker/issues", - "source": "https://github.com/maglnet/ComposerRequireChecker/tree/3.3.0" + "source": "https://github.com/maglnet/ComposerRequireChecker/tree/3.8.0" }, - "time": "2021-06-09T11:44:18+00:00" + "time": "2021-12-07T14:25:47+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.10.2", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, - "replace": { - "myclabs/deep-copy": "self.version" + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" }, "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, "files": [ "src/DeepCopy/deep_copy.php" - ] + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1659,7 +1851,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" }, "funding": [ { @@ -1667,20 +1859,20 @@ "type": "tidelift" } ], - "time": "2020-11-13T09:40:50+00:00" + "time": "2022-03-03T13:19:32+00:00" }, { "name": "nikic/php-parser", - "version": "v4.13.1", + "version": "v4.14.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "63a79e8daa781cac14e5195e63ed8ae231dd10fd" + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/63a79e8daa781cac14e5195e63ed8ae231dd10fd", - "reference": "63a79e8daa781cac14e5195e63ed8ae231dd10fd", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", "shasum": "" }, "require": { @@ -1721,9 +1913,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" }, - "time": "2021-11-03T20:52:16+00:00" + "time": "2022-05-31T20:59:12+00:00" }, { "name": "phar-io/manifest", @@ -1787,16 +1979,16 @@ }, { "name": "phar-io/version", - "version": "3.1.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "bae7c545bef187884426f042434e561ab1ddb182" + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", - "reference": "bae7c545bef187884426f042434e561ab1ddb182", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { @@ -1832,22 +2024,22 @@ "description": "Library for handling version information and constraints", "support": { "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.1.0" + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2021-02-23T14:00:09+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { "name": "php-parallel-lint/php-parallel-lint", - "version": "v1.3.1", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git", - "reference": "761f3806e30239b5fcd90a0a45d41dc2138de192" + "reference": "6483c9832e71973ed29cf71bd6b3f4fde438a9de" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/761f3806e30239b5fcd90a0a45d41dc2138de192", - "reference": "761f3806e30239b5fcd90a0a45d41dc2138de192", + "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/6483c9832e71973ed29cf71bd6b3f4fde438a9de", + "reference": "6483c9832e71973ed29cf71bd6b3f4fde438a9de", "shasum": "" }, "require": { @@ -1860,7 +2052,7 @@ }, "require-dev": { "nette/tester": "^1.3 || ^2.0", - "php-parallel-lint/php-console-highlighter": "~0.3", + "php-parallel-lint/php-console-highlighter": "0.* || ^1.0", "squizlabs/php_codesniffer": "^3.6" }, "suggest": { @@ -1872,7 +2064,7 @@ "type": "library", "autoload": { "classmap": [ - "./" + "./src/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1889,9 +2081,9 @@ "homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint", "support": { "issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues", - "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.3.1" + "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.3.2" }, - "time": "2021-08-13T05:35:13+00:00" + "time": "2022-02-21T12:50:22+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -2005,16 +2197,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.5.1", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" + "reference": "77a32518733312af16a44300404e945338981de3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", + "reference": "77a32518733312af16a44300404e945338981de3", "shasum": "" }, "require": { @@ -2049,22 +2241,22 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" }, - "time": "2021-10-02T14:08:47+00:00" + "time": "2022-03-15T21:29:03+00:00" }, { "name": "phpspec/prophecy", - "version": "1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", - "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", "shasum": "" }, "require": { @@ -2116,22 +2308,22 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.14.0" + "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" }, - "time": "2021-09-10T09:02:12+00:00" + "time": "2021-12-08T12:19:24+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.8", + "version": "9.2.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "cf04e88a2e3c56fc1a65488afd493325b4c1bc3e" + "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cf04e88a2e3c56fc1a65488afd493325b4c1bc3e", - "reference": "cf04e88a2e3c56fc1a65488afd493325b4c1bc3e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", + "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", "shasum": "" }, "require": { @@ -2187,7 +2379,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.8" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" }, "funding": [ { @@ -2195,20 +2387,20 @@ "type": "github" } ], - "time": "2021-10-30T08:01:38+00:00" + "time": "2022-03-07T09:28:20+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.5", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { @@ -2247,7 +2439,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -2255,7 +2447,7 @@ "type": "github" } ], - "time": "2020-09-28T05:57:25+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { "name": "phpunit/php-invoker", @@ -2440,16 +2632,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.10", + "version": "9.5.21", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" + "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0e32b76be457de00e83213528f6bb37e2a38fcb1", + "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1", "shasum": "" }, "require": { @@ -2465,7 +2657,7 @@ "phar-io/version": "^3.0.2", "php": ">=7.3", "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.7", + "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", @@ -2479,11 +2671,10 @@ "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^2.3.4", + "sebastian/type": "^3.0", "sebastian/version": "^3.0.2" }, "require-dev": { - "ext-pdo": "*", "phpspec/prophecy-phpunit": "^2.0.1" }, "suggest": { @@ -2500,11 +2691,11 @@ } }, "autoload": { - "classmap": [ - "src/" - ], "files": [ "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2527,11 +2718,11 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.21" }, "funding": [ { - "url": "https://phpunit.de/donate.html", + "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { @@ -2539,7 +2730,7 @@ "type": "github" } ], - "time": "2021-09-25T07:38:51+00:00" + "time": "2022-06-19T12:14:25+00:00" }, { "name": "psr/container", @@ -2595,53 +2786,76 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "0488e161600117fc3a0d72397dad154729002f54" + "reference": "773292d413a97c357a0b49635afd5fdb1d4f314a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/0488e161600117fc3a0d72397dad154729002f54", - "reference": "0488e161600117fc3a0d72397dad154729002f54", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/773292d413a97c357a0b49635afd5fdb1d4f314a", + "reference": "773292d413a97c357a0b49635afd5fdb1d4f314a", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", - "adodb/adodb-php": "<5.20.12", + "admidio/admidio": "<4.1.9", + "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", "akaunting/akaunting": "<2.1.13", + "alextselegidis/easyappointments": "<=1.4.3", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amazing/media2click": ">=1,<1.3.3", "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<1.0.1", "amphp/http-client": ">=4,<4.4", + "anchorcms/anchor-cms": "<=0.12.7", + "andreapollastri/cipi": "<=3.1.15", "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "appwrite/server-ce": "<0.11.1|>=0.12,<0.12.2", + "area17/twill": "<1.2.5|>=2,<2.5.3", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", "aws/aws-sdk-php": ">=3,<3.2.1", "bagisto/bagisto": "<0.1.5", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", - "baserproject/basercms": "<=4.5", + "barryvdh/laravel-translation-manager": "<0.6.2", + "baserproject/basercms": "<4.5.4", "billz/raspap-webgui": "<=2.6.6", "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "bmarshall511/wordpress_zero_spam": "<5.2.13", "bolt/bolt": "<3.7.2", - "bolt/core": "<4.1.13", + "bolt/core": "<=4.2", + "bottelet/flarepoint": "<2.2.1", "brightlocal/phpwhois": "<=4.2.5", - "buddypress/buddypress": "<5.1.2", + "brotkrueml/codehighlight": "<2.7", + "brotkrueml/schema": "<1.13.1|>=2,<2.5.1", + "brotkrueml/typo3-matomo-integration": "<1.3.2", + "buddypress/buddypress": "<7.2.1", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "bytefury/crater": "<6.0.2", "cachethq/cachet": "<2.5.1", - "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cakephp/cakephp": "<3.10.3|>=4,<4.0.6", + "cardgate/magento2": "<2.0.33", "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", + "catfan/medoo": "<1.7.5", "centreon/centreon": "<20.10.7", "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "codeception/codeception": "<3.1.3|>=4,<4.1.22", "codeigniter/framework": "<=3.0.6", + "codeigniter4/framework": "<4.1.9", "codiad/codiad": "<=2.8.4", - "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", + "composer/composer": "<1.10.26|>=2-alpha.1,<2.2.12|>=2.3,<2.3.5", + "concrete5/concrete5": "<9", + "concrete5/core": "<8.5.8|>=9,<9.1", "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3", "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|= 4.10.0", + "contao/core-bundle": "<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", - "craftcms/cms": "<3.6.7", + "contao/managed-edition": "<=1.5", + "craftcms/cms": "<3.7.36", "croogo/croogo": "<3.0.7", + "cuyz/valinor": "<0.12", + "czproject/git-php": "<4.0.3", + "darylldoyle/safe-svg": "<1.9.10", "datadog/dd-trace": ">=0.30,<0.30.2", "david-garcia/phpwhois": "<=4.3.1", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", @@ -2649,20 +2863,23 @@ "doctrine/annotations": ">=1,<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", - "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", "doctrine/doctrine-bundle": "<1.5.2", "doctrine/doctrine-module": "<=0.7.1", "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", - "dolibarr/dolibarr": "<14|>= 3.3.beta1, < 13.0.2", - "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "dolibarr/dolibarr": "<16|= 12.0.5|>= 3.3.beta1, < 13.0.2", + "dompdf/dompdf": "<2", + "drupal/core": ">=7,<7.91|>=8,<9.3.19|>=9.4,<9.4.3", "drupal/drupal": ">=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", "dweeves/magmi": "<=0.7.24", "ecodev/newsletter": "<=4", + "ectouch/ectouch": "<=2.7.2", + "elefant/cms": "<1.3.13", + "elgg/elgg": "<3.3.24|>=4,<4.0.5", "endroid/qr-code-bundle": "<3.4.2", - "enshrined/svg-sanitize": "<0.13.1", + "enshrined/svg-sanitize": "<0.15", "erusev/parsedown": "<1.7.2", "ether/logs": "<3.0.4", "ezsystems/demobundle": ">=5.4,<5.4.6.1", @@ -2670,111 +2887,159 @@ "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", - "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.27", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<1.3.19", "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", + "ezsystems/ezplatform-richtext": ">=2.3,<=2.3.7", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<7.5.29", "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", "ezyang/htmlpurifier": "<4.1.1", - "facade/ignition": "<1.16.14|>=2,<2.4.2|>=2.5,<2.5.2", + "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", + "facturascripts/facturascripts": "<=2022.8", "feehi/cms": "<=2.1.1", "feehi/feehicms": "<=0.1.3", + "fenom/fenom": "<=2.12.1", + "filegator/filegator": "<7.8", "firebase/php-jwt": "<2", "flarum/core": ">=1,<=1.0.1", "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", "flarum/tags": "<=0.1-beta.13", "fluidtypo3/vhs": "<5.1.1", + "fof/byobu": ">=0.3-beta.2,<1.1.7", + "fof/upload": "<1.2.3", "fooman/tcpdf": "<6.2.22", - "forkcms/forkcms": "<=5.9.2", + "forkcms/forkcms": "<5.11.1", "fossar/tcpdf-parser": "<6.2.22", - "francoisjacquet/rosariosis": "<6.5.1", + "francoisjacquet/rosariosis": "<9.1", "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "froala/wysiwyg-editor": "<3.2.7", + "froxlor/froxlor": "<=0.10.22", "fuel/core": "<1.8.1", - "getgrav/grav": "<1.7.21", - "getkirby/cms": "<=3.5.6", + "gaoming13/wechat-php-sdk": "<=1.10.2", + "genix/cms": "<=1.1.11", + "getgrav/grav": "<1.7.34", + "getkirby/cms": "<3.5.8", "getkirby/panel": "<2.5.14", "gilacms/gila": "<=1.11.4", + "globalpayments/php-sdk": "<2", + "google/protobuf": "<3.15", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", - "grumpydictator/firefly-iii": "<5.6.1", - "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", - "helloxz/imgurl": "<=2.31", + "grumpydictator/firefly-iii": "<5.6.5", + "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", + "guzzlehttp/psr7": "<1.8.4|>=2,<2.1.1", + "helloxz/imgurl": "= 2.31|<=2.31", + "hillelcoren/invoice-ninja": "<5.3.35", + "hjue/justwriting": "<=1", + "hov/jobfair": "<1.0.13|>=2,<2.0.2", + "hyn/multi-tenant": ">=5.6,<5.7.2", + "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4", "ibexa/post-install": "<=1.0.4", - "icecoder/icecoder": "<=8", + "icecoder/icecoder": "<=8.1", + "idno/known": "<=1.3.1", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", - "illuminate/database": "<6.20.26|>=7,<8.40", + "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", - "illuminate/view": ">=7,<7.1.2", - "impresscms/impresscms": "<=1.4.2", + "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", + "impresscms/impresscms": "<=1.4.3", "in2code/femanager": "<5.5.1|>=6,<6.3.1", + "in2code/lux": "<17.6.1|>=18,<24.0.2", "intelliants/subrion": "<=4.2.1", + "islandora/islandora": ">=2,<2.4.1", "ivankristianto/phpwhois": "<=4.3", - "james-heinrich/getid3": "<1.9.9", - "joomla/archive": "<1.1.10", + "jackalope/jackalope-doctrine-dbal": "<1.7.4", + "james-heinrich/getid3": "<1.9.21", + "joomla/archive": "<1.1.12|>=2,<2.0.1", + "joomla/filesystem": "<1.6.2|>=2,<2.0.1", + "joomla/filter": "<1.4.4|>=2,<2.0.1", + "joomla/input": ">=2,<2.0.2", "joomla/session": "<1.3.1", + "jsdecena/laracom": "<2.0.9", "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", + "kevinpapst/kimai2": "<1.16.7", "kitodo/presentation": "<3.1.2", "klaviyo/magento2-extension": ">=1,<3", + "krayin/laravel-crm": "<1.2.2", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-diactoros": "<2.11.1", + "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", "laminas/laminas-http": "<2.14.2", - "laravel/framework": "<6.20.26|>=7,<8.40", + "laravel/fortify": "<1.11.1", + "laravel/framework": "<6.20.42|>=7,<7.30.6|>=8,<8.75", + "laravel/laravel": "<=9.1.8", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "latte/latte": "<2.10.8", "lavalite/cms": "<=5.8", "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", "league/commonmark": "<0.18.3", "league/flysystem": "<1.1.4|>=2,<2.1.1", "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", - "librenms/librenms": "<21.1", + "librenms/librenms": "<22.4", + "limesurvey/limesurvey": "<3.27.19", + "livehelperchat/livehelperchat": "<=3.91", "livewire/livewire": ">2.2.4,<2.2.6", "lms/routes": "<2.1.1", "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", + "luyadev/yii-helpers": "<1.2.1", "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", "marcwillmann/turn": "<0.3.3", - "mautic/core": "<4|= 2.13.1", + "matyhtf/framework": "<3.0.6", + "mautic/core": "<4.3|= 2.13.1", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", + "microweber/microweber": "<1.3.1", "miniorange/miniorange-saml": "<1.4.3", "mittwald/typo3_forum": "<1.2.1", + "modx/revolution": "<= 2.8.3-pl|<2.8", + "mojo42/jirafeau": "<4.4", "monolog/monolog": ">=1.8,<1.12", - "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10,<3.10.2", + "moodle/moodle": "<4.0.1", + "mustache/mustache": ">=2,<2.14.1", "namshi/jose": "<2.2", + "neoan3-apps/template": "<1.1.1", + "neorazorx/facturascripts": "<2022.4", "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", - "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2", "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", "nilsteampassnet/teampass": "<=2.1.27.36", - "nukeviet/nukeviet": "<4.3.4", - "nystudio107/craft-seomatic": "<3.3", + "noumo/easyii": "<=0.9", + "nukeviet/nukeviet": "<4.5.2", + "nystudio107/craft-seomatic": "<3.4.12", "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", "october/backend": "<1.1.2", "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", - "october/october": ">=1.0.319,<1.0.466", + "october/october": ">=1.0.319,<1.0.466|>=2.1,<2.1.12", "october/rain": "<1.0.472|>=1.1,<1.1.2", - "october/system": "<1.0.472|>=1.1.1,<1.1.5", + "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.15", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "open-web-analytics/open-web-analytics": "<1.7.4", "opencart/opencart": "<=3.0.3.2", "openid/php-openid": "<2.3", "openmage/magento-lts": "<19.4.15|>=20,<20.0.13", "orchid/platform": ">=9,<9.4.4", - "oro/crm": ">=1.7,<1.7.4", - "oro/platform": ">=1.7,<1.7.4", + "oro/commerce": ">=5,<5.0.4", + "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<4.2.8", + "packbackbooks/lti-1-3-php-library": "<5", "padraic/humbug_get_contents": "<1.1.2", "pagarme/pagarme-php": ">=0,<3", "pagekit/pagekit": "<=1.0.18", @@ -2782,55 +3047,72 @@ "passbolt/passbolt_api": "<2.11", "paypal/merchant-sdk-php": "<3.12", "pear/archive_tar": "<1.4.14", + "pear/crypt_gpg": "<1.6.7", + "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", "personnummer/personnummer": "<3.0.2", "phanan/koel": "<5.1.4", "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", - "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", - "phpoffice/phpexcel": "<1.8.2", + "phpmyadmin/phpmyadmin": "<5.1.3", + "phpoffice/phpexcel": "<1.8", "phpoffice/phpspreadsheet": "<1.16", "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", - "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpservermon/phpservermon": "<=3.5.2", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<10.1.3", - "pocketmine/pocketmine-mp": "<3.15.4", + "pimcore/data-hub": "<1.2.4", + "pimcore/pimcore": "<10.4.4", + "pocketmine/bedrock-protocol": "<8.0.2", + "pocketmine/pocketmine-mp": ">= 4.0.0-BETA5, < 4.4.2|<4.2.10", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/blockwishlist": ">=2,<2.1.1", "prestashop/contactform": ">1.0.1,<4.3", "prestashop/gamification": "<2.3.2", + "prestashop/prestashop": ">=1.6.0.10,<1.7.8.7", "prestashop/productcomments": ">=4,<4.2.1", "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", - "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", + "prestashop/ps_linklist": "<3.1", + "privatebin/privatebin": "<1.4", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", - "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", + "pterodactyl/panel": "<1.7", + "ptrofimov/beanstalk_console": "<1.7.14", "pusher/pusher-php-server": "<2.2.1", "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", + "remdex/livehelperchat": "<3.99", "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", + "rudloff/alltube": "<3.0.3", + "s-cart/core": "<6.9", + "s-cart/s-cart": "<6.9", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.4.3", - "shopware/platform": "<=6.4.3", + "shopware/core": "<=6.4.9", + "shopware/platform": "<=6.4.9", "shopware/production": "<=6.3.5.2", - "shopware/shopware": "<5.6.10", - "showdoc/showdoc": "<=2.9.8", - "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", - "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", + "shopware/shopware": "<=5.7.13", + "shopware/storefront": "<=6.4.8.1", + "shopxo/shopxo": "<2.2.6", + "showdoc/showdoc": "<2.10.4", + "silverstripe/admin": ">=1,<1.8.1", + "silverstripe/assets": ">=1,<1.10.1", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.7.4", - "silverstripe/graphql": "<=3.5|>=4-alpha.1,<4-alpha.2", + "silverstripe/framework": "<4.10.9", + "silverstripe/graphql": "<3.5.2|>=4-alpha.1,<4-alpha.2|= 4.0.0-alpha1", + "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1", "silverstripe/subsites": ">=2,<2.1.1", "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", "silverstripe/userforms": "<3", @@ -2840,22 +3122,26 @@ "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", "simplito/elliptic-php": "<1.0.6", "slim/slim": "<2.6", - "smarty/smarty": "<3.1.39", + "smarty/smarty": "<3.1.45|>=4,<4.1.1", + "snipe/snipe-it": "<=6.0.2|>= 6.0.0-RC-1, <= 6.0.0-RC-5", "socalnick/scn-social-auth": "<1.15.2", "socialiteproviders/steam": "<1.1", + "spipu/html2pdf": "<5.2.4", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", - "ssddanbrown/bookstack": "<0.29.2", + "ssddanbrown/bookstack": "<22.2.3", + "statamic/cms": "<3.2.39|>=3.3,<3.3.2", "stormpath/sdk": ">=0,<9.9.99", "studio-42/elfinder": "<2.1.59", "subrion/cms": "<=4.2.1", - "sulu/sulu": "<1.6.41|>=2,<2.0.10|>=2.1,<2.1.1", + "sulu/sulu": "= 2.4.0-RC1|<1.6.44|>=2,<2.2.18|>=2.3,<2.3.8", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": "<1.10.1", + "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", - "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3|>=1.9,<1.9.5", + "sylius/sylius": "<1.9.10|>=1.10,<1.10.11|>=1.11,<1.11.2", "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", "symbiote/silverstripe-versionedfiles": "<=2.0.3", @@ -2864,9 +3150,9 @@ "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", - "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3|= 6.0.3|= 5.4.3|= 5.3.14", "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5|>=5.2,<5.3.12", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", "symfony/mime": ">=4.3,<4.3.8", @@ -2876,13 +3162,13 @@ "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/routing": ">=2,<2.0.19", "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", - "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11|>=5.3,<5.3.12", "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8|>=5.3,<5.3.2", - "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9|>=5.3,<5.3.2", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2", + "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", + "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.35|>=5,<5.3.12|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", @@ -2890,19 +3176,24 @@ "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", "t3/dce": ">=2.2,<2.6.2", "t3g/svg-sanitizer": "<1.0.3", + "tastyigniter/tastyigniter": "<3.3", "tecnickcom/tcpdf": "<6.2.22", + "terminal42/contao-tablelookupwizard": "<3.3.5", "thelia/backoffice-default-template": ">=2.1,<2.1.2", "thelia/thelia": ">=2.1-beta.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", + "thinkcmf/thinkcmf": "<=5.1.7", + "tinymce/tinymce": "<5.10", "titon/framework": ">=0,<9.9.99", + "topthink/framework": "<=6.0.12", "topthink/think": "<=6.0.9", "topthink/thinkphp": "<=3.2.3", - "tribalsystems/zenario": "<8.8.53370", + "tribalsystems/zenario": "<9.2.55826", "truckersmp/phpwhois": "<=4.3.1", - "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.3.2", + "twig/twig": "<1.38|>=2,<2.14.11|>=3,<3.3.8", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.29|>=11,<11.5.11", "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", - "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.52|>=8,<=8.7.41|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.3.2", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<7.6.57|>=8,<8.7.47|>=9,<9.5.35|>=10,<10.4.29|>=11,<11.5.11", "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", @@ -2910,16 +3201,26 @@ "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", + "unisharp/laravel-filemanager": "<=2.3", + "userfrosting/userfrosting": ">=0.3.1,<4.6.3", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "vanilla/safecurl": "<0.9.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", - "vrana/adminer": "<4.7.9", + "vrana/adminer": "<4.8.1", "wallabag/tcpdf": "<6.2.22", + "wanglelecc/laracms": "<=1.0.3", "web-auth/webauthn-framework": ">=3.3,<3.3.4", "webcoast/deferred-image-processing": "<1.0.2", "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", + "wintercms/winter": "<1.0.475|>=1.1,<1.1.9", + "woocommerce/woocommerce": "<6.6", "wp-cli/wp-cli": "<2.5", + "wp-graphql/wp-graphql": "<0.3.5", + "wpanel/wpanel4-cms": "<=4.3.1", + "wwbn/avideo": "<=11.6", + "yeswiki/yeswiki": "<4.1", + "yetiforce/yetiforce-crm": "<6.4", "yidashi/yii2cmf": "<=2", "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", @@ -2938,10 +3239,10 @@ "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", - "zendframework/zend-diactoros": ">=1,<1.8.4", - "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-diactoros": "<1.8.4", + "zendframework/zend-feed": "<2.10.3", "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", - "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-http": "<2.8.1", "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", @@ -2992,7 +3293,7 @@ "type": "tidelift" } ], - "time": "2021-09-30T18:03:50+00:00" + "time": "2022-08-12T16:04:45+00:00" }, { "name": "sebastian/cli-parser", @@ -3360,16 +3661,16 @@ }, { "name": "sebastian/environment", - "version": "5.1.3", + "version": "5.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", "shasum": "" }, "require": { @@ -3411,7 +3712,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" }, "funding": [ { @@ -3419,20 +3720,20 @@ "type": "github" } ], - "time": "2020-09-28T05:52:38+00:00" + "time": "2022-04-03T09:37:03+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.3", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", - "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", "shasum": "" }, "require": { @@ -3481,14 +3782,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" }, "funding": [ { @@ -3496,20 +3797,20 @@ "type": "github" } ], - "time": "2020-09-28T05:24:23+00:00" + "time": "2021-11-11T14:18:36+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.3", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", "shasum": "" }, "require": { @@ -3552,7 +3853,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" }, "funding": [ { @@ -3560,7 +3861,7 @@ "type": "github" } ], - "time": "2021-06-11T13:31:12+00:00" + "time": "2022-02-14T08:28:10+00:00" }, { "name": "sebastian/lines-of-code", @@ -3851,28 +4152,28 @@ }, { "name": "sebastian/type", - "version": "2.3.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" + "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -3895,7 +4196,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" + "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" }, "funding": [ { @@ -3903,7 +4204,7 @@ "type": "github" } ], - "time": "2021-06-15T12:49:02+00:00" + "time": "2022-03-15T09:54:48+00:00" }, { "name": "sebastian/version", @@ -3960,16 +4261,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.6.1", + "version": "3.7.1", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e" + "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/f268ca40d54617c6e06757f83f699775c9b3ff2e", - "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", + "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", "shasum": "" }, "require": { @@ -4012,30 +4313,30 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2021-10-11T04:00:11+00:00" + "time": "2022-06-18T07:21:10+00:00" }, { "name": "symfony/console", - "version": "v5.3.10", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3" + "reference": "535846c7ee6bc4dd027ca0d93220601456734b10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", - "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", + "url": "https://api.github.com/repos/symfony/console/zipball/535846c7ee6bc4dd027ca0d93220601456734b10", + "reference": "535846c7ee6bc4dd027ca0d93220601456734b10", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", @@ -4050,12 +4351,12 @@ }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -4095,7 +4396,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.3.10" + "source": "https://github.com/symfony/console/tree/v5.4.11" }, "funding": [ { @@ -4111,24 +4412,25 @@ "type": "tidelift" } ], - "time": "2021-10-26T09:30:15+00:00" + "time": "2022-07-22T10:42:43+00:00" }, { "name": "symfony/finder", - "version": "v5.3.7", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -4157,7 +4459,89 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v5.4.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-07-29T07:37:50+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" }, "funding": [ { @@ -4173,20 +4557,20 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + "reference": "433d05519ce6990bf3530fba6957499d327395c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", - "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", "shasum": "" }, "require": { @@ -4198,7 +4582,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4206,12 +4590,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4238,7 +4622,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" }, "funding": [ { @@ -4254,20 +4638,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", "shasum": "" }, "require": { @@ -4279,7 +4663,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4287,12 +4671,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -4322,7 +4706,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" }, "funding": [ { @@ -4338,32 +4722,35 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "shasum": "" }, "require": { "php": ">=7.1" }, + "provide": { + "ext-mbstring": "*" + }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4371,12 +4758,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4402,7 +4789,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" }, "funding": [ { @@ -4418,20 +4805,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T12:26:48+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.23.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { @@ -4440,7 +4827,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4448,12 +4835,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -4481,7 +4868,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -4497,20 +4884,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.23.1", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", - "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", "shasum": "" }, "require": { @@ -4519,7 +4906,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4527,12 +4914,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -4564,7 +4951,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" }, "funding": [ { @@ -4580,20 +4967,20 @@ "type": "tidelift" } ], - "time": "2021-07-28T13:41:28+00:00" + "time": "2022-05-10T07:21:04+00:00" }, { "name": "symfony/process", - "version": "v5.3.7", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967" + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967", - "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967", + "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", "shasum": "" }, "require": { @@ -4626,7 +5013,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.3.7" + "source": "https://github.com/symfony/process/tree/v5.4.11" }, "funding": [ { @@ -4642,25 +5029,29 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1" + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "suggest": { "symfony/service-implementation": "" @@ -4668,7 +5059,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -4705,7 +5096,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" }, "funding": [ { @@ -4721,20 +5112,20 @@ "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2022-05-30T19:17:29+00:00" }, { "name": "symfony/string", - "version": "v5.3.10", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" + "reference": "5eb661e49ad389e4ae2b6e4df8d783a8a6548322" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", - "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "url": "https://api.github.com/repos/symfony/string/zipball/5eb661e49ad389e4ae2b6e4df8d783a8a6548322", + "reference": "5eb661e49ad389e4ae2b6e4df8d783a8a6548322", "shasum": "" }, "require": { @@ -4745,20 +5136,23 @@ "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php80": "~1.15" }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" + "symfony/var-exporter": "^4.4|^5.0|^6.0" }, "type": "library", "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, "files": [ "Resources/functions.php" ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, "exclude-from-classmap": [ "/Tests/" ] @@ -4788,7 +5182,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.10" + "source": "https://github.com/symfony/string/tree/v5.4.11" }, "funding": [ { @@ -4804,32 +5198,32 @@ "type": "tidelift" } ], - "time": "2021-10-27T18:21:46+00:00" + "time": "2022-07-24T16:15:25+00:00" }, { "name": "symfony/yaml", - "version": "v5.3.6", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7" + "reference": "05d4ea560f3402c6c116afd99fdc66e60eda227e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", - "reference": "4500fe63dc9c6ffc32d3b1cb0448c329f9c814b7", + "url": "https://api.github.com/repos/symfony/yaml/zipball/05d4ea560f3402c6c116afd99fdc66e60eda227e", + "reference": "05d4ea560f3402c6c116afd99fdc66e60eda227e", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8" + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<4.4" + "symfony/console": "<5.3" }, "require-dev": { - "symfony/console": "^4.4|^5.0" + "symfony/console": "^5.3|^6.0" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" @@ -4863,7 +5257,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.3.6" + "source": "https://github.com/symfony/yaml/tree/v5.4.11" }, "funding": [ { @@ -4879,7 +5273,7 @@ "type": "tidelift" } ], - "time": "2021-07-29T06:20:01+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "theseer/tokenizer", @@ -4933,21 +5327,20 @@ }, { "name": "webmozart/glob", - "version": "4.4.0", + "version": "4.6.0", "source": { "type": "git", "url": "https://github.com/webmozarts/glob.git", - "reference": "539b5dbc10021d3f9242e7a9e9b6b37843179e83" + "reference": "3c17f7dec3d9d0e87b575026011f2e75a56ed655" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/glob/zipball/539b5dbc10021d3f9242e7a9e9b6b37843179e83", - "reference": "539b5dbc10021d3f9242e7a9e9b6b37843179e83", + "url": "https://api.github.com/repos/webmozarts/glob/zipball/3c17f7dec3d9d0e87b575026011f2e75a56ed655", + "reference": "3c17f7dec3d9d0e87b575026011f2e75a56ed655", "shasum": "" }, "require": { - "php": "^7.3 || ^8.0.0", - "webmozart/path-util": "^2.2" + "php": "^7.3 || ^8.0.0" }, "require-dev": { "phpunit/phpunit": "^9.5", @@ -4977,59 +5370,9 @@ "description": "A PHP implementation of Ant's glob.", "support": { "issues": "https://github.com/webmozarts/glob/issues", - "source": "https://github.com/webmozarts/glob/tree/4.4.0" - }, - "time": "2021-10-07T16:13:08+00:00" - }, - { - "name": "webmozart/path-util", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/path-util.git", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "webmozart/assert": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" + "source": "https://github.com/webmozarts/glob/tree/4.6.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\PathUtil\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", - "support": { - "issues": "https://github.com/webmozart/path-util/issues", - "source": "https://github.com/webmozart/path-util/tree/2.3.0" - }, - "time": "2015-12-17T08:42:14+00:00" + "time": "2022-05-24T19:45:58+00:00" } ], "aliases": [], @@ -5042,6 +5385,8 @@ "platform": { "php": ">= 7.4" }, - "platform-dev": [], + "platform-dev": { + "ext-json": "*" + }, "plugin-api-version": "2.1.0" } diff --git a/src/Exception/InvalidConfigurationException.php b/src/Exception/InvalidConfigurationException.php index 58947ab..93581cb 100644 --- a/src/Exception/InvalidConfigurationException.php +++ b/src/Exception/InvalidConfigurationException.php @@ -1,8 +1,9 @@ $options + * @return array * @throws InvalidConfigurationException * @throws Base64DecodeException * @throws JWKConverterException * @throws IdentityProviderException */ - protected function discoverConfiguration($issuer, $options) + public function discoverConfiguration(string $issuer, array $options): array { $uri = $issuer . '/.well-known/openid-configuration'; $request = $this->getRequest(self::METHOD_GET, $uri); $response = $this->getParsedResponse($request); - if (false === is_array($response)) { + if (is_array($response) === false) { throw new InvalidConfigurationException( 'Invalid response received from discovery. Expected JSON.' ); @@ -287,18 +284,20 @@ protected function discoverConfiguration($issuer, $options) ]; foreach($optionMapping as $optionKey => $responseKey) { - if($responseKey['required'] && !isset($response[$responseKey['name']])) { - throw new InvalidConfigurationException( - "Parameter {$responseKey['name']} missing in discovery configuration at $uri" - ); + if(!isset($response[$responseKey['name']])) { + if($responseKey['required']) { + throw new InvalidConfigurationException( + "Required parameter {$responseKey['name']} missing in discovery configuration at $uri" + ); + } else continue; } $options[$optionKey] = $response[$responseKey['name']]; } // Validate scopes - $scopesSupported = $response["scopes_supported"]; - if(isset($scopesSupported)) { + if(isset($response["scopes_supported"])) { + $scopesSupported = $response["scopes_supported"]; foreach($options['scopes'] as $scope) { if(!in_array($scope, $scopesSupported)) { throw new InvalidConfigurationException( @@ -311,14 +310,14 @@ protected function discoverConfiguration($issuer, $options) // Set public key if(!isset($response["jwks_uri"])) { throw new InvalidConfigurationException( - "Parameter jwks_uri missing in discovery configuration at $uri" + "Required parameter jwks_uri missing in discovery configuration at $uri" ); } $jwksUri = $response["jwks_uri"]; $jwksRequest = $this->getRequest(self::METHOD_GET, $jwksUri); $jwksResponse = $this->getParsedResponse($jwksRequest); - if (false === is_array($jwksResponse) || false === is_array($jwksResponse['keys'])) { + if (is_array($jwksResponse) === false || is_array($jwksResponse['keys']) === false) { throw new InvalidConfigurationException( 'Invalid response received from discovery. Expected JSON.' ); diff --git a/tests/Unit/OpenIDConnectProviderTest.php b/tests/Unit/OpenIDConnectProviderTest.php index c442d7e..9ba444f 100644 --- a/tests/Unit/OpenIDConnectProviderTest.php +++ b/tests/Unit/OpenIDConnectProviderTest.php @@ -17,6 +17,7 @@ use League\OAuth2\Client\OptionProvider\PostAuthOptionProvider; use League\OAuth2\Client\Token\AccessToken; use League\OAuth2\Client\Tool\RequestFactory; +use OpenIDConnectClient\Exception\InvalidConfigurationException; use OpenIDConnectClient\Exception\InvalidTokenException; use OpenIDConnectClient\OpenIDConnectProvider; use OpenIDConnectClient\Validator\ValidatorChain; @@ -101,7 +102,7 @@ protected function setUp(): void /** * @dataProvider invalidConstructorArgumentsProvider */ - public function testConstructorWithoutSignerThrowsException(array $options, array $collaborators): void + public function testConstructorWithInvalidArgumentsThrowsException(array $options, array $collaborators): void { $this->expectException(InvalidArgumentException::class); @@ -308,6 +309,84 @@ public function testDefaultValidatorChain(): void self::assertTrue($chain->hasValidator(RegisteredClaims::SUBJECT)); } + /** + * @dataProvider invalidConfigurationDiscoveryResponsesProvider + */ + public function testConfigurationDiscoveryInvalidResponses(string $responseBody, string $exceptionMessageRegex): void + { + $this->mockParentClassForConfigurationDiscovery($responseBody); + + $this->expectException(InvalidConfigurationException::class); + $this->expectExceptionMessageMatches($exceptionMessageRegex); + $this->provider->discoverConfiguration("https://google.com/", []); + } + + public function testConfigurationDiscoveryMissingScopes(): void + { + $this->mockParentClassForConfigurationDiscovery(json_encode([ + 'issuer' => 'some issuer', + 'authorization_endpoint' => 'authz endpoint', + 'token_endpoint' => 'token endpoint', + 'scopes_supported' => [ 'supported' ] + ])); + + $this->expectException(InvalidConfigurationException::class); + $this->expectExceptionMessageMatches('/Scope not supported is not supported .*/'); + $this->provider->discoverConfiguration("https://google.com", ['scopes' => ['supported', 'not supported']]); + } + + public function invalidConfigurationDiscoveryResponsesProvider(): iterable + { + yield 'not JSON' => [ + 'string', + '/Invalid response received from discovery. Expected JSON./' + ]; + yield 'not JSON array' => [ + json_encode('a'), + '/Invalid response received from discovery. Expected JSON./' + ]; + yield 'missing issuer' => [ + json_encode([ + //'issuer' => 'some issuer', + 'authorization_endpoint' => 'authz endpoint', + 'token_endpoint' => 'token endpoint', + 'userinfo_endpoint' => 'userinfo endpoint', + 'jwks_uri' => 'some uri' + ]), + '/Required parameter issuer.*/' + ]; + yield 'missing authorization_endpoint' => [ + json_encode([ + 'issuer' => 'some issuer', + //'authorization_endpoint' => 'authz endpoint', + 'token_endpoint' => 'token endpoint', + 'userinfo_endpoint' => 'userinfo endpoint', + 'jwks_uri' => 'some uri' + ]), + '/Required parameter authorization_endpoint.*/' + ]; + yield 'missing token_endpoint' => [ + json_encode([ + 'issuer' => 'some issuer', + 'authorization_endpoint' => 'authz endpoint', + //'token_endpoint' => 'token endpoint', + 'userinfo_endpoint' => 'userinfo endpoint', + 'jwks_uri' => 'some uri' + ]), + '/Required parameter token_endpoint.*/' + ]; + yield 'missing jwks_uri' => [ + json_encode([ + 'issuer' => 'some issuer', + 'authorization_endpoint' => 'authz endpoint', + 'token_endpoint' => 'token endpoint', + 'userinfo_endpoint' => 'userinfo endpoint', + //'jwks_uri' => 'some uri' + ]), + '/Required parameter jwks_uri.*/' + ]; + } + public function invalidConstructorArgumentsProvider(): iterable { $signer = $this->createMock(Signer::class); @@ -404,6 +483,27 @@ public function invalidConstructorArgumentsProvider(): iterable ]; } + private function mockParentClassForConfigurationDiscovery(string $responseBody): void + { + $request = $this->createMock(Request::class); + $this->requestFactory + ->expects(self::once()) + ->method('getRequestWithOptions') + ->willReturn($request); + + // AbstractProvider::getParsedResponse + $response = $this->createMock(ResponseInterface::class); + $this->httpClient + ->expects(self::once()) + ->method('send') + ->willReturn($response); + + $response + ->expects(self::once()) + ->method('getBody') + ->willReturn($responseBody); + } + /** * @throws JsonException */ From 5bb06a451e7db922db7996361ae998d02ea31ad4 Mon Sep 17 00:00:00 2001 From: Floris Westerman Date: Sun, 14 Aug 2022 21:41:14 +0200 Subject: [PATCH 12/13] Add some documentation --- README.md | 4 +++- example/client.php | 11 ++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b2c210a..5279468 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,9 @@ $provider = new \OpenIDConnectClient\OpenIDConnectProvider([ 'publicKey' => 'file:///myproj/data/public.key', // Alternatively, you can use automatic discovery as long as your server - // has the /.well-known/openid-configuration endpoint + // has the /.well-known/openid-configuration endpoint. + // This endpoint will then provide all provider settings above, so you only need to provide + // your own clientId, clientSecret, and redirectUri. 'issuer' => 'http://example.com/oauth2' ], [ diff --git a/example/client.php b/example/client.php index 7a09737..2743d1d 100644 --- a/example/client.php +++ b/example/client.php @@ -9,15 +9,24 @@ [ 'clientId' => 'demoapp', 'clientSecret' => 'demopass', - 'idTokenIssuer' => 'brentertainment.com', // Your server 'redirectUri' => 'http://localhost:8082/', + + // Settings of the OP (OpenID Provider) + // The issuer of the identity token (id_token) this will be compared with what is returned in the token. + 'idTokenIssuer' => 'brentertainment.com', 'urlAuthorize' => 'http://brentertainment.com/oauth2/lockdin/authorize', 'urlAccessToken' => 'http://brentertainment.com/oauth2/lockdin/token', 'urlResourceOwnerDetails' => 'http://brentertainment.com/oauth2/lockdin/resource', // Find the public key here: https://github.com/bshaffer/oauth2-demo-php/blob/master/data/pubkey.pem // to test against brentertainment.com 'publicKey' => $key, + + // Alternatively, you can use automatic discovery as long as your server + // has the /.well-known/openid-configuration endpoint. + // This endpoint will then provide all provider settings above, so you only need to provide + // your own clientId, clientSecret, and redirectUri. + // 'issuer' => 'http://example.com/oauth2' // This is not supported by the brentertainment.com service ], [ 'signer' => $signer, From 64206f57e07bbf4de927bb0a4cad132bb8e7c2e7 Mon Sep 17 00:00:00 2001 From: Floris Westerman Date: Sun, 14 Aug 2022 21:53:15 +0200 Subject: [PATCH 13/13] Fix code style after GitHub Actions --- composer.json | 6 ++-- composer.lock | 2 +- .../InvalidConfigurationException.php | 2 +- src/OpenIDConnectProvider.php | 36 +++++++++++-------- tests/Unit/OpenIDConnectProviderTest.php | 2 +- 5 files changed, 28 insertions(+), 20 deletions(-) diff --git a/composer.json b/composer.json index 4ec9769..1609870 100644 --- a/composer.json +++ b/composer.json @@ -10,12 +10,13 @@ ], "require": { "php": ">= 7.4", + "codercat/jwk-to-pem": "^1.1", "lcobucci/jwt": "^3.4", "league/oauth2-client": "^2.0", - "codercat/jwk-to-pem": "^1.1", "webmozart/assert": "^1.10" }, "require-dev": { + "ext-json": "*", "dg/bypass-finals": "^1.3", "enlightn/security-checker": "^1.9", "ergebnis/composer-normalize": "^2.15", @@ -24,8 +25,7 @@ "php-parallel-lint/php-parallel-lint": "^1.3", "phpunit/phpunit": "^9.5", "roave/security-advisories": "dev-master", - "squizlabs/php_codesniffer": "^3.6", - "ext-json": "*" + "squizlabs/php_codesniffer": "^3.6" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 15ac984..77e8b03 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "451f39af9978862f7fc8033df80dde6f", + "content-hash": "fc8576a1323c954ead3ef9c6c9673713", "packages": [ { "name": "codercat/jwk-to-pem", diff --git a/src/Exception/InvalidConfigurationException.php b/src/Exception/InvalidConfigurationException.php index 93581cb..089f066 100644 --- a/src/Exception/InvalidConfigurationException.php +++ b/src/Exception/InvalidConfigurationException.php @@ -6,4 +6,4 @@ final class InvalidConfigurationException extends \RuntimeException { -} \ No newline at end of file +} diff --git a/src/OpenIDConnectProvider.php b/src/OpenIDConnectProvider.php index 5a58178..1625cc0 100644 --- a/src/OpenIDConnectProvider.php +++ b/src/OpenIDConnectProvider.php @@ -81,7 +81,7 @@ public function __construct(array $options = [], array $collaborators = []) } // Using discovery - if(isset($options['issuer'])) { + if (isset($options['issuer'])) { $options = $this->discoverConfiguration($options["issuer"], $options); } @@ -283,23 +283,25 @@ public function discoverConfiguration(string $issuer, array $options): array ], ]; - foreach($optionMapping as $optionKey => $responseKey) { - if(!isset($response[$responseKey['name']])) { - if($responseKey['required']) { + foreach ($optionMapping as $optionKey => $responseKey) { + if (!isset($response[$responseKey['name']])) { + if ($responseKey['required']) { throw new InvalidConfigurationException( "Required parameter {$responseKey['name']} missing in discovery configuration at $uri" ); - } else continue; + } else { + continue; + } } $options[$optionKey] = $response[$responseKey['name']]; } // Validate scopes - if(isset($response["scopes_supported"])) { + if (isset($response["scopes_supported"])) { $scopesSupported = $response["scopes_supported"]; - foreach($options['scopes'] as $scope) { - if(!in_array($scope, $scopesSupported)) { + foreach ($options['scopes'] as $scope) { + if (!in_array($scope, $scopesSupported)) { throw new InvalidConfigurationException( "Scope $scope is not supported in discovery configuration at $uri" ); @@ -308,7 +310,7 @@ public function discoverConfiguration(string $issuer, array $options): array } // Set public key - if(!isset($response["jwks_uri"])) { + if (!isset($response["jwks_uri"])) { throw new InvalidConfigurationException( "Required parameter jwks_uri missing in discovery configuration at $uri" ); @@ -324,15 +326,21 @@ public function discoverConfiguration(string $issuer, array $options): array } // We will only need signature keys supported by our signer - $jwks = array_filter($jwksResponse['keys'], function($jwk) { - if(!is_array($jwk)) return false; - if(isset($jwk['use']) && $jwk['use'] !== 'sig') return false; - if($jwk['alg'] !== $this->signer->getAlgorithmId()) return false; + $jwks = array_filter($jwksResponse['keys'], function ($jwk) { + if (!is_array($jwk)) { + return false; + } + if (isset($jwk['use']) && $jwk['use'] !== 'sig') { + return false; + } + if ($jwk['alg'] !== $this->signer->getAlgorithmId()) { + return false; + } return true; }); - if(count($jwks) === 0) { + if (count($jwks) === 0) { throw new InvalidConfigurationException( "No valid signing keys found in discovery at $uri" ); diff --git a/tests/Unit/OpenIDConnectProviderTest.php b/tests/Unit/OpenIDConnectProviderTest.php index 9ba444f..56a3a03 100644 --- a/tests/Unit/OpenIDConnectProviderTest.php +++ b/tests/Unit/OpenIDConnectProviderTest.php @@ -312,7 +312,7 @@ public function testDefaultValidatorChain(): void /** * @dataProvider invalidConfigurationDiscoveryResponsesProvider */ - public function testConfigurationDiscoveryInvalidResponses(string $responseBody, string $exceptionMessageRegex): void + public function testConfigurationDiscoveryInvalidResponse(string $responseBody, string $exceptionMessageRegex): void { $this->mockParentClassForConfigurationDiscovery($responseBody);