mirror of
https://github.com/friendica/friendica
synced 2025-01-03 19:22:18 +00:00
Add the possibility to use a different configuration directory
This commit is contained in:
parent
c40b3411a7
commit
5702944116
12 changed files with 75 additions and 19 deletions
|
@ -42,6 +42,9 @@ Some examples of common known configuration files:
|
||||||
|
|
||||||
Addons can define their own default configuration values in `addon/[addon]/config/[addon].config.php` which is loaded when the addon is activated.
|
Addons can define their own default configuration values in `addon/[addon]/config/[addon].config.php` which is loaded when the addon is activated.
|
||||||
|
|
||||||
|
If needed, an alternative `config` path can be used by using the `FRIENDICA_CONFIG_DIR` environment variable (full path required!).
|
||||||
|
This is useful in case of hardening the system by separating configuration from program binaries.
|
||||||
|
|
||||||
### Static Configuration location
|
### Static Configuration location
|
||||||
|
|
||||||
The `static` directory holds the codebase default configurations files.
|
The `static` directory holds the codebase default configurations files.
|
||||||
|
|
|
@ -352,7 +352,7 @@ class App
|
||||||
$this->profiler->update($this->config);
|
$this->profiler->update($this->config);
|
||||||
|
|
||||||
Core\Hook::loadHooks();
|
Core\Hook::loadHooks();
|
||||||
$loader = new ConfigFileLoader($this->getBasePath());
|
$loader = new ConfigFileLoader($this->getBasePath(), $_SERVER);
|
||||||
Core\Hook::callAll('load_config', $loader);
|
Core\Hook::callAll('load_config', $loader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -151,7 +151,7 @@ class Summary extends BaseAdmin
|
||||||
}
|
}
|
||||||
|
|
||||||
// check legacy basepath settings
|
// check legacy basepath settings
|
||||||
$configLoader = new ConfigFileLoader($a->getBasePath());
|
$configLoader = new ConfigFileLoader($a->getBasePath(), $_SERVER);
|
||||||
$configCache = new Cache();
|
$configCache = new Cache();
|
||||||
$configLoader->setupCache($configCache);
|
$configLoader->setupCache($configCache);
|
||||||
$confBasepath = $configCache->get('system', 'basepath');
|
$confBasepath = $configCache->get('system', 'basepath');
|
||||||
|
|
|
@ -35,6 +35,13 @@ use Friendica\Core\Config\Cache;
|
||||||
*/
|
*/
|
||||||
class ConfigFileLoader
|
class ConfigFileLoader
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* The key of the $_SERVER variable to override the config directory
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
const CONFIG_DIR_ENV = 'FRIENDICA_CONFIG_DIR';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Sub directory of the config-files
|
* The Sub directory of the config-files
|
||||||
*
|
*
|
||||||
|
@ -83,10 +90,14 @@ class ConfigFileLoader
|
||||||
*/
|
*/
|
||||||
private $staticDir;
|
private $staticDir;
|
||||||
|
|
||||||
public function __construct(string $basePath)
|
public function __construct(string $basePath, array $server)
|
||||||
{
|
{
|
||||||
$this->baseDir = $basePath;
|
$this->baseDir = $basePath;
|
||||||
|
if (!empty($server[self::CONFIG_DIR_ENV]) && is_dir($server[self::CONFIG_DIR_ENV])) {
|
||||||
|
$this->configDir = $server[self::CONFIG_DIR_ENV];
|
||||||
|
} else {
|
||||||
$this->configDir = $this->baseDir . DIRECTORY_SEPARATOR . self::CONFIG_DIR;
|
$this->configDir = $this->baseDir . DIRECTORY_SEPARATOR . self::CONFIG_DIR;
|
||||||
|
}
|
||||||
$this->staticDir = $this->baseDir . DIRECTORY_SEPARATOR . self::STATIC_DIR;
|
$this->staticDir = $this->baseDir . DIRECTORY_SEPARATOR . self::STATIC_DIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,7 @@ return [
|
||||||
'shared' => true,
|
'shared' => true,
|
||||||
'constructParams' => [
|
'constructParams' => [
|
||||||
[Dice::INSTANCE => '$basepath'],
|
[Dice::INSTANCE => '$basepath'],
|
||||||
|
$_SERVER,
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
Config\Cache::class => [
|
Config\Cache::class => [
|
||||||
|
|
|
@ -43,6 +43,7 @@ trait VFSTrait
|
||||||
'static' => [],
|
'static' => [],
|
||||||
'test' => [],
|
'test' => [],
|
||||||
'logs' => [],
|
'logs' => [],
|
||||||
|
'config2' => [],
|
||||||
];
|
];
|
||||||
|
|
||||||
// create a virtual directory and copy all needed files and folders to it
|
// create a virtual directory and copy all needed files and folders to it
|
||||||
|
|
|
@ -55,7 +55,7 @@ class DatabaseCacheTest extends CacheTest
|
||||||
|
|
||||||
// load real config to avoid mocking every config-entry which is related to the Database class
|
// load real config to avoid mocking every config-entry which is related to the Database class
|
||||||
$configFactory = new ConfigFactory();
|
$configFactory = new ConfigFactory();
|
||||||
$loader = new ConfigFileLoader($this->root->url());
|
$loader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = $configFactory->createCache($loader);
|
$configCache = $configFactory->createCache($loader);
|
||||||
|
|
||||||
$dba = new StaticDatabase($configCache, $profiler, $logger);
|
$dba = new StaticDatabase($configCache, $profiler, $logger);
|
||||||
|
|
|
@ -57,7 +57,7 @@ class DatabaseLockDriverTest extends LockTest
|
||||||
|
|
||||||
// load real config to avoid mocking every config-entry which is related to the Database class
|
// load real config to avoid mocking every config-entry which is related to the Database class
|
||||||
$configFactory = new ConfigFactory();
|
$configFactory = new ConfigFactory();
|
||||||
$loader = new ConfigFileLoader($this->root->url());
|
$loader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = $configFactory->createCache($loader);
|
$configCache = $configFactory->createCache($loader);
|
||||||
|
|
||||||
$dba = new StaticDatabase($configCache, $profiler, $logger);
|
$dba = new StaticDatabase($configCache, $profiler, $logger);
|
||||||
|
|
|
@ -73,7 +73,7 @@ class StorageManagerTest extends DatabaseTest
|
||||||
|
|
||||||
// load real config to avoid mocking every config-entry which is related to the Database class
|
// load real config to avoid mocking every config-entry which is related to the Database class
|
||||||
$configFactory = new ConfigFactory();
|
$configFactory = new ConfigFactory();
|
||||||
$loader = new ConfigFileLoader($this->root->url());
|
$loader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = $configFactory->createCache($loader);
|
$configCache = $configFactory->createCache($loader);
|
||||||
|
|
||||||
$this->dba = new StaticDatabase($configCache, $profiler, $this->logger);
|
$this->dba = new StaticDatabase($configCache, $profiler, $this->logger);
|
||||||
|
|
|
@ -33,7 +33,7 @@ class ProcessTest extends DatabaseTest
|
||||||
|
|
||||||
// load real config to avoid mocking every config-entry which is related to the Database class
|
// load real config to avoid mocking every config-entry which is related to the Database class
|
||||||
$configFactory = new ConfigFactory();
|
$configFactory = new ConfigFactory();
|
||||||
$loader = new ConfigFileLoader($this->root->url());
|
$loader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = $configFactory->createCache($loader);
|
$configCache = $configFactory->createCache($loader);
|
||||||
|
|
||||||
$this->dba = new StaticDatabase($configCache, $profiler, $logger);
|
$this->dba = new StaticDatabase($configCache, $profiler, $logger);
|
||||||
|
|
|
@ -55,7 +55,7 @@ class DatabaseStorageTest extends StorageTest
|
||||||
|
|
||||||
// load real config to avoid mocking every config-entry which is related to the Database class
|
// load real config to avoid mocking every config-entry which is related to the Database class
|
||||||
$configFactory = new ConfigFactory();
|
$configFactory = new ConfigFactory();
|
||||||
$loader = new ConfigFileLoader($this->root->url());
|
$loader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = $configFactory->createCache($loader);
|
$configCache = $configFactory->createCache($loader);
|
||||||
|
|
||||||
$dba = new StaticDatabase($configCache, $profiler, $logger);
|
$dba = new StaticDatabase($configCache, $profiler, $logger);
|
||||||
|
|
|
@ -45,7 +45,7 @@ class ConfigFileLoaderTest extends MockedTest
|
||||||
{
|
{
|
||||||
$this->delConfigFile('local.config.php');
|
$this->delConfigFile('local.config.php');
|
||||||
|
|
||||||
$configFileLoader = new ConfigFileLoader($this->root->url());
|
$configFileLoader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = new Cache();
|
$configCache = new Cache();
|
||||||
|
|
||||||
$configFileLoader->setupCache($configCache);
|
$configFileLoader->setupCache($configCache);
|
||||||
|
@ -67,7 +67,7 @@ class ConfigFileLoaderTest extends MockedTest
|
||||||
->at($this->root->getChild('config'))
|
->at($this->root->getChild('config'))
|
||||||
->setContent('<?php return true;');
|
->setContent('<?php return true;');
|
||||||
|
|
||||||
$configFileLoader = new ConfigFileLoader($this->root->url());
|
$configFileLoader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = new Cache();
|
$configCache = new Cache();
|
||||||
|
|
||||||
$configFileLoader->setupCache($configCache);
|
$configFileLoader->setupCache($configCache);
|
||||||
|
@ -91,7 +91,7 @@ class ConfigFileLoaderTest extends MockedTest
|
||||||
->at($this->root->getChild('config'))
|
->at($this->root->getChild('config'))
|
||||||
->setContent(file_get_contents($file));
|
->setContent(file_get_contents($file));
|
||||||
|
|
||||||
$configFileLoader = new ConfigFileLoader($this->root->url());
|
$configFileLoader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = new Cache();
|
$configCache = new Cache();
|
||||||
|
|
||||||
$configFileLoader->setupCache($configCache);
|
$configFileLoader->setupCache($configCache);
|
||||||
|
@ -123,7 +123,7 @@ class ConfigFileLoaderTest extends MockedTest
|
||||||
->at($this->root->getChild('config'))
|
->at($this->root->getChild('config'))
|
||||||
->setContent(file_get_contents($file));
|
->setContent(file_get_contents($file));
|
||||||
|
|
||||||
$configFileLoader = new ConfigFileLoader($this->root->url());
|
$configFileLoader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = new Cache();
|
$configCache = new Cache();
|
||||||
|
|
||||||
$configFileLoader->setupCache($configCache);
|
$configFileLoader->setupCache($configCache);
|
||||||
|
@ -154,7 +154,7 @@ class ConfigFileLoaderTest extends MockedTest
|
||||||
->at($this->root)
|
->at($this->root)
|
||||||
->setContent(file_get_contents($file));
|
->setContent(file_get_contents($file));
|
||||||
|
|
||||||
$configFileLoader = new ConfigFileLoader($this->root->url());
|
$configFileLoader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = new Cache();
|
$configCache = new Cache();
|
||||||
|
|
||||||
$configFileLoader->setupCache($configCache);
|
$configFileLoader->setupCache($configCache);
|
||||||
|
@ -203,7 +203,7 @@ class ConfigFileLoaderTest extends MockedTest
|
||||||
->at($this->root->getChild('addon')->getChild('test')->getChild('config'))
|
->at($this->root->getChild('addon')->getChild('test')->getChild('config'))
|
||||||
->setContent(file_get_contents($file));
|
->setContent(file_get_contents($file));
|
||||||
|
|
||||||
$configFileLoader = new ConfigFileLoader($this->root->url());
|
$configFileLoader = new ConfigFileLoader($this->root->url(), []);
|
||||||
|
|
||||||
$conf = $configFileLoader->loadAddonConfig('test');
|
$conf = $configFileLoader->loadAddonConfig('test');
|
||||||
|
|
||||||
|
@ -235,7 +235,7 @@ class ConfigFileLoaderTest extends MockedTest
|
||||||
->at($this->root->getChild('config'))
|
->at($this->root->getChild('config'))
|
||||||
->setContent(file_get_contents($fileDir . 'B.config.php'));
|
->setContent(file_get_contents($fileDir . 'B.config.php'));
|
||||||
|
|
||||||
$configFileLoader = new ConfigFileLoader($this->root->url());
|
$configFileLoader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = new Cache();
|
$configCache = new Cache();
|
||||||
|
|
||||||
$configFileLoader->setupCache($configCache);
|
$configFileLoader->setupCache($configCache);
|
||||||
|
@ -264,7 +264,7 @@ class ConfigFileLoaderTest extends MockedTest
|
||||||
->at($this->root->getChild('config'))
|
->at($this->root->getChild('config'))
|
||||||
->setContent(file_get_contents($fileDir . 'B.ini.php'));
|
->setContent(file_get_contents($fileDir . 'B.ini.php'));
|
||||||
|
|
||||||
$configFileLoader = new ConfigFileLoader($this->root->url());
|
$configFileLoader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = new Cache();
|
$configCache = new Cache();
|
||||||
|
|
||||||
$configFileLoader->setupCache($configCache);
|
$configFileLoader->setupCache($configCache);
|
||||||
|
@ -293,7 +293,7 @@ class ConfigFileLoaderTest extends MockedTest
|
||||||
->at($this->root->getChild('config'))
|
->at($this->root->getChild('config'))
|
||||||
->setContent(file_get_contents($fileDir . 'B.ini.php'));
|
->setContent(file_get_contents($fileDir . 'B.ini.php'));
|
||||||
|
|
||||||
$configFileLoader = new ConfigFileLoader($this->root->url());
|
$configFileLoader = new ConfigFileLoader($this->root->url(), []);
|
||||||
$configCache = new Cache();
|
$configCache = new Cache();
|
||||||
|
|
||||||
$configFileLoader->setupCache($configCache);
|
$configFileLoader->setupCache($configCache);
|
||||||
|
@ -301,4 +301,44 @@ class ConfigFileLoaderTest extends MockedTest
|
||||||
self::assertEquals('admin@test.it', $configCache->get('config', 'admin_email'));
|
self::assertEquals('admin@test.it', $configCache->get('config', 'admin_email'));
|
||||||
self::assertEmpty($configCache->get('system', 'NewKey'));
|
self::assertEmpty($configCache->get('system', 'NewKey'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that using a wrong configuration directory leads to the "normal" config path
|
||||||
|
*/
|
||||||
|
public function testWrongEnvDir()
|
||||||
|
{
|
||||||
|
$this->delConfigFile('local.config.php');
|
||||||
|
|
||||||
|
$configFileLoader = new ConfigFileLoader($this->root->url(), ['FRIENDICA_CONFIG_DIR' => '/a/wrong/dir/']);
|
||||||
|
$configCache = new Cache();
|
||||||
|
|
||||||
|
$configFileLoader->setupCache($configCache);
|
||||||
|
|
||||||
|
self::assertEquals($this->root->url(), $configCache->get('system', 'basepath'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that a different location of the configuration directory produces the expected output
|
||||||
|
*/
|
||||||
|
public function testRightEnvDir()
|
||||||
|
{
|
||||||
|
$this->delConfigFile('local.config.php');
|
||||||
|
|
||||||
|
$fileDir = dirname(__DIR__) . DIRECTORY_SEPARATOR .
|
||||||
|
'..' . DIRECTORY_SEPARATOR .
|
||||||
|
'..' . DIRECTORY_SEPARATOR .
|
||||||
|
'datasets' . DIRECTORY_SEPARATOR .
|
||||||
|
'config' . DIRECTORY_SEPARATOR;
|
||||||
|
|
||||||
|
vfsStream::newFile('B.config.php')
|
||||||
|
->at($this->root->getChild('config2'))
|
||||||
|
->setContent(file_get_contents($fileDir . 'B.config.php'));
|
||||||
|
|
||||||
|
$configFileLoader = new ConfigFileLoader($this->root->url(), ['FRIENDICA_CONFIG_DIR' => $this->root->getChild('config2')->url()]);
|
||||||
|
$configCache = new Cache();
|
||||||
|
|
||||||
|
$configFileLoader->setupCache($configCache);
|
||||||
|
|
||||||
|
self::assertEquals('newValue', $configCache->get('system', 'newKey'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue