[!!!][TASK] New local configuration handling
authorHelge Funk <helge.funk@e-netconsulting.com>
Mon, 2 Jul 2012 16:25:32 +0000 (18:25 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Fri, 20 Jul 2012 07:24:12 +0000 (09:24 +0200)
This patch removes the file typo3conf/localconf.php and introduces
a new file called typo3conf/LocalConfiguration.php instead. The file
returns the local overrides of the TYPO3_CONF_VARS default array,
which is merged with the default array during bootstrap.

An upgrade wizard transfers the settings from localconf to the new
file. As an effect, the LocalConfiguration file is now fully under
core control. There must be no additional custom code in it. If an
instance needs such code, it can be added to a second file called
typo3conf/AdditionalConfiguration.php, which is executed as is
during bootstrap after LocalConfiguration was read.

This enables us to store the local configuration as an array,
exports the file with a clear schema.

Furthermore, the list of loaded extensions (extList) is now stored
as an array (extListArray). The old comma separated extList string is
still kept for now, but core usage is adapted to use extListArray. The
old extList string is still written and maintained, but is only kept
for extensions for backwards compatibility.

Important notes:
- Frontend, backend, cli and install tool must still come up, even
  if the upgrade wizard was not run, yet.
- The variables '$typo3_db_*' that where in localconf.php are now
  merged with the TYPO3_CONF_VARS. The upgrade wizard should find
  and transfer them.
- The settings in install tool -> Basic Configuration are currently
  broken. This would have made the patch even bigger, and must be
  fixed with an additional patch.
- It is advised to run the update wizard as soon as possible after
  this patch is merged, it will be the first wizard in the line.
- Some follow ups for dbal and probably workspaces are still needed.
- Currently the 1-2-3 install wizards are broken. The dummy and
  other packages need some love to adapt to the new handling.

If some of the above problems are not solved until 6.0
stabilizes, this patch needs to be reverted again.

Change-Id: I3bf6a176117f501946123b921b6d2f1932627270
Resolves: #38562
Release: 6.0
Reviewed-on: http://review.typo3.org/12519
Reviewed-by: Helmut Hummel
Tested-by: Helmut Hummel
Reviewed-by: Christian Kuhn
Tested-by: Christian Kuhn
32 files changed:
NEWS.txt
t3lib/class.t3lib_autoloader.php
t3lib/class.t3lib_configuration.php [new file with mode: 0644]
t3lib/class.t3lib_extmgm.php
t3lib/core_autoload.php
t3lib/stddb/DefaultConfiguration.php [new file with mode: 0644]
t3lib/stddb/DefaultSettings.php [deleted file]
t3lib/utility/class.t3lib_utility_array.php
tests/Unit/t3lib/class.t3lib_ConfigurationTest.php [new file with mode: 0644]
tests/Unit/t3lib/class.t3lib_autoloaderTest.php
tests/Unit/t3lib/class.t3lib_extmgmTest.php
tests/Unit/t3lib/utility/class.t3lib_utility_arrayTest.php
tests/Unit/typo3/Classes/Bootstrap/BaseSetupTest.php
typo3/classes/Bootstrap.php
typo3/classes/Bootstrap/BaseSetup.php
typo3/cli_dispatch.phpsh
typo3/init.php
typo3/install/index.php
typo3/sysext/cms/tslib/index_ts.php
typo3/sysext/em/classes/extensions/class.tx_em_extensions_list.php
typo3/sysext/em/classes/index.php
typo3/sysext/em/classes/install/class.tx_em_install.php
typo3/sysext/install/Classes/Updates/Base.php
typo3/sysext/install/Resources/Private/Templates/SetupGeneral.html
typo3/sysext/install/ext_localconf.php
typo3/sysext/install/mod/class.tx_install.php
typo3/sysext/install/updates/class.tx_coreupdates_charsetdefaults.php
typo3/sysext/install/updates/class.tx_coreupdates_compatversion.php
typo3/sysext/install/updates/class.tx_coreupdates_localconfiguration.php [new file with mode: 0644]
typo3/sysext/install/updates/class.tx_coreupdates_statictemplates.php
typo3/sysext/install/updates/class.tx_coreupdates_t3skin.php
typo3/sysext/saltedpasswords/classes/class.tx_saltedpasswords_autoloader.php

index 9ea8b25..5411b7f 100644 (file)
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -22,6 +22,28 @@ symlink, make sure that this file is also a symlink to the cores index.php,
 otherwise the frontend will be broken. If index.php is a copy of the source
 file, make sure to install a fresh version from 6.0 sources.
 
+* New handling of typo3conf/localconf.php
+
+The localconf.php file is deprecated and not used in the core any longer. As
+substitution the new file typo3conf/LocalConfiguration.php is introduced that
+basically only returns the local configuration as array. The install tool and
+other installation changing core code like the extension manager now writes
+the whole file if configuration is changed. As a result, no more local
+code is allowed in this file.
+To overload the local configuration with special instance specific code that
+might still be needed, it is possible to add the php code to the optional
+additional file typo3conf/AdditionalConfiguration.php that is executed during
+bootstrap of TYPO3 after LocalConfiguration.php.
+An ugrade wizard takes care of moving the old localconf.php file to the new scheme.
+
+* List of loaded extensions stored as array
+
+The list of loaded extensions in typo3conf/LocalConfiguration (key EXT/extList)
+was transferred to an array for better readability and maintenance. It is
+available with the new key EXT/extListArray. The old, comma separated value is
+still kept, but not used in the core anymore. It will be removed with a later
+version from the core.
+
 * Moved default TYPO3_CONF_VARS
 
 The default TYPO3_CONF_VARS definitions where moved from t3lib/config_default.php
index 1e911ab..2e1d258 100644 (file)
@@ -294,10 +294,9 @@ class t3lib_autoloader {
         */
        protected static function createCoreAndExtensionRegistry() {
                $classRegistry = require(PATH_t3lib . 'core_autoload.php');
-                       // At this point localconf.php was already initialized
-                       // we have a current extList and extMgm is also known
-               $loadedExtensions = array_unique(t3lib_div::trimExplode(',', t3lib_extMgm::getEnabledExtensionList(), TRUE));
-               foreach ($loadedExtensions as $extensionKey) {
+                       // At this point during bootstrap the local configuration is initialized,
+                       // extMgm is ready to get the list of enabled extensions
+               foreach (t3lib_extMgm::getLoadedExtensionListArray() as $extensionKey) {
                        $extensionAutoloadFile = t3lib_extMgm::extPath($extensionKey, 'ext_autoload.php');
                        if (file_exists($extensionAutoloadFile)) {
                                $classRegistry = array_merge($classRegistry, require($extensionAutoloadFile));
diff --git a/t3lib/class.t3lib_configuration.php b/t3lib/class.t3lib_configuration.php
new file mode 100644 (file)
index 0000000..ed3f22f
--- /dev/null
@@ -0,0 +1,222 @@
+<?php
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2012 Helge Funk <helge.funk@e-net.info>
+ *  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!
+ ***************************************************************/
+
+/**
+ * Handle loading and writing of global and local (instance specific)
+ * configuration.
+ *
+ * This class handles the access to the files
+ * - t3lib/stddb/DefaultConfiguration.php (default TYPO3_CONF_VARS)
+ * - typo3conf/LocalConfiguration.php (overrides of TYPO3_CONF_VARS)
+ * - typo3conf/AdditionalConfiguration.php (optional additional local code blocks)
+ * - typo3conf/localconf.php (legacy configuration file)
+ *
+ * @package TYPO3
+ * @subpackage t3lib
+ * @author Helge Funk <helge.funk@e-net.info>
+ */
+class t3lib_Configuration {
+
+       /**
+        * Path to default TYPO3_CONF_VARS file, relative to PATH_site
+        */
+       const DEFAULT_CONFIGURATION_FILE = 't3lib/stddb/DefaultConfiguration.php';
+
+       /**
+        * Path to local overload TYPO3_CONF_VARS file, relative to PATH_site
+        */
+       const LOCAL_CONFIGURATION_FILE = 'typo3conf/LocalConfiguration.php';
+
+       /**
+        * Path to additional local file, relative to PATH_site
+        */
+       const ADDITIONAL_CONFIGURATION_FILE = 'typo3conf/AdditionalConfiguration.php';
+
+       /**
+        * Path to legacy localconf.php file, relative to PATH_site
+        */
+       const LOCALCONF_FILE = 'typo3conf/localconf.php';
+
+       /**
+        * Writing to these configuration pathes is always allowed,
+        * even if the requested sub path does not exist yet.
+        *
+        * @var array
+        */
+       protected static $whiteListedLocalConfigurationPaths = array(
+               'EXT/extConf',
+               'INSTALL/wizardDone'
+       );
+
+       /**
+        * Return default configuration array t3lib/stddb/DefaultConfiguration.php
+        *
+        * @return array
+        */
+       public static function getDefaultConfiguration() {
+               return require(PATH_site . static::DEFAULT_CONFIGURATION_FILE);
+       }
+
+       /**
+        * Return local configuration array typo3conf/LocalConfiguration.php
+        *
+        * @return array Content array of local configuration file
+        */
+       public static function getLocalConfiguration() {
+               return require(PATH_site . static::LOCAL_CONFIGURATION_FILE);
+       }
+
+       /**
+        * Override local configuration with new values.
+        *
+        * @param array $configurationToMerge Override configuration array
+        * @return void
+        */
+       public static function updateLocalConfiguration(array $configurationToMerge) {
+               $newLocalConfiguration = t3lib_div::array_merge_recursive_overrule(
+                       static::getLocalConfiguration(),
+                       $configurationToMerge
+               );
+               static::writeLocalConfiguration($newLocalConfiguration);
+       }
+
+       /**
+        * Get a value at given path from default configuration
+        *
+        * @param string $path Path to search for
+        * @return mixed Value at path
+        */
+       public static function getDefaultConfigurationValueByPath($path) {
+               return t3lib_utility_Array::getValueByPath(
+                       static::getDefaultConfiguration(),
+                       $path
+               );
+       }
+
+       /**
+        * Get a value at given path from local configuration
+        *
+        * @param string $path Path to search for
+        * @return mixed Value at path
+        */
+       public static function getLocalConfigurationValueByPath($path) {
+               return t3lib_utility_Array::getValueByPath(
+                       static::getLocalConfiguration(),
+                       $path
+               );
+       }
+
+       /**
+        * Get a value from configuration, this is default configuration
+        * merged with local configuration
+        *
+        * @param string $path Path to search for
+        * @return mixed
+        */
+       public static function getConfigurationValueByPath($path) {
+               return t3lib_utility_Array::getValueByPath(
+                       t3lib_div::array_merge_recursive_overrule(
+                               static::getDefaultConfiguration(),
+                               static::getLocalConfiguration()
+                       ),
+                       $path
+               );
+       }
+
+       /**
+        * Update a given path in local configuration to a new value.
+        *
+        * @param string $path Path to update
+        * @param mixed $value Value to set
+        * @return boolean TRUE on success
+        */
+       public static function setLocalConfigurationValueByPath($path, $value) {
+               $result = FALSE;
+               if (static::isValidLocalConfigurationPath($path)) {
+                       $localConfiguration = static::getLocalConfiguration();
+                       $localConfiguration = t3lib_utility_Array::setValueByPath(
+                               $localConfiguration,
+                               $path,
+                               $value
+                       );
+                       $result = static::writeLocalConfiguration($localConfiguration);
+               }
+               return $result;
+       }
+
+       /**
+        * Update / set a list of path and value pairs in local configuration file
+        *
+        * @param array $pairs Key is path, value is value to set
+        * @return boolean TRUE on success
+        */
+       public static function setLocalConfigurationValuesByPathValuePairs(array $pairs) {
+               $localConfiguration = static::getLocalConfiguration();
+               foreach ($pairs as $path => $value) {
+                       if (static::isValidLocalConfigurationPath($path)) {
+                               $localConfiguration = t3lib_utility_Array::setValueByPath(
+                                       $localConfiguration,
+                                       $path,
+                                       $value
+                               );
+                       }
+               }
+               return static::writeLocalConfiguration($localConfiguration);
+       }
+
+       /**
+        * Write local configuration array to typo3conf/LocalConfiguration.php
+        *
+        * @param array $configuration The local configuration to be written
+        * @return boolean TRUE on success
+        */
+       protected static function writeLocalConfiguration(array $configuration) {
+               $configuration = t3lib_utility_Array::sortByKeyRecursive($configuration);
+               $result = t3lib_div::writeFile(
+                       PATH_site . static::LOCAL_CONFIGURATION_FILE,
+                       '<?php' . LF . 'return ' . t3lib_utility_Array::arrayExport($configuration) . ';' . LF . '?>'
+               );
+               return ($result === FALSE) ? FALSE : TRUE;
+       }
+
+       /**
+        * Check if access / write to given path in local configuration is allowed.
+        *
+        * @param string $path Path to search for
+        * @return boolean TRUE if access is allowed
+        */
+       protected static function isValidLocalConfigurationPath($path) {
+                       // Early return for white listed paths
+               foreach (static::$whiteListedLocalConfigurationPaths as $whiteListedPath) {
+                       if (t3lib_div::isFirstPartOfStr($path, $whiteListedPath)) {
+                               return TRUE;
+                       }
+               }
+               return t3lib_utility_Array::isValidPath(
+                       static::getDefaultConfiguration(),
+                       $path
+               );
+       }
+}
+?>
\ No newline at end of file
index 47bfba9..5b866a5 100644 (file)
@@ -63,15 +63,17 @@ class t3lib_extMgm {
         * @param string $key Extension key to test
         * @param boolean $exitOnError If $exitOnError is TRUE and the extension is not loaded the function will die with an error message
         * @return boolean
+        * @throws BadFunctionCallException
         */
-       public static function isLoaded($key, $exitOnError = 0) {
-               if ($exitOnError && !isset($GLOBALS['TYPO3_LOADED_EXT'][$key])) {
+       public static function isLoaded($key, $exitOnError = FALSE) {
+               $isLoaded = in_array($key, static::getLoadedExtensionListArray());
+               if ($exitOnError && !$isLoaded) {
                        throw new BadFunctionCallException(
-                               'TYPO3 Fatal Error: Extension "' . $key . '" was not loaded!',
+                               'TYPO3 Fatal Error: Extension "' . $key . '" is not loaded!',
                                1270853910
                        );
                }
-               return isset($GLOBALS['TYPO3_LOADED_EXT'][$key]);
+               return $isLoaded;
        }
 
        /**
@@ -88,19 +90,18 @@ class t3lib_extMgm {
                if (isset($GLOBALS['TYPO3_LOADED_EXT'])) {
                        if (!isset($GLOBALS['TYPO3_LOADED_EXT'][$key])) {
                                throw new BadFunctionCallException(
-                                       'TYPO3 Fatal Error: Extension key "' . $key . '" was NOT loaded!',
+                                       'TYPO3 Fatal Error: Extension key "' . $key . '" is NOT loaded!',
                                        1270853878
                                );
                        }
 
                        $extensionPath = PATH_site . $GLOBALS['TYPO3_LOADED_EXT'][$key]['siteRelPath'];
                } else {
-                       $extensionList = self::getRequiredExtensionList() . ',' . $GLOBALS['TYPO3_CONF_VARS']['EXT']['extList'];
-                       $loadedExtensions = array_flip(array_unique(t3lib_div::trimExplode(',', $extensionList, TRUE)));
+                       $loadedExtensions = array_flip(static::getLoadedExtensionListArray());
 
                        if (!isset($loadedExtensions[$key])) {
                                throw new BadFunctionCallException(
-                                       'TYPO3 Fatal Error: Extension key "' . $key . '" was NOT loaded!',
+                                       'TYPO3 Fatal Error: Extension key "' . $key . '" is NOT loaded!',
                                        1294430950
                                );
                        }
@@ -113,7 +114,7 @@ class t3lib_extMgm {
                                $extensionPath = PATH_typo3 . 'sysext/' . $key . '/';
                        } else {
                                throw new BadFunctionCallException(
-                                       'TYPO3 Fatal Error: Extension "' . $key . '" was NOT found!',
+                                       'TYPO3 Fatal Error: Extension "' . $key . '" NOT found!',
                                        1294430951
                                );
                        }
@@ -133,7 +134,7 @@ class t3lib_extMgm {
        public static function extRelPath($key) {
                if (!isset($GLOBALS['TYPO3_LOADED_EXT'][$key])) {
                        throw new BadFunctionCallException(
-                               'TYPO3 Fatal Error: Extension key "' . $key . '" was NOT loaded!',
+                               'TYPO3 Fatal Error: Extension key "' . $key . '" is NOT loaded!',
                                1270853879
                        );
                }
@@ -208,7 +209,7 @@ class t3lib_extMgm {
                if (!is_string($key) || empty($key)) {
                        throw new InvalidArgumentException('Extension key must be a non-empty string.', 1294586096);
                }
-               if (!self::isLoaded($key)) {
+               if (!static::isLoaded($key)) {
                        return '';
                }
                $runtimeCache = $GLOBALS['typo3CacheManager']->getCache('cache_runtime');
@@ -1535,7 +1536,7 @@ tt_content.' . $key . $prefix . ' {
         * @param boolean $allowCaching If FALSE, the array will not be read / created from cache
         * @return array Result array that will be set as $GLOBALS['TYPO3_LOADED_EXT']
         * @access private
-        * @createTypo3LoadedExtensionInformationArray
+        * @see createTypo3LoadedExtensionInformationArray
         */
        public static function loadTypo3LoadedExtensionInformation($allowCaching = TRUE) {
                if ($allowCaching) {
@@ -1575,7 +1576,7 @@ tt_content.' . $key . $prefix . ' {
         * @return array Result array that will be set as $GLOBALS['TYPO3_LOADED_EXT']
         */
        protected static function createTypo3LoadedExtensionInformationArray() {
-               $loadedExtensions = array_unique(t3lib_div::trimExplode(',', self::getEnabledExtensionList(), 1));
+               $loadedExtensions = static::getLoadedExtensionListArray();
                $loadedExtensionInformation = array();
 
                $extensionFilesToCheckFor = array(
@@ -1865,7 +1866,7 @@ tt_content.' . $key . $prefix . ' {
        }
 
        /**
-        * Loading extensions configured in $GLOBALS['TYPO3_CONF_VARS']['EXT']['extList']
+        * Loading extensions configured in $GLOBALS['TYPO3_CONF_VARS']['EXT']['extListArray']
         *
         * Usages of this function can be seen in bootstrap
         * Extensions are always detected in the order local - global - system.
@@ -1907,13 +1908,23 @@ tt_content.' . $key . $prefix . ' {
        }
 
        /**
-        * Returns TRUE if the "localconf.php" file in "typo3conf/" is writable
+        * Returns TRUE if configuration files in typo3conf/ are writable
         *
-        * @return boolean
+        * @return boolean TRUE if at least one configuration file in typo3conf/ is writable
         * @internal
         */
        public static function isLocalconfWritable() {
-               return @is_writable(PATH_typo3conf) && @is_writable(PATH_typo3conf . 'localconf.php');
+               $result = TRUE;
+               if (!@is_writable(PATH_typo3conf)) {
+                       $result = FALSE;
+               }
+               if (
+                       !@is_writable(PATH_site . t3lib_Configuration::LOCALCONF_FILE)
+                       && !@is_writable(PATH_site . t3lib_Configuration::LOCAL_CONFIGURATION_FILE)
+               ) {
+                       $result = FALSE;
+               }
+               return $result;
        }
 
        /**
@@ -1987,7 +1998,7 @@ tt_content.' . $key . $prefix . ' {
         *
         * @param boolean $usePlainValue Whether to use the value as it is without modifications
         * @return integer
-        * @deprecated since 6.0, will be removed in two versions
+        * @deprecated since 6.0, will be removed two versions later
         */
        public static function getExtensionCacheBehaviour($usePlainValue = FALSE) {
                t3lib_div::logDeprecatedFunction();
@@ -1998,6 +2009,7 @@ tt_content.' . $key . $prefix . ' {
         * Gets the prefix used for the ext_tables.php and ext_localconf.php cached files.
         *
         * @return string
+        * @deprecated since 6.0, will be removed two versions later
         */
        public static function getCacheFilePrefix() {
                t3lib_div::logDeprecatedFunction();
@@ -2007,47 +2019,159 @@ tt_content.' . $key . $prefix . ' {
         * Gets the list of enabled extensions
         *
         * @return string
+        * @deprecated since 6.0, will be removed two versions later
         */
        public static function getEnabledExtensionList() {
-               $extensionList = self::getRequiredExtensionList() . ',' . $GLOBALS['TYPO3_CONF_VARS']['EXT']['extList'];
-               $ignoredExtensionList = self::getIgnoredExtensionList();
-
-                       // Remove the extensions to be ignored:
-               if ($ignoredExtensionList && (defined('TYPO3_enterInstallScript') && TYPO3_enterInstallScript) === FALSE) {
-                       $extensions = array_diff(
-                               explode(',', $extensionList),
-                               explode(',', $ignoredExtensionList)
-                       );
-                       $extensionList = implode(',', $extensions);
-               }
-
-               return $extensionList;
+               t3lib_div::logDeprecatedFunction();
+               return implode(',', self::getLoadedExtensionListArray());
        }
 
        /**
         * Gets the list of required extensions.
         *
         * @return string
+        * @deprecated since 6.0, will be removed two versions later
         */
        public static function getRequiredExtensionList() {
-               $requiredExtensionList = t3lib_div::uniqueList(
-                       REQUIRED_EXTENSIONS . ',' . $GLOBALS['TYPO3_CONF_VARS']['EXT']['requiredExt']
-               );
-
-               return $requiredExtensionList;
+               t3lib_div::logDeprecatedFunction();
+               return implode(',', self::getRequiredExtensionListArray());
        }
 
        /**
-        * Gets the list of extensions to be ignored (not to be loaded).
+        * Get list of extensions to be ignored (not to be loaded).
         *
         * @return string
+        * @deprecated since 6.0, will be removed two versions later
         */
        public static function getIgnoredExtensionList() {
-               $ignoredExtensionList = t3lib_div::uniqueList(
-                       $GLOBALS['TYPO3_CONF_VARS']['EXT']['ignoredExt']
+               t3lib_div::logDeprecatedFunction();
+               return '';
+       }
+
+       /**
+        * Gets an array of loaded extension keys
+        *
+        * @return array Loaded extensions
+        */
+       public static function getLoadedExtensionListArray() {
+                       // Extensions in extListArray
+               if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXT']['extListArray'])) {
+                       $loadedExtensions = $GLOBALS['TYPO3_CONF_VARS']['EXT']['extListArray'];
+               } else {
+                               // Fallback handling if extlist is still a string and not an array
+                       $loadedExtensions = t3lib_div::trimExplode(
+                               ',',
+                               $GLOBALS['TYPO3_CONF_VARS']['EXT']['extList']
+                       );
+               }
+
+                       // Add required extensions
+               $loadedExtensions = array_merge(
+                       static::getRequiredExtensionListArray(),
+                       $loadedExtensions
                );
+               $loadedExtensions = array_unique($loadedExtensions);
+
+               return $loadedExtensions;
+       }
 
-               return $ignoredExtensionList;
+       /**
+        * Gets list of required extensions.
+        * This is the list of extensions from constant REQUIRED_EXTENSIONS defined
+        * in bootstrap, together with a possible additional list of extensions from
+        * local configuration
+        *
+        * @return array List of required extensions
+        */
+       public static function getRequiredExtensionListArray() {
+               if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXT']['requiredExt'])) {
+                       $requiredExtensions = $GLOBALS['TYPO3_CONF_VARS']['EXT']['requiredExt'];
+               } else {
+                       $requiredExtensions = t3lib_div::trimExplode(
+                               ',',
+                               $GLOBALS['TYPO3_CONF_VARS']['EXT']['requiredExt']
+                       );
+               }
+
+               $requiredExtensions = array_merge(
+                       t3lib_div::trimExplode(',', REQUIRED_EXTENSIONS),
+                       $requiredExtensions
+               );
+               $requiredExtensions = array_unique($requiredExtensions);
+
+               return $requiredExtensions;
+       }
+
+       /**
+        * Loads given extension
+        *
+        * Warning: This method only works if the ugrade wizard to transform
+        * localconf.php to LocalConfiguration.php was already run
+        *
+        * @param string $extensionKey Extension key to load
+        * @return void
+        * @throws RuntimeException
+        */
+       public static function loadExtension($extensionKey) {
+               if (static::isLoaded($extensionKey)) {
+                       throw new RuntimeException(
+                               'Extension already loaded',
+                               1342345486
+                       );
+               }
+               $extList = t3lib_Configuration::getLocalConfigurationValueByPath('EXT/extListArray');
+               $extList[] = $extensionKey;
+               static::writeNewExtensionList($extList);
+       }
+
+       /**
+        * Unloads given extension
+        *
+        * Warning: This method only works if the ugrade wizard to transform
+        * localconf.php to LocalConfiguration.php was already run
+        *
+        * @param string $extensionKey Extension key to remove
+        * @return void
+        * @throws RuntimeException
+        */
+       public static function unloadExtension($extensionKey) {
+               if (!static::isLoaded($extensionKey)) {
+                       throw new RuntimeException(
+                               'Extension not loaded',
+                               1342345487
+                       );
+               }
+               if (in_array($extensionKey, static::getRequiredExtensionListArray())) {
+                       throw new RuntimeException(
+                               'Can not unload required extension',
+                               1342348167
+                       );
+               }
+               $extList = t3lib_Configuration::getLocalConfigurationValueByPath('EXT/extListArray');
+               $extList = array_diff(
+                       $extList,
+                       array($extensionKey)
+               );
+               static::writeNewExtensionList($extList);
+       }
+
+       /**
+        * Writes extension list and clear cache files.
+        *
+        * @TODO: This method should be protected, but with current em it is hard to do so,
+        * so it is public for now, but will be made protected as soon as the em is fixed.
+        *
+        * @param array Extension array to load, loader order is kept
+        * @return void
+        * @internal
+        */
+       public static function writeNewExtensionList(array $newExtensionList) {
+               $extensionList = array_unique($newExtensionList);
+               t3lib_Configuration::setLocalConfigurationValueByPath('EXT/extListArray', $extensionList);
+                       // @deprecated: extList as string is deprecated, the handling will be removed with 6.2
+                       // For now, this value is still set for better backwards compatibility
+               t3lib_Configuration::setLocalConfigurationValueByPath('EXT/extList', implode(',', $extensionList));
+               static::removeCacheFiles();
        }
 
        /**
index 25407df..6dcab4f 100644 (file)
@@ -57,6 +57,7 @@ $t3libClasses = array(
        't3lib_collection_sortable' => PATH_t3lib . 'collection/interfaces/interface.t3lib_collection_sortable.php',
        't3lib_collection_staticrecordcollection' => PATH_t3lib . 'collection/StaticRecordCollection.php',
        't3lib_compressor' => PATH_t3lib . 'class.t3lib_compressor.php',
+       't3lib_configuration' => PATH_t3lib . 'class.t3lib_configuration.php',
        't3lib_contextmenu_abstractcontextmenu' => PATH_t3lib . 'contextmenu/class.t3lib_contextmenu_abstractcontextmenu.php',
        't3lib_contextmenu_abstractdataprovider' => PATH_t3lib . 'contextmenu/class.t3lib_contextmenu_abstractdataprovider.php',
        't3lib_contextmenu_action' => PATH_t3lib . 'contextmenu/class.t3lib_contextmenu_action.php',
diff --git a/t3lib/stddb/DefaultConfiguration.php b/t3lib/stddb/DefaultConfiguration.php
new file mode 100644 (file)
index 0000000..41e0e35
--- /dev/null
@@ -0,0 +1,716 @@
+<?php
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2012 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!
+ ***************************************************************/
+
+/**
+ * This file contains the default array definition that is
+ * later populated as $GLOBALS['TYPO3_CONF_VARS']
+ *
+ * @author Christian Kuhn <lolli@schwarzbu.ch>
+ * @package TYPO3
+ * @subpackage core
+ */
+
+return array(
+       'GFX' => array(         // Configuration of the image processing features in TYPO3. 'IM' and 'GD' are short for ImageMagick and GD library respectively.
+               'image_processing' => TRUE,                             // Boolean: Enables image processing features. Disabling this means NO image processing with either GD or IM!
+               'thumbnails' => TRUE,                                   // Boolean: Enables the use of thumbnails in the backend interface. Thumbnails are generated by IM/partly GD in the file typo3/thumbs.php
+               'thumbnails_png' => 0,                                  // Bits. Bit0: If set, thumbnails from non-jpegs will be 'png', otherwise 'gif' (0=gif/1=png). Bit1: Even JPG's will be converted to png or gif (2=gif/3=png)
+               'gif_compress' => TRUE,                                 // Boolean: Enables the use of the t3lib_div::gif_compress() workaround function for compressing giffiles made with GD or IM, which probably use only RLE or no compression at all.
+               'imagefile_ext' => 'gif,jpg,jpeg,tif,tiff,bmp,pcx,tga,png,pdf,ai',      // Commalist of file extensions perceived as images by TYPO3. List should be set to 'gif,png,jpeg,jpg' if IM is not available. Lowercase and no spaces between!
+
+               'gdlib' => TRUE,                                                // Boolean: Enables the use of GD.
+               'gdlib_png' => FALSE,                                   // Boolean: Enables the use of GD, with PNG only. This means that all items normally generated as gif-files will be png-files instead!
+
+               'im' => TRUE,                                                   // Boolean: Enables the use of IM.
+               'im_path' => '/usr/bin/',                       // Path to the IM tools 'convert', 'combine', 'identify'.
+               'im_path_lzw' => '/usr/bin/',                   // Path to the IM tool 'convert' with LZW enabled! See 'gif_compress'. If your version 4.2.9 of ImageMagick is compiled with LZW you may leave this field blank AND disable the flag 'gif_compress'! Tip: You can call LZW 'convert' with a prefix like 'myver_convert' by setting this path with it, eg. '/usr/bin/myver_' instead of just '/usr/bin/'.
+
+               'im_version_5' => 'im6',                                // String: Set this either to "im6" or "gm" (uses GraphicsMagick instead of ImageMagick). Setting this value will automatically configure some settings for use with the specified program version.
+               'im_negate_mask' => FALSE,                              // Boolean: Indicates if the mask images should be inverted first. This depends of the ImageMagick version. Below ver. 5.1 this should be FALSE. Above ImageMagick version 5.2+ it should be TRUE. Just set the flag if the masks works opposite the intension!
+               'im_imvMaskState' => FALSE,                             // Boolean: If set, the 'im_negate_mask' state is inverted. This is very useful with newer versions of IM5 (at least 5.4.3+) where the 'im_version_5' setting will set 'im_negate_mask' which will eventually be wrong... Halleluja for ImageMagick - have I ever regreted using that package...
+               'im_no_effects' => FALSE,                               // Boolean: This is necessary if using ImageMagick 5+. Effects in Imagemagick 5+ tends to render very slowly! Therefore this must be disabled in order not to perform sharpen, blurring and such. (However lately IM5 is allowed for effects again, but syntax has changed!)
+               'im_v5effects' => 0,                                    // <p>Integer (-1, 0, 1)</p><dl><dt>0</dt><dd>disabled</dd><dt>-1</dt><dd>Do not sharpen images by default</dd><dt>1</dt><dd>All; blur and sharpening is allowed in ImageMagick again and the 'im_no_effects' flag is cancelled.</dd></dl><p>Blurring and sharpening has new syntaxes though. See class.t3lib_stdgraphic.php for details.</p>
+               'im_mask_temp_ext_gif' => FALSE,                // Boolean: This should be set if ImageMagick is version 5+. This is used in class.tslib_content.php for masking images and the extension png is normally used because it's faster than gif for temporary files. But png seems not to work with some IM 5+ versions, so...
+               'im_mask_temp_ext_noloss' => 'miff',    // String: Loss-less ImageMagick extension to use for mask processing in temporary filenames. Normally 'miff' (ImageMagick's OWN format) will do fine. However at least IM 5.4.9 has proved not to be able to write to its own file format which forced me to add this option. You can try and set this to tif/png/jpg if some masking doesn't work the way it should.
+               'im_noScaleUp' => FALSE,                                // Boolean: If set, images are not being scaled up if told so (in t3lib/stdgraphics.php)
+               'im_combine_filename' => 'combine',             // String: Latest ImageMagick versions has changed the name of combine to composite. Configure here if needed.
+               'im_noFramePrepended' => FALSE,                 // Boolean: If set, the [x] frame indicator is NOT prepended to filenames in stdgraphic. Some IM5+ version didn't work at all with the typical [0]-prefix, which allow multipage pdf's and animated gif's to be scaled only for the first frame/page and that seriously cuts down rendering time. Set this flag only if your ImageMagick version cannot find the files. Notice that changing this flag causes temporary filenames to change, thus the server will begin scaling images again which were previously cached.
+               'im_stripProfileCommand' => '+profile \'*\'', // String: Specify the command to strip the profile information, which can reduce thumbnail size up to 60KB. Command can differ in IM/GM, IM also know the -strip command. See <a href="http://www.imagemagick.org/Usage/thumbnails/#profiles" target="_blank">imagemagick.org</a> for details
+               'im_useStripProfileByDefault' => TRUE,  // Boolean: If set, the im_stripProfileCommand is used with all IM Image operations by default. See tsRef for setting this parameter explocit for IMAGE generation.
+               'jpg_quality' => 70,                                    // Integer: Default JPEG generation quality
+               'enable_typo3temp_db_tracking' => FALSE,        // Boolean: If set, then all files in typo3temp will be logged in a database table. In addition to being a log of the files with original filenames, it also serves to secure that the same image is not rendered simultaneously by two different processes.
+               'TTFdpi' => 96,                                                 // Integer: Enter how many dpi the FreeType module uses. Freetype1 should be set to 72. Freetype2 should be set to 96 (otherwise fonts are rendered way bigger than FreeType1). This works as a global scaling factor for Freetype.
+               'png_truecolor' => TRUE,                                // Boolean: If set PNGs will get created as truecolor PNGs. If you use GDlib2 you can create truecolor images if they look not well currently. Note that this results in an increased image size. JPEGs get always created in truecolor now (GDlib2 required)
+       ),
+       'SYS' => array(                 // System related concerning both frontend and backend.
+               'lang' => array(
+                       'cache' => array(
+                               'lifetime' => 86400,
+                               'clear_menu' => FALSE,
+                       ),
+                       'format' => array(
+                               'priority' => 'xlf,xml,php'
+                       ),
+                       'parser' => array(
+                               'php' => 't3lib_l10n_parser_Llphp',
+                               'xml' => 't3lib_l10n_parser_Llxml',
+                               'xlf' => 't3lib_l10n_parser_Xliff',
+                       ),
+               ),
+               'sitename' => 'TYPO3',                                  // Name of the base-site. This title shows up in the root of the tree structure if you're an 'admin' backend user.
+               'compat_version' => '3.8',                              // Compatibility version. TYPO3 behavior will try to be compatible with the output from the TYPO3 version set here. It is recommended to change this setting with the Upgrade Wizard.
+               'encryptionKey' => '',                                  // This is a "salt" used for various kinds of encryption, CRC checksums and validations. You can enter any rubbish string here but try to keep it secret. You should notice that a change to this value might invalidate temporary information, URLs etc. At least, clear all cache if you change this so any such information can be rebuild with the new key.
+               'cookieDomain' => '',                                   // Restricts the domain name for FE and BE session cookies. When setting the value to ".domain.com" (replace domain.com with your domain!), login sessions will be shared across subdomains. Alternatively, if you have more than one domain with sub-domains, you can set the value to a regular expression to match against the domain of the HTTP request. The result of the match is used as the domain for the cookie. eg. /\.(example1|example2)\.com$/ or /\.(example1\.com)|(example2\.net)$/. Separate domains for FE and BE can be set using <a href="#FE-cookieDomain">$TYPO3_CONF_VARS['FE']['cookieDomain']</a> and <a href="#BE-cookieDomain">$TYPO3_CONF_VARS['BE']['cookieDomain']</a> respectively.
+               'cookieSecure' => 0,                                    // <p>Integer (0, 1, 2): Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client.</p><dl><dt>0</dt><dd>always send cookie</dd><dt>1 (force HTTPS)</dt><dd>the cookie will only be set if a secure (HTTPS) connection exists - use this in combination with lockSSL since otherwise the application will fail and throw an exception</dd><dt>2</dt><dd>the cookie will be set in each case, but uses the secure flag if a secure (HTTPS) connection exists.</dd></dl>
+               'cookieHttpOnly' => FALSE,                              // Boolean: When enabled the cookie will be made accessible only through the HTTP protocol. This means that the cookie won't be accessible by scripting languages, such as JavaScript. This setting can effectively help to reduce identity theft through XSS attacks (although it is not supported by all browsers).
+               'doNotCheckReferer' => FALSE,                   // Boolean: If set, it's NOT checked numerous places that the refering host is the same as the current. This is an option you should set if you have problems with proxies not passing the HTTP_REFERER variable.
+               'recursiveDomainSearch' => FALSE,               // Boolean: If set, the search for domain records will be done recursively by stripping parts of the host name off until a matching domain record is found.
+               'devIPmask' => '127.0.0.1,::1',                 // Defines a list of IP addresses which will allow development-output to display. The debug() function will use this as a filter. See the function t3lib_div::cmpIP() for details on syntax. Setting this to blank value will deny all. Setting to "*" will allow all.
+               'sqlDebug' => 0,                                                // <p>Integer (0, 1, 2). Allows displaying executed SQL queries in the browser (for debugging purposes and development)</p><dl><dt>0</dt><dd>no SQL shown (default)</dd><dt>1</dt><dd>show only failed queries</dd><dt>2</dt><dd>show all queries</dd></dl>
+               'enable_DLOG' => FALSE,                                 // Boolean: Whether the developer log is enabled. See constant "TYPO3_DLOG"
+               'ddmmyy' => 'd-m-y',                                    // Format of Date-Month-Year - see PHP-function <a href="http://php.net/date" target="_blank">date()</a>
+               'hhmm' => 'H:i',                                                // Format of Hours-Minutes - see PHP-function <a href="http://php.net/date" target="_blank">date()</a>
+               'USdateFormat' => FALSE,                                // Boolean: If TRUE, dates entered in the TCEforms of the backend will be formatted mm-dd-yyyy
+               'loginCopyrightWarrantyProvider' => '', // String: If you provide warranty for TYPO3 to your customers insert you (company) name here. It will appear in the login-dialog as the warranty provider. (You must also set URL below).
+               'loginCopyrightWarrantyURL' => '',              // String: Add the URL where you explain the extend of the warranty you provide. This URL is displayed in the login dialog as the place where people can learn more about the conditions of your warranty. Must be set (more than 10 chars) in addition with the 'loginCopyrightWarrantyProvider' message.
+               'loginCopyrightShowVersion' => FALSE,   // Boolean: If set, the current TYPO3 version is shown.
+               'curlUse' => FALSE,                                             // Boolean: If set, try to use cURL to fetch external URLs
+               /** @deprecated Deprecated since 4.6 - will be removed in 4.8. */
+               'curlProxyServer' => '',                                // String: Proxyserver as http://proxy:port/. Deprecated since 4.6 - will be removed in 4.8. See below for http options.
+               /** @deprecated Deprecated since 4.6 - will be removed in 4.8. */
+               'curlProxyTunnel' => FALSE,                             // Boolean: If set, use a tunneled connection through the proxy (usefull for websense etc.). Deprecated since 4.6 - will be removed in 4.8. See below for http options.
+               /** @deprecated Deprecated since 4.6 - will be removed in 4.8. */
+               'curlProxyUserPass' => '',                              // String: Proxyserver authentication user:pass. Deprecated since 4.6 - will be removed in 4.8. See below for http options.
+               /** @deprecated Deprecated since 4.6 - will be removed in 4.8. */
+               'curlTimeout' => 0,                                             // Integer: Timeout value for cURL requests in seconds. 0 means to wait indefinitely. Deprecated since 4.6 - will be removed in 4.8. See below for http options.
+               'form_enctype' => 'multipart/form-data',        // String: This is the default form encoding type for most forms in TYPO3. It allows for file uploads to be in the form. However if file-upload is disabled for your PHP version even ordinary data sent with this encryption will not get to the server. So if you have file_upload disabled, you will have to change this to eg. 'application/x-www-form-urlencoded'
+               'textfile_ext' => 'txt,html,htm,css,tmpl,js,sql,xml,csv,' . PHP_EXTENSIONS_DEFAULT,     // Text file extensions. Those that can be edited. Executable PHP files may not be editable in webspace if disallowed!
+               'contentTable' => '',                                   // This is the page-content table (Normally 'tt_content')
+               'T3instID' => 'N/A',                                    // A unique installation ID - not used yet. The idea is that a TYPO3 installation can identify itself by this ID string to the Extension Repository on TYPO3.org so that we can keep a realistic count of serious TYPO3 installations.
+               'binPath' => '',                                                // String: List of absolute paths where external programs should be searched for. Eg. <code>/usr/local/webbin/,/home/xyz/bin/</code>. (ImageMagick path have to be configured separately)
+               'binSetup' => '',                                               // String (textarea): List of programs (separated by newline or comma). By default programs will be searched in default paths and the special paths defined by 'binPath'. When PHP has openbasedir enabled the programs can not be found and have to be configured here. Example: <code>perl=/usr/bin/perl,unzip=/usr/local/bin/unzip</code>
+               't3lib_cs_convMethod' => '',                    // String (values: "iconv", "recode", "mbstring", default is homemade PHP-code). Defines which of these PHP-features to use for various charset conversion functions in t3lib_cs. Will speed up charset conversion radically.
+               't3lib_cs_utils' => '',                                 // String (values: "iconv", "mbstring", default is homemade PHP-code). Defines which of these PHP-features to use for various charset processing functions in t3lib_cs. Will speed up charset functions radically.
+               'no_pconnect' => TRUE,                                  // Boolean: If TRUE, "connect" is used to connect to the database. If FALSE, a persistent connection using "pconnect" will be established!
+               'dbClientCompress' => FALSE,                    // Boolean: if TRUE, data exchange between TYPO3 and database server will be compressed. This may improve performance if (1) database serever is on the different server and (2) network connection speed to database server is 100mbps or less. CPU usage will be higher if this option is used but database operations will be executed faster due to much less (up to 3 times) database network traffic. This option has no effect if MySQL server is localhost.
+               'setMemoryLimit' => 0,                                  // Integer: memory_limit in MB: If more than 16, TYPO3 will try to use ini_set() to set the memory limit of PHP to the value. This works only if the function ini_set() is not disabled by your sysadmin.
+               'serverTimeZone' => 1,                                  // Integer: GMT offset of servers time (from time()). Default is "1" which is "GMT+1" (central european time). This value can be used in extensions that are GMT aware and wants to convert times to/from other timezones.
+               'phpTimeZone' => '',                                    // String: timezone to force for all date() and mktime() functions. A list of supported values can be found at <a href="http://php.net/manual/en/timezones.php" target="_blank">php.net</a>. If this is not set, a valid fallback will be searched for by PHP (php.ini's <a href="http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone" target="_blank">date.timezone</a> setting, server defaults, etc); and if no fallback is found, the value of "UTC" is used instead.
+               'systemLog' => '',                                              // <p>String: semi-colon separated list. Defines one or more logging methods. Possible methods:</p><dl><dt>file,&lt;abs-path-to-file&gt;[,&lt;level&gt;]</dt><dd>logs to a file</dd><dt>mail,&lt;to&gt;[/&lt;from&gt;][,&lt;level&gt;]</dt><dd>sends the log entries via mail</dd><dt>syslog,&lt;facility&gt;,[,&lt;level&gt;]</dt><dd>uses the operating system's log. Facility may be one of LOCAL0..LOCAL7, USER (on Windows USER is the only valid type).</dd><dt>error_log[,,&lt;level&gt;]</dt><dd>uses the PHP error log</dd></dl><p>The &lt;level&gt; is the individual logging level (see <a href="#SYS-systemLogLevel">[SYS][systemLogLevel]</a>).</p>
+               'systemLogLevel' => 0,                                  // <p>Integer (0, 1, 2, 3, 4): Only messages with same or higher severity are logged.</p><ul><li>0: info</li><li>1: notice</li><li>2: warning</li><li>3: error</li><li>4: fatal error</li></ul>
+               'enableDeprecationLog' => 'file',               // Commalist: Enables the logging of deprecated methods and functions. Default is 'file'. The following options are allowed: <dl><dt>file</dt><dd>The log file will be written to typo3conf/deprecation_[hash-value].log</dd><dt>devlog</dt><dd>The log will be written to the development log</dd><dt>console<dt><dd>The log will be displayed in the Backend's Debug Console. The logging options can be combined by comma-separating them.</dd></dl>
+               'maxFileNameLength' => 60,                              // Integer: This is the maximum file name length. The value will be taken into account by basic file operations like renaming or creation of files and folders.
+               'UTF8filesystem' => FALSE,                              // Boolean: If TRUE then TYPO3 uses utf-8 to store file names. This allows for accented Latin letters as well as any other non-latin characters like Cyrillic and Chinese.
+               'systemLocale' => '',                                   // String: locale used for certain system related functions, e.g. escaping shell commands. If problems with filenames containing special characters occur, the value of this option is probably wrong. See <a href="http://php.net/manual/en/function.setlocale.php" target="_blank">setlocale()</a>.
+               'lockingMode' => 'simple',                                      // String: Define which locking mode is used to control requests to pages being generated. Can be one of either "disable" (no locking), "simple" (checks for file existance), "flock" (using PHPs <a href="http://php.net/flock" target="_blank">flock()</a> function), "semaphore" (using PHPs <a href="http://php.net/sem-acquire" target="_blank">sem_acquire()</a> function). Default is "disable".
+               'reverseProxyIP' => '',                                 // String: list of IP addresses. If TYPO3 is behind one or more (intransparent) reverese proxies the IP addresses must be added here.
+               'reverseProxyHeaderMultiValue' => 'none',               // String: "none","first","last": defines which values of a proxy header (eg HTTP_X_FORWARDED_FOR) to use, if more than one is found. "none" discards the value, "first" and "last" use the first/last of the values in the list.
+               'reverseProxyPrefix' => '',                             // String: optional prefix to be added to the internal URL (SCRIPT_NAME and REQUEST_URI).
+               'reverseProxySSL' => '',                                // String: '*' or list of IP addresses of proxies that use SSL (https) for the connection to the client, but an unencrypted connection (http) to the server. If '*' all proxies defined in <a href="#SYS-reverseProxyIP">[SYS][reverseProxyIP]</a> use SSL.
+               'reverseProxyPrefixSSL' => '',                          // String: prefix to be added to the internal URL (SCRIPT_NAME and REQUEST_URI) when accessing the server via an SSL proxy. This setting overrides <a href="#SYS-reverseProxyPrefix">[SYS][reverseProxyPrefix]</a>.
+               'caching' => array(
+                       'cacheConfigurations' => array(
+                               'cache_hash' => array(
+                                       'frontend' => 't3lib_cache_frontend_VariableFrontend',
+                                       'backend' => 't3lib_cache_backend_DbBackend',
+                                       'options' => array(),
+                               ),
+                               'cache_pages' => array(
+                                       'frontend' => 't3lib_cache_frontend_VariableFrontend',
+                                       'backend' => 't3lib_cache_backend_DbBackend',
+                                       'options' => array(
+                                               'compression' => TRUE
+                                       ),
+                               ),
+                               'cache_pagesection' => array(
+                                       'frontend' => 't3lib_cache_frontend_VariableFrontend',
+                                       'backend' => 't3lib_cache_backend_DbBackend',
+                                       'options' => array(
+                                               'compression' => TRUE
+                                       ),
+                               ),
+                               'cache_phpcode' => array(
+                                       'frontend' => 't3lib_cache_frontend_PhpFrontend',
+                                       'backend' => 't3lib_cache_backend_FileBackend',
+                                       'options' => array(),
+                               ),
+                               'cache_runtime' => array(
+                                       'frontend' => 't3lib_cache_frontend_VariableFrontend',
+                                       'backend' => 't3lib_cache_backend_TransientMemoryBackend',
+                                       'options' => array(),
+                               ),
+                       ),
+               ),
+               'additionalAllowedClassPrefixes' => NULL,       // Class names in TYPO3 must usually start with tx_, Tx, user_ or User_. This setting allows to register additional prefixes in a comma separated list.
+               'displayErrors' => -1,                                  // <p>Integer (-1, 0, 1, 2). Configures whether PHP errors should be displayed.</p><dl><dt>0</dt><dd>Do not display any PHP error messages. Overrides the value of "exceptionalErrors" and sets it to 0 (= no errors are turned into exceptions), the configured "productionExceptionHandler" is used as exception handler</dd><dt>1</dt><dd>Display error messages with the registered errorhandler. The configured "debugExceptionHandler" is used as exception handler</dd><dt>2</dt><dd>Display errors only if client matches <a href="#SYS-devIPmask">[SYS][devIPmask]</a>. If devIPmask matches the users IP address  the configured "debugExceptionHandler" is used  for exceptions, if not "productionExceptionHandler" will be used</dd><dt>-1</dt><dd>Default setting. With this option, you can override the PHP setting "display_errors". If devIPmask matches the users IP address  the configured "debugExceptionHandler" is used  for exceptions, if not "productionExceptionHandler" will be used.</dd></dl>
+               'productionExceptionHandler'  => 't3lib_error_ProductionExceptionHandler',      // String: Classname to handle exceptions that might happen in the TYPO3-code. Leave empty to disable exception handling. Default: "t3lib_error_ProductionExceptionHandler". This exception handler displays a nice error message when something went wrong. The error message is logged to the configured logs. Note: The configured "productionExceptionHandler" is used if displayErrors is set to "0" or to "-1" and devIPmask doesn't match the users IP.
+               'debugExceptionHandler' => 't3lib_error_DebugExceptionHandler',                         // String: Classname to handle exceptions that might happen in the TYPO3-code. Leave empty to disable exception handling. Default: "t3lib_error_DebugExceptionHandler". This exception handler displays the complete stack trace of any encountered exception. The error message and the stack trace  is logged to the configured logs. Note: The configured "debugExceptionHandler" is used if displayErrors is set to "1" and if displayErrors is "-1"  or "2" and the devIPmask matches the users IP.
+               'errorHandler' => 't3lib_error_ErrorHandler',   // String: Classname to handle PHP errors. E.g.: t3lib_error_ErrorHandler. This class displays and logs all errors that are registered as "errorHandlerErrors" (<a href="#SYS-errorHandlerErrors">[SYS][errorHandlerErrors]</a>). Leave empty to disable error handling. Errors can be logged to syslog (see: <a href="#SYS-systemLog">[SYS][systemLog]</a>) to the installed developer log and to the "syslog" table. If an error is registered in "exceptionalErrors" ([SYS][exceptionalErrors]) it will be turned into an exception to be handled by the configured exceptionHandler.
+               'errorHandlerErrors'=> E_ALL & ~(E_STRICT | E_NOTICE),  // Integer: The E_* constant that will be handled by the errorhandler. Default is "E_ALL ^ E_NOTICE".
+               'exceptionalErrors' => E_ALL & ~(E_STRICT | E_NOTICE | E_DEPRECATED | E_WARNING | E_USER_ERROR | E_USER_NOTICE | E_USER_WARNING),       // Integer: The E_* constant that will be handled as an exception by t3lib_error_ErrorHandler. Default is <tt>E_ALL ^ E_NOTICE ^ E_DEPRECATED ^ E_WARNING ^ E_USER_ERROR ^ E_USER_NOTICE ^ E_USER_WARNING</tt> (20725) and "0" if <tt>displayErrors=0</tt> (see <a href="http://php.net/manual/en/errorfunc.constants.php" target="_blank">PHP documentation</a>).
+               'enable_errorDLOG' => 0,                                // Boolean: If set, errors are written to the developer log (requires an installed *devlog* extension).
+               'enable_exceptionDLOG' => 0,                    // Boolean: If set, exceptions are written to the developer log (requires an installed *devlog* extension).
+               'syslogErrorReporting' => E_ALL & ~(E_STRICT | E_NOTICE),       // Integer: Configures which PHP errors should be logged to the configured syslogs (see: [SYS][systemLog]). If set to "0" no PHP errors are logged to the syslog. Default is "E_ALL ^ E_NOTICE" (6135).
+               'belogErrorReporting' => E_ALL & ~(E_STRICT | E_NOTICE),        // Integer: Configures which PHP errors should be logged to the "syslog" table (extension: belog). If set to "0" no PHP errors are logged to the sys_log table. Default is "E_ALL ^ E_NOTICE" (6135).
+               'locallangXMLOverride' => array(),                              // For extension/overriding of the arrays in 'locallang' files in frontend and backend. See 'Inside TYPO3' for more information.
+               'generateApacheHtaccess' => 1,                  // Boolean: TYPO3 can create <em>.htaccess</em> files which are used by Apache Webserver. They are useful for access protection or performance improvements. Currently <em>.htaccess</em> files in the following directories are created, if they do not exist: <ul><li>typo3temp/compressor/</li></ul>You want to disable this feature, if you are not running Apache or want to use own rulesets.
+               'fal' => array(
+                       'registeredDrivers' => array(
+                               'Local' => array(
+                                       'class' => 't3lib_file_Driver_LocalDriver',
+                                       'shortName' => 'Local',
+                                       'flexFormDS' => 'FILE:t3lib/file/Driver/Configuration/LocalDriverFlexForm.xml',
+                                       'label' => 'Local filesystem'
+                               )
+                       ),
+                       'callbackFilterMethods' => array(
+                               array(
+                                       't3lib_file_Utility_FilenameFilters', 'filterHiddenFilesAndFolders'
+                               )
+                       )
+               )
+       ),
+       'EXT' => array (        // Options related to the Extension Management
+               'noEdit' => TRUE,                                               // Boolean: If set, the Extension Manager does NOT allow extension files to be edited! (Otherwise both local and global extensions can be edited.)
+               'allowGlobalInstall' => FALSE,                  // Boolean: If set, global extensions in typo3/ext/ are allowed to be installed, updated and deleted etc.
+               'allowLocalInstall' => TRUE,                    // Boolean: If set, local extensions in typo3conf/ext/ are allowed to be installed, updated and deleted etc.
+               'allowSystemInstall' => FALSE,                  // Boolean: If set, you can install extensions in the sysext/ dir. Use this to upgrade the 'cms' and 'lang' extensions.
+               'em_wsdlURL' => 'http://typo3.org/wsdl/tx_ter_wsdl.php',                                // The SOAP URL for uploading extensions to the TER2. Usually doesn't need to be changed.
+               'em_mirrorListURL' => 'http://repositories.typo3.org/mirrors.xml.gz',                           // Allows to preset the URL for fetching the extension repository mirror list from. Used in the Extension Manager.
+               'requiredExt' => array(),               // Array. List of additional extensions which are REQUIRED and cannot be unloaded by the Extension Manager!
+               'excludeForPackaging' => '(CVS|\..*|.*~|.*\.bak)',              // String: List of directories and files which will not be packaged into extensions nor taken into account otherwise by the Extension Manager. Perl regular expression syntax!
+               'extCache' => -1,                                               // Deprecated and unused. Do not set anymore and remove from localconf.php
+               'extList' => 'filelist,version,tsconfig_help,context_help,extra_page_cm_options,impexp,belog,about,cshmanual,aboutmodules,setup,opendocs,install,t3editor,felogin,feedit,recycler', // String (exclude) Deprecated List of extensions which are enabled for this install. Use extListArray instead! Will be dropped with 6.2
+               'extListArray' => array(
+                       'filelist',
+                       'version',
+                       'tsconfig_help',
+                       'context_help',
+                       'extra_page_cm_options',
+                       'impexp',
+                       'belog',
+                       'about',
+                       'cshmanual',
+                       'aboutmodules',
+                       'setup',
+                       'opendocs',
+                       'install',
+                       't3editor',
+                       'felogin',
+                       'feedit',
+                       'recycler',
+               ),// Array (exclude) List of extensions which are enabled for this install. Use the Extension Manager (EM) to manage this!
+               'extConf' => array(                                             // Config-options for extensions, stored as serialized arrays by extension-keys. Handled automatically by the EM.
+//                     '--key--' => array()
+               ),
+       ),
+       'BE' => array(          // Backend Configuration.
+               'lang' => array(
+                       'debug' => FALSE,                                       // Debug LL in the backend
+               ),
+               'unzip_path' => '',                                             // Path to "unzip".
+               'diff_path' => 'diff',                                  // Path to "diff". For Windows this program can be downloaded here: <a href="http://unxutils.sourceforge.net/" target="_blank">unxutils.sourceforge.net</a>
+               'fileadminDir' => 'fileadmin/',                 // Path to the fileadmin dir. This is relative to PATH_site. (Automatically mounted for admin-users if set)
+               'RTEenabled' => TRUE,                                   // Boolean: If set, the Rich Text editor will be an option in the backend. Notice that the editor must be enabled per-user and options are configurable. See admin guide.
+               'RTE_imageStorageDir' => 'uploads/',    // Default storage directory for Rich Text Editor files
+               'RTE_reg' => array(),                                   // Contains arrays of possible RTEs available (keys=extKey, values=cfg-array). Each array contains a key, "objRef", which contains a user function call with prefixed script path and instanciating a persistent global object. This can report back if browser requirements are OK, draw the RTE and do the transformations needed.
+               'staticFileEditPath' => 'fileadmin/static/',    // Path to directory with static files for editing (see table sys_staticfiles_edit). Relative to PATH_site.
+               'lockRootPath' => '',                                   // This path is used to evaluate if paths outside of PATH_site should be allowed. Ending slash required! This path is also used to restrict userHomePath/groupHomePath. Observe that the first part of 'userHomePath' and 'groupHomePath' must be the value of 'lockRootPath'. Eg. '/home/typo3/'.
+               'userHomePath' => '',                                   // Path to the directory where TYPO3 backend-users have their home-dirs.  Eg. '/home/typo3/users/'. A home for backend user 2 would be: '/home/typo3/users/2/'. Ending slash required!
+               'groupHomePath' => '',                                  // Path to the directory where TYPO3 backend-groups have their home-dirs. Remember that the first part of this path must be 'lockRootPath'. Eg. '/home/typo3/groups/'. A home for backend group 1 would be: '/home/typo3/groups/1/'. Ending slash required!
+               'userUploadDir' => '',                                  // Suffix to the user home dir which is what gets mounted in TYPO3. Eg. if the user dir is "../123_user/" and this value is "/upload" then "../123_user/upload" gets mounted.
+               'fileCreateMask' => '0644',                             // File mode mask for Unix file systems (when files are uploaded/created).
+               'folderCreateMask' => '0755',                   // As above, but for folders.
+               'createGroup' => '',                                    // Group for newly created files and folders (Unix only). Group ownership can be changed on Unix file systems (see above). Set this if you want to change the group ownership of created files/folders to a specific group. This makes sense in all cases where the webserver is running with a different user/group as you do. Create a new group on your system and add you and the webserver user to the group. Now you can safely set the last bit in fileCreateMask/folderCreateMask to 0 (e.g. 770). Important: The user who is running your webserver needs to be a member of the group you specify here! Otherwise you might get some error messages.
+               'warning_email_addr' => '',                             // Email address that will receive notification whenever an attempt to login to the Install Tool is made and that will also receive warnings whenever more than 3 failed backend login attempts (regardless of user) are detected within an hour.
+               'warning_mode' => '',                                   // Bit 1: If set, warning_email_addr will be notified every time a backend user logs in. Bit 2: If set, warning_email_addr will be notified every time an ADMIN backend user logs in. Other bits are reserved for future options.
+               'lockIP' => 4,                                                  // Integer (0-4). Session IP locking for backend users. See <a href="#FE-lockIP">[FE][lockIP]</a> for details. Default is 4 (which is locking the FULL IP address to session).
+               'sessionTimeout' => 3600,                               // Integer: seconds. Session time out for backend users. Default is 3600 seconds = 1 hour.
+               'IPmaskList' => '',                                             // String: Lets you define a list of IP-numbers (with *-wildcards) that are the ONLY ones allowed access to ANY backend activity. On error an error header is sent and the script exits. Works like IP masking for users configurable through TSconfig. See syntax for that (or look up syntax for the function t3lib_div::cmpIP())
+               'lockBeUserToDBmounts' => TRUE,                 // Boolean: If set, the backend user is allowed to work only within his page-mount. It's advisable to leave this on because it makes security easy to manage.
+               'lockSSL' => 0,                                                 // <p>Integer (0, 1, 2, 3). If &gt;0, If set (1,2,3), the backend can only be operated from an SSL-encrypted connection (https)</p><dl><dt>0</dt><dd>no locking (default)</dd><dt>1</dt><dd>only allow access via SSL</dd><dt>2</dt><dd>redirect user trying to access non-https admin-urls to SSL URLs instead</dd><dt>3</dt><dd>only the login is forced to SSL, then the user switches back to non-SSL-mode</dd></dl>
+               'lockSSLPort' => 0,                                             // Integer: Use a non-standard HTTPS port for lockSSL. Set this value if you use lockSSL and the HTTPS port of your webserver is not 443.
+               'enabledBeUserIPLock' => TRUE,                  // Boolean: If set, the User/Group TSconfig option 'option.lockToIP' is enabled.
+               'lockHashKeyWords' => 'useragent',              // Keyword list (Strings comma separated). Currently only "useragent"; If set, then the BE user session is locked to the value of HTTP_USER_AGENT. This lowers the risk of session hi-jacking. However in some cases (like during development) you might need to switch the user agent while keeping the session. In this case you can disable that feature (e.g. with a blank string).
+               'cookieDomain' => '',                                   // Same as <a href="#SYS-cookieDomain">$TYPO3_CONF_VARS['SYS']['cookieDomain']</a> but only for BE cookies. If empty, $TYPO3_CONF_VARS['SYS']['cookieDomain'] value will be used.
+               'cookieName' => 'be_typo_user',         // String: Set the name for the cookie used for the back-end user session
+               'loginSecurityLevel' => '',                             // String: Keywords that determines the security level of login to the backend. "normal" means the password from the login form is sent in clear-text, "challenged" means the password is not sent but hashed with some other values, "superchallenged" (default) means the password is first hashed before being hashed with the challenge values again (means the password is stored as a hashed string in the database also), "rsa" uses RSA password encryption (only if the rsaauth extension is installed). DO NOT CHANGE this value manually; without an alternative authentication service it will only prevent logins in TYPO3 since the "superchallenged" method is hardcoded in the default authentication system.
+               'showRefreshLoginPopup' => FALSE,               // Boolean: If set, the Ajax relogin will show a real popup window for relogin after the count down. Some auth services need this as they add custom validation to the login form. If it's not set, the Ajax relogin will show an inline relogin window.
+               'adminOnly' => 0,                                               // <p>Integer (-1, 0, 1, 2)</p><dl><dt>-1</dt><dd>total shutdown for maintenance purposes</dd><dt>0</dt><dd>normal operation, everyone can login (default)</dd><dt>1</dt><dd>only admins can login</dd><dt>2</dt><dd>only admins and regular CLI users can login</dd></dl>
+               'disable_exec_function' => FALSE,               // Boolean: Don't use exec() function (except for ImageMagick which is disabled by <a href="#GFX-im">[GFX][im]</a>=0). If set, all fileoperations are done by the default PHP-functions. This is nescessary under Windows! On Unix the system commands by exec() can be used, unless this is disabled.
+               'usePHPFileFunctions' => TRUE,                  // Boolean: If set, all fileoperations are done by the default PHP-functions. Default on Unix is using the system commands by exec().
+               'compressionLevel' => 0,                                // Determines output compression of BE output. Makes output smaller but slows down the page generation depending on the compression level. Requires a) zlib in your PHP installation and b) special rewrite rules for .css.gzip and .js.gzip (please see _.htacces for an example). Range 1-9, where 1 is least compression and 9 is greatest compression. 'true' as value will set the compression based on the PHP default settings (usually 5). Suggested and most optimal value is 5.
+               'maxFileSize' => '10240',                               // Integer: If set this is the max filesize in KB's for file operations in the backend. Can be overridden through $TCA per table field separately.
+               'installToolPassword' => '',                    // String: This is the md5-hashed password for the Install Tool. Set this to '' and access will be totally denied. PLEASE consider to externally password protect the typo3/install/ folder, eg. with a .htaccess file.
+               'pageTree' => array(
+                       'preloadLimit' => 50,                           // Integer: Count of pages that will be preloaded in pagetree. Big amount makes collapsing new branches faster but requires more SQL queries.
+               ),
+               'defaultUserTSconfig' => 'options.enableBookmarks=1
+                       options.enableShowPalettes=1
+                       options.file_list.enableDisplayBigControlPanel=selectable
+                       options.file_list.enableDisplayThumbnails=selectable
+                       options.file_list.enableClipBoard=selectable
+                       options.pageTree {
+                               doktypesToShowInNewPageDragArea = 1,6,4,7,3,254,255,199
+                       }
+
+                       options.contextMenu.options.leftIcons = 1
+                       options.contextMenu {
+                               table {
+                                       virtual_root {
+                                               disableItems =
+
+                                               items {
+                                                       100 = ITEM
+                                                       100 {
+                                                               name = history
+                                                               label = LLL:EXT:lang/locallang_misc.xml:CM_history
+                                                               spriteIcon = actions-document-history-open
+                                                               displayCondition = canShowHistory != 0
+                                                               callbackAction = openHistoryPopUp
+                                                       }
+                                               }
+                                       }
+
+                                       pages_root {
+                                               disableItems =
+
+                                               items {
+                                                       100 = ITEM
+                                                       100 {
+                                                               name = view
+                                                               label = LLL:EXT:lang/locallang_core.xml:cm.view
+                                                               spriteIcon = actions-document-view
+                                                               displayCondition = canBeViewed != 0
+                                                               callbackAction = viewPage
+                                                       }
+
+                                                       200 = ITEM
+                                                       200 {
+                                                               name = new
+                                                               label = LLL:EXT:lang/locallang_core.xml:cm.new
+                                                               spriteIcon = actions-page-new
+                                                               displayCondition = canCreateNewPages != 0
+                                                               callbackAction = newPageWizard
+                                                       }
+
+                                                       300 = DIVIDER
+
+                                                       400 = ITEM
+                                                       400 {
+                                                               name = history
+                                                               label = LLL:EXT:lang/locallang_misc.xml:CM_history
+                                                               spriteIcon = actions-document-history-open
+                                                               displayCondition = canShowHistory != 0
+                                                               callbackAction = openHistoryPopUp
+                                                       }
+                                               }
+                                       }
+
+                                       pages {
+                                               disableItems =
+
+                                               items {
+                                                       100 = ITEM
+                                                       100 {
+                                                               name = view
+                                                               label = LLL:EXT:lang/locallang_core.xml:cm.view
+                                                               spriteIcon = actions-document-view
+                                                               displayCondition = canBeViewed != 0
+                                                               callbackAction = viewPage
+                                                       }
+
+                                                       200 = DIVIDER
+
+                                                       300 = ITEM
+                                                       300 {
+                                                               name = disable
+                                                               label = LLL:EXT:lang/locallang_common.xml:disable
+                                                               spriteIcon = actions-edit-hide
+                                                               displayCondition = getRecord|hidden = 0 && canBeDisabledAndEnabled != 0
+                                                               callbackAction = disablePage
+                                                       }
+
+                                                       400 = ITEM
+                                                       400 {
+                                                               name = enable
+                                                               label = LLL:EXT:lang/locallang_common.xml:enable
+                                                               spriteIcon = actions-edit-unhide
+                                                               displayCondition = getRecord|hidden = 1 && canBeDisabledAndEnabled != 0
+                                                               callbackAction = enablePage
+                                                       }
+
+                                                       500 = ITEM
+                                                       500 {
+                                                               name = edit
+                                                               label = LLL:EXT:lang/locallang_core.xml:cm.edit
+                                                               spriteIcon = actions-page-open
+                                                               displayCondition = canBeEdited != 0
+                                                               callbackAction = editPageProperties
+                                                       }
+
+                                                       600 = ITEM
+                                                       600 {
+                                                               name = info
+                                                               label = LLL:EXT:lang/locallang_core.xml:cm.info
+                                                               spriteIcon = actions-document-info
+                                                               displayCondition = canShowInfo != 0
+                                                               callbackAction = openInfoPopUp
+                                                       }
+
+                                                       700 = ITEM
+                                                       700 {
+                                                               name = history
+                                                               label = LLL:EXT:lang/locallang_misc.xml:CM_history
+                                                               spriteIcon = actions-document-history-open
+                                                               displayCondition = canShowHistory != 0
+                                                               callbackAction = openHistoryPopUp
+                                                       }
+
+                                                       800 = DIVIDER
+
+                                                       900 = SUBMENU
+                                                       900 {
+                                                               label = LLL:EXT:lang/locallang_core.xml:cm.copyPasteActions
+
+                                                               100 = ITEM
+                                                               100 {
+                                                                       name = new
+                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.new
+                                                                       spriteIcon = actions-page-new
+                                                                       displayCondition = canCreateNewPages != 0
+                                                                       callbackAction = newPageWizard
+                                                               }
+
+                                                               200 = DIVIDER
+
+                                                               300 = ITEM
+                                                               300 {
+                                                                       name = cut
+                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.cut
+                                                                       spriteIcon = actions-edit-cut
+                                                                       displayCondition = isInCutMode = 0 && canBeCut != 0 && isMountPoint != 1
+                                                                       callbackAction = enableCutMode
+                                                               }
+
+                                                               400 = ITEM
+                                                               400 {
+                                                                       name = cut
+                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.cut
+                                                                       spriteIcon = actions-edit-cut-release
+                                                                       displayCondition = isInCutMode = 1 && canBeCut != 0
+                                                                       callbackAction = disableCutMode
+                                                               }
+
+                                                               500 = ITEM
+                                                               500 {
+                                                                       name = copy
+                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.copy
+                                                                       spriteIcon = actions-edit-copy
+                                                                       displayCondition = isInCopyMode = 0 && canBeCopied != 0
+                                                                       callbackAction = enableCopyMode
+                                                               }
+
+                                                               600 = ITEM
+                                                               600 {
+                                                                       name = copy
+                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.copy
+                                                                       spriteIcon = actions-edit-copy-release
+                                                                       displayCondition = isInCopyMode = 1 && canBeCopied != 0
+                                                                       callbackAction = disableCopyMode
+                                                               }
+
+                                                               700 = ITEM
+                                                               700 {
+                                                                       name = pasteInto
+                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.pasteinto
+                                                                       spriteIcon = actions-document-paste-into
+                                                                       displayCondition = getContextInfo|inCopyMode = 1 || getContextInfo|inCutMode = 1 && canBePastedInto != 0
+                                                                       callbackAction = pasteIntoNode
+                                                               }
+
+                                                               800 = ITEM
+                                                               800 {
+                                                                       name = pasteAfter
+                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.pasteafter
+                                                                       spriteIcon = actions-document-paste-after
+                                                                       displayCondition = getContextInfo|inCopyMode = 1 || getContextInfo|inCutMode = 1 && canBePastedAfter != 0
+                                                                       callbackAction = pasteAfterNode
+                                                               }
+
+                                                               900 = DIVIDER
+
+                                                               1000 = ITEM
+                                                               1000 {
+                                                                       name = delete
+                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.delete
+                                                                       spriteIcon = actions-edit-delete
+                                                                       displayCondition = canBeRemoved != 0 && isMountPoint != 1
+                                                                       callbackAction = removeNode
+                                                               }
+                                                       }
+
+                                                       1000 = SUBMENU
+                                                       1000 {
+                                                               label = LLL:EXT:lang/locallang_core.xml:cm.branchActions
+
+                                                               100 = ITEM
+                                                               100 {
+                                                                       name = mountAsTreeroot
+                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.tempMountPoint
+                                                                       spriteIcon = actions-system-extension-documentation
+                                                                       displayCondition = canBeTemporaryMountPoint != 0 && isMountPoint = 0
+                                                                       callbackAction = mountAsTreeRoot
+                                                               }
+
+                                                               200 = DIVIDER
+
+                                                               300 = ITEM
+                                                               300 {
+                                                                       name = expandBranch
+                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.expandBranch
+                                                                       spriteIcon = actions-pagetree-expand
+                                                                       displayCondition =
+                                                                       callbackAction = expandBranch
+                                                               }
+
+                                                               400 = ITEM
+                                                               400 {
+                                                                       name = collapseBranch
+                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.collapseBranch
+                                                                       spriteIcon = actions-pagetree-collapse
+                                                                       displayCondition =
+                                                                       callbackAction = collapseBranch
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               ',      // String (exclude). Enter lines of default backend user/group TSconfig.
+               'defaultPageTSconfig' => 'mod.web_list.enableDisplayBigControlPanel=selectable
+                       mod.web_list.enableClipBoard=selectable
+                       mod.web_list.enableLocalizationView=selectable
+                       mod.wizards.newRecord.pages.show.pageInside=1
+                       mod.wizards.newRecord.pages.show.pageAfter=1
+                       mod.wizards.newRecord.pages.show.pageSelectPosition=1
+               ',      // String (exclude).Enter lines of default Page TSconfig.
+               'defaultPermissions' => array (                 // Default permissions set for new pages in t3lib/tce_main.php. Keys are 'show,edit,delete,new,editcontent'. Enter as comma-list
+//                     'user' => '',                                           // default in tce_main is 'show,edit,delete,new,editcontent'. If this is set (uncomment), this value is used instead.
+//                     'group' => '',                                          // default in tce_main is 'show,edit,new,editcontent'. If this is set (uncomment), this value is used instead.
+//                     'everybody' => ''                                       // default in tce_main is ''. If this is set (uncomment), this value is used instead.
+               ),
+               'defaultUC' => array (                                  // Override default settings for BE-users. See class.t3lib_beuserauth.php, array $uc_default
+               ),
+                       // The control of fileextensions goes in two catagories. Webspace and Ftpspace. Webspace is folders accessible from a webbrowser (below TYPO3_DOCUMENT_ROOT) and ftpspace is everything else.
+                       // The control is done like this: If an extension matches 'allow' then the check returns TRUE. If not and an extension matches 'deny' then the check return FALSE. If no match at all, returns TRUE.
+                       // You list extensions comma-separated. If the value is a '*' every extension is matched
+                       // If no fileextension, TRUE is returned if 'allow' is '*', FALSE if 'deny' is '*' and TRUE if none of these matches
+                       // This configuration below accepts everything in ftpspace and everything in webspace except php3,php4,php5 or php files
+               'fileExtensions' => array (
+                       'webspace' => array('allow'=>'', 'deny'=> PHP_EXTENSIONS_DEFAULT),
+                       'ftpspace' => array('allow'=>'*', 'deny'=>'')   // @todo: remove this option in the future
+               ),
+               'customPermOptions' => array(),                 // Array with sets of custom permission options. Syntax is; 'key' => array('header' => 'header string, language splitted', 'items' => array('key' => array('label, language splitted', 'icon reference', 'Description text, language splitted'))). Keys cannot contain ":|," characters.
+               'fileDenyPattern' => FILE_DENY_PATTERN_DEFAULT ,        // A perl-compatible regular expression (without delimiters!) that - if it matches a filename - will deny the file upload/rename or whatever in the webspace. For security reasons, files with multiple extensions have to be denied on an Apache environment with mod_alias, if the filename contains a valid php handler in an arbitary position. Also, ".htaccess" files have to be denied. Matching is done case-insensitive. Default value is stored in constant FILE_DENY_PATTERN_DEFAULT
+               'interfaces' => 'backend',                                      // This determines which interface options is available in the login prompt and in which order (All options: ",backend,frontend")
+               'loginNews' => array(),                                         // In this array you can define news-items for the login screen. To this array, add arrays with assoc keys 'date', 'header', 'content' (HTML content) and for those appropriate value pairs
+               'loginNewsTitle' => '',                                 // Define alternative header message for the LoginNews. If this var is empty, the default header "Important messages:" is displayed.
+               'notificationPrefix' => '[TYPO3 Note]', // String: Used to prefix the subject of mails sent in the taskcenter
+               'accessListRenderMode' => 'checkbox',   // Can be "singlebox", "checkbox" or blank. Refers to the "renderMode" for the selector boxes in be-groups configuration.
+               'explicitADmode' => 'explicitDeny',     // Sets the general allow/deny mode for selector box values. Value can be either "explicitAllow" or "explicitDeny", nothing else!
+               'TSconfigConditions' => TRUE,                   // Boolean: When set it is possible to have TypoScript like conditions in BE Page/User/Group TS-Config
+               'niceFlexFormXMLtags' => TRUE,                  // If set, the flexform XML will be stored with meaningful tags which can be validated with DTD schema. If you rely on custom reading of the XML from pre-4.0 versions you should set this to FALSE if you don't like to change your reader code (internally it is insignificant since t3lib_div::xml2array() doesn't care for the tags if the index-attribute value is set)
+               'flexFormXMLincludeDiffBase' => TRUE,   // If set, an additional tag with index "vXX.vDEFbase" is created for translations in flexforms holding the value of the default language when translation was changed. Used to show diff of value. This setting will change whether the system thinks flexform XML looks clean. For example when FALSE XX.vDEFbase fields will be removed in cleaning while accepted if TRUE (of course)
+               'compactFlexFormXML' => 0,                              // If set, the flexform XML will not contain indentation spaces making XML more compact
+               'flexformForceCDATA' => 0,                              // Boolean:  If set, will add CDATA to Flexform XML. Some versions of libxml have a bug that causes HTML entities to be stripped from any XML content and this setting will avoid the bug by adding CDATA.
+               'explicitConfirmationOfTranslation' => FALSE,   // If set, then the diff-data of localized records is not saved automatically when updated but requires that a translator clicks the special finish_translation/save/close button that becomes available.
+               'versionNumberInFilename' => FALSE,     // <p>Boolean: If TRUE, included CSS and JS files will have the timestamp embedded in the filename, ie. filename.1269312081.js. This will make browsers and proxies reload the files if they change (thus avoiding caching issues). IMPORTANT: this feature requires extra .htaccess rules to work (please refer to _.htaccess or the _.htaccess file from the dummy package)</p><p>If FALSE the filemtime will be appended as a query-string.</p>
+               'spriteIconGenerator_handler' => '',    // String: Used to register own/other spriteGenerating Handler, they have to implement the interface t3lib_spritemanager_SpriteIconGenerator. If set to "t3lib_spritemanager_SpriteBuildingHandler" icons from extensions will automatically merged into sprites.
+               'debug' => FALSE,                       // Boolean: If set, the loginrefresh is disabled and pageRenderer is set to debug mode. Use this to debug the backend only!
+               'AJAX' => array(                                // array of key-value pairs for a unified use of AJAX calls in the TYPO3 backend. Keys are the unique ajaxIDs where the value will be resolved to call a method in an object. See ajax.php and the classes/class.typo3ajax.php for more information.
+                       'SC_alt_db_navframe::expandCollapse'                => 'typo3/alt_db_navframe.php:SC_alt_db_navframe->ajaxExpandCollapse',
+                       'SC_alt_file_navframe::expandCollapse'              => 'typo3/alt_file_navframe.php:SC_alt_file_navframe->ajaxExpandCollapse',
+                       'TYPO3_tcefile::process'                            => 'typo3/classes/class.typo3_tcefile.php:TYPO3_tcefile->processAjaxRequest',
+                       't3lib_TCEforms_inline::createNewRecord'                    => 't3lib/class.t3lib_tceforms_inline.php:t3lib_TCEforms_inline->processAjaxRequest',
+                       't3lib_TCEforms_inline::getRecordDetails'                   => 't3lib/class.t3lib_tceforms_inline.php:t3lib_TCEforms_inline->processAjaxRequest',
+                       't3lib_TCEforms_inline::synchronizeLocalizeRecords'     => 't3lib/class.t3lib_tceforms_inline.php:t3lib_TCEforms_inline->processAjaxRequest',
+                       't3lib_TCEforms_inline::setExpandedCollapsedState'      => 't3lib/class.t3lib_tceforms_inline.php:t3lib_TCEforms_inline->processAjaxRequest',
+                       't3lib_TCEforms_suggest::searchRecord'              => 't3lib/tceforms/class.t3lib_tceforms_suggest.php:t3lib_TCEforms_suggest->processAjaxRequest',
+                       'ShortcutMenu::getGroups'    => 'typo3/classes/class.shortcutmenu.php:ShortcutMenu->getAjaxShortcutGroups',
+                       'ShortcutMenu::saveShortcut' => 'typo3/classes/class.shortcutmenu.php:ShortcutMenu->setAjaxShortcut',
+                       'ShortcutMenu::render'       => 'typo3/classes/class.shortcutmenu.php:ShortcutMenu->renderAjax',
+                       'ShortcutMenu::delete'       => 'typo3/classes/class.shortcutmenu.php:ShortcutMenu->deleteAjaxShortcut',
+                       'ShortcutMenu::create'       => 'typo3/classes/class.shortcutmenu.php:ShortcutMenu->createAjaxShortcut',
+                       'ModuleMenu::saveMenuState'  => 'typo3/classes/class.modulemenu.php:ModuleMenu->saveMenuState',
+                       'ModuleMenu::getData'        => 'typo3/classes/class.modulemenu.php:ModuleMenu->getModuleData',
+                       'BackendLogin::login'                           => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->login',
+                       'BackendLogin::logout'                          => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->logout',
+                       'BackendLogin::refreshLogin'            => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->refreshLogin',
+                       'BackendLogin::isTimedOut'                      => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->isTimedOut',
+                       'BackendLogin::getChallenge'            => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->getChallenge',
+                       'BackendLogin::refreshTokens'           => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->refreshTokens',
+                       'ExtDirect::getAPI' => 't3lib/extjs/class.t3lib_extjs_extdirectapi.php:t3lib_extjs_ExtDirectApi->getAPI',
+                       'ExtDirect::route' => 't3lib/extjs/class.t3lib_extjs_extdirectrouter.php:t3lib_extjs_ExtDirectRouter->route',
+               ),
+               'XCLASS' => array(),                                    // Deprecated XCLASS register. See http://wiki.typo3.org/Autoload for more information
+       ),
+       'FE' => array(                  // Configuration for the TypoScript frontend (FE). Nothing here relates to the administration backend!
+               'png_to_gif' => FALSE,                                  // Boolean: Enables conversion back to gif of all png-files generated in the frontend libraries. Notice that this leaves an increased number of temporary files in typo3temp/
+               'tidy' => FALSE,                                                // Boolean: If set, the output html-code will be passed through "tidy" which is a little program you can get from <a href="http://www.w3.org/People/Raggett/tidy/" target="_blank">w3c.org</a>. "Tidy" cleans the HTML-code for nice display!
+               'tidy_option' => 'cached',                              // options [all, cached, output]. "all" = the content is always passed through "tidy" before it may be stored in cache. "cached" = only if the page is put into the cache, "output" = only the output code just before it's echoed out.
+               'tidy_path' => 'tidy -i --quiet true --tidy-mark true -wrap 0 -raw',            // Path with options for tidy. For XHTML output, add " --output-xhtml true"
+               'logfile_dir' => '',                                    // Path where TYPO3 should write webserver-style logfiles to. This path must be write-enabled for the webserver. If this path is outside of PATH_site, you have to allow it using <a href="#BE-lockRootPath">[BE][lockRootPath]</a>
+               'addAllowedPaths' => '',                                // Additional relative paths (comma-list) to allow TypoScript resources be in. Should be prepended with '/'. If not, then any path where the first part is like this path will match. That is: 'myfolder/ , myarchive' will match eg. 'myfolder/', 'myarchive/', 'myarchive_one/', 'myarchive_2/' ... No check is done to see if this directory actually exists in the root of the site. Paths are matched by simply checking if these strings equals the first part of any TypoScript resource filepath. (See class template, function init() in t3lib/class.t3lib_tsparser.php)
+               'allowedTempPaths' => '',                               // Additional paths allowed for temporary images. Used with imgResource. Eg. 'alttypo3temp/,another_temp_dir/';
+               'debug' => FALSE,                                               // Boolean: If set, some debug HTML-comments may be output somewhere. Can also be set by TypoScript.
+               'noPHPscriptInclude' => FALSE,                  // Boolean: If set, PHP-scripts are not included by TypoScript configurations, unless they reside in 'media/scripts/'-folder. This is a security option to ensure that users with template-access do not terrorize
+               'strictFormmail' => TRUE,                               // Boolean: If set, the internal "formmail" feature in TYPO3 will send mail ONLY to recipients which has been encoded by the system itself. This protects against spammers misusing the formmailer.
+               'secureFormmail' => TRUE,                               // Boolean: If set, the internal "formmail" feature in TYPO3 will send mail ONLY to the recipients that are defined in the form CE record. This protects against spammers misusing the formmailer.
+               'formmailMaxAttachmentSize' => 250000,          // Integer: Sets the maximum allowed size (in bytes) of attachments for the internal "formmail" feature.
+               'compressionLevel' => 0,                                // Integer: Determines output compression of FE output. Makes output smaller but slows down the page generation depending on the compression level. Requires zlib in your PHP installation. Range 1-9, where 1 is least compression and 9 is greatest compression. 'true' as value will set the compression based on the PHP default settings (usually 5). Suggested and most optimal value is 5.
+               'pageNotFound_handling' => '',                  // <p>How TYPO3 should handle requests for non-existing/accessible pages.</p> <dl><dt>empty (default)</dt><dd>The next visible page upwards in the page tree is shown.</dd> <dt>'true' or '1'</dt><dd>An error message is shown.</dd><dt>String</dt><dd>Static HTML file to show (reads content and outputs with correct headers), e.g. 'notfound.html' or 'http://www.example.org/errors/notfound.html'.</dd> <dt>Prefix "REDIRECT:"</dt><dd> If prefixed with "REDIRECT:" it will redirect to the URL/script after the prefix.</dd><dt>Prefix "READFILE:"</dt><dd>If prefixed with "READFILE" then it will expect the remaining string to be a HTML file which will be read and outputted directly after having the marker "###CURRENT_URL###" substituted with REQUEST_URI and ###REASON### with reason text, for example: "READFILE:fileadmin/notfound.html".</dd> <dt>Prefix "USER_FUNCTION:"</dt><dd> If prefixed with "USER_FUNCTION:" a user function is called, e.g. "USER_FUNCTION:fileadmin/class.user_notfound.php:user_notFound->pageNotFound" where the file must contain a class "user_notFound" with a method "pageNotFound" inside with two parameters $param and $ref.</dd></dl>
+               'pageNotFound_handling_statheader' => 'HTTP/1.0 404 Not Found',                 // If 'pageNotFound_handling' is enabled, this string will always be sent as header before the actual handling.
+               'pageNotFoundOnCHashError' => FALSE,    // Boolean: If TRUE, a page not found call is made when cHash evaluation error occurs. By default they will just disable caching but still display page output.
+               'pageUnavailable_handling' => '',               // <p>How TYPO3 should handle requests when pages are unavailable due to system problems.</p><dl><dt>empty (default)</dt><dd>An error message is shown.</dd><dt>String</dt><dd>HTML file or URL to show (reads content and outputs with correct headers), e.g. 'unavailable.html' or 'http://www.example.org/errors/unavailable.html'.</dd><dt>Prefix "REDIRECT:"</dt><dd>If prefixed "REDIRECT:" it will redirect to the URL/script after the prefix.</dd><dt>Prefix "READFILE:"</dt><dd>If prefixed with "READFILE:" then it will expect the remaining string to be a HTML file which will be read and outputted directly after having the marker "###CURRENT_URL###" substituted with REQUEST_URI and ###REASON### with reason text, for example: "READFILE:fileadmin/unavailable.html".</dd><dt>Prefix "USER_FUNCTION:"</dt><dd>If prefixed "USER_FUNCTION:" then it will call a user function, eg. "USER_FUNCTION:fileadmin/class.user_unavailable.php:user_unavailable->pageUnavailable" where the file must contain a class "user_unavailable" with a method "pageUnavailable" inside with two parameters $param and $ref. If the client matches <a href="#SYS-devIPmask">[SYS][devIPmask]</a>, this setting is ignored and the page is shown as normal.</dd></dl>
+               'pageUnavailable_handling_statheader' => 'HTTP/1.0 503 Service Temporarily Unavailable',                // If 'pageUnavailable_handling' is enabled, this string will always be sent as header before the actual handling.
+               'pageUnavailable_force' => FALSE,               // Boolean: If TRUE, pageUnavailable_handling is used for every frontend page. If the client matches <a href="#SYS-devIPmask">[SYS][devIPmask]</a>, the page is shown as normal. This is useful during temporary site maintenance.
+               'addRootLineFields' => '',                              // Comma-list of fields from the 'pages'-table. These fields are added to the select query for fields in the rootline.
+               'checkFeUserPid' => TRUE,                               // Boolean: If set, the pid of fe_user logins must be sent in the form as the field 'pid' and then the user must be located in the pid. If you unset this, you should change the fe_users.username eval-flag 'uniqueInPid' to 'unique' in $TCA. This will do: $TCA['fe_users']['columns']['username']['config']['eval']= 'nospace,lower,required,unique';
+               'lockIP' => 2,                                                  // Integer (0-4). If >0, fe_users are locked to (a part of) their REMOTE_ADDR IP for their session. Enhances security but may throw off users that may change IP during their session (in which case you can lower it to 2 or 3). The integer indicates how many parts of the IP address to include in the check. Reducing to 1-3 means that only first, second or third part of the IP address is used. 4 is the FULL IP address and recommended. 0 (zero) disables checking of course.
+               'loginSecurityLevel' => '',                             // See description for <a href="#BE-loginSecurityLevel">[BE][loginSecurityLevel]</a>. Default state for frontend is "normal". Alternative authentication services can implement higher levels if preferred. For example, "rsa" level uses RSA password encryption (only if the rsaauth extension is installed)
+               'lifetime' => 0,                                                // Integer: positive. If >0, the cookie of FE users will have a lifetime of the number of seconds this value indicates. Otherwise it will be a session cookie (deleted when browser is shut down). Setting this value to 604800 will result in automatic login of FE users during a whole week, 86400 will keep the FE users logged in for a day.
+               'sessionDataLifetime' => 86400,                 // Integer: positive. If >0, the session data will timeout and be removed after the number of seconds given (86400 seconds represents 24 hours).
+               'permalogin' => 0,                                              // <p>Integer:</p><dl><dt>-1</dt><dd>Permanent login for FE users disabled.</dd><dt>0</dt><dd>By default permalogin is disabled for FE users but can be enabled by a form control in the login form.</dd><dt>1</dt><dd>Permanent login is by default enabled but can be disabled by a form control in the login form.</dd><dt>2</dt><dd>Permanent login is forced to be enabled.// In any case, permanent login is only possible if <a href="#FE-lifetime">[FE][lifetime]</a> lifetime is > 0.</dd></dl>
+               'maxSessionDataSize' => 10000,                  // Integer: Setting the maximum size (bytes) of frontend session data stored in the table fe_session_data. Set to zero (0) means no limit, but this is not recommended since it also disables a check that session data is stored only if a confirmed cookie is set.
+               'cookieDomain' => '',                                   // Same as <a href="#SYS-cookieDomain">$TYPO3_CONF_VARS['SYS']['cookieDomain']</a> but only for FE cookies. If empty, $TYPO3_CONF_VARS['SYS']['cookieDomain'] value will be used.
+               'cookieName' => 'fe_typo_user',         // String: Set the name for the cookie used for the front-end user session
+               'lockHashKeyWords' => 'useragent',              // Keyword list (Strings commaseparated). Currently only "useragent"; If set, then the FE user session is locked to the value of HTTP_USER_AGENT. This lowers the risk of session hi-jacking. However some cases (like payment gateways) might have to use the session cookie and in this case you will have to disable that feature (eg. with a blank string).
+               'defaultUserTSconfig' => '',                    // String (textarea). Enter lines of default frontend user/group TSconfig.
+               'defaultTypoScript_constants' => '',    // String (textarea). Enter lines of default TypoScript, constants-field.
+               'defaultTypoScript_constants.' => array(),      // Lines of TS to include after a static template with the uid = the index in the array (Constants)
+               'defaultTypoScript_setup' => '',                // Enter lines of default TypoScript, setup-field.
+               'defaultTypoScript_setup.' => array(),  // As above, but for Setup
+               'dontSetCookie' => FALSE,                               // Boolean: If set, the no cookies is attempted to be set in the front end. Of course no userlogins are possible either...
+               'additionalAbsRefPrefixDirectories' => '',      // Enter additional directories to be prepended with absRefPrefix. Directories must be comma-separated. TYPO3 already prepends the following directories: media/, typo3conf/ext/, fileadmin/
+               'IPmaskMountGroups' => array(                   // This allows you to specify an array of IPmaskLists/fe_group-uids. If the REMOTE_ADDR of the user matches an IPmaskList, then the given fe_group is add to the gr_list. So this is an automatic mounting of a user-group. But no fe_user is logged in though! This feature is implemented for the default frontend user authentication and might not be implemented for alternative authentication services.
+                       // array('IPmaskList_1','fe_group uid'), array('IPmaskList_2','fe_group uid')
+               ),
+               'get_url_id_token' => '#get_URL_ID_TOK#',       // This is the token, which is substituted in the output code in order to keep a GET-based session going. Normally the GET-session-id is 5 chars ('&amp;ftu=') + hash_length (norm. 10)
+               'content_doktypes' => '1,2,5,7',                        // List of pages.doktype values which can contain content (so shortcut pages and external url pages are excluded, but all pages below doktype 199 should be included. doktype=6 is not either (backend users only...). For doktypes going into menus see class.tslib_menu.php, line 494 (search for 'doktype'))
+               'enable_mount_pids' => TRUE,                    // Boolean: If set to "1", the mount_pid feature allowing 'symlinks' in the page tree (for frontend operation) is allowed.
+               'pageOverlayFields' => 'uid,title,subtitle,nav_title,media,keywords,description,abstract,author,author_email,url,urltype,shortcut,shortcut_mode',                               // List of fields from the table "pages_language_overlay" which should be overlaid on page records. See t3lib_page::getPageOverlay()
+               'hidePagesIfNotTranslatedByDefault' => FALSE,   // Boolean: If TRUE, pages that has no translation will be hidden by default. Basically this will inverse the effect of the page localization setting "Hide page if no translation for current language exists" to "Show page even if no translation exists"
+               'eID_include' => array(),                               // Array of key/value pairs where key is "tx_[ext]_[optional suffix]" and value is relative filename of class to include. Key is used as "?eID=" for index_ts.php to include the code file which renders the page from that point. (Useful for functionality that requires a low initialization footprint, eg. frontend ajax applications)
+               'disableNoCacheParameter' => FALSE,             // Boolean: If set, the no_cache request parameter will become ineffective. This is currently still an experimental feature and will require a website only with plugins that don't use this parameter. However, using "&amp;no_cache=1" should be avoided anyway because there are better ways to disable caching for a certain part of the website (see COA_INT/USER_INT documentation in TSref).
+               'cHashExcludedParameters' => 'L', // String: The the given parameters will be ignored in the cHash calculation. Example: L,tx_search_pi1[query]
+               'cHashOnlyForParameters' => '', // String: Only the given parameters will be evaluated in the cHash calculation. Example: tx_news_pi1[uid]
+               'cHashRequiredParameters' => '', // Optional: Configure Parameters that require a cHash. If no cHash is given but one of the parameters are set, then TYPO3 triggers the configured cHash Error behaviour
+               'cHashExcludedParametersIfEmpty' => '', // Optional: Configure Parameters that are only relevant for the chash if there's an associated value available. And asterisk "*" can be used to skip all empty parameters.
+               'workspacePreviewLogoutTemplate' => '', // If set, points to an HTML file relative to the TYPO3_site root which will be read and outputted as template for this message. Example: fileadmin/templates/template_workspace_preview_logout.html. Inside you can put the marker %1$s to insert the URL to go back to. Use this in &lt;a href="%1$s"&gt;Go back...&lt;/a&gt; links
+               'versionNumberInFilename' => 'querystring',     // String: embed,querystring,''. Allows to automatically include a version number (timestamp of the file) to referred CSS and JS filenames on the rendered page. This will make browsers and proxies reload the files if they change (thus avoiding caching issues). Set to 'embed' will have the timestamp embedded in the filename, ie. filename.1269312081.js. IMPORTANT: 'embed' requires extra .htaccess rules to work (please refer to _.htaccess or the _.htaccess file from the dummy package)<p>Set to 'querystring' (default setting) to append the version number as a query parameter (doesn't require mod_rewrite). Set to '' will turn this functionality off (behaves like TYPO3 &lt; v4.4).</p>
+               'XCLASS' => array(),                                    // Deprecated XCLASS register. See http://wiki.typo3.org/Autoload for more information
+       ),
+       'MAIL' => array(                // Mail configurations to tune how t3lib_mail classes will send their mails.
+               'transport' => 'mail',                                  // <p>String:</p><dl><dt>mail</dt><dd>Sends messages by delegating to PHP's internal mail() function. No further settings required. This is the most unreliable option. If you are serious about sending mails, consider using "smtp" or "sendmail".</dd><dt>smtp</dt><dd>Sends messages over the (standardized) Simple Message Transfer Protocol. It can deal with encryption and authentication. Most flexible option, requires a mail server and configurations in transport_smtp_* settings below. Works the same on Windows, Unix and MacOS.</dd><dt>sendmail</dt><dd>Sends messages by communicating with a locally installed MTA - such as sendmail. See setting transport_sendmail_command bellow.<dd><dt>mbox</dt><dd>This doesn't send any mail out, but instead will write every outgoing mail to a file adhering to the RFC 4155 mbox format, which is a simple text file where the mails are concatenated. Useful for debugging the mail sending process and on development machines which cannot send mails to the outside. Configure the file to write to in the 'transport_mbox_file' setting below</dd><dt>&lt;classname&gt;</dt><dd>Custom class which implements Swift_Transport. The constructor receives all settings from the MAIL section to make it possible to add custom settings.</dd></dl>
+               'transport_smtp_server' => 'localhost:25',                      // String: <em>only with transport=smtp</em>: &lt;server:port> of mailserver to connect to. &lt;port> defaults to "25".
+               'transport_smtp_encrypt' => '',         // String: <em>only with transport=smtp</em>: Connect to the server using the specified transport protocol. Requires openssl library. Usually available: <em>ssl, sslv2, sslv3, tls</em>. Check <a href="http://www.php.net/stream_get_transports" target="_blank">stream_get_transports()</a>.
+               'transport_smtp_username' => '',                // String: <em>only with transport=smtp</em>: If your SMTP server requires authentication, enter your username here.
+               'transport_smtp_password' => '',                // String: <em>only with transport=smtp</em>: If your SMTP server requires authentication, enter your password here.
+               'transport_sendmail_command' => '/usr/sbin/sendmail -bs',       // String: <em>only with transport=sendmail</em>: The command to call to send a mail locally. The default works on most modern UNIX based mail server (sendmail, postfix, exim)
+               'transport_mbox_file' => '',    // String: <em>only with transport=mbox</em>: The file where to write the mails into. This file will be conforming the mbox format described in RFC 4155. It is a simple text file with a concatenation of all mails. Path must be absolute.
+               'defaultMailFromAddress' => '',                 // String: This default email address is used when no other "from" address is set for a TYPO3-generated email. You can specify an email address only (ex. info@example.org).
+               'defaultMailFromName' => '',                    // String: This default name is used when no other "from" name is set for a TYPO3-generated email.
+       ),
+       'HTTP' => array(                                                // HTTP configuration to tune how TYPO3 behaves on HTTP request. Have a look at <a href="http://pear.php.net/manual/en/package.http.http-request2.config.php>HTTP_Request2 Manual</a> for some background information on those settings.
+               'adapter' => 'socket',                          // String: Default adapter - either "socket" or "curl".
+               'connect_timeout' => 10,                        // Integer: Default timeout for connection. Exception will be thrown if connecting to remote host takes more than this number of seconds.
+               'timeout' => 0,                                         // Integer: Default timeout for whole request. Exception will be thrown if sending the request takes more than this number of seconds. Should be greater than connection timeout (see above) or "0" to not set a limit. Defaults to "0".
+               'protocol_version' => '1.1',            // String: Default HTTP protocol version. Use either "1.0" or "1.1".
+               'follow_redirects' => FALSE,            // Boolean: If set, redirects are followed by default. If number of tries are exceeded, an exception is thrown.
+               'max_redirects' => 5,                           // Integer: Maximum number of tries before an exception is thrown.
+               'strict_redirects' => FALSE,            // Boolean: Whether to keep request method on redirects via status 301 and 302 (TRUE, needed for compatibility with <a href="http://www.faqs.org/rfcs/rfc2616">RFC 2616</a>) or switch to GET (FALSE, needed for compatibility with most browsers). There are some <a href="http://pear.php.net/manual/en/package.http.http-request2.adapters.php#package.http.http-request2.adapters.curl">issues with cURL adapter</a>. Defaults to FALSE.
+               'proxy_host' => '',                             // String: Default proxy server as "http://proxy.example.org" (You must not set the port here. Set the port below.)
+               'proxy_port' => '',                             // Integer: Default proxy server port.
+               'proxy_user' => '',                             // String: Default user name.
+               'proxy_password' => '',                         // String: Default password.
+               'proxy_auth_scheme' => 'basic',         // String: Default authentication method. Can either be "basic" or "digest". Defaults to "basic".
+               'ssl_verify_peer' => FALSE,                     // Boolean: Whether to verify peer's SSL certificate. Turned off by default, due to <a href="http://pear.php.net/manual/en/package.http.http-request2.adapters.php#package.http.http-request2.adapters.socket" target="_blank">issues with Socket adapter</a>. You are advised to use the <em>curl</em> adapter and enable this option!
+               'ssl_verify_host' => TRUE,                      // Boolean: Whether to check that Common Name in SSL certificate matches host name. There are some <a href="http://pear.php.net/manual/en/package.http.http-request2.adapters.php#package.http.http-request2.adapters.socket" target="_blank">issues with Socket Adapter</a>.
+               'ssl_cafile' => '',                                     // String: Certificate Authority file to verify the peer with (use when ssl_verify_peer is TRUE).
+               'ssl_capath' => '',                                     // String: Directory holding multiple Certificate Authority files.
+               'ssl_local_cert' => '',                         // String: Name of a file containing local certificate.
+               'ssl_passphrase' => '',                         // String: Passphrase with which local certificate was encoded.
+               'userAgent' => 'TYPO3/' . TYPO3_version,        // String: Default user agent. If empty, this will be "TYPO3/4.x", while x is the current branch version. This overrides the constant <em>TYPO3_user_agent</em>.
+       ),
+       'MODS' => array(                // Backend Module Configuration (obsolete, make extension instead)
+       ),
+       'USER' => array(                // Here you may define your own setup-vars for use in your include-scripts. (obsolete, make extension instead)
+       ),
+       'SC_OPTIONS' => array(          // Here you can more or less freely define additional configuration for scripts in TYPO3. Of course the features supported depends on the script. See documentation "Inside TYPO3" for examples. Keys in the array are the relative path of a script (for output scripts it should be the "script ID" as found in a comment in the HTML header ) and values can then be anything that scripts wants to define for itself. The key "GLOBAL" is reserved.
+               'GLOBAL' => array(
+                       'softRefParser' => array(
+                               'substitute' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
+                               'notify' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
+                               'images' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
+                               'typolink' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
+                               'typolink_tag' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
+                               'TSconfig' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
+                               'TStemplate' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
+                               'ext_fileref' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
+                               'email' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
+                               'url' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
+                       ),
+                       'softRefParser_GL' => array(),  // Global soft reference parsers
+                       'cliKeys' => array(     // Arrays of EXT:file and module name pairs. See EXT:lowlevel/ext_localconf.php for example.
+                       )
+               ),
+               't3lib/class.t3lib_tsfebeuserauth.php' => array(
+                       'frontendEditingController' => array(
+                               'default' => 't3lib/class.t3lib_frontendedit.php:t3lib_frontendedit'
+                       )
+               ),
+       ),
+       'EXTCONF' => array(             // Here you may add manually set configuration options for your extensions. Eg. $TYPO3_CONF_VARS['EXTCONF']['my_extension_key']['my_option'] = 'my_value';
+               'cms' => array(
+                       'db_layout' => array(
+                               'addTables' => array(
+                                       'fe_users' => array(
+                                               0 => array(
+                                                       'MENU' => '',
+                                                       'fList' => 'username,usergroup,name,email,telephone,address,zip,city',
+                                                       'icon' => TRUE,
+                                               )
+                                       )
+                               )
+                       )
+               ),
+       ),
+       'SVCONF' => array(              // Here you may add manually set configuration options for services.
+//             Eg.  ...['service_type']['setup']['my_option'] = 'my_value'; Setup options how to handle the service (call it or not and how when)
+//             Eg.  ...['service_type']['default']['my_option'] = 'my_value';
+//             Eg.  ...['service_type']['service_key']['my_option'] = 'my_value';
+       )
+);
+?>
\ No newline at end of file
diff --git a/t3lib/stddb/DefaultSettings.php b/t3lib/stddb/DefaultSettings.php
deleted file mode 100644 (file)
index 893635c..0000000
+++ /dev/null
@@ -1,699 +0,0 @@
-<?php
-/***************************************************************
- *  Copyright notice
- *
- *  (c) 2012 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!
- ***************************************************************/
-
-/**
- * This file contains the default array definition that is
- * later populated as $GLOBALS['TYPO3_CONF_VARS']
- *
- * @author Christian Kuhn <lolli@schwarzbu.ch>
- * @package TYPO3
- * @subpackage core
- */
-
-return array(
-       'GFX' => array(         // Configuration of the image processing features in TYPO3. 'IM' and 'GD' are short for ImageMagick and GD library respectively.
-               'image_processing' => TRUE,                             // Boolean: Enables image processing features. Disabling this means NO image processing with either GD or IM!
-               'thumbnails' => TRUE,                                   // Boolean: Enables the use of thumbnails in the backend interface. Thumbnails are generated by IM/partly GD in the file typo3/thumbs.php
-               'thumbnails_png' => 0,                                  // Bits. Bit0: If set, thumbnails from non-jpegs will be 'png', otherwise 'gif' (0=gif/1=png). Bit1: Even JPG's will be converted to png or gif (2=gif/3=png)
-               'gif_compress' => TRUE,                                 // Boolean: Enables the use of the t3lib_div::gif_compress() workaround function for compressing giffiles made with GD or IM, which probably use only RLE or no compression at all.
-               'imagefile_ext' => 'gif,jpg,jpeg,tif,tiff,bmp,pcx,tga,png,pdf,ai',      // Commalist of file extensions perceived as images by TYPO3. List should be set to 'gif,png,jpeg,jpg' if IM is not available. Lowercase and no spaces between!
-
-               'gdlib' => TRUE,                                                // Boolean: Enables the use of GD.
-               'gdlib_png' => FALSE,                                   // Boolean: Enables the use of GD, with PNG only. This means that all items normally generated as gif-files will be png-files instead!
-
-               'im' => TRUE,                                                   // Boolean: Enables the use of IM.
-               'im_path' => '/usr/bin/',                       // Path to the IM tools 'convert', 'combine', 'identify'.
-               'im_path_lzw' => '/usr/bin/',                   // Path to the IM tool 'convert' with LZW enabled! See 'gif_compress'. If your version 4.2.9 of ImageMagick is compiled with LZW you may leave this field blank AND disable the flag 'gif_compress'! Tip: You can call LZW 'convert' with a prefix like 'myver_convert' by setting this path with it, eg. '/usr/bin/myver_' instead of just '/usr/bin/'.
-
-               'im_version_5' => 'im6',                                // String: Set this either to "im6" or "gm" (uses GraphicsMagick instead of ImageMagick). Setting this value will automatically configure some settings for use with the specified program version.
-               'im_negate_mask' => FALSE,                              // Boolean: Indicates if the mask images should be inverted first. This depends of the ImageMagick version. Below ver. 5.1 this should be FALSE. Above ImageMagick version 5.2+ it should be TRUE. Just set the flag if the masks works opposite the intension!
-               'im_imvMaskState' => FALSE,                             // Boolean: If set, the 'im_negate_mask' state is inverted. This is very useful with newer versions of IM5 (at least 5.4.3+) where the 'im_version_5' setting will set 'im_negate_mask' which will eventually be wrong... Halleluja for ImageMagick - have I ever regreted using that package...
-               'im_no_effects' => FALSE,                               // Boolean: This is necessary if using ImageMagick 5+. Effects in Imagemagick 5+ tends to render very slowly! Therefore this must be disabled in order not to perform sharpen, blurring and such. (However lately IM5 is allowed for effects again, but syntax has changed!)
-               'im_v5effects' => 0,                                    // <p>Integer (-1, 0, 1)</p><dl><dt>0</dt><dd>disabled</dd><dt>-1</dt><dd>Do not sharpen images by default</dd><dt>1</dt><dd>All; blur and sharpening is allowed in ImageMagick again and the 'im_no_effects' flag is cancelled.</dd></dl><p>Blurring and sharpening has new syntaxes though. See class.t3lib_stdgraphic.php for details.</p>
-               'im_mask_temp_ext_gif' => FALSE,                // Boolean: This should be set if ImageMagick is version 5+. This is used in class.tslib_content.php for masking images and the extension png is normally used because it's faster than gif for temporary files. But png seems not to work with some IM 5+ versions, so...
-               'im_mask_temp_ext_noloss' => 'miff',    // String: Loss-less ImageMagick extension to use for mask processing in temporary filenames. Normally 'miff' (ImageMagick's OWN format) will do fine. However at least IM 5.4.9 has proved not to be able to write to its own file format which forced me to add this option. You can try and set this to tif/png/jpg if some masking doesn't work the way it should.
-               'im_noScaleUp' => FALSE,                                // Boolean: If set, images are not being scaled up if told so (in t3lib/stdgraphics.php)
-               'im_combine_filename' => 'combine',             // String: Latest ImageMagick versions has changed the name of combine to composite. Configure here if needed.
-               'im_noFramePrepended' => FALSE,                 // Boolean: If set, the [x] frame indicator is NOT prepended to filenames in stdgraphic. Some IM5+ version didn't work at all with the typical [0]-prefix, which allow multipage pdf's and animated gif's to be scaled only for the first frame/page and that seriously cuts down rendering time. Set this flag only if your ImageMagick version cannot find the files. Notice that changing this flag causes temporary filenames to change, thus the server will begin scaling images again which were previously cached.
-               'im_stripProfileCommand' => '+profile \'*\'', // String: Specify the command to strip the profile information, which can reduce thumbnail size up to 60KB. Command can differ in IM/GM, IM also know the -strip command. See <a href="http://www.imagemagick.org/Usage/thumbnails/#profiles" target="_blank">imagemagick.org</a> for details
-               'im_useStripProfileByDefault' => TRUE,  // Boolean: If set, the im_stripProfileCommand is used with all IM Image operations by default. See tsRef for setting this parameter explocit for IMAGE generation.
-               'jpg_quality' => 70,                                    // Integer: Default JPEG generation quality
-               'enable_typo3temp_db_tracking' => FALSE,        // Boolean: If set, then all files in typo3temp will be logged in a database table. In addition to being a log of the files with original filenames, it also serves to secure that the same image is not rendered simultaneously by two different processes.
-               'TTFdpi' => 96,                                                 // Integer: Enter how many dpi the FreeType module uses. Freetype1 should be set to 72. Freetype2 should be set to 96 (otherwise fonts are rendered way bigger than FreeType1). This works as a global scaling factor for Freetype.
-               'png_truecolor' => TRUE,                                // Boolean: If set PNGs will get created as truecolor PNGs. If you use GDlib2 you can create truecolor images if they look not well currently. Note that this results in an increased image size. JPEGs get always created in truecolor now (GDlib2 required)
-       ),
-       'SYS' => array(                 // System related concerning both frontend and backend.
-               'lang' => array(
-                       'cache' => array(
-                               'lifetime' => 86400,
-                               'clear_menu' => FALSE,
-                       ),
-                       'format' => array(
-                               'priority' => 'xlf,xml,php'
-                       ),
-                       'parser' => array(
-                               'php' => 't3lib_l10n_parser_Llphp',
-                               'xml' => 't3lib_l10n_parser_Llxml',
-                               'xlf' => 't3lib_l10n_parser_Xliff',
-                       ),
-               ),
-               'sitename' => 'TYPO3',                                  // Name of the base-site. This title shows up in the root of the tree structure if you're an 'admin' backend user.
-               'compat_version' => '3.8',                              // Compatibility version. TYPO3 behavior will try to be compatible with the output from the TYPO3 version set here. It is recommended to change this setting with the Upgrade Wizard.
-               'encryptionKey' => '',                                  // This is a "salt" used for various kinds of encryption, CRC checksums and validations. You can enter any rubbish string here but try to keep it secret. You should notice that a change to this value might invalidate temporary information, URLs etc. At least, clear all cache if you change this so any such information can be rebuild with the new key.
-               'cookieDomain' => '',                                   // Restricts the domain name for FE and BE session cookies. When setting the value to ".domain.com" (replace domain.com with your domain!), login sessions will be shared across subdomains. Alternatively, if you have more than one domain with sub-domains, you can set the value to a regular expression to match against the domain of the HTTP request. The result of the match is used as the domain for the cookie. eg. /\.(example1|example2)\.com$/ or /\.(example1\.com)|(example2\.net)$/. Separate domains for FE and BE can be set using <a href="#FE-cookieDomain">$TYPO3_CONF_VARS['FE']['cookieDomain']</a> and <a href="#BE-cookieDomain">$TYPO3_CONF_VARS['BE']['cookieDomain']</a> respectively.
-               'cookieSecure' => 0,                                    // <p>Integer (0, 1, 2): Indicates that the cookie should only be transmitted over a secure HTTPS connection from the client.</p><dl><dt>0</dt><dd>always send cookie</dd><dt>1 (force HTTPS)</dt><dd>the cookie will only be set if a secure (HTTPS) connection exists - use this in combination with lockSSL since otherwise the application will fail and throw an exception</dd><dt>2</dt><dd>the cookie will be set in each case, but uses the secure flag if a secure (HTTPS) connection exists.</dd></dl>
-               'cookieHttpOnly' => FALSE,                              // Boolean: When enabled the cookie will be made accessible only through the HTTP protocol. This means that the cookie won't be accessible by scripting languages, such as JavaScript. This setting can effectively help to reduce identity theft through XSS attacks (although it is not supported by all browsers).
-               'doNotCheckReferer' => FALSE,                   // Boolean: If set, it's NOT checked numerous places that the refering host is the same as the current. This is an option you should set if you have problems with proxies not passing the HTTP_REFERER variable.
-               'recursiveDomainSearch' => FALSE,               // Boolean: If set, the search for domain records will be done recursively by stripping parts of the host name off until a matching domain record is found.
-               'devIPmask' => '127.0.0.1,::1',                 // Defines a list of IP addresses which will allow development-output to display. The debug() function will use this as a filter. See the function t3lib_div::cmpIP() for details on syntax. Setting this to blank value will deny all. Setting to "*" will allow all.
-               'sqlDebug' => 0,                                                // <p>Integer (0, 1, 2). Allows displaying executed SQL queries in the browser (for debugging purposes and development)</p><dl><dt>0</dt><dd>no SQL shown (default)</dd><dt>1</dt><dd>show only failed queries</dd><dt>2</dt><dd>show all queries</dd></dl>
-               'enable_DLOG' => FALSE,                                 // Boolean: Whether the developer log is enabled. See constant "TYPO3_DLOG"
-               'ddmmyy' => 'd-m-y',                                    // Format of Date-Month-Year - see PHP-function <a href="http://php.net/date" target="_blank">date()</a>
-               'hhmm' => 'H:i',                                                // Format of Hours-Minutes - see PHP-function <a href="http://php.net/date" target="_blank">date()</a>
-               'USdateFormat' => FALSE,                                // Boolean: If TRUE, dates entered in the TCEforms of the backend will be formatted mm-dd-yyyy
-               'loginCopyrightWarrantyProvider' => '', // String: If you provide warranty for TYPO3 to your customers insert you (company) name here. It will appear in the login-dialog as the warranty provider. (You must also set URL below).
-               'loginCopyrightWarrantyURL' => '',              // String: Add the URL where you explain the extend of the warranty you provide. This URL is displayed in the login dialog as the place where people can learn more about the conditions of your warranty. Must be set (more than 10 chars) in addition with the 'loginCopyrightWarrantyProvider' message.
-               'loginCopyrightShowVersion' => FALSE,   // Boolean: If set, the current TYPO3 version is shown.
-               'curlUse' => FALSE,                                             // Boolean: If set, try to use cURL to fetch external URLs
-               /** @deprecated Deprecated since 4.6 - will be removed in 4.8. */
-               'curlProxyServer' => '',                                // String: Proxyserver as http://proxy:port/. Deprecated since 4.6 - will be removed in 4.8. See below for http options.
-               /** @deprecated Deprecated since 4.6 - will be removed in 4.8. */
-               'curlProxyTunnel' => FALSE,                             // Boolean: If set, use a tunneled connection through the proxy (usefull for websense etc.). Deprecated since 4.6 - will be removed in 4.8. See below for http options.
-               /** @deprecated Deprecated since 4.6 - will be removed in 4.8. */
-               'curlProxyUserPass' => '',                              // String: Proxyserver authentication user:pass. Deprecated since 4.6 - will be removed in 4.8. See below for http options.
-               /** @deprecated Deprecated since 4.6 - will be removed in 4.8. */
-               'curlTimeout' => 0,                                             // Integer: Timeout value for cURL requests in seconds. 0 means to wait indefinitely. Deprecated since 4.6 - will be removed in 4.8. See below for http options.
-               'form_enctype' => 'multipart/form-data',        // String: This is the default form encoding type for most forms in TYPO3. It allows for file uploads to be in the form. However if file-upload is disabled for your PHP version even ordinary data sent with this encryption will not get to the server. So if you have file_upload disabled, you will have to change this to eg. 'application/x-www-form-urlencoded'
-               'textfile_ext' => 'txt,html,htm,css,tmpl,js,sql,xml,csv,' . PHP_EXTENSIONS_DEFAULT,     // Text file extensions. Those that can be edited. Executable PHP files may not be editable in webspace if disallowed!
-               'contentTable' => '',                                   // This is the page-content table (Normally 'tt_content')
-               'T3instID' => 'N/A',                                    // A unique installation ID - not used yet. The idea is that a TYPO3 installation can identify itself by this ID string to the Extension Repository on TYPO3.org so that we can keep a realistic count of serious TYPO3 installations.
-               'binPath' => '',                                                // String: List of absolute paths where external programs should be searched for. Eg. <code>/usr/local/webbin/,/home/xyz/bin/</code>. (ImageMagick path have to be configured separately)
-               'binSetup' => '',                                               // String (textarea): List of programs (separated by newline or comma). By default programs will be searched in default paths and the special paths defined by 'binPath'. When PHP has openbasedir enabled the programs can not be found and have to be configured here. Example: <code>perl=/usr/bin/perl,unzip=/usr/local/bin/unzip</code>
-               't3lib_cs_convMethod' => '',                    // String (values: "iconv", "recode", "mbstring", default is homemade PHP-code). Defines which of these PHP-features to use for various charset conversion functions in t3lib_cs. Will speed up charset conversion radically.
-               't3lib_cs_utils' => '',                                 // String (values: "iconv", "mbstring", default is homemade PHP-code). Defines which of these PHP-features to use for various charset processing functions in t3lib_cs. Will speed up charset functions radically.
-               'no_pconnect' => TRUE,                                  // Boolean: If TRUE, "connect" is used to connect to the database. If FALSE, a persistent connection using "pconnect" will be established!
-               'dbClientCompress' => FALSE,                    // Boolean: if TRUE, data exchange between TYPO3 and database server will be compressed. This may improve performance if (1) database serever is on the different server and (2) network connection speed to database server is 100mbps or less. CPU usage will be higher if this option is used but database operations will be executed faster due to much less (up to 3 times) database network traffic. This option has no effect if MySQL server is localhost.
-               'setMemoryLimit' => 0,                                  // Integer: memory_limit in MB: If more than 16, TYPO3 will try to use ini_set() to set the memory limit of PHP to the value. This works only if the function ini_set() is not disabled by your sysadmin.
-               'serverTimeZone' => 1,                                  // Integer: GMT offset of servers time (from time()). Default is "1" which is "GMT+1" (central european time). This value can be used in extensions that are GMT aware and wants to convert times to/from other timezones.
-               'phpTimeZone' => '',                                    // String: timezone to force for all date() and mktime() functions. A list of supported values can be found at <a href="http://php.net/manual/en/timezones.php" target="_blank">php.net</a>. If this is not set, a valid fallback will be searched for by PHP (php.ini's <a href="http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone" target="_blank">date.timezone</a> setting, server defaults, etc); and if no fallback is found, the value of "UTC" is used instead.
-               'systemLog' => '',                                              // <p>String: semi-colon separated list. Defines one or more logging methods. Possible methods:</p><dl><dt>file,&lt;abs-path-to-file&gt;[,&lt;level&gt;]</dt><dd>logs to a file</dd><dt>mail,&lt;to&gt;[/&lt;from&gt;][,&lt;level&gt;]</dt><dd>sends the log entries via mail</dd><dt>syslog,&lt;facility&gt;,[,&lt;level&gt;]</dt><dd>uses the operating system's log. Facility may be one of LOCAL0..LOCAL7, USER (on Windows USER is the only valid type).</dd><dt>error_log[,,&lt;level&gt;]</dt><dd>uses the PHP error log</dd></dl><p>The &lt;level&gt; is the individual logging level (see <a href="#SYS-systemLogLevel">[SYS][systemLogLevel]</a>).</p>
-               'systemLogLevel' => 0,                                  // <p>Integer (0, 1, 2, 3, 4): Only messages with same or higher severity are logged.</p><ul><li>0: info</li><li>1: notice</li><li>2: warning</li><li>3: error</li><li>4: fatal error</li></ul>
-               'enableDeprecationLog' => 'file',               // Commalist: Enables the logging of deprecated methods and functions. Default is 'file'. The following options are allowed: <dl><dt>file</dt><dd>The log file will be written to typo3conf/deprecation_[hash-value].log</dd><dt>devlog</dt><dd>The log will be written to the development log</dd><dt>console<dt><dd>The log will be displayed in the Backend's Debug Console. The logging options can be combined by comma-separating them.</dd></dl>
-               'maxFileNameLength' => 60,                              // Integer: This is the maximum file name length. The value will be taken into account by basic file operations like renaming or creation of files and folders.
-               'UTF8filesystem' => FALSE,                              // Boolean: If TRUE then TYPO3 uses utf-8 to store file names. This allows for accented Latin letters as well as any other non-latin characters like Cyrillic and Chinese.
-               'systemLocale' => '',                                   // String: locale used for certain system related functions, e.g. escaping shell commands. If problems with filenames containing special characters occur, the value of this option is probably wrong. See <a href="http://php.net/manual/en/function.setlocale.php" target="_blank">setlocale()</a>.
-               'lockingMode' => 'simple',                                      // String: Define which locking mode is used to control requests to pages being generated. Can be one of either "disable" (no locking), "simple" (checks for file existance), "flock" (using PHPs <a href="http://php.net/flock" target="_blank">flock()</a> function), "semaphore" (using PHPs <a href="http://php.net/sem-acquire" target="_blank">sem_acquire()</a> function). Default is "disable".
-               'reverseProxyIP' => '',                                 // String: list of IP addresses. If TYPO3 is behind one or more (intransparent) reverese proxies the IP addresses must be added here.
-               'reverseProxyHeaderMultiValue' => 'none',               // String: "none","first","last": defines which values of a proxy header (eg HTTP_X_FORWARDED_FOR) to use, if more than one is found. "none" discards the value, "first" and "last" use the first/last of the values in the list.
-               'reverseProxyPrefix' => '',                             // String: optional prefix to be added to the internal URL (SCRIPT_NAME and REQUEST_URI).
-               'reverseProxySSL' => '',                                // String: '*' or list of IP addresses of proxies that use SSL (https) for the connection to the client, but an unencrypted connection (http) to the server. If '*' all proxies defined in <a href="#SYS-reverseProxyIP">[SYS][reverseProxyIP]</a> use SSL.
-               'reverseProxyPrefixSSL' => '',                          // String: prefix to be added to the internal URL (SCRIPT_NAME and REQUEST_URI) when accessing the server via an SSL proxy. This setting overrides <a href="#SYS-reverseProxyPrefix">[SYS][reverseProxyPrefix]</a>.
-               'caching' => array(
-                       'cacheConfigurations' => array(
-                               'cache_hash' => array(
-                                       'frontend' => 't3lib_cache_frontend_VariableFrontend',
-                                       'backend' => 't3lib_cache_backend_DbBackend',
-                                       'options' => array(),
-                               ),
-                               'cache_pages' => array(
-                                       'frontend' => 't3lib_cache_frontend_VariableFrontend',
-                                       'backend' => 't3lib_cache_backend_DbBackend',
-                                       'options' => array(
-                                               'compression' => TRUE
-                                       ),
-                               ),
-                               'cache_pagesection' => array(
-                                       'frontend' => 't3lib_cache_frontend_VariableFrontend',
-                                       'backend' => 't3lib_cache_backend_DbBackend',
-                                       'options' => array(
-                                               'compression' => TRUE
-                                       ),
-                               ),
-                               'cache_phpcode' => array(
-                                       'frontend' => 't3lib_cache_frontend_PhpFrontend',
-                                       'backend' => 't3lib_cache_backend_FileBackend',
-                                       'options' => array(),
-                               ),
-                               'cache_runtime' => array(
-                                       'frontend' => 't3lib_cache_frontend_VariableFrontend',
-                                       'backend' => 't3lib_cache_backend_TransientMemoryBackend',
-                                       'options' => array(),
-                               ),
-                       ),
-               ),
-               'additionalAllowedClassPrefixes' => NULL,       // Class names in TYPO3 must usually start with tx_, Tx, user_ or User_. This setting allows to register additional prefixes in a comma separated list.
-               'displayErrors' => -1,                                  // <p>Integer (-1, 0, 1, 2). Configures whether PHP errors should be displayed.</p><dl><dt>0</dt><dd>Do not display any PHP error messages. Overrides the value of "exceptionalErrors" and sets it to 0 (= no errors are turned into exceptions), the configured "productionExceptionHandler" is used as exception handler</dd><dt>1</dt><dd>Display error messages with the registered errorhandler. The configured "debugExceptionHandler" is used as exception handler</dd><dt>2</dt><dd>Display errors only if client matches <a href="#SYS-devIPmask">[SYS][devIPmask]</a>. If devIPmask matches the users IP address  the configured "debugExceptionHandler" is used  for exceptions, if not "productionExceptionHandler" will be used</dd><dt>-1</dt><dd>Default setting. With this option, you can override the PHP setting "display_errors". If devIPmask matches the users IP address  the configured "debugExceptionHandler" is used  for exceptions, if not "productionExceptionHandler" will be used.</dd></dl>
-               'productionExceptionHandler'  => 't3lib_error_ProductionExceptionHandler',      // String: Classname to handle exceptions that might happen in the TYPO3-code. Leave empty to disable exception handling. Default: "t3lib_error_ProductionExceptionHandler". This exception handler displays a nice error message when something went wrong. The error message is logged to the configured logs. Note: The configured "productionExceptionHandler" is used if displayErrors is set to "0" or to "-1" and devIPmask doesn't match the users IP.
-               'debugExceptionHandler' => 't3lib_error_DebugExceptionHandler',                         // String: Classname to handle exceptions that might happen in the TYPO3-code. Leave empty to disable exception handling. Default: "t3lib_error_DebugExceptionHandler". This exception handler displays the complete stack trace of any encountered exception. The error message and the stack trace  is logged to the configured logs. Note: The configured "debugExceptionHandler" is used if displayErrors is set to "1" and if displayErrors is "-1"  or "2" and the devIPmask matches the users IP.
-               'errorHandler' => 't3lib_error_ErrorHandler',   // String: Classname to handle PHP errors. E.g.: t3lib_error_ErrorHandler. This class displays and logs all errors that are registered as "errorHandlerErrors" (<a href="#SYS-errorHandlerErrors">[SYS][errorHandlerErrors]</a>). Leave empty to disable error handling. Errors can be logged to syslog (see: <a href="#SYS-systemLog">[SYS][systemLog]</a>) to the installed developer log and to the "syslog" table. If an error is registered in "exceptionalErrors" ([SYS][exceptionalErrors]) it will be turned into an exception to be handled by the configured exceptionHandler.
-               'errorHandlerErrors'=> E_ALL & ~(E_STRICT | E_NOTICE),  // Integer: The E_* constant that will be handled by the errorhandler. Default is "E_ALL ^ E_NOTICE".
-               'exceptionalErrors' => E_ALL & ~(E_STRICT | E_NOTICE | E_DEPRECATED | E_WARNING | E_USER_ERROR | E_USER_NOTICE | E_USER_WARNING),       // Integer: The E_* constant that will be handled as an exception by t3lib_error_ErrorHandler. Default is <tt>E_ALL ^ E_NOTICE ^ E_DEPRECATED ^ E_WARNING ^ E_USER_ERROR ^ E_USER_NOTICE ^ E_USER_WARNING</tt> (20725) and "0" if <tt>displayErrors=0</tt> (see <a href="http://php.net/manual/en/errorfunc.constants.php" target="_blank">PHP documentation</a>).
-               'enable_errorDLOG' => 0,                                // Boolean: If set, errors are written to the developer log (requires an installed *devlog* extension).
-               'enable_exceptionDLOG' => 0,                    // Boolean: If set, exceptions are written to the developer log (requires an installed *devlog* extension).
-               'syslogErrorReporting' => E_ALL & ~(E_STRICT | E_NOTICE),       // Integer: Configures which PHP errors should be logged to the configured syslogs (see: [SYS][systemLog]). If set to "0" no PHP errors are logged to the syslog. Default is "E_ALL ^ E_NOTICE" (6135).
-               'belogErrorReporting' => E_ALL & ~(E_STRICT | E_NOTICE),        // Integer: Configures which PHP errors should be logged to the "syslog" table (extension: belog). If set to "0" no PHP errors are logged to the sys_log table. Default is "E_ALL ^ E_NOTICE" (6135).
-               'locallangXMLOverride' => array(),                              // For extension/overriding of the arrays in 'locallang' files in frontend and backend. See 'Inside TYPO3' for more information.
-               'generateApacheHtaccess' => 1,                  // Boolean: TYPO3 can create <em>.htaccess</em> files which are used by Apache Webserver. They are useful for access protection or performance improvements. Currently <em>.htaccess</em> files in the following directories are created, if they do not exist: <ul><li>typo3temp/compressor/</li></ul>You want to disable this feature, if you are not running Apache or want to use own rulesets.
-               'fal' => array(
-                       'registeredDrivers' => array(
-                               'Local' => array(
-                                       'class' => 't3lib_file_Driver_LocalDriver',
-                                       'shortName' => 'Local',
-                                       'flexFormDS' => 'FILE:t3lib/file/Driver/Configuration/LocalDriverFlexForm.xml',
-                                       'label' => 'Local filesystem'
-                               )
-                       ),
-                       'callbackFilterMethods' => array(
-                               array(
-                                       't3lib_file_Utility_FilenameFilters', 'filterHiddenFilesAndFolders'
-                               )
-                       )
-               )
-       ),
-       'EXT' => array (        // Options related to the Extension Management
-               'noEdit' => TRUE,                                               // Boolean: If set, the Extension Manager does NOT allow extension files to be edited! (Otherwise both local and global extensions can be edited.)
-               'allowGlobalInstall' => FALSE,                  // Boolean: If set, global extensions in typo3/ext/ are allowed to be installed, updated and deleted etc.
-               'allowLocalInstall' => TRUE,                    // Boolean: If set, local extensions in typo3conf/ext/ are allowed to be installed, updated and deleted etc.
-               'allowSystemInstall' => FALSE,                  // Boolean: If set, you can install extensions in the sysext/ dir. Use this to upgrade the 'cms' and 'lang' extensions.
-               'em_wsdlURL' => 'http://typo3.org/wsdl/tx_ter_wsdl.php',                                // The SOAP URL for uploading extensions to the TER2. Usually doesn't need to be changed.
-               'em_mirrorListURL' => 'http://repositories.typo3.org/mirrors.xml.gz',                           // Allows to preset the URL for fetching the extension repository mirror list from. Used in the Extension Manager.
-
-               'requiredExt' => '',            // String. List of additional extensions which are REQUIRED and cannot be unloaded by the Extension Manager!
-               'ignoredExt' => '',                     // String. List of extensions to be ignored (not loaded), e.g. "em" can be disabled this way.
-               'excludeForPackaging' => '(CVS|\..*|.*~|.*\.bak)',              // String: List of directories and files which will not be packaged into extensions nor taken into account otherwise by the Extension Manager. Perl regular expression syntax!
-               'extCache' => -1,                                               // Deprecated and unused. Do not set anymore and remove from localconf.php
-               'extList' => 'filelist,version,tsconfig_help,context_help,extra_page_cm_options,impexp,belog,about,cshmanual,aboutmodules,setup,opendocs,install,t3editor,felogin,feedit,recycler',                                             // String (exclude) List of extensions which are enabled for this install. Use the Extension Manager (EM) to manage this!
-               'extConf' => array(                                             // Config-options for extensions, stored as serialized arrays by extension-keys. Handled automatically by the EM.
-//                     '--key--' => array()
-               ),
-       ),
-       'BE' => array(          // Backend Configuration.
-               'lang' => array(
-                       'debug' => FALSE,                                       // Debug LL in the backend
-               ),
-               'unzip_path' => '',                                             // Path to "unzip".
-               'diff_path' => 'diff',                                  // Path to "diff". For Windows this program can be downloaded here: <a href="http://unxutils.sourceforge.net/" target="_blank">unxutils.sourceforge.net</a>
-               'fileadminDir' => 'fileadmin/',                 // Path to the fileadmin dir. This is relative to PATH_site. (Automatically mounted for admin-users if set)
-               'RTEenabled' => TRUE,                                   // Boolean: If set, the Rich Text editor will be an option in the backend. Notice that the editor must be enabled per-user and options are configurable. See admin guide.
-               'RTE_imageStorageDir' => 'uploads/',    // Default storage directory for Rich Text Editor files
-               'RTE_reg' => array(),                                   // Contains arrays of possible RTEs available (keys=extKey, values=cfg-array). Each array contains a key, "objRef", which contains a user function call with prefixed script path and instanciating a persistent global object. This can report back if browser requirements are OK, draw the RTE and do the transformations needed.
-               'staticFileEditPath' => 'fileadmin/static/',    // Path to directory with static files for editing (see table sys_staticfiles_edit). Relative to PATH_site.
-               'lockRootPath' => '',                                   // This path is used to evaluate if paths outside of PATH_site should be allowed. Ending slash required! This path is also used to restrict userHomePath/groupHomePath. Observe that the first part of 'userHomePath' and 'groupHomePath' must be the value of 'lockRootPath'. Eg. '/home/typo3/'.
-               'userHomePath' => '',                                   // Path to the directory where TYPO3 backend-users have their home-dirs.  Eg. '/home/typo3/users/'. A home for backend user 2 would be: '/home/typo3/users/2/'. Ending slash required!
-               'groupHomePath' => '',                                  // Path to the directory where TYPO3 backend-groups have their home-dirs. Remember that the first part of this path must be 'lockRootPath'. Eg. '/home/typo3/groups/'. A home for backend group 1 would be: '/home/typo3/groups/1/'. Ending slash required!
-               'userUploadDir' => '',                                  // Suffix to the user home dir which is what gets mounted in TYPO3. Eg. if the user dir is "../123_user/" and this value is "/upload" then "../123_user/upload" gets mounted.
-               'fileCreateMask' => '0644',                             // File mode mask for Unix file systems (when files are uploaded/created).
-               'folderCreateMask' => '0755',                   // As above, but for folders.
-               'createGroup' => '',                                    // Group for newly created files and folders (Unix only). Group ownership can be changed on Unix file systems (see above). Set this if you want to change the group ownership of created files/folders to a specific group. This makes sense in all cases where the webserver is running with a different user/group as you do. Create a new group on your system and add you and the webserver user to the group. Now you can safely set the last bit in fileCreateMask/folderCreateMask to 0 (e.g. 770). Important: The user who is running your webserver needs to be a member of the group you specify here! Otherwise you might get some error messages.
-               'warning_email_addr' => '',                             // Email address that will receive notification whenever an attempt to login to the Install Tool is made and that will also receive warnings whenever more than 3 failed backend login attempts (regardless of user) are detected within an hour.
-               'warning_mode' => '',                                   // Bit 1: If set, warning_email_addr will be notified every time a backend user logs in. Bit 2: If set, warning_email_addr will be notified every time an ADMIN backend user logs in. Other bits are reserved for future options.
-               'lockIP' => 4,                                                  // Integer (0-4). Session IP locking for backend users. See <a href="#FE-lockIP">[FE][lockIP]</a> for details. Default is 4 (which is locking the FULL IP address to session).
-               'sessionTimeout' => 3600,                               // Integer: seconds. Session time out for backend users. Default is 3600 seconds = 1 hour.
-               'IPmaskList' => '',                                             // String: Lets you define a list of IP-numbers (with *-wildcards) that are the ONLY ones allowed access to ANY backend activity. On error an error header is sent and the script exits. Works like IP masking for users configurable through TSconfig. See syntax for that (or look up syntax for the function t3lib_div::cmpIP())
-               'lockBeUserToDBmounts' => TRUE,                 // Boolean: If set, the backend user is allowed to work only within his page-mount. It's advisable to leave this on because it makes security easy to manage.
-               'lockSSL' => 0,                                                 // <p>Integer (0, 1, 2, 3). If &gt;0, If set (1,2,3), the backend can only be operated from an SSL-encrypted connection (https)</p><dl><dt>0</dt><dd>no locking (default)</dd><dt>1</dt><dd>only allow access via SSL</dd><dt>2</dt><dd>redirect user trying to access non-https admin-urls to SSL URLs instead</dd><dt>3</dt><dd>only the login is forced to SSL, then the user switches back to non-SSL-mode</dd></dl>
-               'lockSSLPort' => 0,                                             // Integer: Use a non-standard HTTPS port for lockSSL. Set this value if you use lockSSL and the HTTPS port of your webserver is not 443.
-               'enabledBeUserIPLock' => TRUE,                  // Boolean: If set, the User/Group TSconfig option 'option.lockToIP' is enabled.
-               'lockHashKeyWords' => 'useragent',              // Keyword list (Strings comma separated). Currently only "useragent"; If set, then the BE user session is locked to the value of HTTP_USER_AGENT. This lowers the risk of session hi-jacking. However in some cases (like during development) you might need to switch the user agent while keeping the session. In this case you can disable that feature (e.g. with a blank string).
-               'cookieDomain' => '',                                   // Same as <a href="#SYS-cookieDomain">$TYPO3_CONF_VARS['SYS']['cookieDomain']</a> but only for BE cookies. If empty, $TYPO3_CONF_VARS['SYS']['cookieDomain'] value will be used.
-               'cookieName' => 'be_typo_user',         // String: Set the name for the cookie used for the back-end user session
-               'loginSecurityLevel' => '',                             // String: Keywords that determines the security level of login to the backend. "normal" means the password from the login form is sent in clear-text, "challenged" means the password is not sent but hashed with some other values, "superchallenged" (default) means the password is first hashed before being hashed with the challenge values again (means the password is stored as a hashed string in the database also), "rsa" uses RSA password encryption (only if the rsaauth extension is installed). DO NOT CHANGE this value manually; without an alternative authentication service it will only prevent logins in TYPO3 since the "superchallenged" method is hardcoded in the default authentication system.
-               'showRefreshLoginPopup' => FALSE,               // Boolean: If set, the Ajax relogin will show a real popup window for relogin after the count down. Some auth services need this as they add custom validation to the login form. If it's not set, the Ajax relogin will show an inline relogin window.
-               'adminOnly' => 0,                                               // <p>Integer (-1, 0, 1, 2)</p><dl><dt>-1</dt><dd>total shutdown for maintenance purposes</dd><dt>0</dt><dd>normal operation, everyone can login (default)</dd><dt>1</dt><dd>only admins can login</dd><dt>2</dt><dd>only admins and regular CLI users can login</dd></dl>
-               'disable_exec_function' => FALSE,               // Boolean: Don't use exec() function (except for ImageMagick which is disabled by <a href="#GFX-im">[GFX][im]</a>=0). If set, all fileoperations are done by the default PHP-functions. This is nescessary under Windows! On Unix the system commands by exec() can be used, unless this is disabled.
-               'usePHPFileFunctions' => TRUE,                  // Boolean: If set, all fileoperations are done by the default PHP-functions. Default on Unix is using the system commands by exec().
-               'compressionLevel' => 0,                                // Determines output compression of BE output. Makes output smaller but slows down the page generation depending on the compression level. Requires a) zlib in your PHP installation and b) special rewrite rules for .css.gzip and .js.gzip (please see _.htacces for an example). Range 1-9, where 1 is least compression and 9 is greatest compression. 'true' as value will set the compression based on the PHP default settings (usually 5). Suggested and most optimal value is 5.
-               'maxFileSize' => '10240',                               // Integer: If set this is the max filesize in KB's for file operations in the backend. Can be overridden through $TCA per table field separately.
-               'installToolPassword' => '',                    // String: This is the md5-hashed password for the Install Tool. Set this to '' and access will be totally denied. PLEASE consider to externally password protect the typo3/install/ folder, eg. with a .htaccess file.
-               'pageTree' => array(
-                       'preloadLimit' => 50,                           // Integer: Count of pages that will be preloaded in pagetree. Big amount makes collapsing new branches faster but requires more SQL queries.
-               ),
-               'defaultUserTSconfig' => 'options.enableBookmarks=1
-                       options.enableShowPalettes=1
-                       options.file_list.enableDisplayBigControlPanel=selectable
-                       options.file_list.enableDisplayThumbnails=selectable
-                       options.file_list.enableClipBoard=selectable
-                       options.pageTree {
-                               doktypesToShowInNewPageDragArea = 1,6,4,7,3,254,255,199
-                       }
-
-                       options.contextMenu.options.leftIcons = 1
-                       options.contextMenu {
-                               table {
-                                       virtual_root {
-                                               disableItems =
-
-                                               items {
-                                                       100 = ITEM
-                                                       100 {
-                                                               name = history
-                                                               label = LLL:EXT:lang/locallang_misc.xml:CM_history
-                                                               spriteIcon = actions-document-history-open
-                                                               displayCondition = canShowHistory != 0
-                                                               callbackAction = openHistoryPopUp
-                                                       }
-                                               }
-                                       }
-
-                                       pages_root {
-                                               disableItems =
-
-                                               items {
-                                                       100 = ITEM
-                                                       100 {
-                                                               name = view
-                                                               label = LLL:EXT:lang/locallang_core.xml:cm.view
-                                                               spriteIcon = actions-document-view
-                                                               displayCondition = canBeViewed != 0
-                                                               callbackAction = viewPage
-                                                       }
-
-                                                       200 = ITEM
-                                                       200 {
-                                                               name = new
-                                                               label = LLL:EXT:lang/locallang_core.xml:cm.new
-                                                               spriteIcon = actions-page-new
-                                                               displayCondition = canCreateNewPages != 0
-                                                               callbackAction = newPageWizard
-                                                       }
-
-                                                       300 = DIVIDER
-
-                                                       400 = ITEM
-                                                       400 {
-                                                               name = history
-                                                               label = LLL:EXT:lang/locallang_misc.xml:CM_history
-                                                               spriteIcon = actions-document-history-open
-                                                               displayCondition = canShowHistory != 0
-                                                               callbackAction = openHistoryPopUp
-                                                       }
-                                               }
-                                       }
-
-                                       pages {
-                                               disableItems =
-
-                                               items {
-                                                       100 = ITEM
-                                                       100 {
-                                                               name = view
-                                                               label = LLL:EXT:lang/locallang_core.xml:cm.view
-                                                               spriteIcon = actions-document-view
-                                                               displayCondition = canBeViewed != 0
-                                                               callbackAction = viewPage
-                                                       }
-
-                                                       200 = DIVIDER
-
-                                                       300 = ITEM
-                                                       300 {
-                                                               name = disable
-                                                               label = LLL:EXT:lang/locallang_common.xml:disable
-                                                               spriteIcon = actions-edit-hide
-                                                               displayCondition = getRecord|hidden = 0 && canBeDisabledAndEnabled != 0
-                                                               callbackAction = disablePage
-                                                       }
-
-                                                       400 = ITEM
-                                                       400 {
-                                                               name = enable
-                                                               label = LLL:EXT:lang/locallang_common.xml:enable
-                                                               spriteIcon = actions-edit-unhide
-                                                               displayCondition = getRecord|hidden = 1 && canBeDisabledAndEnabled != 0
-                                                               callbackAction = enablePage
-                                                       }
-
-                                                       500 = ITEM
-                                                       500 {
-                                                               name = edit
-                                                               label = LLL:EXT:lang/locallang_core.xml:cm.edit
-                                                               spriteIcon = actions-page-open
-                                                               displayCondition = canBeEdited != 0
-                                                               callbackAction = editPageProperties
-                                                       }
-
-                                                       600 = ITEM
-                                                       600 {
-                                                               name = info
-                                                               label = LLL:EXT:lang/locallang_core.xml:cm.info
-                                                               spriteIcon = actions-document-info
-                                                               displayCondition = canShowInfo != 0
-                                                               callbackAction = openInfoPopUp
-                                                       }
-
-                                                       700 = ITEM
-                                                       700 {
-                                                               name = history
-                                                               label = LLL:EXT:lang/locallang_misc.xml:CM_history
-                                                               spriteIcon = actions-document-history-open
-                                                               displayCondition = canShowHistory != 0
-                                                               callbackAction = openHistoryPopUp
-                                                       }
-
-                                                       800 = DIVIDER
-
-                                                       900 = SUBMENU
-                                                       900 {
-                                                               label = LLL:EXT:lang/locallang_core.xml:cm.copyPasteActions
-
-                                                               100 = ITEM
-                                                               100 {
-                                                                       name = new
-                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.new
-                                                                       spriteIcon = actions-page-new
-                                                                       displayCondition = canCreateNewPages != 0
-                                                                       callbackAction = newPageWizard
-                                                               }
-
-                                                               200 = DIVIDER
-
-                                                               300 = ITEM
-                                                               300 {
-                                                                       name = cut
-                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.cut
-                                                                       spriteIcon = actions-edit-cut
-                                                                       displayCondition = isInCutMode = 0 && canBeCut != 0 && isMountPoint != 1
-                                                                       callbackAction = enableCutMode
-                                                               }
-
-                                                               400 = ITEM
-                                                               400 {
-                                                                       name = cut
-                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.cut
-                                                                       spriteIcon = actions-edit-cut-release
-                                                                       displayCondition = isInCutMode = 1 && canBeCut != 0
-                                                                       callbackAction = disableCutMode
-                                                               }
-
-                                                               500 = ITEM
-                                                               500 {
-                                                                       name = copy
-                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.copy
-                                                                       spriteIcon = actions-edit-copy
-                                                                       displayCondition = isInCopyMode = 0 && canBeCopied != 0
-                                                                       callbackAction = enableCopyMode
-                                                               }
-
-                                                               600 = ITEM
-                                                               600 {
-                                                                       name = copy
-                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.copy
-                                                                       spriteIcon = actions-edit-copy-release
-                                                                       displayCondition = isInCopyMode = 1 && canBeCopied != 0
-                                                                       callbackAction = disableCopyMode
-                                                               }
-
-                                                               700 = ITEM
-                                                               700 {
-                                                                       name = pasteInto
-                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.pasteinto
-                                                                       spriteIcon = actions-document-paste-into
-                                                                       displayCondition = getContextInfo|inCopyMode = 1 || getContextInfo|inCutMode = 1 && canBePastedInto != 0
-                                                                       callbackAction = pasteIntoNode
-                                                               }
-
-                                                               800 = ITEM
-                                                               800 {
-                                                                       name = pasteAfter
-                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.pasteafter
-                                                                       spriteIcon = actions-document-paste-after
-                                                                       displayCondition = getContextInfo|inCopyMode = 1 || getContextInfo|inCutMode = 1 && canBePastedAfter != 0
-                                                                       callbackAction = pasteAfterNode
-                                                               }
-
-                                                               900 = DIVIDER
-
-                                                               1000 = ITEM
-                                                               1000 {
-                                                                       name = delete
-                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.delete
-                                                                       spriteIcon = actions-edit-delete
-                                                                       displayCondition = canBeRemoved != 0 && isMountPoint != 1
-                                                                       callbackAction = removeNode
-                                                               }
-                                                       }
-
-                                                       1000 = SUBMENU
-                                                       1000 {
-                                                               label = LLL:EXT:lang/locallang_core.xml:cm.branchActions
-
-                                                               100 = ITEM
-                                                               100 {
-                                                                       name = mountAsTreeroot
-                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.tempMountPoint
-                                                                       spriteIcon = actions-system-extension-documentation
-                                                                       displayCondition = canBeTemporaryMountPoint != 0 && isMountPoint = 0
-                                                                       callbackAction = mountAsTreeRoot
-                                                               }
-
-                                                               200 = DIVIDER
-
-                                                               300 = ITEM
-                                                               300 {
-                                                                       name = expandBranch
-                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.expandBranch
-                                                                       spriteIcon = actions-pagetree-expand
-                                                                       displayCondition =
-                                                                       callbackAction = expandBranch
-                                                               }
-
-                                                               400 = ITEM
-                                                               400 {
-                                                                       name = collapseBranch
-                                                                       label = LLL:EXT:lang/locallang_core.xml:cm.collapseBranch
-                                                                       spriteIcon = actions-pagetree-collapse
-                                                                       displayCondition =
-                                                                       callbackAction = collapseBranch
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               ',      // String (exclude). Enter lines of default backend user/group TSconfig.
-               'defaultPageTSconfig' => 'mod.web_list.enableDisplayBigControlPanel=selectable
-                       mod.web_list.enableClipBoard=selectable
-                       mod.web_list.enableLocalizationView=selectable
-                       mod.wizards.newRecord.pages.show.pageInside=1
-                       mod.wizards.newRecord.pages.show.pageAfter=1
-                       mod.wizards.newRecord.pages.show.pageSelectPosition=1
-               ',      // String (exclude).Enter lines of default Page TSconfig.
-               'defaultPermissions' => array (                 // Default permissions set for new pages in t3lib/tce_main.php. Keys are 'show,edit,delete,new,editcontent'. Enter as comma-list
-//                     'user' => '',                                           // default in tce_main is 'show,edit,delete,new,editcontent'. If this is set (uncomment), this value is used instead.
-//                     'group' => '',                                          // default in tce_main is 'show,edit,new,editcontent'. If this is set (uncomment), this value is used instead.
-//                     'everybody' => ''                                       // default in tce_main is ''. If this is set (uncomment), this value is used instead.
-               ),
-               'defaultUC' => array (                                  // Override default settings for BE-users. See class.t3lib_beuserauth.php, array $uc_default
-               ),
-                       // The control of fileextensions goes in two catagories. Webspace and Ftpspace. Webspace is folders accessible from a webbrowser (below TYPO3_DOCUMENT_ROOT) and ftpspace is everything else.
-                       // The control is done like this: If an extension matches 'allow' then the check returns TRUE. If not and an extension matches 'deny' then the check return FALSE. If no match at all, returns TRUE.
-                       // You list extensions comma-separated. If the value is a '*' every extension is matched
-                       // If no fileextension, TRUE is returned if 'allow' is '*', FALSE if 'deny' is '*' and TRUE if none of these matches
-                       // This configuration below accepts everything in ftpspace and everything in webspace except php3,php4,php5 or php files
-               'fileExtensions' => array (
-                       'webspace' => array('allow'=>'', 'deny'=> PHP_EXTENSIONS_DEFAULT),
-                       'ftpspace' => array('allow'=>'*', 'deny'=>'')   // @todo: remove this option in the future
-               ),
-               'customPermOptions' => array(),                 // Array with sets of custom permission options. Syntax is; 'key' => array('header' => 'header string, language splitted', 'items' => array('key' => array('label, language splitted', 'icon reference', 'Description text, language splitted'))). Keys cannot contain ":|," characters.
-               'fileDenyPattern' => FILE_DENY_PATTERN_DEFAULT ,        // A perl-compatible regular expression (without delimiters!) that - if it matches a filename - will deny the file upload/rename or whatever in the webspace. For security reasons, files with multiple extensions have to be denied on an Apache environment with mod_alias, if the filename contains a valid php handler in an arbitary position. Also, ".htaccess" files have to be denied. Matching is done case-insensitive. Default value is stored in constant FILE_DENY_PATTERN_DEFAULT
-               'interfaces' => 'backend',                                      // This determines which interface options is available in the login prompt and in which order (All options: ",backend,frontend")
-               'loginNews' => array(),                                         // In this array you can define news-items for the login screen. To this array, add arrays with assoc keys 'date', 'header', 'content' (HTML content) and for those appropriate value pairs
-               'loginNewsTitle' => '',                                 // Define alternative header message for the LoginNews. If this var is empty, the default header "Important messages:" is displayed.
-               'notificationPrefix' => '[TYPO3 Note]', // String: Used to prefix the subject of mails sent in the taskcenter
-               'accessListRenderMode' => 'checkbox',   // Can be "singlebox", "checkbox" or blank. Refers to the "renderMode" for the selector boxes in be-groups configuration.
-               'explicitADmode' => 'explicitDeny',     // Sets the general allow/deny mode for selector box values. Value can be either "explicitAllow" or "explicitDeny", nothing else!
-               'TSconfigConditions' => TRUE,                   // Boolean: When set it is possible to have TypoScript like conditions in BE Page/User/Group TS-Config
-               'niceFlexFormXMLtags' => TRUE,                  // If set, the flexform XML will be stored with meaningful tags which can be validated with DTD schema. If you rely on custom reading of the XML from pre-4.0 versions you should set this to FALSE if you don't like to change your reader code (internally it is insignificant since t3lib_div::xml2array() doesn't care for the tags if the index-attribute value is set)
-               'flexFormXMLincludeDiffBase' => TRUE,   // If set, an additional tag with index "vXX.vDEFbase" is created for translations in flexforms holding the value of the default language when translation was changed. Used to show diff of value. This setting will change whether the system thinks flexform XML looks clean. For example when FALSE XX.vDEFbase fields will be removed in cleaning while accepted if TRUE (of course)
-               'compactFlexFormXML' => 0,                              // If set, the flexform XML will not contain indentation spaces making XML more compact
-               'flexformForceCDATA' => 0,                              // Boolean:  If set, will add CDATA to Flexform XML. Some versions of libxml have a bug that causes HTML entities to be stripped from any XML content and this setting will avoid the bug by adding CDATA.
-               'explicitConfirmationOfTranslation' => FALSE,   // If set, then the diff-data of localized records is not saved automatically when updated but requires that a translator clicks the special finish_translation/save/close button that becomes available.
-               'versionNumberInFilename' => FALSE,     // <p>Boolean: If TRUE, included CSS and JS files will have the timestamp embedded in the filename, ie. filename.1269312081.js. This will make browsers and proxies reload the files if they change (thus avoiding caching issues). IMPORTANT: this feature requires extra .htaccess rules to work (please refer to _.htaccess or the _.htaccess file from the dummy package)</p><p>If FALSE the filemtime will be appended as a query-string.</p>
-               'spriteIconGenerator_handler' => '',    // String: Used to register own/other spriteGenerating Handler, they have to implement the interface t3lib_spritemanager_SpriteIconGenerator. If set to "t3lib_spritemanager_SpriteBuildingHandler" icons from extensions will automatically merged into sprites.
-               'debug' => FALSE,                       // Boolean: If set, the loginrefresh is disabled and pageRenderer is set to debug mode. Use this to debug the backend only!
-               'AJAX' => array(                                // array of key-value pairs for a unified use of AJAX calls in the TYPO3 backend. Keys are the unique ajaxIDs where the value will be resolved to call a method in an object. See ajax.php and the classes/class.typo3ajax.php for more information.
-                       'SC_alt_db_navframe::expandCollapse'                => 'typo3/alt_db_navframe.php:SC_alt_db_navframe->ajaxExpandCollapse',
-                       'SC_alt_file_navframe::expandCollapse'              => 'typo3/alt_file_navframe.php:SC_alt_file_navframe->ajaxExpandCollapse',
-                       'TYPO3_tcefile::process'                            => 'typo3/classes/class.typo3_tcefile.php:TYPO3_tcefile->processAjaxRequest',
-                       't3lib_TCEforms_inline::createNewRecord'                    => 't3lib/class.t3lib_tceforms_inline.php:t3lib_TCEforms_inline->processAjaxRequest',
-                       't3lib_TCEforms_inline::getRecordDetails'                   => 't3lib/class.t3lib_tceforms_inline.php:t3lib_TCEforms_inline->processAjaxRequest',
-                       't3lib_TCEforms_inline::synchronizeLocalizeRecords'     => 't3lib/class.t3lib_tceforms_inline.php:t3lib_TCEforms_inline->processAjaxRequest',
-                       't3lib_TCEforms_inline::setExpandedCollapsedState'      => 't3lib/class.t3lib_tceforms_inline.php:t3lib_TCEforms_inline->processAjaxRequest',
-                       't3lib_TCEforms_suggest::searchRecord'              => 't3lib/tceforms/class.t3lib_tceforms_suggest.php:t3lib_TCEforms_suggest->processAjaxRequest',
-                       'ShortcutMenu::getGroups'    => 'typo3/classes/class.shortcutmenu.php:ShortcutMenu->getAjaxShortcutGroups',
-                       'ShortcutMenu::saveShortcut' => 'typo3/classes/class.shortcutmenu.php:ShortcutMenu->setAjaxShortcut',
-                       'ShortcutMenu::render'       => 'typo3/classes/class.shortcutmenu.php:ShortcutMenu->renderAjax',
-                       'ShortcutMenu::delete'       => 'typo3/classes/class.shortcutmenu.php:ShortcutMenu->deleteAjaxShortcut',
-                       'ShortcutMenu::create'       => 'typo3/classes/class.shortcutmenu.php:ShortcutMenu->createAjaxShortcut',
-                       'ModuleMenu::saveMenuState'  => 'typo3/classes/class.modulemenu.php:ModuleMenu->saveMenuState',
-                       'ModuleMenu::getData'        => 'typo3/classes/class.modulemenu.php:ModuleMenu->getModuleData',
-                       'BackendLogin::login'                           => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->login',
-                       'BackendLogin::logout'                          => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->logout',
-                       'BackendLogin::refreshLogin'            => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->refreshLogin',
-                       'BackendLogin::isTimedOut'                      => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->isTimedOut',
-                       'BackendLogin::getChallenge'            => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->getChallenge',
-                       'BackendLogin::refreshTokens'           => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->refreshTokens',
-                       'ExtDirect::getAPI' => 't3lib/extjs/class.t3lib_extjs_extdirectapi.php:t3lib_extjs_ExtDirectApi->getAPI',
-                       'ExtDirect::route' => 't3lib/extjs/class.t3lib_extjs_extdirectrouter.php:t3lib_extjs_ExtDirectRouter->route',
-               ),
-               'XCLASS' => array(),                                    // Deprecated XCLASS register. See http://wiki.typo3.org/Autoload for more information
-       ),
-       'FE' => array(                  // Configuration for the TypoScript frontend (FE). Nothing here relates to the administration backend!
-               'png_to_gif' => FALSE,                                  // Boolean: Enables conversion back to gif of all png-files generated in the frontend libraries. Notice that this leaves an increased number of temporary files in typo3temp/
-               'tidy' => FALSE,                                                // Boolean: If set, the output html-code will be passed through "tidy" which is a little program you can get from <a href="http://www.w3.org/People/Raggett/tidy/" target="_blank">w3c.org</a>. "Tidy" cleans the HTML-code for nice display!
-               'tidy_option' => 'cached',                              // options [all, cached, output]. "all" = the content is always passed through "tidy" before it may be stored in cache. "cached" = only if the page is put into the cache, "output" = only the output code just before it's echoed out.
-               'tidy_path' => 'tidy -i --quiet true --tidy-mark true -wrap 0 -raw',            // Path with options for tidy. For XHTML output, add " --output-xhtml true"
-               'logfile_dir' => '',                                    // Path where TYPO3 should write webserver-style logfiles to. This path must be write-enabled for the webserver. If this path is outside of PATH_site, you have to allow it using <a href="#BE-lockRootPath">[BE][lockRootPath]</a>
-               'addAllowedPaths' => '',                                // Additional relative paths (comma-list) to allow TypoScript resources be in. Should be prepended with '/'. If not, then any path where the first part is like this path will match. That is: 'myfolder/ , myarchive' will match eg. 'myfolder/', 'myarchive/', 'myarchive_one/', 'myarchive_2/' ... No check is done to see if this directory actually exists in the root of the site. Paths are matched by simply checking if these strings equals the first part of any TypoScript resource filepath. (See class template, function init() in t3lib/class.t3lib_tsparser.php)
-               'allowedTempPaths' => '',                               // Additional paths allowed for temporary images. Used with imgResource. Eg. 'alttypo3temp/,another_temp_dir/';
-               'debug' => FALSE,                                               // Boolean: If set, some debug HTML-comments may be output somewhere. Can also be set by TypoScript.
-               'noPHPscriptInclude' => FALSE,                  // Boolean: If set, PHP-scripts are not included by TypoScript configurations, unless they reside in 'media/scripts/'-folder. This is a security option to ensure that users with template-access do not terrorize
-               'strictFormmail' => TRUE,                               // Boolean: If set, the internal "formmail" feature in TYPO3 will send mail ONLY to recipients which has been encoded by the system itself. This protects against spammers misusing the formmailer.
-               'secureFormmail' => TRUE,                               // Boolean: If set, the internal "formmail" feature in TYPO3 will send mail ONLY to the recipients that are defined in the form CE record. This protects against spammers misusing the formmailer.
-               'formmailMaxAttachmentSize' => 250000,          // Integer: Sets the maximum allowed size (in bytes) of attachments for the internal "formmail" feature.
-               'compressionLevel' => 0,                                // Integer: Determines output compression of FE output. Makes output smaller but slows down the page generation depending on the compression level. Requires zlib in your PHP installation. Range 1-9, where 1 is least compression and 9 is greatest compression. 'true' as value will set the compression based on the PHP default settings (usually 5). Suggested and most optimal value is 5.
-               'pageNotFound_handling' => '',                  // <p>How TYPO3 should handle requests for non-existing/accessible pages.</p> <dl><dt>empty (default)</dt><dd>The next visible page upwards in the page tree is shown.</dd> <dt>'true' or '1'</dt><dd>An error message is shown.</dd><dt>String</dt><dd>Static HTML file to show (reads content and outputs with correct headers), e.g. 'notfound.html' or 'http://www.example.org/errors/notfound.html'.</dd> <dt>Prefix "REDIRECT:"</dt><dd> If prefixed with "REDIRECT:" it will redirect to the URL/script after the prefix.</dd><dt>Prefix "READFILE:"</dt><dd>If prefixed with "READFILE" then it will expect the remaining string to be a HTML file which will be read and outputted directly after having the marker "###CURRENT_URL###" substituted with REQUEST_URI and ###REASON### with reason text, for example: "READFILE:fileadmin/notfound.html".</dd> <dt>Prefix "USER_FUNCTION:"</dt><dd> If prefixed with "USER_FUNCTION:" a user function is called, e.g. "USER_FUNCTION:fileadmin/class.user_notfound.php:user_notFound->pageNotFound" where the file must contain a class "user_notFound" with a method "pageNotFound" inside with two parameters $param and $ref.</dd></dl>
-               'pageNotFound_handling_statheader' => 'HTTP/1.0 404 Not Found',                 // If 'pageNotFound_handling' is enabled, this string will always be sent as header before the actual handling.
-               'pageNotFoundOnCHashError' => FALSE,    // Boolean: If TRUE, a page not found call is made when cHash evaluation error occurs. By default they will just disable caching but still display page output.
-               'pageUnavailable_handling' => '',               // <p>How TYPO3 should handle requests when pages are unavailable due to system problems.</p><dl><dt>empty (default)</dt><dd>An error message is shown.</dd><dt>String</dt><dd>HTML file or URL to show (reads content and outputs with correct headers), e.g. 'unavailable.html' or 'http://www.example.org/errors/unavailable.html'.</dd><dt>Prefix "REDIRECT:"</dt><dd>If prefixed "REDIRECT:" it will redirect to the URL/script after the prefix.</dd><dt>Prefix "READFILE:"</dt><dd>If prefixed with "READFILE:" then it will expect the remaining string to be a HTML file which will be read and outputted directly after having the marker "###CURRENT_URL###" substituted with REQUEST_URI and ###REASON### with reason text, for example: "READFILE:fileadmin/unavailable.html".</dd><dt>Prefix "USER_FUNCTION:"</dt><dd>If prefixed "USER_FUNCTION:" then it will call a user function, eg. "USER_FUNCTION:fileadmin/class.user_unavailable.php:user_unavailable->pageUnavailable" where the file must contain a class "user_unavailable" with a method "pageUnavailable" inside with two parameters $param and $ref. If the client matches <a href="#SYS-devIPmask">[SYS][devIPmask]</a>, this setting is ignored and the page is shown as normal.</dd></dl>
-               'pageUnavailable_handling_statheader' => 'HTTP/1.0 503 Service Temporarily Unavailable',                // If 'pageUnavailable_handling' is enabled, this string will always be sent as header before the actual handling.
-               'pageUnavailable_force' => FALSE,               // Boolean: If TRUE, pageUnavailable_handling is used for every frontend page. If the client matches <a href="#SYS-devIPmask">[SYS][devIPmask]</a>, the page is shown as normal. This is useful during temporary site maintenance.
-               'addRootLineFields' => '',                              // Comma-list of fields from the 'pages'-table. These fields are added to the select query for fields in the rootline.
-               'checkFeUserPid' => TRUE,                               // Boolean: If set, the pid of fe_user logins must be sent in the form as the field 'pid' and then the user must be located in the pid. If you unset this, you should change the fe_users.username eval-flag 'uniqueInPid' to 'unique' in $TCA. This will do: $TCA['fe_users']['columns']['username']['config']['eval']= 'nospace,lower,required,unique';
-               'lockIP' => 2,                                                  // Integer (0-4). If >0, fe_users are locked to (a part of) their REMOTE_ADDR IP for their session. Enhances security but may throw off users that may change IP during their session (in which case you can lower it to 2 or 3). The integer indicates how many parts of the IP address to include in the check. Reducing to 1-3 means that only first, second or third part of the IP address is used. 4 is the FULL IP address and recommended. 0 (zero) disables checking of course.
-               'loginSecurityLevel' => '',                             // See description for <a href="#BE-loginSecurityLevel">[BE][loginSecurityLevel]</a>. Default state for frontend is "normal". Alternative authentication services can implement higher levels if preferred. For example, "rsa" level uses RSA password encryption (only if the rsaauth extension is installed)
-               'lifetime' => 0,                                                // Integer: positive. If >0, the cookie of FE users will have a lifetime of the number of seconds this value indicates. Otherwise it will be a session cookie (deleted when browser is shut down). Setting this value to 604800 will result in automatic login of FE users during a whole week, 86400 will keep the FE users logged in for a day.
-               'sessionDataLifetime' => 86400,                 // Integer: positive. If >0, the session data will timeout and be removed after the number of seconds given (86400 seconds represents 24 hours).
-               'permalogin' => 0,                                              // <p>Integer:</p><dl><dt>-1</dt><dd>Permanent login for FE users disabled.</dd><dt>0</dt><dd>By default permalogin is disabled for FE users but can be enabled by a form control in the login form.</dd><dt>1</dt><dd>Permanent login is by default enabled but can be disabled by a form control in the login form.</dd><dt>2</dt><dd>Permanent login is forced to be enabled.// In any case, permanent login is only possible if <a href="#FE-lifetime">[FE][lifetime]</a> lifetime is > 0.</dd></dl>
-               'maxSessionDataSize' => 10000,                  // Integer: Setting the maximum size (bytes) of frontend session data stored in the table fe_session_data. Set to zero (0) means no limit, but this is not recommended since it also disables a check that session data is stored only if a confirmed cookie is set.
-               'cookieDomain' => '',                                   // Same as <a href="#SYS-cookieDomain">$TYPO3_CONF_VARS['SYS']['cookieDomain']</a> but only for FE cookies. If empty, $TYPO3_CONF_VARS['SYS']['cookieDomain'] value will be used.
-               'cookieName' => 'fe_typo_user',         // String: Set the name for the cookie used for the front-end user session
-               'lockHashKeyWords' => 'useragent',              // Keyword list (Strings commaseparated). Currently only "useragent"; If set, then the FE user session is locked to the value of HTTP_USER_AGENT. This lowers the risk of session hi-jacking. However some cases (like payment gateways) might have to use the session cookie and in this case you will have to disable that feature (eg. with a blank string).
-               'defaultUserTSconfig' => '',                    // String (textarea). Enter lines of default frontend user/group TSconfig.
-               'defaultTypoScript_constants' => '',    // String (textarea). Enter lines of default TypoScript, constants-field.
-               'defaultTypoScript_constants.' => array(),      // Lines of TS to include after a static template with the uid = the index in the array (Constants)
-               'defaultTypoScript_setup' => '',                // Enter lines of default TypoScript, setup-field.
-               'defaultTypoScript_setup.' => array(),  // As above, but for Setup
-               'dontSetCookie' => FALSE,                               // Boolean: If set, the no cookies is attempted to be set in the front end. Of course no userlogins are possible either...
-               'additionalAbsRefPrefixDirectories' => '',      // Enter additional directories to be prepended with absRefPrefix. Directories must be comma-separated. TYPO3 already prepends the following directories: media/, typo3conf/ext/, fileadmin/
-               'IPmaskMountGroups' => array(                   // This allows you to specify an array of IPmaskLists/fe_group-uids. If the REMOTE_ADDR of the user matches an IPmaskList, then the given fe_group is add to the gr_list. So this is an automatic mounting of a user-group. But no fe_user is logged in though! This feature is implemented for the default frontend user authentication and might not be implemented for alternative authentication services.
-                       // array('IPmaskList_1','fe_group uid'), array('IPmaskList_2','fe_group uid')
-               ),
-               'get_url_id_token' => '#get_URL_ID_TOK#',       // This is the token, which is substituted in the output code in order to keep a GET-based session going. Normally the GET-session-id is 5 chars ('&amp;ftu=') + hash_length (norm. 10)
-               'content_doktypes' => '1,2,5,7',                        // List of pages.doktype values which can contain content (so shortcut pages and external url pages are excluded, but all pages below doktype 199 should be included. doktype=6 is not either (backend users only...). For doktypes going into menus see class.tslib_menu.php, line 494 (search for 'doktype'))
-               'enable_mount_pids' => TRUE,                    // Boolean: If set to "1", the mount_pid feature allowing 'symlinks' in the page tree (for frontend operation) is allowed.
-               'pageOverlayFields' => 'uid,title,subtitle,nav_title,media,keywords,description,abstract,author,author_email,url,urltype,shortcut,shortcut_mode',                               // List of fields from the table "pages_language_overlay" which should be overlaid on page records. See t3lib_page::getPageOverlay()
-               'hidePagesIfNotTranslatedByDefault' => FALSE,   // Boolean: If TRUE, pages that has no translation will be hidden by default. Basically this will inverse the effect of the page localization setting "Hide page if no translation for current language exists" to "Show page even if no translation exists"
-               'eID_include' => array(),                               // Array of key/value pairs where key is "tx_[ext]_[optional suffix]" and value is relative filename of class to include. Key is used as "?eID=" for index_ts.php to include the code file which renders the page from that point. (Useful for functionality that requires a low initialization footprint, eg. frontend ajax applications)
-               'disableNoCacheParameter' => FALSE,             // Boolean: If set, the no_cache request parameter will become ineffective. This is currently still an experimental feature and will require a website only with plugins that don't use this parameter. However, using "&amp;no_cache=1" should be avoided anyway because there are better ways to disable caching for a certain part of the website (see COA_INT/USER_INT documentation in TSref).
-               'cHashExcludedParameters' => 'L', // String: The the given parameters will be ignored in the cHash calculation. Example: L,tx_search_pi1[query]
-               'cHashOnlyForParameters' => '', // String: Only the given parameters will be evaluated in the cHash calculation. Example: tx_news_pi1[uid]
-               'cHashRequiredParameters' => '', // Optional: Configure Parameters that require a cHash. If no cHash is given but one of the parameters are set, then TYPO3 triggers the configured cHash Error behaviour
-               'cHashExcludedParametersIfEmpty' => '', // Optional: Configure Parameters that are only relevant for the chash if there's an associated value available. And asterisk "*" can be used to skip all empty parameters.
-               'workspacePreviewLogoutTemplate' => '', // If set, points to an HTML file relative to the TYPO3_site root which will be read and outputted as template for this message. Example: fileadmin/templates/template_workspace_preview_logout.html. Inside you can put the marker %1$s to insert the URL to go back to. Use this in &lt;a href="%1$s"&gt;Go back...&lt;/a&gt; links
-               'versionNumberInFilename' => 'querystring',     // String: embed,querystring,''. Allows to automatically include a version number (timestamp of the file) to referred CSS and JS filenames on the rendered page. This will make browsers and proxies reload the files if they change (thus avoiding caching issues). Set to 'embed' will have the timestamp embedded in the filename, ie. filename.1269312081.js. IMPORTANT: 'embed' requires extra .htaccess rules to work (please refer to _.htaccess or the _.htaccess file from the dummy package)<p>Set to 'querystring' (default setting) to append the version number as a query parameter (doesn't require mod_rewrite). Set to '' will turn this functionality off (behaves like TYPO3 &lt; v4.4).</p>
-               'XCLASS' => array(),                                    // Deprecated XCLASS register. See http://wiki.typo3.org/Autoload for more information
-       ),
-       'MAIL' => array(                // Mail configurations to tune how t3lib_mail classes will send their mails.
-               'transport' => 'mail',                                  // <p>String:</p><dl><dt>mail</dt><dd>Sends messages by delegating to PHP's internal mail() function. No further settings required. This is the most unreliable option. If you are serious about sending mails, consider using "smtp" or "sendmail".</dd><dt>smtp</dt><dd>Sends messages over the (standardized) Simple Message Transfer Protocol. It can deal with encryption and authentication. Most flexible option, requires a mail server and configurations in transport_smtp_* settings below. Works the same on Windows, Unix and MacOS.</dd><dt>sendmail</dt><dd>Sends messages by communicating with a locally installed MTA - such as sendmail. See setting transport_sendmail_command bellow.<dd><dt>mbox</dt><dd>This doesn't send any mail out, but instead will write every outgoing mail to a file adhering to the RFC 4155 mbox format, which is a simple text file where the mails are concatenated. Useful for debugging the mail sending process and on development machines which cannot send mails to the outside. Configure the file to write to in the 'transport_mbox_file' setting below</dd><dt>&lt;classname&gt;</dt><dd>Custom class which implements Swift_Transport. The constructor receives all settings from the MAIL section to make it possible to add custom settings.</dd></dl>
-               'transport_smtp_server' => 'localhost:25',                      // String: <em>only with transport=smtp</em>: &lt;server:port> of mailserver to connect to. &lt;port> defaults to "25".
-               'transport_smtp_encrypt' => '',         // String: <em>only with transport=smtp</em>: Connect to the server using the specified transport protocol. Requires openssl library. Usually available: <em>ssl, sslv2, sslv3, tls</em>. Check <a href="http://www.php.net/stream_get_transports" target="_blank">stream_get_transports()</a>.
-               'transport_smtp_username' => '',                // String: <em>only with transport=smtp</em>: If your SMTP server requires authentication, enter your username here.
-               'transport_smtp_password' => '',                // String: <em>only with transport=smtp</em>: If your SMTP server requires authentication, enter your password here.
-               'transport_sendmail_command' => '/usr/sbin/sendmail -bs',       // String: <em>only with transport=sendmail</em>: The command to call to send a mail locally. The default works on most modern UNIX based mail server (sendmail, postfix, exim)
-               'transport_mbox_file' => '',    // String: <em>only with transport=mbox</em>: The file where to write the mails into. This file will be conforming the mbox format described in RFC 4155. It is a simple text file with a concatenation of all mails. Path must be absolute.
-               'defaultMailFromAddress' => '',                 // String: This default email address is used when no other "from" address is set for a TYPO3-generated email. You can specify an email address only (ex. info@example.org).
-               'defaultMailFromName' => '',                    // String: This default name is used when no other "from" name is set for a TYPO3-generated email.
-       ),
-       'HTTP' => array(                                                // HTTP configuration to tune how TYPO3 behaves on HTTP request. Have a look at <a href="http://pear.php.net/manual/en/package.http.http-request2.config.php>HTTP_Request2 Manual</a> for some background information on those settings.
-               'adapter' => 'socket',                          // String: Default adapter - either "socket" or "curl".
-               'connect_timeout' => 10,                        // Integer: Default timeout for connection. Exception will be thrown if connecting to remote host takes more than this number of seconds.
-               'timeout' => 0,                                         // Integer: Default timeout for whole request. Exception will be thrown if sending the request takes more than this number of seconds. Should be greater than connection timeout (see above) or "0" to not set a limit. Defaults to "0".
-               'protocol_version' => '1.1',            // String: Default HTTP protocol version. Use either "1.0" or "1.1".
-               'follow_redirects' => FALSE,            // Boolean: If set, redirects are followed by default. If number of tries are exceeded, an exception is thrown.
-               'max_redirects' => 5,                           // Integer: Maximum number of tries before an exception is thrown.
-               'strict_redirects' => FALSE,            // Boolean: Whether to keep request method on redirects via status 301 and 302 (TRUE, needed for compatibility with <a href="http://www.faqs.org/rfcs/rfc2616">RFC 2616</a>) or switch to GET (FALSE, needed for compatibility with most browsers). There are some <a href="http://pear.php.net/manual/en/package.http.http-request2.adapters.php#package.http.http-request2.adapters.curl">issues with cURL adapter</a>. Defaults to FALSE.
-               'proxy_host' => '',                             // String: Default proxy server as "http://proxy.example.org" (You must not set the port here. Set the port below.)
-               'proxy_port' => '',                             // Integer: Default proxy server port.
-               'proxy_user' => '',                             // String: Default user name.
-               'proxy_password' => '',                         // String: Default password.
-               'proxy_auth_scheme' => 'basic',         // String: Default authentication method. Can either be "basic" or "digest". Defaults to "basic".
-               'ssl_verify_peer' => FALSE,                     // Boolean: Whether to verify peer's SSL certificate. Turned off by default, due to <a href="http://pear.php.net/manual/en/package.http.http-request2.adapters.php#package.http.http-request2.adapters.socket" target="_blank">issues with Socket adapter</a>. You are advised to use the <em>curl</em> adapter and enable this option!
-               'ssl_verify_host' => TRUE,                      // Boolean: Whether to check that Common Name in SSL certificate matches host name. There are some <a href="http://pear.php.net/manual/en/package.http.http-request2.adapters.php#package.http.http-request2.adapters.socket" target="_blank">issues with Socket Adapter</a>.
-               'ssl_cafile' => '',                                     // String: Certificate Authority file to verify the peer with (use when ssl_verify_peer is TRUE).
-               'ssl_capath' => '',                                     // String: Directory holding multiple Certificate Authority files.
-               'ssl_local_cert' => '',                         // String: Name of a file containing local certificate.
-               'ssl_passphrase' => '',                         // String: Passphrase with which local certificate was encoded.
-               'userAgent' => 'TYPO3/' . TYPO3_version,        // String: Default user agent. If empty, this will be "TYPO3/4.x", while x is the current branch version. This overrides the constant <em>TYPO3_user_agent</em>.
-       ),
-       'MODS' => array(                // Backend Module Configuration (obsolete, make extension instead)
-       ),
-       'USER' => array(                // Here you may define your own setup-vars for use in your include-scripts. (obsolete, make extension instead)
-       ),
-       'SC_OPTIONS' => array(          // Here you can more or less freely define additional configuration for scripts in TYPO3. Of course the features supported depends on the script. See documentation "Inside TYPO3" for examples. Keys in the array are the relative path of a script (for output scripts it should be the "script ID" as found in a comment in the HTML header ) and values can then be anything that scripts wants to define for itself. The key "GLOBAL" is reserved.
-               'GLOBAL' => array(
-                       'softRefParser' => array(
-                               'substitute' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
-                               'notify' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
-                               'images' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
-                               'typolink' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
-                               'typolink_tag' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
-                               'TSconfig' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
-                               'TStemplate' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
-                               'ext_fileref' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
-                               'email' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
-                               'url' => 't3lib/class.t3lib_softrefproc.php:&t3lib_softrefproc',
-                       ),
-                       'softRefParser_GL' => array(),  // Global soft reference parsers
-                       'cliKeys' => array(     // Arrays of EXT:file and module name pairs. See EXT:lowlevel/ext_localconf.php for example.
-                       )
-               ),
-               't3lib/class.t3lib_tsfebeuserauth.php' => array(
-                       'frontendEditingController' => array(
-                               'default' => 't3lib/class.t3lib_frontendedit.php:t3lib_frontendedit'
-                       )
-               ),
-       ),
-       'EXTCONF' => array(             // Here you may add manually set configuration options for your extensions. Eg. $TYPO3_CONF_VARS['EXTCONF']['my_extension_key']['my_option'] = 'my_value';
-               'cms' => array(
-                       'db_layout' => array(
-                               'addTables' => array(
-                                       'fe_users' => array(
-                                               0 => array(
-                                                       'MENU' => '',
-                                                       'fList' => 'username,usergroup,name,email,telephone,address,zip,city',
-                                                       'icon' => TRUE,
-                                               )
-                                       )
-                               )
-                       )
-               ),
-       ),
-       'SVCONF' => array(              // Here you may add manually set configuration options for services.
-//             Eg.  ...['service_type']['setup']['my_option'] = 'my_value'; Setup options how to handle the service (call it or not and how when)
-//             Eg.  ...['service_type']['default']['my_option'] = 'my_value';
-//             Eg.  ...['service_type']['service_key']['my_option'] = 'my_value';
-       )
-);
-?>
\ No newline at end of file
index d71c934..fa682f2 100644 (file)
@@ -32,7 +32,7 @@
  * @package TYPO3
  * @subpackage t3lib
  */
-final class t3lib_utility_Array {
+class t3lib_utility_Array {
 
        /**
         * Reduce an array by a search value and keep the array structure.
@@ -91,6 +91,216 @@ final class t3lib_utility_Array {
                        // Pointers to result array are reset internally
                return $resultArray;
        }
+
+       /**
+        * Checks if a given path exists in array
+        *
+        * array:
+        * array(
+        *      'foo' => array(
+        *              'bar' = 'test',
+        *      )
+        * );
+        * path: 'foo/bar'
+        * return: TRUE
+        *
+        * @param array $array Given array
+        * @param string $path Path to test, 'foo/bar/foobar'
+        * @param string $delimiter Delimeter for path, default /
+        * @return boolean TRUE if path exists in array
+        */
+       public static function isValidPath(array $array, $path,  $delimiter = '/') {
+               $isValid = TRUE;
+               try {
+                               // Use late static binding to enable mocking of this call in unit tests
+                       static::getValueByPath(
+                               $array,
+                               $path,
+                               $delimiter
+                       );
+               } catch (RuntimeException $e) {
+                       $isValid = FALSE;
+               }
+               return $isValid;
+       }
+
+       /**
+        * Returns a value by given path
+        *
+        * Simple example
+        * Input array:
+        * array(
+        *      'foo' => array(
+        *              'bar' => array(
+        *                      'baz' => 42
+        *              )
+        *      )
+        * );
+        * Path to get: foo/bar/baz
+        * Will return: 42
+        *
+        * If a path segments contains a delimeter character, the path segment
+        * must be enclodsed by " (doubletick), see unit tests for details
+        *
+        * @param array $array Input array
+        * @param string $path Path within the array
+        * @param string $delimiter Defined path delimeter, default /
+        * @return mixed
+        * @throws RuntimeException
+        */
+       public static function getValueByPath(array $array, $path,  $delimiter = '/') {
+               if (empty($path)) {
+                       throw new RuntimeException(
+                               'Path must not be empty',
+                               1341397767
+                       );
+               }
+
+                       // Extract parts of the path
+               $path = str_getcsv($path, $delimiter);
+
+                       // Loop through each part and extract its value
+               $value = $array;
+               foreach ($path as $segment) {
+                       if (array_key_exists($segment, $value)) {
+                                       // Replace current value with child
+                               $value = $value[$segment];
+                       } else {
+                                       // Fail if key does not exist
+                               throw new RuntimeException(
+                                       'Path does not exist in array',
+                                       1341397869
+                               );
+                       }
+               }
+
+               return $value;
+       }
+
+       /**
+        * Modifies or sets a new value in an array by given path
+        *
+        * Input array:
+        * array(
+        *      'foo' => array(
+        *              'bar' => 42,
+        *      ),
+        * );
+        * Path to get: foo/bar
+        * Value to set: 23
+        * Will return:
+        * array(
+        *      'foo' => array(
+        *              'bar' => 23,
+        *      ),
+        * );
+        *
+        * @param array $array Input array to manipulate
+        * @param string $path Path in array to search for
+        * @param mixed $value Value to set at path location in array
+        * @param string $delimiter Path delimeter
+        * @return array Modified array
+        * @throws RuntimeException
+        */
+       public static function setValueByPath(array $array, $path, $value, $delimiter = '/') {
+               if (empty($path)) {
+                       throw new RuntimeException(
+                               'Path must not be empty',
+                               1341406194
+                       );
+               }
+               if (!is_string($path)) {
+                       throw new RuntimeException(
+                               'Path must be a string',
+                               1341406402
+                       );
+               }
+
+                       // Extract parts of the path
+               $path = str_getcsv($path, $delimiter);
+
+                       // Point to the root of the array
+               $pointer = &$array;
+
+                       // Find path in given array
+               foreach ($path as $segment) {
+                               // Fail if the part is empty
+                       if (empty($segment)) {
+                               throw new RuntimeException(
+                                       'Invalid path specified: ' . $path,
+                                       1341406846
+                               );
+                       }
+
+                               // Create cell if it doesn't exist
+                       if (!array_key_exists($segment, $pointer)) {
+                               $pointer[$segment] = array();
+                       }
+
+                               // Set pointer to new cell
+                       $pointer = &$pointer[$segment];
+               }
+
+                       // Set value of target cell
+               $pointer = $value;
+
+               return $array;
+       }
+
+       /**
+        * Sorts an array recursively by key
+        *
+        * @param $array Array to sort recursively by key
+        * @return array Sorted array
+        */
+       public static function sortByKeyRecursive(array $array) {
+               ksort($array);
+               foreach ($array as $key => $value) {
+                       if (is_array($value) && !empty($value)) {
+                               $array[$key] = self::sortByKeyRecursive($value);
+                       }
+               }
+               return $array;
+       }
+
+       /**
+        * Exports an array as string.
+        * Similar to var_export(), but representation follows the TYPO3 core CGL.
+        *
+        * @param array $array Array to export
+        * @param integer $level Internal level used for recursion, do *not* set from outside!
+        * @return string String representation of array
+        */
+       public static function arrayExport(array $array = array(), $level = 0) {
+               $lines = 'array(' . LF;
+               $level ++;
+               foreach ($array as $key => $value) {
+                       $lines .= str_repeat(TAB, $level) . '\'' . $key . '\' => ';
+                       if (is_array($value)) {
+                               if (count($value) > 0) {
+                                       $lines .= self::arrayExport($value, $level);
+                               } else {
+                                       $lines .= 'array(),' . LF;
+                               }
+                       } elseif (is_int($value)) {
+                               $lines .= $value . ',' . LF;
+                       } elseif (is_null($value)) {
+                               $lines .= 'NULL' . ',' . LF;
+                       } elseif (is_bool($value)) {
+                               $lines .= $value ? 'TRUE' : 'FALSE';
+                               $lines .= ',' . LF;
+                       } elseif (is_string($value)) {
+                               $lines .= '\'' . str_replace('\\', '\\\\', $value) . '\'' . ',' . LF;
+                       } else {
+                               throw new RuntimeException(
+                                       'Objects are not supported',
+                                       1342294986
+                               );
+                       }
+               }
+               $lines .= str_repeat(TAB, $level - 1) . ')' . ($level - 1 == 0 ? '' : ',' . LF);
+               return $lines;
+       }
 }
 
 ?>
\ No newline at end of file
diff --git a/tests/Unit/t3lib/class.t3lib_ConfigurationTest.php b/tests/Unit/t3lib/class.t3lib_ConfigurationTest.php
new file mode 100644 (file)
index 0000000..e4f4f0c
--- /dev/null
@@ -0,0 +1,346 @@
+<?php
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2012 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!
+ ***************************************************************/
+
+/**
+ * Testcase for class t3lib_Configuration
+ *
+ * @author Christian Kuhn <lolli@schwarzbu.ch>
+ *
+ * @package TYPO3
+ * @subpackage t3lib
+ */
+class t3lib_ConfigurationTest extends tx_phpunit_testcase {
+
+       /**
+        * Absolute path to files that must be removed
+        * after a test - handled in tearDown
+        */
+       protected $testFilesToDelete = array();
+
+       /**
+        * Tear down test case
+        */
+       public function tearDown() {
+               foreach ($this->testFilesToDelete as $absoluteFileName) {
+                       t3lib_div::unlink_tempfile($absoluteFileName);
+               }
+       }
+
+       #######################
+       # Tests concerning getDefaultConfiguration
+       #######################
+
+       /**
+        * @test
+        * @expectedException RuntimeException
+        */
+       public function getDefaultConfigurationExecutesDefinedDefaultConfigurationFile() {
+               $defaultConfigurationFile = 'typo3temp/' . uniqid('defaultConfiguration');
+               $className = uniqid('t3lib_Configuration');
+               eval(
+                       'class ' . $className . ' extends t3lib_Configuration {' .
+                       '  const DEFAULT_CONFIGURATION_FILE = \'' . $defaultConfigurationFile . '\';' .
+                       '}'
+               );
+               file_put_contents(
+                       PATH_site . $defaultConfigurationFile,
+                       "<?php\n\nthrow new RuntimeException('foo', 1310203814);\n\n?>"
+               );
+               $this->testFilesToDelete[] = PATH_site . $defaultConfigurationFile;
+               $className::getDefaultConfiguration();
+       }
+
+       #######################
+       # Tests concerning getLocalConfiguration
+       #######################
+
+       /**
+        * @test
+        * @expectedException RuntimeException
+        */
+       public function getLocalConfigurationExecutesDefinedConfigurationFile() {
+               $configurationFile = 'typo3temp/' . uniqid('localConfiguration');
+               $className = uniqid('t3lib_Configuration');
+               eval(
+                       'class ' . $className . ' extends t3lib_Configuration {' .
+                       '  const LOCAL_CONFIGURATION_FILE = \'' . $configurationFile . '\';' .
+                       '}'
+               );
+               file_put_contents(
+                       PATH_site . $configurationFile,
+                       "<?php\n\nthrow new RuntimeException('foo', 1310203815);\n\n?>"
+               );
+               $this->testFilesToDelete[] = PATH_site . $configurationFile;
+               $className::getLocalConfiguration();
+       }
+
+       #######################
+       # Tests concerning updateLocalConfiguration
+       #######################
+
+       /**
+        * @test
+        */
+       public function updateLocalConfigurationWritesNewMergedLocalConfigurationArray() {
+               $className = uniqid('t3lib_Configuration');
+               eval(
+                       'class ' . $className . ' extends t3lib_Configuration {' .
+                       '  public static function getLocalConfiguration() {' .
+                       '    $currentLocalConfiguration = array(' .
+                       '      \'notChanged\' => 23,' .
+                       '      \'changed\' => \'unChanged\',' .
+                       '    );' .
+                       '    return $currentLocalConfiguration;' .
+                       '  }' .
+                       '  public static function writeLocalConfiguration($conf) {' .
+                       '    $expectedConfiguration = array(' .
+                       '      \'notChanged\' => 23,' .
+                       '      \'changed\' => \'changed\',' .
+                       '      \'new\' => \'new\',' .
+                       '    );' .
+                       '    if (!($conf === $expectedConfiguration)) {' .
+                       '      throw new Exception(\'broken\');' .
+                       '    }' .
+                       '  }' .
+                       '}'
+               );
+               $overrideConfiguration = array(
+                       'changed' => 'changed',
+                       'new' => 'new',
+               );
+               $className::updateLocalConfiguration($overrideConfiguration);
+       }
+
+       #######################
+       # Tests concerning getDefaultConfigurationValueByPath
+       #######################
+
+       /**
+        * @test
+        */
+       public function getDefaultConfigurationValueByPathReturnsCorrectValue() {
+               $className = uniqid('t3lib_Configuration');
+               eval(
+                       'class ' . $className . ' extends t3lib_Configuration {' .
+                       '  public static function getDefaultConfiguration() {' .
+                       '    return array(\'path\' => \'value\');' .
+                       '  }' .
+                       '}'
+               );
+               $this->assertSame('value', $className::getDefaultConfigurationValueByPath('path'));
+       }
+
+       #######################
+       # Tests concerning getLocalConfigurationValueByPath
+       #######################
+
+       /**
+        * @test
+        */
+       public function getLocalConfigurationValueByPathReturnsCorrectValue() {
+               $className = uniqid('t3lib_Configuration');
+               eval(
+                       'class ' . $className . ' extends t3lib_Configuration {' .
+                       '  public static function getLocalConfiguration() {' .
+                       '    return array(\'path\' => \'value\');' .
+                       '  }' .
+                       '}'
+               );
+               $this->assertSame('value', $className::getLocalConfigurationValueByPath('path'));
+       }
+
+       #######################
+       # Tests concerning getConfigurationValueByPath
+       #######################
+
+       /**
+        * @test
+        */
+       public function getConfigurationValueByPathReturnsCorrectValue() {
+               $className = uniqid('t3lib_Configuration');
+               eval(
+                       'class ' . $className . ' extends t3lib_Configuration {' .
+                       '  public static function getDefaultConfiguration() {' .
+                       '    return array(\'path\' => \'value\');' .
+                       '  }' .
+                       '  public static function getLocalConfiguration() {' .
+                       '    return array(\'path\' => \'valueOverride\');' .
+                       '  }' .
+                       '}'
+               );
+               $this->assertSame('valueOverride', $className::getConfigurationValueByPath('path'));
+       }
+
+       #######################
+       # Tests concerning setLocalConfigurationValueByPath
+       #######################
+
+       /**
+        * @test
+        */
+       public function setLocalConfigurationValueByPathReturnFalseIfPathIsNotValid() {
+               $className = uniqid('t3lib_Configuration');
+               eval(
+                       'class ' . $className . ' extends t3lib_Configuration {' .
+                       '  public static function isValidLocalConfigurationPath() {' .
+                       '    return FALSE;' .
+                       '  }' .
+                       '}'
+               );
+               $this->assertFalse($className::setLocalConfigurationValueByPath('path'));
+       }
+
+       /**
+        * @test
+        */
+       public function setLocalConfigurationValueByPathUpdatesValueDefinedByPath() {
+               $className = uniqid('t3lib_Configuration');
+               eval(
+                       'class ' . $className . ' extends t3lib_Configuration {' .
+                       '  public static function isValidLocalConfigurationPath() {' .
+                       '    return TRUE;' .
+                       '  }' .
+                       '  public static function getLocalConfiguration() {' .
+                       '    $currentLocalConfiguration = array(' .
+                       '      \'notChanged\' => 23,' .
+                       '      \'toUpdate\' => \'notUpdated\',' .
+                       '    );' .
+                       '    return $currentLocalConfiguration;' .
+                       '  }' .
+                       '  public static function writeLocalConfiguration($conf) {' .
+                       '    $expectedConfiguration = array(' .
+                       '      \'notChanged\' => 23,' .
+                       '      \'toUpdate\' => \'updated\',' .
+                       '    );' .
+                       '    if (!($conf === $expectedConfiguration)) {' .
+                       '      throw new Exception(\'broken\');' .
+                       '    }' .
+                       '    return TRUE;' .
+                       '  }' .
+                       '}'
+               );
+               $pathToUpdate = 'toUpdate';
+               $valueToUpdate = 'updated';
+               $this->assertTrue($className::setLocalConfigurationValueByPath($pathToUpdate, $valueToUpdate));
+       }
+
+       #######################
+       # Tests concerning setLocalConfigurationValuesByPathValuePairs
+       #######################
+
+       /**
+        * @test
+        */
+       public function setLocalConfigurationValuesByPathValuePairsSetsPathValuePairs() {
+               $className = uniqid('t3lib_Configuration');
+               eval(
+                       'class ' . $className . ' extends t3lib_Configuration {' .
+                       '  public static function isValidLocalConfigurationPath() {' .
+                       '    return TRUE;' .
+                       '  }' .
+                       '  public static function getLocalConfiguration() {' .
+                       '    $currentLocalConfiguration = array(' .
+                       '      \'notChanged\' => 23,' .
+                       '      \'toUpdate\' => \'notUpdated\',' .
+                       '    );' .
+                       '    return $currentLocalConfiguration;' .
+                       '  }' .
+                       '  public static function writeLocalConfiguration($conf) {' .
+                       '    $expectedConfiguration = array(' .
+                       '      \'notChanged\' => 23,' .
+                       '      \'toUpdate\' => \'updated\',' .
+                       '      \'new\' => \'new\',' .
+                       '    );' .
+                       '    if (!($conf === $expectedConfiguration)) {' .
+                       '      throw new Exception(\'broken\');' .
+                       '    }' .
+                       '    return TRUE;' .
+                       '  }' .
+                       '}'
+               );
+               $pairs = array(
+                       'toUpdate' => 'updated',
+                       'new' => 'new',
+               );
+               $this->assertTrue($className::setLocalConfigurationValuesByPathValuePairs($pairs));
+       }
+
+       #######################
+       # Tests concerning writeLocalConfiguration
+       #######################
+
+       /**
+        * @test
+        */
+       public function writeLocalConfigurationWritesSortedContentToConfigurationFile() {
+               $configurationFile = 'typo3temp/' . uniqid('localConfiguration');
+               $className = uniqid('t3lib_Configuration');
+               eval(
+                       'class ' . $className . ' extends t3lib_Configuration {' .
+                       '  const LOCAL_CONFIGURATION_FILE = \'' . $configurationFile . '\';' .
+                       '  public static function writeLocalConfiguration($conf) {' .
+                       '    return parent::writeLocalConfiguration($conf);' .
+                       '  }' .
+                       '}'
+               );
+               $this->testFilesToDelete[] = PATH_site . $configurationFile;
+               $pairs = array(
+                       'foo' => 42,
+                       'bar' => 23
+               );
+               $expectedContent =
+               '<?php' . LF .
+                       'return array(' . LF .
+                       TAB . '\'bar\' => 23,' . LF .
+                       TAB . '\'foo\' => 42,' . LF .
+                       ');' . LF .
+               '?>';
+               $this->assertTrue($className::writeLocalConfiguration($pairs));
+               $this->assertEquals($expectedContent, file_get_contents(PATH_site . $configurationFile));
+       }
+
+       #######################
+       # Tests concerning isValidLocalConfigurationPath
+       #######################
+
+       /**
+        * @test
+        */
+       public function isValidLocalConfigurationPathAcceptsWhitelistedPath() {
+               $className = uniqid('t3lib_Configuration');
+               eval(
+                       'class ' . $className . ' extends t3lib_Configuration {' .
+                       '  protected static $whiteListedLocalConfigurationPaths = array(' .
+                       '    \'foo\',' .
+                       '  );' .
+                       '  public static function isValidLocalConfigurationPath($path) {' .
+                       '    return parent::isValidLocalConfigurationPath($path);' .
+                       '  }' .
+                       '}'
+               );
+               $this->assertTrue($className::isValidLocalConfigurationPath('foo'));
+       }
+}
+
+?>
\ No newline at end of file
index de59fcb..8514cd9 100644 (file)
@@ -100,7 +100,7 @@ class t3lib_autoloaderTest extends Tx_Phpunit_TestCase {
                $GLOBALS['TYPO3_LOADED_EXT'][$extKey] = array(
                        'siteRelPath' => $relPath
                );
-               $GLOBALS['TYPO3_CONF_VARS']['EXT']['extList'] .= ',' . $extKey;
+               $GLOBALS['TYPO3_CONF_VARS']['EXT']['extListArray'][] = $extKey;
 
                $this->fakedExtensions[] = $extKey;
                t3lib_extMgm::clearExtensionKeyMap();
index 6530389..1262288 100644 (file)
@@ -128,6 +128,31 @@ class t3lib_extmgmTest extends tx_phpunit_testcase {
                }
        }
 
+       ///////////////////////////////
+       // Tests concerning isLoaded
+       ///////////////////////////////
+
+       /**
+        * @test
+        */
+       public function isLoadedReturnsTrueIfExtensionIsLoaded() {
+               $this->assertTrue(t3lib_extMgm::isLoaded('cms'));
+       }
+
+       /**
+        * @test
+        */
+       public function isLoadedReturnsFalseIfExtensionIsNotLoadedAndExitIsDisabled() {
+               $this->assertFalse(t3lib_extMgm::isLoaded(uniqid('foobar'), FALSE));
+       }
+
+       /**
+        * @test
+        * @expectedException BadFunctionCallException
+        */
+       public function isLoadedThrowsExceptionIfExtensionIsNotLoaded() {
+               $this->assertFalse(t3lib_extMgm::isLoaded(uniqid('foobar'), TRUE));
+       }
 
        ///////////////////////////////
        // Tests concerning extPath
@@ -181,7 +206,7 @@ class t3lib_extmgmTest extends tx_phpunit_testcase {
 
                unset($GLOBALS['TYPO3_LOADED_EXT']);
                $GLOBALS['TYPO3_CONF_VARS']['EXT']['requiredExt'] = '';
-               $GLOBALS['TYPO3_CONF_VARS']['EXT']['extList'] = 'foo';
+               $GLOBALS['TYPO3_CONF_VARS']['EXT']['extListArray'] = array('foo');
                t3lib_extMgm::extPath('foo');
        }
 
@@ -1062,6 +1087,15 @@ class t3lib_extmgmTest extends tx_phpunit_testcase {
         * @test
         */
        public function getExtensionVersionForLoadedExtensionReturnsExtensionVersion() {
+               $className = uniqid('t3lib_extMgm');
+               eval(
+                       'class ' . $className . ' extends t3lib_extMgm {' .
+                       '  public static function isLoaded() {' .
+                       '    return TRUE;' .
+                       '  }' .
+                       '}'
+               );
+
                t3lib_extMgm::clearExtensionKeyMap();
 
                $uniqueSuffix = uniqid('test');
@@ -1072,33 +1106,198 @@ class t3lib_extmgmTest extends tx_phpunit_testcase {
                );
                $this->assertEquals(
                        '1.2.3',
-                       t3lib_extMgm::getExtensionVersion($extensionKey)
+                       $className::getExtensionVersion($extensionKey)
                );
        }
 
+       /////////////////////////////////////////
+       // Tests concerning getLoadedExtensionListArray
+       /////////////////////////////////////////
+
+       /**
+        * @test
+        */
+       public function getLoadedExtensionListArrayConsidersExtListAsString() {
+               unset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extListArray']);
+               $GLOBALS['TYPO3_CONF_VARS']['EXT']['extList'] = 'foo,bar';
+               $this->assertEquals(array('foo', 'bar'), array_intersect(array('foo', 'bar'), t3lib_extMgm::getLoadedExtensionListArray()));
+       }
+
+       /**
+        * @test
+        */
+       public function getLoadedExtensionListArrayConsidersExtListAsArray() {
+               $extList = array('foo', 'bar');
+               $GLOBALS['TYPO3_CONF_VARS']['EXT']['extListArray'] = $extList;
+               $this->assertEquals($extList, array_intersect($extList, t3lib_extMgm::getLoadedExtensionListArray()));
+       }
+
        /**
         * @test
         */
-       public function getEnabledExtensionListConsidersRequiredExtensions() {
-               $testrequiRedExtension = uniqid('test');
-               $GLOBALS['TYPO3_CONF_VARS']['EXT']['requiredExt'] = $testrequiRedExtension;
+       public function getLoadedExtensionListArrayConsidersRequiredExtensions() {
+               $className = uniqid('t3lib_extMgm');
+               eval(
+                       'class ' . $className . ' extends t3lib_extMgm {' .
+                       '  public static function getRequiredExtensionListArray() {' .
+                       '    return array(\'baz\');' .
+                       '  }' .
+                       '}'
+               );
+               $GLOBALS['TYPO3_CONF_VARS']['EXT']['extListArray'] = array();
+               $this->assertEquals(array('baz'), $className::getLoadedExtensionListArray());
+       }
 
-               $extensions = explode(',', t3lib_extMgm::getEnabledExtensionList());
-               $this->assertTrue(in_array($testrequiRedExtension, $extensions));
+       /**
+        * @test
+        */
+       public function getLoadedExtensionListArrayReturnsUniqueList() {
+               $className = uniqid('t3lib_extMgm');
+               eval(
+                       'class ' . $className . ' extends t3lib_extMgm {' .
+                       '  public static function getRequiredExtensionListArray() {' .
+                       '    return array(\'bar\');' .
+                       '  }' .
+                       '}'
+               );
+               $GLOBALS['TYPO3_CONF_VARS']['EXT']['extListArray'] = array('foo', 'bar', 'foo');
+               $this->assertSame(array('bar', 'foo'), $className::getLoadedExtensionListArray());
        }
 
+       /////////////////////////////////////////
+       // Tests concerning getRequiredExtensionListArray
+       /////////////////////////////////////////
+
        /**
         * @test
         */
-       public function getEnabledExtensionListConsidersRequiredAndIgnoredExtensions() {
-               $testRequiredExtension = uniqid('test');
-               $testIgnoredExtension = uniqid('test');
-               $GLOBALS['TYPO3_CONF_VARS']['EXT']['requiredExt'] = $testRequiredExtension . ',' . $testIgnoredExtension;
-               $GLOBALS['TYPO3_CONF_VARS']['EXT']['ignoredExt'] = $testIgnoredExtension;
+       public function getRequiredExtensionListArrayContainsAdditionalRequiredExtensionsAsString() {
+               $GLOBALS['TYPO3_CONF_VARS']['EXT']['requiredExt'] = 'foo,bar';
+               $this->assertEquals(array('foo', 'bar'), array_intersect(array('foo', 'bar'), t3lib_extMgm::getLoadedExtensionListArray()));
+       }
 
-               $extensions = explode(',', t3lib_extMgm::getEnabledExtensionList());
-               $this->assertTrue(in_array($testRequiredExtension, $extensions));
-               $this->assertFalse(in_array($testIgnoredExtension, $extensions));
+       /**
+        * @test
+        */
+       public function getRequiredExtensionListArrayContainsAdditionalRequiredExtensionsAsArray() {
+               $requiredExtList = array('foo', 'bar');
+               $GLOBALS['TYPO3_CONF_VARS']['EXT']['requiredExt'] = $requiredExtList;
+               $this->assertEquals($requiredExtList, array_intersect($requiredExtList, t3lib_extMgm::getLoadedExtensionListArray()));
+       }
+
+       /**
+        * @test
+        */
+       public function getRequiredExtensionListArrayReturnsUniqueList() {
+               $GLOBALS['TYPO3_CONF_VARS']['EXT']['requiredExt'] = 'foo,bar,foo';
+               $this->assertEquals(array('foo', 'bar'), array_intersect(array('foo', 'bar'), t3lib_extMgm::getLoadedExtensionListArray()));
+       }
+
+       /////////////////////////////////////////
+       // Tests concerning loadExtension
+       /////////////////////////////////////////
+
+       /**
+        * @test
+        * @expectedException RuntimeException
+        */
+       public function loadExtensionThrowsExceptionIfExtensionIsLoaded() {
+               $className = uniqid('t3lib_extMgm');
+               eval(
+                       'class ' . $className . ' extends t3lib_extMgm {' .
+                       '  public static function isLoaded() {' .
+                       '    return TRUE;' .
+                       '  }' .
+                       '}'
+               );
+               $className::loadExtension('test');
+       }
+
+       /**
+        * @test
+        * @expectedException RuntimeException
+        */
+       public function loadExtensionAddsExtensionToExtList() {
+               if (!file_exists(PATH_typo3conf . 'LocalConfiguration.php')) {
+                       $this->markTestSkipped('Test is not available until update wizard to transform localconf.php was run.');
+               }
+               $extensionKeyToLoad = uniqid('loadMe');
+               $className = uniqid('t3lib_extMgm');
+               eval(
+                       'class ' . $className . ' extends t3lib_extMgm {' .
+                       '  public static function writeNewExtensionList($extList) {' .
+                       '    if (in_array(' . $extensionKeyToLoad . ', $extList)) {' .
+                       '      throw new RuntimeException(\'test\');' .
+                       '    }' .
+                       '  }' .
+                       '}'
+               );
+               $className::loadExtension($extensionKeyToLoad);
+       }
+
+       /////////////////////////////////////////
+       // Tests concerning unloadExtension
+       /////////////////////////////////////////
+
+       /**
+        * @test
+        * @expectedException RuntimeException
+        */
+       public function unloadExtensionThrowsExceptionIfExtensionIsNotLoaded() {
+               $className = uniqid('t3lib_extMgm');
+               eval(
+                       'class ' . $className . ' extends t3lib_extMgm {' .
+                       '  public static function isLoaded() {' .
+                       '    return FALSE;' .
+                       '  }' .
+                       '}'
+               );
+               $className::unloadExtension('test');
+       }
+
+       /**
+        * @test
+        * @expectedException RuntimeException
+        */
+       public function unloadExtensionThrowsExceptionIfExtensionIsRequired() {
+               $extensionKey = uniqid('test');
+               $className = uniqid('t3lib_extMgm');
+               eval(
+                       'class ' . $className . ' extends t3lib_extMgm {' .
+                       '  public static function isLoaded() {' .
+                       '    return TRUE;' .
+                       '  }' .
+                       '  public static function getRequiredExtensionListArray() {' .
+                       '    return array(\'' . $extensionKey . '\');' .
+                       '  }' .
+                       '}'
+               );
+               $className::unloadExtension($extensionKey);
+       }
+
+       /**
+        * @test
+        * @expectedException RuntimeException
+        */
+       public function unloadExtensionRemovesExtensionFromExtList() {
+               if (!file_exists(PATH_typo3conf . 'LocalConfiguration.php')) {
+                       $this->markTestSkipped('Test is not available until update wizard to transform localconf.php was run.');
+               }
+               $extensionKeyToUnload = uniqid('unloadMe');
+               $className = uniqid('t3lib_extMgm');
+               eval(
+                       'class ' . $className . ' extends t3lib_extMgm {' .
+                       '  public static function isLoaded() {' .
+                       '    return TRUE;' .
+                       '  }' .
+                       '  public static function writeNewExtensionList($extList) {' .
+                       '    if (!in_array(' . $extensionKeyToUnload . ', $extList)) {' .
+                       '      throw new RuntimeException(\'test\');' .
+                       '    }' .
+                       '  }' .
+                       '}'
+               );
+               $className::unloadExtension($extensionKeyToUnload);
        }
 
        /////////////////////////////////////////
index 108deed..27b30e8 100644 (file)
  */
 class t3lib_utility_ArrayTest extends tx_phpunit_testcase {
 
+       #######################
+       # Tests concerning filterByValueRecursive
+       #######################
+
        /**
         * Data provider for filterByValueRecursiveCorrectlyFiltersArray
+        *
+        * Every array splits into:
+        * - String value to search for
+        * - Input array
+        * - Expected result array
         */
        public function filterByValueRecursive() {
-                       // Every array splits into:
-                       // - String value to search for
-                       // - Input array
-                       // - Expected result array
                return array(
                        'empty search array' => array(
                                'banana',
@@ -183,6 +188,524 @@ class t3lib_utility_ArrayTest extends tx_phpunit_testcase {
        public function filterByValueRecursiveDoesNotMatchDifferentInstancesOfSameClass() {
                $this->assertEquals(array(), t3lib_utility_Array::filterByValueRecursive(new stdClass(), array(new stdClass())));
        }
+
+       #######################
+       # Tests concerning  isValidPath
+       #######################
+
+       /**
+        * Mock the class under test, isValidPath() (method under test), calls
+        * static getValuePath() internally, which is mocked here to return a specific
+        * result. This works because of 'static' keyword'  instead of 'self'
+        * for getValueByPath() call, using late static binding in PHP 5.3
+        *
+        * @test
+        */
+       public function isValidPathReturnsTrueIfPathExists() {
+               $className = uniqid('t3lib_utility_Array');
+               eval(
+                       'class ' . $className . ' extends t3lib_utility_Array {' .
+                       '  public static function getValueByPath() {' .
+                       '    return 42;' .
+                       '  }' .
+                       '}'
+               );
+               $this->assertTrue($className::isValidPath(array('foo'), 'foo'));
+       }
+
+       /**
+        * @test
+        */
+       public function isValidPathReturnsFalseIfPathDoesNotExist() {
+               $className = uniqid('t3lib_utility_Array');
+               eval(
+                       'class ' . $className . ' extends t3lib_utility_Array {' .
+                       '  public static function getValueByPath() {' .
+                       '    throw new RuntimeException(\'foo\', 123);' .
+                       '  }' .
+                       '}'
+               );
+               $this->assertFalse($className::isValidPath(array('foo'), 'foo'));
+       }
+
+       #######################
+       # Tests concerning getValueByPath
+       #######################
+
+       /**
+        * @test
+        * @expectedException RuntimeException
+        */
+       public function getValueByPathThrowsExceptionIfPathIsEmpty() {
+               t3lib_utility_Array::getValueByPath(array(), '');
+       }
+
+       /**
+        * Data provider for getValueByPathThrowsExceptionIfPathNotExists
+        * Every array splits into:
+        * - Array to get value from
+        * - String path
+        * - Expected result
+        */
+       public function getValueByPathInvalidPathDataProvider() {
+               return array(
+                       'not existing path 1' => array(
+                               array(
+                                       'foo' => array()
+                               ),
+                               'foo/bar/baz',
+                               FALSE
+                       ),
+                       'not existing path 2' => array(
+                               array(
+                                       'foo' => array(
+                                               'baz' => 42
+                                       ),
+                                       'bar' => array(),
+                               ),
+                               'foo/bar/baz',
+                               FALSE
+                       ),
+                               // Negative test: This could be improved and the test moved to
+                               // the valid data provider if the method supports this
+                       'doubletick encapsulated quoted doubletick does not work' => array(
+                               array(
+                                       '"foo"bar"' => array(
+                                               'baz' => 42
+                                       ),
+                                       'bar' => array(),
+                               ),
+                               '"foo\"bar"/baz',
+                               42
+                       ),
+                               // Negative test: Method could be improved here
+                       'path with doubletick does not work' => array(
+                               array(
+                                       'fo"o' => array(
+                                               'bar' => 42,
+                                       ),
+                               ),
+                               'fo"o/foobar',
+                               42,
+                       ),
+               );
+       }
+
+       /**
+        * @test
+        * @dataProvider getValueByPathInvalidPathDataProvider
+        * @expectedException RuntimeException
+        */
+       public function getValueByPathThrowsExceptionIfPathNotExists(array $array, $path) {
+               t3lib_utility_Array::getValueByPath($array, $path);
+       }
+
+       /**
+        * Data provider for getValueByPathReturnsCorrectValue
+        * Every array splits into:
+        * - Array to get value from
+        * - String path
+        * - Expected result
+        */
+       public function getValueByPathValidDataProvider() {
+               $testObject = new StdClass();
+               $testObject->foo = 'foo';
+               $testObject->bar = 'bar';
+
+               return array(
+                       'integer in multi level array' => array(
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => 42,
+                                               ),
+                                               'bar2' => array(),
+                                       ),
+                               ),
+                               'foo/bar/baz',
+                               42,
+                       ),
+                       'zero integer in multi level array' => array(
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => 0,
+                                               ),
+                                       ),
+                               ),
+                               'foo/bar/baz',
+                               0,
+                       ),
+                       'NULL value in multi level array' => array(
+                               array(
+                                       'foo' => array(
+                                               'baz' => NULL,
+                                       ),
+                               ),
+                               'foo/baz',
+                               NULL,
+                       ),
+                       'get string value' => array(
+                               array(
+                                       'foo' => array(
+                                               'baz' => 'this is a test string',
+                                       ),
+                               ),
+                               'foo/baz',
+                               'this is a test string',
+                       ),
+                       'get boolean value: FALSE' => array(
+                               array(
+                                       'foo' => array(
+                                               'baz' => FALSE,
+                                       ),
+                               ),
+                               'foo/baz',
+                               FALSE,
+                       ),
+                       'get boolean value: TRUE' => array(
+                               array(
+                                       'foo' => array(
+                                               'baz' => TRUE,
+                                       ),
+                               ),
+                               'foo/baz',
+                               TRUE,
+                       ),
+                       'get object value' => array(
+                               array(
+                                       'foo' => array(
+                                               'baz' => $testObject,
+                                       ),
+                               ),
+                               'foo/baz',
+                               $testObject,
+                       ),
+                       'enclosed path' => array(
+                               array(
+                                       'foo/bar' => array(
+                                               'foobar' => 42,
+                                       ),
+                               ),
+                               '"foo/bar"/foobar',
+                               42,
+                       ),
+               );
+       }
+
+       /**
+        * @test
+        * @dataProvider getValueByPathValidDataProvider
+        */
+       public function getValueByPathGetsCorrectValue(array $array, $path, $expectedResult) {
+               $this->assertEquals(
+                       $expectedResult,
+                       t3lib_utility_Array::getValueByPath($array, $path)
+               );
+       }
+
+       /**
+        * @test
+        */
+       public function getValueByPathAccpetsDifferentDelimeter() {
+               $input = array(
+                       'foo' => array(
+                               'bar' => array(
+                                       'baz' => 42,
+                               ),
+                               'bar2' => array(),
+                       ),
+               );
+               $searchPath = 'foo%bar%baz';
+               $expected = 42;
+               $delimeter = '%';
+               $this->assertEquals($expected, t3lib_utility_Array::getValueByPath($input, $searchPath, $delimeter));
+       }
+
+       #######################
+       # Tests concerning setValueByPath
+       #######################
+
+       /**
+        * @test
+        * @expectedException RuntimeException
+        */
+       public function setValueByPathThrowsExceptionIfPathIsEmpty() {
+               t3lib_utility_Array::setValueByPath(array(), '', NULL);
+       }
+
+       /**
+        * @test
+        * @expectedException RuntimeException
+        */
+       public function setValueByPathThrowsExceptionIfPathIsNotAString() {
+               t3lib_utility_Array::setValueByPath(array(), array('foo'), NULL);
+       }
+
+       /**
+        * Data provider for setValueByPathSetsCorrectValueDataProvider
+        *
+        * Every array splits into:
+        * - Array to set value in
+        * - String path
+        * - Value to set
+        * - Expected result
+        */
+       public function setValueByPathSetsCorrectValueDataProvider() {
+               $testObject = new StdClass();
+               $testObject->foo = 'foo';
+               $testObject->bar = 'bar';
+
+               return array(
+                       'set integer value: 42' => array(
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => 0,
+                                               ),
+                                       ),
+                               ),
+                               'foo/bar/baz',
+                               42,
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => 42,
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       'set integer value: 0' => array(
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => 42,
+                                               ),
+                                       ),
+                               ),
+                               'foo/bar/baz',
+                               0,
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => 0,
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       'set null value' => array(
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => 42,
+                                               ),
+                                       ),
+                               ),
+                               'foo/bar/baz',
+                               NULL,
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => NULL,
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       'set array value' => array(
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => 42,
+                                               ),
+                                       ),
+                               ),
+                               'foo/bar/baz',
+                               array(
+                                       'foo' => 123,
+                               ),
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => array(
+                                                               'foo' => 123,
+                                                       ),
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       'set boolean value: FALSE' => array(
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => TRUE,
+                                               ),
+                                       ),
+                               ),
+                               'foo/bar/baz',
+                               FALSE,
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => FALSE,
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       'set boolean value: TRUE' => array(
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => NULL,
+                                               ),
+                                       ),
+                               ),
+                               'foo/bar/baz',
+                               TRUE,
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => TRUE,
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       'set object value' => array(
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => NULL,
+                                               ),
+                                       ),
+                               ),
+                               'foo/bar/baz',
+                               $testObject,
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => $testObject,
+                                               ),
+                                       ),
+                               ),
+                       ),
+                       'multi keys in array' => array(
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => 'value',
+                                               ),
+                                               'bar2' => array(
+                                                       'baz' => 'value',
+                                               ),
+                                       ),
+                               ),
+                               'foo/bar2/baz',
+                               'newValue',
+                               array(
+                                       'foo' => array(
+                                               'bar' => array(
+                                                       'baz' => 'value',
+                                               ),
+                                               'bar2' => array(
+                                                       'baz' => 'newValue',
+                                               ),
+                                       ),
+                               ),
+                       ),
+               );
+       }
+
+       /**
+        * @test
+        * @dataProvider setValueByPathSetsCorrectValueDataProvider
+        */
+       public function setValueByPathSetsCorrectValue(array $array, $path, $value, $expectedResult) {
+               $this->assertEquals(
+                       $expectedResult,
+                       t3lib_utility_Array::setValueByPath($array, $path, $value)
+               );
+       }
+
+       #######################
+       # Tests concerning sortByKeyRecursive
+       #######################
+
+       /**
+        * @test
+        */
+       public function sortByKeyRecursiveCheckIfSortingIsCorrect() {
+               $unsortedArray = array(
+                       'z' => NULL,
+                       'a' => NULL,
+                       'd' => array(
+                               'c' => NULL,
+                               'b' => NULL,
+                               'd' => NULL,
+                               'a' => NULL,
+                       ),
+               );
+               $expectedResult = array(
+                       'a' => NULL,
+                       'd' => array(
+                               'a' => NULL,
+                               'b' => NULL,
+                               'c' => NULL,
+                               'd' => NULL,
+                       ),
+                       'z' => NULL,
+               );
+               $this->assertSame($expectedResult, t3lib_utility_Array::sortByKeyRecursive($unsortedArray));
+       }
+
+       #######################
+       # Tests concerning arrayExport
+       #######################
+
+       /**
+        * @test
+        */
+       public function arrayExportReturnsFormattedMultidimensionalArray() {
+               $array = array(
+                       'foo' => array(
+                               'bar' => 42,
+                               'bar2' => array(
+                                       'baz' => 'val\'ue',
+                                       'baz2' => TRUE,
+                                       'baz3' => FALSE,
+                                       'baz4' => array(),
+                               ),
+                       ),
+                       'baz' => 23,
+                       'foobar' => NULL,
+               );
+               $expected = 'array(' . LF .
+                       TAB . '\'foo\' => array(' . LF .
+                               TAB . TAB . '\'bar\' => 42,' . LF .
+                               TAB . TAB . '\'bar2\' => array(' . LF .
+                               TAB . TAB . TAB . '\'baz\' => \'val\'ue\',' . LF .
+                               TAB . TAB . TAB . '\'baz2\' => TRUE,' . LF .
+                               TAB . TAB . TAB . '\'baz3\' => FALSE,' . LF .
+                               TAB . TAB . TAB . '\'baz4\' => array(),' . LF .
+                               TAB . TAB . '),' . LF .
+                       TAB . '),' . LF .
+                       TAB . '\'baz\' => 23,' . LF .
+                       TAB . '\'foobar\' => NULL,' . LF .
+               ')';
+
+               $this->assertSame($expected, t3lib_utility_Array::arrayExport($array));
+       }
+
+       /**
+        * @test
+        * @expectedException RuntimeException
+        */
+       public function arrayExportThrowsExceptionIfObjectShouldBeExported() {
+               $array = array(
+                       'foo' => array(
+                               'bar' => new stdClass(),
+                       ),
+               );
+               t3lib_utility_Array::arrayExport($array);
+       }
 }
 
 ?>
\ No newline at end of file
index b704cac..de6eab5 100644 (file)
@@ -80,8 +80,8 @@ class Typo3_Bootstrap_BaseSetupTest extends tx_phpunit_testcase {
                                '  public static function initializeGlobalVariables() {' .
                                '    return parent::initializeGlobalVariables();' .
                                '  }' .
-                               '  public static function loadDefaultTypo3ConfVars() {' .
-                               '    return parent::loadDefaultTypo3ConfVars();' .
+                               '  public static function loadDefaultConfiguration() {' .
+                               '    return parent::loadDefaultConfiguration();' .
                                '  }' .
                                '  public static function initializeGlobalTimeTrackingVariables() {' .
                                '    return parent::initializeGlobalTimeTrackingVariables();' .
@@ -210,9 +210,9 @@ class Typo3_Bootstrap_BaseSetupTest extends tx_phpunit_testcase {
        /**
         * @test
         */
-       public function loadDefaultTypo3ConfVarsPopulatesTypo3ConfVarsArray() {
+       public function loadDefaultConfigurationPopulatesTypo3ConfVarsArray() {
                unset($GLOBALS['TYPO3_CONF_VARS']);
-               Typo3_Bootstrap_BaseSetupAccessibleProxy::loadDefaultTypo3ConfVars();
+               Typo3_Bootstrap_BaseSetupAccessibleProxy::loadDefaultConfiguration();
                $this->assertInternalType('array', $GLOBALS['TYPO3_CONF_VARS']);
        }
 
index 87a6379..0ebd3d2 100644 (file)
@@ -186,75 +186,65 @@ class Typo3_Bootstrap {
        }
 
        /**
-        * Check typo3conf/localconf.php exists
+        * Populate the local configuration.
+        * Merge default TYPO3_CONF_VARS with content of typo3conf/LocalConfiguration.php,
+        * execute typo3conf/AdditionalConfiguration.php, define database related constants.
         *
-        * @throws RuntimeException
         * @return Typo3_Bootstrap
         */
-       public function checkLocalconfExistsOrDie() {
-               if (!@is_file(PATH_typo3conf . 'localconf.php')) {
-                       throw new RuntimeException('localconf.php is not found!', 1333754332);
-               }
-
-               return $this;
-       }
-
-       /**
-        * Set global database variables to empty string.
-        * Database-variables are cleared!
-        *
-        * @TODO: Figure out why we do this (security reasons with register globals?)
-        * @return Typo3_Bootstrap
-        */
-       public function setGlobalDatabaseVariablesToEmptyString() {
-                       // The database name
-               $GLOBALS['typo_db'] = '';
-                       // The database username
-               $GLOBALS['typo_db_username'] = '';
-                       // The database password
-               $GLOBALS['typo_db_password'] = '';
-                       // The database host
-               $GLOBALS['typo_db_host'] = '';
-                       // The filename of an additional script in typo3conf/-folder which is included after
-                       // tables.php. Code in this script should modify the tables.php-configuration only,
-                       // and this provides a good way to extend the standard-distributed tables.php file.
-               $GLOBALS['typo_db_extTableDef_script'] = '';
-
-               return $this;
-       }
+       public function populateLocalConfiguration() {
+               if (@is_file(PATH_site . t3lib_Configuration::LOCAL_CONFIGURATION_FILE)) {
+                       $localConfiguration = t3lib_Configuration::getLocalConfiguration();
+                       if (is_array($localConfiguration)) {
+                               $GLOBALS['TYPO3_CONF_VARS'] = t3lib_div::array_merge_recursive_overrule(
+                                       $GLOBALS['TYPO3_CONF_VARS'],
+                                       $localConfiguration
+                               );
+                       } else {
+                               die('LocalConfiguration invalid.');
+                       }
 
-       /**
-        * Loads the main configuration file (localconf.php)
-        *
-        * @return Typo3_Bootstrap
-        */
-       public function loadMainConfigurationFile() {
-               global $TYPO3_CONF_VARS, $typo_db, $typo_db_username, $typo_db_password, $typo_db_host, $typo_db_extTableDef_script;
-               require(PATH_typo3conf . 'localconf.php');
+                       if (@is_file(PATH_site . t3lib_Configuration::ADDITIONAL_CONFIGURATION_FILE)) {
+                               require(PATH_site . t3lib_Configuration::ADDITIONAL_CONFIGURATION_FILE);
+                       }
 
-               return $this;
-       }
+                       define('TYPO3_db', $GLOBALS['TYPO3_CONF_VARS']['DB']['database']);
+                       define('TYPO3_db_username', $GLOBALS['TYPO3_CONF_VARS']['DB']['username']);
+                       define('TYPO3_db_password', $GLOBALS['TYPO3_CONF_VARS']['DB']['password']);
+                       define('TYPO3_db_host', $GLOBALS['TYPO3_CONF_VARS']['DB']['host']);
+                       define('TYPO3_extTableDef_script', $GLOBALS['TYPO3_CONF_VARS']['DB']['extTablesDefinitionScript']);
+
+                       unset($GLOBALS['TYPO3_CONF_VARS']['DB']);
+               } elseif (@is_file(PATH_site . t3lib_Configuration::LOCALCONF_FILE)) {
+                               // Legacy localconf.php handling
+                               // @deprecated: Can be removed if old localconf.php is not supported anymore
+                       global $TYPO3_CONF_VARS, $typo_db, $typo_db_username, $typo_db_password, $typo_db_host, $typo_db_extTableDef_script;
+
+                       require(PATH_site . t3lib_Configuration::LOCALCONF_FILE);
+
+                               // If the localconf.php was not upgraded to LocalConfiguration.php, the default extListArray
+                               // from t3lib/stddb/DefaultConfiguration.php is still set. In this case we just unset
+                               // this key here, so t3lib_extMgm::getLoadedExtensionListArray() falls back to use extList string
+                               // @deprecated: This case can be removed later if localconf.php is not supported anymore
+                       unset($TYPO3_CONF_VARS['EXT']['extListArray']);
+
+                       define('TYPO3_db', $typo_db);
+                       define('TYPO3_db_username', $typo_db_username);
+                       define('TYPO3_db_password', $typo_db_password);
+                       define('TYPO3_db_host', $typo_db_host);
+                       define('TYPO3_extTableDef_script', $typo_db_extTableDef_script);
+
+                       unset($GLOBALS['typo_db']);
+                       unset($GLOBALS['typo_db_username']);
+                       unset($GLOBALS['typo_db_password']);
+                       unset($GLOBALS['typo_db_host']);
+                       unset($GLOBALS['typo_db_extTableDef_script']);
+               } else {
+                       die(t3lib_Configuration::LOCALCONF_FILE . ' not found!');
+               }
 
-       /**
-        * Define the database setup as constants
-        * and unset no longer needed global variables
-        *
-        * @return Typo3_Bootstrap
-        */
-       public function defineTypo3DatabaseConstants() {
-               define('TYPO3_db', $GLOBALS['typo_db']);
-               define('TYPO3_db_username', $GLOBALS['typo_db_username']);
-               define('TYPO3_db_password', $GLOBALS['typo_db_password']);
-               define('TYPO3_db_host', $GLOBALS['typo_db_host']);
-               define('TYPO3_extTableDef_script', $GLOBALS['typo_db_extTableDef_script']);
                define('TYPO3_user_agent', 'User-Agent: '. $GLOBALS['TYPO3_CONF_VARS']['HTTP']['userAgent']);
 
-               unset($GLOBALS['typo_db']);
-               unset($GLOBALS['typo_db_username']);
-               unset($GLOBALS['typo_db_password']);
-               unset($GLOBALS['typo_db_host']);
-               unset($GLOBALS['typo_db_extTableDef_script']);
-
                return $this;
        }
 
index a0fef87..17b2635 100644 (file)
@@ -59,7 +59,7 @@ class Typo3_Bootstrap_BaseSetup {
                self::handleMagicQuotesGpc();
                self::addCorePearPathToIncludePath();
                self::initializeGlobalVariables();
-               self::loadDefaultTypo3ConfVars();
+               self::loadDefaultConfiguration();
                self::initializeGlobalTimeTrackingVariables();
                self::initializeBasicErrorReporting();
        }
@@ -206,6 +206,8 @@ class Typo3_Bootstrap_BaseSetup {
                /** @define "PATH_t3lib" "../../../t3lib/" */
                require_once(PATH_t3lib . 'class.t3lib_div.php');
 
+               require_once(PATH_t3lib . 'utility/class.t3lib_utility_array.php');
+               require_once(PATH_t3lib . 'class.t3lib_configuration.php');
                require_once(PATH_t3lib . 'class.t3lib_extmgm.php');
 
                require_once(PATH_t3lib . 'class.t3lib_cache.php');
@@ -282,8 +284,8 @@ class Typo3_Bootstrap_BaseSetup {
         *
         * @return void
         */
-       protected static function loadDefaultTypo3ConfVars() {
-               $GLOBALS['TYPO3_CONF_VARS'] = require(PATH_t3lib . 'stddb/DefaultSettings.php');
+       protected static function loadDefaultConfiguration() {
+               $GLOBALS['TYPO3_CONF_VARS'] = t3lib_Configuration::getDefaultConfiguration();
        }
 
        /**
index aecc85e..da8f415 100755 (executable)
@@ -49,10 +49,7 @@ require('classes/Bootstrap.php');
 Typo3_Bootstrap::getInstance()
        ->baseSetup('typo3/')
        ->registerExtDirectComponents()
-       ->checkLocalconfExistsOrDie()
-       ->setGlobalDatabaseVariablesToEmptyString()
-       ->loadMainConfigurationFile()
-       ->defineTypo3DatabaseConstants()
+       ->populateLocalConfiguration()
        ->initializeCachingFramework()
        ->registerAutoloader()
        ->checkUtf8DatabaseSettingsOrDie()
index d68264d..86b9dd3 100644 (file)
@@ -64,10 +64,7 @@ Typo3_Bootstrap::getInstance()
        ->startOutputBuffering()
        ->baseSetup('typo3/')
        ->registerExtDirectComponents()
-       ->checkLocalconfExistsOrDie()
-       ->setGlobalDatabaseVariablesToEmptyString()
-       ->loadMainConfigurationFile()
-       ->defineTypo3DatabaseConstants()
+       ->populateLocalConfiguration()
        ->initializeCachingFramework()
        ->registerAutoloader()
        ->checkUtf8DatabaseSettingsOrDie()
index f85d76c..b500e85 100755 (executable)
@@ -47,10 +47,7 @@ Typo3_Bootstrap_Install::checkEnabledInstallToolOrDie();
 
 Typo3_Bootstrap::getInstance()
        ->registerExtDirectComponents()
-       ->checkLocalconfExistsOrDie()
-       ->setGlobalDatabaseVariablesToEmptyString()
-       ->loadMainConfigurationFile()
-       ->defineTypo3DatabaseConstants()
+       ->populateLocalConfiguration()
        ->initializeCachingFramework()
        ->registerAutoloader()
        ->checkUtf8DatabaseSettingsOrDie()
index 4454a82..6da8f4b 100644 (file)
@@ -47,10 +47,7 @@ ob_start();
 
 Typo3_Bootstrap::getInstance()
        ->registerExtDirectComponents()
-       ->checkLocalconfExistsOrDie()
-       ->setGlobalDatabaseVariablesToEmptyString()
-       ->loadMainConfigurationFile()
-       ->defineTypo3DatabaseConstants()
+       ->populateLocalConfiguration()
        ->initializeCachingFramework()
        ->registerAutoloader()
        ->checkUtf8DatabaseSettingsOrDie()
index e3bde3e..a5fb864 100644 (file)
@@ -249,7 +249,7 @@ class tx_em_Extensions_List {
 
                                $list[$key]['categoryShort'] = $list[$key]['category'];
                                $list[$key]['category'] = isset($this->categories[$list[$key]['category']]) ? $this->categories[$list[$key]['category']] : $list[$key]['category'];
-                               $list[$key]['required'] = t3lib_div::inList(t3lib_extMgm::getRequiredExtensionList(), $extKey);
+                               $list[$key]['required'] = in_array($extKey, t3lib_extMgm::getRequiredExtensionListArray(), TRUE);
 
                                $constraints = $this->humanizeConstraints($list[$key]['constraints']);
                                $list[$key]['depends'] = $constraints['depends'];
@@ -930,7