From 6a9d73f7d9711bcd29142b8614fe6ddc09f4eae1 Mon Sep 17 00:00:00 2001
From: Philipp Holzer <admin@philipp.info>
Date: Tue, 5 Feb 2019 22:27:57 +0100
Subject: [PATCH] Refactoring ConfigCacheLoader methods

---
 bin/auth_ejabberd.php                 |  2 +-
 bin/console.php                       |  2 +-
 bin/daemon.php                        |  2 +-
 bin/worker.php                        |  2 +-
 index.php                             |  2 +-
 src/App.php                           |  2 +-
 src/Core/Config/ConfigCache.php       | 14 +-----
 src/Core/Config/ConfigCacheLoader.php | 71 +++++++++++++++------------
 src/Util/BasePath.php                 | 16 +++---
 9 files changed, 56 insertions(+), 57 deletions(-)

diff --git a/bin/auth_ejabberd.php b/bin/auth_ejabberd.php
index af728f218c..11df438952 100755
--- a/bin/auth_ejabberd.php
+++ b/bin/auth_ejabberd.php
@@ -54,7 +54,7 @@ chdir($directory);
 
 require dirname(__DIR__) . '/vendor/autoload.php';
 
-$basedir = BasePath::create(dirname(__DIR__));
+$basedir = BasePath::create(dirname(__DIR__), $_SERVER);
 $configLoader = new Config\ConfigCacheLoader($basedir);
 $config = Factory\ConfigFactory::createCache($configLoader);
 $logger = Factory\LoggerFactory::create('auth_ejabberd', $config);
diff --git a/bin/console.php b/bin/console.php
index e7b1786de7..9061824d87 100755
--- a/bin/console.php
+++ b/bin/console.php
@@ -7,7 +7,7 @@ use Friendica\Core\Config;
 use Friendica\Factory;
 use Friendica\Util\BasePath;
 
-$basedir = BasePath::create(dirname(__DIR__));
+$basedir = BasePath::create(dirname(__DIR__), $_SERVER);
 $configLoader = new Config\ConfigCacheLoader($basedir);
 $config = Factory\ConfigFactory::createCache($configLoader);
 $logger = Factory\LoggerFactory::create('console', $config);
diff --git a/bin/daemon.php b/bin/daemon.php
index 7e71571cb3..5c014a9270 100755
--- a/bin/daemon.php
+++ b/bin/daemon.php
@@ -33,7 +33,7 @@ if (!file_exists("boot.php") && (sizeof($_SERVER["argv"]) != 0)) {
 
 require dirname(__DIR__) . '/vendor/autoload.php';
 
-$basedir = BasePath::create(dirname(__DIR__));
+$basedir = BasePath::create(dirname(__DIR__), $_SERVER);
 $configLoader = new Config\ConfigCacheLoader($basedir);
 $config = Factory\ConfigFactory::createCache($configLoader);
 $logger = Factory\LoggerFactory::create('daemon', $config);
diff --git a/bin/worker.php b/bin/worker.php
index 61fdbed544..553e984977 100755
--- a/bin/worker.php
+++ b/bin/worker.php
@@ -31,7 +31,7 @@ if (!file_exists("boot.php") && (sizeof($_SERVER["argv"]) != 0)) {
 
 require dirname(__DIR__) . '/vendor/autoload.php';
 
-$basedir = BasePath::create(dirname(__DIR__));
+$basedir = BasePath::create(dirname(__DIR__), $_SERVER);
 $configLoader = new Config\ConfigCacheLoader($basedir);
 $config = Factory\ConfigFactory::createCache($configLoader);
 $logger = Factory\LoggerFactory::create('worker', $config);
diff --git a/index.php b/index.php
index 11b7879991..7e7396785f 100644
--- a/index.php
+++ b/index.php
@@ -15,7 +15,7 @@ if (!file_exists(__DIR__ . '/vendor/autoload.php')) {
 
 require __DIR__ . '/vendor/autoload.php';
 
-$basedir = BasePath::create(__DIR__);
+$basedir = BasePath::create(__DIR__, $_SERVER);
 $configLoader = new Config\ConfigCacheLoader($basedir);
 $config = Factory\ConfigFactory::createCache($configLoader);
 $logger = Factory\LoggerFactory::create('index', $config);
diff --git a/src/App.php b/src/App.php
index 5d557738da..38d41cfcf8 100644
--- a/src/App.php
+++ b/src/App.php
@@ -387,7 +387,7 @@ class App
 			Core\Hook::loadHooks();
 			$loader = new ConfigCacheLoader($this->basePath);
 			Core\Hook::callAll('load_config', $loader);
-			$this->config->loadConfigArray($loader->loadAddonConfig(), true);
+			$this->config->loadConfigArray($loader->loadCoreConfig('addon'), true);
 		}
 
 		$this->loadDefaultTimezone();
diff --git a/src/Core/Config/ConfigCache.php b/src/Core/Config/ConfigCache.php
index dba2a9dd11..e03d352566 100644
--- a/src/Core/Config/ConfigCache.php
+++ b/src/Core/Config/ConfigCache.php
@@ -11,24 +11,14 @@ namespace Friendica\Core\Config;
  */
 class ConfigCache implements IConfigCache, IPConfigCache
 {
-	/**
-	 * NEVER, EVER use this public config array outside of the class
-	 * It is only public due to backward compatibility to .htconfig.php
-	 *
-	 * @var array The cached config array
-	 */
-	public $config;
+	private $config;
 
 	/**
 	 * @param array $config    A initial config array
 	 */
 	public function __construct(array $config = [])
 	{
-		$this->config = [];
-
-		if (isset($config)) {
-			$this->loadConfigArray($config, true);
-		}
+		$this->config = $config;
 	}
 
 	/**
diff --git a/src/Core/Config/ConfigCacheLoader.php b/src/Core/Config/ConfigCacheLoader.php
index 58647e5aec..5521349376 100644
--- a/src/Core/Config/ConfigCacheLoader.php
+++ b/src/Core/Config/ConfigCacheLoader.php
@@ -40,8 +40,8 @@ class ConfigCacheLoader
 		// Setting at least the basepath we know
 		$config->set('system', 'basepath', $this->baseDir);
 
-		$config->loadConfigArray($this->loadConfigFile('defaults'));
-		$config->loadConfigArray($this->loadConfigFile('settings'));
+		$config->loadConfigArray($this->loadCoreConfig('defaults'));
+		$config->loadConfigArray($this->loadCoreConfig('settings'));
 
 		// Legacy .htconfig.php support
 		if (file_exists($this->baseDir  . '/.htpreconfig.php')) {
@@ -82,16 +82,11 @@ class ConfigCacheLoader
 			}
 		}
 
-		if (file_exists($this->baseDir . '/config/local.config.php')) {
-			$config->loadConfigArray($this->loadConfigFile('local'), true);
-		} elseif (file_exists($this->baseDir . '/config/local.ini.php')) {
-			$config->loadConfigArray($this->loadINIConfigFile('local'), true);
-		}
+		$config->loadConfigArray($this->loadCoreConfig('local'), true);
 	}
 
 	/**
-	 * Tries to load the specified legacy configuration file into the App->config array.
-	 * Doesn't overwrite previously set values by default to prevent default config files to supersede DB Config.
+	 * Tries to load the specified legacy configuration file into the ConfigCache (@see ConfigCache ).
 	 *
 	 * @deprecated since version 2018.12
 	 * @param string $filename
@@ -119,8 +114,7 @@ class ConfigCacheLoader
 	}
 
 	/**
-	 * Tries to load the specified configuration file into the App->config array.
-	 * Doesn't overwrite previously set values by default to prevent default config files to supersede DB Config.
+	 * Tries to load the specified configuration file and returns the config array.
 	 *
 	 * The config format is PHP array and the template for configuration files is the following:
 	 *
@@ -130,19 +124,13 @@ class ConfigCacheLoader
 	 *      ],
 	 * ];
 	 *
-	 * @param string $filename
-	 * @param bool   $addon     True, if a config for an addon should be loaded
-	 * @return array The configuration
-	 * @throws \Exception
+	 * @param  string $filepath The filepath of the
+	 * @return array The config array0
+	 *
+	 * @throws \Exception if the config cannot get loaded.
 	 */
-	public function loadConfigFile($filename, $addon = false)
+	private function loadConfigFile($filepath)
 	{
-		if ($addon) {
-			$filepath = $this->baseDir . Addon::DIRECTORY . $filename . self::SUBDIRECTORY . $filename . ".config.php";
-		} else {
-			$filepath = $this->configDir . $filename . ".config.php";
-		}
-
 		if (!file_exists($filepath)) {
 			throw new \Exception('Error loading non-existent config file ' . $filepath);
 		}
@@ -157,22 +145,43 @@ class ConfigCacheLoader
 	}
 
 	/**
-	 * Loads addons configuration files
+	 * Tries to load the specified core-configuration and returns the config array.
+	 *
+	 * @param string $name The name of the configuration
+	 *
+	 * @return array The config array (empty if no config found)
+	 *
+	 * @throws \Exception if the configuration file isn't readable
+	 */
+	public function loadCoreConfig($name)
+	{
+		if (file_exists($this->configDir . $name . '.config.php')) {
+			return $this->loadConfigFile($this->configDir . $name . '.config.php');
+		} elseif (file_exists($this->configDir . $name . '.ini.php')) {
+			return $this->loadINIConfigFile($this->configDir . $name . '.ini.php');
+		} else {
+			return [];
+		}
+	}
+
+	/**
+	 * Tries to load the specified addon-configuration and returns the config array.
 	 *
 	 * First loads all activated addons default configuration through the load_config hook, then load the local.config.php
 	 * again to overwrite potential local addon configuration.
 	 *
-	 * @return array The config array
+	 * @param string $name The name of the configuration
 	 *
-	 * @throws \Exception
+	 * @return array The config array (empty if no config found)
+	 *
+	 * @throws \Exception if the configuration file isn't readable
 	 */
-	public function loadAddonConfig()
+	public function loadAddonConfig($name)
 	{
-		// Load the local addon config file to overwritten default addon config values
-		if (file_exists($this->configDir . 'addon.config.php')) {
-			return $this->loadConfigFile('addon');
-		} elseif (file_exists($this->configDir . 'addon.ini.php')) {
-			return $this->loadINIConfigFile('addon');
+		$filepath = $this->baseDir . Addon::DIRECTORY . $name . self::SUBDIRECTORY . $name . ".config.php";
+
+		if (file_exists($filepath)) {
+			return $this->loadConfigFile($filepath);
 		} else {
 			return [];
 		}
diff --git a/src/Util/BasePath.php b/src/Util/BasePath.php
index 56b0fa1fe9..fecc63a2ab 100644
--- a/src/Util/BasePath.php
+++ b/src/Util/BasePath.php
@@ -12,23 +12,24 @@ class BasePath
 	 * It first checks for the internal variable, then for DOCUMENT_ROOT and
 	 * finally for PWD
 	 *
-	 * @param string|null $basepath
+	 * @param string|null $basePath The default base path
+	 * @param array       $server   server arguments
 	 *
 	 * @return string
 	 *
 	 * @throws \Exception if directory isn't usable
 	 */
-	public static function create($basepath)
+	public static function create($basePath, $server = [])
 	{
-		if (!$basepath && !empty($_SERVER['DOCUMENT_ROOT'])) {
-			$basepath = $_SERVER['DOCUMENT_ROOT'];
+		if (!$basePath && !empty($server['DOCUMENT_ROOT'])) {
+			$basePath = $server['DOCUMENT_ROOT'];
 		}
 
-		if (!$basepath && !empty($_SERVER['PWD'])) {
-			$basepath = $_SERVER['PWD'];
+		if (!$basePath && !empty($server['PWD'])) {
+			$basePath = $server['PWD'];
 		}
 
-		return self::getRealPath($basepath);
+		return self::getRealPath($basePath);
 	}
 
 	/**
@@ -52,7 +53,6 @@ class BasePath
 		}
 	}
 
-
 	/**
 	 * @brief Checks if a given directory is usable for the system
 	 *
-- 
2.39.5