[!!!][TASK] Allow RequestHandler only to work with Routes 01/45501/3
authorBenni Mack <benni@typo3.org>
Wed, 30 Dec 2015 12:19:01 +0000 (13:19 +0100)
committerWouter Wolters <typo3@wouterwolters.nl>
Wed, 30 Dec 2015 17:31:59 +0000 (18:31 +0100)
The fallback logic for having the default backend request
handler to behave like init.php was removed, as Routing is
the only way except for AJAX calls and modules to
access the backend.

Resolves: #72474
Releases: master
Change-Id: Idb49ae8c6354b04c20cdf1fde574d10bfcc56ad9
Reviewed-on: https://review.typo3.org/45501
Reviewed-by: Morton Jonuschat <m.jonuschat@mojocode.de>
Tested-by: Morton Jonuschat <m.jonuschat@mojocode.de>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
typo3/sysext/backend/Classes/Http/RequestHandler.php
typo3/sysext/core/Documentation/Changelog/master/Breaking-72474-RequestHandlerOnlyWorksWithRoutes.rst [new file with mode: 0644]

index b9b4df2..5b7a8c3 100644 (file)
@@ -24,17 +24,10 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
  * General RequestHandler for the TYPO3 Backend. This is used for all Backend requests except for CLI
- * or AJAX calls. Unlike all other RequestHandlers in the TYPO3 CMS Core, the actual logic for choosing
- * the controller is still done inside places like each single file.
- * This RequestHandler here serves solely to check and set up all requirements needed for a TYPO3 Backend.
- * This class might be changed in the future.
+ * or AJAX calls.
  *
- * At first, this request handler serves as a replacement to typo3/init.php. It is called but does not exit
- * so any typical script that is not dispatched, is just running through the handleRequest() method and then
- * calls its own code.
- *
- * However, if a get/post parameter "route" is set, the unified Backend Routing is called and searches for a
- * matching route inside the Router. The corresponding controller / action is called then which returns content.
+ * If a get/post parameter "route" is set, the Backend Routing is called and searches for a
+ * matching route inside the Router. The corresponding controller / action is called then which returns the response.
  *
  * The following get/post parameters are evaluated here:
  *   - route
@@ -62,40 +55,20 @@ class RequestHandler implements RequestHandlerInterface
      * Handles any backend request
      *
      * @param ServerRequestInterface $request
-     * @return NULL|ResponseInterface
+     * @return ResponseInterface
      */
     public function handleRequest(ServerRequestInterface $request)
     {
-        // enable dispatching via Request/Response logic only for typo3/index.php
-        // This fallback will be removed in TYPO3 CMS 8, as only index.php will be allowed
-        $path = substr($request->getUri()->getPath(), strlen(GeneralUtility::getIndpEnv('TYPO3_SITE_PATH')));
-        $routingEnabled = ($path === TYPO3_mainDir . 'index.php' || $path === TYPO3_mainDir);
-        $proceedIfNoUserIsLoggedIn = false;
-
-        if ($routingEnabled) {
-            $pathToRoute = (string)$request->getQueryParams()['route'];
-            // Allow the login page to be displayed if routing is not used and on index.php
-            if (empty($pathToRoute)) {
-                $pathToRoute = '/login';
-            }
-            $request = $request->withAttribute('routePath', $pathToRoute);
+        // Allow the login page to be displayed if routing is not used and on index.php
+        $pathToRoute = (string)$request->getQueryParams()['route'] ?: '/login';
+        $request = $request->withAttribute('routePath', $pathToRoute);
 
-            // Evaluate the constant for skipping the BE user check for the bootstrap
-            // should be handled differently in the future by checking the Bootstrap directly
-            if ($pathToRoute === '/login') {
-                $proceedIfNoUserIsLoggedIn = true;
-            }
-        }
-
-        $this->boot($proceedIfNoUserIsLoggedIn);
+        // skip the BE user check on the login page
+        // should be handled differently in the future by checking the Bootstrap directly
+        $this->boot($pathToRoute === '/login');
 
         // Check if the router has the available route and dispatch.
-        if ($routingEnabled) {
-            return $this->dispatch($request);
-        }
-
-        // No route found, so the system proceeds in called entrypoint as fallback.
-        return null;
+        return $this->dispatch($request);
     }
 
     /**
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-72474-RequestHandlerOnlyWorksWithRoutes.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-72474-RequestHandlerOnlyWorksWithRoutes.rst
new file mode 100644 (file)
index 0000000..3107ff4
--- /dev/null
@@ -0,0 +1,22 @@
+========================================================
+Breaking: #72474 - RequestHandler only works with Routes
+========================================================
+
+Description
+===========
+
+The default backend RequestHandler has had a fallback that triggered the backend initialization without having
+a ``&route=`` request parameter set. This was used for the transition when deprecating the traditional entry-scripts. The
+logic was removed.
+
+
+Impact
+======
+
+Any regular backend request (non-module and non-AJAX) will now require a ``&route=`` request parameter, otherwise will fallback to the default route (login) when non given.
+
+
+Migration
+=========
+
+For all backend-related calls, either use a custom RequestHandler or switch to using Backend Routing.
\ No newline at end of file