diff --git a/.gitignore b/.gitignore index 6bc1d21d..4b4e40b2 100644 --- a/.gitignore +++ b/.gitignore @@ -61,7 +61,6 @@ doc/* build/* tests/_output/* -.phpstorm.meta.php composer.phar .env diff --git a/.phpstorm.meta.php b/.phpstorm.meta.php new file mode 100644 index 00000000..eef24ddc --- /dev/null +++ b/.phpstorm.meta.php @@ -0,0 +1,5 @@ +. + * along with sysPass. If not, see . */ define('APP_ROOT', __DIR__); diff --git a/app/modules/cli/Commands/CommandBase.php b/app/modules/cli/Commands/CommandBase.php index 15cfed0a..d841b433 100644 --- a/app/modules/cli/Commands/CommandBase.php +++ b/app/modules/cli/Commands/CommandBase.php @@ -1,4 +1,26 @@ . + */ namespace SP\Modules\Cli\Commands; @@ -6,12 +28,11 @@ use Psr\Log\LoggerInterface; use SP\Config\Config; use SP\Config\ConfigData; use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Style\SymfonyStyle; /** * Class CommandBase * - * @package SPDecrypter\Commands + * @package SP\Modules\Cli\Commands */ abstract class CommandBase extends Command { @@ -19,10 +40,7 @@ abstract class CommandBase extends Command * @var LoggerInterface */ protected $logger; - /** - * @var SymfonyStyle - */ - protected $io; + /** * @var Config */ @@ -36,19 +54,17 @@ abstract class CommandBase extends Command * CommandBase constructor. * * @param LoggerInterface $logger - * @param SymfonyStyle $io * @param Config $config */ public function __construct( LoggerInterface $logger, - SymfonyStyle $io, - Config $config) + Config $config + ) { - parent::__construct(); - $this->logger = $logger; - $this->io = $io; $this->config = $config; $this->configData = $this->config->getConfigData(); + + parent::__construct(); } } \ No newline at end of file diff --git a/app/modules/cli/Commands/InstallCommand.php b/app/modules/cli/Commands/InstallCommand.php index cf8ae025..65d024af 100644 --- a/app/modules/cli/Commands/InstallCommand.php +++ b/app/modules/cli/Commands/InstallCommand.php @@ -24,18 +24,22 @@ namespace SP\Modules\Cli\Commands; +use Closure; use Exception; use Psr\Log\LoggerInterface; use RuntimeException; use SP\Config\Config; +use SP\Core\Exceptions\InstallError; use SP\Core\Exceptions\InvalidArgumentException; use SP\Core\Language; use SP\Services\Install\InstallData; use SP\Services\Install\Installer; +use SP\Util\Util; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\StyleInterface; use Symfony\Component\Console\Style\SymfonyStyle; /** @@ -45,6 +49,25 @@ use Symfony\Component\Console\Style\SymfonyStyle; */ final class InstallCommand extends CommandBase { + /** + * @var string[] + */ + public static $envVarsMapping = [ + 'adminLogin' => 'ADMIN_LOGIN', + 'adminPassword' => 'ADMIN_PASSWORD', + 'databaseHost' => 'DATABASE_HOST', + 'databaseName' => 'DATABASE_NAME', + 'databaseUser' => 'DATABASE_USER', + 'databasePassword' => 'DATABASE_PASSWORD', + 'masterPassword' => 'MASTER_PASSWORD', + 'hostingMode' => 'HOSTING_MODE', + 'language' => 'LANGUAGE', + 'forceInstall' => 'FORCE_INSTALL', + 'install' => 'INSTALL' + ]; + /** + * @var string + */ protected static $defaultName = 'sp:install'; /** * @var Installer @@ -52,30 +75,29 @@ final class InstallCommand extends CommandBase private $installer; public function __construct(LoggerInterface $logger, - SymfonyStyle $io, - Config $config, - Installer $installer) + Config $config, + Installer $installer) { - parent::__construct($logger, $io, $config); + parent::__construct($logger, $config); $this->installer = $installer; } - protected function configure() + protected function configure(): void { - $this->setDescription(__('Install sysPass.')) - ->setHelp(__('This command installs sysPass.')) + $this->setDescription(__('Install sysPass')) + ->setHelp(__('This command installs sysPass')) ->addArgument('adminLogin', - InputArgument::REQUIRED, + InputArgument::OPTIONAL, __('Admin user to log into the application')) ->addArgument('databaseHost', - InputArgument::REQUIRED, + InputArgument::OPTIONAL, __('Server name to install sysPass database')) ->addArgument('databaseName', - InputArgument::REQUIRED, + InputArgument::OPTIONAL, __('Application database name. eg. syspass')) ->addArgument('databaseUser', - InputArgument::REQUIRED, + InputArgument::OPTIONAL, __('An user with database administrative rights')) ->addOption('databasePassword', null, @@ -91,41 +113,79 @@ final class InstallCommand extends CommandBase __('Master password to encrypt the passwords')) ->addOption('hostingMode', null, - InputOption::VALUE_OPTIONAL, - __('It does not create or verify the user\'s permissions on the DB'), - false) + InputOption::VALUE_NONE, + __('It does not create or verify the user\'s permissions on the DB')) ->addOption('language', null, InputOption::VALUE_OPTIONAL, - __('Sets the global app language. You can set a per user language on preferences.')) - ->addOption('force', + __('Sets the global app language. You can set a per user language on preferences')) + ->addOption('forceInstall', null, - InputOption::VALUE_OPTIONAL, - __('Force sysPass installation.'), - false); + InputOption::VALUE_NONE, + __('Force sysPass installation')) + ->addOption('install', + null, + InputOption::VALUE_NONE, + __('Skip asking to confirm the installation')); } /** * @param InputInterface $input * @param OutputInterface $output * - * @return int|void + * @return int */ - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { - $force = (bool)$input->getOption('force'); + $style = new SymfonyStyle($input, $output); - if ($this->configData->isInstalled() && $force === false) { - $this->logger->warning(__u('sysPass is already installed')); + try { + $installData = $this->getInstallData($input, $style); - $this->io->warning(__('sysPass is already installed. Use \'--force\' to install it again.')); + $forceInstall = $this->getForceInstall($input); - return self::FAILURE; + if (!$forceInstall || !$this->getInstall($input, $style)) { + $this->logger->debug(__u('Installation aborted')); + $style->info(__('Installation aborted')); + + return self::FAILURE; + } + + $this->installer->run($installData); + + $this->logger->info(__('Installation finished')); + + $style->success(__('Installation finished')); + + return self::SUCCESS; + } catch (InstallError $e) { + $this->logger->error($e->getMessage()); + + $style->error(__($e->getMessage())); + } catch (InvalidArgumentException $e) { + $this->logger->warning($e->getMessage()); + + $style->warning(__($e->getMessage())); + } catch (Exception $e) { + $this->logger->error($e->getTraceAsString()); + $this->logger->error($e->getMessage()); + + $style->error(__($e->getMessage())); } - $adminPassword = $input->getOption('adminPassword'); + return self::FAILURE; + } - $passNonEmptyValidator = function ($value) { + /** + * @param InputInterface $input + * @param StyleInterface $style + * + * @return InstallData + * @throws InstallError + */ + private function getInstallData(InputInterface $input, StyleInterface $style): InstallData + { + $passNotEmptyValidator = function ($value) { if (empty($value)) { throw new RuntimeException(__('Password cannot be blank')); } @@ -133,83 +193,258 @@ final class InstallCommand extends CommandBase return $value; }; - if (empty($adminPassword)) { + $adminPassword = $this->getAdminPassword($input, $style, $passNotEmptyValidator); + $masterPassword = $this->getMasterPassword($input, $style, $passNotEmptyValidator); + $databasePassword = $this->getDatabasePassword($input, $style); + $language = $this->getLanguage($input, $style); + $hostingMode = $this->isHostingMode($input); + $adminLogin = self::getEnvVarOrArgument('adminLogin', $input); + $databaseUser = self::getEnvVarOrArgument('databaseUser', $input); + $databaseName = self::getEnvVarOrArgument('databaseName', $input); + $databaseHost = self::getEnvVarOrArgument('databaseHost', $input); + + $installData = new InstallData(); + $installData->setSiteLang($language); + $installData->setAdminLogin($adminLogin); + $installData->setAdminPass($adminPassword); + $installData->setMasterPassword($masterPassword); + $installData->setDbAdminUser($databaseUser); + $installData->setDbAdminPass($databasePassword); + $installData->setDbName($databaseName); + $installData->setDbHost($databaseHost); + $installData->setHostingMode($hostingMode); + + return $installData; + } + + /** + * @param InputInterface $input + * @param StyleInterface $style + * @param Closure $passNotEmptyValidator + * + * @return array|false|mixed|string + * @throws InstallError + */ + private function getAdminPassword( + InputInterface $input, + StyleInterface $style, + Closure $passNotEmptyValidator + ) + { + $option = 'adminPassword'; + + $password = + self::getEnvVarForOption($option) + ?: $input->getOption($option); + + if (empty($password)) { $this->logger->debug(__u('Ask for admin password')); - $adminPassword = $this->io->askHidden(__('Please provide sysPass admin\'s password'), $passNonEmptyValidator); - $adminPasswordRepeat = $this->io->askHidden(__('Please provide sysPass admin\'s password again'), $passNonEmptyValidator); + $password = $style->askHidden( + __('Please provide sysPass admin\'s password'), + $passNotEmptyValidator + ); - if ($adminPassword !== $adminPasswordRepeat) { - $this->io->warning(__('Passwords do not match')); + $passwordRepeat = $style->askHidden( + __('Please provide sysPass admin\'s password again'), + $passNotEmptyValidator + ); - return self::FAILURE; + if ($password !== $passwordRepeat) { + throw new InstallError(__u('Passwords do not match')); + } elseif (null === $password || null === $passwordRepeat) { + throw new InstallError(sprintf(__u('%s cannot be blank'), 'Admin password')); } } - $masterPassword = $input->getOption('masterPassword'); + return $password; + } - if (empty($masterPassword)) { + /** + * @param InputInterface $input + * @param StyleInterface $style + * @param Closure $passNotEmptyValidator + * + * @return array|false|mixed|string + * @throws InstallError + */ + private function getMasterPassword( + InputInterface $input, + StyleInterface $style, + Closure $passNotEmptyValidator + ) + { + $password = self::getEnvVarOrOption('masterPassword', $input); + + if (empty($password)) { $this->logger->debug(__u('Ask for master password')); - $masterPassword = $this->io->askHidden(__('Please provide sysPass master password'), $passNonEmptyValidator); - $masterPasswordRepeat = $this->io->askHidden(__('Please provide sysPass master password again'), $passNonEmptyValidator); + $password = $style->askHidden( + __('Please provide sysPass master password'), + $passNotEmptyValidator + ); + $passwordRepeat = $style->askHidden( + __('Please provide sysPass master password again'), + $passNotEmptyValidator + ); - if ($masterPassword !== $masterPasswordRepeat) { - $this->io->warning(__('Passwords do not match')); - - return self::FAILURE; + if ($password !== $passwordRepeat) { + throw new InstallError(__u('Passwords do not match')); + } elseif (null === $password || null === $passwordRepeat) { + throw new InstallError(sprintf(__u('%s cannot be blank'), 'Master password')); } } - $databasePassword = $input->getOption('databasePassword'); + return $password; + } - if (empty($databasePassword)) { + /** + * @param string $option + * @param InputInterface $input + * + * @return array|false|mixed|string + */ + private static function getEnvVarOrOption( + string $option, + InputInterface $input + ) + { + return self::getEnvVarForOption($option) + ?: $input->getOption($option); + } + + /** + * @param string $option + * + * @return string|false + */ + public static function getEnvVarForOption(string $option) + { + return getenv(self::$envVarsMapping[$option]); + } + + /** + * @param InputInterface $input + * @param StyleInterface $style + * + * @return array|false|mixed|string + */ + private function getDatabasePassword( + InputInterface $input, + StyleInterface $style + ) + { + $password = self::getEnvVarOrOption('databasePassword', $input); + + if (empty($password)) { $this->logger->debug(__u('Ask for database password')); - $databasePassword = $this->io->askHidden(__('Please provide database admin password')); + $password = $style->askHidden(__('Please provide database admin password')); } - $language = $input->getOption('language'); + return $password; + } + + /** + * @param InputInterface $input + * @param StyleInterface $style + * + * @return array|false|mixed|string + */ + private function getLanguage( + InputInterface $input, + StyleInterface $style + ) + { + $language = self::getEnvVarOrOption('language', $input); if (empty($language)) { $this->logger->debug(__u('Ask for language')); - $language = $this->io->choice(__('Language'), array_keys(Language::getAvailableLanguages()), 'en_US'); + $language = $style->choice( + __('Language'), + array_keys(Language::getAvailableLanguages()), + 'en_US' + ); } - $install = $this->io->confirm(__('Install sysPass?'), false); + return $language; + } - if (!$install) { - $this->logger->debug(__u('Installation aborted')); + /** + * @param InputInterface $input + * + * @return bool + */ + private function isHostingMode(InputInterface $input): bool + { + $option = 'hostingMode'; - return self::SUCCESS; + $envHostingMode = self::getEnvVarForOption($option); + + return $envHostingMode !== false + ? Util::boolval($envHostingMode) + : $input->getOption($option); + } + + /** + * @param string $argument + * @param InputInterface $input + * + * @return array|false|mixed|string + */ + private static function getEnvVarOrArgument( + string $argument, + InputInterface $input + ) + { + return self::getEnvVarForOption($argument) + ?: $input->getArgument($argument); + } + + /** + * @param InputInterface $input + * + * @return bool + * @throws InstallError + */ + private function getForceInstall(InputInterface $input): bool + { + $option = 'forceInstall'; + + $envForceInstall = self::getEnvVarForOption($option); + + $force = $envForceInstall !== false + ? Util::boolval($envForceInstall) + : $input->getOption($option); + + if ($force === false && $this->configData->isInstalled()) { + throw new InstallError(__u('sysPass is already installed. Use \'--forceInstall\' to install it again.')); } - $installData = new InstallData(); - $installData->setSiteLang($language); - $installData->setAdminLogin($input->getArgument('adminLogin')); - $installData->setAdminPass($adminPassword); - $installData->setMasterPassword($masterPassword); - $installData->setDbAdminUser($input->getArgument('databaseUser')); - $installData->setDbAdminPass($databasePassword); - $installData->setDbName($input->getArgument('databaseName')); - $installData->setDbHost($input->getArgument('databaseHost')); - $installData->setHostingMode((bool)$input->getOption('hostingMode')); + return $force; + } - try { - $this->installer->run($installData); + /** + * @param InputInterface $input + * @param StyleInterface $style + * + * @return bool + */ + private function getInstall(InputInterface $input, StyleInterface $style): bool + { + $option = 'install'; - $this->io->success(__('Installation finished')); + $envInstall = self::getEnvVarForOption($option); - $this->logger->info(__u('Installation finished')); - return self::SUCCESS; - } catch (InvalidArgumentException $e) { - $this->io->error(__($e->getMessage())); - } catch (Exception $e) { - $this->logger->error($e->getTraceAsString()); - $this->logger->error($e->getMessage()); + $install = $envInstall !== false + ? Util::boolval($envInstall) + : $input->getOption($option); + + if ($install === false) { + return $style->confirm(__('Install sysPass?'), false); } - return self::FAILURE; + return true; } } \ No newline at end of file diff --git a/app/modules/cli/Init.php b/app/modules/cli/Init.php index c39c6c07..722f8e87 100644 --- a/app/modules/cli/Init.php +++ b/app/modules/cli/Init.php @@ -24,20 +24,15 @@ namespace SP\Modules\Cli; -use Defuse\Crypto\Exception\EnvironmentIsBrokenException; use DI\DependencyException; use DI\NotFoundException; +use Exception; use Psr\Container\ContainerInterface; use SP\Core\Context\ContextException; use SP\Core\Context\StatelessContext; -use SP\Core\Exceptions\InitializationException; use SP\Core\Language; use SP\Core\ModuleBase; use SP\Modules\Cli\Commands\InstallCommand; -use SP\Services\Upgrade\UpgradeAppService; -use SP\Services\Upgrade\UpgradeDatabaseService; -use SP\Services\Upgrade\UpgradeUtil; -use SP\Storage\File\FileException; use SP\Util\VersionUtil; use Symfony\Component\Console\Application; use Symfony\Component\Console\Input\InputInterface; @@ -62,7 +57,7 @@ final class Init extends ModuleBase */ protected $language; /** - * @var mixed|Application + * @var Application */ protected $application; @@ -106,8 +101,9 @@ final class Init extends ModuleBase /** * @throws DependencyException * @throws NotFoundException + * @throws Exception */ - private function initCli() + private function initCli(): void { $this->application->setName('sysPass CLI'); $this->application->setVersion(implode('.', VersionUtil::getVersionArray())); @@ -121,38 +117,4 @@ final class Init extends ModuleBase $this->container->get(OutputInterface::class) ); } - - /** - * Comprueba que la aplicación esté instalada - * Esta función comprueba si la aplicación está instalada. Si no lo está, redirige al instalador. - * - * @throws InitializationException - */ - private function checkInstalled() - { - if (!$this->configData->isInstalled()) { - throw new InitializationException('Not installed'); - } - } - - /** - * Comprobar si es necesario actualizar componentes - * - * @throws EnvironmentIsBrokenException - * @throws FileException - * @throws InitializationException - */ - private function checkUpgrade() - { - UpgradeUtil::fixAppUpgrade($this->configData, $this->config); - - if ($this->configData->getUpgradeKey() - || (UpgradeDatabaseService::needsUpgrade($this->configData->getDatabaseVersion()) || - UpgradeAppService::needsUpgrade($this->configData->getAppVersion())) - ) { - $this->config->generateUpgradeKey(); - - throw new InitializationException(__u('Updating needed')); - } - } } \ No newline at end of file diff --git a/app/modules/cli/definitions.php b/app/modules/cli/definitions.php index 8aef1ed4..eadbb718 100644 --- a/app/modules/cli/definitions.php +++ b/app/modules/cli/definitions.php @@ -32,13 +32,11 @@ use Symfony\Component\Console\Input\ArgvInput; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\ConsoleOutput; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Style\SymfonyStyle; use function DI\autowire; use function DI\create; -use function DI\factory; return [ - LoggerInterface::class => function (ContainerInterface $c) { + LoggerInterface::class => static function (ContainerInterface $c) { $logger = $c->get(Logger::class); $logger->pushHandler(new StreamHandler(LOG_FILE)); @@ -46,13 +44,7 @@ return [ }, Application::class => create(Application::class), OutputInterface::class => create(ConsoleOutput::class) - ->constructor(ConsoleOutput::VERBOSITY_NORMAL, true), + ->constructor(OutputInterface::VERBOSITY_NORMAL, true), InputInterface::class => create(ArgvInput::class), - SymfonyStyle::class => factory(function (ContainerInterface $c) { - return new SymfonyStyle( - $c->get(InputInterface::class), - $c->get(OutputInterface::class) - ); - }), InstallCommand::class => autowire() ]; diff --git a/composer.json b/composer.json index 82a26f8e..1b9d5a8b 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ }, "require": { "roave/security-advisories": "dev-master", - "php": "~7.3 || ~7.4", + "php": "~7.3 || ~7.4 || ~8.0", "defuse/php-encryption": "^2.1", "phpmailer/phpmailer": "^6.0", "ademarre/binary-to-text-php": "dev-master", diff --git a/composer.lock b/composer.lock index 74220f09..db76a2a8 100644 --- a/composer.lock +++ b/composer.lock @@ -58,26 +58,25 @@ }, { "name": "defuse/php-encryption", - "version": "v2.2.1", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/defuse/php-encryption.git", - "reference": "0f407c43b953d571421e0020ba92082ed5fb7620" + "reference": "77880488b9954b7884c25555c2a0ea9e7053f9d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/defuse/php-encryption/zipball/0f407c43b953d571421e0020ba92082ed5fb7620", - "reference": "0f407c43b953d571421e0020ba92082ed5fb7620", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/77880488b9954b7884c25555c2a0ea9e7053f9d2", + "reference": "77880488b9954b7884c25555c2a0ea9e7053f9d2", "shasum": "" }, "require": { "ext-openssl": "*", "paragonie/random_compat": ">= 2", - "php": ">=5.4.0" + "php": ">=5.6.0" }, "require-dev": { - "nikic/php-parser": "^2.0|^3.0|^4.0", - "phpunit/phpunit": "^4|^5" + "phpunit/phpunit": "^4|^5|^6|^7|^8|^9" }, "bin": [ "bin/generate-defuse-key" @@ -119,41 +118,38 @@ ], "support": { "issues": "https://github.com/defuse/php-encryption/issues", - "source": "https://github.com/defuse/php-encryption/tree/master" + "source": "https://github.com/defuse/php-encryption/tree/v2.3.1" }, - "time": "2018-07-24T23:27:56+00:00" + "time": "2021-04-09T23:57:26+00:00" }, { "name": "doctrine/annotations", - "version": "1.11.1", + "version": "1.13.2", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad" + "reference": "5b668aef16090008790395c02c893b1ba13f7e08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08", + "reference": "5b668aef16090008790395c02c893b1ba13f7e08", "shasum": "" }, "require": { "doctrine/lexer": "1.*", "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "doctrine/cache": "1.*", + "doctrine/cache": "^1.11 || ^2.0", "doctrine/coding-standard": "^6.0 || ^8.1", "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^9.1.5" + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" @@ -194,22 +190,22 @@ ], "support": { "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.11.1" + "source": "https://github.com/doctrine/annotations/tree/1.13.2" }, - "time": "2020-10-26T10:28:16+00:00" + "time": "2021-08-05T19:00:23+00:00" }, { "name": "doctrine/cache", - "version": "1.10.2", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "13e3381b25847283a91948d04640543941309727" + "reference": "4cf401d14df219fa6f38b671f5493449151c9ad8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", - "reference": "13e3381b25847283a91948d04640543941309727", + "url": "https://api.github.com/repos/doctrine/cache/zipball/4cf401d14df219fa6f38b671f5493449151c9ad8", + "reference": "4cf401d14df219fa6f38b671f5493449151c9ad8", "shasum": "" }, "require": { @@ -220,20 +216,19 @@ }, "require-dev": { "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^8.0", "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "predis/predis": "~1.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.2 || ^6.0@dev", + "symfony/var-exporter": "^4.4 || ^5.2 || ^6.0@dev" }, "suggest": { "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" @@ -280,7 +275,7 @@ ], "support": { "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/1.10.x" + "source": "https://github.com/doctrine/cache/tree/1.12.1" }, "funding": [ { @@ -296,30 +291,30 @@ "type": "tidelift" } ], - "time": "2020-07-07T18:54:01+00:00" + "time": "2021-07-17T14:39:21+00:00" }, { "name": "doctrine/collections", - "version": "1.6.7", + "version": "1.6.8", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" + "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "url": "https://api.github.com/repos/doctrine/collections/zipball/1958a744696c6bb3bb0d28db2611dc11610e78af", + "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af", "shasum": "" }, "require": { "php": "^7.1.3 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan-shim": "^0.9.2", - "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.8.1" + "doctrine/coding-standard": "^9.0", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", + "vimeo/psalm": "^4.2.1" }, "type": "library", "autoload": { @@ -363,9 +358,9 @@ ], "support": { "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/1.6.7" + "source": "https://github.com/doctrine/collections/tree/1.6.8" }, - "time": "2020-07-27T17:53:49+00:00" + "time": "2021-08-10T18:51:53+00:00" }, { "name": "doctrine/common", @@ -564,26 +559,26 @@ }, { "name": "doctrine/inflector", - "version": "1.4.3", + "version": "1.4.4", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" + "reference": "4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9", + "reference": "4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", + "doctrine/coding-standard": "^8.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", @@ -640,7 +635,7 @@ ], "support": { "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/1.4.x" + "source": "https://github.com/doctrine/inflector/tree/1.4.4" }, "funding": [ { @@ -656,7 +651,7 @@ "type": "tidelift" } ], - "time": "2020-05-29T07:19:59+00:00" + "time": "2021-04-16T17:34:40+00:00" }, { "name": "doctrine/lexer", @@ -996,16 +991,16 @@ }, { "name": "guzzlehttp/promises", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "60d379c243457e073cff02bc323a2a86cb355631" + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", - "reference": "60d379c243457e073cff02bc323a2a86cb355631", + "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", "shasum": "" }, "require": { @@ -1045,22 +1040,22 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.4.0" + "source": "https://github.com/guzzle/promises/tree/1.4.1" }, - "time": "2020-09-30T07:37:28+00:00" + "time": "2021-03-07T09:25:29+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.7.0", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" + "reference": "dc960a912984efb74d0a90222870c72c87f10c91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", - "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", + "reference": "dc960a912984efb74d0a90222870c72c87f10c91", "shasum": "" }, "require": { @@ -1120,9 +1115,9 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.7.0" + "source": "https://github.com/guzzle/psr7/tree/1.8.2" }, - "time": "2020-09-30T07:37:11+00:00" + "time": "2021-04-26T09:17:50+00:00" }, { "name": "klein/klein", @@ -1254,16 +1249,16 @@ }, { "name": "monolog/monolog", - "version": "1.26.0", + "version": "1.26.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "2209ddd84e7ef1256b7af205d0717fb62cfc9c33" + "reference": "c6b00f05152ae2c9b04a448f99c7590beb6042f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/2209ddd84e7ef1256b7af205d0717fb62cfc9c33", - "reference": "2209ddd84e7ef1256b7af205d0717fb62cfc9c33", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c6b00f05152ae2c9b04a448f99c7590beb6042f5", + "reference": "c6b00f05152ae2c9b04a448f99c7590beb6042f5", "shasum": "" }, "require": { @@ -1324,7 +1319,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/1.26.0" + "source": "https://github.com/Seldaek/monolog/tree/1.26.1" }, "funding": [ { @@ -1336,20 +1331,20 @@ "type": "tidelift" } ], - "time": "2020-12-14T12:56:38+00:00" + "time": "2021-05-28T08:32:12+00:00" }, { "name": "opis/closure", - "version": "3.6.1", + "version": "3.6.2", "source": { "type": "git", "url": "https://github.com/opis/closure.git", - "reference": "943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5" + "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5", - "reference": "943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5", + "url": "https://api.github.com/repos/opis/closure/zipball/06e2ebd25f2869e54a306dda991f7db58066f7f6", + "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6", "shasum": "" }, "require": { @@ -1399,9 +1394,9 @@ ], "support": { "issues": "https://github.com/opis/closure/issues", - "source": "https://github.com/opis/closure/tree/3.6.1" + "source": "https://github.com/opis/closure/tree/3.6.2" }, - "time": "2020-11-07T02:01:34+00:00" + "time": "2021-04-09T13:42:10+00:00" }, { "name": "paragonie/random_compat", @@ -1455,21 +1450,21 @@ }, { "name": "php-di/invoker", - "version": "2.3.0", + "version": "2.3.2", "source": { "type": "git", "url": "https://github.com/PHP-DI/Invoker.git", - "reference": "992fec6c56f2d1ad1ad5fee28267867c85bfb8f9" + "reference": "5214cbe5aad066022cd845dbf313f0e47aed928f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/992fec6c56f2d1ad1ad5fee28267867c85bfb8f9", - "reference": "992fec6c56f2d1ad1ad5fee28267867c85bfb8f9", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/5214cbe5aad066022cd845dbf313f0e47aed928f", + "reference": "5214cbe5aad066022cd845dbf313f0e47aed928f", "shasum": "" }, "require": { "php": ">=7.3", - "psr/container": "~1.0" + "psr/container": "^1.0|^2.0" }, "require-dev": { "athletic/athletic": "~0.1.8", @@ -1498,7 +1493,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/Invoker/issues", - "source": "https://github.com/PHP-DI/Invoker/tree/2.3.0" + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.2" }, "funding": [ { @@ -1506,20 +1501,20 @@ "type": "github" } ], - "time": "2021-01-15T10:25:40+00:00" + "time": "2021-07-30T15:05:32+00:00" }, { "name": "php-di/php-di", - "version": "6.3.0", + "version": "6.3.4", "source": { "type": "git", "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "955cacea6b0beaba07e8c11b8367f5b3d5abe89f" + "reference": "f53bcba06ab31b18e911b77c039377f4ccd1f7a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/955cacea6b0beaba07e8c11b8367f5b3d5abe89f", - "reference": "955cacea6b0beaba07e8c11b8367f5b3d5abe89f", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/f53bcba06ab31b18e911b77c039377f4ccd1f7a5", + "reference": "f53bcba06ab31b18e911b77c039377f4ccd1f7a5", "shasum": "" }, "require": { @@ -1536,7 +1531,7 @@ "doctrine/annotations": "~1.2", "friendsofphp/php-cs-fixer": "^2.4", "mnapoli/phpunit-easymock": "^1.2", - "ocramius/proxy-manager": "~2.0.2", + "ocramius/proxy-manager": "^2.0.2", "phpstan/phpstan": "^0.12", "phpunit/phpunit": "^8.5|^9.0" }, @@ -1570,7 +1565,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/6.3.0" + "source": "https://github.com/PHP-DI/PHP-DI/tree/6.3.4" }, "funding": [ { @@ -1582,7 +1577,7 @@ "type": "tidelift" } ], - "time": "2020-10-12T14:39:15+00:00" + "time": "2021-06-10T08:04:48+00:00" }, { "name": "php-di/phpdoc-reader", @@ -1628,16 +1623,16 @@ }, { "name": "phpmailer/phpmailer", - "version": "v6.2.0", + "version": "v6.5.1", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "e38888a75c070304ca5514197d4847a59a5c853f" + "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e38888a75c070304ca5514197d4847a59a5c853f", - "reference": "e38888a75c070304ca5514197d4847a59a5c853f", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/dd803df5ad7492e1b40637f7ebd258fee5ca7355", + "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355", "shasum": "" }, "require": { @@ -1649,13 +1644,15 @@ "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", "doctrine/annotations": "^1.2", + "php-parallel-lint/php-console-highlighter": "^0.5.0", + "php-parallel-lint/php-parallel-lint": "^1.3", "phpcompatibility/php-compatibility": "^9.3.5", "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.5.6", - "yoast/phpunit-polyfills": "^0.2.0" + "squizlabs/php_codesniffer": "^3.6.0", + "yoast/phpunit-polyfills": "^1.0.0" }, "suggest": { - "ext-mbstring": "Needed to send email in multibyte encoding charset", + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", "league/oauth2-google": "Needed for Google XOAUTH2 authentication", "psr/log": "For optional PSR-3 debug logging", @@ -1692,7 +1689,7 @@ "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.2.0" + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.5.1" }, "funding": [ { @@ -1700,7 +1697,7 @@ "type": "github" } ], - "time": "2020-11-25T15:24:57+00:00" + "time": "2021-08-18T09:14:16+00:00" }, { "name": "phpoption/phpoption", @@ -1773,16 +1770,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "2.0.30", + "version": "2.0.33", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "136b9ca7eebef78be14abf90d65c5e57b6bc5d36" + "reference": "fb53b7889497ec7c1362c94e61d8127ac67ea094" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/136b9ca7eebef78be14abf90d65c5e57b6bc5d36", - "reference": "136b9ca7eebef78be14abf90d65c5e57b6bc5d36", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/fb53b7889497ec7c1362c94e61d8127ac67ea094", + "reference": "fb53b7889497ec7c1362c94e61d8127ac67ea094", "shasum": "" }, "require": { @@ -1862,7 +1859,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/2.0.30" + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.33" }, "funding": [ { @@ -1878,20 +1875,20 @@ "type": "tidelift" } ], - "time": "2020-12-17T05:42:04+00:00" + "time": "2021-08-16T04:20:12+00:00" }, { - "name": "psr/container", - "version": "1.0.0", + "name": "psr/cache", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", "shasum": "" }, "require": { @@ -1905,7 +1902,7 @@ }, "autoload": { "psr-4": { - "Psr\\Container\\": "src/" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1918,6 +1915,50 @@ "homepage": "http://www.php-fig.org/" } ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/container", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], "description": "Common Container Interface (PHP FIG PSR-11)", "homepage": "https://github.com/php-fig/container", "keywords": [ @@ -1929,9 +1970,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/master" + "source": "https://github.com/php-fig/container/tree/1.1.1" }, - "time": "2017-02-14T16:28:37+00:00" + "time": "2021-03-05T17:36:06+00:00" }, { "name": "psr/http-message", @@ -1988,16 +2029,16 @@ }, { "name": "psr/log", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { @@ -2021,7 +2062,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", @@ -2032,9 +2073,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" + "source": "https://github.com/php-fig/log/tree/1.1.4" }, - "time": "2020-03-23T09:12:05+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { "name": "ralouphie/getallheaders", @@ -2086,18 +2127,19 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "8925516274a93151a553e6e30703dff0703a36e4" + "reference": "3c3cc12a9f163e589a12b9ea756c5a2dae9c59dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/8925516274a93151a553e6e30703dff0703a36e4", - "reference": "8925516274a93151a553e6e30703dff0703a36e4", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/3c3cc12a9f163e589a12b9ea756c5a2dae9c59dd", + "reference": "3c3cc12a9f163e589a12b9ea756c5a2dae9c59dd", "shasum": "" }, "conflict": { "3f/pygmentize": "<1.2", "adodb/adodb-php": "<5.20.12", "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<1.0.1", "amphp/http-client": ">=4,<4.4", @@ -2107,25 +2149,30 @@ "bagisto/bagisto": "<0.1.5", "barrelstrength/sprout-base-email": "<1.2.7", "barrelstrength/sprout-forms": "<3.9", - "baserproject/basercms": ">=4,<=4.3.6|>=4.4,<4.4.1", - "bolt/bolt": "<3.7.1", + "baserproject/basercms": "<4.4.5", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "bolt/bolt": "<3.7.2", + "bolt/core": "<4.1.13", "brightlocal/phpwhois": "<=4.2.5", "buddypress/buddypress": "<5.1.2", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", "cartalyst/sentry": "<=2.1.6", - "centreon/centreon": "<18.10.8|>=19,<19.4.5", + "centreon/centreon": "<20.10.7", "cesnet/simplesamlphp-module-proxystatistics": "<3.1", "codeigniter/framework": "<=3.0.6", - "composer/composer": "<=1-alpha.11", + "composer/composer": "<1.10.22|>=2-alpha.1,<2.0.13", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", + "contao/core-bundle": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", + "craftcms/cms": "<3.6.7", + "croogo/croogo": "<3.0.7", "datadog/dd-trace": ">=0.30,<0.30.2", "david-garcia/phpwhois": "<=4.3.1", "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", + "directmailteam/direct-mail": "<5.2.4", "doctrine/annotations": ">=1,<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", @@ -2134,14 +2181,16 @@ "doctrine/doctrine-module": "<=0.7.1", "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", - "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", - "dolibarr/dolibarr": "<11.0.4", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", + "dolibarr/dolibarr": "<14", "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", - "drupal/drupal": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", + "drupal/core": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "drupal/drupal": ">=7,<7.80|>=8,<8.9.14|>=9,<9.0.12|>=9.1,<9.1.7", + "dweeves/magmi": "<=0.7.24", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.13.1", "erusev/parsedown": "<1.7.2", + "ether/logs": "<3.0.4", "ezsystems/demobundle": ">=5.4,<5.4.6.1", "ezsystems/ez-support-tools": ">=2.2,<2.2.3", "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", @@ -2149,116 +2198,152 @@ "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", - "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", + "ezsystems/ezplatform-kernel": "<=1.2.5|>=1.3,<=1.3.1", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<=1.3.1", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1", + "ezsystems/ezpublish-kernel": "<=6.13.8.1|>=7,<=7.5.15.1", "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", "ezyang/htmlpurifier": "<4.1.1", + "facade/ignition": "<1.16.14|>=2,<2.4.2|>=2.5,<2.5.2", + "feehi/cms": "<=2.1.1", "firebase/php-jwt": "<2", + "flarum/core": ">=1,<=1.0.1", + "flarum/sticky": ">=0.1-beta.14,<=0.1-beta.15", + "flarum/tags": "<=0.1-beta.13", + "fluidtypo3/vhs": "<5.1.1", "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<5.8.3", "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<6.5.1", "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "froala/wysiwyg-editor": "<3.2.7", "fuel/core": "<1.8.1", - "getgrav/grav": "<1.7-beta.8", - "getkirby/cms": ">=3,<3.4.5", + "getgrav/grav": "<=1.7.10", + "getkirby/cms": "<=3.5.6", "getkirby/panel": "<2.5.14", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<5.5.13", "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", - "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29|>=5.5,<=5.5.44|>=6,<6.20.11|>=7,<7.30.2|>=8,<8.22.1", + "illuminate/database": "<6.20.26|>=7,<8.40", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": ">=7,<7.1.2", + "impresscms/impresscms": "<=1.4.2", + "intelliants/subrion": "<=4.2.1", "ivankristianto/phpwhois": "<=4.3", "james-heinrich/getid3": "<1.9.9", + "joomla/archive": "<1.1.10", "joomla/session": "<1.3.1", "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", "kitodo/presentation": "<3.1.2", + "klaviyo/magento2-extension": ">=1,<3", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", - "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.20.11|>=7,<7.30.2|>=8,<8.22.1", + "laminas/laminas-http": "<2.14.2", + "laravel/framework": "<6.20.26|>=7,<8.40", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "lavalite/cms": "<=5.8", "league/commonmark": "<0.18.3", - "librenms/librenms": "<1.53", + "league/flysystem": "<1.1.4|>=2,<2.1.1", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "librenms/librenms": "<21.1", "livewire/livewire": ">2.2.4,<2.2.6", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", "marcwillmann/turn": "<0.3.3", - "mautic/core": "<=3.2.3", + "mautic/core": "<3.3.2|= 2.13.1", "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", "mittwald/typo3_forum": "<1.2.1", "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<3.5.17|>=3.7,<3.7.9|>=3.8,<3.8.8|>=3.9,<3.9.5|>=3.10,<3.10.2", "namshi/jose": "<2.2", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nilsteampassnet/teampass": "<=2.1.27.36", + "nukeviet/nukeviet": "<4.3.4", "nystudio107/craft-seomatic": "<3.3", "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", - "october/backend": ">=1.0.319,<1.0.470", - "october/cms": "= 1.0.469|>=1.0.319,<1.0.469", + "october/backend": "<1.1.2", + "october/cms": "= 1.1.1|= 1.0.471|= 1.0.469|>=1.0.319,<1.0.469", "october/october": ">=1.0.319,<1.0.466", - "october/rain": ">=1.0.319,<1.0.468", + "october/rain": "<1.0.472|>=1.1,<1.1.2", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "opencart/opencart": "<=3.0.3.2", "openid/php-openid": "<2.3", - "openmage/magento-lts": "<19.4.8|>=20,<20.0.4", + "openmage/magento-lts": "<=19.4.12|>=20,<=20.0.8", "orchid/platform": ">=9,<9.4.4", "oro/crm": ">=1.7,<1.7.4", "oro/platform": ">=1.7,<1.7.4", "padraic/humbug_get_contents": "<1.1.2", "pagarme/pagarme-php": ">=0,<3", + "pagekit/pagekit": "<=1.0.18", "paragonie/random_compat": "<2", "passbolt/passbolt_api": "<2.11", "paypal/merchant-sdk-php": "<3.12", - "pear/archive_tar": "<1.4.11", + "pear/archive_tar": "<1.4.14", "personnummer/personnummer": "<3.0.2", + "phanan/koel": "<5.1.4", "phpfastcache/phpfastcache": ">=5,<5.0.13", - "phpmailer/phpmailer": "<6.1.6", + "phpmailer/phpmailer": "<6.5", "phpmussel/phpmussel": ">=1,<1.6", "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", "phpoffice/phpexcel": "<1.8.2", "phpoffice/phpspreadsheet": "<1.16", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.7", "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", - "pimcore/pimcore": "<6.3", + "pimcore/pimcore": "<10.0.7", "pocketmine/pocketmine-mp": "<3.15.4", + "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", "prestashop/contactform": ">1.0.1,<4.3", "prestashop/gamification": "<2.3.2", - "prestashop/productcomments": ">=4,<4.2", + "prestashop/productcomments": ">=4,<4.2.1", + "prestashop/ps_emailsubscription": "<2.6.1", "prestashop/ps_facetedsearch": "<3.4.1", "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", "pusher/pusher-php-server": "<2.2.1", + "pwweb/laravel-core": "<=0.3.6-beta", "rainlab/debugbar-plugin": "<3.1", + "rmccue/requests": ">=1.6,<1.8", "robrichards/xmlseclibs": "<3.0.4", "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/core": "<=6.3.4", - "shopware/platform": "<=6.3.4", - "shopware/shopware": "<5.6.9", + "shopware/core": "<=6.4.1", + "shopware/platform": "<=6.4.1", + "shopware/production": "<=6.3.5.2", + "shopware/shopware": "<=5.6.9", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4", - "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4", + "silverstripe/framework": "<4.7.4", + "silverstripe/graphql": "<=3.5|>=4-alpha.1,<4-alpha.2", "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", "silverstripe/subsites": ">=2,<2.1.1", @@ -2270,21 +2355,23 @@ "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", "simplito/elliptic-php": "<1.0.6", "slim/slim": "<2.6", - "smarty/smarty": "<3.1.33", + "smarty/smarty": "<3.1.39", "socalnick/scn-social-auth": "<1.15.2", + "socialiteproviders/steam": "<1.1", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", "ssddanbrown/bookstack": "<0.29.2", "stormpath/sdk": ">=0,<9.9.99", - "studio-42/elfinder": "<2.1.49", - "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1", + "studio-42/elfinder": "<2.1.59", + "sulu/sulu": "<1.6.41|>=2,<2.0.10|>=2.1,<2.1.1", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", - "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3", + "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3|>=1.9,<1.9.5", "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", "symbiote/silverstripe-versionedfiles": "<=2.0.3", "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", @@ -2294,44 +2381,55 @@ "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", "symfony/mime": ">=4.3,<4.3.8", "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/polyfill": ">=1,<1.10", "symfony/polyfill-php55": ">=1,<1.10", "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/routing": ">=2,<2.0.19", - "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", - "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8|>=5.3,<5.3.2", "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", + "symfony/symfony": ">=2,<3.4.49|>=4,<4.4.24|>=5,<5.2.9|>=5.3,<5.3.2", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3/dce": ">=2.2,<2.6.2", "t3g/svg-sanitizer": "<1.0.3", "tecnickcom/tcpdf": "<6.2.22", "thelia/backoffice-default-template": ">=2.1,<2.1.2", "thelia/thelia": ">=2.1-beta.1,<2.1.3", "theonedemon/phpwhois": "<=4.2.5", "titon/framework": ">=0,<9.9.99", + "topthink/think": "<=6.0.9", + "tribalsystems/zenario": "<8.8.53370", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", - "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", - "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", - "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.3.2", + "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": ">=6.2,<=6.2.56|>=7,<=7.6.52|>=8,<=8.7.41|>=9,<9.5.29|>=10,<10.4.19|>=11,<11.3.2", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "vrana/adminer": "<4.7.9", "wallabag/tcpdf": "<6.2.22", + "wikimedia/parsoid": "<0.12.2", "willdurand/js-translation-bundle": "<2.1.1", + "wp-cli/wp-cli": "<2.5", + "yidashi/yii2cmf": "<=2", "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", "yiisoft/yii2": "<2.0.38", @@ -2341,7 +2439,9 @@ "yiisoft/yii2-gii": "<2.0.4", "yiisoft/yii2-jui": "<2.0.4", "yiisoft/yii2-redis": "<2.0.8", + "yoast-seo-for-typo3/yoast_seo": "<7.2.1", "yourls/yourls": "<1.7.4", + "zendesk/zendesk_api_client_php": "<2.2.11", "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", @@ -2359,14 +2459,15 @@ "zendframework/zend-validator": ">=2.3,<2.3.6", "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", - "zendframework/zendframework": "<2.5.1", + "zendframework/zendframework": "<=3", "zendframework/zendframework1": "<1.12.20", "zendframework/zendopenid": ">=2,<2.0.2", "zendframework/zendxml": ">=1,<1.0.1", "zetacomponents/mail": "<1.8.2", "zf-commons/zfc-user": "<1.2.2", "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", - "zfr/zfr-oauth2-server-module": "<0.1.2" + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<6.0.22" }, "type": "metapackage", "notification-url": "https://packagist.org/downloads/", @@ -2400,31 +2501,33 @@ "type": "tidelift" } ], - "time": "2021-01-18T10:34:42+00:00" + "time": "2021-08-19T16:07:21+00:00" }, { "name": "symfony/console", - "version": "v5.2.1", + "version": "v5.3.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "47c02526c532fb381374dab26df05e7313978976" + "reference": "51b71afd6d2dc8f5063199357b9880cea8d8bfe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/47c02526c532fb381374dab26df05e7313978976", - "reference": "47c02526c532fb381374dab26df05e7313978976", + "url": "https://api.github.com/repos/symfony/console/zipball/51b71afd6d2dc8f5063199357b9880cea8d8bfe2", + "reference": "51b71afd6d2dc8f5063199357b9880cea8d8bfe2", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", + "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2", "symfony/string": "^5.1" }, "conflict": { + "psr/log": ">=3", "symfony/dependency-injection": "<4.4", "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", @@ -2432,10 +2535,10 @@ "symfony/process": "<4.4" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0" }, "require-dev": { - "psr/log": "~1.0", + "psr/log": "^1|^2", "symfony/config": "^4.4|^5.0", "symfony/dependency-injection": "^4.4|^5.0", "symfony/event-dispatcher": "^4.4|^5.0", @@ -2472,7 +2575,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Console Component", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", "keywords": [ "cli", @@ -2481,7 +2584,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.2.1" + "source": "https://github.com/symfony/console/tree/v5.3.6" }, "funding": [ { @@ -2497,7 +2600,7 @@ "type": "tidelift" } ], - "time": "2020-12-18T08:03:05+00:00" + "time": "2021-07-27T19:10:22+00:00" }, { "name": "symfony/debug", @@ -2568,17 +2671,84 @@ "time": "2020-10-24T10:57:07+00:00" }, { - "name": "symfony/polyfill-ctype", - "version": "v1.22.0", + "name": "symfony/deprecation-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.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": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { @@ -2590,7 +2760,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2628,7 +2798,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" }, "funding": [ { @@ -2644,20 +2814,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.22.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "267a9adeb8ecb8071040a740930e077cdfb987af" + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/267a9adeb8ecb8071040a740930e077cdfb987af", - "reference": "267a9adeb8ecb8071040a740930e077cdfb987af", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", "shasum": "" }, "require": { @@ -2669,7 +2839,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2709,7 +2879,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" }, "funding": [ { @@ -2725,20 +2895,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.22.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "0eb8293dbbcd6ef6bf81404c9ce7d95bcdf34f44" + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/0eb8293dbbcd6ef6bf81404c9ce7d95bcdf34f44", - "reference": "0eb8293dbbcd6ef6bf81404c9ce7d95bcdf34f44", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", "shasum": "" }, "require": { @@ -2752,7 +2922,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2796,7 +2966,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" }, "funding": [ { @@ -2812,20 +2982,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.22.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "6e971c891537eb617a00bb07a43d182a6915faba" + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/6e971c891537eb617a00bb07a43d182a6915faba", - "reference": "6e971c891537eb617a00bb07a43d182a6915faba", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { @@ -2837,7 +3007,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2880,7 +3050,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" }, "funding": [ { @@ -2896,20 +3066,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T17:09:11+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.22.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13" + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f377a3dd1fde44d37b9831d68dc8dea3ffd28e13", - "reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", "shasum": "" }, "require": { @@ -2921,7 +3091,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2960,7 +3130,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" }, "funding": [ { @@ -2976,20 +3146,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-05-27T12:26:48+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.22.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9" + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", - "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", "shasum": "" }, "require": { @@ -2998,7 +3168,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3036,7 +3206,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" }, "funding": [ { @@ -3052,20 +3222,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-05-27T09:17:38+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.22.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -3074,7 +3244,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3115,7 +3285,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" }, "funding": [ { @@ -3131,20 +3301,20 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.22.0", + "version": "v1.23.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", "shasum": "" }, "require": { @@ -3153,7 +3323,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.22-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -3198,7 +3368,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" }, "funding": [ { @@ -3214,25 +3384,25 @@ "type": "tidelift" } ], - "time": "2021-01-07T16:49:33+00:00" + "time": "2021-07-28T13:41:28+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.0" + "psr/container": "^1.1" }, "suggest": { "symfony/service-implementation": "" @@ -3240,7 +3410,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -3277,7 +3447,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/master" + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" }, "funding": [ { @@ -3293,20 +3463,20 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-04-01T10:43:52+00:00" }, { "name": "symfony/string", - "version": "v5.2.1", + "version": "v5.3.3", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed" + "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed", - "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed", + "url": "https://api.github.com/repos/symfony/string/zipball/bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", + "reference": "bd53358e3eccec6a670b5f33ab680d8dbe1d4ae1", "shasum": "" }, "require": { @@ -3349,7 +3519,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony String component", + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", "homepage": "https://symfony.com", "keywords": [ "grapheme", @@ -3360,7 +3530,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.2.1" + "source": "https://github.com/symfony/string/tree/v5.3.3" }, "funding": [ { @@ -3376,20 +3546,20 @@ "type": "tidelift" } ], - "time": "2020-12-05T07:33:16+00:00" + "time": "2021-06-27T11:44:38+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v4.1.8", + "version": "v4.2.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "572af79d913627a9d70374d27a6f5d689a35de32" + "reference": "da64796370fc4eb03cc277088f6fede9fde88482" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/572af79d913627a9d70374d27a6f5d689a35de32", - "reference": "572af79d913627a9d70374d27a6f5d689a35de32", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/da64796370fc4eb03cc277088f6fede9fde88482", + "reference": "da64796370fc4eb03cc277088f6fede9fde88482", "shasum": "" }, "require": { @@ -3401,7 +3571,7 @@ "bamarni/composer-bin-plugin": "^1.4.1", "ext-filter": "*", "ext-pcre": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0" + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20" }, "suggest": { "ext-filter": "Required to use the boolean validator.", @@ -3442,7 +3612,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/4.1" + "source": "https://github.com/vlucas/phpdotenv/tree/v4.2.0" }, "funding": [ { @@ -3454,7 +3624,7 @@ "type": "tidelift" } ], - "time": "2020-07-14T19:22:52+00:00" + "time": "2021-01-20T15:11:48+00:00" } ], "packages-dev": [ @@ -3701,16 +3871,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.10.4", + "version": "v4.12.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e" + "reference": "6608f01670c3cc5079e18c1dab1104e002579143" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6608f01670c3cc5079e18c1dab1104e002579143", + "reference": "6608f01670c3cc5079e18c1dab1104e002579143", "shasum": "" }, "require": { @@ -3751,22 +3921,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.12.0" }, - "time": "2020-12-20T10:01:03+00:00" + "time": "2021-07-21T10:44:31+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", - "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", "shasum": "" }, "require": { @@ -3811,22 +3981,22 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/master" + "source": "https://github.com/phar-io/manifest/tree/2.0.3" }, - "time": "2020-06-27T14:33:11+00:00" + "time": "2021-07-20T11:28:43+00:00" }, { "name": "phar-io/version", - "version": "3.0.4", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "e4782611070e50613683d2b9a57730e9a3ba5451" + "reference": "bae7c545bef187884426f042434e561ab1ddb182" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/e4782611070e50613683d2b9a57730e9a3ba5451", - "reference": "e4782611070e50613683d2b9a57730e9a3ba5451", + "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", + "reference": "bae7c545bef187884426f042434e561ab1ddb182", "shasum": "" }, "require": { @@ -3862,9 +4032,9 @@ "description": "Library for handling version information and constraints", "support": { "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.0.4" + "source": "https://github.com/phar-io/version/tree/3.1.0" }, - "time": "2020-12-13T23:18:30+00:00" + "time": "2021-02-23T14:00:09+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -4026,16 +4196,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.12.2", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "245710e971a030f42e08f4912863805570f23d39" + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39", - "reference": "245710e971a030f42e08f4912863805570f23d39", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", "shasum": "" }, "require": { @@ -4087,22 +4257,22 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.12.2" + "source": "https://github.com/phpspec/prophecy/tree/1.13.0" }, - "time": "2020-12-19T10:15:11+00:00" + "time": "2021-03-17T13:42:18+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.5", + "version": "9.2.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1" + "reference": "f6293e1b30a2354e8428e004689671b83871edde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f3e026641cc91909d421802dd3ac7827ebfd97e1", - "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde", + "reference": "f6293e1b30a2354e8428e004689671b83871edde", "shasum": "" }, "require": { @@ -4158,7 +4328,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.5" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" }, "funding": [ { @@ -4166,7 +4336,7 @@ "type": "github" } ], - "time": "2020-11-28T06:44:49+00:00" + "time": "2021-03-28T07:26:59+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4411,16 +4581,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.1", + "version": "9.5.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e7bdf4085de85a825f4424eae52c99a1cec2f360" + "reference": "191768ccd5c85513b4068bdbe99bb6390c7d54fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7bdf4085de85a825f4424eae52c99a1cec2f360", - "reference": "e7bdf4085de85a825f4424eae52c99a1cec2f360", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/191768ccd5c85513b4068bdbe99bb6390c7d54fb", + "reference": "191768ccd5c85513b4068bdbe99bb6390c7d54fb", "shasum": "" }, "require": { @@ -4432,7 +4602,7 @@ "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.1", + "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", "phpspec/prophecy": "^1.12.1", @@ -4450,7 +4620,7 @@ "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^2.3", + "sebastian/type": "^2.3.4", "sebastian/version": "^3.0.2" }, "require-dev": { @@ -4498,7 +4668,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.1" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.8" }, "funding": [ { @@ -4510,7 +4680,7 @@ "type": "github" } ], - "time": "2021-01-17T07:42:25+00:00" + "time": "2021-07-31T15:17:34+00:00" }, { "name": "sebastian/cli-parser", @@ -5018,16 +5188,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.2", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "a90ccbddffa067b51f574dea6eb25d5680839455" + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455", - "reference": "a90ccbddffa067b51f574dea6eb25d5680839455", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", "shasum": "" }, "require": { @@ -5070,7 +5240,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" }, "funding": [ { @@ -5078,7 +5248,7 @@ "type": "github" } ], - "time": "2020-10-26T15:55:19+00:00" + "time": "2021-06-11T13:31:12+00:00" }, { "name": "sebastian/lines-of-code", @@ -5369,16 +5539,16 @@ }, { "name": "sebastian/type", - "version": "2.3.1", + "version": "2.3.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2" + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2", - "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", "shasum": "" }, "require": { @@ -5413,7 +5583,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/2.3.1" + "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" }, "funding": [ { @@ -5421,7 +5591,7 @@ "type": "github" } ], - "time": "2020-10-26T13:18:59+00:00" + "time": "2021-06-15T12:49:02+00:00" }, { "name": "sebastian/version", @@ -5478,21 +5648,22 @@ }, { "name": "symfony/browser-kit", - "version": "v5.2.1", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "87d6f0a7436b03a57d4cf9a6a9cd0c83a355c49a" + "reference": "c1e3f64fcc631c96e2c5843b666db66679ced11c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/87d6f0a7436b03a57d4cf9a6a9cd0c83a355c49a", - "reference": "87d6f0a7436b03a57d4cf9a6a9cd0c83a355c49a", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/c1e3f64fcc631c96e2c5843b666db66679ced11c", + "reference": "c1e3f64fcc631c96e2c5843b666db66679ced11c", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/dom-crawler": "^4.4|^5.0" + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { "symfony/css-selector": "^4.4|^5.0", @@ -5526,10 +5697,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony BrowserKit Component", + "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v5.2.1" + "source": "https://github.com/symfony/browser-kit/tree/v5.3.4" }, "funding": [ { @@ -5545,24 +5716,25 @@ "type": "tidelift" } ], - "time": "2020-12-18T08:03:05+00:00" + "time": "2021-07-21T12:40:44+00:00" }, { "name": "symfony/css-selector", - "version": "v5.2.1", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "f789e7ead4c79e04ca9a6d6162fc629c89bd8054" + "reference": "7fb120adc7f600a59027775b224c13a33530dd90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/f789e7ead4c79e04ca9a6d6162fc629c89bd8054", - "reference": "f789e7ead4c79e04ca9a6d6162fc629c89bd8054", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", + "reference": "7fb120adc7f600a59027775b224c13a33530dd90", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" }, "type": "library", "autoload": { @@ -5591,10 +5763,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony CssSelector Component", + "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.2.1" + "source": "https://github.com/symfony/css-selector/tree/v5.3.4" }, "funding": [ { @@ -5610,27 +5782,28 @@ "type": "tidelift" } ], - "time": "2020-12-08T17:02:38+00:00" + "time": "2021-07-21T12:38:00+00:00" }, { "name": "symfony/dom-crawler", - "version": "v5.2.1", + "version": "v5.3.4", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "ee7cf316fb0de786cfe5ae32ee79502b290c81ea" + "reference": "2dd8890bd01be59a5221999c05ccf0fcafcb354f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/ee7cf316fb0de786cfe5ae32ee79502b290c81ea", - "reference": "ee7cf316fb0de786cfe5ae32ee79502b290c81ea", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/2dd8890bd01be59a5221999c05ccf0fcafcb354f", + "reference": "2dd8890bd01be59a5221999c05ccf0fcafcb354f", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" + "symfony/polyfill-php80": "^1.16" }, "conflict": { "masterminds/html5": "<2.6" @@ -5665,10 +5838,10 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DomCrawler Component", + "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v5.2.1" + "source": "https://github.com/symfony/dom-crawler/tree/v5.3.4" }, "funding": [ { @@ -5684,20 +5857,20 @@ "type": "tidelift" } ], - "time": "2020-12-18T08:02:46+00:00" + "time": "2021-07-23T15:55:36+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "shasum": "" }, "require": { @@ -5726,7 +5899,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" }, "funding": [ { @@ -5734,34 +5907,39 @@ "type": "github" } ], - "time": "2020-07-12T23:59:07+00:00" + "time": "2021-07-28T10:34:58+00:00" }, { "name": "webmozart/assert", - "version": "1.9.1", + "version": "1.10.0", "source": { "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", + "php": "^7.2 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" + "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" + "phpunit/phpunit": "^8.5.13" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -5784,10 +5962,10 @@ "validate" ], "support": { - "issues": "https://github.com/webmozart/assert/issues", - "source": "https://github.com/webmozart/assert/tree/master" + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" }, - "time": "2020-07-08T17:02:28+00:00" + "time": "2021-03-09T10:59:23+00:00" } ], "aliases": [], diff --git a/lib/Definitions.php b/lib/Definitions.php index 335e0fed..d056a8be 100644 --- a/lib/Definitions.php +++ b/lib/Definitions.php @@ -54,12 +54,11 @@ return [ Request::class => create(Request::class) ->constructor(\Klein\Request::createFromGlobals()), ContextInterface::class => function (ContainerInterface $c) { - switch (APP_MODULE) { - case 'web': - return $c->get(SessionContext::class); - default: - return $c->get(StatelessContext::class); + if (APP_MODULE === 'web') { + return $c->get(SessionContext::class); } + + return $c->get(StatelessContext::class); }, Config::class => function (ContainerInterface $c) { return new Config( diff --git a/lib/SP/Config/Config.php b/lib/SP/Config/Config.php index d19439e0..f30eb82f 100644 --- a/lib/SP/Config/Config.php +++ b/lib/SP/Config/Config.php @@ -46,7 +46,7 @@ final class Config /** * Cache file name */ - const CONFIG_CACHE_FILE = CACHE_PATH . DIRECTORY_SEPARATOR . 'config.cache'; + public const CONFIG_CACHE_FILE = CACHE_PATH . DIRECTORY_SEPARATOR . 'config.cache'; /** * @var int */ diff --git a/lib/SP/Core/Exceptions/InstallError.php b/lib/SP/Core/Exceptions/InstallError.php new file mode 100644 index 00000000..06cbaf15 --- /dev/null +++ b/lib/SP/Core/Exceptions/InstallError.php @@ -0,0 +1,35 @@ +. + */ + +namespace SP\Core\Exceptions; + +/** + * Class InstallError + * + * @package SP\Core\Exceptions + */ +final class InstallError extends SPException +{ + +} \ No newline at end of file diff --git a/lib/SP/DataModel/ItemPresetData.php b/lib/SP/DataModel/ItemPresetData.php index c15f154b..b79e94ab 100644 --- a/lib/SP/DataModel/ItemPresetData.php +++ b/lib/SP/DataModel/ItemPresetData.php @@ -71,7 +71,7 @@ class ItemPresetData extends DataModelBase implements HydratableInterface */ public function getId(): int { - return $this->id !== null ? (int)$this->id : null; + return $this->id ?? 0; } /** diff --git a/lib/SP/Services/Install/Installer.php b/lib/SP/Services/Install/Installer.php index 0e97f53e..2bd429e4 100644 --- a/lib/SP/Services/Install/Installer.php +++ b/lib/SP/Services/Install/Installer.php @@ -25,7 +25,6 @@ namespace SP\Services\Install; -use Defuse\Crypto\Exception\EnvironmentIsBrokenException; use Exception; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; @@ -60,9 +59,9 @@ final class Installer extends Service /** * sysPass' version and build number */ - const VERSION = [3, 2, 0]; - const VERSION_TEXT = '3.2'; - const BUILD = 20062901; + public const VERSION = [3, 2, 0]; + public const VERSION_TEXT = '3.2'; + public const BUILD = 20062901; /** * @var DatabaseSetupInterface @@ -203,7 +202,11 @@ final class Installer extends Service */ private function setupDbHost() { - if (preg_match('/^(?:(?P.*):(?P\d{1,5}))|^(?:unix:(?P.*))/', $this->installData->getDbHost(), $match)) { + if (preg_match( + '/^(?:(?P.*):(?P\d{1,5}))|^(?:unix:(?P.*))/', + $this->installData->getDbHost(), + $match) + ) { if (!empty($match['socket'])) { $this->installData->setDbSocket($match['socket']); } else { diff --git a/lib/SP/Storage/Database/MySQLHandler.php b/lib/SP/Storage/Database/MySQLHandler.php index f5a9282a..fc5db618 100644 --- a/lib/SP/Storage/Database/MySQLHandler.php +++ b/lib/SP/Storage/Database/MySQLHandler.php @@ -26,6 +26,7 @@ namespace SP\Storage\Database; use Exception; use PDO; +use SP\Core\Exceptions\SPException; defined('APP_ROOT') || die(); @@ -36,9 +37,9 @@ defined('APP_ROOT') || die(); */ final class MySQLHandler implements DBStorageInterface { - const STATUS_OK = 0; - const STATUS_KO = 1; - const PDO_OPTS = [ + public const STATUS_OK = 0; + public const STATUS_KO = 1; + public const PDO_OPTS = [ PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_FOUND_ROWS => true, @@ -97,7 +98,7 @@ final class MySQLHandler implements DBStorageInterface ) { throw new DatabaseException( __u('Unable to connect to DB'), - DatabaseException::CRITICAL, + SPException::CRITICAL, __u('Please, check the connection parameters')); } @@ -117,7 +118,7 @@ final class MySQLHandler implements DBStorageInterface } catch (Exception $e) { throw new DatabaseException( __u('Unable to connect to DB'), - DatabaseException::CRITICAL, + SPException::CRITICAL, sprintf('Error %s: %s', $e->getCode(), $e->getMessage()), $e->getCode(), $e @@ -161,22 +162,29 @@ final class MySQLHandler implements DBStorageInterface public function getConnectionSimple(): PDO { if (!$this->db) { - if (null === $this->connectionData->getDbHost() && null === $this->connectionData->getDbSocket()) { + if (null === $this->connectionData->getDbHost() + && null === $this->connectionData->getDbSocket() + ) { throw new DatabaseException( __u('Unable to connect to DB'), - DatabaseException::CRITICAL, + SPException::CRITICAL, __u('Please, check the connection parameters')); } try { $opts = [PDO::ATTR_EMULATE_PREPARES => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]; - $this->db = new PDO($this->getConnectionUri(), $this->connectionData->getDbUser(), $this->connectionData->getDbPass(), $opts); + $this->db = new PDO( + $this->getConnectionUri(), + $this->connectionData->getDbUser(), + $this->connectionData->getDbPass(), + $opts + ); $this->dbStatus = self::STATUS_OK; } catch (Exception $e) { throw new DatabaseException( __u('Unable to connect to DB'), - DatabaseException::CRITICAL, + SPException::CRITICAL, sprintf('Error %s: %s', $e->getCode(), $e->getMessage()), $e->getCode(), $e diff --git a/lib/SP/Util/Util.php b/lib/SP/Util/Util.php index a9e9fad6..2c2980e9 100644 --- a/lib/SP/Util/Util.php +++ b/lib/SP/Util/Util.php @@ -139,7 +139,7 @@ final class Util // not strict? let the regular php bool check figure it out (will // largely default to true) - return ($in ? true : false); + return (bool)$in; } /** diff --git a/tests/SP/DatabaseTestCase.php b/tests/SP/DatabaseTestCase.php index 56e6760e..716ede0a 100644 --- a/tests/SP/DatabaseTestCase.php +++ b/tests/SP/DatabaseTestCase.php @@ -1,10 +1,10 @@ . + * along with sysPass. If not, see . */ namespace SP\Tests; diff --git a/tests/SP/DatabaseUtil.php b/tests/SP/DatabaseUtil.php index 066a1367..58f960af 100644 --- a/tests/SP/DatabaseUtil.php +++ b/tests/SP/DatabaseUtil.php @@ -1,10 +1,10 @@ . + * along with sysPass. If not, see . */ namespace SP\Tests; @@ -44,26 +44,31 @@ class DatabaseUtil * * @throws DatabaseException */ - public static function createUser($user, $pass, $database, $host) + public static function createUser( + string $user, + string $pass, + string $database, + string $host + ): void { $query = 'GRANT ALL PRIVILEGES ON `%s`.* TO \'%s\'@\'%s\' IDENTIFIED BY \'%s\''; $conn = self::getConnection(); - $conn->query(sprintf($query, $database, $user, SELF_IP_ADDRESS, $pass)); + $conn->exec(sprintf($query, $database, $user, SELF_IP_ADDRESS, $pass)); // Long hostname returned on Travis CI if (getenv('TRAVIS') === false) { - $conn->query(sprintf($query, $database, $user, SELF_HOSTNAME, $pass)); + $conn->exec(sprintf($query, $database, $user, SELF_HOSTNAME, $pass)); } - $conn->query(sprintf($query, $database, $user, $host, $pass)); + $conn->exec(sprintf($query, $database, $user, $host, $pass)); } /** * @return PDO * @throws DatabaseException */ - public static function getConnection() + public static function getConnection(): PDO { $data = (new DatabaseConnectionData()) ->setDbHost(getenv('DB_SERVER')) @@ -77,11 +82,11 @@ class DatabaseUtil * @param string $user * @param string $host */ - public static function dropUser($user, $host) + public static function dropUser(string $user, string $host): void { try { self::getConnection() - ->query(sprintf('DROP USER \'%s\'@\'%s\'', $user, $host)); + ->exec(sprintf('DROP USER \'%s\'@\'%s\'', $user, $host)); } catch (Exception $e) { processException($e); } @@ -92,10 +97,10 @@ class DatabaseUtil * * @throws DatabaseException */ - public static function dropDatabase($database) + public static function dropDatabase(string $database): void { self::getConnection() - ->query(sprintf('DROP DATABASE IF EXISTS `%s`', $database)); + ->exec(sprintf('DROP DATABASE IF EXISTS `%s`', $database)); } /** @@ -103,9 +108,9 @@ class DatabaseUtil * * @throws DatabaseException */ - public static function createDatabase($database) + public static function createDatabase(string $database): void { self::getConnection() - ->query(sprintf('CREATE DATABASE `%s`', $database)); + ->exec(sprintf('CREATE DATABASE `%s`', $database)); } } \ No newline at end of file diff --git a/tests/SP/Modules/Api/ApiTest.php b/tests/SP/Modules/Api/ApiTest.php index dc841a08..ac68293b 100644 --- a/tests/SP/Modules/Api/ApiTest.php +++ b/tests/SP/Modules/Api/ApiTest.php @@ -2,9 +2,9 @@ /** * sysPass * - * @author nuxsmin - * @link https://syspass.org - * @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org + * @author nuxsmin + * @link https://syspass.org + * @copyright 2012-2021, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. * diff --git a/tests/SP/Modules/Api/Controllers/AccountControllerTest.php b/tests/SP/Modules/Api/Controllers/AccountControllerTest.php index cbf228e6..584a0297 100644 --- a/tests/SP/Modules/Api/Controllers/AccountControllerTest.php +++ b/tests/SP/Modules/Api/Controllers/AccountControllerTest.php @@ -2,9 +2,9 @@ /** * sysPass * - * @author nuxsmin - * @link https://syspass.org - * @copyright 2012-2018, Rubén Domínguez nuxsmin@$syspass.org + * @author nuxsmin + * @link https://syspass.org + * @copyright 2012-2021, Rubén Domínguez nuxsmin@$syspass.org * * This file is part of sysPass. * diff --git a/tests/SP/Modules/Cli/CliTestCase.php b/tests/SP/Modules/Cli/CliTestCase.php new file mode 100644 index 00000000..85a91919 --- /dev/null +++ b/tests/SP/Modules/Cli/CliTestCase.php @@ -0,0 +1,61 @@ +. + */ + +namespace SP\Tests\Modules\Cli; + +use DI\ContainerBuilder; +use Exception; +use PHPUnit\Framework\TestCase; +use Psr\Container\ContainerInterface; + +/** + * Class CliTestCase + * + * @package SP\Tests\Modules\Cli + */ +abstract class CliTestCase extends TestCase +{ + /** + * @var ContainerInterface + */ + protected static $dic; + + /** + * This method is called before the first test of this test class is run. + * + * @throws Exception + */ + public static function setUpBeforeClass(): void + { + parent::setUpBeforeClass(); + + $builder = new ContainerBuilder(); + $builder->addDefinitions( + APP_ROOT . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'Definitions.php', + MODULES_PATH . DIRECTORY_SEPARATOR . 'cli' . DIRECTORY_SEPARATOR . 'definitions.php' + ); + + self::$dic = $builder->build(); + } +} \ No newline at end of file diff --git a/tests/SP/Modules/Cli/Commands/InstallCommandTest.php b/tests/SP/Modules/Cli/Commands/InstallCommandTest.php new file mode 100644 index 00000000..df96c908 --- /dev/null +++ b/tests/SP/Modules/Cli/Commands/InstallCommandTest.php @@ -0,0 +1,382 @@ +. + */ + +namespace SP\Tests\Modules\Cli\Commands; + +use DI\DependencyException; +use DI\NotFoundException; +use Exception; +use SP\Config\Config; +use SP\Modules\Cli\Commands\InstallCommand; +use SP\Storage\Database\DatabaseException; +use SP\Tests\DatabaseUtil; +use SP\Tests\Modules\Cli\CliTestCase; +use Symfony\Component\Console\Tester\CommandTester; +use function SP\Tests\getResource; +use function SP\Tests\recreateDir; +use function SP\Tests\saveResource; + +/** + * + */ +class InstallCommandTest extends CliTestCase +{ + /** + * @var string + */ + protected static $currentConfig; + /** + * @var string[] + */ + private static $commandInputData = [ + 'adminLogin' => 'Admin', + 'databaseHost' => 'localhost', + 'databaseName' => 'syspass-test-install', + 'databaseUser' => 'syspass_user', + '--databasePassword' => 'test123', + '--adminPassword' => 'admin123', + '--masterPassword' => '12345678900', + '--install' => null, + ]; + + /** + * This method is called before the first test of this test class is run. + * + * @throws Exception + */ + public static function setUpBeforeClass(): void + { + // Backup current config file content in a variable + self::$currentConfig = getResource('config', 'config.xml'); + + parent::setUpBeforeClass(); + } + + /** + * This method is called after the last test of this test class is run. + */ + public static function tearDownAfterClass(): void + { + // Replace config file with previously saved data + saveResource('config', 'config.xml', self::$currentConfig); + // Recreate cache directory to avoid unwanted behavior + recreateDir(CACHE_PATH); + + parent::tearDownAfterClass(); + } + + /** + * @throws DependencyException + * @throws NotFoundException + */ + public function testInstallationIsAborted(): void + { + $commandTester = $this->executeCommandTest(); + + // the output of the command in the console + $output = $commandTester->getDisplay(); + $this->assertStringContainsString('Installation aborted', $output); + } + + /** + * @param array|null $inputData + * @param bool $useInputData + * + * @return CommandTester + * @throws DependencyException + * @throws NotFoundException + */ + private function executeCommandTest( + ?array $inputData = null, + bool $useInputData = true + ): CommandTester + { + $installCommand = self::$dic->get(InstallCommand::class); + + if (null === $inputData && $useInputData) { + $inputData = self::$commandInputData; + } + + $commandTester = new CommandTester($installCommand); + $commandTester->execute( + $inputData ?? [], + ['interactive' => false] + ); + + return $commandTester; + } + + /** + * @throws DependencyException + * @throws NotFoundException + */ + public function testNoDatabaseConnection(): void + { + $inputData = array_merge( + self::$commandInputData, + ['--forceInstall' => null] + ); + + $commandTester = $this->executeCommandTest($inputData); + + // the output of the command in the console + $output = $commandTester->getDisplay(); + $this->assertStringContainsString('Unable to connect to DB', $output); + } + + /** + * @throws DependencyException + * @throws NotFoundException + */ + public function testEmptyAdminPassword(): void + { + $inputData = array_merge( + self::$commandInputData, + ['--adminPassword' => ''] + ); + + $commandTester = $this->executeCommandTest($inputData); + + // the output of the command in the console + $output = $commandTester->getDisplay(); + $this->assertStringContainsString('Admin password cannot be blank', $output); + } + + /** + * @throws DependencyException + * @throws NotFoundException + */ + public function testEmptyMasterPassword(): void + { + $inputData = array_merge( + self::$commandInputData, + ['--masterPassword' => ''] + ); + + $commandTester = $this->executeCommandTest($inputData); + + // the output of the command in the console + $output = $commandTester->getDisplay(); + $this->assertStringContainsString('Master password cannot be blank', $output); + } + + /** + * @throws DependencyException + * @throws NotFoundException + * @throws DatabaseException + */ + public function testInstallIsSuccessful(): void + { + $inputData = array_merge( + self::$commandInputData, + [ + 'databaseHost' => getenv('DB_SERVER'), + 'databaseUser' => getenv('DB_USER'), + '--databasePassword' => getenv('DB_PASS'), + '--forceInstall' => null + ] + ); + + $commandTester = $this->executeCommandTest($inputData); + + // the output of the command in the console + $output = $commandTester->getDisplay(); + $this->assertStringContainsString('Installation finished', $output); + + $configData = self::$dic->get(Config::class)->getConfigData(); + + // Cleanup database + DatabaseUtil::dropDatabase(self::$commandInputData['databaseName']); + DatabaseUtil::dropUser($configData->getDbUser(), SELF_IP_ADDRESS); + } + + /** + * @throws DependencyException + * @throws NotFoundException + * @throws DatabaseException + */ + public function testInstallAndLanguageIsSet(): void + { + $inputData = array_merge( + self::$commandInputData, + [ + 'databaseHost' => getenv('DB_SERVER'), + 'databaseUser' => getenv('DB_USER'), + '--databasePassword' => getenv('DB_PASS'), + '--language' => 'es_ES', + '--forceInstall' => null + ] + ); + + $commandTester = $this->executeCommandTest($inputData); + + // the output of the command in the console + $output = $commandTester->getDisplay(); + $this->assertStringContainsString('Installation finished', $output); + + $configData = self::$dic->get(Config::class)->getConfigData(); + + $this->assertEquals($configData->getSiteLang(), $inputData['--language']); + + // Cleanup database + DatabaseUtil::dropDatabase(self::$commandInputData['databaseName']); + DatabaseUtil::dropUser($configData->getDbUser(), SELF_IP_ADDRESS); + } + + /** + * @throws DependencyException + * @throws NotFoundException + * @throws DatabaseException + */ + public function testInstallAndHostingModeIsUsed(): void + { + $databaseUser = 'syspass'; + $databasePassword = 'syspass123'; + + DatabaseUtil::createDatabase(self::$commandInputData['databaseName']); + DatabaseUtil::createUser( + $databaseUser, + $databasePassword, + self::$commandInputData['databaseName'], + getenv('DB_SERVER') + ); + + $inputData = array_merge( + self::$commandInputData, + [ + 'databaseHost' => getenv('DB_SERVER'), + 'databaseUser' => $databaseUser, + '--databasePassword' => $databasePassword, + '--hostingMode' => null, + '--forceInstall' => null + ] + ); + + $commandTester = $this->executeCommandTest($inputData); + + // the output of the command in the console + $output = $commandTester->getDisplay(); + $this->assertStringContainsString('Installation finished', $output); + + $configData = self::$dic->get(Config::class)->getConfigData(); + + $this->assertEquals($configData->getDbUser(), $databaseUser); + $this->assertEquals($configData->getDbPass(), $databasePassword); + + // Cleanup database + DatabaseUtil::dropDatabase(self::$commandInputData['databaseName']); + } + + /** + * @throws DependencyException + * @throws NotFoundException + */ + public function testInstallFromEnvironmentVarIsAbort(): void + { + $this->setEnvironmentVariables(); + + $commandTester = $this->executeCommandTest(null, false); + + // the output of the command in the console + $output = $commandTester->getDisplay(); + $this->assertStringContainsString('Installation aborted', $output); + } + + private function setEnvironmentVariables(): void + { + putenv(sprintf('%s=%s', + InstallCommand::$envVarsMapping['databaseHost'], + getenv('DB_SERVER')) + ); + putenv(sprintf('%s=%s', + InstallCommand::$envVarsMapping['databaseUser'], + getenv('DB_USER')) + ); + putenv(sprintf('%s=%s', + InstallCommand::$envVarsMapping['databasePassword'], + getenv('DB_PASS')) + ); + putenv(sprintf('%s=%s', + InstallCommand::$envVarsMapping['databaseName'], + self::$commandInputData['databaseName']) + ); + putenv(sprintf('%s=%s', + InstallCommand::$envVarsMapping['adminLogin'], + self::$commandInputData['adminLogin']) + ); + putenv(sprintf('%s=%s', + InstallCommand::$envVarsMapping['adminPassword'], + self::$commandInputData['--adminPassword']) + ); + putenv(sprintf('%s=%s', + InstallCommand::$envVarsMapping['masterPassword'], + self::$commandInputData['--masterPassword']) + ); + } + + /** + * @throws DependencyException + * @throws NotFoundException + */ + public function testInstallFromEnvironmentVarIsAbortedWithForce(): void + { + putenv(sprintf('%s=true', + InstallCommand::$envVarsMapping['forceInstall']) + ); + + $this->setEnvironmentVariables(); + + $commandTester = $this->executeCommandTest(null, false); + + // the output of the command in the console + $output = $commandTester->getDisplay(); + $this->assertStringContainsString('Installation aborted', $output); + } + + /** + * @throws DatabaseException + * @throws DependencyException + * @throws NotFoundException + */ + public function testInstallFromEnvironmentVarIsSuccessful(): void + { + putenv(sprintf('%s=true', + InstallCommand::$envVarsMapping['forceInstall']) + ); + putenv(sprintf('%s=true', + InstallCommand::$envVarsMapping['install']) + ); + + $this->setEnvironmentVariables(); + + $commandTester = $this->executeCommandTest(null, false); + + // the output of the command in the console + $output = $commandTester->getDisplay(); + $this->assertStringContainsString('Installation finished', $output); + + // Cleanup database + DatabaseUtil::dropDatabase(self::$commandInputData['databaseName']); + } +} diff --git a/tests/SP/Services/Account/AccountFileServiceTest.php b/tests/SP/Services/Account/AccountFileServiceTest.php index d24041d3..a9c6221e 100644 --- a/tests/SP/Services/Account/AccountFileServiceTest.php +++ b/tests/SP/Services/Account/AccountFileServiceTest.php @@ -74,7 +74,7 @@ class AccountFileServiceTest extends DatabaseTestCase */ public function testCreate() { - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'imgs' . DIRECTORY_SEPARATOR . 'add.png'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'imgs' . DIRECTORY_SEPARATOR . 'add.png'; $image = file_get_contents($file); $data = new FileData(); diff --git a/tests/SP/Services/Export/XmlVerifyServiceTest.php b/tests/SP/Services/Export/XmlVerifyServiceTest.php index 7c40e005..921508a0 100644 --- a/tests/SP/Services/Export/XmlVerifyServiceTest.php +++ b/tests/SP/Services/Export/XmlVerifyServiceTest.php @@ -67,7 +67,7 @@ class XmlVerifyServiceTest extends TestCase */ public function testVerifyEncrypted() { - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass_encrypted.xml'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass_encrypted.xml'; $result = self::$xmlVerifyService->verifyEncrypted($file, 'test_encrypt'); @@ -90,7 +90,7 @@ class XmlVerifyServiceTest extends TestCase */ public function testVerify() { - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass.xml'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass.xml'; $result = self::$xmlVerifyService->verify($file); @@ -109,17 +109,17 @@ class XmlVerifyServiceTest extends TestCase public function testCheckXmlHash() { $dom = new DOMDocument(); - $dom->load(RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass_encrypted.xml'); + $dom->load(RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass_encrypted.xml'); $this->assertTrue(XmlVerifyService::checkXmlHash($dom, 'test_encrypt')); - $dom->load(RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass_invalid.xml'); + $dom->load(RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass_invalid.xml'); $this->assertFalse(XmlVerifyService::checkXmlHash($dom, 'test_encrypt')); $key = sha1('d5851082a3914a647a336d8910e24eb64b8f8adef24d27329040ebd0d4c1'); - $dom->load(RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass_valid_hash.xml'); + $dom->load(RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass_valid_hash.xml'); $this->assertTrue(XmlVerifyService::checkXmlHash($dom, $key)); } diff --git a/tests/SP/Services/Import/CsvImportTest.php b/tests/SP/Services/Import/CsvImportTest.php index c5f9238d..4d96d508 100644 --- a/tests/SP/Services/Import/CsvImportTest.php +++ b/tests/SP/Services/Import/CsvImportTest.php @@ -78,7 +78,7 @@ class CsvImportTest extends DatabaseTestCase */ public function testDoImport() { - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data.csv'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data.csv'; $params = new ImportParams(); $params->setDefaultUser(1); @@ -170,7 +170,7 @@ class CsvImportTest extends DatabaseTestCase */ public function testDoImportInvalidData() { - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_invalid.csv'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_invalid.csv'; $params = new ImportParams(); $params->setDefaultUser(1); diff --git a/tests/SP/Services/Import/KeepassImportTest.php b/tests/SP/Services/Import/KeepassImportTest.php index 0b661802..74d83f05 100644 --- a/tests/SP/Services/Import/KeepassImportTest.php +++ b/tests/SP/Services/Import/KeepassImportTest.php @@ -83,7 +83,7 @@ class KeepassImportTest extends DatabaseTestCase */ public function testDoImport() { - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_keepass.xml'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_keepass.xml'; $params = new ImportParams(); $params->setDefaultUser(1); diff --git a/tests/SP/Services/Import/SyspassImportTest.php b/tests/SP/Services/Import/SyspassImportTest.php index 8194156d..19af6799 100644 --- a/tests/SP/Services/Import/SyspassImportTest.php +++ b/tests/SP/Services/Import/SyspassImportTest.php @@ -79,7 +79,7 @@ class SyspassImportTest extends DatabaseTestCase */ public function testDoImport() { - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass.xml'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass.xml'; $params = new ImportParams(); $params->setDefaultUser(1); diff --git a/tests/SP/Services/Import/XmlFileImportTest.php b/tests/SP/Services/Import/XmlFileImportTest.php index da9ad9b4..40f1e8c9 100644 --- a/tests/SP/Services/Import/XmlFileImportTest.php +++ b/tests/SP/Services/Import/XmlFileImportTest.php @@ -44,13 +44,13 @@ class XmlFileImportTest extends TestCase */ public function testDetectXMLFormat() { - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass.xml'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass.xml'; $import = new XmlFileImport(FileImport::fromFilesystem($file)); $this->assertEquals('syspass', $import->detectXMLFormat()); - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_keepass.xml'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_keepass.xml'; $import = new XmlFileImport(FileImport::fromFilesystem($file)); @@ -63,7 +63,7 @@ class XmlFileImportTest extends TestCase */ public function testInvalidFile() { - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data.csv'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data.csv'; $this->expectException(ImportException::class); @@ -76,7 +76,7 @@ class XmlFileImportTest extends TestCase */ public function testEmptyFile() { - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_empty.xml'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_empty.xml'; $import = new XmlFileImport(FileImport::fromFilesystem($file)); diff --git a/tests/SP/Services/Import/XmlImportTest.php b/tests/SP/Services/Import/XmlImportTest.php index 39a98f55..7c0cf875 100644 --- a/tests/SP/Services/Import/XmlImportTest.php +++ b/tests/SP/Services/Import/XmlImportTest.php @@ -69,13 +69,13 @@ class XmlImportTest extends DatabaseTestCase $params->setDefaultUser(1); $params->setDefaultGroup(1); - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass.xml'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_syspass.xml'; $import = new XmlImport(self::$dic, new XmlFileImport(FileImport::fromFilesystem($file)), $params); $this->assertEquals(5, $import->doImport()->getCounter()); - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_keepass.xml'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'import' . DIRECTORY_SEPARATOR . 'data_keepass.xml'; $import = new XmlImport(self::$dic, new XmlFileImport(FileImport::fromFilesystem($file)), $params); diff --git a/tests/SP/Storage/ArchiveHandlerTest.php b/tests/SP/Storage/ArchiveHandlerTest.php index 031f2b3e..f88e672f 100644 --- a/tests/SP/Storage/ArchiveHandlerTest.php +++ b/tests/SP/Storage/ArchiveHandlerTest.php @@ -50,7 +50,7 @@ class ArchiveHandlerTest extends TestCase $archive = TMP_PATH . DIRECTORY_SEPARATOR . 'test_archive_file'; $handler = new ArchiveHandler($archive, new PhpExtensionChecker()); - $handler->compressFile(RESOURCE_DIR . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'config.xml'); + $handler->compressFile(RESOURCE_PATH . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'config.xml'); $this->assertFileExists($archive . ArchiveHandler::COMPRESS_EXTENSION); } @@ -66,7 +66,7 @@ class ArchiveHandlerTest extends TestCase $archive = TMP_PATH . DIRECTORY_SEPARATOR . 'test_archive_file'; $handler = new ArchiveHandler($archive, new PhpExtensionChecker()); - $handler->compressFile(RESOURCE_DIR . DIRECTORY_SEPARATOR . 'non_existant_file'); + $handler->compressFile(RESOURCE_PATH . DIRECTORY_SEPARATOR . 'non_existant_file'); } /** @@ -78,7 +78,7 @@ class ArchiveHandlerTest extends TestCase $archive = TMP_PATH . DIRECTORY_SEPARATOR . 'test_archive_dir'; $handler = new ArchiveHandler($archive, new PhpExtensionChecker()); - $handler->compressDirectory(RESOURCE_DIR); + $handler->compressDirectory(RESOURCE_PATH); $this->assertFileExists($archive . ArchiveHandler::COMPRESS_EXTENSION); } @@ -94,7 +94,7 @@ class ArchiveHandlerTest extends TestCase $archive = TMP_PATH . DIRECTORY_SEPARATOR . 'test_archive_dir'; $handler = new ArchiveHandler($archive, new PhpExtensionChecker()); - $handler->compressDirectory(RESOURCE_DIR . DIRECTORY_SEPARATOR . 'non_existant_dir'); + $handler->compressDirectory(RESOURCE_PATH . DIRECTORY_SEPARATOR . 'non_existant_dir'); } /** diff --git a/tests/SP/Storage/FileHandlerTest.php b/tests/SP/Storage/FileHandlerTest.php index d44271cc..2c4b4f97 100644 --- a/tests/SP/Storage/FileHandlerTest.php +++ b/tests/SP/Storage/FileHandlerTest.php @@ -40,15 +40,15 @@ class FileHandlerTest extends TestCase /** * @var string Archvivo de prueba válido */ - protected static $validFile = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'valid_file.test'; + protected static $validFile = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'valid_file.test'; /** * @var string Archvivo de prueba inmutable */ - protected static $immutableFile = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'immutable_file.test'; + protected static $immutableFile = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'immutable_file.test'; /** * @var string Archivo de prueba no existente */ - protected static $missingFile = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'missing_file.test'; + protected static $missingFile = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'missing_file.test'; /** * Comprobar la escritura de texto en un archivo diff --git a/tests/SP/Storage/XmlHandlerTest.php b/tests/SP/Storage/XmlHandlerTest.php index da8aa020..b70ce45b 100644 --- a/tests/SP/Storage/XmlHandlerTest.php +++ b/tests/SP/Storage/XmlHandlerTest.php @@ -55,7 +55,7 @@ class XmlHandlerTest extends TestCase public static function setUpBeforeClass(): void { - $file = RESOURCE_DIR . DIRECTORY_SEPARATOR . 'config.xml'; + $file = RESOURCE_PATH . DIRECTORY_SEPARATOR . 'config.xml'; self::$xmlHandler = new XmlHandler(new FileHandler($file)); self::$itemsData = new stdClass(); diff --git a/tests/SP/WebTestCase.php b/tests/SP/WebTestCase.php index 7ab7adb8..5d37f462 100644 --- a/tests/SP/WebTestCase.php +++ b/tests/SP/WebTestCase.php @@ -1,10 +1,10 @@ . + * along with sysPass. If not, see . */ namespace SP\Tests; diff --git a/tests/SP/bootstrap.php b/tests/SP/bootstrap.php index 70cc51f1..24f98b90 100644 --- a/tests/SP/bootstrap.php +++ b/tests/SP/bootstrap.php @@ -1,10 +1,10 @@ . + * along with sysPass. If not, see . */ namespace SP\Tests; @@ -41,21 +41,23 @@ define('APP_MODULE', 'tests'); define('APP_ROOT', dirname(__DIR__, 2)); define('TEST_ROOT', dirname(__DIR__)); -define('RESOURCE_DIR', TEST_ROOT . DIRECTORY_SEPARATOR . 'res'); -define('CONFIG_PATH', RESOURCE_DIR . DIRECTORY_SEPARATOR . 'config'); +define('RESOURCE_PATH', TEST_ROOT . DIRECTORY_SEPARATOR . 'res'); +define('CONFIG_PATH', RESOURCE_PATH . DIRECTORY_SEPARATOR . 'config'); define('CONFIG_FILE', CONFIG_PATH . DIRECTORY_SEPARATOR . 'config.xml'); define('ACTIONS_FILE', CONFIG_PATH . DIRECTORY_SEPARATOR . 'actions.xml'); +define('MODULES_PATH', APP_ROOT. DIRECTORY_SEPARATOR. 'app' . DIRECTORY_SEPARATOR . 'modules'); define('SQL_PATH', APP_ROOT . DIRECTORY_SEPARATOR . 'schemas'); -define('CACHE_PATH', RESOURCE_DIR . DIRECTORY_SEPARATOR . 'cache'); +define('CACHE_PATH', RESOURCE_PATH . DIRECTORY_SEPARATOR . 'cache'); define('TMP_PATH', TEST_ROOT . DIRECTORY_SEPARATOR . 'tmp'); + define('XML_SCHEMA', APP_ROOT . DIRECTORY_SEPARATOR . 'schemas' . DIRECTORY_SEPARATOR . 'syspass.xsd'); define('LOG_FILE', TMP_PATH . DIRECTORY_SEPARATOR . 'test.log'); define('FIXTURE_FILES', [ - RESOURCE_DIR . DIRECTORY_SEPARATOR . 'datasets' . DIRECTORY_SEPARATOR . 'truncate.sql', - RESOURCE_DIR . DIRECTORY_SEPARATOR . 'datasets' . DIRECTORY_SEPARATOR . 'syspass.sql' + RESOURCE_PATH . DIRECTORY_SEPARATOR . 'datasets' . DIRECTORY_SEPARATOR . 'truncate.sql', + RESOURCE_PATH . DIRECTORY_SEPARATOR . 'datasets' . DIRECTORY_SEPARATOR . 'syspass.sql' ]); define('SELF_IP_ADDRESS', getRealIpAddress()); define('SELF_HOSTNAME', gethostbyaddr(SELF_IP_ADDRESS)); @@ -170,7 +172,7 @@ function getDbHandler(DatabaseConnectionData $connectionData = null): MySQLHandl */ function getResource($dir, $file): string { - return file_get_contents(RESOURCE_DIR . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $file) ?: ''; + return file_get_contents(RESOURCE_PATH . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $file) ?: ''; } /** @@ -182,7 +184,7 @@ function getResource($dir, $file): string */ function saveResource($dir, $file, $data): string { - return file_put_contents(RESOURCE_DIR . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $file, $data); + return file_put_contents(RESOURCE_PATH . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $file, $data); } /** @@ -193,7 +195,9 @@ function recreateDir($dir) if (!is_dir($dir)) { print 'Creating ' . $dir . PHP_EOL; - mkdir($dir); + if (!mkdir($dir) && !is_dir($dir)) { + throw new \RuntimeException(sprintf('Directory "%s" was not created', $dir)); + } } else { print 'Deleting ' . $dir . PHP_EOL; diff --git a/tests/phpunit.xml b/tests/phpunit.xml index 1f62c5ba..b4061106 100644 --- a/tests/phpunit.xml +++ b/tests/phpunit.xml @@ -16,6 +16,9 @@ ./SP/Modules + + ./SP/Modules/Cli +