[TASK] Move install tool entry point to typo3/install.php 79/53579/13
authorHelmut Hummel <typo3@helhum.io>
Mon, 24 Jul 2017 13:57:28 +0000 (15:57 +0200)
committerHelmut Hummel <typo3@helhum.io>
Sat, 29 Jul 2017 09:09:53 +0000 (11:09 +0200)
To streamline and unify the entry scripts, the install tool
entry point is now moved to typo3/install.php

Calling the old entry scripts and the shortcut typo3/install/
is deprecated.

All access to public resources is changed to properly use
the resource view helper, so that the path to the assets
are not hard coded any more.

Resolves: #81951
Releases: master
Change-Id: Ia8827130bb041802e743767907d16269cda2fef0
Reviewed-on: https://review.typo3.org/53579
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: Georg Ringer <georg.ringer@gmail.com>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Helmut Hummel <typo3@helhum.io>
Tested-by: Helmut Hummel <typo3@helhum.io>
26 files changed:
typo3/install.php [new file with mode: 0644]
typo3/install/index.php
typo3/sysext/core/Classes/Core/Bootstrap.php
typo3/sysext/core/Classes/Core/SystemEnvironmentBuilder.php
typo3/sysext/core/Documentation/Changelog/master/Deprecation-81951-InstallToolEntryPointMoved.rst [new file with mode: 0644]
typo3/sysext/install/Classes/Controller/AbstractController.php
typo3/sysext/install/Classes/Controller/Action/AbstractAction.php
typo3/sysext/install/Classes/Controller/Action/Step/DefaultConfiguration.php
typo3/sysext/install/Classes/Controller/BackendModuleController.php
typo3/sysext/install/Classes/Controller/ToolController.php
typo3/sysext/install/Classes/Http/Application.php
typo3/sysext/install/Classes/Updates/FinalDatabaseSchemaUpdate.php
typo3/sysext/install/Classes/ViewHelpers/Uri/ActionViewHelper.php [new file with mode: 0644]
typo3/sysext/install/Resources/Private/Layouts/Step.html
typo3/sysext/install/Resources/Private/Partials/Action/Common/Head.html
typo3/sysext/install/Resources/Private/Partials/Action/Common/Headers.html
typo3/sysext/install/Resources/Private/Partials/Action/Common/Left.html
typo3/sysext/install/Resources/Private/Partials/Action/Common/LoginForm.html
typo3/sysext/install/Resources/Private/Partials/Action/Common/MenuLink.html
typo3/sysext/install/Resources/Private/Partials/Action/Tool/UpgradeWizard/ListUpdates.html
typo3/sysext/install/Resources/Private/Php/install.php [new file with mode: 0644]
typo3/sysext/install/Resources/Private/Templates/Action/Common/FirstInstall.html
typo3/sysext/install/Resources/Private/Templates/Action/Common/InstallToolDisabled.html
typo3/sysext/install/Resources/Private/Templates/Action/Common/InstallToolPasswordNotSet.html
typo3/sysext/install/Resources/Private/Templates/Action/Common/Login.html
typo3/sysext/install/Start/Install.php

diff --git a/typo3/install.php b/typo3/install.php
new file mode 100644 (file)
index 0000000..07c456f
--- /dev/null
@@ -0,0 +1,3 @@
+<?php
+
+require __DIR__ . '/sysext/install/Resources/Private/Php/install.php';
index ff74226..805af49 100644 (file)
@@ -18,5 +18,6 @@ call_user_func(function () {
     // We ensure that possible notices from Core code do not kill our redirect due to PHP output
     error_reporting(E_ALL & ~(E_STRICT | E_NOTICE | E_DEPRECATED));
 
-    \TYPO3\CMS\Core\Utility\HttpUtility::redirect('../sysext/install/Start/Install.php', \TYPO3\CMS\Core\Utility\HttpUtility::HTTP_STATUS_307);
+    // @deprecated in 9.x will be removed in 10.0
+    \TYPO3\CMS\Core\Utility\HttpUtility::redirect('../install.php', \TYPO3\CMS\Core\Utility\HttpUtility::HTTP_STATUS_307);
 });
index 177c7bf..79a4b05 100644 (file)
@@ -240,7 +240,7 @@ class Bootstrap
      */
     public function redirectToInstallTool($entryPointLevel = 0)
     {
-        $path = TYPO3_mainDir . 'sysext/install/Start/Install.php';
+        $path = TYPO3_mainDir . 'install.php';
         if ($entryPointLevel > 0) {
             $path = str_repeat('../', $entryPointLevel) . $path;
         }
index 365dd86..8a06d04 100644 (file)
@@ -365,7 +365,7 @@ class SystemEnvironmentBuilder
      * The following main scenarios for entry points exist by default in the TYPO3 core:
      * - Directly called documentRoot/index.php (-> FE call or eiD include): index.php is located in the same directory
      * as the main project. The document root is identical to the directory the script is located at.
-     * - The install tool, located under typo3/sysext/install/Start/Install.php.
+     * - The install tool, located under typo3/install.php.
      * - A Backend script: This is the case for the typo3/index.php dispatcher and other entry scripts like 'typo3/sysext/core/bin/typo3'
      * or 'typo3/index.php' that are located inside typo3/ directly.
      *
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-81951-InstallToolEntryPointMoved.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-81951-InstallToolEntryPointMoved.rst
new file mode 100644 (file)
index 0000000..71ad2cb
--- /dev/null
@@ -0,0 +1,34 @@
+.. include:: ../../Includes.txt
+
+====================================================
+Deprecation: #81951 - Install Tool entry point moved
+====================================================
+
+See :issue:`81951`
+
+Description
+===========
+
+The canonical entry point for accessing the install tool now is:
+
+`typo3/install.php`
+
+
+Impact
+======
+
+Accessing `typo3/install/` or `typo3/sysext/install/Start/Install.php` will still work, but has been deprecated.
+
+
+Affected Installations
+======================
+
+Every TYPO3 installation is affected.
+
+
+Migration
+=========
+
+Change bookmarks or scripts from the old entry point(s) to the new one.
+
+.. index:: Backend
index b256ed4..bfa087f 100644 (file)
@@ -520,7 +520,7 @@ class AbstractController
             $parameters[] = 'install[action]=' . $action;
         }
 
-        $redirectLocation = 'Install.php?' . implode('&', $parameters);
+        $redirectLocation = GeneralUtility::getIndpEnv('TYPO3_REQUEST_SCRIPT') . '?' . implode('&', $parameters);
 
         \TYPO3\CMS\Core\Utility\HttpUtility::redirect(
             $redirectLocation,
index 5c4994c..a8397cf 100644 (file)
@@ -80,6 +80,7 @@ abstract class AbstractAction implements ActionInterface
         $controllerActionDirectoryName = ucfirst($this->controller);
         $mainTemplate = ucfirst($this->action);
         $this->view = GeneralUtility::makeInstance(StandaloneView::class);
+        $this->view->getRequest()->setControllerExtensionName('Install');
         $this->view->setTemplatePathAndFilename($viewRootPath . 'Templates/Action/' . $controllerActionDirectoryName . '/' . $mainTemplate . '.html');
         $this->view->setLayoutRootPaths([$viewRootPath . 'Layouts/']);
         $this->view->setPartialRootPaths([$viewRootPath . 'Partials/']);
index 7a986af..f2ccef7 100644 (file)
@@ -138,7 +138,7 @@ For each website you need a TypoScript template on the main page of your website
             EnableFileService::removeInstallToolEnableFile();
         }
 
-        \TYPO3\CMS\Core\Utility\HttpUtility::redirect('../../../index.php', \TYPO3\CMS\Core\Utility\HttpUtility::HTTP_STATUS_303);
+        \TYPO3\CMS\Core\Utility\HttpUtility::redirect(GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . TYPO3_mainDir . 'index.php', \TYPO3\CMS\Core\Utility\HttpUtility::HTTP_STATUS_303);
     }
 
     /**
index fc19a3e..45a4831 100644 (file)
@@ -51,7 +51,7 @@ class BackendModuleController
 
         if ($enableFileService->checkInstallToolEnableFile()) {
             // Install tool is open and valid, redirect to it
-            $response = $response->withStatus(303)->withHeader('Location', 'sysext/install/Start/Install.php?install[context]=backend');
+            $response = $response->withStatus(303)->withHeader('Location', 'install.php?install[context]=backend');
         } elseif ($request->getMethod() === 'POST' && $request->getParsedBody()['action'] === 'enableInstallTool') {
             // Request to open the install tool
             $installToolEnableToken = $request->getParsedBody()['installToolEnableToken'];
@@ -60,7 +60,7 @@ class BackendModuleController
             }
             $enableFileService->createInstallToolEnableFile();
             // Install tool is open and valid, redirect to it
-            $response = $response->withStatus(303)->withHeader('Location', 'sysext/install/Start/Install.php?install[context]=backend');
+            $response = $response->withStatus(303)->withHeader('Location', 'install.php?install[context]=backend');
         } else {
             // Show the "create enable install tool" button
             /** @var StandaloneView $view */
index cbe1efa..db66593 100644 (file)
@@ -14,6 +14,7 @@ namespace TYPO3\CMS\Install\Controller;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Install\Service\EnableFileService;
 
 /**
@@ -119,7 +120,7 @@ class ToolController extends AbstractController
                     // We do not use GeneralUtility here to be sure that hash generation works even if that class might not exist any more.
                     $parameters[] = 'install[lastErrorHash]=' . hash_hmac('sha1', $errorEncoded, $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] . 'InstallToolError');
 
-                    $redirectLocation = 'Install.php?' . implode('&', $parameters);
+                    $redirectLocation = GeneralUtility::getIndpEnv('TYPO3_REQUEST_SCRIPT') . '?' . implode('&', $parameters);
 
                     if (!headers_sent()) {
                         \TYPO3\CMS\Core\Utility\HttpUtility::redirect(
index 92afb0e..732c1e0 100644 (file)
@@ -30,7 +30,7 @@ class Application implements ApplicationInterface
      * Number of subdirectories where the entry script is located, relative to PATH_site
      * @var int
      */
-    protected $entryPointLevel = 4;
+    protected $entryPointLevel = 1;
 
     /**
      * All available request handlers that can handle an install tool request
index 383f761..3f2597a 100644 (file)
@@ -54,7 +54,7 @@ class FinalDatabaseSchemaUpdate extends AbstractDatabaseSchemaUpdate
         $description = 'There are tables or fields in the database which need to be changed.<br /><br />' .
         'This update wizard can be run only when there are no other update wizards left to make sure they have ' .
         'all needed fields unchanged.<br /><br />If you want to apply changes selectively, ' .
-        '<a href="Install.php?install[action]=importantActions&amp;install[context]=' .
+        '<a href="' . GeneralUtility::getIndpEnv('TYPO3_REQUEST_SCRIPT') . '?install[action]=importantActions&amp;install[context]=' .
         $contextService->getContextString() .
         '&amp;install[controller]=tool">go to Database Analyzer</a>.';
 
diff --git a/typo3/sysext/install/Classes/ViewHelpers/Uri/ActionViewHelper.php b/typo3/sysext/install/Classes/ViewHelpers/Uri/ActionViewHelper.php
new file mode 100644 (file)
index 0000000..01a4ab5
--- /dev/null
@@ -0,0 +1,86 @@
+<?php
+namespace TYPO3\CMS\Install\ViewHelpers\Uri;
+
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
+use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
+
+/**
+ * A view helper for creating URIs to install tool actions.
+ *
+ * = Examples =
+ *
+ * <code title="URI to the show-action of the current controller">
+ * <f:uri.action action="importantActions" />
+ * </code>
+ * <output>
+ * install.php?install[action]=importantActions&amp;install[context]=
+ * </output>
+ */
+class ActionViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper
+{
+    use CompileWithRenderStatic;
+
+    /**
+     * Initialize arguments
+     *
+     * @api
+     */
+    public function initializeArguments()
+    {
+        parent::initializeArguments();
+        $this->registerArgument('action', 'string', 'Target action');
+        $this->registerArgument('controller', 'string', 'Target controller.', false, 'tool');
+        $this->registerArgument('arguments', 'array', 'Arguments', false, []);
+        $this->registerArgument('section', 'string', 'The anchor to be added to the URI', false, '');
+        $this->registerArgument('additionalParams', 'array', 'additional query parameters that won\'t be prefixed like $arguments (overrule $arguments)', false, []);
+    }
+
+    /**
+     * @param array $arguments
+     * @param \Closure $renderChildrenClosure
+     * @param RenderingContextInterface $renderingContext
+     * @return string
+     */
+    public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
+    {
+        $action = $arguments['action'];
+
+        if ($action === 'backend') {
+            return GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . TYPO3_mainDir . 'index.php';
+        }
+        if ($action === 'frontend') {
+            return GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . 'index.php';
+        }
+
+        $section = $arguments['section'];
+        $additionalParams = $arguments['additionalParams'];
+        $controller = $arguments['controller'];
+        $arguments = $arguments['arguments'];
+
+        $arguments['action'] = $action;
+        $arguments['controller'] = $controller;
+        if (!empty(GeneralUtility::_GET('install')['context'])) {
+            $arguments['context'] = GeneralUtility::_GET('install')['context'];
+        }
+
+        return GeneralUtility::getIndpEnv('TYPO3_REQUEST_SCRIPT')
+            . '?'
+            . GeneralUtility::implodeArrayForUrl('install', $arguments)
+            . GeneralUtility::implodeArrayForUrl('', $additionalParams)
+            . ($section ? '#' . $section : '');
+    }
+}
index 44759a4..0f2b7ba 100644 (file)
@@ -7,7 +7,7 @@
        <body>
                <div class="container">
                        <div class="page-header">
-                               <h1 class="logo-pageheader"><img src="../Resources/Public/Images/typo3_orange.svg" width="130" class="logo" /> <small> CMS {typo3Version}</small></h1>
+                               <h1 class="logo-pageheader"><img src="{f:uri.resource(path: 'Images/typo3_orange.svg')}" width="130" class="logo" /> <small> CMS {typo3Version}</small></h1>
                        </div>
                        <div class="row">
                                <h2>Installing TYPO3 CMS <i:constant name="TYPO3_version" /></h2>
index fe77834..1936fef 100644 (file)
@@ -1,3 +1,3 @@
 <div class="page-header">
-       <h1 class="logo-pageheader"><img src="../Resources/Public/Images/typo3_orange.svg" width="130" class="logo" /> Install tool on site: {siteName} <small>TYPO3 CMS {typo3Version}</small></h1>
+       <h1 class="logo-pageheader"><img src="{f:uri.resource(path: 'Images/typo3_orange.svg')}" width="130" class="logo" /> Install tool on site: {siteName} <small>TYPO3 CMS {typo3Version}</small></h1>
 </div>
index 9f6968f..e705e2b 100644 (file)
@@ -1,9 +1,9 @@
 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<link rel="stylesheet" type="text/css" href="../Resources/Public/Css/install.css?{time}" />
-<link rel="icon" type="image/vnd.microsoft.icon" href="../Resources/Public/Icons/favicon.ico?{time}" />
-<script type="text/javascript" src="../../core/Resources/Public/JavaScript/Contrib/jquery/jquery-3.2.1.min.js?{time}"></script>
-<script type="text/javascript" src="../../backend/Resources/Public/JavaScript/jquery.clearable.js?{time}"></script>
-<script type="text/javascript" src="../Resources/Public/JavaScript/bootstrap.min.js?{time}"></script>
-<script type="text/javascript" src="../Resources/Public/JavaScript/chosen.jquery.min.js?{time}"></script>
-<script type="text/javascript" src="../Resources/Public/JavaScript/Install.js?{time}"></script>
+<link rel="stylesheet" type="text/css" href="{f:uri.resource(path: 'Css/install.css')}?{time}" />
+<link rel="icon" type="image/vnd.microsoft.icon" href="{f:uri.resource(path: 'Icons/favicon.ico')}?{time}" />
+<script type="text/javascript" src="{f:uri.resource(extensionName: 'Core', path: 'JavaScript/Contrib/jquery/jquery-3.2.1.min.js')}?{time}"></script>
+<script type="text/javascript" src="{f:uri.resource(extensionName: 'Backend', path: 'JavaScript/jquery.clearable.js')}?{time}"></script>
+<script type="text/javascript" src="{f:uri.resource(path: 'JavaScript/bootstrap.min.js')}?{time}"></script>
+<script type="text/javascript" src="{f:uri.resource(path: 'Images/typo3_orange.svg')}JavaScript/chosen.jquery.min.js?{time}"></script>
+<script type="text/javascript" src="{f:uri.resource(path: 'JavaScript/Install.js')}?{time}"></script>
index eda951f..bd694b9 100644 (file)
@@ -1,4 +1,4 @@
-<div class="t3js-list-group-wrapper" xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers">
+<div class="t3js-list-group-wrapper" xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" xmlns:i="http://typo3.org/ns/TYPO3/CMS/Install/ViewHelpers" >
        <ul class="list-group">
                <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'importantActions', label: 'Important actions'}" />
                <f:render partial="Action/Common/MenuLink" arguments="{action: action, context: context, action_name: 'configuration', label: 'Configuration Presets'}" />
        </ul>
 
        <div>
-               <a href="Install.php?install[action]=logout&install[context]={context}&install[controller]=tool" class="btn btn-warning btn-block">Logout from Install Tool</a>
+               <a href="{i:uri.action(action: 'logout')}" class="btn btn-warning btn-block">Logout from Install Tool</a>
                <f:if condition="{contextService.backendContext}">
-                       <f:then></f:then>
                        <f:else>
-                       <a href="../../../index.php" class="btn btn-default btn-block">Backend admin</a>
-                       <a href="../../../../index.php" class="btn btn-default btn-block">Frontend website</a>
+                       <a href="{i:uri.action(action: 'backend')}" class="btn btn-default btn-block">Backend admin</a>
+                       <a href="{i:uri.action(action: 'frontend')}" class="btn btn-default btn-block">Frontend website</a>
                        </f:else>
                </f:if>
        </div>
index ae75ce8..d8efaf6 100644 (file)
@@ -2,7 +2,7 @@
 
 <div class="container">
        <div class="page-header">
-               <h1 class="logo-pageheader"><img src="../Resources/Public/Images/typo3_orange.svg" width="130" class="logo" /> Site: {siteName} <small>Login to TYPO3 {typo3Version} Install Tool</small></h1>
+               <h1 class="logo-pageheader"><img src="{f:uri.resource(path: 'Images/typo3_orange.svg')}" width="130" class="logo" /> Site: {siteName} <small>Login to TYPO3 {typo3Version} Install Tool</small></h1>
        </div>
        <div class="row">
 
@@ -17,7 +17,7 @@
                                <input id="t3-install-form-password" type="password" name="install[values][password]" class="t3-install-form-input-text form-control" autofocus="autofocus" />
                        </div>
                        <f:render partial="Action/Common/SubmitButton" arguments="{name:'login', text:'Login', className:'btn-success'}"/>
-                       <a href="Install.php?install[action]=logout&install[context]={context}&install[controller]=tool" class="btn btn-danger pull-right"><i class="fa fa-lock"></i> Lock Install Tool again</a>
+                       <a href="{i:uri.action(action: 'logout')}" class="btn btn-danger pull-right"><i class="fa fa-lock"></i> Lock Install Tool again</a>
 
                </form>
        </div>
index 251bfbc..d927376 100644 (file)
@@ -1,5 +1,6 @@
+{namespace i=TYPO3\CMS\Install\ViewHelpers}
 <li class="list-group-item{f:if(condition:'{action} == {action_name}', then:' active')}">
-  <a class="t3js-install-menu-{action_name}" href="Install.php?install[action]={action_name}&install[context]={context}&install[controller]=tool">
+  <a class="t3js-install-menu-{action_name}" href="{i:uri.action(action: action_name)}">
     {label}
   </a>
 </li>
index 7a20b04..6b620a8 100644 (file)
@@ -1,3 +1,4 @@
+{namespace i=TYPO3\CMS\Install\ViewHelpers}
 <p>
        If you upgrade your TYPO3 installation from one major version to another (e.g. 6.2 to 7 LTS),
        then the Upgrade Wizards guide you through the necessary steps to upgrade your database
@@ -92,6 +93,6 @@
        When all updates are done you can check the database for tables and fields no longer required.
        Perform the Database Analyzer steps until no more changes are required.
 </p>
-<a href="Install.php?install[action]=importantActions&amp;install[context]={context}&amp;install[controller]=tool" class="btn btn-default">
+<a href="{i:uri.action(action: 'importantActions')}" class="btn btn-default">
        Go to Database Analyzer
 </a>
diff --git a/typo3/sysext/install/Resources/Private/Php/install.php b/typo3/sysext/install/Resources/Private/Php/install.php
new file mode 100644 (file)
index 0000000..e175d1b
--- /dev/null
@@ -0,0 +1,104 @@
+<?php
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+/**
+ * Entry point to the install tool and step installer.
+ *
+ * There are two main controllers: "step" and "tool".
+ * The step controller is always called first, and redirects to the tool controller
+ * if the basic core functionality is given (instance configuration exists, database
+ * connection works, ...)
+ * The tool controller is the main "install tool" with all the main functionality.
+ *
+ * The step controller handles the basic installation.
+ * During first installation it creates the basic file and folder structure, the
+ * configuration files, the database connection and a basic configuration. Those steps
+ * are cycled through and if some step returns TRUE on "needsExecution", an input
+ * form of this step is rendered.
+ * After initial installation, the step installer is still called if the install
+ * tool is accessed, so it will automatically come up if some basic configuration fails.
+ * If everything is ok, the step installer will redirect to the main install tool.
+ * The step installer also has some "silent" update scripts, for example it migrates
+ * a localconf.php to LocalConfiguration if needed.
+ *
+ * This ensures as soon as the tool controller is called, the basic configuration is ok.
+ *
+ * Whenever the bootstrap or other core elements figure the installation
+ * needs an update that is handled within the step controller, it should just
+ * redirect to the entry script and let the step controller do necessary work.
+ *
+ * The step installer initiates browser redirects if steps were executed. This simplifies
+ * internal logic by separating the different bootstrap states needed during installation
+ * from each other.
+ *
+ * There is also a backend module controller, that basically only shows a screen
+ * with the "enable install tool" button and then redirects to the entry script. Other
+ * than that, it does not interfere with step or tool controller and just sets a
+ * context GET parameter to indicate that the install tool is called within backend context.
+ *
+ * To coordinate different tasks within step and install controller and actions, several
+ * GET or POST parameters are used, all prefixed with "install".
+ * Parameters allowed as GET and POST are preserved during redirects, POST parameters are
+ * thrown away between redirects (HTTP status code 303).
+ *
+ * The following main GET and POST parameters are used:
+ * - GET/POST "install[context]" Preserved
+ *   Either empty, 'standalone' or 'backend', fallback to 'standalone'. Set to 'backend'
+ *   if install tool is called form the backend main module (BackendModuleController). This
+ *   changes the view a bit and shows the doc header in the install tool, changes background
+ *   color and such.
+ *
+ * - GET/POST "install[controller]" Preserved
+ *   Either empty, 'step' or 'tool', fallback to 'step'. This coordinates whether the step
+ *   or tool controller is called. This parameter is never set externally, so the step
+ *   controller is always called first. It itself sets the type to 'tool' and redirects to
+ *   the tool controller if needed.
+ *   This means you could (but shouldn't) directly call the tool controller, but it
+ *   will still require a login and session, then.
+ *
+ * - GET/POST "install[action]" Preserved
+ *   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
+ *   step should be executed.
+ *
+ * - POST "install[values]"
+ *   Data values for a specific "install[set]" action
+ *
+ * - POST "install[token]"
+ *   A session and instance specific token created from the instance specific
+ *   encryptionKey (taken care of in an early point in the step controller). This hash
+ *   is used as form protection against CSRF for all POST data. Both the step and tool
+ *   controller will logout a user if the token check fails. The only exception to this
+ *   handling is the very first installation step where no session and no encryption key
+ *   can exist yet.
+ */
+
+// Exit early if php requirement is not satisfied.
+if (version_compare(PHP_VERSION, '7.0.0', '<')) {
+    die('This version of TYPO3 CMS requires PHP 7.0 or above');
+}
+
+call_user_func(function () {
+    $classLoader = require __DIR__ . '/../../../../../../vendor/autoload.php';
+    (new \TYPO3\CMS\Install\Http\Application($classLoader))->run();
+});
index b585502..3e261d5 100644 (file)
@@ -2,12 +2,12 @@
 <html>
 <head>
        <title>The Access to the Install Tool blocked</title>
-       <link rel="stylesheet" type="text/css" href="../Resources/Public/Css/install.css?{time}" />
+       <link rel="stylesheet" type="text/css" href="{f:uri.resource(path: 'Css/install.css')}?{time}" />
 </head>
 <body>
 <div class="container">
        <div class="page-header">
-               <h1 class="logo-pageheader"><img src="../Resources/Public/Images/typo3_orange.svg" width="130" class="logo" /> <small> CMS {typo3Version}</small></h1>
+               <h1 class="logo-pageheader"><img src="{f:uri.resource(path: 'Images/typo3_orange.svg')}" width="130" class="logo" /> <small> CMS {typo3Version}</small></h1>
        </div>
        <div class="row">
                <div class="col-sm-12 col-md-6">
index dceeb8f..a75dacd 100644 (file)
@@ -2,12 +2,12 @@
 <html>
 <head>
        <title>The Install Tool is locked</title>
-       <link rel="icon" type="image/vnd.microsoft.icon" href="../Resources/Public/Icons/favicon.ico?{time}"/>
-       <link rel="stylesheet" type="text/css" href="../Resources/Public/Css/install.css?{time}" />
+       <link rel="icon" type="image/vnd.microsoft.icon" href="{f:uri.resource(path: 'Icons/favicon.ico')}?{time}"/>
+       <link rel="stylesheet" type="text/css" href="{f:uri.resource(path: 'Css/install.css')}?{time}" />
 </head>
 <body>
 <div class="container">
-       <div class="page-header"><img src="../Resources/Public/Images/typo3_orange.svg" width="130" class="logo" /></div>
+       <div class="page-header"><img src="{f:uri.resource(path: 'Images/typo3_orange.svg')}" width="130" class="logo" /></div>
        <div class="row">
                <div class="col-sm-12 col-md-8 col-lg-5 center-block">
                        <div class="panel panel-warning">
index 5de5762..94082b1 100644 (file)
@@ -2,12 +2,12 @@
 <html>
 <head>
        <title>The Access to the Install Tool blocked</title>
-       <link rel="stylesheet" type="text/css" href="../Resources/Public/Css/install.css?{time}" />
+       <link rel="stylesheet" type="text/css" href="{f:uri.resource(path: 'Css/install.css')}?{time}" />
 </head>
 <body>
 <div class="container">
        <div class="page-header">
-               <h1 class="logo-pageheader"><img src="../Resources/Public/Images/typo3_orange.svg" width="130" class="logo" /> <small> CMS {typo3Version}</small></h1>
+               <h1 class="logo-pageheader"><img src="{f:uri.resource(path: 'Images/typo3_orange.svg')}" width="130" class="logo" /> <small> CMS {typo3Version}</small></h1>
        </div>
        <div class="row">
                <div class="col-sm-12 col-md-6">
@@ -30,4 +30,4 @@
        </div>
 </div>
 </body>
-</html>
\ No newline at end of file
+</html>
index 0f1e443..3f2ea2e 100644 (file)
@@ -12,7 +12,7 @@
 <head>
        <title>Install tool login</title>
        <f:render partial="Action/Common/Headers" arguments="{_all}" />
-       <link rel="stylesheet" type="text/css" href="../Resources/Public/Css/install.css?{time}" />
+       <link rel="stylesheet" type="text/css" href="{f:uri.resource(path: 'Css/install.css')}?{time}" />
 </head>
 <body class="{context}">
        <f:if condition="{contextService.backendContext}">
index 45e4885..a40684c 100644 (file)
 <?php
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-/**
- * Entry point to the install tool and step installer.
- *
- * There are two main controllers: "step" and "tool".
- * The step controller is always called first, and redirects to the tool controller
- * if the basic core functionality is given (instance configuration exists, database
- * connection works, ...)
- * The tool controller is the main "install tool" with all the main functionality.
- *
- * The step controller handles the basic installation.
- * During first installation it creates the basic file and folder structure, the
- * configuration files, the database connection and a basic configuration. Those steps
- * are cycled through and if some step returns TRUE on "needsExecution", an input
- * form of this step is rendered.
- * After initial installation, the step installer is still called if the install
- * tool is accessed, so it will automatically come up if some basic configuration fails.
- * If everything is ok, the step installer will redirect to the main install tool.
- * The step installer also has some "silent" update scripts, for example it migrates
- * a localconf.php to LocalConfiguration if needed.
- *
- * This ensures as soon as the tool controller is called, the basic configuration is ok.
- *
- * Whenever the bootstrap or other core elements figure the installation
- * needs an update that is handled within the step controller, it should just
- * redirect to the entry script and let the step controller do necessary work.
- *
- * The step installer initiates browser redirects if steps were executed. This simplifies
- * internal logic by separating the different bootstrap states needed during installation
- * from each other.
- *
- * There is also a backend module controller, that basically only shows a screen
- * with the "enable install tool" button and then redirects to the entry script. Other
- * than that, it does not interfere with step or tool controller and just sets a
- * context GET parameter to indicate that the install tool is called within backend context.
- *
- * To coordinate different tasks within step and install controller and actions, several
- * GET or POST parameters are used, all prefixed with "install".
- * Parameters allowed as GET and POST are preserved during redirects, POST parameters are
- * thrown away between redirects (HTTP status code 303).
- *
- * The following main GET and POST parameters are used:
- * - GET/POST "install[context]" Preserved
- *   Either empty, 'standalone' or 'backend', fallback to 'standalone'. Set to 'backend'
- *   if install tool is called form the backend main module (BackendModuleController). This
- *   changes the view a bit and shows the doc header in the install tool, changes background
- *   color and such.
- *
- * - GET/POST "install[controller]" Preserved
- *   Either empty, 'step' or 'tool', fallback to 'step'. This coordinates whether the step
- *   or tool controller is called. This parameter is never set externally, so the step
- *   controller is always called first. It itself sets the type to 'tool' and redirects to
- *   the tool controller if needed.
- *   This means you could (but shouldn't) directly call the tool controller, but it
- *   will still require a login and session, then.
- *
- * - GET/POST "install[action]" Preserved
- *   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
- *   step should be executed.
- *
- * - POST "install[values]"
- *   Data values for a specific "install[set]" action
- *
- * - POST "install[token]"
- *   A session and instance specific token created from the instance specific
- *   encryptionKey (taken care of in an early point in the step controller). This hash
- *   is used as form protection against CSRF for all POST data. Both the step and tool
- *   controller will logout a user if the token check fails. The only exception to this
- *   handling is the very first installation step where no session and no encryption key
- *   can exist yet.
- */
 
 // Exit early if php requirement is not satisfied.
 if (version_compare(PHP_VERSION, '7.0.0', '<')) {
     die('This version of TYPO3 CMS requires PHP 7.0 or above');
 }
 
+// This is a stub file for redirecting the user to the proper Install Tool URL
+
 call_user_func(function () {
-    $classLoader = require __DIR__ . '/../../../../vendor/autoload.php';
-    (new \TYPO3\CMS\Install\Http\Application($classLoader))->run();
+
+    // We leverage the class loader here to get the static functionality of GeneralUtility and HttpUtility.
+    // This way we do not need to copy all the code here to cope with correct location header URL generation correctly
+    // as those two classes can already correctly deal with all known edge cases.
+
+    require __DIR__ . '/../../../../vendor/autoload.php';
+
+    // We ensure that possible notices from Core code do not kill our redirect due to PHP output
+    error_reporting(E_ALL & ~(E_STRICT | E_NOTICE | E_DEPRECATED));
+
+    // @deprecated in 9.x will be removed in 10.0
+    \TYPO3\CMS\Core\Utility\HttpUtility::redirect('../../../install.php', \TYPO3\CMS\Core\Utility\HttpUtility::HTTP_STATUS_307);
 });