Compare commits

..

1 Commits

Author SHA1 Message Date
lenaick.moreira
f1ba57ff49 N°9597 - Switch environment to a build environment must not be available 2026-06-01 10:46:43 +02:00
5 changed files with 109 additions and 20 deletions

View File

@@ -17,6 +17,7 @@
// You should have received a copy of the GNU Affero General Public License
// along with iTop. If not, see <http://www.gnu.org/licenses/>
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 @@ $oKPI->ComputeAndReport("Session Start");
$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 = StartupService::SetItopEnvironment($sSwitchEnv, $bAllowCache);
$sConfigFile = APPCONF.$sEnv.'/'.ITOP_CONFIG_FILE;
try {
MetaModel::Startup($sConfigFile, false /* $bModelOnly */, $bAllowCache, false /* $bTraceSourceFiles */, $sEnv);

View File

@@ -638,6 +638,7 @@ return array(
'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',

View File

@@ -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',

View File

@@ -0,0 +1,58 @@
<?php
namespace Combodo\iTop\Service\Startup;
use Combodo\iTop\Application\Helper\Session;
use CoreException;
use IssueLog;
class StartupService
{
/**
* @param string|null $sSwitchEnv
* @param bool $bAllowCache
*
* @return string
* @throws CoreException
*/
public static function SetItopEnvironment(?string $sSwitchEnv, bool &$bAllowCache): string
{
if (static::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 static function IsBuildEnvironment(?string $sEnv): bool
{
return $sEnv != null && str_ends_with($sEnv, '-build');
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace Service\Startup;
use Combodo\iTop\Service\Startup\StartupService;
use Combodo\iTop\Test\UnitTest\ItopTestCase;
use CoreException;
class StartupServiceTest extends ItopTestCase
{
protected function setUp(): void
{
parent::setUp();
$this->RequireOnceItopFile('application/utils.inc.php');
}
public function testSetItopEnvironmentUsesDefaultWhenEnvironmentIsNull(): void
{
$bAllowCache = true;
$sEnv = StartupService::SetItopEnvironment(null, $bAllowCache);
$this->assertEquals(ITOP_DEFAULT_ENV, $sEnv);
$this->assertTrue($bAllowCache);
}
public function testSetItopEnvironmentWithValidEnvironment(): void
{
$bAllowCache = true;
$sEnv = StartupService::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");
StartupService::SetItopEnvironment('test-build', $bAllowCache);
}
public function testIsBuildEnvironment()
{
$this->assertTrue(StartupService::IsBuildEnvironment('test-build'));
$this->assertFalse(StartupService::IsBuildEnvironment('test'));
$this->assertFalse(StartupService::IsBuildEnvironment(null));
}
}