From 5456ab51ecff485608d6cd48b6508500a3efa1e0 Mon Sep 17 00:00:00 2001
From: Torben Hansen <derhansen@gmail.com>
Date: Fri, 29 Jan 2021 19:39:59 +0100
Subject: [PATCH] [BUGFIX] Do not try to resolve TypoScript [ELSE] condition

Symfony Expression language can't resolve the TypoScript
[ELSE] condition. Instead a parsing error is logged which
is not helpful for users, who may believe, that [ELSE] is
not supported any more.

Therefore the Expression Language resolver now does not
parse the [ELSE] condition any more returns false instead.

Resolves: #91259
Releases: master, 10.4
Change-Id: I6701b06efe237f36aad19e8d20573c28750dab5d
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/67572
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Stefan Froemken <froemken@gmail.com>
Tested-by: Richard Haeser <richard@richardhaeser.com>
Reviewed-by: Stefan Froemken <froemken@gmail.com>
Reviewed-by: Richard Haeser <richard@richardhaeser.com>
---
 .../core/Classes/ExpressionLanguage/Resolver.php       |  6 ++++++
 .../Tests/Unit/ExpressionLanguage/ResolverTest.php     | 10 ++++++++++
 2 files changed, 16 insertions(+)

diff --git a/typo3/sysext/core/Classes/ExpressionLanguage/Resolver.php b/typo3/sysext/core/Classes/ExpressionLanguage/Resolver.php
index 638600cad420..b7a4a881f9fe 100644
--- a/typo3/sysext/core/Classes/ExpressionLanguage/Resolver.php
+++ b/typo3/sysext/core/Classes/ExpressionLanguage/Resolver.php
@@ -76,6 +76,12 @@ 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/ExpressionLanguage/ResolverTest.php b/typo3/sysext/core/Tests/Unit/ExpressionLanguage/ResolverTest.php
index 63ef57a783e1..8b4032bc6bfa 100644
--- a/typo3/sysext/core/Tests/Unit/ExpressionLanguage/ResolverTest.php
+++ b/typo3/sysext/core/Tests/Unit/ExpressionLanguage/ResolverTest.php
@@ -85,6 +85,16 @@ class ResolverTest extends UnitTestCase
         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
      */
-- 
GitLab