TYPO3 CMS  TYPO3_8-7
ConfigurationManager.php
Go to the documentation of this file.
1 <?php
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
20 
37 {
41  protected $defaultConfigurationFile = 'typo3/sysext/core/Configuration/DefaultConfiguration.php';
42 
46  protected $defaultConfigurationDescriptionFile = 'typo3/sysext/core/Configuration/DefaultConfigurationDescription.php';
47 
51  protected $localConfigurationFile = 'typo3conf/LocalConfiguration.php';
52 
56  protected $additionalConfigurationFile = 'typo3conf/AdditionalConfiguration.php';
57 
61  protected $factoryConfigurationFile = 'typo3/sysext/core/Configuration/FactoryConfiguration.php';
62 
66  protected $additionalFactoryConfigurationFile = 'typo3conf/AdditionalFactoryConfiguration.php';
67 
75  'EXT/extConf',
76  'EXTCONF',
77  'DB',
78  'SYS/caching/cacheConfigurations',
79  'SYS/session',
80  ];
81 
87  public function getDefaultConfiguration()
88  {
89  return require $this->getDefaultConfigurationFileLocation();
90  }
91 
100  {
101  return PATH_site . $this->defaultConfigurationFile;
102  }
103 
112  {
114  }
115 
121  public function getLocalConfiguration()
122  {
123  return require $this->getLocalConfigurationFileLocation();
124  }
125 
134  {
135  return PATH_site . $this->localConfigurationFile;
136  }
137 
146  {
147  return PATH_site . $this->additionalConfigurationFile;
148  }
149 
156  {
157  return PATH_site . $this->factoryConfigurationFile;
158  }
159 
166  {
168  }
169 
175  public function updateLocalConfiguration(array $configurationToMerge)
176  {
177  $newLocalConfiguration = $this->getLocalConfiguration();
178  ArrayUtility::mergeRecursiveWithOverrule($newLocalConfiguration, $configurationToMerge);
179  $this->writeLocalConfiguration($newLocalConfiguration);
180  }
181 
188  public function getDefaultConfigurationValueByPath($path)
189  {
191  }
192 
199  public function getLocalConfigurationValueByPath($path)
200  {
201  return ArrayUtility::getValueByPath($this->getLocalConfiguration(), $path);
202  }
203 
211  public function getConfigurationValueByPath($path)
212  {
213  $defaultConfiguration = $this->getDefaultConfiguration();
214  ArrayUtility::mergeRecursiveWithOverrule($defaultConfiguration, $this->getLocalConfiguration());
215  return ArrayUtility::getValueByPath($defaultConfiguration, $path);
216  }
217 
225  public function setLocalConfigurationValueByPath($path, $value)
226  {
227  $result = false;
228  if ($this->isValidLocalConfigurationPath($path)) {
229  $localConfiguration = $this->getLocalConfiguration();
230  $localConfiguration = ArrayUtility::setValueByPath($localConfiguration, $path, $value);
231  $result = $this->writeLocalConfiguration($localConfiguration);
232  }
233  return $result;
234  }
235 
242  public function setLocalConfigurationValuesByPathValuePairs(array $pairs)
243  {
244  $localConfiguration = $this->getLocalConfiguration();
245  foreach ($pairs as $path => $value) {
246  if ($this->isValidLocalConfigurationPath($path)) {
247  $localConfiguration = ArrayUtility::setValueByPath($localConfiguration, $path, $value);
248  }
249  }
250  return $this->writeLocalConfiguration($localConfiguration);
251  }
252 
259  public function removeLocalConfigurationKeysByPath(array $keys)
260  {
261  $result = false;
262  $localConfiguration = $this->getLocalConfiguration();
263  foreach ($keys as $path) {
264  // Remove key if path is within LocalConfiguration
265  if (ArrayUtility::isValidPath($localConfiguration, $path)) {
266  $result = true;
267  $localConfiguration = ArrayUtility::removeByPath($localConfiguration, $path);
268  }
269  }
270  if ($result) {
271  $this->writeLocalConfiguration($localConfiguration);
272  }
273  return $result;
274  }
275 
282  public function canWriteConfiguration()
283  {
284  $fileLocation = $this->getLocalConfigurationFileLocation();
285  return @is_writable(file_exists($fileLocation) ? $fileLocation : PATH_site . 'typo3conf/');
286  }
287 
294  public function exportConfiguration()
295  {
296  if (@is_file($this->getLocalConfigurationFileLocation())) {
297  $localConfiguration = $this->getLocalConfiguration();
298  if (is_array($localConfiguration)) {
299  $defaultConfiguration = $this->getDefaultConfiguration();
300  ArrayUtility::mergeRecursiveWithOverrule($defaultConfiguration, $localConfiguration);
301  $GLOBALS['TYPO3_CONF_VARS'] = $defaultConfiguration;
302  } else {
303  throw new \UnexpectedValueException('LocalConfiguration invalid.', 1349272276);
304  }
305  if (@is_file($this->getAdditionalConfigurationFileLocation())) {
307  }
308  } else {
309  // No LocalConfiguration (yet), load DefaultConfiguration only
310  $GLOBALS['TYPO3_CONF_VARS'] = $this->getDefaultConfiguration();
311  }
312  }
313 
322  public function writeLocalConfiguration(array $configuration)
323  {
325  if (!$this->canWriteConfiguration()) {
326  throw new \RuntimeException(
327  $localConfigurationFile . ' is not writable.',
328  1346323822
329  );
330  }
331  $configuration = ArrayUtility::sortByKeyRecursive($configuration);
332  $result = GeneralUtility::writeFile(
334  '<?php' . LF .
335  'return ' .
336  ArrayUtility::arrayExport($configuration) .
337  ';' . LF,
338  true
339  );
340 
341  GeneralUtility::makeInstance(OpcodeCacheService::class)->clearAllActive($localConfigurationFile);
342 
343  return $result;
344  }
345 
354  public function writeAdditionalConfiguration(array $additionalConfigurationLines)
355  {
357  PATH_site . $this->additionalConfigurationFile,
358  '<?php' . LF .
359  implode(LF, $additionalConfigurationLines) . LF
360  );
361  }
362 
372  {
373  if (file_exists($this->getLocalConfigurationFileLocation())) {
374  throw new \RuntimeException(
375  'LocalConfiguration.php exists already',
376  1364836026
377  );
378  }
379  $localConfigurationArray = require $this->getFactoryConfigurationFileLocation();
380  $additionalFactoryConfigurationFileLocation = $this->getAdditionalFactoryConfigurationFileLocation();
381  if (file_exists($additionalFactoryConfigurationFileLocation)) {
382  $additionalFactoryConfigurationArray = require $additionalFactoryConfigurationFileLocation;
384  $localConfigurationArray,
385  $additionalFactoryConfigurationArray
386  );
387  }
388  $this->writeLocalConfiguration($localConfigurationArray);
389  }
390 
397  protected function isValidLocalConfigurationPath($path)
398  {
399  // Early return for white listed paths
400  foreach ($this->whiteListedLocalConfigurationPaths as $whiteListedPath) {
401  if (GeneralUtility::isFirstPartOfStr($path, $whiteListedPath)) {
402  return true;
403  }
404  }
405  return ArrayUtility::isValidPath($this->getDefaultConfiguration(), $path);
406  }
407 }
static setValueByPath(array $array, $path, $value, $delimiter='/')
static getValueByPath(array $array, $path, $delimiter='/')
static isFirstPartOfStr($str, $partStr)
static makeInstance($className,... $constructorArguments)
static arrayExport(array $array=[], $level=0)
static removeByPath(array $array, $path, $delimiter='/')
static sortByKeyRecursive(array $array)
static isValidPath(array $array, $path, $delimiter='/')
static mergeRecursiveWithOverrule(array &$original, array $overrule, $addKeys=true, $includeEmptyValues=true, $enableUnsetFeature=true)
if(TYPO3_MODE==='BE') $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tsfebeuserauth.php']['frontendEditingController']['default']
writeAdditionalConfiguration(array $additionalConfigurationLines)
static writeFile($file, $content, $changePermissions=false)