diff --git a/typo3/sysext/core/Classes/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcher.php b/typo3/sysext/core/Classes/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcher.php index fd6a70435641a0b674d4bf0e1661408a88e1ab55..e9d2a77479601b973b5238f51a81b393f15d28ff 100644 --- a/typo3/sysext/core/Classes/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcher.php +++ b/typo3/sysext/core/Classes/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcher.php @@ -189,11 +189,14 @@ abstract class AbstractConditionMatcher implements LoggerAwareInterface, Conditi */ protected function evaluateExpression(string $expression): bool { + // The TypoScript [ELSE] condition is not known by the Symfony Expression Language + // and must not be evaluated. If/else logic is handled in TypoScriptParser. + if (strtoupper($expression) === 'ELSE') { + return false; + } + try { - $result = $this->expressionLanguageResolver->evaluate($expression); - if ($result !== null) { - return $result; - } + return $this->expressionLanguageResolver->evaluate($expression); } catch (MissingTsfeException $e) { // TSFE is not available in the current context (e.g. TSFE in BE context), // we set all conditions false for this case. diff --git a/typo3/sysext/core/Classes/ExpressionLanguage/Resolver.php b/typo3/sysext/core/Classes/ExpressionLanguage/Resolver.php index b7a4a881f9fed1abca505b2031fffb2665b603f5..638600cad42018d85e6150884b4964e514eae0e7 100644 --- a/typo3/sysext/core/Classes/ExpressionLanguage/Resolver.php +++ b/typo3/sysext/core/Classes/ExpressionLanguage/Resolver.php @@ -76,12 +76,6 @@ class Resolver */ public function evaluate(string $condition): bool { - // The TypoScript [ELSE] condition is not known by the Symfony Expression Language - // and must not be evaluated. If/else logic is handled in TypoScriptParser. - if (strtoupper($condition) === 'ELSE') { - return false; - } - return (bool)$this->expressionLanguage->evaluate($condition, $this->expressionLanguageVariables); } diff --git a/typo3/sysext/core/Tests/Unit/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcherTest.php b/typo3/sysext/core/Tests/Unit/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcherTest.php index f1cad165d33df7258588a978a1c301629dc7b747..61c771a900af30c1de65c994bf691e4ebdbae14b 100644 --- a/typo3/sysext/core/Tests/Unit/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcherTest.php +++ b/typo3/sysext/core/Tests/Unit/Configuration/TypoScript/ConditionMatching/AbstractConditionMatcherTest.php @@ -28,6 +28,7 @@ use TYPO3\CMS\Core\Context\Context; use TYPO3\CMS\Core\Context\DateTimeAspect; use TYPO3\CMS\Core\Core\ApplicationContext; use TYPO3\CMS\Core\Core\Environment; +use TYPO3\CMS\Core\ExpressionLanguage\Resolver; use TYPO3\CMS\Core\Http\ServerRequest; use TYPO3\CMS\Core\Package\PackageInterface; use TYPO3\CMS\Core\Package\PackageManager; @@ -373,4 +374,18 @@ class AbstractConditionMatcherTest extends UnitTestCase $result = $this->evaluateExpressionMethod->invokeArgs($this->conditionMatcher, ['ip("devIP")']); self::assertSame($expectedResult, $result); } + + /** + * @test + */ + public function typoScriptElseConditionIsNotEvaluatedAndAlwaysReturnsFalse(): void + { + $this->initConditionMatcher(); + $expressionProperty = new \ReflectionProperty(AbstractConditionMatcher::class, 'expressionLanguageResolver'); + $expressionProperty->setAccessible(true); + $resolverProphecy = $this->prophesize(Resolver::class); + $resolverProphecy->evaluate(Argument::cetera())->shouldNotBeCalled(); + $expressionProperty->setValue($this->conditionMatcher, $resolverProphecy->reveal()); + self::assertFalse($this->evaluateExpressionMethod->invokeArgs($this->conditionMatcher, ['ELSE'])); + } } diff --git a/typo3/sysext/core/Tests/Unit/ExpressionLanguage/ResolverTest.php b/typo3/sysext/core/Tests/Unit/ExpressionLanguage/ResolverTest.php index 8b4032bc6bfa6e1851caee93123ff078c9d5f17a..397eccfc49c9216674efb9571bb5d29a05aacbc0 100644 --- a/typo3/sysext/core/Tests/Unit/ExpressionLanguage/ResolverTest.php +++ b/typo3/sysext/core/Tests/Unit/ExpressionLanguage/ResolverTest.php @@ -24,7 +24,6 @@ use TYPO3\CMS\Core\Cache\Frontend\PhpFrontend; use TYPO3\CMS\Core\ExpressionLanguage\DefaultProvider; use TYPO3\CMS\Core\ExpressionLanguage\FunctionsProvider\DefaultFunctionsProvider; use TYPO3\CMS\Core\ExpressionLanguage\Resolver; -use TYPO3\CMS\Core\Http\ServerRequest; use TYPO3\CMS\Core\Package\PackageInterface; use TYPO3\CMS\Core\Package\PackageManager; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -80,21 +79,10 @@ class ResolverTest extends UnitTestCase */ public function basicExpressionHandlingResultsWorksAsExpected(string $expression, $expectedResult) { - $request = new ServerRequest(); - $expressionLanguageResolver = new Resolver('default', [], $request); + $expressionLanguageResolver = new Resolver('default', []); self::assertSame($expectedResult, $expressionLanguageResolver->evaluate($expression)); } - /** - * @test - */ - public function typoScriptElseConditionIsNotEvaluatedAndAlwaysReturnsFalse() - { - $request = new ServerRequest(); - $expressionLanguageResolver = new Resolver('default', [], $request); - self::assertFalse($expressionLanguageResolver->evaluate('ELSE')); - } - /** * @return array */ @@ -127,9 +115,8 @@ class ResolverTest extends UnitTestCase 'varTrue' => true, 'varFalse' => false, ]); - $request = new ServerRequest(); GeneralUtility::addInstance(DefaultProvider::class, $contextProphecy->reveal()); - $expressionLanguageResolver = new Resolver('default', [], $request); + $expressionLanguageResolver = new Resolver('default', []); self::assertSame($expectedResult, $expressionLanguageResolver->evaluate($expression)); } @@ -168,10 +155,9 @@ class ResolverTest extends UnitTestCase 'var1' => 'FOO', 'var2' => 'foo' ]); - $request = new ServerRequest(); GeneralUtility::addInstance(DefaultProvider::class, $contextProphecy->reveal()); GeneralUtility::addInstance(DefaultFunctionsProvider::class, $expressionProvider->reveal()); - $expressionLanguageResolver = new Resolver('default', [], $request); + $expressionLanguageResolver = new Resolver('default', []); self::assertSame($expectedResult, $expressionLanguageResolver->evaluate($expression)); } }