diff --git a/application/startup.inc.php b/application/startup.inc.php index 73460293b5..2eecc35eae 100644 --- a/application/startup.inc.php +++ b/application/startup.inc.php @@ -17,6 +17,7 @@ // You should have received a copy of the GNU Affero General Public License // along with iTop. If not, see use Combodo\iTop\Application\Helper\Session; +use Combodo\iTop\Service\Startup\StartupService; require_once(APPROOT.'core/cmdbobject.class.inc.php'); require_once(APPROOT.'application/utils.inc.php'); @@ -69,26 +70,7 @@ $sSwitchEnv = utils::ReadParam('switch_env', null); $bAllowCache = true; -if (($sSwitchEnv != null) && file_exists(APPCONF.$sSwitchEnv.'/'.ITOP_CONFIG_FILE) && (Session::Get('itop_env') !== $sSwitchEnv)) { - Session::Set('itop_env', $sSwitchEnv); - $sEnv = $sSwitchEnv; - $bAllowCache = false; - // Reset the opcache since otherwise the PHP "model" files may still be cached !! - if (function_exists('opcache_reset')) { - // Zend opcode cache - opcache_reset(); - } - if (function_exists('apc_clear_cache')) { - // APC(u) cache - apc_clear_cache(); - } - // TODO: reset the credentials as well ?? -} elseif (Session::IsSet('itop_env')) { - $sEnv = Session::Get('itop_env'); -} else { - $sEnv = ITOP_DEFAULT_ENV; - Session::Set('itop_env', ITOP_DEFAULT_ENV); -} +$sEnv = (new StartupService())->SetItopEnvironment($sSwitchEnv, $bAllowCache); $sConfigFile = APPCONF.$sEnv.'/'.ITOP_CONFIG_FILE; try { MetaModel::Startup($sConfigFile, false /* $bModelOnly */, $bAllowCache, false /* $bTraceSourceFiles */, $sEnv); diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 50b73aabc9..626b2db633 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -638,6 +638,7 @@ 'Combodo\\iTop\\Service\\Router\\Exception\\RouteNotFoundException' => $baseDir . '/sources/Service/Router/Exception/RouteNotFoundException.php', 'Combodo\\iTop\\Service\\Router\\Exception\\RouterException' => $baseDir . '/sources/Service/Router/Exception/RouterException.php', 'Combodo\\iTop\\Service\\Router\\Router' => $baseDir . '/sources/Service/Router/Router.php', + 'Combodo\\iTop\\Service\\Startup\\StartupService' => $baseDir . '/sources/Service/Startup/StartupService.php', 'Combodo\\iTop\\Service\\SummaryCard\\SummaryCardService' => $baseDir . '/sources/Service/SummaryCard/SummaryCardService.php', 'Combodo\\iTop\\Service\\TemporaryObjects\\TemporaryObjectConfig' => $baseDir . '/sources/Service/TemporaryObjects/TemporaryObjectConfig.php', 'Combodo\\iTop\\Service\\TemporaryObjects\\TemporaryObjectGC' => $baseDir . '/sources/Service/TemporaryObjects/TemporaryObjectGC.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index 2c315e4f0e..fe840689d7 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -1039,6 +1039,7 @@ class ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685 'Combodo\\iTop\\Service\\Router\\Exception\\RouteNotFoundException' => __DIR__ . '/../..' . '/sources/Service/Router/Exception/RouteNotFoundException.php', 'Combodo\\iTop\\Service\\Router\\Exception\\RouterException' => __DIR__ . '/../..' . '/sources/Service/Router/Exception/RouterException.php', 'Combodo\\iTop\\Service\\Router\\Router' => __DIR__ . '/../..' . '/sources/Service/Router/Router.php', + 'Combodo\\iTop\\Service\\Startup\\StartupService' => __DIR__ . '/../..' . '/sources/Service/Startup/StartupService.php', 'Combodo\\iTop\\Service\\SummaryCard\\SummaryCardService' => __DIR__ . '/../..' . '/sources/Service/SummaryCard/SummaryCardService.php', 'Combodo\\iTop\\Service\\TemporaryObjects\\TemporaryObjectConfig' => __DIR__ . '/../..' . '/sources/Service/TemporaryObjects/TemporaryObjectConfig.php', 'Combodo\\iTop\\Service\\TemporaryObjects\\TemporaryObjectGC' => __DIR__ . '/../..' . '/sources/Service/TemporaryObjects/TemporaryObjectGC.php', diff --git a/sources/Service/Startup/StartupService.php b/sources/Service/Startup/StartupService.php new file mode 100644 index 0000000000..7b81c6a6ca --- /dev/null +++ b/sources/Service/Startup/StartupService.php @@ -0,0 +1,58 @@ +IsBuildEnvironment($sSwitchEnv)) { + $oException = new CoreException("Switching to environment '$sSwitchEnv' is not allowed since it is a build environment"); + IssueLog::Exception("Trying to switch to environment '$sSwitchEnv' is not allowed since it is a build environment", $oException); + throw $oException; + } + + if ( + ($sSwitchEnv != null) + && file_exists(APPCONF.$sSwitchEnv.'/'.ITOP_CONFIG_FILE) + && (Session::Get('itop_env') !== $sSwitchEnv) + ) { + Session::Set('itop_env', $sSwitchEnv); + $sEnv = $sSwitchEnv; + $bAllowCache = false; + // Reset the opcache since otherwise the PHP "model" files may still be cached !! + if (function_exists('opcache_reset')) { + // Zend opcode cache + opcache_reset(); + } + if (function_exists('apc_clear_cache')) { + // APC(u) cache + apc_clear_cache(); + } + // TODO: reset the credentials as well ?? + } elseif (Session::IsSet('itop_env')) { + $sEnv = Session::Get('itop_env'); + } else { + $sEnv = ITOP_DEFAULT_ENV; + Session::Set('itop_env', ITOP_DEFAULT_ENV); + } + + return $sEnv; + } + + public function IsBuildEnvironment(?string $sEnv): bool + { + return $sEnv != null && str_ends_with($sEnv, '-build'); + } +} diff --git a/tests/php-unit-tests/unitary-tests/sources/Service/Startup/StartupServiceTest.php b/tests/php-unit-tests/unitary-tests/sources/Service/Startup/StartupServiceTest.php new file mode 100644 index 0000000000..25f01f10ba --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/sources/Service/Startup/StartupServiceTest.php @@ -0,0 +1,50 @@ +RequireOnceItopFile('application/utils.inc.php'); + $this->oStartupService = new StartupService(); + } + + public function testSetItopEnvironmentUsesDefaultWhenEnvironmentIsNull(): void + { + $bAllowCache = true; + $sEnv = $this->oStartupService->SetItopEnvironment(null, $bAllowCache); + $this->assertEquals(ITOP_DEFAULT_ENV, $sEnv); + $this->assertTrue($bAllowCache); + } + + public function testSetItopEnvironmentWithValidEnvironment(): void + { + $bAllowCache = true; + $sEnv = $this->oStartupService->SetItopEnvironment('test', $bAllowCache); + $this->assertEquals('test', $sEnv); + $this->assertFalse($bAllowCache); + } + + public function testSetItopEnvironmentThrowsForBuildEnvironment() + { + $bAllowCache = true; + $this->expectException(CoreException::class); + $this->expectExceptionMessage("Switching to environment 'test-build' is not allowed since it is a build environment"); + $this->oStartupService->SetItopEnvironment('test-build', $bAllowCache); + } + + public function testIsBuildEnvironment() + { + $this->assertTrue($this->oStartupService->IsBuildEnvironment('test-build')); + $this->assertFalse($this->oStartupService->IsBuildEnvironment('test')); + $this->assertFalse($this->oStartupService->IsBuildEnvironment(null)); + } +}