From 7c4699b2f967d921eeb2bbdc666ee6478038027c Mon Sep 17 00:00:00 2001
From: Alexander Schnitzler <git@alexanderschnitzler.de>
Date: Sat, 16 May 2020 19:32:19 +0200
Subject: [PATCH] [BUGFIX] Set controller object name for widget request

While introducing the fully qualified controller class names
in the extbase plugin configuration the originally used setter
\TYPO3\CMS\Extbase\Mvc\Request::setControllerObjectName() has
no longer been used to guess extension name, subpackage key and
controller name from the class name since all that information
is known. Said setter has been kept nevertheless and it was
overlooked that it was still used by fluid widgets. This leads
to property \TYPO3\CMS\Extbase\Mvc\Request::$controllerObjectName
being empty in widget requests which then leads to an exception
when trying to create a ClassSchema for the controller object
name "".

To fix this, the widget request is now created with the controller
object name as constructor argument.

Releases: master
Resolves: #91418
Change-Id: I6abcdb8c68e831459228cc35c3263cec83d16f67
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64505
Tested-by: Susanne Moog <look@susi.dev>
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Oliver Hader <oliver.hader@typo3.org>
Reviewed-by: Susanne Moog <look@susi.dev>
Reviewed-by: Oliver Hader <oliver.hader@typo3.org>
---
 .../Core/Widget/WidgetRequestBuilder.php      | 21 ++++++++++---------
 .../Core/Widget/WidgetRequestBuilderTest.php  |  2 +-
 2 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/typo3/sysext/fluid/Classes/Core/Widget/WidgetRequestBuilder.php b/typo3/sysext/fluid/Classes/Core/Widget/WidgetRequestBuilder.php
index df84f9632cae..f1e6a861bd05 100644
--- a/typo3/sysext/fluid/Classes/Core/Widget/WidgetRequestBuilder.php
+++ b/typo3/sysext/fluid/Classes/Core/Widget/WidgetRequestBuilder.php
@@ -51,7 +51,17 @@ class WidgetRequestBuilder extends RequestBuilder
             $baseUri .= TYPO3_mainDir;
         }
 
-        $request = $this->objectManager->get(WidgetRequest::class);
+        $rawGetArguments = GeneralUtility::_GET();
+        if (!isset($rawGetArguments['fluid-widget-id'])) {
+            // Low level test, WidgetRequestHandler returns false in canHandleRequest () if this is not set
+            throw new \InvalidArgumentException(
+                'No Fluid Widget ID was given.',
+                1521190675
+            );
+        }
+        $widgetContext = $this->ajaxWidgetContextHolder->get($rawGetArguments['fluid-widget-id']);
+
+        $request = $this->objectManager->get(WidgetRequest::class, $widgetContext->getControllerObjectName());
         $request->setRequestUri(GeneralUtility::getIndpEnv('TYPO3_REQUEST_URL'));
         $request->setBaseUri($baseUri);
         $request->setMethod($_SERVER['REQUEST_METHOD'] ?? null);
@@ -60,18 +70,9 @@ class WidgetRequestBuilder extends RequestBuilder
         } else {
             $request->setArguments(GeneralUtility::_GET());
         }
-        $rawGetArguments = GeneralUtility::_GET();
         if (isset($rawGetArguments['action'])) {
             $request->setControllerActionName($rawGetArguments['action']);
         }
-        if (!isset($rawGetArguments['fluid-widget-id'])) {
-            // Low level test, WidgetRequestHandler returns false in canHandleRequest () if this is not set
-            throw new \InvalidArgumentException(
-                'No Fluid Widget ID was given.',
-                1521190675
-            );
-        }
-        $widgetContext = $this->ajaxWidgetContextHolder->get($rawGetArguments['fluid-widget-id']);
         $request->setWidgetContext($widgetContext);
         return $request;
     }
diff --git a/typo3/sysext/fluid/Tests/Unit/Core/Widget/WidgetRequestBuilderTest.php b/typo3/sysext/fluid/Tests/Unit/Core/Widget/WidgetRequestBuilderTest.php
index 4bd353ef4928..0956beb11eb8 100644
--- a/typo3/sysext/fluid/Tests/Unit/Core/Widget/WidgetRequestBuilderTest.php
+++ b/typo3/sysext/fluid/Tests/Unit/Core/Widget/WidgetRequestBuilderTest.php
@@ -60,7 +60,7 @@ class WidgetRequestBuilderTest extends UnitTestCase
         $this->widgetRequestBuilder = $this->getAccessibleMock(WidgetRequestBuilder::class, ['setArgumentsFromRawRequestData']);
         $this->mockWidgetRequest = $this->createMock(WidgetRequest::class);
         $this->mockObjectManager = $this->createMock(ObjectManagerInterface::class);
-        $this->mockObjectManager->expects(self::once())->method('get')->with(WidgetRequest::class)->willReturn($this->mockWidgetRequest);
+        $this->mockObjectManager->expects(self::any())->method('get')->with(WidgetRequest::class)->willReturn($this->mockWidgetRequest);
         $this->widgetRequestBuilder->_set('objectManager', $this->mockObjectManager);
         $this->mockWidgetContext = $this->createMock(WidgetContext::class);
         $this->mockAjaxWidgetContextHolder = $this->createMock(AjaxWidgetContextHolder::class);
-- 
GitLab