diff --git a/composer.json b/composer.json index edfaf2fa..94eca5cd 100644 --- a/composer.json +++ b/composer.json @@ -87,7 +87,7 @@ "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-strict-rules": "^1.0", "phpstan/phpstan-symfony": "^1.0", - "phpunit/phpunit": "^9.0", + "phpunit/phpunit": "9.5.*", "symfony/browser-kit": "^6.0", "symfony/css-selector": "^6.0", "symfony/debug-bundle": "^6.0", diff --git a/composer.lock b/composer.lock index 40662509..008bd823 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "11d70b2ed4a4024ab1fb5d7e9bd8e436", + "content-hash": "bfeea56e227232b40a907b0c514f7db2", "packages": [ { "name": "bacon/bacon-qr-code", @@ -10720,16 +10720,16 @@ }, { "name": "dama/doctrine-test-bundle", - "version": "v7.2.0", + "version": "v7.2.1", "source": { "type": "git", "url": "https://github.com/dmaicher/doctrine-test-bundle.git", - "reference": "91abe52540370d596199a79eff3d823d5b81d41d" + "reference": "175b47153609a369117d97d36049b8a8c3b69dc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/91abe52540370d596199a79eff3d823d5b81d41d", - "reference": "91abe52540370d596199a79eff3d823d5b81d41d", + "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/175b47153609a369117d97d36049b8a8c3b69dc1", + "reference": "175b47153609a369117d97d36049b8a8c3b69dc1", "shasum": "" }, "require": { @@ -10781,9 +10781,9 @@ ], "support": { "issues": "https://github.com/dmaicher/doctrine-test-bundle/issues", - "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v7.2.0" + "source": "https://github.com/dmaicher/doctrine-test-bundle/tree/v7.2.1" }, - "time": "2023-02-05T09:12:26+00:00" + "time": "2023-02-07T10:02:27+00:00" }, { "name": "doctrine/data-fixtures", @@ -11346,16 +11346,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.14", + "version": "1.9.16", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e5fcc96289cf737304286a9b505fbed091f02e58" + "reference": "922e2689bb180575d0f57de0443c431a5a698e8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e5fcc96289cf737304286a9b505fbed091f02e58", - "reference": "e5fcc96289cf737304286a9b505fbed091f02e58", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/922e2689bb180575d0f57de0443c431a5a698e8f", + "reference": "922e2689bb180575d0f57de0443c431a5a698e8f", "shasum": "" }, "require": { @@ -11385,7 +11385,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.14" + "source": "https://github.com/phpstan/phpstan/tree/1.9.16" }, "funding": [ { @@ -11401,7 +11401,7 @@ "type": "tidelift" } ], - "time": "2023-01-19T10:47:09+00:00" + "time": "2023-02-07T10:42:21+00:00" }, { "name": "phpstan/phpstan-doctrine", @@ -11964,16 +11964,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.3", + "version": "9.5.28", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555" + "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e7b1615e3e887d6c719121c6d4a44b0ab9645555", - "reference": "e7b1615e3e887d6c719121c6d4a44b0ab9645555", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/954ca3113a03bf780d22f07bf055d883ee04b65e", + "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e", "shasum": "" }, "require": { @@ -12015,7 +12015,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.6-dev" + "dev-master": "9.5-dev" } }, "autoload": { @@ -12046,7 +12046,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.3" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.28" }, "funding": [ { @@ -12062,7 +12062,7 @@ "type": "tidelift" } ], - "time": "2023-02-04T13:37:15+00:00" + "time": "2023-01-14T12:32:24+00:00" }, { "name": "sebastian/cli-parser", diff --git a/migrations/Version20230126002049.php b/migrations/Version20230126002049.php index 97479a79..9f600553 100644 --- a/migrations/Version20230126002049.php +++ b/migrations/Version20230126002049.php @@ -84,6 +84,7 @@ final class Version20230126002049 extends AbstractMigration $this->addSql("UPDATE kimai2_user_preferences SET `name` = 'update_browser_title' WHERE `name` = 'theme.update_browser_title'"); $this->addSql("UPDATE kimai2_configuration SET `value` = '15' WHERE `name` = 'timesheet.time_increment' and `value` = '0'"); $this->addSql("UPDATE kimai2_configuration SET `value` = '5' WHERE `name` = 'timesheet.time_increment' and `value` IN ('1', '2', '3', '4')"); + $this->addSql("UPDATE kimai2_configuration SET `value` = '0' WHERE `name` = 'user.registration'"); $this->addSql("UPDATE kimai2_roles SET `name` = UPPER(`name`)"); $this->addSql("UPDATE kimai2_invoice_templates SET `renderer` = 'service-date' WHERE `renderer` = 'freelancer'"); $this->addSql("UPDATE kimai2_invoice_templates SET `renderer` = 'invoice' WHERE `renderer` = 'default'"); diff --git a/phpstan.neon b/phpstan.neon index df749584..d6cc2f12 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1590,11 +1590,6 @@ parameters: count: 1 path: src/Controller/Security/SelfRegistrationController.php - - - message: "#^Cannot call method setEnabled\\(\\) on App\\\\Form\\\\Model\\\\Configuration\\|null\\.$#" - count: 3 - path: src/Controller/SystemConfigurationController.php - - message: "#^Parameter \\#1 \\$value of method App\\\\Form\\\\Model\\\\Configuration\\:\\:setValue\\(\\) expects bool\\|int\\|object\\|string\\|null, bool\\|float\\|int\\|string given\\.$#" count: 1 diff --git a/src/Controller/SystemConfigurationController.php b/src/Controller/SystemConfigurationController.php index 5c2cfe19..63dc0f91 100644 --- a/src/Controller/SystemConfigurationController.php +++ b/src/Controller/SystemConfigurationController.php @@ -278,13 +278,18 @@ final class SystemConfigurationController extends AbstractController ->setType(IntegerType::class), ]); + $allowRegistration = $this->systemConfiguration->find('features.user_registration'); + if ($allowRegistration === false) { + $authentication->getConfigurationByName('user.registration')?->setEnabled(false); + } + if (!$this->systemConfiguration->isSamlActive()) { - $authentication->getConfigurationByName('user.login')->setEnabled(false); + $authentication->getConfigurationByName('user.login')?->setEnabled(false); } if (!$this->systemConfiguration->isPasswordResetActive()) { - $authentication->getConfigurationByName('user.password_reset_retry_ttl')->setEnabled(false); - $authentication->getConfigurationByName('user.password_reset_token_ttl')->setEnabled(false); + $authentication->getConfigurationByName('user.password_reset_retry_ttl')?->setEnabled(false); + $authentication->getConfigurationByName('user.password_reset_token_ttl')?->setEnabled(false); } return [ diff --git a/src/DependencyInjection/AppExtension.php b/src/DependencyInjection/AppExtension.php index ac550ff8..55ea6873 100644 --- a/src/DependencyInjection/AppExtension.php +++ b/src/DependencyInjection/AppExtension.php @@ -69,19 +69,16 @@ final class AppExtension extends Extension } // this should happen always at the end, so bundles do not mess with the base configuration - /* @phpstan-ignore-next-line */ - if ($container->hasParameter('kimai.bundles.config')) { + if ($container->hasParameter('kimai.bundles.config')) { // @phpstan-ignore-line $bundleConfig = $container->getParameter('kimai.bundles.config'); if (!\is_array($bundleConfig)) { - trigger_error('Invalid bundle configuration found, skipping all bundle configuration'); - } else { - foreach ($bundleConfig as $key => $value) { - if (\array_key_exists($key, $config)) { - trigger_error(sprintf('Invalid bundle configuration "%s" found, skipping', $key)); - continue; - } - $config[$key] = $value; + throw new \Exception('Invalid bundle configuration found, skipping all bundle configuration'); + } + foreach ($bundleConfig as $key => $value) { + if (\array_key_exists($key, $config)) { + throw new \Exception(sprintf('Invalid bundle configuration "%s" found, skipping', $key)); } + $config[$key] = $value; } } diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 0b9a190a..14551cac 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -55,12 +55,32 @@ final class Configuration implements ConfigurationInterface ->append($this->getQuickEntryNode()) ->append($this->getActivityNode()) ->append($this->getProjectNode()) + ->append($this->getFeaturesNode()) ->end() ->end(); return $treeBuilder; } + private function getFeaturesNode(): ArrayNodeDefinition + { + $builder = new TreeBuilder('features'); + /** @var ArrayNodeDefinition $node */ + $node = $builder->getRootNode(); + + $node + ->addDefaultsIfNotSet() + ->children() + // this feature was deactivated in order to deprecate/remove it in the future, very likely not necessary for anyone + ->integerNode('user_registration') + ->defaultFalse() + ->end() + ->end() + ; + + return $node; + } + private function getQuickEntryNode(): ArrayNodeDefinition { $builder = new TreeBuilder('quick_entry'); diff --git a/tests/DependencyInjection/AppExtensionTest.php b/tests/DependencyInjection/AppExtensionTest.php index 9d00e6f0..4650b635 100644 --- a/tests/DependencyInjection/AppExtensionTest.php +++ b/tests/DependencyInjection/AppExtensionTest.php @@ -254,7 +254,7 @@ class AppExtensionTest extends TestCase public function testWithBundleConfigurationFailsOnDuplicatedKey(): void { - $this->expectNotice(); + $this->expectException(\Exception::class); $this->expectExceptionMessage('Invalid bundle configuration "timesheet" found, skipping'); $bundleConfig = [ @@ -268,7 +268,7 @@ class AppExtensionTest extends TestCase public function testWithBundleConfigurationFailsOnNonArray(): void { - $this->expectNotice(); + $this->expectException(\Exception::class); $this->expectExceptionMessage('Invalid bundle configuration found, skipping all bundle configuration'); $container = $this->getContainer(); diff --git a/tests/DependencyInjection/ConfigurationTest.php b/tests/DependencyInjection/ConfigurationTest.php index c379d7f7..f3231daa 100644 --- a/tests/DependencyInjection/ConfigurationTest.php +++ b/tests/DependencyInjection/ConfigurationTest.php @@ -435,6 +435,9 @@ class ConfigurationTest extends TestCase 'allow_duplicate_number' => false, ], ], + 'features' => [ + 'user_registration' => false, + ], ]; $this->assertConfig($this->getMinConfig(), $fullDefaultConfig);