const SOURCE_DB = 1;
/** @var int Indicates that the cache entry is set by a server environment variable - High Priority */
const SOURCE_ENV = 3;
+ /** @var int Indicates that the cache entry is fixed and must not be changed */
+ const SOURCE_FIX = 4;
/** @var int Default value for a config source */
const SOURCE_DEFAULT = self::SOURCE_FILE;
protected $testmode = false;
private $relation = [];
- public function __construct(Cache $configCache, Profiler $profiler, LoggerInterface $logger, array $server = [])
+ public function __construct(Cache $configCache, Profiler $profiler, LoggerInterface $logger)
{
// We are storing these values for being able to perform a reconnect
$this->configCache = $configCache;
*
* @throws Exception
*/
- public function createCache(ConfigFileLoader $loader)
+ public function createCache(ConfigFileLoader $loader, array $server = [])
{
$configCache = new Cache();
- $loader->setupCache($configCache);
+ $loader->setupCache($configCache, $server);
return $configCache;
}
* expected local.config.php
*
* @param Cache $config The config cache to load to
+ * @param array $server The $_SERVER array
* @param bool $raw Setup the raw config format
*
* @throws Exception
*/
- public function setupCache(Cache $config, $raw = false)
+ public function setupCache(Cache $config, array $server = [], $raw = false)
{
// Load static config files first, the order is important
$config->load($this->loadStaticConfig('defaults'), Cache::SOURCE_FILE);
// Now load every other config you find inside the 'config/' directory
$this->loadCoreConfig($config);
+ $config->load($this->loadEnvConfig($server), Cache::SOURCE_ENV);
+
// In case of install mode, add the found basepath (because there isn't a basepath set yet
if (!$raw && empty($config->get('system', 'basepath'))) {
// Setting at least the basepath we know
- $config->set('system', 'basepath', $this->baseDir);
+ $config->set('system', 'basepath', $this->baseDir, Cache::SOURCE_FILE);
}
}
}
}
+ /**
+ * Tries to load environment specific variables, based on the `env.config.php` mapping table
+ *
+ * @param array $server The $_SERVER variable
+ *
+ * @return array The config array (empty if no config was found)
+ *
+ * @throws Exception if the configuration file isn't readable
+ */
+ public function loadEnvConfig(array $server)
+ {
+ $filepath = $this->baseDir . DIRECTORY_SEPARATOR . // /var/www/html/
+ self::STATIC_DIR . DIRECTORY_SEPARATOR . // static/
+ "env.config.php"; // env.config.php
+
+ if (!file_exists($filepath)) {
+ return [];
+ }
+
+ $envConfig = $this->loadConfigFile($filepath);
+
+ $return = [];
+
+ foreach ($envConfig as $envKey => $configStructure) {
+ if (isset($server[$envKey])) {
+ $return[$configStructure[0]][$configStructure[1]] = $server[$envKey];
+ }
+ }
+
+ return $return;
+ }
+
/**
* Get the config files of the config-directory
*
// Can contain the port number with the syntax "hostname:port".
'hostname' => '',
+ // port (Integer)
+ // Port of the database server.
+ // Can be used instead of adding a port number to the hostname
+ 'port' => null,
+
// user (String)
// Database user name. Please don't use "root".
'username' => '',
Util\ConfigFileLoader::class => [
'shared' => true,
'constructParams' => [
- [Dice::INSTANCE => '$basepath'],
+ [Dice::INSTANCE => '$basepath']
],
],
Config\Cache::class => [
'instanceOf' => Factory\ConfigFactory::class,
'call' => [
- ['createCache', [], Dice::CHAIN_CALL],
+ ['createCache', [$_SERVER], Dice::CHAIN_CALL],
],
],
App\Mode::class => [
Database::class => [
'constructParams' => [
[Dice::INSTANCE => \Psr\Log\NullLogger::class],
- $_SERVER,
],
],
/**
--- /dev/null
+<?php
+/**
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * Main mapping table of environment variables to correct config values
+ *
+ */
+
+return [
+ 'MYSQL_HOST' => ['database', 'hostname'],
+ 'MYSQL_USERNAME' => ['database', 'username'],
+ 'MYSQL_USER' => ['database', 'username'],
+ 'MYSQL_PORT' => ['database', 'port'],
+ 'MYSQL_PASSWORD' => ['database', 'password'],
+ 'MYSQL_DATABASE' => ['database', 'database'],
+];
$this->assertEquals($override['system']['test'], $configCache->get('system', 'test'));
$this->assertEquals($override['system']['boolTrue'], $configCache->get('system', 'boolTrue'));
+
+ // Don't overwrite server ENV variables - even in load mode
+ $configCache->load($data, Cache::SOURCE_DB);
+
+ $this->assertEquals($override['system']['test'], $configCache->get('system', 'test'));
+ $this->assertEquals($override['system']['boolTrue'], $configCache->get('system', 'boolTrue'));
+
+ // Overwrite ENV variables with ENV variables
+ $configCache->load($data, Cache::SOURCE_ENV);
+
+ $this->assertConfigValues($data, $configCache);
+ $this->assertNotEquals($override['system']['test'], $configCache->get('system', 'test'));
+ $this->assertNotEquals($override['system']['boolTrue'], $configCache->get('system', 'boolTrue'));
}
/**