diff --git a/.env b/.env index c13b453..f98db64 100644 --- a/.env +++ b/.env @@ -24,3 +24,8 @@ SENTRY_DSN= # docker-compose PHP_FPM_PORT=9000 APP_LOCAL_PATH=/var/www/magnetico-web/current + +###> symfony/mailer ### +MAILER_DSN=smtp://localhost +MAILER_FROM=no-reply@magnetico-web.tld +###< symfony/mailer ### diff --git a/composer.json b/composer.json index d754da4..737d6a6 100644 --- a/composer.json +++ b/composer.json @@ -12,17 +12,19 @@ ], "type": "project", "require": { - "php": "^7.2.0", + "php": "^7.3.0", "ext-ctype": "*", + "ext-hash": "*", "ext-iconv": "*", "sensio/framework-extra-bundle": "^5.1", - "sentry/sentry-symfony": "^2.2", "symfony/console": "^4.1", "symfony/dotenv": "^4.1", "symfony/expression-language": "^4.1", "symfony/flex": "^1.0", "symfony/form": "^4.1", "symfony/framework-bundle": "^4.1", + "symfony/http-client": "^4.1", + "symfony/mailer": "^4.1", "symfony/monolog-bundle": "^3.3", "symfony/orm-pack": "^1.0", "symfony/security-bundle": "^4.1", diff --git a/composer.lock b/composer.lock index 4a20c1d..8772b34 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": "affcef344df6ac8f86b6f1ab41e04968", + "content-hash": "d200c2a87d96fe3ba6edb03246159fa7", "packages": [ { "name": "doctrine/annotations", @@ -1147,6 +1147,63 @@ ], "time": "2020-01-08T19:53:19+00:00" }, + { + "name": "egulias/email-validator", + "version": "2.1.14", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "c4b8d12921999d8a561004371701dbc2e05b5ece" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/c4b8d12921999d8a561004371701dbc2e05b5ece", + "reference": "c4b8d12921999d8a561004371701dbc2e05b5ece", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "EmailValidator" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2020-01-05T14:11:20+00:00" + }, { "name": "jdorn/sql-formatter", "version": "v1.2.17", @@ -1197,57 +1254,6 @@ ], "time": "2014-01-12T16:20:24+00:00" }, - { - "name": "jean85/pretty-package-versions", - "version": "1.2", - "source": { - "type": "git", - "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/75c7effcf3f77501d0e0caa75111aff4daa0dd48", - "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48", - "shasum": "" - }, - "require": { - "ocramius/package-versions": "^1.2.0", - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Jean85\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "A wrapper for ocramius/package-versions to get pretty versions strings", - "keywords": [ - "composer", - "package", - "release", - "versions" - ], - "time": "2018-06-13T13:22:40+00:00" - }, { "name": "laminas/laminas-code", "version": "3.4.1", @@ -2067,139 +2073,6 @@ ], "time": "2019-12-27T08:57:19+00:00" }, - { - "name": "sentry/sentry", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-php.git", - "reference": "b2b8ffe1560b9fb0110b02993594a4b04a511959" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/b2b8ffe1560b9fb0110b02993594a4b04a511959", - "reference": "b2b8ffe1560b9fb0110b02993594a4b04a511959", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "php": "^5.3|^7.0" - }, - "conflict": { - "raven/raven": "*" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^1.8.0", - "monolog/monolog": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7" - }, - "suggest": { - "ext-hash": "*", - "ext-json": "*", - "ext-mbstring": "*", - "monolog/monolog": "Automatically capture Monolog events as breadcrumbs" - }, - "bin": [ - "bin/sentry" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10.x-dev" - } - }, - "autoload": { - "psr-0": { - "Raven_": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "David Cramer", - "email": "dcramer@gmail.com" - } - ], - "description": "A PHP client for Sentry (http://getsentry.com)", - "homepage": "http://getsentry.com", - "keywords": [ - "log", - "logging" - ], - "time": "2018-11-09T12:27:19+00:00" - }, - { - "name": "sentry/sentry-symfony", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-symfony.git", - "reference": "a403d28f94c26bb3d1ed716d2522749625d62893" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/a403d28f94c26bb3d1ed716d2522749625d62893", - "reference": "a403d28f94c26bb3d1ed716d2522749625d62893", - "shasum": "" - }, - "require": { - "jean85/pretty-package-versions": "^1.0", - "php": "^7.1", - "sentry/sentry": "^1.9", - "symfony/config": "^3.0||^4.0", - "symfony/console": "^3.3||^4.0", - "symfony/dependency-injection": "^3.0||^4.0", - "symfony/event-dispatcher": "^3.0||^4.0", - "symfony/http-kernel": "^3.0||^4.0", - "symfony/security-core": "^3.0||^4.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.8", - "phpstan/phpstan": "^0.10", - "phpstan/phpstan-phpunit": "^0.10", - "phpunit/phpunit": "^7", - "scrutinizer/ocular": "^1.4", - "symfony/expression-language": "^3.0||^4.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "master": "2.1.x-dev", - "releases/1.x": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Sentry\\SentryBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "David Cramer", - "email": "dcramer@gmail.com" - }, - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "Symfony integration for Sentry (http://getsentry.com)", - "homepage": "http://getsentry.com", - "keywords": [ - "errors", - "logging", - "sentry", - "symfony" - ], - "time": "2019-01-28T09:23:48+00:00" - }, { "name": "symfony/cache", "version": "v5.0.2", @@ -2339,32 +2212,32 @@ }, { "name": "symfony/config", - "version": "v4.4.2", + "version": "v5.0.2", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "6911d432edd5b50822986604fd5a5be3af856d30" + "reference": "7f930484966350906185ba0a604728f7898b7ba0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/6911d432edd5b50822986604fd5a5be3af856d30", - "reference": "6911d432edd5b50822986604fd5a5be3af856d30", + "url": "https://api.github.com/repos/symfony/config/zipball/7f930484966350906185ba0a604728f7898b7ba0", + "reference": "7f930484966350906185ba0a604728f7898b7ba0", "shasum": "" }, "require": { - "php": "^7.1.3", - "symfony/filesystem": "^3.4|^4.0|^5.0", + "php": "^7.2.5", + "symfony/filesystem": "^4.4|^5.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<3.4" + "symfony/finder": "<4.4" }, "require-dev": { - "symfony/event-dispatcher": "^3.4|^4.0|^5.0", - "symfony/finder": "^3.4|^4.0|^5.0", - "symfony/messenger": "^4.1|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/yaml": "^4.4|^5.0" }, "suggest": { "symfony/yaml": "To use the yaml reference dumper" @@ -2372,7 +2245,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2399,7 +2272,7 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2019-12-18T12:00:29+00:00" + "time": "2019-12-18T13:50:31+00:00" }, { "name": "symfony/console", @@ -2535,37 +2408,37 @@ }, { "name": "symfony/dependency-injection", - "version": "v4.4.2", + "version": "v5.0.2", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "79b0358207a3571cc3af02a57d0321927921f539" + "reference": "f9dbfbf487d08f60b1c83220edcd16559d1e40a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/79b0358207a3571cc3af02a57d0321927921f539", - "reference": "79b0358207a3571cc3af02a57d0321927921f539", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f9dbfbf487d08f60b1c83220edcd16559d1e40a2", + "reference": "f9dbfbf487d08f60b1c83220edcd16559d1e40a2", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": "^7.2.5", "psr/container": "^1.0", "symfony/service-contracts": "^1.1.6|^2" }, "conflict": { - "symfony/config": "<4.3|>=5.0", - "symfony/finder": "<3.4", - "symfony/proxy-manager-bridge": "<3.4", - "symfony/yaml": "<3.4" + "symfony/config": "<5.0", + "symfony/finder": "<4.4", + "symfony/proxy-manager-bridge": "<4.4", + "symfony/yaml": "<4.4" }, "provide": { "psr/container-implementation": "1.0", "symfony/service-implementation": "1.0" }, "require-dev": { - "symfony/config": "^4.3", - "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/config": "^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" }, "suggest": { "symfony/config": "", @@ -2577,7 +2450,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2604,7 +2477,7 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2019-12-19T16:00:02+00:00" + "time": "2019-12-19T16:01:11+00:00" }, { "name": "symfony/doctrine-bridge", @@ -3355,6 +3228,131 @@ "homepage": "https://symfony.com", "time": "2019-12-17T08:15:02+00:00" }, + { + "name": "symfony/http-client", + "version": "v4.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "9ebfc77b5018a05226b38642def82746f3e2ce0f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/9ebfc77b5018a05226b38642def82746f3e2ce0f", + "reference": "9ebfc77b5018a05226b38642def82746f3e2ce0f", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "^1.0", + "symfony/http-client-contracts": "^1.1.8|^2", + "symfony/polyfill-php73": "^1.11", + "symfony/service-contracts": "^1.0|^2" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "1.1" + }, + "require-dev": { + "guzzlehttp/promises": "^1.3.1", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^4.3|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/process": "^4.2|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpClient component", + "homepage": "https://symfony.com", + "time": "2019-12-19T15:57:49+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "378868b61b85c5cac6822d4f84e26999c9f2e881" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/378868b61b85c5cac6822d4f84e26999c9f2e881", + "reference": "378868b61b85c5cac6822d4f84e26999c9f2e881", + "shasum": "" + }, + "require": { + "php": "^7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-11-26T23:25:11+00:00" + }, { "name": "symfony/http-foundation", "version": "v5.0.2", @@ -3633,6 +3631,74 @@ ], "time": "2019-11-26T23:25:11+00:00" }, + { + "name": "symfony/mailer", + "version": "v4.4.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "1e6e1d074be84eab728b617aa08349b8a00b6f44" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/1e6e1d074be84eab728b617aa08349b8a00b6f44", + "reference": "1e6e1d074be84eab728b617aa08349b8a00b6f44", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10", + "php": "^7.1.3", + "psr/log": "~1.0", + "symfony/event-dispatcher": "^4.3", + "symfony/mime": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/http-kernel": "<4.4", + "symfony/sendgrid-mailer": "<4.4" + }, + "require-dev": { + "symfony/amazon-mailer": "^4.4|^5.0", + "symfony/google-mailer": "^4.4|^5.0", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/mailchimp-mailer": "^4.4|^5.0", + "symfony/mailgun-mailer": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/postmark-mailer": "^4.4|^5.0", + "symfony/sendgrid-mailer": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Mailer Component", + "homepage": "https://symfony.com", + "time": "2019-12-02T16:18:01+00:00" + }, { "name": "symfony/mime", "version": "v5.0.2", @@ -5899,6 +5965,1266 @@ } ], "packages-dev": [ + { + "name": "clue/stream-filter", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/clue/php-stream-filter.git", + "reference": "5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/php-stream-filter/zipball/5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71", + "reference": "5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^5.0 || ^4.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\StreamFilter\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@lueck.tv" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/php-stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "time": "2019-04-09T12:31:48+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "43ece0e75098b7ecd8d13918293029e555a50f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82", + "reference": "43ece0e75098b7ecd8d13918293029e555a50f82", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2019-12-23T11:57:10+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2019-07-01T23:21:34+00:00" + }, + { + "name": "http-interop/http-factory-guzzle", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/http-interop/http-factory-guzzle.git", + "reference": "34861658efb9899a6618cef03de46e2a52c80fc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/34861658efb9899a6618cef03de46e2a52c80fc0", + "reference": "34861658efb9899a6618cef03de46e2a52c80fc0", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.4.2", + "psr/http-factory": "^1.0" + }, + "provide": { + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.5", + "phpunit/phpunit": "^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Factory\\Guzzle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "An HTTP Factory using Guzzle PSR7", + "keywords": [ + "factory", + "http", + "psr-17", + "psr-7" + ], + "time": "2018-07-31T19:32:56+00:00" + }, + { + "name": "jean85/pretty-package-versions", + "version": "1.2", + "source": { + "type": "git", + "url": "https://github.com/Jean85/pretty-package-versions.git", + "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/75c7effcf3f77501d0e0caa75111aff4daa0dd48", + "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48", + "shasum": "" + }, + "require": { + "ocramius/package-versions": "^1.2.0", + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Jean85\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "A wrapper for ocramius/package-versions to get pretty versions strings", + "keywords": [ + "composer", + "package", + "release", + "versions" + ], + "time": "2018-06-13T13:22:40+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "time": "2018-07-02T15:55:56+00:00" + }, + { + "name": "php-http/client-common", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/client-common.git", + "reference": "a8b29678d61556f45d6236b1667db16d998ceec5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/client-common/zipball/a8b29678d61556f45d6236b1667db16d998ceec5", + "reference": "a8b29678d61556f45d6236b1667db16d998ceec5", + "shasum": "" + }, + "require": { + "php": "^7.1", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "php-http/message-factory": "^1.0", + "symfony/options-resolver": " ^3.4.20 || ~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0" + }, + "require-dev": { + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "phpspec/phpspec": "^5.1", + "phpspec/prophecy": "^1.8", + "sebastian/comparator": "^3.0" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\Common\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "common", + "http", + "httplug" + ], + "time": "2019-11-18T08:58:18+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.7.4", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "82dbef649ccffd8e4f22e1953c3a5265992b83c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82dbef649ccffd8e4f22e1953c3a5265992b83c0", + "reference": "82dbef649ccffd8e4f22e1953c3a5265992b83c0", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "conflict": { + "nyholm/psr7": "<1.0" + }, + "require-dev": { + "akeneo/phpspec-skip-example-extension": "^4.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1", + "puli/composer-plugin": "1.0.0-beta10" + }, + "suggest": { + "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories", + "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds installed HTTPlug implementations and PSR-7 message factories", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr7" + ], + "time": "2020-01-03T11:25:47+00:00" + }, + { + "name": "php-http/guzzle6-adapter", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/guzzle6-adapter.git", + "reference": "6074a4b1f4d5c21061b70bab3b8ad484282fe31f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/guzzle6-adapter/zipball/6074a4b1f4d5c21061b70bab3b8ad484282fe31f", + "reference": "6074a4b1f4d5c21061b70bab3b8ad484282fe31f", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0", + "php": "^7.1", + "php-http/httplug": "^2.0", + "psr/http-client": "^1.0" + }, + "provide": { + "php-http/async-client-implementation": "1.0", + "php-http/client-implementation": "1.0", + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "php-http/client-integration-tests": "^2.0", + "phpunit/phpunit": "^7.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Adapter\\Guzzle6\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "David de Boer", + "email": "david@ddeboer.nl" + } + ], + "description": "Guzzle 6 HTTP Adapter", + "homepage": "http://httplug.io", + "keywords": [ + "Guzzle", + "http" + ], + "time": "2018-12-16T14:44:03+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "72d2b129a48f0490d55b7f89be0d6aa0597ffb06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/72d2b129a48f0490d55b7f89be0d6aa0597ffb06", + "reference": "72d2b129a48f0490d55b7f89be0d6aa0597ffb06", + "shasum": "" + }, + "require": { + "php": "^7.0", + "php-http/promise": "^1.0", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1", + "phpspec/phpspec": "^4.3.4|^5.0|^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "time": "2019-12-27T10:07:11+00:00" + }, + { + "name": "php-http/message", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "ce8f43ac1e294b54aabf5808515c3554a19c1e1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/ce8f43ac1e294b54aabf5808515c3554a19c1e1c", + "reference": "ce8f43ac1e294b54aabf5808515c3554a19c1e1c", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.4", + "php": "^7.1", + "php-http/message-factory": "^1.0.2", + "psr/http-message": "^1.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "akeneo/phpspec-skip-example-extension": "^1.0", + "coduo/phpspec-data-provider-extension": "^1.0", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0", + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4", + "slim/slim": "^3.0", + "zendframework/zend-diactoros": "^1.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation", + "zendframework/zend-diactoros": "Used with Diactoros Factories" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + }, + "files": [ + "src/filters.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", + "keywords": [ + "http", + "message", + "psr-7" + ], + "time": "2019-08-05T06:55:08+00:00" + }, + { + "name": "php-http/message-factory", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "time": "2015-12-19T14:08:53+00:00" + }, + { + "name": "php-http/promise", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/dc494cdc9d7160b9a09bd5573272195242ce7980", + "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980", + "shasum": "" + }, + "require-dev": { + "henrikbjorn/phpspec-code-coverage": "^1.0", + "phpspec/phpspec": "^2.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + }, + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "time": "2016-01-26T13:27:02+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "496a823ef742b632934724bf769560c2a5c7c44e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/496a823ef742b632934724bf769560c2a5c7c44e", + "reference": "496a823ef742b632934724bf769560c2a5c7c44e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "time": "2018-10-30T23:29:13+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "sentry/sdk", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php-sdk.git", + "reference": "18921af9c2777517ef9fb480845c22a98554d6af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/18921af9c2777517ef9fb480845c22a98554d6af", + "reference": "18921af9c2777517ef9fb480845c22a98554d6af", + "shasum": "" + }, + "require": { + "http-interop/http-factory-guzzle": "^1.0", + "php-http/guzzle6-adapter": "^1.1|^2.0", + "sentry/sentry": "^2.3" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "This is a metapackage shipping sentry/sentry with a recommended http client.", + "time": "2020-01-08T19:16:29+00:00" + }, + { + "name": "sentry/sentry", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-php.git", + "reference": "335bd24c4a817efdb7c3ec83ca42321a7761df6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/335bd24c4a817efdb7c3ec83ca42321a7761df6a", + "reference": "335bd24c4a817efdb7c3ec83ca42321a7761df6a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/promises": "^1.3", + "guzzlehttp/psr7": "^1.6", + "jean85/pretty-package-versions": "^1.2", + "php": "^7.1", + "php-http/async-client-implementation": "^1.0", + "php-http/client-common": "^1.5|^2.0", + "php-http/discovery": "^1.6.1", + "php-http/httplug": "^1.1|^2.0", + "php-http/message": "^1.5", + "psr/http-message-implementation": "^1.0", + "symfony/options-resolver": "^2.7|^3.0|^4.0|^5.0", + "symfony/polyfill-uuid": "^1.13.1" + }, + "conflict": { + "php-http/client-common": "1.8.0", + "raven/raven": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.13", + "monolog/monolog": "^1.3|^2.0", + "php-http/mock-client": "^1.3", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpunit/phpunit": "^7.5.18", + "symfony/phpunit-bridge": "^4.3|^5.0", + "vimeo/psalm": "^3.4" + }, + "suggest": { + "monolog/monolog": "Allow sending log messages to Sentry by using the included Monolog handler." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Sentry\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sentry", + "email": "accounts@sentry.io" + } + ], + "description": "A PHP SDK for Sentry (http://sentry.io)", + "homepage": "http://sentry.io", + "keywords": [ + "crash-reporting", + "crash-reports", + "error-handler", + "error-monitoring", + "log", + "logging", + "sentry" + ], + "time": "2020-01-08T11:27:08+00:00" + }, + { + "name": "sentry/sentry-symfony", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/getsentry/sentry-symfony.git", + "reference": "3a9c2669969604c362cc63ba8fa118d9a00ac711" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/3a9c2669969604c362cc63ba8fa118d9a00ac711", + "reference": "3a9c2669969604c362cc63ba8fa118d9a00ac711", + "shasum": "" + }, + "require": { + "jean85/pretty-package-versions": "^1.0", + "ocramius/package-versions": "^1.3.0", + "php": "^7.1", + "sentry/sdk": "^2.0", + "symfony/config": "^3.4||^4.0||^5.0", + "symfony/console": "^3.4||^4.0||^5.0", + "symfony/dependency-injection": "^3.4||^4.0||^5.0", + "symfony/event-dispatcher": "^3.4||^4.0||^5.0", + "symfony/http-kernel": "^3.4||^4.0||^5.0", + "symfony/security-core": "^3.4||^4.0||^5.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.8", + "jangregor/phpstan-prophecy": "^0.3.0", + "monolog/monolog": "^1.11||^2.0", + "php-http/mock-client": "^1.0", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.5||^8.5", + "symfony/browser-kit": "^3.4||^4.0||^5.0", + "symfony/expression-language": "^3.4||^4.0||^5.0", + "symfony/framework-bundle": "^3.4||^4.0||^5.0", + "symfony/monolog-bundle": "^3.4", + "symfony/phpunit-bridge": "^5.0", + "symfony/yaml": "^3.4||^4.0||^5.0" + }, + "suggest": { + "monolog/monolog": "Required to use the Monolog handler" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "master": "3.x-dev", + "releases/3.2.x": "3.2.x-dev", + "releases/2.x": "2.x-dev", + "releases/1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sentry\\SentryBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "David Cramer", + "email": "dcramer@gmail.com" + }, + { + "name": "Alessandro Lai", + "email": "alessandro.lai85@gmail.com" + } + ], + "description": "Symfony integration for Sentry (http://getsentry.com)", + "homepage": "http://getsentry.com", + "keywords": [ + "errors", + "logging", + "sentry", + "symfony" + ], + "time": "2020-01-16T08:45:03+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "7d4215b6944add5073f0ec313a21e1bc2520520d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/7d4215b6944add5073f0ec313a21e1bc2520520d", + "reference": "7d4215b6944add5073f0ec313a21e1bc2520520d", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "time": "2019-11-30T08:58:35+00:00" + }, { "name": "symfony/web-profiler-bundle", "version": "v4.4.2", @@ -5970,8 +7296,9 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^7.2.0", + "php": "^7.3.0", "ext-ctype": "*", + "ext-hash": "*", "ext-iconv": "*" }, "platform-dev": [] diff --git a/config/packages/mailer.yaml b/config/packages/mailer.yaml new file mode 100644 index 0000000..56a650d --- /dev/null +++ b/config/packages/mailer.yaml @@ -0,0 +1,3 @@ +framework: + mailer: + dsn: '%env(MAILER_DSN)%' diff --git a/config/packages/prod/monolog.yaml b/config/packages/prod/monolog.yaml index 90e1a4c..9221a8d 100644 --- a/config/packages/prod/monolog.yaml +++ b/config/packages/prod/monolog.yaml @@ -15,3 +15,6 @@ monolog: type: console process_psr_3_messages: false channels: ["!event", "!doctrine"] + sentry: + type: service + id: Sentry\Monolog\Handler diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 27c3c69..7c1819f 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -26,10 +26,10 @@ security: anonymous: ~ provider: default_provider form_login: - login_path: user_login - check_path: user_login + login_path: user_auth_login + check_path: user_auth_login logout: - path: user_logout + path: user_auth_logout target: / remember_me: secret: '%kernel.secret%' @@ -44,7 +44,7 @@ security: - { path: ^/api/v1/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/api/, roles: ROLE_USER } - { path: ^/$, roles: IS_AUTHENTICATED_ANONYMOUSLY } - - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } + - { path: ^/auth/, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/register/, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/magnet/, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/, roles: ROLE_USER } diff --git a/config/packages/sentry.yaml b/config/packages/sentry.yaml index e94da2d..689df9a 100644 --- a/config/packages/sentry.yaml +++ b/config/packages/sentry.yaml @@ -1,8 +1,11 @@ sentry: options: - curl_method: async - -# skip_capture: # To skip certain exceptions, specify a list below -# - 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' -# - 'Symfony\Component\HttpKernel\Exception\BadRequestHttpException' -# - 'Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException' + send_default_pii: true + excluded_exceptions: + - 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' + - 'Symfony\Component\HttpKernel\Exception\BadRequestHttpException' + - 'Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException' + monolog: + error_handler: + enabled: true + level: error diff --git a/config/routes.yaml b/config/routes.yaml index 6b1edf1..4ec8c20 100644 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -26,25 +26,33 @@ magnet_redirect: infoHash: '[0-9a-fA-F]{40}' user_register: - path: /register/{inviteCode} + path: /register/{code} controller: App\Controller\UserController::register requirements: method: GET inviteCode: \w{32} +user_reset_request: + path: /auth/reset/request + controller: App\Controller\UserController::requestReset + +user_reset: + path: /auth/reset/{code} + controller: App\Controller\UserController::reset + +user_auth_login: + path: /auth/login + controller: App\Controller\SecurityController::login + +user_auth_logout: + path: /auth/logout + user_account_invites: path: /account/invites controller: App\Controller\AccountController::invites requirements: method: GET -user_login: - path: /login - controller: App\Controller\SecurityController::login - -user_logout: - path: /logout - # API api_v1_login: path: /api/v1/login diff --git a/config/services.yaml b/config/services.yaml index ec9b802..9fff03b 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -3,7 +3,7 @@ parameters: locale: 'en' env(TRACKER_LIST_FILE): '%kernel.project_dir%/config/public_trackers.json' - env(NEW_USER_INVITES): 10 + env(NEW_USER_INVITES): '10' services: # default configuration for services in *this* file @@ -16,6 +16,7 @@ services: bind: $publicTrackers: '%env(json:file:resolve:TRACKER_LIST_FILE)%' $newUserInvites: '%env(NEW_USER_INVITES)%' + $fromAddress: '%env(MAILER_FROM)%' App\: resource: '../src/*' @@ -44,3 +45,6 @@ services: App\Search\TorrentSearcher: arguments: $classMetadata: '@=service(''doctrine.orm.magneticod_entity_manager'').getClassMetadata(''App\\Magnetico\\Entity\\Torrent'')' + + Monolog\Processor\PsrLogMessageProcessor: + tags: { name: monolog.processor, handler: sentry } diff --git a/src/Controller/MainController.php b/src/Controller/MainController.php index 6843e74..6e46959 100644 --- a/src/Controller/MainController.php +++ b/src/Controller/MainController.php @@ -20,7 +20,7 @@ class MainController extends AbstractController private function createLoginForm(string $username): FormInterface { $form = $this->createForm(LoginType::class, null, [ - 'action' => $this->generateUrl('user_login'), + 'action' => $this->generateUrl('user_auth_login'), ]); $form->get('_username')->setData($username); $form->add('submit', SubmitType::class); diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php index 05a0fea..50958db 100644 --- a/src/Controller/SecurityController.php +++ b/src/Controller/SecurityController.php @@ -29,7 +29,7 @@ class SecurityController extends AbstractController private function createLoginForm(string $username): FormInterface { $form = $this->createForm(LoginType::class, null, [ - 'action' => $this->generateUrl('user_login'), + 'action' => $this->generateUrl('user_auth_login'), ]); $form->get('_username')->setData($username); $form->add('submit', SubmitType::class); diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 1775689..66a6130 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -2,38 +2,39 @@ namespace App\Controller; -use App\Form\{CreateUserRequestType}; -use App\FormRequest\CreateUserRequest; +use App\Entity\{Invite, PasswordResetToken}; +use App\Repository\PasswordResetTokenRepository; +use App\Form\{Data\PasswordResetRequestData, Data\PasswordResetData, PasswordResetRequestType, PasswordResetType, RegisterType, Data\RegisterData}; use App\Repository\InviteRepository; -use App\User\{InviteManager, UserManager}; +use App\User\{Exception\UserNotFoundException, InviteManager, PasswordResetManager, UserManager}; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\Form\Extension\Core\Type\SubmitType; -use Symfony\Component\Form\FormInterface; +use Symfony\Component\Form\{Extension\Core\Type\SubmitType, FormError, FormInterface}; use Symfony\Component\HttpFoundation\{Request, Response}; class UserController extends AbstractController { public function register( - string $inviteCode, + string $code, Request $request, EntityManagerInterface $em, UserManager $userManager, InviteManager $inviteManager, InviteRepository $inviteRepo ): Response { - $createUserRequest = new CreateUserRequest($inviteCode); - $form = $this->createRegisterForm($createUserRequest, $inviteCode); + $formData = new RegisterData($code); + $form = $this->createRegisterForm($formData, $code); - $invite = $inviteRepo->findOneBy(['code' => $inviteCode, 'usedBy' => null]); + /** @var Invite $invite */ + $invite = $inviteRepo->findOneBy(['code' => $code, 'usedBy' => null]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $user = $userManager->createUserByInvite( - $createUserRequest->username, - $createUserRequest->password, - $createUserRequest->email, + $formData->username, + $formData->password, + $formData->email, $invite ); @@ -46,14 +47,96 @@ class UserController extends AbstractController return $this->render('User/register.html.twig', [ 'form' => $form->createView(), - 'inviteValid' => $invite ? true : null, + 'invite' => $invite, ]); } - private function createRegisterForm(CreateUserRequest $createUserRequest, string $inviteCode): FormInterface + public function requestReset(Request $request, EntityManagerInterface $em, PasswordResetManager $manager): Response { - $form = $this->createForm(CreateUserRequestType::class, $createUserRequest, [ - 'action' => $this->generateUrl('user_register', ['inviteCode' => $inviteCode]), + $formData = new PasswordResetRequestData(); + $form = $this->createResetRequestForm($formData); + + $form->handleRequest($request); + + $message = null; + + if ($form->isSubmitted() && $form->isValid()) { + try { + $manager->sendResetLink($formData->email); + + $message = 'Password reset link was sent'; + } catch (UserNotFoundException $e) { + $form->addError(new FormError('User not found')); + } catch (\Throwable $e) { + \Sentry\captureException($e); + $form->addError(new FormError('Something happened. Try again later or contact the administrator.')); + } + } + + return $this->render('User/reset.html.twig', [ + 'form' => $form->createView(), + 'message' => $message, + ]); + } + + public function reset( + string $code, + Request $request, + EntityManagerInterface $em, + UserManager $manager, + PasswordResetTokenRepository $tokenRepository + ): Response + { + $formData = new PasswordResetData(); + $form = $this->createResetForm($formData, $code); + + /** @var PasswordResetToken $token */ + $token = $tokenRepository->find($code); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + if ($token && $token->isValid()) { + $manager->changePassword($token->getUser(), $formData->password); + + $em->remove($token); + $em->flush(); + + return $this->redirectToRoute('user_auth_login'); + } else { + $form->addError(new FormError('Invalid token.')); + } + } + + return $this->render('User/reset.html.twig', [ + 'form' => $form->createView(), + ]); + } + + private function createResetRequestForm(PasswordResetRequestData $formData): FormInterface + { + $form = $this->createForm(PasswordResetRequestType::class, $formData, [ + 'action' => $this->generateUrl('user_reset_request'), + ]); + $form->add('submit', SubmitType::class); + + return $form; + } + + private function createResetForm(PasswordResetData $formData, string $code): FormInterface + { + $form = $this->createForm(PasswordResetType::class, $formData, [ + 'action' => $this->generateUrl('user_reset', ['code' => $code]), + ]); + $form->add('submit', SubmitType::class); + + return $form; + } + + private function createRegisterForm(RegisterData $formData, string $code): FormInterface + { + $form = $this->createForm(RegisterType::class, $formData, [ + 'action' => $this->generateUrl('user_register', ['code' => $code]), ]); $form->add('submit', SubmitType::class); diff --git a/src/Entity/PasswordResetToken.php b/src/Entity/PasswordResetToken.php new file mode 100644 index 0000000..c5645c6 --- /dev/null +++ b/src/Entity/PasswordResetToken.php @@ -0,0 +1,67 @@ +user = $user; + $this->code = hash('sha3-384', uniqid('reset', true)); + + $now = new \DateTime(); + + if ($validFor) { + $this->validUntil = $now->add($validFor); + } else { + $this->validUntil = $now->add(new \DateInterval('P1D')); + } + } + + public function isValid(): bool + { + $now = new \DateTime(); + + return $now < $this->validUntil; + } + + public function getUser(): User + { + return $this->user; + } + + public function getCode(): string + { + return $this->code; + } +} diff --git a/src/Entity/User.php b/src/Entity/User.php index e3b0b03..7ec164d 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -4,6 +4,7 @@ namespace App\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface; use Symfony\Component\Security\Core\User\UserInterface; /** @@ -63,10 +64,10 @@ class User implements UserInterface, \Serializable */ private $invites; - public function __construct(string $username, string $password, string $email, array $roles = []) + public function __construct(string $username, PasswordEncoderInterface $encoder, string $rawPassword, string $email, array $roles = []) { $this->username = $username; - $this->password = $password; + $this->password = $encoder->encodePassword($rawPassword, null); $this->email = $email; $this->roles = $roles ?: ['ROLE_USER']; $this->createdAt = new \DateTime(); @@ -87,9 +88,9 @@ class User implements UserInterface, \Serializable return $this->password; } - public function updatePassword(string $password): void + public function changePassword(PasswordEncoderInterface $encoder, string $rawPassword): void { - $this->password = $password; + $this->password = $encoder->encodePassword($rawPassword, null); } public function getSalt() @@ -143,10 +144,10 @@ class User implements UserInterface, \Serializable /** @see \Serializable::unserialize() */ public function unserialize($serialized) { - list( + [ $this->id, $this->username, $this->password - ) = unserialize($serialized, ['allowed_classes' => false]); + ] = unserialize($serialized, ['allowed_classes' => false]); } } \ No newline at end of file diff --git a/src/Form/Data/PasswordResetData.php b/src/Form/Data/PasswordResetData.php new file mode 100644 index 0000000..8ad6564 --- /dev/null +++ b/src/Form/Data/PasswordResetData.php @@ -0,0 +1,17 @@ +add('email', EmailType::class); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => PasswordResetRequestData::class, + ]); + } +} diff --git a/src/Form/PasswordResetType.php b/src/Form/PasswordResetType.php new file mode 100644 index 0000000..bb40029 --- /dev/null +++ b/src/Form/PasswordResetType.php @@ -0,0 +1,32 @@ +add('password', RepeatedType::class, [ + 'type' => PasswordType::class, + 'invalid_message' => 'The password fields must match.', + 'required' => true, + 'first_options' => ['label' => 'Password'], + 'second_options' => ['label' => 'Repeat'], + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => PasswordResetData::class, + ]); + } +} diff --git a/src/Form/CreateUserRequestType.php b/src/Form/RegisterType.php similarity index 82% rename from src/Form/CreateUserRequestType.php rename to src/Form/RegisterType.php index 9f076a2..51d56e2 100644 --- a/src/Form/CreateUserRequestType.php +++ b/src/Form/RegisterType.php @@ -2,13 +2,13 @@ namespace App\Form; -use App\FormRequest\CreateUserRequest; +use App\Form\Data\RegisterData; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\{EmailType, PasswordType, TextType}; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; -class CreateUserRequestType extends AbstractType +class RegisterType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { @@ -23,8 +23,7 @@ class CreateUserRequestType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => CreateUserRequest::class, + 'data_class' => RegisterData::class, ]); } - -} \ No newline at end of file +} diff --git a/src/Migrations/Version20200118004840.php b/src/Migrations/Version20200118004840.php new file mode 100644 index 0000000..09287da --- /dev/null +++ b/src/Migrations/Version20200118004840.php @@ -0,0 +1,34 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.'); + + $this->addSql('CREATE TABLE users.password_reset_tokens (code TEXT NOT NULL, user_id INT NOT NULL, valid_until TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(code))'); + $this->addSql('CREATE INDEX IDX_261A8E65A76ED395 ON users.password_reset_tokens (user_id)'); + $this->addSql('ALTER TABLE users.password_reset_tokens ADD CONSTRAINT FK_CCD4B965A76ED395 FOREIGN KEY (user_id) REFERENCES users.users (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.'); + + $this->addSql('DROP TABLE users.password_reset_tokens'); + } +} diff --git a/src/Repository/PasswordResetTokenRepository.php b/src/Repository/PasswordResetTokenRepository.php new file mode 100644 index 0000000..4e2334d --- /dev/null +++ b/src/Repository/PasswordResetTokenRepository.php @@ -0,0 +1,20 @@ +getEntityManager()->persist($token); + } +} diff --git a/src/User/Exception/UserNotFoundException.php b/src/User/Exception/UserNotFoundException.php new file mode 100644 index 0000000..c6a7317 --- /dev/null +++ b/src/User/Exception/UserNotFoundException.php @@ -0,0 +1,8 @@ +userRepo = $userRepo; + $this->tokenRepo = $tokenRepo; + $this->em = $em; + $this->mailer = $mailer; + $this->router = $router; + $this->fromAddress = $fromAddress; + } + + public function sendResetLink(string $address): void + { + /** @var User $user */ + if (null === $user = $this->userRepo->findOneBy(['email' => $address])) { + throw new UserNotFoundException(); + } + + // @todo add limits + $token = new PasswordResetToken($user); + $this->tokenRepo->add($token); + $this->em->flush(); + + $link = $this->router->generate('user_reset', ['code' => $token->getCode()], UrlGeneratorInterface::ABSOLUTE_URL); + + $mail = (new Email()) + ->from($this->fromAddress) + ->to($user->getEmail()) + ->subject('Password reset') + ->text(<<mailer->send($mail); + } +} diff --git a/src/User/UserManager.php b/src/User/UserManager.php index ce033cd..a4b94ec 100644 --- a/src/User/UserManager.php +++ b/src/User/UserManager.php @@ -29,11 +29,10 @@ class UserManager public function createUser(string $username, string $password, string $email, array $roles = self::DEFAULT_ROLES): User { - $encodedPassword = $this->encoderFactory->getEncoder(User::class)->encodePassword($password, null); - $user = new User( $username, - $encodedPassword, + $this->encoderFactory->getEncoder(User::class), + $password, $email, $roles ); @@ -43,16 +42,24 @@ class UserManager return $user; } + public function changePassword(User $user, string $rawPassword): void + { + $user->changePassword( + $this->encoderFactory->getEncoder(User::class), + $rawPassword + ); + } + public function createUserByInvite(string $username, string $password, string $email, Invite $invite, array $roles = self::DEFAULT_ROLES): User { if (null !== $invite->getUsedBy()) { throw new InvalidInviteException(); } - $user = $this->createUser($username, $password, $email,$roles); + $user = $this->createUser($username, $password, $email, $roles); $invite->use($user); return $user; } -} \ No newline at end of file +} diff --git a/symfony.lock b/symfony.lock index 2ecdf36..0f4637f 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,4 +1,7 @@ { + "clue/stream-filter": { + "version": "v1.4.1" + }, "doctrine/annotations": { "version": "1.0", "recipe": { @@ -62,6 +65,21 @@ "doctrine/reflection": { "version": "v1.0.0" }, + "egulias/email-validator": { + "version": "2.1.14" + }, + "guzzlehttp/guzzle": { + "version": "6.5.2" + }, + "guzzlehttp/promises": { + "version": "v1.3.1" + }, + "guzzlehttp/psr7": { + "version": "1.6.1" + }, + "http-interop/http-factory-guzzle": { + "version": "1.0.0" + }, "jdorn/sql-formatter": { "version": "v1.2.17" }, @@ -83,6 +101,33 @@ "pagerfanta/pagerfanta": { "version": "v2.0.1" }, + "paragonie/random_compat": { + "version": "v9.99.99" + }, + "php": { + "version": "7.4" + }, + "php-http/client-common": { + "version": "2.1.0" + }, + "php-http/discovery": { + "version": "1.7.4" + }, + "php-http/guzzle6-adapter": { + "version": "v2.0.1" + }, + "php-http/httplug": { + "version": "2.1.0" + }, + "php-http/message": { + "version": "1.8.0" + }, + "php-http/message-factory": { + "version": "v1.0.2" + }, + "php-http/promise": { + "version": "v1.0.0" + }, "phpdocumentor/reflection-common": { "version": "1.0.1" }, @@ -98,9 +143,21 @@ "psr/container": { "version": "1.0.0" }, + "psr/http-client": { + "version": "1.0.0" + }, + "psr/http-factory": { + "version": "1.0.1" + }, + "psr/http-message": { + "version": "1.0.1" + }, "psr/log": { "version": "1.0.2" }, + "ralouphie/getallheaders": { + "version": "3.0.3" + }, "sensio/framework-extra-bundle": { "version": "4.0", "recipe": { @@ -110,6 +167,9 @@ "ref": "aaddfdf43cdecd4cf91f992052d76c2cadc04543" } }, + "sentry/sdk": { + "version": "2.1.0" + }, "sentry/sentry": { "version": "1.10.0" }, @@ -191,6 +251,12 @@ "ref": "1279df12895f20d8076324036431833181eb6645" } }, + "symfony/http-client": { + "version": "v4.4.2" + }, + "symfony/http-client-contracts": { + "version": "v2.0.1" + }, "symfony/http-foundation": { "version": "v4.1.0" }, @@ -203,6 +269,18 @@ "symfony/intl": { "version": "v4.1.0" }, + "symfony/mailer": { + "version": "4.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.3", + "ref": "15658c2a0176cda2e7dba66276a2030b52bd81b2" + }, + "files": [ + "config/packages/mailer.yaml" + ] + }, "symfony/mime": { "version": "v4.3.2" }, @@ -239,6 +317,9 @@ "symfony/polyfill-php73": { "version": "v1.11.0" }, + "symfony/polyfill-uuid": { + "version": "v1.13.1" + }, "symfony/process": { "version": "v4.1.0" }, diff --git a/templates/Account/invites.html.twig b/templates/Account/invites.html.twig index 2f9981b..22985bc 100644 --- a/templates/Account/invites.html.twig +++ b/templates/Account/invites.html.twig @@ -19,7 +19,7 @@ {% if invite.usedBy %} Used by {{ invite.usedBy.username }}. {% else %} - {% set invite_url = url('user_register', { inviteCode: invite.code }) %} + {% set invite_url = url('user_register', { code: invite.code }) %} {% endif %} diff --git a/templates/Security/login.html.twig b/templates/Security/login.html.twig index 0ec5005..9824675 100644 --- a/templates/Security/login.html.twig +++ b/templates/Security/login.html.twig @@ -4,4 +4,6 @@
{{ form(form) }}
+ + Reset {% endblock %} \ No newline at end of file diff --git a/templates/User/register.html.twig b/templates/User/register.html.twig index 472ee49..64374e8 100644 --- a/templates/User/register.html.twig +++ b/templates/User/register.html.twig @@ -1,7 +1,7 @@ {% extends 'base.html.twig' %} {% block content %} - {% if inviteValid %} + {% if invite is not null %}
{{ form(form) }}
diff --git a/templates/User/reset.html.twig b/templates/User/reset.html.twig new file mode 100644 index 0000000..fe11cfd --- /dev/null +++ b/templates/User/reset.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block content %} + {% if message is defined and message is not empty %} + + {% endif %} + +
+ {{ form(form) }} +
+{% endblock %} diff --git a/templates/base.html.twig b/templates/base.html.twig index f4d284b..2708829 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -37,7 +37,7 @@ diff --git a/templates/index.html.twig b/templates/index.html.twig index 6868713..a843549 100644 --- a/templates/index.html.twig +++ b/templates/index.html.twig @@ -3,7 +3,7 @@ {% block content %}
{% if not is_granted('ROLE_USER') %} - Login + Login {% endif %}
{% endblock %} \ No newline at end of file