From 1f4c2cf30f105a83d6ef22086968c20254ad19bf Mon Sep 17 00:00:00 2001
From: catch <catch@35733.no-reply.drupal.org>
Date: Mon, 7 Jan 2013 11:45:26 +0000
Subject: [PATCH] Issue #1833516 by Berdir, chx, catch, webchick: Add $settings
 for low-level configuration - move things out of .

---
 core/authorize.php                            |   4 +-
 core/includes/bootstrap.inc                   |  42 ++-
 core/includes/common.inc                      |  16 +-
 core/includes/database.inc                    |   2 +-
 core/includes/install.core.inc                |   2 +-
 core/includes/theme.maintenance.inc           |   2 +-
 .../lib/Drupal/Component/Utility/Settings.php |  59 ++++
 .../lib/Drupal/simpletest/TestBase.php        |  24 ++
 .../system/config/system.performance.yml      |   1 -
 .../system/Tests/Bootstrap/IpAddressTest.php  |   6 +-
 .../Tests/System/SystemAuthorizeTest.php      |   2 -
 core/modules/system/system.install            |   6 +-
 .../Drupal/update/Tests/UpdateContribTest.php |   1 -
 .../Drupal/update/Tests/UpdateUploadTest.php  |   1 -
 core/modules/update/update.manager.inc        |   2 +-
 core/modules/update/update.module             |   2 +-
 core/update.php                               |  12 +-
 sites/default/default.settings.php            | 275 +++++++++---------
 18 files changed, 285 insertions(+), 174 deletions(-)
 create mode 100644 core/lib/Drupal/Component/Utility/Settings.php

diff --git a/core/authorize.php b/core/authorize.php
index 7f808509ccf8..46c6a29a3e2a 100644
--- a/core/authorize.php
+++ b/core/authorize.php
@@ -12,7 +12,7 @@
  * a multistep process. This script actually performs the selected operations
  * without loading all of Drupal, to be able to more gracefully recover from
  * errors. Access to the script is controlled by a global killswitch in
- * settings.php ('allow_operations') and via the 'administer software
+ * settings.php ('allow_authorize_operations') and via the 'administer software
  * updates' permission.
  *
  * There are helper functions for setting up an operation to run via this
@@ -58,7 +58,7 @@ function authorize_access_denied_page() {
  *   TRUE if the current user can run authorize.php, and FALSE if not.
  */
 function authorize_access_allowed() {
-  return config('system.authorize')->get('allow_operations') && user_access('administer software updates');
+  return settings()->get('allow_authorize_operations', TRUE) && user_access('administer software updates');
 }
 
 // *** Real work of the script begins here. ***
diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 12ab6e9bc664..353714e7cc30 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -1,6 +1,7 @@
 <?php
 
 use Drupal\Component\Utility\NestedArray;
+use Drupal\Component\Utility\Settings;
 use Drupal\Core\DrupalKernel;
 use Drupal\Core\Database\Database;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
@@ -719,7 +720,7 @@ function drupal_settings_initialize() {
   global $base_url, $base_path, $base_root, $script_path;
 
   // Export these settings.php variables to the global namespace.
-  global $databases, $cookie_domain, $conf, $installed_profile, $update_free_access, $class_loader, $db_url, $db_prefix, $drupal_hash_salt, $is_https, $base_secure_url, $base_insecure_url, $config_directories;
+  global $databases, $cookie_domain, $conf, $installed_profile, $db_url, $db_prefix, $drupal_hash_salt, $is_https, $base_secure_url, $base_insecure_url, $config_directories;
   $conf = array();
 
   // Make conf_path() available as local variable in settings.php.
@@ -727,6 +728,8 @@ function drupal_settings_initialize() {
   if (is_readable(DRUPAL_ROOT . '/' . $conf_path . '/settings.php')) {
     include_once DRUPAL_ROOT . '/' . $conf_path . '/settings.php';
   }
+  require_once DRUPAL_ROOT . '/core/lib/Drupal/Component/Utility/Settings.php';
+  new Settings(isset($settings) ? $settings : array());
   $is_https = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on';
 
   if (isset($base_url)) {
@@ -944,6 +947,20 @@ function drupal_get_filename($type, $name, $filename = NULL) {
   }
 }
 
+/**
+ * Returns a setting.
+ *
+ * Settings can be set in settings.php in the $settings array and requested
+ * by this function. Settings should be used over configuration for read-only,
+ * possibly low bootstrap configuration that is environment specific.
+ *
+ * @return \Drupal\Component\Utility\Settings
+ *   The settings object.
+ */
+function settings() {
+  return Settings::$singleton;
+}
+
 /**
  * Loads the persistent variable table.
  *
@@ -1391,7 +1408,7 @@ function drupal_serve_page_from_cache(stdClass $cache) {
   // response to reply to a subsequent request for a given URL without
   // revalidation. If a Vary header has been set in hook_boot(), it is assumed
   // that the module knows how to cache the page.
-  if (!isset($hook_boot_headers['vary']) && !config('system.performance')->get('cache.page.omit_vary_cookie')) {
+  if (!isset($hook_boot_headers['vary']) && !settings()->get('omit_vary_cookie')) {
     header('Vary: Cookie');
   }
 
@@ -2120,7 +2137,7 @@ function drupal_bootstrap($phase = NULL, $new_phase = TRUE) {
           break;
 
         case DRUPAL_BOOTSTRAP_SESSION:
-          require_once DRUPAL_ROOT . '/' . variable_get('session_inc', 'core/includes/session.inc');
+          require_once DRUPAL_ROOT . '/' . settings()->get('session_inc', 'core/includes/session.inc');
           drupal_session_initialize();
           break;
 
@@ -2311,7 +2328,7 @@ function _drupal_bootstrap_page_cache() {
     require_once DRUPAL_ROOT . '/' . $include;
   }
   // Check for a cache mode force from settings.php.
-  if (variable_get('page_cache_without_database')) {
+  if (settings()->get('page_cache_without_database')) {
     $cache_enabled = TRUE;
   }
   else {
@@ -3016,12 +3033,12 @@ function ip_address() {
   if (!isset($ip_address)) {
     $ip_address = $_SERVER['REMOTE_ADDR'];
 
-    if (variable_get('reverse_proxy', 0)) {
-      $reverse_proxy_header = variable_get('reverse_proxy_header', 'HTTP_X_FORWARDED_FOR');
+    if (settings()->get('reverse_proxy', 0)) {
+      $reverse_proxy_header = settings()->get('reverse_proxy_header', 'HTTP_X_FORWARDED_FOR');
       if (!empty($_SERVER[$reverse_proxy_header])) {
         // If an array of known reverse proxy IPs is provided, then trust
         // the XFF header if request really comes from one of them.
-        $reverse_proxy_addresses = variable_get('reverse_proxy_addresses', array());
+        $reverse_proxy_addresses = settings()->get('reverse_proxy_addresses', array());
 
         // Turn XFF header into an array.
         $forwarded = explode(',', $_SERVER[$reverse_proxy_header]);
@@ -3051,20 +3068,27 @@ function ip_address() {
  * classes, interfaces, and traits (PHP 5.4 and later). It's only dependency
  * is DRUPAL_ROOT. Otherwise it may be called as early as possible.
  *
+ * @param $class_loader
+ *   The name of class loader to use. This can be used to change the class
+ *   loader class when calling drupal_classloader() from settings.php. It is
+ *   ignored otherwise.
+ *
  * @return Symfony\Component\ClassLoader\UniversalClassLoader
  *   A UniversalClassLoader class instance (or extension thereof).
  */
-function drupal_classloader() {
+function drupal_classloader($class_loader = NULL) {
   // By default, use the UniversalClassLoader which is best for development,
   // as it does not break when code is moved on the file system. However, as it
   // is slow, allow to use the APC class loader in production.
   static $loader;
 
   if (!isset($loader)) {
-    global $class_loader;
 
     // Include the Symfony ClassLoader for loading PSR-0-compatible classes.
     require_once DRUPAL_ROOT . '/core/vendor/symfony/class-loader/Symfony/Component/ClassLoader/UniversalClassLoader.php';
+    if (!isset($class_loader) && class_exists('Drupal\Component\Utility\Settings', FALSE)) {
+      $class_loader = settings()->get('class_loader');
+    }
 
     switch ($class_loader) {
       case 'apc':
diff --git a/core/includes/common.inc b/core/includes/common.inc
index a8ba090f7f9b..bd263ecd8623 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -809,7 +809,7 @@ function drupal_http_request($url, array $options = array()) {
   $options['timeout'] = (float) $options['timeout'];
 
   // Use a proxy if one is defined and the host is not on the excluded list.
-  $proxy_server = variable_get('proxy_server', '');
+  $proxy_server = settings()->get('proxy_server', '');
   if ($proxy_server && _drupal_http_use_proxy($uri['host'])) {
     // Set the scheme so we open a socket to the proxy server.
     $uri['scheme'] = 'proxy';
@@ -819,13 +819,13 @@ function drupal_http_request($url, array $options = array()) {
     unset($uri['query']);
 
     // Add in username and password to Proxy-Authorization header if needed.
-    if ($proxy_username = variable_get('proxy_username', '')) {
-      $proxy_password = variable_get('proxy_password', '');
+    if ($proxy_username = settings()->get('proxy_username', '')) {
+      $proxy_password = settings()->get('proxy_password', '');
       $options['headers']['Proxy-Authorization'] = 'Basic ' . base64_encode($proxy_username . (!empty($proxy_password) ? ":" . $proxy_password : ''));
     }
     // Some proxies reject requests with any User-Agent headers, while others
     // require a specific one.
-    $proxy_user_agent = variable_get('proxy_user_agent', '');
+    $proxy_user_agent = settings()->get('proxy_user_agent', '');
     // The default value matches neither condition.
     if ($proxy_user_agent === NULL) {
       unset($options['headers']['User-Agent']);
@@ -838,7 +838,7 @@ function drupal_http_request($url, array $options = array()) {
   switch ($uri['scheme']) {
     case 'proxy':
       // Make the socket connection to a proxy server.
-      $socket = 'tcp://' . $proxy_server . ':' . variable_get('proxy_port', 8080);
+      $socket = 'tcp://' . $proxy_server . ':' . settings()->get('proxy_port', 8080);
       // The Host header still needs to match the real request.
       $options['headers']['Host'] = $uri['host'];
       $options['headers']['Host'] .= isset($uri['port']) && $uri['port'] != 80 ? ':' . $uri['port'] : '';
@@ -1068,7 +1068,7 @@ function drupal_http_request($url, array $options = array()) {
  *   TRUE if a proxy should be used for this host.
  */
 function _drupal_http_use_proxy($host) {
-  $proxy_exceptions = variable_get('proxy_exceptions', array('localhost', '127.0.0.1'));
+  $proxy_exceptions = settings()->get('proxy_exceptions', array('localhost', '127.0.0.1'));
   return !in_array(strtolower($host), $proxy_exceptions, TRUE);
 }
 
@@ -4757,10 +4757,10 @@ function drupal_valid_token($token, $value = '', $skip_anonymous = FALSE) {
  * Loads code for subsystems and modules, and registers stream wrappers.
  */
 function _drupal_bootstrap_code() {
-  require_once DRUPAL_ROOT . '/' . variable_get('path_inc', 'core/includes/path.inc');
+  require_once DRUPAL_ROOT . '/' . settings()->get('path_inc', 'core/includes/path.inc');
   require_once DRUPAL_ROOT . '/core/includes/theme.inc';
   require_once DRUPAL_ROOT . '/core/includes/pager.inc';
-  require_once DRUPAL_ROOT . '/' . variable_get('menu_inc', 'core/includes/menu.inc');
+  require_once DRUPAL_ROOT . '/' . settings()->get('menu_inc', 'core/includes/menu.inc');
   require_once DRUPAL_ROOT . '/core/includes/tablesort.inc';
   require_once DRUPAL_ROOT . '/core/includes/file.inc';
   require_once DRUPAL_ROOT . '/core/includes/unicode.inc';
diff --git a/core/includes/database.inc b/core/includes/database.inc
index 0cbaaa606122..15ffcc3d5633 100644
--- a/core/includes/database.inc
+++ b/core/includes/database.inc
@@ -905,7 +905,7 @@ function db_ignore_slave() {
     // Five minutes is long enough to allow the slave to break and resume
     // interrupted replication without causing problems on the Drupal site from
     // the old data.
-    $duration = variable_get('maximum_replication_lag', 300);
+    $duration = settings()->get('maximum_replication_lag', 300);
     // Set session variable with amount of time to delay before using slave.
     $_SESSION['ignore_slave_server'] = REQUEST_TIME + $duration;
   }
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 755c2c1ff0a4..5223cc5b0932 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -279,7 +279,7 @@ function install_begin_request(&$install_state) {
   require_once DRUPAL_ROOT . '/core/includes/file.inc';
   require_once DRUPAL_ROOT . '/core/includes/install.inc';
   require_once DRUPAL_ROOT . '/core/includes/schema.inc';
-  require_once DRUPAL_ROOT . '/' . variable_get('path_inc', 'core/includes/path.inc');
+  require_once DRUPAL_ROOT . '/' . settings()->get('path_inc', 'core/includes/path.inc');
 
   // Load module basics (needed for hook invokes).
   include_once DRUPAL_ROOT . '/core/includes/module.inc';
diff --git a/core/includes/theme.maintenance.inc b/core/includes/theme.maintenance.inc
index 4b3e80ceac40..4aa0a131f4b2 100644
--- a/core/includes/theme.maintenance.inc
+++ b/core/includes/theme.maintenance.inc
@@ -22,7 +22,7 @@ function _drupal_maintenance_theme() {
     return;
   }
 
-  require_once DRUPAL_ROOT . '/' . variable_get('path_inc', 'core/includes/path.inc');
+  require_once DRUPAL_ROOT . '/' . settings()->get('path_inc', 'core/includes/path.inc');
   require_once DRUPAL_ROOT . '/core/includes/theme.inc';
   require_once DRUPAL_ROOT . '/core/includes/common.inc';
   require_once DRUPAL_ROOT . '/core/includes/unicode.inc';
diff --git a/core/lib/Drupal/Component/Utility/Settings.php b/core/lib/Drupal/Component/Utility/Settings.php
new file mode 100644
index 000000000000..3f804ad24d98
--- /dev/null
+++ b/core/lib/Drupal/Component/Utility/Settings.php
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Component\Utility\Settings.
+ */
+
+namespace Drupal\Component\Utility;
+
+class Settings {
+
+  /**
+   * @var array
+   */
+  protected $storage;
+
+  /**
+   * @var Settings
+   */
+  static $singleton;
+
+  /**
+   * @param array $settings
+   */
+  function __construct(array $settings) {
+    $this->storage = $settings;
+    self::$singleton = $this;
+  }
+
+  /**
+   * Returns a setting.
+   *
+   * Settings can be set in settings.php in the $settings array and requested
+   * by this function. Settings should be used over configuration for read-only,
+   * possibly low bootstrap configuration that is environment specific.
+   *
+   * @param string $name
+   *   The name of the setting to return.
+   * @param mixed $default
+   *   (optional) The default value to use if this setting is not set.
+   *
+   * @return mixed
+   *   The value of the setting, the provided default if not set.
+   */
+  public function get($name, $default = NULL) {
+    return isset($this->storage[$name]) ? $this->storage[$name] : $default;
+  }
+
+  /**
+   * Returns all the settings. This is only used for testing purposes.
+   *
+   * @return array
+   *   All the settings.
+   */
+  public function getAll() {
+    return $this->storage;
+  }
+
+}
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
index 0fb4e398e359..4d72998abdb7 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
@@ -8,6 +8,7 @@
 namespace Drupal\simpletest;
 
 use Drupal\Core\Database\Database;
+use Drupal\Component\Utility\Settings;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Database\ConnectionNotDefinedException;
 use Drupal\Core\DrupalKernel;
@@ -137,6 +138,11 @@ abstract class TestBase {
    */
   protected $verboseDirectoryUrl;
 
+  /**
+   * The settings array.
+   */
+  protected $originalSettings;
+
   /**
    * Constructor for Test.
    *
@@ -814,6 +820,7 @@ protected function prepareEnvironment() {
     }
 
     // Backup current in-memory configuration.
+    $this->originalSettings = settings()->getAll();
     $this->originalConf = $conf;
 
     // Backup statics and globals.
@@ -1012,6 +1019,7 @@ protected function tearDown() {
 
     // Restore original in-memory configuration.
     $conf = $this->originalConf;
+    new Settings($this->originalSettings);
 
     // Restore original statics and globals.
     drupal_container($this->originalContainer);
@@ -1091,6 +1099,22 @@ protected function exceptionHandler($exception) {
     $this->error($message, 'Uncaught exception', _drupal_get_last_caller($backtrace));
   }
 
+  /**
+   * Changes in memory settings.
+   *
+   * @param $name
+   *   The name of the setting to return.
+   * @param $value
+   *   The value of the setting.
+   *
+   * @see \Drupal\Component\Utility\Settings::get()
+   */
+  protected function settingsSet($name, $value) {
+    $settings = settings()->getAll();
+    $settings[$name] = $value;
+    new Settings($settings);
+  }
+
   /**
    * Generates a random string of ASCII characters of codes 32 to 126.
    *
diff --git a/core/modules/system/config/system.performance.yml b/core/modules/system/config/system.performance.yml
index 61adb180d148..d508591d7e57 100644
--- a/core/modules/system/config/system.performance.yml
+++ b/core/modules/system/config/system.performance.yml
@@ -1,7 +1,6 @@
 cache:
   page:
     enabled: '0'
-    omit_vary_cookie: ''
     max_age: '0'
 css:
   preprocess: '0'
diff --git a/core/modules/system/lib/Drupal/system/Tests/Bootstrap/IpAddressTest.php b/core/modules/system/lib/Drupal/system/Tests/Bootstrap/IpAddressTest.php
index a6f87ef8ef12..c062aa62b471 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Bootstrap/IpAddressTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Bootstrap/IpAddressTest.php
@@ -58,14 +58,14 @@ function testIPAddressHost() {
     );
 
     // Proxy forwarding on but no proxy addresses defined.
-    variable_set('reverse_proxy', 1);
+    $this->settingsSet('reverse_proxy',  1);
     $this->assertTrue(
       ip_address() == $this->remote_ip,
       'Proxy forwarding without trusted proxies got remote IP address.'
     );
 
     // Proxy forwarding on and proxy address not trusted.
-    variable_set('reverse_proxy_addresses', array($this->proxy_ip, $this->proxy2_ip));
+    $this->settingsSet('reverse_proxy_addresses', array($this->proxy_ip, $this->proxy2_ip));
     drupal_static_reset('ip_address');
     $_SERVER['REMOTE_ADDR'] = $this->untrusted_ip;
     $this->assertTrue(
@@ -92,7 +92,7 @@ function testIPAddressHost() {
     );
 
     // Custom client-IP header.
-    variable_set('reverse_proxy_header', 'HTTP_X_CLUSTER_CLIENT_IP');
+    $this->settingsSet('reverse_proxy_header', 'HTTP_X_CLUSTER_CLIENT_IP');
     $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'] = $this->cluster_ip;
     drupal_static_reset('ip_address');
     $this->assertTrue(
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/SystemAuthorizeTest.php b/core/modules/system/lib/Drupal/system/Tests/System/SystemAuthorizeTest.php
index 730886d6a18e..3b2dc19ec27f 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/SystemAuthorizeTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/SystemAuthorizeTest.php
@@ -32,8 +32,6 @@ public static function getInfo() {
   function setUp() {
     parent::setUp();
 
-    variable_set('allow_authorize_operations', TRUE);
-
     // Create an administrator user.
     $this->admin_user = $this->drupalCreateUser(array('administer software updates'));
     $this->drupalLogin($this->admin_user);
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 8c7d72a32f73..b632a2f50634 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -416,11 +416,11 @@ function system_requirements($phase) {
 
   // Verify the update.php access setting
   if ($phase == 'runtime') {
-    if (!empty($GLOBALS['update_free_access'])) {
+    if (settings()->get('update_free_access')) {
       $requirements['update access'] = array(
         'value' => $t('Not protected'),
         'severity' => REQUIREMENT_ERROR,
-        'description' => $t('The update.php script is accessible to everyone without authentication check, which is a security risk. You must change the $update_free_access value in your settings.php back to FALSE.'),
+        'description' => $t('The update.php script is accessible to everyone without authentication check, which is a security risk. You must change the @settings_name value in your settings.php back to FALSE.', array('@settings_name' => '$settings[\'update_free_access\']')),
       );
     }
     else {
@@ -1873,7 +1873,6 @@ function system_update_8017() {
     'page_compression' => 'response.gzip',
     'preprocess_css' => 'css.preprocess',
     'preprocess_js' => 'js.preprocess',
-    'omit_vary_cookie' => 'omit_vary_cookie',
     'stale_file_threshold' => 'stale_file_threshold',
   ));
 }
@@ -2118,7 +2117,6 @@ function system_update_8029() {
  */
 function system_update_8030() {
   update_variables_to_config('system.authorize', array(
-    'allow_authorize_operations' => 'allow_operations',
     'authorize_filetransfer_default' => 'filetransfer_default',
   ));
 }
diff --git a/core/modules/update/lib/Drupal/update/Tests/UpdateContribTest.php b/core/modules/update/lib/Drupal/update/Tests/UpdateContribTest.php
index af7d0358d411..2817c86a96a1 100644
--- a/core/modules/update/lib/Drupal/update/Tests/UpdateContribTest.php
+++ b/core/modules/update/lib/Drupal/update/Tests/UpdateContribTest.php
@@ -327,7 +327,6 @@ function testUpdateBrokenFetchURL() {
    * update, then assert if we see the appropriate warnings on the right pages.
    */
   function testHookUpdateStatusAlter() {
-    variable_set('allow_authorize_operations', TRUE);
     $update_test_config = config('update_test.settings');
     $update_admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer software updates'));
     $this->drupalLogin($update_admin_user);
diff --git a/core/modules/update/lib/Drupal/update/Tests/UpdateUploadTest.php b/core/modules/update/lib/Drupal/update/Tests/UpdateUploadTest.php
index 4917630c6d49..d3bcdb8bf486 100644
--- a/core/modules/update/lib/Drupal/update/Tests/UpdateUploadTest.php
+++ b/core/modules/update/lib/Drupal/update/Tests/UpdateUploadTest.php
@@ -29,7 +29,6 @@ public static function getInfo() {
 
   public function setUp() {
     parent::setUp();
-    variable_set('allow_authorize_operations', TRUE);
     $admin_user = $this->drupalCreateUser(array('administer software updates', 'administer site configuration'));
     $this->drupalLogin($admin_user);
   }
diff --git a/core/modules/update/update.manager.inc b/core/modules/update/update.manager.inc
index 062ffcae61b6..0047a52b0fd9 100644
--- a/core/modules/update/update.manager.inc
+++ b/core/modules/update/update.manager.inc
@@ -7,7 +7,7 @@
  * This allows site administrators with the 'administer software updates'
  * permission to either upgrade existing projects, or download and install new
  * ones, so long as the killswitch setting ('allow_authorize_operations') is
- * still TRUE.
+ * not FALSE.
  *
  * To install new code, the administrator is prompted for either the URL of an
  * archive file, or to directly upload the archive file. The archive is loaded
diff --git a/core/modules/update/update.module b/core/modules/update/update.module
index 865caeaec31b..00ef87943595 100644
--- a/core/modules/update/update.module
+++ b/core/modules/update/update.module
@@ -251,7 +251,7 @@ function update_menu() {
  * @see update_menu()
  */
 function update_manager_access() {
-  return config('system.authorize')->get('allow_operations') && user_access('administer software updates');
+  return settings()->get('allow_authorize_operations', TRUE) && user_access('administer software updates');
 }
 
 /**
diff --git a/core/update.php b/core/update.php
index ff65c6ef3727..17b44fd096a0 100644
--- a/core/update.php
+++ b/core/update.php
@@ -209,8 +209,8 @@ function update_results_page() {
     $output .= '</p>';
   }
 
-  if (!empty($GLOBALS['update_free_access'])) {
-    $output .= "<p><strong>Reminder: don't forget to set the <code>\$update_free_access</code> value in your <code>settings.php</code> file back to <code>FALSE</code>.</strong></p>";
+  if (settings()->get('update_free_access')) {
+    $output .= "<p><strong>Reminder: don't forget to set the <code>\$settings['update_free_access']</code> value in your <code>settings.php</code> file back to <code>FALSE</code>.</strong></p>";
   }
 
   $output .= theme('links', array('links' => update_helpful_links()));
@@ -311,8 +311,8 @@ function update_access_denied_page() {
   return '<p>Access denied. You are not authorized to access this page. Log in using either an account with the <em>administer software updates</em> permission or the site maintenance account (the account you created during installation). If you cannot log in, you will have to edit <code>settings.php</code> to bypass this access check. To do this:</p>
 <ol>
  <li>With a text editor find the settings.php file on your system. From the main Drupal directory that you installed all the files into, go to <code>sites/your_site_name</code> if such directory exists, or else to <code>sites/default</code> which applies otherwise.</li>
- <li>There is a line inside your settings.php file that says <code>$update_free_access = FALSE;</code>. Change it to <code>$update_free_access = TRUE;</code>.</li>
- <li>As soon as the update.php script is done, you must change the settings.php file back to its original form with <code>$update_free_access = FALSE;</code>.</li>
+ <li>There is a line inside your settings.php file that says <code>$settings[\'update_free_access\'] = FALSE;</code>. Change it to <code>$settings[\'update_free_access\'] = TRUE;</code>.</li>
+ <li>As soon as the update.php script is done, you must change the settings.php file back to its original form with <code>$settings[\'update_free_access\'] = FALSE;</code>.</li>
  <li>To avoid having this problem in the future, remember to log in to your website using either an account with the <em>administer software updates</em> permission or the site maintenance account (the account you created during installation) before you backup your database at the beginning of the update process.</li>
 </ol>';
 }
@@ -324,10 +324,10 @@ function update_access_denied_page() {
  *   TRUE if the current user should be granted access, or FALSE otherwise.
  */
 function update_access_allowed() {
-  global $update_free_access, $user;
+  global $user;
 
   // Allow the global variable in settings.php to override the access check.
-  if (!empty($update_free_access)) {
+  if (settings()->get('update_free_access')) {
     return TRUE;
   }
   // Calls to user_access() might fail during the Drupal 6 to 7 update process,
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
index e60b2f5f9ad6..8dbb5a71b190 100644
--- a/sites/default/default.settings.php
+++ b/sites/default/default.settings.php
@@ -214,19 +214,6 @@
  */
 $databases = array();
 
-/**
- * Access control for update.php script.
- *
- * If you are updating your Drupal installation using the update.php script but
- * are not logged in using either an account with the "Administer software
- * updates" permission or the site maintenance account (the account that was
- * created during installation), you will need to modify the access check
- * statement below. Change the FALSE to a TRUE to disable the access check.
- * After finishing the upgrade, be sure to open this file again and change the
- * TRUE back to a FALSE!
- */
-$update_free_access = FALSE;
-
 /**
  * Salt for one-time login links and cancel links, form tokens, etc.
  *
@@ -246,20 +233,6 @@
  */
 $drupal_hash_salt = '';
 
-/**
- * Class Loader.
- *
- * By default, Drupal uses the Symfony UniversalClassLoader which is best for
- * development, as it does not break when code is moved on the file system.
- * The APC classloader provides better performance and is recommended for
- * production sites.
- *
- * Examples:
- *  $class_loader = 'apc'
- *  $class_loader = 'default'
- */
-# $class_loader = 'apc';
-
 /**
  * Location of the site configuration files.
  *
@@ -286,6 +259,149 @@
  */
 $config_directories = array();
 
+/**
+ * Settings:
+ *
+ * $settings contains configuration that can not be saved in the configuration
+ * system because it is required too early during bootstrap like the database
+ * information. It is also used for configuration that is specific for a given
+ * environment like reverse proxy settings
+ *
+ * @see settings_get()
+ */
+
+/**
+ * Access control for update.php script.
+ *
+ * If you are updating your Drupal installation using the update.php script but
+ * are not logged in using either an account with the "Administer software
+ * updates" permission or the site maintenance account (the account that was
+ * created during installation), you will need to modify the access check
+ * statement below. Change the FALSE to a TRUE to disable the access check.
+ * After finishing the upgrade, be sure to open this file again and change the
+ * TRUE back to a FALSE!
+ */
+$settings['update_free_access'] = FALSE;
+
+/**
+ * External access proxy settings:
+ *
+ * If your site must access the Internet via a web proxy then you can enter
+ * the proxy settings here. Currently only basic authentication is supported
+ * by using the username and password variables. The proxy_user_agent variable
+ * can be set to NULL for proxies that require no User-Agent header or to a
+ * non-empty string for proxies that limit requests to a specific agent. The
+ * proxy_exceptions variable is an array of host names to be accessed directly,
+ * not via proxy.
+ */
+# $settings['proxy_server'] = '';
+# $settings['proxy_port'] = 8080;
+# $settings['proxy_username'] = '';
+# $settings['proxy_password'] = '';
+# $settings['proxy_user_agent'] = '';
+# $settings['proxy_exceptions'] = array('127.0.0.1', 'localhost');
+
+/**
+ * Reverse Proxy Configuration:
+ *
+ * Reverse proxy servers are often used to enhance the performance
+ * of heavily visited sites and may also provide other site caching,
+ * security, or encryption benefits. In an environment where Drupal
+ * is behind a reverse proxy, the real IP address of the client should
+ * be determined such that the correct client IP address is available
+ * to Drupal's logging, statistics, and access management systems. In
+ * the most simple scenario, the proxy server will add an
+ * X-Forwarded-For header to the request that contains the client IP
+ * address. However, HTTP headers are vulnerable to spoofing, where a
+ * malicious client could bypass restrictions by setting the
+ * X-Forwarded-For header directly. Therefore, Drupal's proxy
+ * configuration requires the IP addresses of all remote proxies to be
+ * specified in $settings['reverse_proxy_addresses'] to work correctly.
+ *
+ * Enable this setting to get Drupal to determine the client IP from
+ * the X-Forwarded-For header (or $settings['reverse_proxy_header'] if set).
+ * If you are unsure about this setting, do not have a reverse proxy,
+ * or Drupal operates in a shared hosting environment, this setting
+ * should remain commented out.
+ *
+ * In order for this setting to be used you must specify every possible
+ * reverse proxy IP address in $settings['reverse_proxy_addresses'].
+ * If a complete list of reverse proxies is not available in your
+ * environment (for example, if you use a CDN) you may set the
+ * $_SERVER['REMOTE_ADDR'] variable directly in settings.php.
+ * Be aware, however, that it is likely that this would allow IP
+ * address spoofing unless more advanced precautions are taken.
+ */
+# $settings['reverse_proxy'] = TRUE;
+
+/**
+ * Specify every reverse proxy IP address in your environment.
+ * This setting is required if $settings['reverse_proxy'] is TRUE.
+ */
+# $settings['reverse_proxy_addresses'] = array('a.b.c.d', ...);
+
+/**
+ * Set this value if your proxy server sends the client IP in a header
+ * other than X-Forwarded-For.
+ */
+# $settings['reverse_proxy_header'] = 'HTTP_X_CLUSTER_CLIENT_IP';
+
+/**
+ * Page caching:
+ *
+ * By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page
+ * views. This tells a HTTP proxy that it may return a page from its local
+ * cache without contacting the web server, if the user sends the same Cookie
+ * header as the user who originally requested the cached page. Without "Vary:
+ * Cookie", authenticated users would also be served the anonymous page from
+ * the cache. If the site has mostly anonymous users except a few known
+ * editors/administrators, the Vary header can be omitted. This allows for
+ * better caching in HTTP proxies (including reverse proxies), i.e. even if
+ * clients send different cookies, they still get content served from the cache.
+ * However, authenticated users should access the site directly (i.e. not use an
+ * HTTP proxy, and bypass the reverse proxy if one is used) in order to avoid
+ * getting cached pages from the proxy.
+ */
+# $settings['omit_vary_cookie'] = TRUE;
+
+/**
+ * Class Loader.
+ *
+ * By default, Drupal uses the Symfony UniversalClassLoader which is best for
+ * development, as it does not break when code is moved on the file system.
+ * The APC classloader provides better performance and is recommended for
+ * production sites.
+ *
+ * Examples:
+ *  $class_loader = 'apc'
+ *  $class_loader = 'default'
+ */
+# $settings['class_loader'] = 'apc';
+
+/**
+ * Authorized file system operations:
+ *
+ * The Update Manager module included with Drupal provides a mechanism for
+ * site administrators to securely install missing updates for the site
+ * directly through the web user interface. On securely-configured servers,
+ * the Update manager will require the administrator to provide SSH or FTP
+ * credentials before allowing the installation to proceed; this allows the
+ * site to update the new files as the user who owns all the Drupal files,
+ * instead of as the user the webserver is running as. On servers where the
+ * webserver user is itself the owner of the Drupal files, the administrator
+ * will not be prompted for SSH or FTP credentials (note that these server
+ * setups are common on shared hosting, but are inherently insecure).
+ *
+ * Some sites might wish to disable the above functionality, and only update
+ * the code directly via SSH or FTP themselves. This setting completely
+ * disables all functionality related to these authorized file operations.
+ *
+ * @see http://drupal.org/node/244924
+ *
+ * Remove the leading hash signs to disable.
+ */
+# $settings['allow_authorize_operations'] = FALSE;
+
 /**
  * Base URL (optional).
  *
@@ -397,69 +513,6 @@
  */
 # $conf['maintenance_theme'] = 'bartik';
 
-/**
- * Reverse Proxy Configuration:
- *
- * Reverse proxy servers are often used to enhance the performance
- * of heavily visited sites and may also provide other site caching,
- * security, or encryption benefits. In an environment where Drupal
- * is behind a reverse proxy, the real IP address of the client should
- * be determined such that the correct client IP address is available
- * to Drupal's logging, statistics, and access management systems. In
- * the most simple scenario, the proxy server will add an
- * X-Forwarded-For header to the request that contains the client IP
- * address. However, HTTP headers are vulnerable to spoofing, where a
- * malicious client could bypass restrictions by setting the
- * X-Forwarded-For header directly. Therefore, Drupal's proxy
- * configuration requires the IP addresses of all remote proxies to be
- * specified in $conf['reverse_proxy_addresses'] to work correctly.
- *
- * Enable this setting to get Drupal to determine the client IP from
- * the X-Forwarded-For header (or $conf['reverse_proxy_header'] if set).
- * If you are unsure about this setting, do not have a reverse proxy,
- * or Drupal operates in a shared hosting environment, this setting
- * should remain commented out.
- *
- * In order for this setting to be used you must specify every possible
- * reverse proxy IP address in $conf['reverse_proxy_addresses'].
- * If a complete list of reverse proxies is not available in your
- * environment (for example, if you use a CDN) you may set the
- * $_SERVER['REMOTE_ADDR'] variable directly in settings.php.
- * Be aware, however, that it is likely that this would allow IP
- * address spoofing unless more advanced precautions are taken.
- */
-# $conf['reverse_proxy'] = TRUE;
-
-/**
- * Specify every reverse proxy IP address in your environment.
- * This setting is required if $conf['reverse_proxy'] is TRUE.
- */
-# $conf['reverse_proxy_addresses'] = array('a.b.c.d', ...);
-
-/**
- * Set this value if your proxy server sends the client IP in a header
- * other than X-Forwarded-For.
- */
-# $conf['reverse_proxy_header'] = 'HTTP_X_CLUSTER_CLIENT_IP';
-
-/**
- * Page caching:
- *
- * By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page
- * views. This tells a HTTP proxy that it may return a page from its local
- * cache without contacting the web server, if the user sends the same Cookie
- * header as the user who originally requested the cached page. Without "Vary:
- * Cookie", authenticated users would also be served the anonymous page from
- * the cache. If the site has mostly anonymous users except a few known
- * editors/administrators, the Vary header can be omitted. This allows for
- * better caching in HTTP proxies (including reverse proxies), i.e. even if
- * clients send different cookies, they still get content served from the cache.
- * However, authenticated users should access the site directly (i.e. not use an
- * HTTP proxy, and bypass the reverse proxy if one is used) in order to avoid
- * getting cached pages from the proxy.
- */
-# $conf['system.performance']['cache']['page']['omit_vary_cookie'] = TRUE;
-
 /**
  * CSS/JS aggregated file gzip compression:
  *
@@ -512,48 +565,6 @@
 #$conf['system.fast_404']['paths'] = '/\.(?:txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/i';
 #$conf['system.fast_404']['html'] = '<!DOCTYPE html><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>';
 
-/**
- * External access proxy settings:
- *
- * If your site must access the Internet via a web proxy then you can enter
- * the proxy settings here. Currently only basic authentication is supported
- * by using the username and password variables. The proxy_user_agent variable
- * can be set to NULL for proxies that require no User-Agent header or to a
- * non-empty string for proxies that limit requests to a specific agent. The
- * proxy_exceptions variable is an array of host names to be accessed directly,
- * not via proxy.
- */
-# $conf['proxy_server'] = '';
-# $conf['proxy_port'] = 8080;
-# $conf['proxy_username'] = '';
-# $conf['proxy_password'] = '';
-# $conf['proxy_user_agent'] = '';
-# $conf['proxy_exceptions'] = array('127.0.0.1', 'localhost');
-
-/**
- * Authorized file system operations:
- *
- * The Update Manager module included with Drupal provides a mechanism for
- * site administrators to securely install missing updates for the site
- * directly through the web user interface. On securely-configured servers,
- * the Update manager will require the administrator to provide SSH or FTP
- * credentials before allowing the installation to proceed; this allows the
- * site to update the new files as the user who owns all the Drupal files,
- * instead of as the user the webserver is running as. On servers where the
- * webserver user is itself the owner of the Drupal files, the administrator
- * will not be prompted for SSH or FTP credentials (note that these server
- * setups are common on shared hosting, but are inherently insecure).
- *
- * Some sites might wish to disable the above functionality, and only update
- * the code directly via SSH or FTP themselves. This setting completely
- * disables all functionality related to these authorized file operations.
- *
- * @see http://drupal.org/node/244924
- *
- * Remove the leading hash signs to disable.
- */
-# $conf['allow_authorize_operations'] = FALSE;
-
 /**
  * Load local development override configuration, if available.
  *
-- 
GitLab