diff --git a/README.md b/README.md index 86d5cadc7..c2bb3e9c8 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,11 @@ NFQ Akademija ============ +# Medžiaga + +Bus remiamasi: https://github.com/aurelijusb/kickstart/pull/140 +Namų darbai: https://github.com/aurelijusb/kickstart/pull/162 + # Intro Sveiki! Tai yra Jūsų startinis projekto "template". diff --git a/composer.json b/composer.json index 5e4c82c5e..9ffabb5c5 100644 --- a/composer.json +++ b/composer.json @@ -5,19 +5,24 @@ "php": "^7.1.3", "ext-ctype": "*", "ext-iconv": "*", + "easycorp/easyadmin-bundle": "^2.3", "symfony/asset": "4.3.*", "symfony/console": "4.3.*", "symfony/dotenv": "4.3.*", "symfony/flex": "^1.3.1", + "symfony/form": "4.3.*", "symfony/framework-bundle": "4.3.*", "symfony/orm-pack": "^1.0", + "symfony/security-bundle": "4.3.*", "symfony/twig-pack": "^1.0", + "symfony/validator": "4.3.*", "symfony/webpack-encore-bundle": "^1.7", "symfony/yaml": "4.3.*" }, "require-dev": { "squizlabs/php_codesniffer": "^3.5", - "symfony/maker-bundle": "^1.13" + "symfony/maker-bundle": "^1.13", + "symfony/profiler-pack": "^1.0" }, "config": { "preferred-install": { diff --git a/composer.lock b/composer.lock index 99073b588..021c0ea7a 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": "1ef246e2c00d457122ed5e9043e91bac", + "content-hash": "42b6934e59303ba4988e8da6d8cd28e1", "packages": [ { "name": "doctrine/annotations", @@ -1208,6 +1208,90 @@ ], "time": "2018-06-14T14:45:07+00:00" }, + { + "name": "easycorp/easyadmin-bundle", + "version": "v2.3.2", + "source": { + "type": "git", + "url": "https://github.com/EasyCorp/EasyAdminBundle.git", + "reference": "cf48c275e2b235898f225fb53e613d9228144ace" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/EasyCorp/EasyAdminBundle/zipball/cf48c275e2b235898f225fb53e613d9228144ace", + "reference": "cf48c275e2b235898f225fb53e613d9228144ace", + "shasum": "" + }, + "require": { + "doctrine/common": "^2.8", + "doctrine/doctrine-bundle": "^1.8|^2.0", + "doctrine/orm": "^2.6.3", + "doctrine/persistence": "^1.0", + "pagerfanta/pagerfanta": "^1.0.1|^2.0", + "php": "^7.1.3", + "symfony/asset": "^4.2|^5.0", + "symfony/cache": "^4.2|^5.0", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^4.2|^5.0", + "symfony/doctrine-bridge": "^4.2|^5.0", + "symfony/event-dispatcher": "^4.2|^5.0", + "symfony/expression-language": "^4.2|^5.0", + "symfony/finder": "^4.2|^5.0", + "symfony/form": "^4.2|^5.0", + "symfony/framework-bundle": "^4.2|^5.0", + "symfony/http-foundation": "^4.2|^5.0", + "symfony/http-kernel": "^4.2|^5.0", + "symfony/polyfill-mbstring": "^1.7", + "symfony/property-access": "^4.2|^5.0", + "symfony/security-bundle": "^4.2|^5.0", + "symfony/translation": "^4.2|^5.0", + "symfony/twig-bridge": "^4.2|^5.0", + "symfony/twig-bundle": "^4.2|^5.0", + "symfony/validator": "^4.2|^5.0", + "twig/twig": "^2.11.3|^3.0" + }, + "require-dev": { + "doctrine/data-fixtures": "^1.3", + "doctrine/doctrine-fixtures-bundle": "^3.0", + "psr/log": "~1.0", + "symfony/browser-kit": "^4.2|^5.0", + "symfony/console": "^4.2|^5.0", + "symfony/css-selector": "^4.2|^5.0", + "symfony/dom-crawler": "^4.2|^5.0", + "symfony/phpunit-bridge": "^4.3.5|^5.0", + "symfony/var-dumper": "^4.2|^5.0", + "symfony/yaml": "^4.2|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "EasyCorp\\Bundle\\EasyAdminBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Project Contributors", + "homepage": "https://github.com/EasyCorp/EasyAdminBundle/blob/master/CONTRIBUTORS.md" + } + ], + "description": "Admin generator for Symfony applications", + "homepage": "https://github.com/EasyCorp/EasyAdminBundle", + "keywords": [ + "admin", + "backend", + "generator" + ], + "time": "2019-10-23T15:47:36+00:00" + }, { "name": "jdorn/sql-formatter", "version": "v1.2.17", @@ -1379,6 +1463,75 @@ ], "time": "2019-08-10T08:37:15+00:00" }, + { + "name": "pagerfanta/pagerfanta", + "version": "v2.1.3", + "source": { + "type": "git", + "url": "https://github.com/whiteoctober/Pagerfanta.git", + "reference": "a53ff01d521648d9dbca19b93ac6bc75a59b0972" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/whiteoctober/Pagerfanta/zipball/a53ff01d521648d9dbca19b93ac6bc75a59b0972", + "reference": "a53ff01d521648d9dbca19b93ac6bc75a59b0972", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "doctrine/orm": "~2.3", + "doctrine/phpcr-odm": "1.*", + "jackalope/jackalope-doctrine-dbal": "1.*", + "jmikola/geojson": "~1.0", + "mandango/mandango": "~1.0@dev", + "mandango/mondator": "~1.0@dev", + "phpunit/phpunit": "^6.5", + "propel/propel": "~2.0@dev", + "propel/propel1": "~1.6", + "ruflin/elastica": "~1.3", + "solarium/solarium": "~3.1" + }, + "suggest": { + "doctrine/mongodb-odm": "To use the DoctrineODMMongoDBAdapter.", + "doctrine/orm": "To use the DoctrineORMAdapter.", + "doctrine/phpcr-odm": "To use the DoctrineODMPhpcrAdapter. >= 1.1.0", + "mandango/mandango": "To use the MandangoAdapter.", + "propel/propel": "To use the Propel2Adapter", + "propel/propel1": "To use the PropelAdapter", + "solarium/solarium": "To use the SolariumAdapter." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Pagerfanta\\": "src/Pagerfanta/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Pablo Díez", + "email": "pablodip@gmail.com" + } + ], + "description": "Pagination for PHP", + "keywords": [ + "page", + "pagination", + "paginator", + "paging" + ], + "time": "2019-07-17T20:56:16+00:00" + }, { "name": "psr/cache", "version": "1.0.1", @@ -2256,6 +2409,57 @@ ], "time": "2019-09-17T09:54:03+00:00" }, + { + "name": "symfony/expression-language", + "version": "v4.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "d81f0eb914f534e8b17a9db8c2408d1f0cf55fd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/d81f0eb914f534e8b17a9db8c2408d1f0cf55fd2", + "reference": "d81f0eb914f534e8b17a9db8c2408d1f0cf55fd2", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/cache": "~3.4|~4.0", + "symfony/service-contracts": "^1.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "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 ExpressionLanguage Component", + "homepage": "https://symfony.com", + "time": "2019-10-29T01:54:26+00:00" + }, { "name": "symfony/filesystem", "version": "v4.3.5", @@ -2404,6 +2608,90 @@ "description": "Composer plugin for Symfony", "time": "2019-09-19T14:55:57+00:00" }, + { + "name": "symfony/form", + "version": "v4.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/form.git", + "reference": "1134c093d6fd339ea1b8823c50940607b58349f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/form/zipball/1134c093d6fd339ea1b8823c50940607b58349f2", + "reference": "1134c093d6fd339ea1b8823c50940607b58349f2", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/event-dispatcher": "^4.3", + "symfony/intl": "^4.3", + "symfony/options-resolver": "~4.3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/property-access": "~3.4|~4.0", + "symfony/service-contracts": "~1.1" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<4.3", + "symfony/dependency-injection": "<3.4", + "symfony/doctrine-bridge": "<3.4", + "symfony/framework-bundle": "<3.4", + "symfony/http-kernel": "<4.3", + "symfony/intl": "<4.3", + "symfony/translation": "<4.2", + "symfony/twig-bridge": "<3.4.5|<4.0.5,>=4.0" + }, + "require-dev": { + "doctrine/collections": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "^4.3", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/http-kernel": "~4.3", + "symfony/security-csrf": "~3.4|~4.0", + "symfony/translation": "~4.2", + "symfony/validator": "^3.4.31|^4.3.4", + "symfony/var-dumper": "^4.3" + }, + "suggest": { + "symfony/security-csrf": "For protecting forms against CSRF attacks.", + "symfony/twig-bridge": "For templating with Twig.", + "symfony/validator": "For form validation." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Form\\": "" + }, + "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 Form Component", + "homepage": "https://symfony.com", + "time": "2019-10-28T17:07:32+00:00" + }, { "name": "symfony/framework-bundle", "version": "v4.3.5", @@ -2675,27 +2963,22 @@ "time": "2019-10-07T15:06:41+00:00" }, { - "name": "symfony/mime", - "version": "v4.3.5", + "name": "symfony/inflector", + "version": "v4.3.8", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "32f71570547b91879fdbd9cf50317d556ae86916" + "url": "https://github.com/symfony/inflector.git", + "reference": "f97c69c132c08e31d291689d2d77bb0878094acb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/32f71570547b91879fdbd9cf50317d556ae86916", - "reference": "32f71570547b91879fdbd9cf50317d556ae86916", + "url": "https://api.github.com/repos/symfony/inflector/zipball/f97c69c132c08e31d291689d2d77bb0878094acb", + "reference": "f97c69c132c08e31d291689d2d77bb0878094acb", "shasum": "" }, "require": { "php": "^7.1.3", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "~3.4|^4.1" + "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { @@ -2705,7 +2988,7 @@ }, "autoload": { "psr-4": { - "Symfony\\Component\\Mime\\": "" + "Symfony\\Component\\Inflector\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -2717,84 +3000,65 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "A library to manipulate MIME messages", + "description": "Symfony Inflector Component", "homepage": "https://symfony.com", "keywords": [ - "mime", - "mime-type" + "inflection", + "pluralize", + "singularize", + "string", + "symfony", + "words" ], - "time": "2019-09-19T17:00:15+00:00" + "time": "2019-11-05T19:58:22+00:00" }, { - "name": "symfony/orm-pack", - "version": "v1.0.7", + "name": "symfony/intl", + "version": "v4.3.8", "source": { "type": "git", - "url": "https://github.com/symfony/orm-pack.git", - "reference": "c57f5e05232ca40626eb9fa52a32bc8565e9231c" + "url": "https://github.com/symfony/intl.git", + "reference": "818771ff6acef04cdce05023ddfc39b7078014bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/orm-pack/zipball/c57f5e05232ca40626eb9fa52a32bc8565e9231c", - "reference": "c57f5e05232ca40626eb9fa52a32bc8565e9231c", + "url": "https://api.github.com/repos/symfony/intl/zipball/818771ff6acef04cdce05023ddfc39b7078014bf", + "reference": "818771ff6acef04cdce05023ddfc39b7078014bf", "shasum": "" }, "require": { - "doctrine/doctrine-bundle": "^1.6.10|^2.0", - "doctrine/doctrine-migrations-bundle": "^1.3|^2.0", - "doctrine/orm": "^2.5.11", - "php": "^7.0" - }, - "type": "symfony-pack", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A pack for the Doctrine ORM", - "time": "2019-10-18T05:41:09+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.12.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6af626ae6fa37d396dc90a399c0ff08e5cfc45b2", - "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2", - "shasum": "" + "php": "^7.1.3", + "symfony/polyfill-intl-icu": "~1.0" }, - "require": { - "php": ">=5.3.3", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.9" + "require-dev": { + "symfony/filesystem": "~3.4|~4.0" }, "suggest": { - "ext-intl": "For best performance" + "ext-intl": "to use the component with locales other than \"en\"" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.12-dev" + "dev-master": "4.3-dev" } }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" + "Symfony\\Component\\Intl\\": "" }, - "files": [ - "bootstrap.php" + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2803,19 +3067,288 @@ ], "authors": [ { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.", "homepage": "https://symfony.com", "keywords": [ - "compatibility", - "idn", + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "time": "2019-10-04T21:18:34+00:00" + }, + { + "name": "symfony/mime", + "version": "v4.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "32f71570547b91879fdbd9cf50317d556ae86916" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/32f71570547b91879fdbd9cf50317d556ae86916", + "reference": "32f71570547b91879fdbd9cf50317d556ae86916", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/dependency-injection": "~3.4|^4.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "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": "A library to manipulate MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "time": "2019-09-19T17:00:15+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v4.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "f46c7fc8e207bd8a2188f54f8738f232533765a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/f46c7fc8e207bd8a2188f54f8738f232533765a4", + "reference": "f46c7fc8e207bd8a2188f54f8738f232533765a4", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "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 OptionsResolver Component", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "time": "2019-10-28T20:59:01+00:00" + }, + { + "name": "symfony/orm-pack", + "version": "v1.0.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/orm-pack.git", + "reference": "c57f5e05232ca40626eb9fa52a32bc8565e9231c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/orm-pack/zipball/c57f5e05232ca40626eb9fa52a32bc8565e9231c", + "reference": "c57f5e05232ca40626eb9fa52a32bc8565e9231c", + "shasum": "" + }, + "require": { + "doctrine/doctrine-bundle": "^1.6.10|^2.0", + "doctrine/doctrine-migrations-bundle": "^1.3|^2.0", + "doctrine/orm": "^2.5.11", + "php": "^7.0" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for the Doctrine ORM", + "time": "2019-10-18T05:41:09+00:00" + }, + { + "name": "symfony/polyfill-intl-icu", + "version": "v1.12.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "66810b9d6eb4af54d543867909d65ab9af654d7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/66810b9d6eb4af54d543867909d65ab9af654d7e", + "reference": "66810b9d6eb4af54d543867909d65ab9af654d7e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/intl": "~2.3|~3.0|~4.0|~5.0" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.12-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's ICU-related data and classes", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "icu", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2019-08-06T08:03:45+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.12.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6af626ae6fa37d396dc90a399c0ff08e5cfc45b2", + "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.9" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.12-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", "intl", "polyfill", "portable", @@ -2996,34 +3529,101 @@ "time": "2019-08-06T08:03:45+00:00" }, { - "name": "symfony/routing", - "version": "v4.3.5", + "name": "symfony/property-access", + "version": "v4.3.8", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "3b174ef04fe66696524efad1e5f7a6c663d822ea" + "url": "https://github.com/symfony/property-access.git", + "reference": "bb0c302375ffeef60c31e72a4539611b7f787565" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/3b174ef04fe66696524efad1e5f7a6c663d822ea", - "reference": "3b174ef04fe66696524efad1e5f7a6c663d822ea", + "url": "https://api.github.com/repos/symfony/property-access/zipball/bb0c302375ffeef60c31e72a4539611b7f787565", + "reference": "bb0c302375ffeef60c31e72a4539611b7f787565", "shasum": "" }, "require": { - "php": "^7.1.3" - }, - "conflict": { - "symfony/config": "<4.2", - "symfony/dependency-injection": "<3.4", - "symfony/yaml": "<3.4" + "php": "^7.1.3", + "symfony/inflector": "~3.4|~4.0" }, "require-dev": { - "doctrine/annotations": "~1.2", - "psr/log": "~1.0", - "symfony/config": "~4.2", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/expression-language": "~3.4|~4.0", - "symfony/http-foundation": "~3.4|~4.0", + "symfony/cache": "~3.4|~4.0" + }, + "suggest": { + "psr/cache-implementation": "To cache access methods." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "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 PropertyAccess Component", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property path", + "reflection" + ], + "time": "2019-08-26T08:26:39+00:00" + }, + { + "name": "symfony/routing", + "version": "v4.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "3b174ef04fe66696524efad1e5f7a6c663d822ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/3b174ef04fe66696524efad1e5f7a6c663d822ea", + "reference": "3b174ef04fe66696524efad1e5f7a6c663d822ea", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "conflict": { + "symfony/config": "<4.2", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.2", + "psr/log": "~1.0", + "symfony/config": "~4.2", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, "suggest": { @@ -3071,6 +3671,340 @@ ], "time": "2019-10-04T20:57:10+00:00" }, + { + "name": "symfony/security-bundle", + "version": "v4.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-bundle.git", + "reference": "9f247c672e08385c67e3ca7cfc1484072bcc6517" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/9f247c672e08385c67e3ca7cfc1484072bcc6517", + "reference": "9f247c672e08385c67e3ca7cfc1484072bcc6517", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": "^7.1.3", + "symfony/config": "^4.2", + "symfony/dependency-injection": "^4.2", + "symfony/http-kernel": "^4.3", + "symfony/security-core": "~4.3", + "symfony/security-csrf": "~4.2", + "symfony/security-guard": "~4.2", + "symfony/security-http": "^4.3.8" + }, + "conflict": { + "symfony/browser-kit": "<4.2", + "symfony/console": "<3.4", + "symfony/framework-bundle": "<4.3.4", + "symfony/twig-bundle": "<4.2", + "symfony/var-dumper": "<3.4" + }, + "require-dev": { + "doctrine/doctrine-bundle": "~1.5", + "symfony/asset": "~3.4|~4.0", + "symfony/browser-kit": "~4.2", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/form": "~3.4|~4.0", + "symfony/framework-bundle": "^4.3.4", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/twig-bridge": "~3.4|~4.0", + "symfony/twig-bundle": "~4.2", + "symfony/validator": "~3.4|~4.0", + "symfony/var-dumper": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0", + "twig/twig": "~1.41|~2.10" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SecurityBundle\\": "" + }, + "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 SecurityBundle", + "homepage": "https://symfony.com", + "time": "2019-11-12T13:12:56+00:00" + }, + { + "name": "symfony/security-core", + "version": "v4.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "8c46ea77fe0738f2495eacc08fa34e1e19ff0b0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/8c46ea77fe0738f2495eacc08fa34e1e19ff0b0d", + "reference": "8c46ea77fe0738f2495eacc08fa34e1e19ff0b0d", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/event-dispatcher-contracts": "^1.1", + "symfony/service-contracts": "^1.1" + }, + "conflict": { + "symfony/event-dispatcher": "<4.3", + "symfony/security-guard": "<4.3" + }, + "require-dev": { + "psr/container": "^1.0", + "psr/log": "~1.0", + "symfony/event-dispatcher": "^4.3", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/ldap": "~3.4|~4.0", + "symfony/validator": "^3.4.31|^4.3.4" + }, + "suggest": { + "psr/container-implementation": "To instantiate the Security class", + "symfony/event-dispatcher": "", + "symfony/expression-language": "For using the expression voter", + "symfony/http-foundation": "", + "symfony/ldap": "For using LDAP integration", + "symfony/validator": "For using the user password constraint" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "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 Security Component - Core Library", + "homepage": "https://symfony.com", + "time": "2019-10-28T17:07:32+00:00" + }, + { + "name": "symfony/security-csrf", + "version": "v4.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-csrf.git", + "reference": "0760ec651ea8ff81e22097780337e43f3a795769" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/0760ec651ea8ff81e22097780337e43f3a795769", + "reference": "0760ec651ea8ff81e22097780337e43f3a795769", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/security-core": "~3.4|~4.0" + }, + "conflict": { + "symfony/http-foundation": "<3.4" + }, + "require-dev": { + "symfony/http-foundation": "~3.4|~4.0" + }, + "suggest": { + "symfony/http-foundation": "For using the class SessionTokenStorage." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Csrf\\": "" + }, + "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 Security Component - CSRF Library", + "homepage": "https://symfony.com", + "time": "2019-09-24T15:54:14+00:00" + }, + { + "name": "symfony/security-guard", + "version": "v4.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-guard.git", + "reference": "62cc82a384f2c1c75c58189fcf713032f6fef1e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-guard/zipball/62cc82a384f2c1c75c58189fcf713032f6fef1e9", + "reference": "62cc82a384f2c1c75c58189fcf713032f6fef1e9", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/security-core": "~3.4.22|^4.2.3", + "symfony/security-http": "^4.3" + }, + "require-dev": { + "psr/log": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Guard\\": "" + }, + "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 Security Component - Guard", + "homepage": "https://symfony.com", + "time": "2019-10-28T17:07:32+00:00" + }, + { + "name": "symfony/security-http", + "version": "v4.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-http.git", + "reference": "290b23a46a932746c4cf3c313d59d99f82af2a87" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-http/zipball/290b23a46a932746c4cf3c313d59d99f82af2a87", + "reference": "290b23a46a932746c4cf3c313d59d99f82af2a87", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/http-foundation": "~3.4|~4.0", + "symfony/http-kernel": "^4.3", + "symfony/property-access": "~3.4|~4.0", + "symfony/security-core": "^4.3" + }, + "conflict": { + "symfony/security-csrf": "<3.4.11|~4.0,<4.0.11" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/routing": "~3.4|~4.0", + "symfony/security-csrf": "^3.4.11|^4.0.11" + }, + "suggest": { + "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs", + "symfony/security-csrf": "For using tokens to protect authentication/logout attempts" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Http\\": "" + }, + "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 Security Component - HTTP Integration", + "homepage": "https://symfony.com", + "time": "2019-11-12T13:12:56+00:00" + }, { "name": "symfony/service-contracts", "version": "v1.1.7", @@ -3095,13 +4029,71 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "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 writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-09-17T11:12:18+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v4.3.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "1e4ff456bd625be5032fac9be4294e60442e9b71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/1e4ff456bd625be5032fac9be4294e60442e9b71", + "reference": "1e4ff456bd625be5032fac9be4294e60442e9b71", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/service-contracts": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" } }, "autoload": { "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3109,43 +4101,61 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Fabien Potencier", + "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Generic abstractions related to writing services", + "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2019-09-17T11:12:18+00:00" + "time": "2019-08-07T11:52:19+00:00" }, { - "name": "symfony/stopwatch", - "version": "v4.3.5", + "name": "symfony/translation", + "version": "v4.3.8", "source": { "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "1e4ff456bd625be5032fac9be4294e60442e9b71" + "url": "https://github.com/symfony/translation.git", + "reference": "bbce239b35b0cd47bd75848b23e969f17dd970e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/1e4ff456bd625be5032fac9be4294e60442e9b71", - "reference": "1e4ff456bd625be5032fac9be4294e60442e9b71", + "url": "https://api.github.com/repos/symfony/translation/zipball/bbce239b35b0cd47bd75848b23e969f17dd970e7", + "reference": "bbce239b35b0cd47bd75848b23e969f17dd970e7", "shasum": "" }, "require": { "php": "^7.1.3", - "symfony/service-contracts": "^1.0" + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^1.1.6" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "symfony/translation-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/intl": "~3.4|~4.0", + "symfony/service-contracts": "^1.1.2", + "symfony/var-dumper": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" }, "type": "library", "extra": { @@ -3155,7 +4165,7 @@ }, "autoload": { "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" + "Symfony\\Component\\Translation\\": "" }, "exclude-from-classmap": [ "/Tests/" @@ -3175,9 +4185,9 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Stopwatch Component", + "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2019-08-07T11:52:19+00:00" + "time": "2019-11-06T23:21:49+00:00" }, { "name": "symfony/translation-contracts", @@ -3442,6 +4452,99 @@ "description": "A Twig pack for Symfony projects", "time": "2019-10-17T05:44:22+00:00" }, + { + "name": "symfony/validator", + "version": "v4.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "8062841487a1a7d95f4c7cc359e674079daf4c48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/8062841487a1a7d95f4c7cc359e674079daf4c48", + "reference": "8062841487a1a7d95f4c7cc359e674079daf4c48", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^1.1" + }, + "conflict": { + "doctrine/lexer": "<1.0.2", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/dependency-injection": "<3.4", + "symfony/http-kernel": "<3.4", + "symfony/intl": "<4.3", + "symfony/translation": "<4.2", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "egulias/email-validator": "^2.1.10", + "symfony/cache": "~3.4|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-client": "^4.3", + "symfony/http-foundation": "~4.1", + "symfony/http-kernel": "~3.4|~4.0", + "symfony/intl": "^4.3", + "symfony/property-access": "~3.4|~4.0", + "symfony/property-info": "~3.4|~4.0", + "symfony/translation": "~4.2", + "symfony/var-dumper": "~3.4|~4.0", + "symfony/yaml": "~3.4|~4.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.", + "egulias/email-validator": "Strict (RFC compliant) email validation", + "psr/cache-implementation": "For using the metadata cache.", + "symfony/config": "", + "symfony/expression-language": "For using the Expression validator", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/property-access": "For accessing properties within comparison constraints", + "symfony/property-info": "To automatically add NotNull and Type constraints", + "symfony/translation": "For translating validation errors.", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "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 Validator Component", + "homepage": "https://symfony.com", + "time": "2019-11-08T08:31:27+00:00" + }, { "name": "symfony/var-exporter", "version": "v4.3.5", @@ -4019,6 +5122,176 @@ "scaffolding" ], "time": "2019-10-18T01:41:52+00:00" + }, + { + "name": "symfony/profiler-pack", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/profiler-pack.git", + "reference": "99c4370632c2a59bb0444852f92140074ef02209" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/profiler-pack/zipball/99c4370632c2a59bb0444852f92140074ef02209", + "reference": "99c4370632c2a59bb0444852f92140074ef02209", + "shasum": "" + }, + "require": { + "php": "^7.0", + "symfony/stopwatch": "*", + "symfony/twig-bundle": "*", + "symfony/web-profiler-bundle": "*" + }, + "type": "symfony-pack", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A pack for the Symfony web profiler", + "time": "2018-12-10T12:11:44+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v4.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "ea4940845535c85ff5c505e13b3205b0076d07bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ea4940845535c85ff5c505e13b3205b0076d07bf", + "reference": "ea4940845535c85ff5c505e13b3205b0076d07bf", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "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 mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2019-10-13T12:02:04+00:00" + }, + { + "name": "symfony/web-profiler-bundle", + "version": "v4.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "6ce12ffe97d9e26091b0e7340a9d661fba64655e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/6ce12ffe97d9e26091b0e7340a9d661fba64655e", + "reference": "6ce12ffe97d9e26091b0e7340a9d661fba64655e", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/config": "^4.2", + "symfony/http-kernel": "^4.3", + "symfony/routing": "~3.4|~4.0", + "symfony/twig-bundle": "~4.2", + "symfony/var-dumper": "~3.4|~4.0", + "twig/twig": "^1.41|^2.10" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/form": "<4.3", + "symfony/messenger": "<4.2", + "symfony/var-dumper": "<3.4" + }, + "require-dev": { + "symfony/console": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\WebProfilerBundle\\": "" + }, + "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 WebProfilerBundle", + "homepage": "https://symfony.com", + "time": "2019-10-23T17:52:52+00:00" } ], "aliases": [], diff --git a/config/bundles.php b/config/bundles.php index 7b4814201..5a16e526f 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -9,4 +9,7 @@ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], + Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], + Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], + EasyCorp\Bundle\EasyAdminBundle\EasyAdminBundle::class => ['all' => true], ]; diff --git a/config/packages/dev/web_profiler.yaml b/config/packages/dev/web_profiler.yaml new file mode 100644 index 000000000..e92166a7f --- /dev/null +++ b/config/packages/dev/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: true + intercept_redirects: false + +framework: + profiler: { only_exceptions: false } diff --git a/config/packages/easy_admin.yaml b/config/packages/easy_admin.yaml new file mode 100644 index 000000000..92c039863 --- /dev/null +++ b/config/packages/easy_admin.yaml @@ -0,0 +1,24 @@ +easy_admin: + entities: + # List the entity class name you want to manage +# - App\Entity\Product +# - App\Entity\Category + User: + class: App\Entity\User + list: # <-- 'form' is applied to both 'new' and 'edit' views + fields: + - 'username' + - { property: 'roles', template: 'admin/user/roles-type-read.html.twig' } + - { property: 'homepage', type: 'url' } + - { property: 'linkedin', type: 'url' } + - { property: 'password', template: 'admin/user/password-read.html.twig' } + form: + fields: + - { property: 'email', type: 'email' } + - { property: 'roles', type: 'collection' } + - { property: 'plainPassword', type: 'password' } + - { property: 'homepage', type: 'url' } + - { property: 'linkedin', type: 'url' } + + user: + name_property_path: "email" \ No newline at end of file diff --git a/config/packages/security.yaml b/config/packages/security.yaml new file mode 100644 index 000000000..2986628c4 --- /dev/null +++ b/config/packages/security.yaml @@ -0,0 +1,37 @@ +security: + encoders: + App\Entity\User: + algorithm: argon2i + + # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers + providers: + # used to reload user from session & other features (e.g. switch_user) + app_user_provider: + entity: + class: App\Entity\User + property: email + firewalls: + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + main: + anonymous: true + guard: + authenticators: + - App\Security\AppCustomAuthenticator + logout: + path: app_logout + # where to redirect after logout + # target: app_any_route + + # activate different ways to authenticate + # https://symfony.com/doc/current/security.html#firewalls-authentication + + # https://symfony.com/doc/current/security/impersonating_user.html + # switch_user: true + + # Easy way to control access for large sections of your site + # Note: Only the *first* access control that matches will be used + access_control: + - { path: ^/admin, roles: ROLE_ADMIN } + # - { path: ^/profile, roles: ROLE_USER } diff --git a/config/packages/test/validator.yaml b/config/packages/test/validator.yaml new file mode 100644 index 000000000..1e5ab7880 --- /dev/null +++ b/config/packages/test/validator.yaml @@ -0,0 +1,3 @@ +framework: + validation: + not_compromised_password: false diff --git a/config/packages/test/web_profiler.yaml b/config/packages/test/web_profiler.yaml new file mode 100644 index 000000000..03752de21 --- /dev/null +++ b/config/packages/test/web_profiler.yaml @@ -0,0 +1,6 @@ +web_profiler: + toolbar: false + intercept_redirects: false + +framework: + profiler: { collect: false } diff --git a/config/packages/translation.yaml b/config/packages/translation.yaml new file mode 100644 index 000000000..05a2b3d82 --- /dev/null +++ b/config/packages/translation.yaml @@ -0,0 +1,6 @@ +framework: + default_locale: en + translator: + default_path: '%kernel.project_dir%/translations' + fallbacks: + - en diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml index d1582a23d..724f2be69 100644 --- a/config/packages/twig.yaml +++ b/config/packages/twig.yaml @@ -2,3 +2,4 @@ twig: default_path: '%kernel.project_dir%/templates' debug: '%kernel.debug%' strict_variables: '%kernel.debug%' + form_themes: ['bootstrap_4_horizontal_layout.html.twig'] diff --git a/config/packages/validator.yaml b/config/packages/validator.yaml new file mode 100644 index 000000000..350786a13 --- /dev/null +++ b/config/packages/validator.yaml @@ -0,0 +1,8 @@ +framework: + validation: + email_validation_mode: html5 + + # Enables validator auto-mapping support. + # For instance, basic validation constraints will be inferred from Doctrine's metadata. + #auto_mapping: + # App\Entity\: [] diff --git a/config/routes/dev/web_profiler.yaml b/config/routes/dev/web_profiler.yaml new file mode 100644 index 000000000..c82beff2f --- /dev/null +++ b/config/routes/dev/web_profiler.yaml @@ -0,0 +1,7 @@ +web_profiler_wdt: + resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' + prefix: /_wdt + +web_profiler_profiler: + resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' + prefix: /_profiler diff --git a/config/routes/easy_admin.yaml b/config/routes/easy_admin.yaml new file mode 100644 index 000000000..c62135cdd --- /dev/null +++ b/config/routes/easy_admin.yaml @@ -0,0 +1,4 @@ +easy_admin_bundle: + resource: '@EasyAdminBundle/Controller/EasyAdminController.php' + prefix: /admin + type: annotation diff --git a/config/services.yaml b/config/services.yaml index 5c4b41757..e399a9940 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -25,3 +25,9 @@ services: # add more service definitions when explicit configuration is needed # please note that last definitions always *replace* previous ones + + my.easy_admin.pre_edit.subscrubier: + class: App\EventSubscriber\EasyAdminSubscriber + autowire: true + tags: + - { name: kernel.event_subscriber } \ No newline at end of file diff --git a/src/Command/PromoteUserCommand.php b/src/Command/PromoteUserCommand.php new file mode 100644 index 000000000..404ccfbad --- /dev/null +++ b/src/Command/PromoteUserCommand.php @@ -0,0 +1,89 @@ +entityManager = $entityManager; + $this->adminRole = $adminRole; + + parent::__construct(); + } + + protected function configure() + { + $this + ->setDescription('Make user admin') + ->addArgument('email', InputArgument::REQUIRED, 'E-mail address of existing user'); + } + + /** + * @throws \Doctrine\ORM\NonUniqueResultException + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + // Parsing input + $io = new SymfonyStyle($input, $output); + $email = $input->getArgument('email'); + + // Getting user + $this->info("Searching for user", $email, $io); + $user = $this->entityManager->getRepository(User::class)->findByEmail($email); + if (!$user) { + $io->error("Cannot find user by e-mail: " . $email); + return; + } + + if (in_array($this->adminRole, $user->getRoles())) { + $this->printUserRoles($user, $io); + $io->success('Admin role already exists'); + return; + } + + // Adding admin role + $this->info("Adding role: ", $this->adminRole, $io); + $roles = $user->getRoles(); + $roles[] = $this->adminRole; + $user->setRoles(array_unique($roles)); + + // Storing user + $this->entityManager->persist($user); + $this->entityManager->flush(); + + $this->printUserRoles($user, $output); + $io->success('Admin role successfully added'); + } + + private function info($message, $value, OutputInterface $io) + { + $io->writeln(sprintf('%s: %s', $message, $value)); + } + + private function printUserRoles(UserInterface $user, OutputInterface $io) + { + $io->writeln( + "User roles: " . join(', ', $user->getRoles()) . '' + ); + } +} diff --git a/src/Controller/RegistrationController.php b/src/Controller/RegistrationController.php new file mode 100644 index 000000000..b875d710d --- /dev/null +++ b/src/Controller/RegistrationController.php @@ -0,0 +1,57 @@ +createForm(RegistrationFormType::class, $user); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + // encode the plain password + $user->setPassword( + $passwordEncoder->encodePassword( + $user, + $form->get('plainPassword')->getData() + ) + ); + + $entityManager = $this->getDoctrine()->getManager(); + $entityManager->persist($user); + $entityManager->flush(); + + // after validating the user and saving them to the database + // authenticate the user and use onAuthenticationSuccess on the authenticator + return $guardHandler->authenticateUserAndHandleSuccess( + $user, // the User object you just created + $request, + $authenticator, // authenticator whose onAuthenticationSuccess you want to use + 'main' // the name of your firewall in security.yaml + ); + } + + return $this->render('registration/register.html.twig', [ + 'registrationForm' => $form->createView(), + ]); + } +} diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php new file mode 100644 index 000000000..438d36bc1 --- /dev/null +++ b/src/Controller/SecurityController.php @@ -0,0 +1,63 @@ +getUser()) { + // return $this->redirectToRoute('target_path'); + // } + + // get the login error if there is one + $error = $authenticationUtils->getLastAuthenticationError(); + // last username entered by the user + $lastUsername = $authenticationUtils->getLastUsername(); + + return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]); + } + + /** + * @Route("/logout", name="app_logout") + */ + public function logout() + { + throw new \Exception('This method can be blank - it will be intercepted by the logout key on your firewall'); + } + + /** + * @Route("/profile", name="profile") + */ + public function profile(UrlGeneratorInterface $urlGenerator, UserInterface $user = null) + { + if ($user instanceof User) { + return $this->render('security/profile.html.twig', [ + 'user' => $user, + 'userId' => $user->getId(), + 'roles' => $this->roleNames($user->getRoles()), + ]); + } + // Redirect for not logged in users (or different kind) + return new RedirectResponse($urlGenerator->generate('app_login')); + } + + private function roleNames(array $userRoles) + { + foreach ($userRoles as $role) { + yield str_replace('ROLE_', '', $role); + } + } +} diff --git a/src/Entity/User.php b/src/Entity/User.php new file mode 100644 index 000000000..60d1c7cf0 --- /dev/null +++ b/src/Entity/User.php @@ -0,0 +1,207 @@ +id; + } + + public function getEmail(): ?string + { + return $this->email; + } + + public function setEmail(string $email): self + { + $this->email = $email; + + return $this; + } + + /** + * A visual identifier that represents this user. + * + * @see UserInterface + */ + public function getUsername(): string + { + return (string)$this->email; + } + + /** + * @see UserInterface + */ + public function getRoles(): array + { + $roles = $this->roles; + // guarantee every user at least has ROLE_USER + $roles[] = 'ROLE_USER'; + + return array_unique($roles); + } + + public function setRoles(array $roles): self + { + $this->roles = $roles; + + return $this; + } + + /** Virtual method for EasyAdminBundle */ + public function getPlainPassword(): string + { + return ''; // We store passwords hashed, it is impossible to regenerate back + } + + /** Virtual method for EasyAdminBundle */ + public function setPlainPassword($password): self + { + if (!$password) { + return $this; // For usability: Empty password means do not change password + } + + $this->passwordWasChanged = true; + $hash = password_hash($password, PASSWORD_ARGON2I); + return $this->setPassword($hash); + } + + /** + * @return bool + */ + public function isPasswordWasChanged(): bool + { + return $this->passwordWasChanged; + } + + /** + * @see UserInterface + */ + public function getPassword(): string + { + return (string) $this->password; + } + + public function setPassword(string $password): self + { + $this->password = $password; + + return $this; + } + + /** + * @see UserInterface + */ + public function getSalt() + { + // not needed when using the "bcrypt" algorithm in security.yaml + } + + /** + * @see UserInterface + */ + public function eraseCredentials() + { + // If you store any temporary, sensitive data on the user, clear it here + // $this->plainPassword = null; + } + + /** + * @return \DateTime|null + */ + public function getPasswordChanged(): ?\DateTime + { + return $this->passwordChanged; + } + + /** + * @param \DateTime|null $passwordChanged + */ + public function setPasswordChanged(?\DateTime $passwordChanged): void + { + $this->passwordChanged = $passwordChanged; + } + + /** + * @return string|null + */ + public function getHomepage(): ?string + { + return $this->homepage; + } + + /** + * @param string|null $homepage + */ + public function setHomepage(?string $homepage): self + { + $this->homepage = $homepage; + + return $this; + } + + public function getLinkedin(): ?string + { + return $this->linkedin; + } + + public function setLinkedin(?string $linkedin): self + { + $this->linkedin = $linkedin; + + return $this; + } +} diff --git a/src/EventSubscriber/EasyAdminSubscriber.php b/src/EventSubscriber/EasyAdminSubscriber.php new file mode 100644 index 000000000..2a0fe6ee5 --- /dev/null +++ b/src/EventSubscriber/EasyAdminSubscriber.php @@ -0,0 +1,29 @@ +getArgument('entity'); + $em = $event->getArgument('em'); + if (($user instanceof User) && ($em instanceof EntityManager) && $user->isPasswordWasChanged()) { + $user->setPasswordChanged(new \DateTime()); + $em->persist($user); + } + } + + public static function getSubscribedEvents() + { + return [ + EasyAdminEvents::PRE_UPDATE => 'onEasyAdminPreUpdate', + ]; + } +} diff --git a/src/Form/RegistrationFormType.php b/src/Form/RegistrationFormType.php new file mode 100644 index 000000000..abd32eb31 --- /dev/null +++ b/src/Form/RegistrationFormType.php @@ -0,0 +1,57 @@ +add('email') + ->add('plainPassword', PasswordType::class, [ + // instead of being set onto the object directly, + // this is read and encoded in the controller + 'mapped' => false, + 'constraints' => [ + new NotBlank([ + 'message' => 'Please enter a password', + ]), + new Length([ + 'min' => 6, + 'minMessage' => 'Your password should be at least {{ limit }} characters', + // max length allowed by Symfony for security reasons + 'max' => 4096, + ]), + ], + ]) + ->add('homepage', UrlType::class, ['required' => false]) + ->add('linkedin', UrlType::class, ['required' => false]) + ->add('agreeTerms', CheckboxType::class, [ + 'mapped' => false, + 'constraints' => [ + new IsTrue([ + 'message' => 'You should agree to our terms.', + ]), + ], + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => User::class, + ]); + } +} diff --git a/src/Migrations/Version20191116210807.php b/src/Migrations/Version20191116210807.php new file mode 100644 index 000000000..8795cf7bd --- /dev/null +++ b/src/Migrations/Version20191116210807.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('CREATE TABLE user (id INT AUTO_INCREMENT NOT NULL, email VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, UNIQUE INDEX UNIQ_8D93D649E7927C74 (email), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('DROP TABLE user'); + } +} diff --git a/src/Migrations/Version20191118201725.php b/src/Migrations/Version20191118201725.php new file mode 100644 index 000000000..0af21054b --- /dev/null +++ b/src/Migrations/Version20191118201725.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE user ADD homepage VARCHAR(255) DEFAULT NULL, CHANGE roles roles JSON NOT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE user DROP homepage, CHANGE roles roles LONGTEXT NOT NULL COLLATE utf8mb4_bin'); + } +} diff --git a/src/Migrations/Version20191118205131.php b/src/Migrations/Version20191118205131.php new file mode 100644 index 000000000..339ea2510 --- /dev/null +++ b/src/Migrations/Version20191118205131.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE user ADD password_changed DATETIME DEFAULT NULL, CHANGE roles roles JSON NOT NULL, CHANGE homepage homepage VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE user DROP password_changed, CHANGE roles roles LONGTEXT NOT NULL COLLATE utf8mb4_bin, CHANGE homepage homepage VARCHAR(255) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci'); + } +} diff --git a/src/Migrations/Version20191216113136.php b/src/Migrations/Version20191216113136.php new file mode 100644 index 000000000..826151d3f --- /dev/null +++ b/src/Migrations/Version20191216113136.php @@ -0,0 +1,35 @@ +abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE user CHANGE roles roles JSON NOT NULL, CHANGE homepage homepage VARCHAR(255) DEFAULT NULL, CHANGE password_changed password_changed DATETIME DEFAULT NULL, CHANGE linkedin linkedin VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema) : void + { + // this down() migration is auto-generated, please modify it to your needs + $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); + + $this->addSql('ALTER TABLE user CHANGE roles roles LONGTEXT NOT NULL COLLATE utf8mb4_bin, CHANGE password_changed password_changed DATETIME DEFAULT \'NULL\', CHANGE homepage homepage VARCHAR(255) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci, CHANGE linkedin linkedin VARCHAR(255) DEFAULT \'NULL\' COLLATE utf8mb4_unicode_ci'); + } +} diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php new file mode 100644 index 000000000..149bac63d --- /dev/null +++ b/src/Repository/UserRepository.php @@ -0,0 +1,65 @@ +createQueryBuilder('u') + ->andWhere('u.email = :email') + ->setParameter('email', $email) + ->getQuery() + ->getOneOrNullResult() + ; + } + + // /** + // * @return User[] Returns an array of User objects + // */ + /* + public function findByExampleField($value) + { + return $this->createQueryBuilder('u') + ->andWhere('u.exampleField = :val') + ->setParameter('val', $value) + ->orderBy('u.id', 'ASC') + ->setMaxResults(10) + ->getQuery() + ->getResult() + ; + } + */ + + /* + public function findOneBySomeField($value): ?User + { + return $this->createQueryBuilder('u') + ->andWhere('u.exampleField = :val') + ->setParameter('val', $value) + ->getQuery() + ->getOneOrNullResult() + ; + } + */ +} diff --git a/src/Security/AppCustomAuthenticator.php b/src/Security/AppCustomAuthenticator.php new file mode 100644 index 000000000..0b81d1c09 --- /dev/null +++ b/src/Security/AppCustomAuthenticator.php @@ -0,0 +1,99 @@ +entityManager = $entityManager; + $this->urlGenerator = $urlGenerator; + $this->csrfTokenManager = $csrfTokenManager; + $this->passwordEncoder = $passwordEncoder; + } + + public function supports(Request $request) + { + return 'app_login' === $request->attributes->get('_route') + && $request->isMethod('POST'); + } + + public function getCredentials(Request $request) + { + $credentials = [ + 'email' => $request->request->get('email'), + 'password' => $request->request->get('password'), + 'csrf_token' => $request->request->get('_csrf_token'), + ]; + $request->getSession()->set( + Security::LAST_USERNAME, + $credentials['email'] + ); + + return $credentials; + } + + public function getUser($credentials, UserProviderInterface $userProvider) + { + $token = new CsrfToken('authenticate', $credentials['csrf_token']); + if (!$this->csrfTokenManager->isTokenValid($token)) { + throw new InvalidCsrfTokenException(); + } + + $user = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $credentials['email']]); + + if (!$user) { + // fail authentication with a custom error + throw new CustomUserMessageAuthenticationException('Email could not be found.'); + } + + return $user; + } + + public function checkCredentials($credentials, UserInterface $user) + { + return $this->passwordEncoder->isPasswordValid($user, $credentials['password']); + } + + public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) + { + if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) { + return new RedirectResponse($targetPath); + } + + return new RedirectResponse($this->urlGenerator->generate('home')); + } + + protected function getLoginUrl() + { + return $this->urlGenerator->generate('app_login'); + } +} diff --git a/symfony.lock b/symfony.lock index fe3f6a33e..56bee8e74 100644 --- a/symfony.lock +++ b/symfony.lock @@ -78,6 +78,19 @@ "doctrine/reflection": { "version": "v1.0.0" }, + "easycorp/easyadmin-bundle": { + "version": "2.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "2.0", + "ref": "0a51040a43c6f2172a3a0135cd15daf2043905d7" + }, + "files": [ + "config/packages/easy_admin.yaml", + "config/routes/easy_admin.yaml" + ] + }, "jdorn/sql-formatter": { "version": "v1.2.17" }, @@ -90,6 +103,9 @@ "ocramius/proxy-manager": { "version": "2.2.3" }, + "pagerfanta/pagerfanta": { + "version": "v2.1.3" + }, "psr/cache": { "version": "1.0.1" }, @@ -154,6 +170,9 @@ "symfony/event-dispatcher-contracts": { "version": "v1.1.7" }, + "symfony/expression-language": { + "version": "v4.3.8" + }, "symfony/filesystem": { "version": "v4.3.5" }, @@ -172,6 +191,9 @@ ".env" ] }, + "symfony/form": { + "version": "v4.3.8" + }, "symfony/framework-bundle": { "version": "4.2", "recipe": { @@ -197,6 +219,12 @@ "symfony/http-kernel": { "version": "v4.3.5" }, + "symfony/inflector": { + "version": "v4.3.8" + }, + "symfony/intl": { + "version": "v4.3.8" + }, "symfony/maker-bundle": { "version": "1.0", "recipe": { @@ -209,9 +237,15 @@ "symfony/mime": { "version": "v4.3.5" }, + "symfony/options-resolver": { + "version": "v4.3.8" + }, "symfony/orm-pack": { "version": "v1.0.7" }, + "symfony/polyfill-intl-icu": { + "version": "v1.12.0" + }, "symfony/polyfill-intl-idn": { "version": "v1.12.0" }, @@ -224,6 +258,12 @@ "symfony/polyfill-php73": { "version": "v1.12.0" }, + "symfony/profiler-pack": { + "version": "v1.0.4" + }, + "symfony/property-access": { + "version": "v4.3.8" + }, "symfony/routing": { "version": "4.2", "recipe": { @@ -239,12 +279,49 @@ "config/routes.yaml" ] }, + "symfony/security-bundle": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "e5a0228251d1dd2bca4c8ef918e14423c06db625" + }, + "files": [ + "config/packages/security.yaml" + ] + }, + "symfony/security-core": { + "version": "v4.3.8" + }, + "symfony/security-csrf": { + "version": "v4.3.8" + }, + "symfony/security-guard": { + "version": "v4.3.8" + }, + "symfony/security-http": { + "version": "v4.3.8" + }, "symfony/service-contracts": { "version": "v1.1.7" }, "symfony/stopwatch": { "version": "v4.3.5" }, + "symfony/translation": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "2ad9d2545bce8ca1a863e50e92141f0b9d87ffcd" + }, + "files": [ + "config/packages/translation.yaml", + "translations/.gitignore" + ] + }, "symfony/translation-contracts": { "version": "v1.1.7" }, @@ -268,9 +345,39 @@ "symfony/twig-pack": { "version": "v1.0.0" }, + "symfony/validator": { + "version": "4.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.3", + "ref": "d902da3e4952f18d3bf05aab29512eb61cabd869" + }, + "files": [ + "config/packages/test/validator.yaml", + "config/packages/validator.yaml" + ] + }, + "symfony/var-dumper": { + "version": "v4.3.8" + }, "symfony/var-exporter": { "version": "v4.3.5" }, + "symfony/web-profiler-bundle": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6" + }, + "files": [ + "config/packages/dev/web_profiler.yaml", + "config/packages/test/web_profiler.yaml", + "config/routes/dev/web_profiler.yaml" + ] + }, "symfony/webpack-encore-bundle": { "version": "1.0", "recipe": { diff --git a/templates/admin/user/password-read.html.twig b/templates/admin/user/password-read.html.twig new file mode 100644 index 000000000..9047d5038 --- /dev/null +++ b/templates/admin/user/password-read.html.twig @@ -0,0 +1,8 @@ +{% if value %} + **** + {% if item.passwordChanged %} + Updated: {{ item.passwordChanged|date('Y-m-d H:i:s') }} + {% endif %} +{% else %} + Empty +{% endif %} \ No newline at end of file diff --git a/templates/admin/user/roles-type-read.html.twig b/templates/admin/user/roles-type-read.html.twig new file mode 100644 index 000000000..c9907fc9f --- /dev/null +++ b/templates/admin/user/roles-type-read.html.twig @@ -0,0 +1,3 @@ +{% for role in value %} + {{ role|slice(5)|lower }} +{% endfor %} diff --git a/templates/base.html.twig b/templates/base.html.twig index e06313d52..9f8fc70e2 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -8,8 +8,50 @@ {% block stylesheets %} {{ encore_entry_link_tags('app') }} {% endblock %} + {% block head %}{% endblock %} - + + + {% block body %}{% endblock %} {% block javascripts %} {{ encore_entry_script_tags('app') }} diff --git a/templates/bundles/EasyAdminBundle/default/layout.html.twig b/templates/bundles/EasyAdminBundle/default/layout.html.twig new file mode 100644 index 000000000..41fd4f83d --- /dev/null +++ b/templates/bundles/EasyAdminBundle/default/layout.html.twig @@ -0,0 +1,166 @@ +{% extends 'base.html.twig' %} + +{% block title %}{% block page_title %}{{ block('content_title')|striptags|raw }}{% endblock %}{% endblock %} +{% block head %} + {% block head_stylesheets %} + + {% endblock %} + {% block head_custom_stylesheets %} + {% for css_asset in easyadmin_config('design.assets.css') %} + + {% endfor %} + {% endblock head_custom_stylesheets %} + {% if easyadmin_config('design.brand_color') != 'hsl(230, 55%, 60%)' %} + + {% endif %} + {% block head_favicon %} + {% set favicon = easyadmin_config('design.assets.favicon') %} + + {% endblock %} + {% block head_javascript %} + + {% endblock head_javascript %} + {% if easyadmin_config('design.rtl') %} + + + {% endif %} +{% endblock %} + +{% block body_attributes %} id="{% block body_id %}{% endblock %}" class="easyadmin {% block body_class %}{% endblock %}" {% endblock %} +{% block body %} + + {% block wrapper_wrapper %} +
+ {% block wrapper %} +
+ {% block header %} + + {% set _user_name = easyadmin_read_property(app.user, easyadmin_config('user.name_property_path'))|default('user.unnamed'|trans(domain = 'EasyAdminBundle')) %} + {% set _logout_path = easyadmin_logout_path() %} + {% set _user_has_logout = _logout_path is not empty %} + {% set _user_is_impersonated = is_granted('ROLE_PREVIOUS_ADMIN') %} + {% set _user_menu_content %} +
+

{{ 'user.logged_in_as'|trans(domain = 'EasyAdminBundle') }}

+

+ {% if app.user|default(false) == false %} + {{ 'user.anonymous'|trans(domain = 'EasyAdminBundle') }} + {% else %} + {{ _user_name }} + {% endif %} +

+
+ {% block user_menu %} + {% if _user_has_logout or _user_is_impersonated %} +
+ {% if _user_has_logout %} + {{ 'user.signout'|trans(domain = 'EasyAdminBundle') }} + {% endif %} + {% if _user_is_impersonated %} + {{ 'user.exit_impersonation'|trans(domain = 'EasyAdminBundle') }} + {% endif %} +
+ {% endif %} + {% endblock user_menu %} + {% endset %} + + {% endblock header %} +
+ +
+ {% block flash_messages %} + {{ include(_entity_config is defined ? _entity_config.templates.flash_messages : '@EasyAdmin/default/flash_messages.html.twig') }} + {% endblock flash_messages %} + + {% block content %} +
+ {% block content_header_wrapper %} + {% set _has_content_help = _entity_config is defined and _entity_config[app.request.query.get('action')]['help']|default(false) %} +
+ {% block content_header %} +
+
+

{% block content_title %}{% endblock %}

+
+ {% block global_actions_wrapper %} +
{% block global_actions %}{% endblock %}
+ {% endblock %} +
+ {% block content_help %} + {% if _entity_config is defined and _entity_config[app.request.query.get('action')]['help']|default(false) %} +
+ {{ _entity_config[app.request.query.get('action')]['help']|trans(domain = _entity_config.translation_domain)|raw }} +
+ {% endif %} + {% endblock content_help %} + {% endblock content_header %} +
+ {% endblock content_header_wrapper %} +
+ {% block main %}{% endblock %} +
+ {% block content_footer_wrapper %} + + {% endblock %} +
+ {% endblock content %} +
+
+ {% endblock wrapper %} +
+ {% endblock wrapper_wrapper %} + {% block body_javascript %}{% endblock body_javascript %} + {% block body_custom_javascript %} + {% for js_asset in easyadmin_config('design.assets.js') %} + + {% endfor %} + {% endblock body_custom_javascript %} +{% endblock body %} diff --git a/templates/bundles/TwigBundle/Exception/error403.html.twig b/templates/bundles/TwigBundle/Exception/error403.html.twig new file mode 100644 index 000000000..0eb714965 --- /dev/null +++ b/templates/bundles/TwigBundle/Exception/error403.html.twig @@ -0,0 +1,7 @@ +{% extends 'base.html.twig' %} + +{% block body %} +

Neturite teisių

+ + Prisijungti kitu naudotoju +{% endblock %} \ No newline at end of file diff --git a/templates/registration/register.html.twig b/templates/registration/register.html.twig new file mode 100644 index 000000000..76d7c8015 --- /dev/null +++ b/templates/registration/register.html.twig @@ -0,0 +1,17 @@ +{% extends 'base.html.twig' %} + +{% block title %}Register{% endblock %} + +{% block body %} +

Register

+ + {{ form_start(registrationForm) }} + {{ form_row(registrationForm.email) }} + {{ form_row(registrationForm.plainPassword) }} + {{ form_row(registrationForm.homepage) }} + {{ form_row(registrationForm.linkedin) }} + {{ form_row(registrationForm.agreeTerms) }} + + + {{ form_end(registrationForm) }} +{% endblock %} diff --git a/templates/security/login.html.twig b/templates/security/login.html.twig new file mode 100644 index 000000000..5639868fe --- /dev/null +++ b/templates/security/login.html.twig @@ -0,0 +1,42 @@ +{% extends 'base.html.twig' %} + +{% block title %}Log in!{% endblock %} + +{% block body %} +
+ {% if error %} +
{{ error.messageKey|trans(error.messageData, 'security') }}
+ {% endif %} + + {% if app.user %} +
+ You are logged in as {{ app.user.username }}, Logout +
+ {% endif %} + +

Please sign in

+ + + + + + + + {# + Uncomment this section and add a remember_me option below your firewall to activate remember me functionality. + See https://symfony.com/doc/current/security/remember_me.html + +
+ +
+ #} + + +
+{% endblock %} diff --git a/templates/security/profile.html.twig b/templates/security/profile.html.twig new file mode 100644 index 000000000..b9d32095b --- /dev/null +++ b/templates/security/profile.html.twig @@ -0,0 +1,19 @@ +{% extends 'base.html.twig' %} + +{% block title %}Naudotojas{% endblock %} + +{% block body %} +
+

Naudotojas

+ {{ user.username }} + {% for role in roles %} + {{ role|lower }} + {% endfor %} +
+ Website {{ user.homepage }} +
+
+ LinkedIn {{ user.linkedin }} +
+
+{% endblock %} diff --git a/translations/.gitignore b/translations/.gitignore new file mode 100644 index 000000000..e69de29bb