Skip to content

Commit cf28d40

Browse files
committed
PhpExpressionEvaluator used via constructor and not as a service
1 parent 3aad6f2 commit cf28d40

File tree

7 files changed

+48
-45
lines changed

7 files changed

+48
-45
lines changed

setup/modulediscovery.class.inc.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ class ModuleDiscovery
9595

9696
// ModulePath is used by AddModule to get the path of the module being included (in ListModuleFiles)
9797
protected static $m_sModulePath = null;
98+
99+
private static PhpExpressionEvaluator $oPhpExpressionEvaluator;
100+
98101
protected static function SetModulePath($sModulePath)
99102
{
100103
self::$m_sModulePath = $sModulePath;
@@ -310,6 +313,15 @@ public static function RemoveDuplicateModules($aModules)
310313
return $aModules;
311314
}
312315

316+
private static function GetPhpExpressionEvaluator(): PhpExpressionEvaluator
317+
{
318+
if (!isset(static::$oPhpExpressionEvaluator)) {
319+
static::$oPhpExpressionEvaluator = new PhpExpressionEvaluator([], RunTimeEnvironment::STATIC_CALL_AUTOSELECT_WHITELIST);
320+
}
321+
322+
return static::$oPhpExpressionEvaluator;
323+
}
324+
313325
protected static function DependencyIsResolved($sDepString, $aOrderedModules, $aSelectedModules)
314326
{
315327
$bResult = false;
@@ -393,7 +405,7 @@ protected static function DependencyIsResolved($sDepString, $aOrderedModules, $a
393405
{
394406
$sBooleanExpr = str_replace(array_keys($aReplacements), array_values($aReplacements), $sDepString);
395407
try{
396-
$bResult = PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateBooleanExpression($sBooleanExpr);
408+
$bResult = self::GetPhpExpressionEvaluator()->ParseAndEvaluateBooleanExpression($sBooleanExpr);
397409
} catch(ModuleFileReaderException $e){
398410
//logged already
399411
echo "Failed to parse the boolean Expression = '$sBooleanExpr'<br/>";

setup/modulediscovery/ModuleFileReader.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ class ModuleFileReader {
99
private static ModuleFileReader $oInstance;
1010
private static int $iDummyClassIndex = 0;
1111

12+
private PhpExpressionEvaluator $oPhpExpressionEvaluator;
13+
1214
const FUNC_CALL_WHITELIST=[
1315
"function_exists",
1416
"class_exists",
@@ -20,6 +22,7 @@ class ModuleFileReader {
2022
];
2123

2224
protected function __construct() {
25+
$this->oPhpExpressionEvaluator = new PhpExpressionEvaluator(static::FUNC_CALL_WHITELIST, static::STATIC_CALLWHITELIST);
2326
}
2427

2528
final public static function GetInstance(): ModuleFileReader {
@@ -51,9 +54,6 @@ public function ReadModuleFileInformation(string $sModuleFilePath) : array
5154
throw new \ModuleFileReaderException($e->getMessage(), 0, $e, $sModuleFilePath);
5255
}
5356

54-
PhpExpressionEvaluator::GetInstance()->SetFunctionsWhitelist(static::FUNC_CALL_WHITELIST);
55-
PhpExpressionEvaluator::GetInstance()->SetStaticCallsWhitelist(static::STATIC_CALLWHITELIST);
56-
5757
try {
5858
foreach ($aNodes as $sKey => $oNode) {
5959
if ($oNode instanceof \PhpParser\Node\Stmt\Expression) {
@@ -221,7 +221,7 @@ private function GetModuleInformationFromAddModuleCall(string $sModuleFilePath,
221221
throw new ModuleFileReaderException("2nd parameter to SetupWebPage::AddModule not a string: " . get_class($oModuleId->value), 0, null, $sModuleFilePath);
222222
}
223223

224-
$sModuleId = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oModuleId->value);
224+
$sModuleId = $this->oPhpExpressionEvaluator->EvaluateExpression($oModuleId->value);
225225

226226
$oModuleConfigInfo = $aArgs[2];
227227
if (false === ($oModuleConfigInfo instanceof PhpParser\Node\Arg)) {
@@ -233,7 +233,7 @@ private function GetModuleInformationFromAddModuleCall(string $sModuleFilePath,
233233
throw new ModuleFileReaderException("3rd parameter to SetupWebPage::AddModule not an array: " . get_class($oModuleConfigInfo->value), 0, null, $sModuleFilePath);
234234
}
235235

236-
$aModuleConfig = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oModuleConfigInfo->value);
236+
$aModuleConfig = $this->oPhpExpressionEvaluator->EvaluateExpression($oModuleConfigInfo->value);
237237

238238
if (! is_array($aModuleConfig)){
239239
throw new ModuleFileReaderException("3rd parameter to SetupWebPage::AddModule not an array: " . get_class($oModuleConfigInfo->value), 0, null, $sModuleFilePath);
@@ -255,7 +255,7 @@ private function GetModuleInformationFromAddModuleCall(string $sModuleFilePath,
255255
*/
256256
private function GetModuleInformationFromIf(string $sModuleFilePath, \PhpParser\Node\Stmt\If_ $oNode) : ?array
257257
{
258-
$bCondition = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oNode->cond);
258+
$bCondition = $this->oPhpExpressionEvaluator->EvaluateExpression($oNode->cond);
259259
if ($bCondition) {
260260
foreach ($oNode->stmts as $oSubNode) {
261261
if ($oSubNode instanceof \PhpParser\Node\Stmt\Expression) {
@@ -272,7 +272,7 @@ private function GetModuleInformationFromIf(string $sModuleFilePath, \PhpParser\
272272
if (! is_null($oNode->elseifs)) {
273273
foreach ($oNode->elseifs as $oElseIfSubNode) {
274274
/** @var \PhpParser\Node\Stmt\ElseIf_ $oElseIfSubNode */
275-
$bCondition = PhpExpressionEvaluator::GetInstance()->EvaluateExpression($oElseIfSubNode->cond);
275+
$bCondition = $this->oPhpExpressionEvaluator->EvaluateExpression($oElseIfSubNode->cond);
276276
if ($bCondition) {
277277
return $this->GetModuleConfigurationFromStatement($sModuleFilePath, $oElseIfSubNode->stmts);
278278
}

setup/runtimeenv.class.inc.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,8 @@ protected function GetMFModulesToCompile($sSourceEnv, $sSourceDir)
454454
}
455455
}
456456

457+
$oPhpExpressionEvaluator = new PhpExpressionEvaluator([], RunTimeEnvironment::STATIC_CALL_AUTOSELECT_WHITELIST);
458+
457459
// Now process the 'AutoSelect' modules
458460
do
459461
{
@@ -465,8 +467,7 @@ protected function GetMFModulesToCompile($sSourceEnv, $sSourceDir)
465467
{
466468
SetupInfo::SetSelectedModules($aRet);
467469
try{
468-
PhpExpressionEvaluator::GetInstance()->SetStaticCallsWhitelist(RunTimeEnvironment::STATIC_CALL_AUTOSELECT_WHITELIST);
469-
$bSelected = PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateBooleanExpression($oModule->GetAutoSelect());
470+
$bSelected = $oPhpExpressionEvaluator->ParseAndEvaluateBooleanExpression($oModule->GetAutoSelect());
470471
if ($bSelected)
471472
{
472473
$aRet[$oModule->GetName()] = $oModule; // store the Id of the selected module

setup/unattended-install/InstallationFileService.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,14 @@ public function ProcessDefaultModules() : void {
268268
}
269269

270270
public function ProcessAutoSelectModules() : void {
271+
$oPhpExpressionEvaluator = new PhpExpressionEvaluator([], RunTimeEnvironment::STATIC_CALL_AUTOSELECT_WHITELIST);
272+
271273
foreach($this->GetAutoSelectModules() as $sModuleId => $aModule)
272274
{
273275
try {
274276
SetupInfo::SetSelectedModules($this->aSelectedModules);
275-
PhpExpressionEvaluator::GetInstance()->SetStaticCallsWhitelist(RunTimeEnvironment::STATIC_CALL_AUTOSELECT_WHITELIST);
276-
$bSelected = PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateBooleanExpression($aModule['auto_select']);
277+
278+
$bSelected = $oPhpExpressionEvaluator->ParseAndEvaluateBooleanExpression($aModule['auto_select']);
277279
if ($bSelected)
278280
{
279281
// Modules in data/production-modules/ are considered as mandatory and always installed

setup/wizardsteps.class.inc.php

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1312,6 +1312,8 @@ class WizStepModulesChoice extends WizardStep
13121312
*/
13131313
protected $oExtensionsMap;
13141314

1315+
protected PhpExpressionEvaluator $oPhpExpressionEvaluator;
1316+
13151317
/**
13161318
* Whether we were able to load the choices from the database or not
13171319
* @var bool
@@ -1737,6 +1739,15 @@ protected function GuessDefaultsFromModules($aInfo, &$aDefaults, $aModules, $sPa
17371739
return $aRetScore;
17381740
}
17391741

1742+
private function GetPhpExpressionEvaluator(): PhpExpressionEvaluator
1743+
{
1744+
if (!isset($this->oPhpExpressionEvaluator)) {
1745+
$this->oPhpExpressionEvaluator = new PhpExpressionEvaluator([], RunTimeEnvironment::STATIC_CALL_AUTOSELECT_WHITELIST);
1746+
}
1747+
1748+
return $this->oPhpExpressionEvaluator;
1749+
}
1750+
17401751
/**
17411752
* Converts the list of selected "choices" into a list of "modules": take into account the selected and the mandatory modules
17421753
*
@@ -1788,8 +1799,7 @@ protected function GetSelectedModules($aInfo, $aSelectedChoices, &$aModules, $sP
17881799
// Check the module selection
17891800
try {
17901801
SetupInfo::SetSelectedModules($aModules);
1791-
PhpExpressionEvaluator::GetInstance()->SetStaticCallsWhitelist(RunTimeEnvironment::STATIC_CALL_AUTOSELECT_WHITELIST);
1792-
$bSelected = PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateBooleanExpression($aInfo['auto_select']);
1802+
$bSelected = $this->GetPhpExpressionEvaluator()->ParseAndEvaluateBooleanExpression($aInfo['auto_select']);
17931803
}
17941804
catch (ModuleFileReaderException $e) {
17951805
//logged already
@@ -1867,8 +1877,7 @@ protected function GetSelectedModules($aInfo, $aSelectedChoices, &$aModules, $sP
18671877
try
18681878
{
18691879
SetupInfo::SetSelectedModules($aModules);
1870-
PhpExpressionEvaluator::GetInstance()->SetStaticCallsWhitelist(RunTimeEnvironment::STATIC_CALL_AUTOSELECT_WHITELIST);
1871-
$bSelected = PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateBooleanExpression($aModule['auto_select']);
1880+
$bSelected = $this->GetPhpExpressionEvaluator()->ParseAndEvaluateBooleanExpression($aModule['auto_select']);
18721881
if ($bSelected)
18731882
{
18741883
$aModules[$sModuleId] = true; // store the Id of the selected module

sources/PhpParser/Evaluation/PhpExpressionEvaluator.php

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,33 +12,14 @@
1212
* Used at runtime/setup time
1313
*/
1414
class PhpExpressionEvaluator {
15-
private static PhpExpressionEvaluator $oInstance;
1615

1716
/** @var ConstExprEvaluator $oConstExprEvaluator */
1817
private $oConstExprEvaluator;
1918

20-
protected function __construct() {
19+
public function __construct(array $functionsWhiteList=[], array $staticCallsWhitelist=[]) {
2120
$this->oConstExprEvaluator = new ConstExprEvaluator();
22-
}
23-
24-
public function SetFunctionsWhitelist(array $functionsWhiteList): void {
25-
$this->oConstExprEvaluator->setFunctionsWhitelist($functionsWhiteList);
26-
}
27-
28-
public function SetStaticCallsWhitelist(array $staticCallsWhitelist): void {
2921
$this->oConstExprEvaluator->setStaticcallsWhitelist($staticCallsWhitelist);
30-
}
31-
32-
final public static function GetInstance(): PhpExpressionEvaluator {
33-
if (!isset(static::$oInstance)) {
34-
static::$oInstance = new static();
35-
}
36-
37-
return static::$oInstance;
38-
}
39-
40-
final public static function SetInstance(?PhpExpressionEvaluator $oInstance): void {
41-
static::$oInstance = $oInstance;
22+
$this->oConstExprEvaluator->setFunctionsWhitelist($functionsWhiteList);
4223
}
4324

4425
public function EvaluateExpression(Expr $oExpression) : mixed

tests/php-unit-tests/unitary-tests/sources/PhpParser/Evaluation/PhpExpressionEvaluatorTest.php

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,8 @@ public function testEvaluateExpression($sExpression, $forced_expected="NOTPROVID
114114
global $oEvaluationFakeClass;
115115
$oEvaluationFakeClass = new EvaluationFakeClass();
116116

117-
PhpExpressionEvaluator::GetInstance()->SetFunctionsWhitelist(ModuleFileReader::FUNC_CALL_WHITELIST);
118-
PhpExpressionEvaluator::GetInstance()->SetStaticCallsWhitelist(ModuleFileReader::STATIC_CALLWHITELIST);
119-
$res = PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateExpression($sExpression);
117+
$oPhpExpressionEvaluator = new PhpExpressionEvaluator(ModuleFileReader::FUNC_CALL_WHITELIST, ModuleFileReader::STATIC_CALLWHITELIST);
118+
$res = $oPhpExpressionEvaluator->ParseAndEvaluateExpression($sExpression);
120119
if ($forced_expected === "NOTPROVIDED"){
121120
$this->assertEquals($this->UnprotectedComputeExpression($sExpression), $res, $sExpression);
122121
} else {
@@ -164,9 +163,8 @@ public function testEvaluateExpressionThrowsException($sExpression)
164163
$oEvaluationFakeClass = new EvaluationFakeClass();
165164

166165
$this->expectException(\ModuleFileReaderException::class);
167-
PhpExpressionEvaluator::GetInstance()->SetFunctionsWhitelist([]);
168-
PhpExpressionEvaluator::GetInstance()->SetStaticCallsWhitelist([]);
169-
PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateExpression($sExpression);
166+
$oPhpExpressionEvaluator = new PhpExpressionEvaluator();
167+
$oPhpExpressionEvaluator->ParseAndEvaluateExpression($sExpression);
170168
}
171169

172170

@@ -220,8 +218,8 @@ public static function ParseAndEvaluateBooleanExpression_AutoselectProvider()
220218
*/
221219
public function testEvaluateBooleanExpression_Autoselect(string $sBooleanExpression, bool $expected){
222220
\SetupInfo::SetSelectedModules(["itop-storage-mgmt" => "123"]);
223-
PhpExpressionEvaluator::GetInstance()->SetStaticCallsWhitelist(["SetupInfo::ModuleIsSelected"]);
224-
$this->assertEquals($expected, PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateBooleanExpression($sBooleanExpression), $sBooleanExpression);
221+
$oPhpExpressionEvaluator = new PhpExpressionEvaluator([], ["SetupInfo::ModuleIsSelected"]);
222+
$this->assertEquals($expected, $oPhpExpressionEvaluator->ParseAndEvaluateBooleanExpression($sBooleanExpression), $sBooleanExpression);
225223
}
226224
}
227225

0 commit comments

Comments
 (0)