use Friendica\Database\DBA;
if (!defined('DB_UPDATE_VERSION')) {
- define('DB_UPDATE_VERSION', 1304);
+ define('DB_UPDATE_VERSION', 1305);
}
return [
update_table($a, "gcontact", ['connect', 'addr'], $old_host, $new_host);
// update config
+ $configCacheSaver = new \Friendica\Util\Config\ConfigCacheSaver($a->getBasePath());
+ $configCacheSaver->saveToConfigFile('system', 'hostname', parse_url($new_url, PHP_URL_HOST));
Config::set('system', 'hostname', parse_url($new_url, PHP_URL_HOST));
Config::set('system', 'url', $new_url);
$a->setBaseURL($new_url);
// end relocate
$sitename = (!empty($_POST['sitename']) ? Strings::escapeTags(trim($_POST['sitename'])) : '');
- $hostname = (!empty($_POST['hostname']) ? Strings::escapeTags(trim($_POST['hostname'])) : '');
$sender_email = (!empty($_POST['sender_email']) ? Strings::escapeTags(trim($_POST['sender_email'])) : '');
$banner = (!empty($_POST['banner']) ? trim($_POST['banner']) : false);
$shortcut_icon = (!empty($_POST['shortcut_icon']) ? Strings::escapeTags(trim($_POST['shortcut_icon'])) : '');
$itemcache_duration = (!empty($_POST['itemcache_duration']) ? intval($_POST['itemcache_duration']) : 0);
$max_comments = (!empty($_POST['max_comments']) ? intval($_POST['max_comments']) : 0);
$temppath = (!empty($_POST['temppath']) ? Strings::escapeTags(trim($_POST['temppath'])) : '');
- $basepath = (!empty($_POST['basepath']) ? Strings::escapeTags(trim($_POST['basepath'])) : '');
$singleuser = (!empty($_POST['singleuser']) ? Strings::escapeTags(trim($_POST['singleuser'])) : '');
$proxy_disabled = !empty($_POST['proxy_disabled']);
$only_tag_search = !empty($_POST['only_tag_search']);
Config::set('system', 'poco_local_search' , $poco_local_search);
Config::set('system', 'nodeinfo' , $nodeinfo);
Config::set('config', 'sitename' , $sitename);
- Config::set('config', 'hostname' , $hostname);
Config::set('config', 'sender_email' , $sender_email);
Config::set('system', 'suppress_tags' , $suppress_tags);
Config::set('system', 'shortcut_icon' , $shortcut_icon);
Config::set('system', 'temppath', $temppath);
- if ($basepath != '') {
- $basepath = BasePath::getRealPath($basepath);
- }
-
Config::set('system', 'basepath' , $basepath);
Config::set('system', 'proxy_disabled' , $proxy_disabled);
Config::set('system', 'only_tag_search' , $only_tag_search);
"develop" => L10n::t("check the development version")
];
- if (empty(Config::get('config', 'hostname'))) {
- Config::set('config', 'hostname', $a->getHostName());
- }
$diaspora_able = ($a->getURLPath() == "");
$optimize_max_tablesize = Config::get('system', 'optimize_max_tablesize', -1);
// name, label, value, help string, extra data...
'$sitename' => ['sitename', L10n::t("Site name"), Config::get('config', 'sitename'), ''],
- '$hostname' => ['hostname', L10n::t("Host name"), Config::get('config', 'hostname'), ""],
'$sender_email' => ['sender_email', L10n::t("Sender Email"), Config::get('config', 'sender_email'), L10n::t("The email address your server shall use to send notification emails from."), "", "", "email"],
'$banner' => ['banner', L10n::t("Banner/Logo"), $banner, ""],
'$shortcut_icon' => ['shortcut_icon', L10n::t("Shortcut icon"), Config::get('system', 'shortcut_icon'), L10n::t("Link to an icon that will be used for browsers.")],
'$itemcache_duration' => ['itemcache_duration', L10n::t("Cache duration in seconds"), Config::get('system', 'itemcache_duration'), L10n::t("How long should the cache files be hold? Default value is 86400 seconds \x28One day\x29. To disable the item cache, set the value to -1.")],
'$max_comments' => ['max_comments', L10n::t("Maximum numbers of comments per post"), Config::get('system', 'max_comments'), L10n::t("How much comments should be shown for each post? Default value is 100.")],
'$temppath' => ['temppath', L10n::t("Temp path"), Config::get('system', 'temppath'), L10n::t("If you have a restricted system where the webserver can't access the system temp path, enter another path here.")],
- '$basepath' => ['basepath', L10n::t("Base path to installation"), Config::get('system', 'basepath'), L10n::t("If the system cannot detect the correct path to your installation, enter the correct path here. This setting should only be set if you are using a restricted system and symbolic links to your webroot.")],
'$proxy_disabled' => ['proxy_disabled', L10n::t("Disable picture proxy"), Config::get('system', 'proxy_disabled'), L10n::t("The picture proxy increases performance and privacy. It shouldn't be used on systems with very low bandwidth.")],
'$only_tag_search' => ['only_tag_search', L10n::t("Only search in tags"), Config::get('system', 'only_tag_search'), L10n::t("On large systems the text search can slow down the system extremely.")],
/**
* Tries to load the specified core-configuration and returns the config array.
*
- * @param string $name The name of the configuration
+ * @param string $name The name of the configuration (default is empty, which means 'local')
*
* @return array The config array (empty if no config found)
*
* @throws \Exception if the configuration file isn't readable
*/
- public function loadCoreConfig($name)
+ public function loadCoreConfig($name = '')
{
if (!empty($this->getConfigFullName($name))) {
return $this->loadConfigFile($this->getConfigFullName($name));
/**
* Tries to load the legacy config files (.htconfig.php, .htpreconfig.php) and returns the config array.
*
- * @param string $name The name of the config file
+ * @param string $name The name of the config file (default is empty, which means .htconfig.php)
*
* @return array The configuration array (empty if no config found)
*
* @deprecated since version 2018.09
*/
- private function loadLegacyConfig($name)
+ private function loadLegacyConfig($name = '')
{
$config = [];
if (!empty($this->getHtConfigFullName($name))) {
*/
const SUBDIRECTORY = 'config';
+ /**
+ * The default name of the user defined config file
+ * @var string
+ */
+ const CONFIG_LOCAL = 'local';
+
+ /**
+ * The default name of the user defined ini file
+ * @var string
+ */
+ const CONFIG_INI = 'ini';
+
+ /**
+ * The default name of the user defined legacy config file
+ * @var string
+ */
+ const CONFIG_HTCONFIG = 'htconfig';
+
protected $baseDir;
protected $configDir;
+ /**
+ * @param string $baseDir The base directory of Friendica
+ */
public function __construct($baseDir)
{
$this->baseDir = $baseDir;
$this->configDir = $baseDir . DIRECTORY_SEPARATOR . self::SUBDIRECTORY;
}
- protected function getConfigFullName($name)
+ /**
+ * Gets the full name (including the path) for a *.config.php (default is local.config.php)
+ *
+ * @param string $name The config name (default is empty, which means local.config.php)
+ *
+ * @return string The full name or empty if not found
+ */
+ protected function getConfigFullName($name = '')
{
+ $name = !empty($name) ? $name : self::CONFIG_LOCAL;
+
$fullName = $this->configDir . DIRECTORY_SEPARATOR . $name . '.config.php';
return file_exists($fullName) ? $fullName : '';
}
- protected function getIniFullName($name)
+ /**
+ * Gets the full name (including the path) for a *.ini.php (default is local.ini.php)
+ *
+ * @param string $name The config name (default is empty, which means local.ini.php)
+ *
+ * @return string The full name or empty if not found
+ */
+ protected function getIniFullName($name = '')
{
+ $name = !empty($name) ? $name : self::CONFIG_INI;
+
$fullName = $this->configDir . DIRECTORY_SEPARATOR . $name . '.ini.php';
return file_exists($fullName) ? $fullName : '';
}
- protected function getHtConfigFullName($name)
+ /**
+ * Gets the full name (including the path) for a .*.php (default is .htconfig.php)
+ *
+ * @param string $name The config name (default is empty, which means .htconfig.php)
+ *
+ * @return string The full name or empty if not found
+ */
+ protected function getHtConfigFullName($name = '')
{
+ $name = !empty($name) ? $name : self::CONFIG_HTCONFIG;
+
$fullName = $this->baseDir . DIRECTORY_SEPARATOR . '.' . $name . '.php';
return file_exists($fullName) ? $fullName : '';
}
const INDENT = "\t";
/**
- * Saves a given value to the config file
+ * The settings array to save to
+ * @var array
+ */
+ private $settings = [];
+
+ /**
+ * Adds a given value to the config file
* Either it replaces the current value or it will get added
*
* @param string $cat The configuration category
* @param string $key The configuration key
* @param string $value The new value
*/
- public function saveToConfigFile($cat, $key, $value)
+ public function addConfigValue($cat, $key, $value)
+ {
+ $this->settings[$cat][$key] = $value;
+ }
+
+ public function reset()
+ {
+ $this->settings = [];
+ }
+
+ public function saveToConfigFile($name = '')
{
- $this->saveToLegacyConfig('htpreconfig', $cat, $key, $value);
- $this->saveToLegacyConfig('htconfig', $cat, $key, $value);
- $this->saveToCoreConfig('local', $cat, $key, $value);
+ $saved = false;
+
+ if (!empty($this->getConfigFullName($name))) {
+ $this->saveConfigFile($this->getConfigFullName($name));
+ $saved = true;
+ }
+
+ if (!empty($this->getIniFullName($name))) {
+ $this->saveINIConfigFile($this->getIniFullName($name));
+ $saved = true;
+ }
+
+ if (!empty($this->getHtConfigFullName($name))) {
+ $this->saveToLegacyConfig($this->getHtConfigFullName($name));
+ $saved = true;
+ }
+
+ return $saved;
}
/**
{
$this->delConfigFile('local.config.php');
- $file = dirname(__DIR__) . DIRECTORY_SEPARATOR;
+ $file = dirname(__DIR__) . DIRECTORY_SEPARATOR .
+ '..' . DIRECTORY_SEPARATOR .
+ '..' . DIRECTORY_SEPARATOR .
+ 'datasets' . DIRECTORY_SEPARATOR .
+ 'config' . DIRECTORY_SEPARATOR .
+ 'local.config.php';
vfsStream::newFile('local.config.php')
->at($this->root->getChild('config'))
{
$this->delConfigFile('local.config.php');
- $file = dirname(__DIR__) . DIRECTORY_SEPARATOR;
+ $file = dirname(__DIR__) . DIRECTORY_SEPARATOR .
+ '..' . DIRECTORY_SEPARATOR .
+ '..' . DIRECTORY_SEPARATOR .
+ 'datasets' . DIRECTORY_SEPARATOR .
+ 'config' . DIRECTORY_SEPARATOR .
+ 'local.ini.php';
vfsStream::newFile('local.ini.php')
->at($this->root->getChild('config'))
{
$this->delConfigFile('local.config.php');
- $file = dirname(__DIR__) . DIRECTORY_SEPARATOR;
+ $file = dirname(__DIR__) . DIRECTORY_SEPARATOR .
+ '..' . DIRECTORY_SEPARATOR .
+ '..' . DIRECTORY_SEPARATOR .
+ 'datasets' . DIRECTORY_SEPARATOR .
+ 'config' . DIRECTORY_SEPARATOR .
+ '.htconfig.test.php';
vfsStream::newFile('.htconfig.php')
->at($this->root)
vfsStream::create($structure, $this->root);
- $file = dirname(__DIR__) . DIRECTORY_SEPARATOR;
+ $file = dirname(__DIR__) . DIRECTORY_SEPARATOR .
+ '..' . DIRECTORY_SEPARATOR .
+ '..' . DIRECTORY_SEPARATOR .
+ 'datasets' . DIRECTORY_SEPARATOR .
+ 'config' . DIRECTORY_SEPARATOR .
+ 'local.config.php';
vfsStream::newFile('test.config.php')
->at($this->root->getChild('addon')->getChild('test')->getChild('config'))
{
$this->delConfigFile('local.config.php');
$file = dirname(__DIR__) . DIRECTORY_SEPARATOR .
- '..' . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR .
'datasets' . DIRECTORY_SEPARATOR .
'config' . DIRECTORY_SEPARATOR .
'local.config.php';
+
vfsStream::newFile('local.config.php')
->at($this->root->getChild('config'))
->setContent(file_get_contents($file));
+
$configCacheSaver = new ConfigCacheSaver($this->root->url());
$configCacheLoader = new ConfigCacheLoader($this->root->url(), $this->mode);
$configCache = new ConfigCache();
$configCacheLoader->loadConfigFiles($configCache);
+
$this->assertEquals('admin@test.it', $configCache->get('config', 'admin_email'));
- $this->assertEquals('!<unset>!', $configCache->get('config', 'test_val'));
+ $this->assertNull($configCache->get('config', 'test_val'));
+
$configCacheSaver->saveToConfigFile('config', 'admin_email', 'new@mail.it');
$configCacheSaver->saveToConfigFile('config', 'test_val', 'Testing$!"$with@all.we can!');
+
$newConfigCache = new ConfigCache();
$configCacheLoader->loadConfigFiles($newConfigCache);
+
$this->assertEquals('new@mail.it', $newConfigCache->get('config', 'admin_email'));
$this->assertEquals('Testing$!"$with@all.we can!', $newConfigCache->get('config', 'test_val'));
$this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.config.php'));
$this->assertTrue($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.config.php.old'));
$this->assertFalse($this->root->hasChild('config' . DIRECTORY_SEPARATOR . 'local.config.php.tmp'));
+
$this->assertEquals(file_get_contents($file), file_get_contents($this->root->getChild('config' . DIRECTORY_SEPARATOR . 'local.config.php.old')->url()));
}
/**
{
$this->delConfigFile('local.config.php');
$file = dirname(__DIR__) . DIRECTORY_SEPARATOR .
- '..' . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR .
'..' . DIRECTORY_SEPARATOR .
'datasets' . DIRECTORY_SEPARATOR .
$configCache = new ConfigCache();
$configCacheLoader->loadConfigFiles($configCache);
$this->assertEquals('admin@test.it', $configCache->get('config', 'admin_email'));
- $this->assertEquals('!<unset>!', $configCache->get('config', 'test_val'));
+ $this->assertNull($configCache->get('config', 'test_val'));
$configCacheSaver->saveToConfigFile('config', 'admin_email', 'new@mail.it');
$configCacheSaver->saveToConfigFile('config', 'test_val', "Testing@with.all we can");
$newConfigCache = new ConfigCache();
use Friendica\Model\GContact;
use Friendica\Model\Item;
use Friendica\Model\User;
+use Friendica\Util\Config\ConfigCacheSaver;
use Friendica\Util\DateTimeFormat;
/**
}
return Update::SUCCESS;
}
+
+/**
+ * @see https://github.com/friendica/friendica/pull/6815
+ *
+ * @return int Success
+ */
+function update_1303()
+{
+ $app = \Friendica\BaseObject::getApp();
+ $configCache = $app->getConfigCache();
+ $configCacheSaver = new ConfigCacheSaver($app->getBasePath());
+ $updateConfigEntry = function($cat, $key) use ($configCache, $configCacheSaver) {
+ // check if the config file differs from the whole configuration (= The db contains other values)
+ $fileConfig = $configCache->get($cat, $key);
+ if ($fileConfig === '!<unset>!') {
+ $fileConfig = null;
+ }
+ $savedConfig = Config::get($cat, $key, null, true);
+ if ($fileConfig !== $savedConfig) {
+ Logger::info('Difference in config found', ['cat' => $cat, 'key' => $key, 'file' => $fileConfig, 'saved' => $savedConfig]);
+ $configCacheSaver->saveToConfigFile($cat, $key, $savedConfig);
+ } else {
+ Logger::info('No Difference in config found', ['cat' => $cat, 'key' => $key, 'value' => $fileConfig, 'saved' => $savedConfig]);
+ }
+ };
+ $updateConfigEntry('config', 'hostname');
+ $updateConfigEntry('system', 'basepath');
+ return Update::SUCCESS;
+}
<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
{{include file="field_input.tpl" field=$sitename}}
- {{include file="field_input.tpl" field=$hostname}}
{{include file="field_input.tpl" field=$sender_email}}
{{include file="field_textarea.tpl" field=$banner}}
{{include file="field_input.tpl" field=$shortcut_icon}}
{{include file="field_input.tpl" field=$optimize_fragmentation}}
{{include file="field_input.tpl" field=$abandon_days}}
{{include file="field_input.tpl" field=$temppath}}
- {{include file="field_input.tpl" field=$basepath}}
{{include file="field_checkbox.tpl" field=$suppress_tags}}
{{include file="field_checkbox.tpl" field=$nodeinfo}}
{{include file="field_select.tpl" field=$check_new_version_url}}
],
'system' => [
'urlpath' => '{{$urlpath}}',
+ 'basepath' => '{{$basepath}}',
'default_timezone' => '{{$timezone}}',
'language' => '{{$language}}',
],