From ddb63bba8f1c82cd643ea5058346cf78a1b41495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Tue, 31 Mar 2020 11:12:55 +0200 Subject: [PATCH 01/19] Updated dependencies - Packages updated with php 7.2.29 - Security updates - Downgrade some symfony packages from 5.0.* to 4.4.* --- composer.lock | 1610 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 1165 insertions(+), 445 deletions(-) diff --git a/composer.lock b/composer.lock index f6d7672..351dcb4 100644 --- a/composer.lock +++ b/composer.lock @@ -138,21 +138,21 @@ }, { "name": "monolog/monolog", - "version": "2.0.2", + "version": "1.25.3", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "c861fcba2ca29404dc9e617eedd9eff4616986b8" + "reference": "fa82921994db851a8becaf3787a9e73c5976b6f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c861fcba2ca29404dc9e617eedd9eff4616986b8", - "reference": "c861fcba2ca29404dc9e617eedd9eff4616986b8", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fa82921994db851a8becaf3787a9e73c5976b6f1", + "reference": "fa82921994db851a8becaf3787a9e73c5976b6f1", "shasum": "" }, "require": { - "php": "^7.2", - "psr/log": "^1.0.1" + "php": ">=5.3.0", + "psr/log": "~1.0" }, "provide": { "psr/log-implementation": "1.0.0" @@ -160,36 +160,33 @@ "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^6.0", - "graylog2/gelf-php": "^1.4.2", - "jakub-onderka/php-parallel-lint": "^0.9", + "graylog2/gelf-php": "~1.0", + "jakub-onderka/php-parallel-lint": "0.9", "php-amqplib/php-amqplib": "~2.4", "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.6.1", - "phpunit/phpunit": "^8.3", - "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", "swiftmailer/swiftmailer": "^5.3|^6.0" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-mongo": "Allow sending log messages to a MongoDB server", "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", "php-console/php-console": "Allow sending log messages to Google Chrome", "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -215,7 +212,7 @@ "logging", "psr-3" ], - "time": "2019-12-20T14:22:59+00:00" + "time": "2019-12-20T14:15:16+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -271,41 +268,38 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.3.4", + "version": "5.1.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c" + "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c", - "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", + "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", "shasum": "" }, "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", - "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", - "webmozart/assert": "^1.0" + "ext-filter": "^7.1", + "php": "^7.2", + "phpdocumentor/reflection-common": "^2.0", + "phpdocumentor/type-resolver": "^1.0", + "webmozart/assert": "^1" }, "require-dev": { - "doctrine/instantiator": "^1.0.5", - "mockery/mockery": "^1.0", - "phpdocumentor/type-resolver": "0.4.*", - "phpunit/phpunit": "^6.4" + "doctrine/instantiator": "^1", + "mockery/mockery": "^1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-master": "5.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -316,33 +310,36 @@ { "name": "Mike van Riel", "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2019-12-28T18:55:12+00:00" + "time": "2020-02-22T12:28:44+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.0.1", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9" + "reference": "7462d5f123dfc080dfdf26897032a6513644fc95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", - "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95", + "reference": "7462d5f123dfc080dfdf26897032a6513644fc95", "shasum": "" }, "require": { - "php": "^7.1", + "php": "^7.2", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "^7.1", - "mockery/mockery": "~1", - "phpunit/phpunit": "^7.0" + "ext-tokenizer": "^7.2", + "mockery/mockery": "~1" }, "type": "library", "extra": { @@ -366,7 +363,7 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2019-08-22T18:11:29+00:00" + "time": "2020-02-18T18:59:58+00:00" }, { "name": "psr/cache", @@ -465,16 +462,16 @@ }, { "name": "psr/log", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "" }, "require": { @@ -508,7 +505,7 @@ "psr", "psr-3" ], - "time": "2019-11-01T11:05:21+00:00" + "time": "2020-03-23T09:12:05+00:00" }, { "name": "robrichards/xmlseclibs", @@ -685,16 +682,16 @@ }, { "name": "surfnet/stepup-saml-bundle", - "version": "4.1.10", + "version": "4.1.11", "source": { "type": "git", "url": "https://github.com/OpenConext/Stepup-saml-bundle.git", - "reference": "756310e6628b6dc9cfe66c81e37494fb470bc3bf" + "reference": "2fa2d44e5a005c2044b7898d9624648a4850b129" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/OpenConext/Stepup-saml-bundle/zipball/756310e6628b6dc9cfe66c81e37494fb470bc3bf", - "reference": "756310e6628b6dc9cfe66c81e37494fb470bc3bf", + "url": "https://api.github.com/repos/OpenConext/Stepup-saml-bundle/zipball/2fa2d44e5a005c2044b7898d9624648a4850b129", + "reference": "2fa2d44e5a005c2044b7898d9624648a4850b129", "shasum": "" }, "require": { @@ -735,20 +732,20 @@ "stepup", "surfnet" ], - "time": "2020-02-20T12:24:28+00:00" + "time": "2020-03-17T13:59:34+00:00" }, { "name": "symfony/asset", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "2c67c89d064bfb689ea6bc41217c87100bb94c17" + "reference": "e3574559efcb51601022fa46fd88dd13a8febdc2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/2c67c89d064bfb689ea6bc41217c87100bb94c17", - "reference": "2c67c89d064bfb689ea6bc41217c87100bb94c17", + "url": "https://api.github.com/repos/symfony/asset/zipball/e3574559efcb51601022fa46fd88dd13a8febdc2", + "reference": "e3574559efcb51601022fa46fd88dd13a8febdc2", "shasum": "" }, "require": { @@ -791,33 +788,47 @@ ], "description": "Symfony Asset Component", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/cache", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "4572116c640a6bc9fc0047180fe7f9362e5923fc" + "reference": "f777b570291aebe51081b9827e05f3a747665e87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/4572116c640a6bc9fc0047180fe7f9362e5923fc", - "reference": "4572116c640a6bc9fc0047180fe7f9362e5923fc", + "url": "https://api.github.com/repos/symfony/cache/zipball/f777b570291aebe51081b9827e05f3a747665e87", + "reference": "f777b570291aebe51081b9827e05f3a747665e87", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": "^7.1.3", "psr/cache": "~1.0", "psr/log": "~1.0", "symfony/cache-contracts": "^1.1.7|^2", "symfony/service-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" + "symfony/var-exporter": "^4.2|^5.0" }, "conflict": { "doctrine/dbal": "<2.5", - "symfony/dependency-injection": "<4.4", + "symfony/dependency-injection": "<3.4", "symfony/http-kernel": "<4.4", "symfony/var-dumper": "<4.4" }, @@ -832,14 +843,14 @@ "doctrine/dbal": "~2.5", "predis/predis": "~1.1", "psr/simple-cache": "^1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.1|^5.0", "symfony/var-dumper": "^4.4|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -870,7 +881,21 @@ "caching", "psr6" ], - "time": "2020-01-31T09:13:47+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/cache-contracts", @@ -932,16 +957,16 @@ }, { "name": "symfony/config", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "4d3979f54472637169080f802dc82197e21fdcce" + "reference": "3f4a3de1af498ed0ea653d4dc2317794144e6ca4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/4d3979f54472637169080f802dc82197e21fdcce", - "reference": "4d3979f54472637169080f802dc82197e21fdcce", + "url": "https://api.github.com/repos/symfony/config/zipball/3f4a3de1af498ed0ea653d4dc2317794144e6ca4", + "reference": "3f4a3de1af498ed0ea653d4dc2317794144e6ca4", "shasum": "" }, "require": { @@ -992,20 +1017,34 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/console", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "f512001679f37e6a042b51897ed24a2f05eba656" + "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f512001679f37e6a042b51897ed24a2f05eba656", - "reference": "f512001679f37e6a042b51897ed24a2f05eba656", + "url": "https://api.github.com/repos/symfony/console/zipball/10bb3ee3c97308869d53b3e3d03f6ac23ff985f7", + "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7", "shasum": "" }, "require": { @@ -1068,20 +1107,34 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2020-01-25T12:44:29+00:00" + "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": "2020-03-30T11:41:10+00:00" }, { "name": "symfony/debug", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "20236471058bbaa9907382500fc14005c84601f0" + "reference": "346636d2cae417992ecfd761979b2ab98b339a45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/20236471058bbaa9907382500fc14005c84601f0", - "reference": "20236471058bbaa9907382500fc14005c84601f0", + "url": "https://api.github.com/repos/symfony/debug/zipball/346636d2cae417992ecfd761979b2ab98b339a45", + "reference": "346636d2cae417992ecfd761979b2ab98b339a45", "shasum": "" }, "require": { @@ -1124,20 +1177,34 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2020-01-25T12:44:29+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/dependency-injection", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "ec60a7d12f5e8ab0f99456adce724717d9c1784a" + "reference": "755b18859be26b90f4bf63753432d3387458bf31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/ec60a7d12f5e8ab0f99456adce724717d9c1784a", - "reference": "ec60a7d12f5e8ab0f99456adce724717d9c1784a", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/755b18859be26b90f4bf63753432d3387458bf31", + "reference": "755b18859be26b90f4bf63753432d3387458bf31", "shasum": "" }, "require": { @@ -1197,20 +1264,34 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2020-01-31T09:49:27+00:00" + "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": "2020-03-30T10:09:30+00:00" }, { "name": "symfony/dotenv", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "b74a1638f53e3c65e4bbfc2a03c23fdc400fd243" + "reference": "a78e698cfb8aca8ef6814639eb5ffc17180a4326" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/b74a1638f53e3c65e4bbfc2a03c23fdc400fd243", - "reference": "b74a1638f53e3c65e4bbfc2a03c23fdc400fd243", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/a78e698cfb8aca8ef6814639eb5ffc17180a4326", + "reference": "a78e698cfb8aca8ef6814639eb5ffc17180a4326", "shasum": "" }, "require": { @@ -1254,26 +1335,40 @@ "env", "environment" ], - "time": "2020-01-08T17:29:02+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/error-handler", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "d2721499ffcaf246a743e01cdf6696d3d5dd74c1" + "reference": "7e9828fc98aa1cf27b422fe478a84f5b0abb7358" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/d2721499ffcaf246a743e01cdf6696d3d5dd74c1", - "reference": "d2721499ffcaf246a743e01cdf6696d3d5dd74c1", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/7e9828fc98aa1cf27b422fe478a84f5b0abb7358", + "reference": "7e9828fc98aa1cf27b422fe478a84f5b0abb7358", "shasum": "" }, "require": { "php": "^7.1.3", "psr/log": "~1.0", - "symfony/debug": "^4.4", + "symfony/debug": "^4.4.5", "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { @@ -1310,20 +1405,34 @@ ], "description": "Symfony ErrorHandler Component", "homepage": "https://symfony.com", - "time": "2020-01-27T09:48:47+00:00" + "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": "2020-03-30T14:07:33+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9e3de195e5bc301704dd6915df55892f6dfc208b" + "reference": "abc8e3618bfdb55e44c8c6a00abd333f831bbfed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9e3de195e5bc301704dd6915df55892f6dfc208b", - "reference": "9e3de195e5bc301704dd6915df55892f6dfc208b", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abc8e3618bfdb55e44c8c6a00abd333f831bbfed", + "reference": "abc8e3618bfdb55e44c8c6a00abd333f831bbfed", "shasum": "" }, "require": { @@ -1380,7 +1489,21 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2020-01-10T21:54:01+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -1442,26 +1565,26 @@ }, { "name": "symfony/filesystem", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "3afadc0f57cd74f86379d073e694b0f2cda2a88c" + "reference": "fe297193bf2e6866ed900ed2d5869362768df6a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3afadc0f57cd74f86379d073e694b0f2cda2a88c", - "reference": "3afadc0f57cd74f86379d073e694b0f2cda2a88c", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/fe297193bf2e6866ed900ed2d5869362768df6a7", + "reference": "fe297193bf2e6866ed900ed2d5869362768df6a7", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -1488,29 +1611,43 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2020-01-21T08:40:24+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/finder", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb" + "reference": "5729f943f9854c5781984ed4907bbb817735776b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", - "reference": "4176e7cb846fe08f32518b7e0ed8462e2db8d9bb", + "url": "https://api.github.com/repos/symfony/finder/zipball/5729f943f9854c5781984ed4907bbb817735776b", + "reference": "5729f943f9854c5781984ed4907bbb817735776b", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -1537,7 +1674,21 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/flex", @@ -1590,16 +1741,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "afc96daad6049cbed34312b34005d33fc670d022" + "reference": "80cdda836cfbe3ccb2bdd4a974f632473f0807a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/afc96daad6049cbed34312b34005d33fc670d022", - "reference": "afc96daad6049cbed34312b34005d33fc670d022", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/80cdda836cfbe3ccb2bdd4a974f632473f0807a6", + "reference": "80cdda836cfbe3ccb2bdd4a974f632473f0807a6", "shasum": "" }, "require": { @@ -1717,20 +1868,34 @@ ], "description": "Symfony FrameworkBundle", "homepage": "https://symfony.com", - "time": "2020-01-30T16:24:07+00:00" + "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": "2020-03-30T11:41:10+00:00" }, { "name": "symfony/http-client", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "250c5363e4d67f8e3c9cdf3362f134e040e69612" + "reference": "9a8f5c968dc68d58044f8e9ff39d03074489b55d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/250c5363e4d67f8e3c9cdf3362f134e040e69612", - "reference": "250c5363e4d67f8e3c9cdf3362f134e040e69612", + "url": "https://api.github.com/repos/symfony/http-client/zipball/9a8f5c968dc68d58044f8e9ff39d03074489b55d", + "reference": "9a8f5c968dc68d58044f8e9ff39d03074489b55d", "shasum": "" }, "require": { @@ -1785,7 +1950,21 @@ ], "description": "Symfony HttpClient component", "homepage": "https://symfony.com", - "time": "2020-01-31T09:11:17+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/http-client-contracts", @@ -1846,31 +2025,31 @@ }, { "name": "symfony/http-foundation", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "2832d8cffc3a91df550ac42bcdce602f8c08be3e" + "reference": "62f92509c9abfd1f73e17b8cf1b72c0bdac6611b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2832d8cffc3a91df550ac42bcdce602f8c08be3e", - "reference": "2832d8cffc3a91df550ac42bcdce602f8c08be3e", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/62f92509c9abfd1f73e17b8cf1b72c0bdac6611b", + "reference": "62f92509c9abfd1f73e17b8cf1b72c0bdac6611b", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/mime": "^4.4|^5.0", + "php": "^7.1.3", + "symfony/mime": "^4.3|^5.0", "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { "predis/predis": "~1.0", - "symfony/expression-language": "^4.4|^5.0" + "symfony/expression-language": "^3.4|^4.0|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -1897,20 +2076,34 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2020-01-31T09:13:47+00:00" + "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": "2020-03-30T14:07:33+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "62116a9c8fb15faabb158ad9cb785c353c2572e5" + "reference": "f356a489e51856b99908005eb7f2c51a1dfc95dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/62116a9c8fb15faabb158ad9cb785c353c2572e5", - "reference": "62116a9c8fb15faabb158ad9cb785c353c2572e5", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f356a489e51856b99908005eb7f2c51a1dfc95dc", + "reference": "f356a489e51856b99908005eb7f2c51a1dfc95dc", "shasum": "" }, "require": { @@ -1987,30 +2180,44 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2020-01-31T12:45:06+00:00" + "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": "2020-03-30T14:59:15+00:00" }, { "name": "symfony/inflector", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/inflector.git", - "reference": "e375603b6bd12e8e3aec3fc1b640ac18a4ef4cb2" + "reference": "53cfa47fe9142f39b5605df67bada3893dd4f46c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/inflector/zipball/e375603b6bd12e8e3aec3fc1b640ac18a4ef4cb2", - "reference": "e375603b6bd12e8e3aec3fc1b640ac18a4ef4cb2", + "url": "https://api.github.com/repos/symfony/inflector/zipball/53cfa47fe9142f39b5605df67bada3893dd4f46c", + "reference": "53cfa47fe9142f39b5605df67bada3893dd4f46c", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -2045,20 +2252,34 @@ "symfony", "words" ], - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/intl", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "ab482c70a9748abed5139a967b8182db15e4ffac" + "reference": "63238a53b1cf0cd3e2b0b22cabc7c0b6f3fd4562" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/ab482c70a9748abed5139a967b8182db15e4ffac", - "reference": "ab482c70a9748abed5139a967b8182db15e4ffac", + "url": "https://api.github.com/repos/symfony/intl/zipball/63238a53b1cf0cd3e2b0b22cabc7c0b6f3fd4562", + "reference": "63238a53b1cf0cd3e2b0b22cabc7c0b6f3fd4562", "shasum": "" }, "require": { @@ -2120,24 +2341,38 @@ "l10n", "localization" ], - "time": "2020-01-30T15:14:06+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/mime", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59" + "reference": "6dde9dc70155e91b850b1d009d1f841c54bc4aba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/2a3c7fee1f1a0961fa9cf360d5da553d05095e59", - "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59", + "url": "https://api.github.com/repos/symfony/mime/zipball/6dde9dc70155e91b850b1d009d1f841c54bc4aba", + "reference": "6dde9dc70155e91b850b1d009d1f841c54bc4aba", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": "^7.1.3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -2146,12 +2381,12 @@ }, "require-dev": { "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "^4.4|^5.0" + "symfony/dependency-injection": "^3.4|^4.1|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -2182,37 +2417,51 @@ "mime", "mime-type" ], - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "3e081905b32e24742c16f7bb2cf0cd182598a32d" + "reference": "2df4a774d99ae6e87c8b67891430f935312be412" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/3e081905b32e24742c16f7bb2cf0cd182598a32d", - "reference": "3e081905b32e24742c16f7bb2cf0cd182598a32d", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/2df4a774d99ae6e87c8b67891430f935312be412", + "reference": "2df4a774d99ae6e87c8b67891430f935312be412", "shasum": "" }, "require": { - "monolog/monolog": "^1.25.1|^2", - "php": "^7.2.5", - "symfony/http-kernel": "^4.4|^5.0", + "monolog/monolog": "^1.25.1", + "php": "^7.1.3", + "symfony/http-kernel": "^4.3", "symfony/service-contracts": "^1.1|^2" }, "conflict": { - "symfony/console": "<4.4", - "symfony/http-foundation": "<4.4" + "symfony/console": "<3.4", + "symfony/http-foundation": "<3.4" }, "require-dev": { - "symfony/console": "^4.4|^5.0", + "symfony/console": "^3.4|^4.0|^5.0", "symfony/http-client": "^4.4|^5.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" + "symfony/security-core": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^3.4|^4.0|^5.0" }, "suggest": { "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", @@ -2222,7 +2471,7 @@ "type": "symfony-bridge", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -2249,7 +2498,21 @@ ], "description": "Symfony Monolog Bridge", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/monolog-bundle", @@ -2316,16 +2579,16 @@ }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "727b3bb5bfa7ca9eeb86416784cf1c08a6289b86" + "reference": "9c281272735eb66476e0fa7381e03fb0d4b60197" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/727b3bb5bfa7ca9eeb86416784cf1c08a6289b86", - "reference": "727b3bb5bfa7ca9eeb86416784cf1c08a6289b86", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/9c281272735eb66476e0fa7381e03fb0d4b60197", + "reference": "9c281272735eb66476e0fa7381e03fb0d4b60197", "shasum": "" }, "require": { @@ -2338,7 +2601,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -2370,20 +2633,34 @@ "portable", "shim" ], - "time": "2020-01-13T11:15:53+00:00" + "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": "2020-02-27T09:26:54+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "6842f1a39cf7d580655688069a03dd7cd83d244a" + "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6842f1a39cf7d580655688069a03dd7cd83d244a", - "reference": "6842f1a39cf7d580655688069a03dd7cd83d244a", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", + "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", "shasum": "" }, "require": { @@ -2397,7 +2674,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -2432,20 +2709,34 @@ "portable", "shim" ], - "time": "2020-01-17T12:01:36+00:00" + "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": "2020-03-09T19:04:49+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2" + "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/34094cfa9abe1f0f14f48f490772db7a775559f2", - "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac", + "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac", "shasum": "" }, "require": { @@ -2457,7 +2748,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -2491,20 +2782,34 @@ "portable", "shim" ], - "time": "2020-01-13T11:15:53+00:00" + "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": "2020-03-09T19:04:49+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "5e66a0fa1070bf46bec4bea7962d285108edd675" + "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/5e66a0fa1070bf46bec4bea7962d285108edd675", - "reference": "5e66a0fa1070bf46bec4bea7962d285108edd675", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7", + "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7", "shasum": "" }, "require": { @@ -2513,7 +2818,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14-dev" + "dev-master": "1.15-dev" } }, "autoload": { @@ -2549,28 +2854,42 @@ "portable", "shim" ], - "time": "2020-01-13T11:15:53+00:00" + "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": "2020-02-27T09:26:54+00:00" }, { "name": "symfony/property-access", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "18617a8c26b97a262f816c78765eb3cd91630e19" + "reference": "75cbf0f388d82685ce06515951397bc1370901d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/18617a8c26b97a262f816c78765eb3cd91630e19", - "reference": "18617a8c26b97a262f816c78765eb3cd91630e19", + "url": "https://api.github.com/repos/symfony/property-access/zipball/75cbf0f388d82685ce06515951397bc1370901d7", + "reference": "75cbf0f388d82685ce06515951397bc1370901d7", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/inflector": "^4.4|^5.0" + "php": "^7.1.3", + "symfony/inflector": "^3.4|^4.0|^5.0" }, "require-dev": { - "symfony/cache": "^4.4|^5.0" + "symfony/cache": "^3.4|^4.0|^5.0" }, "suggest": { "psr/cache-implementation": "To cache access methods." @@ -2578,7 +2897,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -2616,37 +2935,51 @@ "property path", "reflection" ], - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/property-info", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "8c2e9d22806acd5522691074e215bb0b04926877" + "reference": "b6baecd501adec01a9d68f9c90b83659656065af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/8c2e9d22806acd5522691074e215bb0b04926877", - "reference": "8c2e9d22806acd5522691074e215bb0b04926877", + "url": "https://api.github.com/repos/symfony/property-info/zipball/b6baecd501adec01a9d68f9c90b83659656065af", + "reference": "b6baecd501adec01a9d68f9c90b83659656065af", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/inflector": "^4.4|^5.0" + "php": "^7.1.3", + "symfony/inflector": "^3.4|^4.0|^5.0" }, "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/reflection-docblock": "<3.0||>=3.2.0,<3.2.2", "phpdocumentor/type-resolver": "<0.3.0", - "symfony/dependency-injection": "<4.4" + "symfony/dependency-injection": "<3.4" }, "require-dev": { "doctrine/annotations": "~1.7", "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/cache": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" + "symfony/cache": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/serializer": "^3.4|^4.0|^5.0" }, "suggest": { "phpdocumentor/reflection-docblock": "To use the PHPDoc", @@ -2657,7 +2990,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -2692,20 +3025,34 @@ "type", "validator" ], - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/routing", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "7bf4e38573728e317b926ca4482ad30470d0e86a" + "reference": "0f562fa613e288d7dbae6c63abbc9b33ed75a8f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/7bf4e38573728e317b926ca4482ad30470d0e86a", - "reference": "7bf4e38573728e317b926ca4482ad30470d0e86a", + "url": "https://api.github.com/repos/symfony/routing/zipball/0f562fa613e288d7dbae6c63abbc9b33ed75a8f8", + "reference": "0f562fa613e288d7dbae6c63abbc9b33ed75a8f8", "shasum": "" }, "require": { @@ -2768,20 +3115,34 @@ "uri", "url" ], - "time": "2020-01-08T17:29:02+00:00" + "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": "2020-03-30T11:41:10+00:00" }, { "name": "symfony/security-bundle", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "7829cc34b8231cb8d10621cdf27d04bfdc600334" + "reference": "1c317cd29a75e4806479241ffd31d8035e243420" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/7829cc34b8231cb8d10621cdf27d04bfdc600334", - "reference": "7829cc34b8231cb8d10621cdf27d04bfdc600334", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/1c317cd29a75e4806479241ffd31d8035e243420", + "reference": "1c317cd29a75e4806479241ffd31d8035e243420", "shasum": "" }, "require": { @@ -2793,7 +3154,7 @@ "symfony/security-core": "^4.4", "symfony/security-csrf": "^4.2|^5.0", "symfony/security-guard": "^4.2|^5.0", - "symfony/security-http": "^4.4.3" + "symfony/security-http": "^4.4.5" }, "conflict": { "symfony/browser-kit": "<4.2", @@ -2851,20 +3212,34 @@ ], "description": "Symfony SecurityBundle", "homepage": "https://symfony.com", - "time": "2020-01-27T10:02:23+00:00" + "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": "2020-03-30T11:41:10+00:00" }, { "name": "symfony/security-core", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "d2550b4ecd63f612763e0af2cbcb1a69a700fe99" + "reference": "e99ad8bcd5d1202a1cff7b3e0e76d9077d81cbe6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/d2550b4ecd63f612763e0af2cbcb1a69a700fe99", - "reference": "d2550b4ecd63f612763e0af2cbcb1a69a700fe99", + "url": "https://api.github.com/repos/symfony/security-core/zipball/e99ad8bcd5d1202a1cff7b3e0e76d9077d81cbe6", + "reference": "e99ad8bcd5d1202a1cff7b3e0e76d9077d81cbe6", "shasum": "" }, "require": { @@ -2924,31 +3299,45 @@ ], "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", - "time": "2020-01-31T09:11:17+00:00" - }, - { + "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": "2020-03-30T11:51:53+00:00" + }, + { "name": "symfony/security-csrf", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "65066f7e0f6e38a8c5507c706e86e7a52fd7ff3e" + "reference": "286a71ff176e1b0dd071f0e73dcec0970a56634b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/65066f7e0f6e38a8c5507c706e86e7a52fd7ff3e", - "reference": "65066f7e0f6e38a8c5507c706e86e7a52fd7ff3e", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/286a71ff176e1b0dd071f0e73dcec0970a56634b", + "reference": "286a71ff176e1b0dd071f0e73dcec0970a56634b", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/security-core": "^4.4|^5.0" + "php": "^7.1.3", + "symfony/security-core": "^3.4|^4.0|^5.0" }, "conflict": { - "symfony/http-foundation": "<4.4" + "symfony/http-foundation": "<3.4" }, "require-dev": { - "symfony/http-foundation": "^4.4|^5.0" + "symfony/http-foundation": "^3.4|^4.0|^5.0" }, "suggest": { "symfony/http-foundation": "For using the class SessionTokenStorage." @@ -2956,7 +3345,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -2983,20 +3372,34 @@ ], "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/security-guard", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/security-guard.git", - "reference": "f457f2d6d7392259b1ede1d036a26b6c1fa20202" + "reference": "606a741712d8adb49aee9b59d57010724db06797" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-guard/zipball/f457f2d6d7392259b1ede1d036a26b6c1fa20202", - "reference": "f457f2d6d7392259b1ede1d036a26b6c1fa20202", + "url": "https://api.github.com/repos/symfony/security-guard/zipball/606a741712d8adb49aee9b59d57010724db06797", + "reference": "606a741712d8adb49aee9b59d57010724db06797", "shasum": "" }, "require": { @@ -3037,28 +3440,42 @@ ], "description": "Symfony Security Component - Guard", "homepage": "https://symfony.com", - "time": "2020-01-08T17:29:02+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/security-http", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "736d09554f78f3444f5aeed3d18a928c7a8a53fb" + "reference": "b413064160255c31077bb082d25b7bd89275971b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/736d09554f78f3444f5aeed3d18a928c7a8a53fb", - "reference": "736d09554f78f3444f5aeed3d18a928c7a8a53fb", + "url": "https://api.github.com/repos/symfony/security-http/zipball/b413064160255c31077bb082d25b7bd89275971b", + "reference": "b413064160255c31077bb082d25b7bd89275971b", "shasum": "" }, "require": { "php": "^7.1.3", - "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4.40|^4.4.7|^5.0.7", "symfony/http-kernel": "^4.4", "symfony/property-access": "^3.4|^4.0|^5.0", - "symfony/security-core": "^4.4" + "symfony/security-core": "^4.4.7" }, "conflict": { "symfony/event-dispatcher": ">=5", @@ -3103,54 +3520,68 @@ ], "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", - "time": "2020-01-31T09:11:17+00:00" + "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": "2020-03-30T11:51:53+00:00" }, { "name": "symfony/serializer", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "a76fc03e125719ef4ce18522b2347bf103b698d0" + "reference": "2a508a535f2323defb325cf28301064fcbb061b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/a76fc03e125719ef4ce18522b2347bf103b698d0", - "reference": "a76fc03e125719ef4ce18522b2347bf103b698d0", + "url": "https://api.github.com/repos/symfony/serializer/zipball/2a508a535f2323defb325cf28301064fcbb061b9", + "reference": "2a508a535f2323defb325cf28301064fcbb061b9", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { "phpdocumentor/type-resolver": "<0.2.1", - "symfony/dependency-injection": "<4.4", - "symfony/property-access": "<4.4", - "symfony/property-info": "<4.4", - "symfony/yaml": "<4.4" + "symfony/dependency-injection": "<3.4", + "symfony/property-access": "<3.4", + "symfony/property-info": "<3.4", + "symfony/yaml": "<3.4" }, "require-dev": { "doctrine/annotations": "~1.0", "doctrine/cache": "~1.0", "phpdocumentor/reflection-docblock": "^3.2|^4.0", - "symfony/cache": "^4.4|^5.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", + "symfony/cache": "^3.4|^4.0|^5.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", "symfony/error-handler": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", "symfony/mime": "^4.4|^5.0", - "symfony/property-access": "^4.4|^5.0", - "symfony/property-info": "^4.4|^5.0", - "symfony/validator": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" + "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4.13|~4.0|^5.0", + "symfony/validator": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" }, "suggest": { "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", "doctrine/cache": "For using the default cached annotation reader and metadata cache.", "psr/cache-implementation": "For using the metadata cache.", "symfony/config": "For using the XML mapping loader.", - "symfony/mime": "For using a MIME type guesser within the DataUriNormalizer.", + "symfony/http-foundation": "For using a MIME type guesser within the DataUriNormalizer.", "symfony/property-access": "For using the ObjectNormalizer.", "symfony/property-info": "To deserialize relations.", "symfony/yaml": "For using the default YAML mapping loader." @@ -3158,7 +3589,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -3185,26 +3616,40 @@ ], "description": "Symfony Serializer Component", "homepage": "https://symfony.com", - "time": "2020-01-08T17:33:29+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/serializer-pack", - "version": "v1.0.2", + "version": "v1.0.3", "source": { "type": "git", "url": "https://github.com/symfony/serializer-pack.git", - "reference": "c5f18ba4ff989a42d7d140b7f85406e77cd8c4b2" + "reference": "9bbce72dcad0cca797b678d3bfb764cf923ab28a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer-pack/zipball/c5f18ba4ff989a42d7d140b7f85406e77cd8c4b2", - "reference": "c5f18ba4ff989a42d7d140b7f85406e77cd8c4b2", + "url": "https://api.github.com/repos/symfony/serializer-pack/zipball/9bbce72dcad0cca797b678d3bfb764cf923ab28a", + "reference": "9bbce72dcad0cca797b678d3bfb764cf923ab28a", "shasum": "" }, "require": { "doctrine/annotations": "^1.0", "php": "^7.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0", + "phpdocumentor/reflection-docblock": "*", "symfony/property-access": "*", "symfony/property-info": "*", "symfony/serializer": "*" @@ -3215,7 +3660,21 @@ "MIT" ], "description": "A pack for the Symfony serializer", - "time": "2018-12-10T12:14:14+00:00" + "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": "2020-03-28T16:26:24+00:00" }, { "name": "symfony/service-contracts", @@ -3277,16 +3736,16 @@ }, { "name": "symfony/templating", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/templating.git", - "reference": "9995a4f65149d5ab7f0d9cca6d88136ae8bfaa72" + "reference": "d65ba8cd13339b692f709ea36625851de218c4dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/templating/zipball/9995a4f65149d5ab7f0d9cca6d88136ae8bfaa72", - "reference": "9995a4f65149d5ab7f0d9cca6d88136ae8bfaa72", + "url": "https://api.github.com/repos/symfony/templating/zipball/d65ba8cd13339b692f709ea36625851de218c4dc", + "reference": "d65ba8cd13339b692f709ea36625851de218c4dc", "shasum": "" }, "require": { @@ -3329,20 +3788,34 @@ ], "description": "Symfony Templating Component", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/translation", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "f5d2ac46930238b30a9c2f1b17c905f3697d808c" + "reference": "4e54d336f2eca5facad449d0b0118bb449375b76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/f5d2ac46930238b30a9c2f1b17c905f3697d808c", - "reference": "f5d2ac46930238b30a9c2f1b17c905f3697d808c", + "url": "https://api.github.com/repos/symfony/translation/zipball/4e54d336f2eca5facad449d0b0118bb449375b76", + "reference": "4e54d336f2eca5facad449d0b0118bb449375b76", "shasum": "" }, "require": { @@ -3405,7 +3878,21 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2020-01-15T13:29:06+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/translation-contracts", @@ -3466,16 +3953,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "d5f3e83e2cc2fcdd60c351b5be1beb9533cf698c" + "reference": "bef4da6724c5a89bb3408d3bc785be7cd5b9efed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d5f3e83e2cc2fcdd60c351b5be1beb9533cf698c", - "reference": "d5f3e83e2cc2fcdd60c351b5be1beb9533cf698c", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/bef4da6724c5a89bb3408d3bc785be7cd5b9efed", + "reference": "bef4da6724c5a89bb3408d3bc785be7cd5b9efed", "shasum": "" }, "require": { @@ -3565,20 +4052,34 @@ ], "description": "Symfony Twig Bridge", "homepage": "https://symfony.com", - "time": "2020-01-08T17:29:02+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/twig-bundle", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "d3e3e46e9e683e946746219570299ba07506260a" + "reference": "44e3e82867bf4dcf52732dd7e0c83826f9da1095" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/d3e3e46e9e683e946746219570299ba07506260a", - "reference": "d3e3e46e9e683e946746219570299ba07506260a", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/44e3e82867bf4dcf52732dd7e0c83826f9da1095", + "reference": "44e3e82867bf4dcf52732dd7e0c83826f9da1095", "shasum": "" }, "require": { @@ -3640,7 +4141,21 @@ ], "description": "Symfony TwigBundle", "homepage": "https://symfony.com", - "time": "2020-01-04T13:00:46+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/twig-pack", @@ -3672,31 +4187,32 @@ }, { "name": "symfony/var-dumper", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "923591cfb78a935f0c98968fedfad05bfda9d01f" + "reference": "5a0c2d93006131a36cf6f767d10e2ca8333b0d4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/923591cfb78a935f0c98968fedfad05bfda9d01f", - "reference": "923591cfb78a935f0c98968fedfad05bfda9d01f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/5a0c2d93006131a36cf6f767d10e2ca8333b0d4a", + "reference": "5a0c2d93006131a36cf6f767d10e2ca8333b0d4a", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/polyfill-mbstring": "~1.0" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" }, "conflict": { - "phpunit/phpunit": "<5.4.3", - "symfony/console": "<4.4" + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^4.4|^5.0", + "symfony/console": "^3.4|^4.0|^5.0", "symfony/process": "^4.4|^5.0", - "twig/twig": "^2.4|^3.0" + "twig/twig": "^1.34|^2.4|^3.0" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", @@ -3709,7 +4225,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -3743,32 +4259,46 @@ "debug", "dump" ], - "time": "2020-01-25T15:56:29+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "960f9ac0fdbd642461ed29d7717aeb2a94d428b9" + "reference": "6e4939b084defee0ab60a21e6a02e3a198afd91f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/960f9ac0fdbd642461ed29d7717aeb2a94d428b9", - "reference": "960f9ac0fdbd642461ed29d7717aeb2a94d428b9", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/6e4939b084defee0ab60a21e6a02e3a198afd91f", + "reference": "6e4939b084defee0ab60a21e6a02e3a198afd91f", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": "^7.1.3" }, "require-dev": { - "symfony/var-dumper": "^4.4|^5.0" + "symfony/var-dumper": "^4.1.1|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -3803,20 +4333,34 @@ "instantiate", "serialize" ], - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/yaml", - "version": "v4.4.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "cd014e425b3668220adb865f53bff64b3ad21767" + "reference": "ef166890d821518106da3560086bfcbeb4fadfec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/cd014e425b3668220adb865f53bff64b3ad21767", - "reference": "cd014e425b3668220adb865f53bff64b3ad21767", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ef166890d821518106da3560086bfcbeb4fadfec", + "reference": "ef166890d821518106da3560086bfcbeb4fadfec", "shasum": "" }, "require": { @@ -3862,7 +4406,21 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2020-01-21T11:12:16+00:00" + "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": "2020-03-30T11:41:10+00:00" }, { "name": "twig/extra-bundle", @@ -4037,16 +4595,16 @@ "packages-dev": [ { "name": "composer/xdebug-handler", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "cbe23383749496fe0f373345208b79568e4bc248" + "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248", - "reference": "cbe23383749496fe0f373345208b79568e4bc248", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7", + "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7", "shasum": "" }, "require": { @@ -4077,7 +4635,13 @@ "Xdebug", "performance" ], - "time": "2019-11-06T16:40:04+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + } + ], + "time": "2020-03-01T12:26:26+00:00" }, { "name": "dealerdirect/phpcodesniffer-composer-installer", @@ -4624,16 +5188,16 @@ }, { "name": "phpstan/phpstan", - "version": "0.12.11", + "version": "0.12.18", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "ca5f2b7cf81c6d8fba74f9576970399c5817e03b" + "reference": "1ce27fe29c8660a27926127d350d53d80c4d4286" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ca5f2b7cf81c6d8fba74f9576970399c5817e03b", - "reference": "ca5f2b7cf81c6d8fba74f9576970399c5817e03b", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/1ce27fe29c8660a27926127d350d53d80c4d4286", + "reference": "1ce27fe29c8660a27926127d350d53d80c4d4286", "shasum": "" }, "require": { @@ -4659,7 +5223,21 @@ "MIT" ], "description": "PHPStan - PHP Static Analysis Tool", - "time": "2020-02-16T14:00:29+00:00" + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpstan", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2020-03-22T16:51:47+00:00" }, { "name": "phpstan/phpstan-symfony", @@ -4823,33 +5401,38 @@ }, { "name": "slevomat/coding-standard", - "version": "6.1.5", + "version": "6.2.0", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "d767b5e302ff096327466c97fec3cb57f6d16086" + "reference": "c4bf9cad66da885cc843cc24d708661d9d8fbb95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/d767b5e302ff096327466c97fec3cb57f6d16086", - "reference": "d767b5e302ff096327466c97fec3cb57f6d16086", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/c4bf9cad66da885cc843cc24d708661d9d8fbb95", + "reference": "c4bf9cad66da885cc843cc24d708661d9d8fbb95", "shasum": "" }, "require": { "php": "^7.1", - "phpstan/phpdoc-parser": "0.3.5 - 0.4.3", + "phpstan/phpdoc-parser": "0.4.0 - 0.4.3", "squizlabs/php_codesniffer": "^3.5.4" }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "0.6.2", - "grogy/php-parallel-lint": "1.1.0", "phing/phing": "2.16.3", - "phpstan/phpstan": "0.11.19|0.12.9", - "phpstan/phpstan-phpunit": "0.11.2|0.12.6", - "phpstan/phpstan-strict-rules": "0.11.1|0.12.2", - "phpunit/phpunit": "7.5.18|8.5.2" + "php-parallel-lint/php-parallel-lint": "1.1.0", + "phpstan/phpstan": "0.12.18", + "phpstan/phpstan-phpunit": "0.12.6", + "phpstan/phpstan-strict-rules": "0.12.2", + "phpunit/phpunit": "7.5.20|8.5.2|9.0.1" }, "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-master": "6.x-dev" + } + }, "autoload": { "psr-4": { "SlevomatCodingStandard\\": "SlevomatCodingStandard" @@ -4860,7 +5443,17 @@ "MIT" ], "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", - "time": "2020-02-05T21:17:34+00:00" + "funding": [ + { + "url": "https://github.com/kukulich", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "type": "tidelift" + } + ], + "time": "2020-03-28T22:04:31+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -4915,27 +5508,27 @@ }, { "name": "symfony/browser-kit", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "b0294489a7fbb4f3f39c39efe6f0328cb09731b9" + "reference": "e4b0dc1b100bf75b5717c5b451397f230a618a42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/b0294489a7fbb4f3f39c39efe6f0328cb09731b9", - "reference": "b0294489a7fbb4f3f39c39efe6f0328cb09731b9", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/e4b0dc1b100bf75b5717c5b451397f230a618a42", + "reference": "e4b0dc1b100bf75b5717c5b451397f230a618a42", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/dom-crawler": "^4.4|^5.0" + "php": "^7.1.3", + "symfony/dom-crawler": "^3.4|^4.0|^5.0" }, "require-dev": { - "symfony/css-selector": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0" + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/http-client": "^4.3|^5.0", + "symfony/mime": "^4.3|^5.0", + "symfony/process": "^3.4|^4.0|^5.0" }, "suggest": { "symfony/process": "" @@ -4943,7 +5536,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -4970,29 +5563,43 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-28T10:15:50+00:00" }, { "name": "symfony/css-selector", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ff60c90cb7950b592ebc84ad1289d0345bf24f9f" + "reference": "afc26133a6fbdd4f8842e38893e0ee4685c7c94b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ff60c90cb7950b592ebc84ad1289d0345bf24f9f", - "reference": "ff60c90cb7950b592ebc84ad1289d0345bf24f9f", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/afc26133a6fbdd4f8842e38893e0ee4685c7c94b", + "reference": "afc26133a6fbdd4f8842e38893e0ee4685c7c94b", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -5023,37 +5630,51 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/debug-bundle", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "1f4d3b753f0a9effff115726ff2b5b6eaa800418" + "reference": "dc847e4971b9f76b30e02d421b303d349d5aeed2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/1f4d3b753f0a9effff115726ff2b5b6eaa800418", - "reference": "1f4d3b753f0a9effff115726ff2b5b6eaa800418", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/dc847e4971b9f76b30e02d421b303d349d5aeed2", + "reference": "dc847e4971b9f76b30e02d421b303d349d5aeed2", "shasum": "" }, "require": { "ext-xml": "*", - "php": "^7.2.5", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/twig-bridge": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" + "php": "^7.1.3", + "symfony/http-kernel": "^3.4|^4.0|^5.0", + "symfony/twig-bridge": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.1.1|^5.0" }, "conflict": { - "symfony/config": "<4.4", - "symfony/dependency-injection": "<4.4" + "symfony/config": "<4.2", + "symfony/dependency-injection": "<3.4" }, "require-dev": { - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/web-profiler-bundle": "^4.4|^5.0" + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/web-profiler-bundle": "^3.4|^4.0|^5.0" }, "suggest": { "symfony/config": "For service container configuration", @@ -5062,7 +5683,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -5089,7 +5710,21 @@ ], "description": "Symfony DebugBundle", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/debug-pack", @@ -5123,20 +5758,20 @@ }, { "name": "symfony/dom-crawler", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "439c3c7be4daa569deef0dd1e30cf3562108d062" + "reference": "4d0fb3374324071ecdd94898367a3fa4b5563162" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/439c3c7be4daa569deef0dd1e30cf3562108d062", - "reference": "439c3c7be4daa569deef0dd1e30cf3562108d062", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4d0fb3374324071ecdd94898367a3fa4b5563162", + "reference": "4d0fb3374324071ecdd94898367a3fa4b5563162", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0" }, @@ -5145,7 +5780,7 @@ }, "require-dev": { "masterminds/html5": "^2.6", - "symfony/css-selector": "^4.4|^5.0" + "symfony/css-selector": "^3.4|^4.0|^5.0" }, "suggest": { "symfony/css-selector": "" @@ -5153,7 +5788,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -5180,20 +5815,34 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-29T19:12:22+00:00" }, { "name": "symfony/maker-bundle", - "version": "v1.14.3", + "version": "v1.14.6", "source": { "type": "git", "url": "https://github.com/symfony/maker-bundle.git", - "reference": "c864e7f9b8d1e1f5f60acc3beda11299f637aded" + "reference": "bc4df88792fbaaeb275167101dc714218475db5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c864e7f9b8d1e1f5f60acc3beda11299f637aded", - "reference": "c864e7f9b8d1e1f5f60acc3beda11299f637aded", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/bc4df88792fbaaeb275167101dc714218475db5f", + "reference": "bc4df88792fbaaeb275167101dc714218475db5f", "shasum": "" }, "require": { @@ -5248,27 +5897,41 @@ "scaffold", "scaffolding" ], - "time": "2019-11-07T00:56:03+00:00" + "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": "2020-03-04T13:57:29+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v5.0.4", + "version": "v5.0.7", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "38959f0ef4cea3e003f94c670bca89b2f4d932c5" + "reference": "0258b43a94972abf1ee99ce2221359f8ac2a17fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/38959f0ef4cea3e003f94c670bca89b2f4d932c5", - "reference": "38959f0ef4cea3e003f94c670bca89b2f4d932c5", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/0258b43a94972abf1ee99ce2221359f8ac2a17fd", + "reference": "0258b43a94972abf1ee99ce2221359f8ac2a17fd", "shasum": "" }, "require": { "php": ">=5.5.9" }, "conflict": { - "phpunit/phpunit": "<5.4.3" + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0|<6.4,>=6.0" }, "suggest": { "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" @@ -5313,29 +5976,43 @@ ], "description": "Symfony PHPUnit Bridge", "homepage": "https://symfony.com", - "time": "2020-01-31T09:56:42+00:00" + "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": "2020-03-27T16:56:45+00:00" }, { "name": "symfony/process", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "f9ffd870f5ac01abec7b2b5e15f904ca9400ecd1" + "reference": "3e40e87a20eaf83a1db825e1fa5097ae89042db3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/f9ffd870f5ac01abec7b2b5e15f904ca9400ecd1", - "reference": "f9ffd870f5ac01abec7b2b5e15f904ca9400ecd1", + "url": "https://api.github.com/repos/symfony/process/zipball/3e40e87a20eaf83a1db825e1fa5097ae89042db3", + "reference": "3e40e87a20eaf83a1db825e1fa5097ae89042db3", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -5362,7 +6039,21 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2020-01-09T09:53:06+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/profiler-pack", @@ -5394,26 +6085,26 @@ }, { "name": "symfony/stopwatch", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4" + "reference": "e0324d3560e4128270e3f08617480d9233d81cfc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5d9add8034135b9a5f7b101d1e42c797e7f053e4", - "reference": "5d9add8034135b9a5f7b101d1e42c797e7f053e4", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e0324d3560e4128270e3f08617480d9233d81cfc", + "reference": "e0324d3560e4128270e3f08617480d9233d81cfc", "shasum": "" }, "require": { - "php": "^7.2.5", + "php": "^7.1.3", "symfony/service-contracts": "^1.0|^2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -5440,7 +6131,21 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2020-01-04T14:08:26+00:00" + "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": "2020-03-27T16:54:36+00:00" }, { "name": "symfony/test-pack", @@ -5472,42 +6177,42 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v5.0.4", + "version": "v4.4.7", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "8f4831567fc39bbe42af415a14a6039621349787" + "reference": "4c432f5c21c700270819daacf95323302fa8f004" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/8f4831567fc39bbe42af415a14a6039621349787", - "reference": "8f4831567fc39bbe42af415a14a6039621349787", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/4c432f5c21c700270819daacf95323302fa8f004", + "reference": "4c432f5c21c700270819daacf95323302fa8f004", "shasum": "" }, "require": { - "php": "^7.2.5", - "symfony/config": "^4.4|^5.0", + "php": "^7.1.3", + "symfony/config": "^4.2|^5.0", "symfony/framework-bundle": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/twig-bundle": "^4.4|^5.0", - "twig/twig": "^2.10|^3.0" + "symfony/http-kernel": "^4.4", + "symfony/routing": "^4.3|^5.0", + "symfony/twig-bundle": "^4.2|^5.0", + "twig/twig": "^1.41|^2.10|^3.0" }, "conflict": { - "symfony/form": "<4.4", - "symfony/messenger": "<4.4" + "symfony/form": "<4.3", + "symfony/messenger": "<4.2" }, "require-dev": { - "symfony/browser-kit": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/css-selector": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0" + "symfony/browser-kit": "^4.3|^5.0", + "symfony/console": "^4.3|^5.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-master": "4.4-dev" } }, "autoload": { @@ -5534,7 +6239,21 @@ ], "description": "Symfony WebProfilerBundle", "homepage": "https://symfony.com", - "time": "2020-01-23T11:07:12+00:00" + "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": "2020-03-27T16:54:36+00:00" } ], "aliases": [], @@ -5547,5 +6266,6 @@ "ext-ctype": "*", "ext-iconv": "*" }, - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "1.1.0" } From 17a945215b1c1b762ffa0f9173e10c781ba61db4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Tue, 31 Mar 2020 11:30:09 +0200 Subject: [PATCH 02/19] Created HttpReadIDConfiguration Service --- config/packages/parameters.yaml.dist | 4 ++ .../Services/HttpReadIDConfiguration.php | 40 ++++++++++++++ support/qa/phpmd.xml | 6 ++- .../Services/HttpReadIDConfigurationTest.php | 54 +++++++++++++++++++ 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 config/packages/parameters.yaml.dist create mode 100644 src/Infrastructure/Services/HttpReadIDConfiguration.php create mode 100644 tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php diff --git a/config/packages/parameters.yaml.dist b/config/packages/parameters.yaml.dist new file mode 100644 index 0000000..1c8dc9a --- /dev/null +++ b/config/packages/parameters.yaml.dist @@ -0,0 +1,4 @@ +parameters: + app.authorization_token: + app.opaque_id: + app.readid_endpoint: diff --git a/src/Infrastructure/Services/HttpReadIDConfiguration.php b/src/Infrastructure/Services/HttpReadIDConfiguration.php new file mode 100644 index 0000000..6b8911f --- /dev/null +++ b/src/Infrastructure/Services/HttpReadIDConfiguration.php @@ -0,0 +1,40 @@ +params = $params; + } + + public function authorizationToken(): string + { + return $this->params->get(self::AUTHORIZATION_TOKEN); + } + + public function opaqueId(): string + { + return $this->params->get(self::OPAQUE_ID); + } + + public function endpoint(): string + { + return rtrim($this->params->get(self::READID_ENDPOINT), '/'); + } +} diff --git a/support/qa/phpmd.xml b/support/qa/phpmd.xml index fcf45fd..8db7fda 100644 --- a/support/qa/phpmd.xml +++ b/support/qa/phpmd.xml @@ -8,7 +8,9 @@ http://pmd.sf.net/ruleset_xml_schema.xsd"> - + + + @@ -25,5 +27,7 @@ + + diff --git a/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php b/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php new file mode 100644 index 0000000..c5d59e1 --- /dev/null +++ b/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php @@ -0,0 +1,54 @@ +getMockBuilder(ContainerBagInterface::class)->getMock(); + $params + ->expects($this->exactly(1)) + ->method('get') + ->with('app.authorization_token') + ->willReturn('authorization_token'); + + $configuration = new HttpReadIDConfiguration($params); + $value = $configuration->authorizationToken(); + self::assertSame('authorization_token', $value); + } + + public function testEndpoint(): void + { + $params = $this->getMockBuilder(ContainerBagInterface::class)->getMock(); + $params + ->expects($this->exactly(1)) + ->method('get') + ->with('app.readid_endpoint') + ->willReturn('http://site.com'); + + $configuration = new HttpReadIDConfiguration($params); + $value = $configuration->endpoint(); + self::assertSame('http://site.com', $value); + } + + public function testCleanEndpoint(): void + { + $params = $this->getMockBuilder(ContainerBagInterface::class)->getMock(); + $params + ->expects($this->exactly(1)) + ->method('get') + ->with('app.readid_endpoint') + ->willReturn('http://site.com/'); + + $configuration = new HttpReadIDConfiguration($params); + $value = $configuration->endpoint(); + self::assertSame('http://site.com', $value); + } +} From 731a3802f45bf6ed30a92d289cfe3455e31cc23e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Wed, 1 Apr 2020 08:56:53 +0200 Subject: [PATCH 03/19] Created ReadySession Model - ReadySession encapsulate the response from ReadID backend - Added uuid dependency - Disabled some Doctrine rules from phpcs --- composer.json | 1 + composer.lock | 195 +++++++++++++++++- .../ReadySession/Model/ReadySession.php | 58 ++++++ .../Model/ReadySessionBase64Image.php | 31 +++ .../ReadySession/Model/ReadySessionId.php | 34 +++ .../Model/ReadySessionJwtToken.php | 31 +++ .../Model/ReadySessionTimestamp.php | 35 ++++ support/qa/phpcs.xml | 6 +- symfony.lock | 9 + 9 files changed, 398 insertions(+), 2 deletions(-) create mode 100644 src/Domain/ReadySession/Model/ReadySession.php create mode 100644 src/Domain/ReadySession/Model/ReadySessionBase64Image.php create mode 100644 src/Domain/ReadySession/Model/ReadySessionId.php create mode 100644 src/Domain/ReadySession/Model/ReadySessionJwtToken.php create mode 100644 src/Domain/ReadySession/Model/ReadySessionTimestamp.php diff --git a/composer.json b/composer.json index 88eacfc..b94edfa 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "php": "^7.2.5", "ext-ctype": "*", "ext-iconv": "*", + "ramsey/uuid": "^4.0", "sensio/framework-extra-bundle": "^5.1", "surfnet/stepup-saml-bundle": "^4.1", "symfony/asset": "4.4.*", diff --git a/composer.lock b/composer.lock index 351dcb4..f333e07 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,53 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9dfc1c4be433f35c28e187a15cdbade2", + "content-hash": "6fc113963596ea132394fb0e90b59910", "packages": [ + { + "name": "brick/math", + "version": "0.8.14", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "6f7a46b5c3d487b277f38fbd17df57d348cace8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/6f7a46b5c3d487b277f38fbd17df57d348cace8a", + "reference": "6f7a46b5c3d487b277f38fbd17df57d348cace8a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "2.*", + "phpunit/phpunit": "7.*", + "vimeo/psalm": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "time": "2020-02-17T13:57:43+00:00" + }, { "name": "doctrine/annotations", "version": "v1.8.0", @@ -507,6 +552,154 @@ ], "time": "2020-03-23T09:12:05+00:00" }, + { + "name": "ramsey/collection", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca", + "reference": "925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "fzaninotto/faker": "^1.5", + "jakub-onderka/php-parallel-lint": "^1", + "jangregor/phpstan-prophecy": "^0.6", + "mockery/mockery": "^1.3", + "phpstan/extension-installer": "^1", + "phpstan/phpdoc-parser": "0.4.1", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5", + "slevomat/coding-standard": "^6.0", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP 7.2+ library for representing and manipulating collections.", + "homepage": "https://github.com/ramsey/collection", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "time": "2020-01-05T00:22:59+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d", + "reference": "ba8fff1d3abb8bb4d35a135ed22a31c6ef3ede3d", + "shasum": "" + }, + "require": { + "brick/math": "^0.8", + "ext-json": "*", + "php": "^7.2 || ^8", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "codeception/aspect-mock": "^3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2", + "doctrine/annotations": "^1.8", + "goaop/framework": "^2", + "mockery/mockery": "^1.3", + "moontoast/math": "^1.1", + "paragonie/random-lib": "^2", + "php-mock/php-mock-mockery": "^1.3", + "php-mock/php-mock-phpunit": "^2.5", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpstan/extension-installer": "^1.0", + "phpstan/phpdoc-parser": "0.4.3", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5", + "psy/psysh": "^0.10.0", + "slevomat/coding-standard": "^6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "3.9.4" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "homepage": "https://github.com/ramsey/uuid", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + } + ], + "time": "2020-03-29T20:13:32+00:00" + }, { "name": "robrichards/xmlseclibs", "version": "3.0.4", diff --git a/src/Domain/ReadySession/Model/ReadySession.php b/src/Domain/ReadySession/Model/ReadySession.php new file mode 100644 index 0000000..67836e8 --- /dev/null +++ b/src/Domain/ReadySession/Model/ReadySession.php @@ -0,0 +1,58 @@ +id = $id; + $this->qrCode = $qrCode; + $this->jwtToken = $jwtToken; + $this->timestamp = $timestamp; + } + + public static function create( + ReadySessionId $id, + ReadySessionBase64Image $qrCode, + ReadySessionJwtToken $jwtToken, + ReadySessionTimestamp $timestamp + ): ReadySession { + return new self($id, $qrCode, $jwtToken, $timestamp); + } + + public function id(): ReadySessionId + { + return $this->id; + } + + public function qrCode(): ReadySessionBase64Image + { + return $this->qrCode; + } + + public function jwtToken(): ReadySessionJwtToken + { + return $this->jwtToken; + } + + public function timestamp(): ReadySessionTimestamp + { + return $this->timestamp; + } +} diff --git a/src/Domain/ReadySession/Model/ReadySessionBase64Image.php b/src/Domain/ReadySession/Model/ReadySessionBase64Image.php new file mode 100644 index 0000000..a489706 --- /dev/null +++ b/src/Domain/ReadySession/Model/ReadySessionBase64Image.php @@ -0,0 +1,31 @@ +value = $base64Image; + } + + public static function fromString(string $base64Image): ReadySessionBase64Image + { + return new self($base64Image); + } + + public function value(): string + { + return $this->value; + } + + public function equals(ReadySessionBase64Image $other): bool + { + return $this->value === $other->value; + } +} diff --git a/src/Domain/ReadySession/Model/ReadySessionId.php b/src/Domain/ReadySession/Model/ReadySessionId.php new file mode 100644 index 0000000..b3a0026 --- /dev/null +++ b/src/Domain/ReadySession/Model/ReadySessionId.php @@ -0,0 +1,34 @@ +value = $readySessionId; + } + + public static function fromString(string $readySessionId): ReadySessionId + { + return new self(Uuid::fromString($readySessionId)); + } + + public function value(): string + { + return $this->value->toString(); + } + + public function equals(ReadySessionId $other): bool + { + return $this->value->equals($other); + } +} diff --git a/src/Domain/ReadySession/Model/ReadySessionJwtToken.php b/src/Domain/ReadySession/Model/ReadySessionJwtToken.php new file mode 100644 index 0000000..64c97d5 --- /dev/null +++ b/src/Domain/ReadySession/Model/ReadySessionJwtToken.php @@ -0,0 +1,31 @@ +value = $jwtToken; + } + + public static function fromString(string $jwtToken): self + { + return new self($jwtToken); + } + + public function value(): string + { + return $this->value; + } + + public function equals(ReadySessionJwtToken $other): bool + { + return $this->value === $other->value; + } +} diff --git a/src/Domain/ReadySession/Model/ReadySessionTimestamp.php b/src/Domain/ReadySession/Model/ReadySessionTimestamp.php new file mode 100644 index 0000000..852a718 --- /dev/null +++ b/src/Domain/ReadySession/Model/ReadySessionTimestamp.php @@ -0,0 +1,35 @@ +value = $timestamp; + } + + public static function fromInteger(int $timestamp): ReadySessionTimestamp + { + return new self($timestamp); + } + + public function value(): int + { + return $this->value; + } + + public function equals(ReadySessionTimestamp $other): bool + { + return $this->value === $other->value; + } +} diff --git a/support/qa/phpcs.xml b/support/qa/phpcs.xml index be003fb..a237afa 100644 --- a/support/qa/phpcs.xml +++ b/support/qa/phpcs.xml @@ -13,7 +13,11 @@ - + + + + + ../../src diff --git a/symfony.lock b/symfony.lock index 95f8a22..12d4dd1 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,4 +1,7 @@ { + "brick/math": { + "version": "0.8.14" + }, "composer/xdebug-handler": { "version": "1.4.0" }, @@ -86,6 +89,12 @@ "psr/log": { "version": "1.1.2" }, + "ramsey/collection": { + "version": "1.0.1" + }, + "ramsey/uuid": { + "version": "4.0.1" + }, "robrichards/xmlseclibs": { "version": "3.0.4" }, From 18b79ea881da209580833090c2da8a60c2e772f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Wed, 1 Apr 2020 09:02:31 +0200 Subject: [PATCH 04/19] Created GetReadySessionQuery - Command to get a new ReadySession from ReadID server - Depends on RequestReadySessionInterface service in infrastructure --- .../ReadySession/GetReadySessionQuery.php | 21 ++++++++++ .../GetReadySessionQueryHandler.php | 27 +++++++++++++ .../InvalidReadySessionTTLException.php | 24 +++++++++++ ...uestReadySessionAuthorizationException.php | 11 +++++ ...RequestReadySessionBadRequestException.php | 11 +++++ ...RequestReadySessionConnectionException.php | 21 ++++++++++ .../ReadySession/Model/ReadySessionTTL.php | 40 +++++++++++++++++++ .../Services/RequestReadySessionInterface.php | 21 ++++++++++ 8 files changed, 176 insertions(+) create mode 100644 src/Application/ReadySession/GetReadySessionQuery.php create mode 100644 src/Application/ReadySession/GetReadySessionQueryHandler.php create mode 100644 src/Domain/ReadySession/Exception/InvalidReadySessionTTLException.php create mode 100644 src/Domain/ReadySession/Exception/RequestReadySessionAuthorizationException.php create mode 100644 src/Domain/ReadySession/Exception/RequestReadySessionBadRequestException.php create mode 100644 src/Domain/ReadySession/Exception/RequestReadySessionConnectionException.php create mode 100644 src/Domain/ReadySession/Model/ReadySessionTTL.php create mode 100644 src/Domain/ReadySession/Services/RequestReadySessionInterface.php diff --git a/src/Application/ReadySession/GetReadySessionQuery.php b/src/Application/ReadySession/GetReadySessionQuery.php new file mode 100644 index 0000000..9cb7982 --- /dev/null +++ b/src/Application/ReadySession/GetReadySessionQuery.php @@ -0,0 +1,21 @@ +ttl = $ttl; + } + + public function ttl(): int + { + return $this->ttl; + } +} diff --git a/src/Application/ReadySession/GetReadySessionQueryHandler.php b/src/Application/ReadySession/GetReadySessionQueryHandler.php new file mode 100644 index 0000000..6fb48df --- /dev/null +++ b/src/Application/ReadySession/GetReadySessionQueryHandler.php @@ -0,0 +1,27 @@ +requestReadySession = $requestReadySession; + } + + public function __invoke(GetReadySessionQuery $query): ReadySession + { + $ttl = ReadySessionTTL::fromInteger($query->ttl()); + + return $this->requestReadySession->with($ttl); + } +} diff --git a/src/Domain/ReadySession/Exception/InvalidReadySessionTTLException.php b/src/Domain/ReadySession/Exception/InvalidReadySessionTTLException.php new file mode 100644 index 0000000..185ce81 --- /dev/null +++ b/src/Domain/ReadySession/Exception/InvalidReadySessionTTLException.php @@ -0,0 +1,24 @@ + self::MAXIMUM_TTL) { + throw InvalidReadySessionTTLException::becauseOutOfRange($ttl); + } + + $this->value = $ttl; + } + + public static function fromInteger(int $ttl): self + { + return new self($ttl); + } + + public function value(): int + { + return $this->value; + } + + public function equals(ReadySessionTTL $other): bool + { + return $this->value === $other->value; + } +} diff --git a/src/Domain/ReadySession/Services/RequestReadySessionInterface.php b/src/Domain/ReadySession/Services/RequestReadySessionInterface.php new file mode 100644 index 0000000..7185c68 --- /dev/null +++ b/src/Domain/ReadySession/Services/RequestReadySessionInterface.php @@ -0,0 +1,21 @@ + Date: Wed, 1 Apr 2020 09:09:30 +0200 Subject: [PATCH 05/19] Created RequestReadySessionInterface implementation - Depends on HttpReadIDClientInterface --- .../Services/HttpReadIDClientInterface.php | 12 +++ .../Services/HttpRequestReadySession.php | 82 ++++++++++++++ .../Services/HttpRequestReadySessionTest.php | 102 ++++++++++++++++++ 3 files changed, 196 insertions(+) create mode 100644 src/Infrastructure/Services/HttpReadIDClientInterface.php create mode 100644 src/Infrastructure/Services/HttpRequestReadySession.php create mode 100644 tests/Unit/Infrastructure/Services/HttpRequestReadySessionTest.php diff --git a/src/Infrastructure/Services/HttpReadIDClientInterface.php b/src/Infrastructure/Services/HttpReadIDClientInterface.php new file mode 100644 index 0000000..e11b6b5 --- /dev/null +++ b/src/Infrastructure/Services/HttpReadIDClientInterface.php @@ -0,0 +1,12 @@ +httpReadIDClient = $httpReadIDClient; + } + + public function with(ReadySessionTTL $ttl): ReadySession + { + $response = $this->httpReadIDClient->createReadySession($ttl->value()); + + try { + if ($response->getStatusCode() === Response::HTTP_UNAUTHORIZED) { + throw new RequestReadySessionAuthorizationException(); + } + + if ($response->getStatusCode() !== Response::HTTP_CREATED) { + throw new RequestReadySessionBadRequestException(); + } + + $decodedPayload = $response->toArray(); + $this->checkPayload($decodedPayload); + } catch (TransportExceptionInterface $e) { + throw RequestReadySessionConnectionException::becauseTransportError($e->getMessage()); + } + + return ReadySession::create( + ReadySessionId::fromString($decodedPayload[self::READY_SESSION_ID]), + ReadySessionBase64Image::fromString($decodedPayload[self::BASE_64_QR]), + ReadySessionJwtToken::fromString($decodedPayload[self::JWK_TOKEN]), + ReadySessionTimestamp::fromInteger(intval($decodedPayload[self::EXPIRY_TIMESTAMP])) + ); + } + + /** + * @param array $decodedPayload + */ + private function checkPayload(array $decodedPayload): void + { + if (array_diff_key( + array_flip([ + self::READY_SESSION_ID, + self::BASE_64_QR, + self::JWK_TOKEN, + self::EXPIRY_TIMESTAMP, + ]), + $decodedPayload + )) { + throw RequestReadySessionConnectionException::becauseResponseIsInvalid(); + } + } +} diff --git a/tests/Unit/Infrastructure/Services/HttpRequestReadySessionTest.php b/tests/Unit/Infrastructure/Services/HttpRequestReadySessionTest.php new file mode 100644 index 0000000..6d88f43 --- /dev/null +++ b/tests/Unit/Infrastructure/Services/HttpRequestReadySessionTest.php @@ -0,0 +1,102 @@ +httpClient = $this->getMockBuilder(HttpReadIDClientInterface::class)->getMock(); + $this->response = $this->getMockBuilder(ResponseInterface::class)->getMock(); + + $this->httpClient + ->expects($this->exactly(1)) + ->method('createReadySession') + ->with(ReadySessionTTL::MINIMUM_TTL) + ->willReturn($this->response); + } + + public function testReceiveRequest(): void + { + $this->response + ->expects($this->exactly(2)) + ->method('getStatusCode') + ->willReturn(Response::HTTP_CREATED); + + $this->response + ->expects($this->exactly(1)) + ->method('toArray') + ->willReturn([ + HttpRequestReadySession::READY_SESSION_ID => '2e32c9a2-e34c-4f40-ac2f-dc47b67f3900', + HttpRequestReadySession::BASE_64_QR => 'data:image/png;base64,0', + HttpRequestReadySession::EXPIRY_TIMESTAMP => 1, + HttpRequestReadySession::JWK_TOKEN => 'j.w.t', + ]); + + $requestReadySession = new HttpRequestReadySession($this->httpClient); + $readySession = $requestReadySession->with( + ReadySessionTTL::fromInteger(ReadySessionTTL::MINIMUM_TTL) + ); + + $this->assertEquals( + ReadySession::create( + ReadySessionId::fromString('2e32c9a2-e34c-4f40-ac2f-dc47b67f3900'), + ReadySessionBase64Image::fromString('data:image/png;base64,0'), + ReadySessionJwtToken::fromString('j.w.t'), + ReadySessionTimestamp::fromInteger(1) + ), + $readySession + ); + } + + /** + * @expectedException \StepupReadId\Domain\ReadySession\Exception\RequestReadySessionAuthorizationException + */ + public function testUnauthorizedRequest(): void + { + $this->response + ->expects($this->exactly(1)) + ->method('getStatusCode') + ->willReturn(Response::HTTP_UNAUTHORIZED); + + $requestReadySession = new HttpRequestReadySession($this->httpClient); + $requestReadySession->with( + ReadySessionTTL::fromInteger(ReadySessionTTL::MINIMUM_TTL) + ); + } + + /** + * @expectedException \StepupReadId\Domain\ReadySession\Exception\RequestReadySessionBadRequestException + */ + public function testBadRequest(): void + { + $this->response + ->expects($this->exactly(2)) + ->method('getStatusCode') + ->willReturn(Response::HTTP_BAD_REQUEST); + + $requestReadySession = new HttpRequestReadySession($this->httpClient); + $requestReadySession->with( + ReadySessionTTL::fromInteger(ReadySessionTTL::MINIMUM_TTL) + ); + } +} From 0360583a660df7ea745283e035b9dce34f430f8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Wed, 1 Apr 2020 09:21:18 +0200 Subject: [PATCH 06/19] Implemented HttpReadIDClientInterface --- .../Services/HttpReadIDClient.php | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/Infrastructure/Services/HttpReadIDClient.php diff --git a/src/Infrastructure/Services/HttpReadIDClient.php b/src/Infrastructure/Services/HttpReadIDClient.php new file mode 100644 index 0000000..5faff42 --- /dev/null +++ b/src/Infrastructure/Services/HttpReadIDClient.php @@ -0,0 +1,53 @@ +client = $client; + $this->readIDConfiguration = $readIDConfiguration; + } + + public function createReadySession(int $ttl): ResponseInterface + { + return $this->client->request( + 'POST', + $this->readIDConfiguration->endpoint() . self::READY_SESSION_ENDPOINT_PATH, + [ + 'header' => $this->getHeader(), + 'body' => [ + 'opaqueID' => $this->readIDConfiguration->opaqueId(), + 'TTL' => $ttl, + ], + ] + ); + } + + /** + * @return array + */ + private function getHeader(): array + { + return [ + 'X-Innovalor-Authorization' => $this->readIDConfiguration->authorizationToken(), + 'Content-Type' => 'application/json;odata.metadata=minimal', + 'Accept' => 'application/json;odata.metadata=minimal', + 'OData-MaxVersion' => '4.0', + 'OData-Version' => '4.0', + ]; + } +} From ec5b20fdce59dd3cc12c9953f90388bbc1e374d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Wed, 1 Apr 2020 10:55:37 +0200 Subject: [PATCH 07/19] Added messenger component --- composer.json | 1 + composer.lock | 90 +++++++++++++++++++++++++++++++++- config/packages/messenger.yaml | 7 +++ config/services.yaml | 14 ++++++ symfony.lock | 12 +++++ 5 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 config/packages/messenger.yaml diff --git a/composer.json b/composer.json index b94edfa..ae83319 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ "symfony/framework-bundle": "4.4.*", "symfony/http-client": "4.4.*", "symfony/intl": "4.4.*", + "symfony/messenger": "4.4.*", "symfony/monolog-bundle": "^3.1", "symfony/security-bundle": "4.4.*", "symfony/serializer-pack": "*", diff --git a/composer.lock b/composer.lock index f333e07..fe1e7b7 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": "6fc113963596ea132394fb0e90b59910", + "content-hash": "1601eff5baf5be6a2c48324361ecd558", "packages": [ { "name": "brick/math", @@ -2550,6 +2550,94 @@ ], "time": "2020-03-27T16:54:36+00:00" }, + { + "name": "symfony/messenger", + "version": "v4.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/messenger.git", + "reference": "24579ff4ed8fc5067d11bf34b1b2436006d440a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/messenger/zipball/24579ff4ed8fc5067d11bf34b1b2436006d440a4", + "reference": "24579ff4ed8fc5067d11bf34b1b2436006d440a4", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0" + }, + "conflict": { + "doctrine/persistence": "<1.3", + "symfony/event-dispatcher": "<4.3", + "symfony/framework-bundle": "<4.4", + "symfony/http-kernel": "<4.4" + }, + "require-dev": { + "doctrine/dbal": "^2.6", + "doctrine/persistence": "^1.3", + "psr/cache": "~1.0", + "symfony/console": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4.19|^4.1.8|^5.0", + "symfony/event-dispatcher": "^4.3|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/serializer": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/validator": "^3.4|^4.0|^5.0" + }, + "suggest": { + "enqueue/messenger-adapter": "For using the php-enqueue library as a transport." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Messenger\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Roze", + "email": "samuel.roze@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Messenger Component", + "homepage": "https://symfony.com", + "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": "2020-03-27T16:54:36+00:00" + }, { "name": "symfony/mime", "version": "v4.4.7", diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml new file mode 100644 index 0000000..a0c263c --- /dev/null +++ b/config/packages/messenger.yaml @@ -0,0 +1,7 @@ +framework: + messenger: + # The bus that is going to be injected when injecting MessageBusInterface + default_bus: command.bus + buses: + command.bus: ~ + query.bus: ~ diff --git a/config/services.yaml b/config/services.yaml index 343e162..9c56050 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -25,3 +25,17 @@ services: # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones + + command_handlers: + namespace: StepupReadId\Application\ + resource: '%kernel.project_dir%/src/Application/**/*CommandHandler.php' + autoconfigure: false + tags: + - { name: messenger.message_handler, bus: command.bus } + + query_handlers: + namespace: StepupReadId\Application\ + resource: '%kernel.project_dir%/src/Application/**/*QueryHandler.php' + autoconfigure: false + tags: + - { name: messenger.message_handler, bus: query.bus } diff --git a/symfony.lock b/symfony.lock index 12d4dd1..0a23b0b 100644 --- a/symfony.lock +++ b/symfony.lock @@ -278,6 +278,18 @@ "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" } }, + "symfony/messenger": { + "version": "4.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.3", + "ref": "8a2675c061737658bed85102e9241c752620e575" + }, + "files": [ + "config/packages/messenger.yaml" + ] + }, "symfony/mime": { "version": "v5.0.4" }, From bbff355f577f8fba0d2674471bd11b5996c7dada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Wed, 1 Apr 2020 10:57:54 +0200 Subject: [PATCH 08/19] Fixed HttpReadIDClient issues - Fixed create ReadySession endpoint - Fixed json body argument - Fixed headers argument --- src/Infrastructure/Services/HttpReadIDClient.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Infrastructure/Services/HttpReadIDClient.php b/src/Infrastructure/Services/HttpReadIDClient.php index 5faff42..07f5933 100644 --- a/src/Infrastructure/Services/HttpReadIDClient.php +++ b/src/Infrastructure/Services/HttpReadIDClient.php @@ -9,7 +9,7 @@ final class HttpReadIDClient implements HttpReadIDClientInterface { - private const READY_SESSION_ENDPOINT_PATH = '/createReadySession'; + private const CREATE_READY_SESSION_ENDPOINT_PATH = '/odata/v1/ODataServlet/createReadySession'; /** @var HttpClientInterface */ private $client; @@ -26,10 +26,10 @@ public function createReadySession(int $ttl): ResponseInterface { return $this->client->request( 'POST', - $this->readIDConfiguration->endpoint() . self::READY_SESSION_ENDPOINT_PATH, + $this->readIDConfiguration->endpoint() . self::CREATE_READY_SESSION_ENDPOINT_PATH, [ - 'header' => $this->getHeader(), - 'body' => [ + 'headers' => $this->getHeaders(), + 'json' => [ 'opaqueID' => $this->readIDConfiguration->opaqueId(), 'TTL' => $ttl, ], @@ -40,7 +40,7 @@ public function createReadySession(int $ttl): ResponseInterface /** * @return array */ - private function getHeader(): array + private function getHeaders(): array { return [ 'X-Innovalor-Authorization' => $this->readIDConfiguration->authorizationToken(), From 21deca2bb271c09bba030c1b0befa07549a9983b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Wed, 1 Apr 2020 12:23:49 +0200 Subject: [PATCH 09/19] Added Functional test for GetReadySessionQueryHandler - Disabled SYMFONY_DEPRECATIONS_HELPER - Configured tested services as public - Mocked three available responses --- composer.json | 1 + config/services_test.yaml | 3 + support/qa/phpunit.xml | 1 + .../GetReadySessionQueryHandlerTest.php | 94 +++++++++++++++++++ 4 files changed, 99 insertions(+) create mode 100644 tests/Functional/Application/ReadySession/GetReadySessionQueryHandlerTest.php diff --git a/composer.json b/composer.json index ae83319..e4805b5 100644 --- a/composer.json +++ b/composer.json @@ -26,6 +26,7 @@ "symfony/yaml": "4.4.*" }, "require-dev": { + "ext-json": "*", "ibuildings/qa-pack": "^1.8", "symfony/debug-pack": "*", "symfony/maker-bundle": "^1.0", diff --git a/config/services_test.yaml b/config/services_test.yaml index 876c36b..33302e8 100644 --- a/config/services_test.yaml +++ b/config/services_test.yaml @@ -7,3 +7,6 @@ services: # aliases are prefixed with test. For example: # # test.App\Service\MyService: '@App\Service\MyService' + + test.StepupReadId\Application\ReadySession\GetReadySessionQueryHandler: '@StepupReadId\Application\ReadySession\GetReadySessionQueryHandler' + test.Symfony\Contracts\HttpClient\HttpClientInterface: '@Symfony\Contracts\HttpClient\HttpClientInterface' diff --git a/support/qa/phpunit.xml b/support/qa/phpunit.xml index 71b5220..7c6d11e 100644 --- a/support/qa/phpunit.xml +++ b/support/qa/phpunit.xml @@ -13,6 +13,7 @@ + diff --git a/tests/Functional/Application/ReadySession/GetReadySessionQueryHandlerTest.php b/tests/Functional/Application/ReadySession/GetReadySessionQueryHandlerTest.php new file mode 100644 index 0000000..274e847 --- /dev/null +++ b/tests/Functional/Application/ReadySession/GetReadySessionQueryHandlerTest.php @@ -0,0 +1,94 @@ +getContainer(); + $container->set('test.' . HttpClientInterface::class, new MockHttpClient(static::responses())); + + static::$getReadySessionQueryHandler = $container->get('test.' . GetReadySessionQueryHandler::class); + } + + public function testRequestReadySession(): void + { + $response = (static::$getReadySessionQueryHandler)(new GetReadySessionQuery(ReadySessionTTL::MINIMUM_TTL)); + + $this->assertInstanceOf(ReadySession::class, $response); + $this->assertEquals($response->id()->value(), 'a0577ea3-1b40-433a-ad18-726c2a5378ad'); + $this->assertEquals($response->qrCode()->value(), 'data:image/png;base64,0'); + $this->assertEquals($response->jwtToken()->value(), 'j.w.t'); + $this->assertEquals($response->timestamp()->value(), 1234567890); + } + + /** + * @expectedException \StepupReadId\Domain\ReadySession\Exception\RequestReadySessionAuthorizationException + */ + public function testUnauthorizedRequest(): void + { + (static::$getReadySessionQueryHandler)(new GetReadySessionQuery(ReadySessionTTL::MINIMUM_TTL)); + } + + /** + * @expectedException \StepupReadId\Domain\ReadySession\Exception\RequestReadySessionBadRequestException + */ + public function testBadRequest(): void + { + (static::$getReadySessionQueryHandler)(new GetReadySessionQuery(ReadySessionTTL::MINIMUM_TTL)); + } + + /** + * @return array + */ + private static function responses(): array + { + return [ + // Good request + new MockResponse( + json_encode([ + 'base64QR' => 'data:image/png;base64,0', + 'expiryTimestamp' => 1234567890, + 'jwtToken' => 'j.w.t', + 'readySessionID' => 'a0577ea3-1b40-433a-ad18-726c2a5378ad', + ]), + [ + 'http_code' => Response::HTTP_CREATED, + ] + ), + // Unauthorized request + new MockResponse( + json_encode([]), + [ + 'http_code' => Response::HTTP_UNAUTHORIZED, + ] + ), + // Bad request + new MockResponse( + json_encode([]), + [ + 'http_code' => Response::HTTP_BAD_REQUEST, + ] + ), + ]; + } +} From 52d628a55acc24380dc92b0baa3e35bbb683b89d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Wed, 1 Apr 2020 12:27:54 +0200 Subject: [PATCH 10/19] Added fake config parameters --- config/packages/test/parameters.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 config/packages/test/parameters.yaml diff --git a/config/packages/test/parameters.yaml b/config/packages/test/parameters.yaml new file mode 100644 index 0000000..c958a98 --- /dev/null +++ b/config/packages/test/parameters.yaml @@ -0,0 +1,4 @@ +parameters: + app.authorization_token: 'authorization_token' + app.opaque_id: 'opaque_id' + app.readid_endpoint: 'https://readid_endpoint' From e28e4799d68e46d74a7bd4a3d03af4835b06443d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Thu, 2 Apr 2020 09:11:59 +0200 Subject: [PATCH 11/19] Change assertions methods --- .../Infrastructure/Services/HttpReadIDConfigurationTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php b/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php index c5d59e1..0d8ca15 100644 --- a/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php +++ b/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php @@ -21,7 +21,7 @@ public function testGetAuthorizationToken(): void $configuration = new HttpReadIDConfiguration($params); $value = $configuration->authorizationToken(); - self::assertSame('authorization_token', $value); + $this->assertSame('authorization_token', $value); } public function testEndpoint(): void @@ -35,7 +35,7 @@ public function testEndpoint(): void $configuration = new HttpReadIDConfiguration($params); $value = $configuration->endpoint(); - self::assertSame('http://site.com', $value); + $this->assertSame('http://site.com', $value); } public function testCleanEndpoint(): void @@ -49,6 +49,6 @@ public function testCleanEndpoint(): void $configuration = new HttpReadIDConfiguration($params); $value = $configuration->endpoint(); - self::assertSame('http://site.com', $value); + $this->assertSame('http://site.com', $value); } } From ad7d53b9defe981760760935b2de6d062e23af60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Thu, 2 Apr 2020 09:46:52 +0200 Subject: [PATCH 12/19] Check base64 image input argument is valid --- .../InvalidReadySessionBase64ImageException.php | 15 +++++++++++++++ .../Model/ReadySessionBase64Image.php | 12 ++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/Domain/ReadySession/Exception/InvalidReadySessionBase64ImageException.php diff --git a/src/Domain/ReadySession/Exception/InvalidReadySessionBase64ImageException.php b/src/Domain/ReadySession/Exception/InvalidReadySessionBase64ImageException.php new file mode 100644 index 0000000..b215a87 --- /dev/null +++ b/src/Domain/ReadySession/Exception/InvalidReadySessionBase64ImageException.php @@ -0,0 +1,15 @@ +checkValidBase64Image($base64Image); + $this->value = $base64Image; } @@ -28,4 +33,11 @@ public function equals(ReadySessionBase64Image $other): bool { return $this->value === $other->value; } + + private function checkValidBase64Image(string $base64Image): void + { + if (!preg_match('/^data:image\/[^;]+;base64,/', $base64Image)) { + throw InvalidReadySessionBase64ImageException::becauseNoValidHeader(); + } + } } From 984d1cdd8a44f6c4d784b518fd0760eb13a948bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Thu, 2 Apr 2020 10:04:36 +0200 Subject: [PATCH 13/19] Check timestamp is valid with a guard --- .../InvalidReadySessionTimestampException.php | 15 +++++++++++++++ .../ReadySession/Model/ReadySessionTimestamp.php | 11 +++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/Domain/ReadySession/Exception/InvalidReadySessionTimestampException.php diff --git a/src/Domain/ReadySession/Exception/InvalidReadySessionTimestampException.php b/src/Domain/ReadySession/Exception/InvalidReadySessionTimestampException.php new file mode 100644 index 0000000..86f394d --- /dev/null +++ b/src/Domain/ReadySession/Exception/InvalidReadySessionTimestampException.php @@ -0,0 +1,15 @@ +checkValidTimestamp($timestamp); $this->value = $timestamp; } @@ -32,4 +32,11 @@ public function equals(ReadySessionTimestamp $other): bool { return $this->value === $other->value; } + + private function checkValidTimestamp(int $timestamp): void + { + if ($timestamp <= 0) { + throw InvalidReadySessionTimestampException::becauseShouldBeGreaterThanZero(); + } + } } From 49864e9f0cc19a92d0a6c4fa850e8480b8663458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Thu, 2 Apr 2020 10:09:31 +0200 Subject: [PATCH 14/19] Remove deprecated annotation expecting exception --- .../ReadySession/GetReadySessionQueryHandlerTest.php | 12 ++++++------ .../Services/HttpRequestReadySessionTest.php | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/Functional/Application/ReadySession/GetReadySessionQueryHandlerTest.php b/tests/Functional/Application/ReadySession/GetReadySessionQueryHandlerTest.php index 274e847..43af6a1 100644 --- a/tests/Functional/Application/ReadySession/GetReadySessionQueryHandlerTest.php +++ b/tests/Functional/Application/ReadySession/GetReadySessionQueryHandlerTest.php @@ -6,6 +6,8 @@ use StepupReadId\Application\ReadySession\GetReadySessionQuery; use StepupReadId\Application\ReadySession\GetReadySessionQueryHandler; +use StepupReadId\Domain\ReadySession\Exception\RequestReadySessionAuthorizationException; +use StepupReadId\Domain\ReadySession\Exception\RequestReadySessionBadRequestException; use StepupReadId\Domain\ReadySession\Model\ReadySession; use StepupReadId\Domain\ReadySession\Model\ReadySessionTTL; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; @@ -41,19 +43,17 @@ public function testRequestReadySession(): void $this->assertEquals($response->timestamp()->value(), 1234567890); } - /** - * @expectedException \StepupReadId\Domain\ReadySession\Exception\RequestReadySessionAuthorizationException - */ public function testUnauthorizedRequest(): void { + $this->expectException(RequestReadySessionAuthorizationException::class); + (static::$getReadySessionQueryHandler)(new GetReadySessionQuery(ReadySessionTTL::MINIMUM_TTL)); } - /** - * @expectedException \StepupReadId\Domain\ReadySession\Exception\RequestReadySessionBadRequestException - */ public function testBadRequest(): void { + $this->expectException(RequestReadySessionBadRequestException::class); + (static::$getReadySessionQueryHandler)(new GetReadySessionQuery(ReadySessionTTL::MINIMUM_TTL)); } diff --git a/tests/Unit/Infrastructure/Services/HttpRequestReadySessionTest.php b/tests/Unit/Infrastructure/Services/HttpRequestReadySessionTest.php index 6d88f43..4fe271c 100644 --- a/tests/Unit/Infrastructure/Services/HttpRequestReadySessionTest.php +++ b/tests/Unit/Infrastructure/Services/HttpRequestReadySessionTest.php @@ -5,6 +5,8 @@ namespace StepupReadId\Tests\Unit\Infrastructure\Services; use PHPUnit\Framework\TestCase; +use StepupReadId\Domain\ReadySession\Exception\RequestReadySessionAuthorizationException; +use StepupReadId\Domain\ReadySession\Exception\RequestReadySessionBadRequestException; use StepupReadId\Domain\ReadySession\Model\ReadySession; use StepupReadId\Domain\ReadySession\Model\ReadySessionBase64Image; use StepupReadId\Domain\ReadySession\Model\ReadySessionId; @@ -68,11 +70,10 @@ public function testReceiveRequest(): void ); } - /** - * @expectedException \StepupReadId\Domain\ReadySession\Exception\RequestReadySessionAuthorizationException - */ public function testUnauthorizedRequest(): void { + $this->expectException(RequestReadySessionAuthorizationException::class); + $this->response ->expects($this->exactly(1)) ->method('getStatusCode') @@ -84,11 +85,10 @@ public function testUnauthorizedRequest(): void ); } - /** - * @expectedException \StepupReadId\Domain\ReadySession\Exception\RequestReadySessionBadRequestException - */ public function testBadRequest(): void { + $this->expectException(RequestReadySessionBadRequestException::class); + $this->response ->expects($this->exactly(2)) ->method('getStatusCode') From ba15548c075e82dd430580c06d722f6f6c61ffa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Thu, 2 Apr 2020 10:20:51 +0200 Subject: [PATCH 15/19] Set ReadID server FQDN in parameters --- config/packages/parameters.yaml.dist | 2 +- config/packages/test/parameters.yaml | 2 +- .../Services/HttpReadIDConfiguration.php | 6 +++--- .../Services/HttpReadIDConfigurationTest.php | 20 +++---------------- 4 files changed, 8 insertions(+), 22 deletions(-) diff --git a/config/packages/parameters.yaml.dist b/config/packages/parameters.yaml.dist index 1c8dc9a..043c7d8 100644 --- a/config/packages/parameters.yaml.dist +++ b/config/packages/parameters.yaml.dist @@ -1,4 +1,4 @@ parameters: app.authorization_token: app.opaque_id: - app.readid_endpoint: + app.readid_server_fqdn: diff --git a/config/packages/test/parameters.yaml b/config/packages/test/parameters.yaml index c958a98..767406b 100644 --- a/config/packages/test/parameters.yaml +++ b/config/packages/test/parameters.yaml @@ -1,4 +1,4 @@ parameters: app.authorization_token: 'authorization_token' app.opaque_id: 'opaque_id' - app.readid_endpoint: 'https://readid_endpoint' + app.readid_server_fqdn: 'readid.server.com' diff --git a/src/Infrastructure/Services/HttpReadIDConfiguration.php b/src/Infrastructure/Services/HttpReadIDConfiguration.php index 6b8911f..9982eae 100644 --- a/src/Infrastructure/Services/HttpReadIDConfiguration.php +++ b/src/Infrastructure/Services/HttpReadIDConfiguration.php @@ -5,7 +5,7 @@ namespace StepupReadId\Infrastructure\Services; use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface; -use function rtrim; +use function sprintf; final class HttpReadIDConfiguration { @@ -13,7 +13,7 @@ final class HttpReadIDConfiguration private const OPAQUE_ID = 'app.opaque_id'; - private const READID_ENDPOINT = 'app.readid_endpoint'; + private const READID_SERVER_FQDN = 'app.readid_server_fqdn'; /** @var ContainerBagInterface */ private $params; @@ -35,6 +35,6 @@ public function opaqueId(): string public function endpoint(): string { - return rtrim($this->params->get(self::READID_ENDPOINT), '/'); + return sprintf('https://%s', $this->params->get(self::READID_SERVER_FQDN)); } } diff --git a/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php b/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php index 0d8ca15..2bb5ef4 100644 --- a/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php +++ b/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php @@ -30,25 +30,11 @@ public function testEndpoint(): void $params ->expects($this->exactly(1)) ->method('get') - ->with('app.readid_endpoint') - ->willReturn('http://site.com'); + ->with('app.readid_server_fqdn') + ->willReturn('site.com'); $configuration = new HttpReadIDConfiguration($params); $value = $configuration->endpoint(); - $this->assertSame('http://site.com', $value); - } - - public function testCleanEndpoint(): void - { - $params = $this->getMockBuilder(ContainerBagInterface::class)->getMock(); - $params - ->expects($this->exactly(1)) - ->method('get') - ->with('app.readid_endpoint') - ->willReturn('http://site.com/'); - - $configuration = new HttpReadIDConfiguration($params); - $value = $configuration->endpoint(); - $this->assertSame('http://site.com', $value); + $this->assertSame('https://site.com', $value); } } From 19abb99280dda61d59e2c2c35e265a62d03c57b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Thu, 2 Apr 2020 12:57:46 +0200 Subject: [PATCH 16/19] Inject parameters in HttpReadIDConfiguration --- config/services.yaml | 6 +++ .../Services/HttpReadIDClient.php | 8 +++- .../Services/HttpReadIDConfiguration.php | 33 +++++++-------- .../Services/HttpReadIDConfigurationTest.php | 40 ------------------- 4 files changed, 28 insertions(+), 59 deletions(-) delete mode 100644 tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php diff --git a/config/services.yaml b/config/services.yaml index 9c56050..9e60226 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -39,3 +39,9 @@ services: autoconfigure: false tags: - { name: messenger.message_handler, bus: query.bus } + + StepupReadId\Infrastructure\Services\HttpReadIDConfiguration: + arguments: + - '%app.authorization_token%' + - '%app.opaque_id%' + - '%app.readid_server_fqdn%' diff --git a/src/Infrastructure/Services/HttpReadIDClient.php b/src/Infrastructure/Services/HttpReadIDClient.php index 07f5933..d89bca5 100644 --- a/src/Infrastructure/Services/HttpReadIDClient.php +++ b/src/Infrastructure/Services/HttpReadIDClient.php @@ -6,6 +6,7 @@ use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; +use function sprintf; final class HttpReadIDClient implements HttpReadIDClientInterface { @@ -26,7 +27,7 @@ public function createReadySession(int $ttl): ResponseInterface { return $this->client->request( 'POST', - $this->readIDConfiguration->endpoint() . self::CREATE_READY_SESSION_ENDPOINT_PATH, + $this->getEndpoint(self::CREATE_READY_SESSION_ENDPOINT_PATH), [ 'headers' => $this->getHeaders(), 'json' => [ @@ -37,6 +38,11 @@ public function createReadySession(int $ttl): ResponseInterface ); } + private function getEndpoint(string $path): string + { + return sprintf('https://%s/%s', $this->readIDConfiguration->readIdServerFqdn(), $path); + } + /** * @return array */ diff --git a/src/Infrastructure/Services/HttpReadIDConfiguration.php b/src/Infrastructure/Services/HttpReadIDConfiguration.php index 9982eae..0a9d104 100644 --- a/src/Infrastructure/Services/HttpReadIDConfiguration.php +++ b/src/Infrastructure/Services/HttpReadIDConfiguration.php @@ -4,37 +4,34 @@ namespace StepupReadId\Infrastructure\Services; -use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface; -use function sprintf; - final class HttpReadIDConfiguration { - private const AUTHORIZATION_TOKEN = 'app.authorization_token'; - - private const OPAQUE_ID = 'app.opaque_id'; - - private const READID_SERVER_FQDN = 'app.readid_server_fqdn'; - - /** @var ContainerBagInterface */ - private $params; - - public function __construct(ContainerBagInterface $params) + /** @var string */ + private $authorizationToken; + /** @var string */ + private $opaqueId; + /** @var string */ + private $readIdServerFqdn; + + public function __construct(string $authorizationToken, string $opaqueId, string $readIdServerFqdn) { - $this->params = $params; + $this->authorizationToken = $authorizationToken; + $this->opaqueId = $opaqueId; + $this->readIdServerFqdn = $readIdServerFqdn; } public function authorizationToken(): string { - return $this->params->get(self::AUTHORIZATION_TOKEN); + return $this->authorizationToken; } public function opaqueId(): string { - return $this->params->get(self::OPAQUE_ID); + return $this->opaqueId; } - public function endpoint(): string + public function readIdServerFqdn(): string { - return sprintf('https://%s', $this->params->get(self::READID_SERVER_FQDN)); + return $this->readIdServerFqdn; } } diff --git a/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php b/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php deleted file mode 100644 index 2bb5ef4..0000000 --- a/tests/Unit/Infrastructure/Services/HttpReadIDConfigurationTest.php +++ /dev/null @@ -1,40 +0,0 @@ -getMockBuilder(ContainerBagInterface::class)->getMock(); - $params - ->expects($this->exactly(1)) - ->method('get') - ->with('app.authorization_token') - ->willReturn('authorization_token'); - - $configuration = new HttpReadIDConfiguration($params); - $value = $configuration->authorizationToken(); - $this->assertSame('authorization_token', $value); - } - - public function testEndpoint(): void - { - $params = $this->getMockBuilder(ContainerBagInterface::class)->getMock(); - $params - ->expects($this->exactly(1)) - ->method('get') - ->with('app.readid_server_fqdn') - ->willReturn('site.com'); - - $configuration = new HttpReadIDConfiguration($params); - $value = $configuration->endpoint(); - $this->assertSame('https://site.com', $value); - } -} From 62cd3375d4831a0eb4dcb551a83bfe8622714c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Fri, 3 Apr 2020 11:53:16 +0200 Subject: [PATCH 17/19] Read configuration parameters from environment --- .env.test | 6 ++++ config/packages/parameters.yaml.dist | 4 --- config/packages/test/parameters.yaml | 4 --- config/services.yaml | 6 ++-- .../Services/HttpReadIDConfiguration.php | 30 +++++++++++++++++++ 5 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 .env.test delete mode 100644 config/packages/parameters.yaml.dist delete mode 100644 config/packages/test/parameters.yaml diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..3b74431 --- /dev/null +++ b/.env.test @@ -0,0 +1,6 @@ +KERNEL_CLASS='StepupReadId\Kernel' +APP_ENV=dev +APP_SECRET=secret +APP_AUTHORIZATION_TOKEN=authorization_token +APP_OPAQUE_ID=opaque_id +APP_READID_SERVER_FQDN=readid.server.com diff --git a/config/packages/parameters.yaml.dist b/config/packages/parameters.yaml.dist deleted file mode 100644 index 043c7d8..0000000 --- a/config/packages/parameters.yaml.dist +++ /dev/null @@ -1,4 +0,0 @@ -parameters: - app.authorization_token: - app.opaque_id: - app.readid_server_fqdn: diff --git a/config/packages/test/parameters.yaml b/config/packages/test/parameters.yaml deleted file mode 100644 index 767406b..0000000 --- a/config/packages/test/parameters.yaml +++ /dev/null @@ -1,4 +0,0 @@ -parameters: - app.authorization_token: 'authorization_token' - app.opaque_id: 'opaque_id' - app.readid_server_fqdn: 'readid.server.com' diff --git a/config/services.yaml b/config/services.yaml index 9e60226..497dc0d 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -42,6 +42,6 @@ services: StepupReadId\Infrastructure\Services\HttpReadIDConfiguration: arguments: - - '%app.authorization_token%' - - '%app.opaque_id%' - - '%app.readid_server_fqdn%' + - '%env(resolve:APP_AUTHORIZATION_TOKEN)%' + - '%env(resolve:APP_OPAQUE_ID)%' + - '%env(resolve:APP_READID_SERVER_FQDN)%' diff --git a/src/Infrastructure/Services/HttpReadIDConfiguration.php b/src/Infrastructure/Services/HttpReadIDConfiguration.php index 0a9d104..6675044 100644 --- a/src/Infrastructure/Services/HttpReadIDConfiguration.php +++ b/src/Infrastructure/Services/HttpReadIDConfiguration.php @@ -4,6 +4,11 @@ namespace StepupReadId\Infrastructure\Services; +use InvalidArgumentException; +use function filter_var; +use const FILTER_FLAG_HOSTNAME; +use const FILTER_VALIDATE_DOMAIN; + final class HttpReadIDConfiguration { /** @var string */ @@ -15,6 +20,10 @@ final class HttpReadIDConfiguration public function __construct(string $authorizationToken, string $opaqueId, string $readIdServerFqdn) { + $this->checkValidAuthorizationToken($authorizationToken); + $this->checkValidOpaqueId($opaqueId); + $this->checkValidHostName($readIdServerFqdn); + $this->authorizationToken = $authorizationToken; $this->opaqueId = $opaqueId; $this->readIdServerFqdn = $readIdServerFqdn; @@ -34,4 +43,25 @@ public function readIdServerFqdn(): string { return $this->readIdServerFqdn; } + + private function checkValidAuthorizationToken(string $authorizationToken): void + { + if (empty($authorizationToken)) { + throw new InvalidArgumentException('Authorization token can not be empty'); + } + } + + private function checkValidOpaqueId(string $opaqueId): void + { + if (empty($opaqueId)) { + throw new InvalidArgumentException('Opaque ID can not be empty'); + } + } + + private function checkValidHostName(string $readIdServerFqdn): void + { + if (!filter_var($readIdServerFqdn, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME)) { + throw new InvalidArgumentException("Invalid hostname: '$readIdServerFqdn'"); + } + } } From b4bf03d9fbce0cf4024e7dfb5e763bc1fbd8b7d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Fri, 3 Apr 2020 12:02:31 +0200 Subject: [PATCH 18/19] Improve the readability of GetReadySessionQueryHandlerTest --- .../ReadySession/GetReadySessionQueryHandlerTest.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/Functional/Application/ReadySession/GetReadySessionQueryHandlerTest.php b/tests/Functional/Application/ReadySession/GetReadySessionQueryHandlerTest.php index 43af6a1..e07d5e0 100644 --- a/tests/Functional/Application/ReadySession/GetReadySessionQueryHandlerTest.php +++ b/tests/Functional/Application/ReadySession/GetReadySessionQueryHandlerTest.php @@ -34,7 +34,8 @@ public static function setUpBeforeClass(): void public function testRequestReadySession(): void { - $response = (static::$getReadySessionQueryHandler)(new GetReadySessionQuery(ReadySessionTTL::MINIMUM_TTL)); + $getReadySessionQuery = new GetReadySessionQuery(ReadySessionTTL::MINIMUM_TTL); + $response = static::$getReadySessionQueryHandler->__invoke($getReadySessionQuery); $this->assertInstanceOf(ReadySession::class, $response); $this->assertEquals($response->id()->value(), 'a0577ea3-1b40-433a-ad18-726c2a5378ad'); @@ -47,14 +48,16 @@ public function testUnauthorizedRequest(): void { $this->expectException(RequestReadySessionAuthorizationException::class); - (static::$getReadySessionQueryHandler)(new GetReadySessionQuery(ReadySessionTTL::MINIMUM_TTL)); + $getReadySessionQuery = new GetReadySessionQuery(ReadySessionTTL::MINIMUM_TTL); + static::$getReadySessionQueryHandler->__invoke($getReadySessionQuery); } public function testBadRequest(): void { $this->expectException(RequestReadySessionBadRequestException::class); - (static::$getReadySessionQueryHandler)(new GetReadySessionQuery(ReadySessionTTL::MINIMUM_TTL)); + $getReadySessionQuery = new GetReadySessionQuery(ReadySessionTTL::MINIMUM_TTL); + static::$getReadySessionQueryHandler->__invoke($getReadySessionQuery); } /** From 2ac9a0b1aa172c5cde469062b31db106f9d5a0b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20G=C3=B3mez?= Date: Fri, 3 Apr 2020 12:03:24 +0200 Subject: [PATCH 19/19] Fix code style --- src/Infrastructure/Services/HttpReadIDConfiguration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Infrastructure/Services/HttpReadIDConfiguration.php b/src/Infrastructure/Services/HttpReadIDConfiguration.php index 6675044..ef243db 100644 --- a/src/Infrastructure/Services/HttpReadIDConfiguration.php +++ b/src/Infrastructure/Services/HttpReadIDConfiguration.php @@ -61,7 +61,7 @@ private function checkValidOpaqueId(string $opaqueId): void private function checkValidHostName(string $readIdServerFqdn): void { if (!filter_var($readIdServerFqdn, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME)) { - throw new InvalidArgumentException("Invalid hostname: '$readIdServerFqdn'"); + throw new InvalidArgumentException('Invalid hostname: \'$readIdServerFqdn\''); } } }