[BUGFIX] EvaluteDisplayCondition should throw proper error message 80/58480/3
authorBenni Mack <benni@typo3.org>
Sat, 29 Sep 2018 23:42:41 +0000 (01:42 +0200)
committerJigal van Hemert <jigal.van.hemert@typo3.org>
Sun, 30 Sep 2018 10:25:07 +0000 (12:25 +0200)
When an extension author writes a display condition in TCA and
by incident uses a wrong format for the displayCondition (see ticket)
the strtoupper fails due to the lack of an associative array
because it's a numeric-key array.

An additional check fixes the issue.

Resolves: #79692
Releases: master, 8.7
Change-Id: I4455bdc908e0be1a373f86680e718e876aa5ddd7
Reviewed-on: https://review.typo3.org/58480
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Jigal van Hemert <jigal.van.hemert@typo3.org>
Tested-by: Jigal van Hemert <jigal.van.hemert@typo3.org>
typo3/sysext/backend/Classes/Form/FormDataProvider/EvaluateDisplayConditions.php
typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/EvaluateDisplayConditionsTest.php

index e29e731..e6c72d6 100644 (file)
@@ -202,7 +202,7 @@ class EvaluateDisplayConditions implements FormDataProviderInterface
             $conditionArray = $this->parseSingleConditionString($condition, $databaseRow, $flexContext);
         } elseif (is_array($condition)) {
             foreach ($condition as $logicalOperator => $groupedDisplayConditions) {
-                $logicalOperator = strtoupper($logicalOperator);
+                $logicalOperator = strtoupper(is_string($logicalOperator) ? $logicalOperator : '');
                 if (($logicalOperator !== 'AND' && $logicalOperator !== 'OR') || !is_array($groupedDisplayConditions)) {
                     throw new \RuntimeException(
                         'Multiple conditions must have boolean operator "OR" or "AND", "' . $logicalOperator . '" given.',
index 7f3a7e0..a33aeb8 100644 (file)
@@ -54,6 +54,28 @@ class EvaluateDisplayConditionsTest extends UnitTestCase
     /**
      * @test
      */
+    public function addDataThrowsExceptionIAConditionHasNoStringAsKey()
+    {
+        $input = [
+            'databaseRow' => [],
+            'processedTca' => [
+                'columns' => [
+                    'field_1' => [
+                        'displayCond' => [
+                            ['condition1'],
+                        ],
+                    ],
+                ],
+            ],
+        ];
+        $this->expectException(\RuntimeException::class);
+        $this->expectExceptionCode(1481380393);
+        (new EvaluateDisplayConditions())->addData($input);
+    }
+
+    /**
+     * @test
+     */
     public function addDataThrowsExceptionWithMultipleConditionsCombinedWithAndHavingOnlyOneSubCondition()
     {
         $input = [