[TASK] ext:install Break possible redirect loop 91/24191/3
authorChristian Kuhn <lolli@schwarzbu.ch>
Mon, 30 Sep 2013 22:51:12 +0000 (00:51 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Sun, 6 Oct 2013 19:19:57 +0000 (21:19 +0200)
The install tool initiates redirects if configuration values were
changed. This is especially done within the "silent upgrade" class.
If something goes wrong there, the system may end up in a redirect
loop and does not show useful debug information.

The patch introduces a simple redirect loop detection and breaks
after ten redirects. This should be enough for the "silent upgrade"
and should be lower than the usual browser based loop detection.

Change-Id: I31164595dc1ada17012525268b57c03499dd2ddf
Resolves: #52414
Related: #52338
Relases: 6.2
Reviewed-on: https://review.typo3.org/24191
Reviewed-by: Anja Leichsenring
Tested-by: Anja Leichsenring
Reviewed-by: Christian Kuhn
Tested-by: Christian Kuhn
typo3/sysext/install/Classes/Controller/AbstractController.php
typo3/sysext/install/Classes/Controller/Exception/RedirectLoopException.php [new file with mode: 0644]
typo3/sysext/install/Start/Install.php

index 8c83bf8..af99d69 100644 (file)
@@ -511,6 +511,23 @@ class AbstractController {
 
                $parameters = array();
 
+               // Current redirect count
+               if (isset($getPostValues['redirectCount'])) {
+                       $redirectCount = (int)$getPostValues['redirectCount'] + 1;
+               } else {
+                       $redirectCount = 0;
+               }
+               if ($redirectCount >= 10) {
+                       // Abort a redirect loop by throwing an exception. Calling this method
+                       // some times in a row is ok, but break a loop if this happens too often.
+                       throw new Exception\RedirectLoopException(
+                               'Redirect loop aborted. If this message is shown again after a reload,'
+                                       . ' your setup is so weird that the install tool is unable to handle it.',
+                               1380581244
+                       );
+               }
+               $parameters[] = 'install[redirectCount]=' . $redirectCount;
+
                // Add context parameter in case this script was called within backend scope
                $context = 'install[context]=standalone';
                if (isset($getPostValues['context']) && $getPostValues['context'] === 'backend') {
diff --git a/typo3/sysext/install/Classes/Controller/Exception/RedirectLoopException.php b/typo3/sysext/install/Classes/Controller/Exception/RedirectLoopException.php
new file mode 100644 (file)
index 0000000..ef077de
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+namespace TYPO3\CMS\Install\Controller\Exception;
+
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2013 Christian Kuhn <lolli@schwarzbu.ch>
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+
+/**
+ * A controller exception thrown if a redirect loop is detected
+ */
+class RedirectLoopException extends \TYPO3\CMS\Install\Exception {
+
+}
+?>
\ No newline at end of file
index 82def97..c77925d 100644 (file)
  *   Determine step and tool controller main action sanitized by step / tool controller and
  *   only executed if user is logged in. Form protection API relies on this.
  *
+ * - GET/POST "install[redirectCount]"
+ *   The install tool initiates redirects to itself if configuration parameters were changed.
+ *   This may lead to infinite redirect loops under rare circumstances. This parameter is
+ *   incremented for each redirect to break a loop after some iterations.
+ *
  * - POST "install[set]"
  *   Contains keys to determine which sub-action of the action is requested,
  *   eg. "change install tool password" in "important actions". Set to 'execute' if some