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. | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
| The `static` directory holds the codebase default configurations files. | ||||
|  |  | |||
|  | @ -352,7 +352,7 @@ class App | |||
| 			$this->profiler->update($this->config); | ||||
| 
 | ||||
| 			Core\Hook::loadHooks(); | ||||
| 			$loader = new ConfigFileLoader($this->getBasePath()); | ||||
| 			$loader = new ConfigFileLoader($this->getBasePath(), $_SERVER); | ||||
| 			Core\Hook::callAll('load_config', $loader); | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
|  | @ -151,7 +151,7 @@ class Summary extends BaseAdmin | |||
| 		} | ||||
| 
 | ||||
| 		// check legacy basepath settings
 | ||||
| 		$configLoader = new ConfigFileLoader($a->getBasePath()); | ||||
| 		$configLoader = new ConfigFileLoader($a->getBasePath(), $_SERVER); | ||||
| 		$configCache = new Cache(); | ||||
| 		$configLoader->setupCache($configCache); | ||||
| 		$confBasepath = $configCache->get('system', 'basepath'); | ||||
|  |  | |||
|  | @ -35,6 +35,13 @@ use Friendica\Core\Config\Cache; | |||
|  */ | ||||
| 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 | ||||
| 	 * | ||||
|  | @ -83,10 +90,14 @@ class ConfigFileLoader | |||
| 	 */ | ||||
| 	private $staticDir; | ||||
| 
 | ||||
| 	public function __construct(string $basePath) | ||||
| 	public function __construct(string $basePath, array $server) | ||||
| 	{ | ||||
| 		$this->baseDir   = $basePath; | ||||
| 		$this->configDir = $this->baseDir . DIRECTORY_SEPARATOR . self::CONFIG_DIR; | ||||
| 		$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->staticDir = $this->baseDir . DIRECTORY_SEPARATOR . self::STATIC_DIR; | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -77,6 +77,7 @@ return [ | |||
| 		'shared'          => true, | ||||
| 		'constructParams' => [ | ||||
| 			[Dice::INSTANCE => '$basepath'], | ||||
| 			$_SERVER, | ||||
| 		], | ||||
| 	], | ||||
| 	Config\Cache::class          => [ | ||||
|  |  | |||
|  | @ -43,6 +43,7 @@ trait VFSTrait | |||
| 			'static' => [], | ||||
| 			'test' => [], | ||||
| 			'logs' => [], | ||||
| 			'config2' => [], | ||||
| 		]; | ||||
| 
 | ||||
| 		// 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
 | ||||
| 		$configFactory = new ConfigFactory(); | ||||
| 		$loader = new ConfigFileLoader($this->root->url()); | ||||
| 		$loader = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache = $configFactory->createCache($loader); | ||||
| 
 | ||||
| 		$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
 | ||||
| 		$configFactory = new ConfigFactory(); | ||||
| 		$loader        = new ConfigFileLoader($this->root->url()); | ||||
| 		$loader        = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache   = $configFactory->createCache($loader); | ||||
| 
 | ||||
| 		$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
 | ||||
| 		$configFactory = new ConfigFactory(); | ||||
| 		$loader        = new ConfigFileLoader($this->root->url()); | ||||
| 		$loader        = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache   = $configFactory->createCache($loader); | ||||
| 
 | ||||
| 		$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
 | ||||
| 		$configFactory = new ConfigFactory(); | ||||
| 		$loader        = new ConfigFileLoader($this->root->url()); | ||||
| 		$loader        = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache   = $configFactory->createCache($loader); | ||||
| 
 | ||||
| 		$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
 | ||||
| 		$configFactory = new ConfigFactory(); | ||||
| 		$loader = new ConfigFileLoader($this->root->url()); | ||||
| 		$loader = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache = $configFactory->createCache($loader); | ||||
| 
 | ||||
| 		$dba = new StaticDatabase($configCache, $profiler, $logger); | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ class ConfigFileLoaderTest extends MockedTest | |||
| 	{ | ||||
| 		$this->delConfigFile('local.config.php'); | ||||
| 
 | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url()); | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache = new Cache(); | ||||
| 
 | ||||
| 		$configFileLoader->setupCache($configCache); | ||||
|  | @ -67,7 +67,7 @@ class ConfigFileLoaderTest extends MockedTest | |||
| 			->at($this->root->getChild('config')) | ||||
| 			->setContent('<?php return true;'); | ||||
| 
 | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url()); | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache = new Cache(); | ||||
| 
 | ||||
| 		$configFileLoader->setupCache($configCache); | ||||
|  | @ -91,7 +91,7 @@ class ConfigFileLoaderTest extends MockedTest | |||
| 			->at($this->root->getChild('config')) | ||||
| 			->setContent(file_get_contents($file)); | ||||
| 
 | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url()); | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache = new Cache(); | ||||
| 
 | ||||
| 		$configFileLoader->setupCache($configCache); | ||||
|  | @ -123,7 +123,7 @@ class ConfigFileLoaderTest extends MockedTest | |||
| 			->at($this->root->getChild('config')) | ||||
| 			->setContent(file_get_contents($file)); | ||||
| 
 | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url()); | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache = new Cache(); | ||||
| 
 | ||||
| 		$configFileLoader->setupCache($configCache); | ||||
|  | @ -154,7 +154,7 @@ class ConfigFileLoaderTest extends MockedTest | |||
| 			->at($this->root) | ||||
| 			->setContent(file_get_contents($file)); | ||||
| 
 | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url()); | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache = new Cache(); | ||||
| 
 | ||||
| 		$configFileLoader->setupCache($configCache); | ||||
|  | @ -203,7 +203,7 @@ class ConfigFileLoaderTest extends MockedTest | |||
| 			->at($this->root->getChild('addon')->getChild('test')->getChild('config')) | ||||
| 			->setContent(file_get_contents($file)); | ||||
| 
 | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url()); | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url(), []); | ||||
| 
 | ||||
| 		$conf = $configFileLoader->loadAddonConfig('test'); | ||||
| 
 | ||||
|  | @ -235,7 +235,7 @@ class ConfigFileLoaderTest extends MockedTest | |||
| 				->at($this->root->getChild('config')) | ||||
| 		         ->setContent(file_get_contents($fileDir . 'B.config.php')); | ||||
| 
 | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url()); | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache = new Cache(); | ||||
| 
 | ||||
| 		$configFileLoader->setupCache($configCache); | ||||
|  | @ -264,7 +264,7 @@ class ConfigFileLoaderTest extends MockedTest | |||
| 		         ->at($this->root->getChild('config')) | ||||
| 		         ->setContent(file_get_contents($fileDir . 'B.ini.php')); | ||||
| 
 | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url()); | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache = new Cache(); | ||||
| 
 | ||||
| 		$configFileLoader->setupCache($configCache); | ||||
|  | @ -293,7 +293,7 @@ class ConfigFileLoaderTest extends MockedTest | |||
| 		         ->at($this->root->getChild('config')) | ||||
| 		         ->setContent(file_get_contents($fileDir . 'B.ini.php')); | ||||
| 
 | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url()); | ||||
| 		$configFileLoader = new ConfigFileLoader($this->root->url(), []); | ||||
| 		$configCache = new Cache(); | ||||
| 
 | ||||
| 		$configFileLoader->setupCache($configCache); | ||||
|  | @ -301,4 +301,44 @@ class ConfigFileLoaderTest extends MockedTest | |||
| 		self::assertEquals('admin@test.it', $configCache->get('config', 'admin_email')); | ||||
| 		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…
	
	Add table
		Add a link
		
	
		Reference in a new issue