From 470a6b30e0842e0baa5e4301fa27a9367fa2bfcb Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Tue, 16 Jun 2020 18:35:09 +0200 Subject: [PATCH] configuration improvements (#1784) --- config/packages/kimai.yaml | 8 -------- src/Command/InstallCommand.php | 8 ++++++-- src/Constants.php | 4 ++-- src/DependencyInjection/AppExtension.php | 4 +++- src/DependencyInjection/Configuration.php | 6 +++++- src/Security/SessionHandler.php | 9 ++++++++- src/Utils/AvatarService.php | 18 +++++++++++++----- src/Utils/FileHelper.php | 5 +++++ tests/DependencyInjection/AppExtensionTest.php | 8 -------- 9 files changed, 42 insertions(+), 28 deletions(-) diff --git a/config/packages/kimai.yaml b/config/packages/kimai.yaml index eb19ecbb..9df2db04 100644 --- a/config/packages/kimai.yaml +++ b/config/packages/kimai.yaml @@ -298,11 +298,3 @@ kimai: date: 'd. m. Y' date_time: 'd. m. H:i' # -------------------------------------------------------------------------------- - - -# -------------------------------------------------------------------------------- -# STORAGE -# That's the place where plugins can store static content -# -------------------------------------------------------------------------------- - data_dir: '%kernel.project_dir%/var/data' -# -------------------------------------------------------------------------------- diff --git a/src/Command/InstallCommand.php b/src/Command/InstallCommand.php index 84bd95c8..83912c7b 100644 --- a/src/Command/InstallCommand.php +++ b/src/Command/InstallCommand.php @@ -16,6 +16,7 @@ use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Helper\QuestionHelper; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ConfirmationQuestion; use Symfony\Component\Console\Style\SymfonyStyle; @@ -57,6 +58,7 @@ final class InstallCommand extends Command ->setName('kimai:install') ->setDescription('Basic installation for Kimai') ->setHelp('This command will perform the basic installation steps to get Kimai up and running.') + ->addOption('no-cache', null, InputOption::VALUE_NONE, 'Skip cache re-generation') ; } @@ -95,8 +97,10 @@ final class InstallCommand extends Command return self::ERROR_MIGRATIONS; } - // flush the cache, just to make sure ... and ignore result - $this->rebuildCaches($environment, $io, $input, $output); + if (!$input->getOption('no-cache')) { + // flush the cache, just to make sure ... and ignore result + $this->rebuildCaches($environment, $io, $input, $output); + } $io->success( sprintf('Congratulations! Successfully installed %s version %s (%s)', Constants::SOFTWARE, Constants::VERSION, Constants::STATUS) diff --git a/src/Constants.php b/src/Constants.php index 18129789..9f1546eb 100644 --- a/src/Constants.php +++ b/src/Constants.php @@ -17,11 +17,11 @@ class Constants /** * The current release version */ - public const VERSION = '1.9'; + public const VERSION = '1.10'; /** * The current release status, either "stable" or "dev" */ - public const STATUS = 'stable'; + public const STATUS = 'dev'; /** * The software name */ diff --git a/src/DependencyInjection/AppExtension.php b/src/DependencyInjection/AppExtension.php index 80a3c1db..1ed198e2 100644 --- a/src/DependencyInjection/AppExtension.php +++ b/src/DependencyInjection/AppExtension.php @@ -52,7 +52,9 @@ class AppExtension extends Extension $config['export']['documents'] = array_merge($config['export']['documents'], $config['export']['defaults']); unset($config['export']['defaults']); - // safe alternatives to %kernel.project_dir% + if (empty($config['data_dir'])) { + $config['data_dir'] = $container->getParameter('kernel.project_dir') . '/var/data'; + } $container->setParameter('kimai.data_dir', $config['data_dir']); $container->setParameter('kimai.plugin_dir', $container->getParameter('kernel.project_dir') . '/var/plugins'); diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 59b01f93..1705a6eb 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -37,9 +37,13 @@ class Configuration implements ConfigurationInterface $node ->children() ->scalarNode('data_dir') - ->isRequired() + ->defaultNull() ->validate() ->ifTrue(function ($value) { + if (null === $value) { + return false; + } + return !file_exists($value); }) ->thenInvalid('Data directory does not exist') diff --git a/src/Security/SessionHandler.php b/src/Security/SessionHandler.php index 35928c22..7a24cd73 100644 --- a/src/Security/SessionHandler.php +++ b/src/Security/SessionHandler.php @@ -9,19 +9,26 @@ namespace App\Security; +use Doctrine\DBAL\Driver\PDOConnection; use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler; class SessionHandler extends PdoSessionHandler { public function __construct($pdoOrDsn = null) { + $lockMode = PdoSessionHandler::LOCK_NONE; + + if ($pdoOrDsn instanceof PDOConnection && $pdoOrDsn->getAttribute(\PDO::ATTR_DRIVER_NAME) === 'mysql') { + $lockMode = PdoSessionHandler::LOCK_ADVISORY; + } + parent::__construct($pdoOrDsn, [ 'db_table' => 'kimai2_sessions', 'db_id_col' => 'id', 'db_data_col' => 'data', 'db_lifetime_col' => 'lifetime', 'db_time_col' => 'time', - 'lock_mode' => PdoSessionHandler::LOCK_ADVISORY, + 'lock_mode' => $lockMode, ]); } } diff --git a/src/Utils/AvatarService.php b/src/Utils/AvatarService.php index 78a5b27e..ccfd6062 100644 --- a/src/Utils/AvatarService.php +++ b/src/Utils/AvatarService.php @@ -18,7 +18,7 @@ class AvatarService /** * @var string */ - private $projectDirectory; + private $directory; public const AVATAR_CONFIG = [ 'driver' => 'gd', @@ -105,7 +105,17 @@ class AvatarService public function __construct(string $projectDirectory) { - $this->projectDirectory = $projectDirectory; + $this->setStorageDirectory($projectDirectory . '/public/avatars/'); + } + + public function getStorageDirectory(): string + { + return $this->directory; + } + + public function setStorageDirectory(string $directory) + { + $this->directory = realpath($directory); } private function getAvatarUrl(User $profile): string @@ -115,9 +125,7 @@ class AvatarService private function getImagePath(User $profile): string { - $avatarPath = realpath($this->projectDirectory . '/public/avatars/'); - - return $avatarPath . '/' . $this->getAvatarUrl($profile); + return $this->getStorageDirectory() . '/' . $this->getAvatarUrl($profile); } public function generateAvatar(User $profile, bool $regenerate = false): bool diff --git a/src/Utils/FileHelper.php b/src/Utils/FileHelper.php index 142bcd49..e4e8c312 100644 --- a/src/Utils/FileHelper.php +++ b/src/Utils/FileHelper.php @@ -28,6 +28,11 @@ final class FileHelper $this->filesystem = new Filesystem(); } + public function setDataDirectory(string $directory) + { + $this->dataDir = $directory; + } + public function getDataDirectory(string $subDirectory = null): string { $directory = $this->dataDir . '/'; diff --git a/tests/DependencyInjection/AppExtensionTest.php b/tests/DependencyInjection/AppExtensionTest.php index de021a45..98a21e2f 100644 --- a/tests/DependencyInjection/AppExtensionTest.php +++ b/tests/DependencyInjection/AppExtensionTest.php @@ -421,14 +421,6 @@ class AppExtensionTest extends TestCase $this->assertEquals(['yyyy', 'xxxx'], $config); } - public function testInvalidConfiguration() - { - $this->expectException(Notice::class); - $this->expectExceptionMessage('Found invalid "kimai" configuration: The child node "data_dir" at path "kimai" must be configured.'); - - $this->extension->load([], $container = $this->getContainer()); - } - public function testWithBundleConfiguration() { $bundleConfig = [