From b8de7cf87ac01a85d3100b6e232b013fa148521b Mon Sep 17 00:00:00 2001
From: Simon Praetorius <simon@praetorius.me>
Date: Sat, 9 Sep 2017 10:54:32 +0200
Subject: [PATCH] [BUGFIX] Use correct values in settings InstallTool

Currently, the InstallTool will use the global TYPO3_CONF_VARS for the
settings form. In backend context, this contains merged TypoScript,
which shouldn't be added to LocalConfiguration.php.

Resolves: #82399
Releases: master
Change-Id: I0aabbde5c8fb8574fe30422fa687849271a3d618
Reviewed-on: https://review.typo3.org/54049
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
---
 .../Configuration/ConfigurationManager.php     | 12 ++++++++++++
 .../DefaultConfigurationDescription.yaml       |  2 ++
 .../Service/LocalConfigurationValueService.php | 18 +++++++++++++++---
 .../LocalConfiguration/SubSection.html         |  8 ++++++++
 4 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/typo3/sysext/core/Classes/Configuration/ConfigurationManager.php b/typo3/sysext/core/Classes/Configuration/ConfigurationManager.php
index d35541b8d305..e25c010d50c3 100644
--- a/typo3/sysext/core/Classes/Configuration/ConfigurationManager.php
+++ b/typo3/sysext/core/Classes/Configuration/ConfigurationManager.php
@@ -135,6 +135,18 @@ class ConfigurationManager
         return PATH_site . $this->localConfigurationFile;
     }
 
+    /**
+     * Returns local configuration array merged with default configuration
+     *
+     * @return array
+     */
+    public function getMergedLocalConfiguration(): array
+    {
+        $localConfiguration = $this->getDefaultConfiguration();
+        ArrayUtility::mergeRecursiveWithOverrule($localConfiguration, $this->getLocalConfiguration());
+        return $localConfiguration;
+    }
+
     /**
      * Get the file location of the additional configuration file,
      * currently the path and filename.
diff --git a/typo3/sysext/core/Configuration/DefaultConfigurationDescription.yaml b/typo3/sysext/core/Configuration/DefaultConfigurationDescription.yaml
index b4660baf2977..d16006d818ab 100644
--- a/typo3/sysext/core/Configuration/DefaultConfigurationDescription.yaml
+++ b/typo3/sysext/core/Configuration/DefaultConfigurationDescription.yaml
@@ -399,9 +399,11 @@ FE:
         defaultTypoScript_constants:
             type: multiline
             description: 'Enter lines of default TypoScript, constants-field.'
+            compareValuesWithCurrentConfiguration: false
         defaultTypoScript_setup:
             type: multiline
             description: 'Enter lines of default TypoScript, setup-field.'
+            compareValuesWithCurrentConfiguration: false
         additionalAbsRefPrefixDirectories:
             type: text
             description: 'Enter additional directories to be prepended with absRefPrefix. Directories must be comma-separated. TYPO3 already prepends the following directories: typo3/, typo3temp/, typo3conf/ext/ and all local storages'
diff --git a/typo3/sysext/install/Classes/Service/LocalConfigurationValueService.php b/typo3/sysext/install/Classes/Service/LocalConfigurationValueService.php
index 6a8602c03d3b..83904f5ef00b 100644
--- a/typo3/sysext/install/Classes/Service/LocalConfigurationValueService.php
+++ b/typo3/sysext/install/Classes/Service/LocalConfigurationValueService.php
@@ -37,12 +37,19 @@ class LocalConfigurationValueService
      */
     public function getCurrentConfigurationData(): array
     {
+        $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
+        $localConfiguration = $configurationManager->getMergedLocalConfiguration();
+
         $data = [];
         $commentArray = $this->getDefaultConfigArrayComments();
 
-        foreach ($GLOBALS['TYPO3_CONF_VARS'] as $sectionName => $section) {
+        foreach ($localConfiguration as $sectionName => $section) {
             if (isset($commentArray[$sectionName])) {
-                $data[$sectionName] = $this->recursiveConfigurationFetching($section, $commentArray[$sectionName]);
+                $data[$sectionName] = $this->recursiveConfigurationFetching(
+                    $section,
+                    isset($GLOBALS['TYPO3_CONF_VARS'][$sectionName]) ? $GLOBALS['TYPO3_CONF_VARS'][$sectionName] : null,
+                    $commentArray[$sectionName]
+                );
             }
         }
 
@@ -56,11 +63,12 @@ class LocalConfigurationValueService
      * to check entries recursively.
      *
      * @param array $sections
+     * @param array|null $sectionsFromCurrentConfiguration
      * @param array $descriptions
      * @param array $path
      * @return array
      */
-    protected function recursiveConfigurationFetching(array $sections, array $descriptions, array $path = []): array
+    protected function recursiveConfigurationFetching(array $sections, array $sectionsFromCurrentConfiguration, array $descriptions, array $path = []): array
     {
         $data = [];
 
@@ -85,6 +93,10 @@ class LocalConfigurationValueService
                 $itemData['fieldType'] = $descriptionInfo['type'];
                 $itemData['description'] = $descriptionInfo['description'];
                 $itemData['allowedValues'] = $descriptionInfo['allowedValues'];
+                $itemData['differentValueInCurrentConfiguration'] = (!isset($descriptionInfo['compareValuesWithCurrentConfiguration']) ||
+                    $descriptionInfo['compareValuesWithCurrentConfiguration']) &&
+                    isset($sectionsFromCurrentConfiguration[$key]) &&
+                    $value !== $sectionsFromCurrentConfiguration[$key];
                 switch ($descriptionType) {
                     case 'multiline':
                         $itemData['type'] = 'textarea';
diff --git a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/LocalConfiguration/SubSection.html b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/LocalConfiguration/SubSection.html
index 79f2685dc8dd..b71942b9761d 100644
--- a/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/LocalConfiguration/SubSection.html
+++ b/typo3/sysext/install/Resources/Private/Partials/Action/Tool/Settings/LocalConfiguration/SubSection.html
@@ -34,6 +34,14 @@
 					</f:if>
 				</div>
 				<div class="item-body">
+					<f:if condition="{item.differentValueInCurrentConfiguration}">
+						<div class="t3js-infobox callout callout-sm callout-warning">
+							<div class="callout-body">
+								Note that <code>$GLOBALS['TYPO3_CONF_VARS']</code> currently contains a different value.
+								This could mean that the value is overwritten in AdditionalConfiguration.php.
+							</div>
+						</div>
+					</f:if>
 					<f:if condition="{f:count(subject: item.allowedValues)} || {item.dataType} == 'dropdown'">
 						<f:then>
 							<div class="form-group">
-- 
GitLab