Disable setting fields in case we use environment variables

This commit is contained in:
Philipp 2023-03-25 19:02:47 +01:00
parent f61fd93db0
commit 76f3b07033
No known key found for this signature in database
GPG key ID: 24A7501396EB5432
11 changed files with 65 additions and 19 deletions

View file

@ -58,6 +58,16 @@ interface IManageConfigValues
*/ */
public function get(string $cat, string $key = null, $default_value = null); public function get(string $cat, string $key = null, $default_value = null);
/**
* Returns true, if the current config cannot be changed
*
* @param string $cat The category of the configuration value
* @param string $key The configuration key to query
*
* @return bool true, if set is disabled
*/
public function isSetDisabled(string $cat, string $key): bool;
/** /**
* Sets a configuration value for system config * Sets a configuration value for system config
* *

View file

@ -80,6 +80,12 @@ class DatabaseConfig implements IManageConfigValues
return $this->cache->get($cat, $key) ?? $default_value; return $this->cache->get($cat, $key) ?? $default_value;
} }
/** {@inheritDoc} */
public function isSetDisabled(string $cat, string $key): bool
{
return $this->cache->getSource($cat, $key) >= Cache::SOURCE_ENV;
}
/** {@inheritDoc} */ /** {@inheritDoc} */
public function set(string $cat, string $key, $value): bool public function set(string $cat, string $key, $value): bool
{ {

View file

@ -68,6 +68,12 @@ class ReadOnlyFileConfig implements IManageConfigValues
return $this->configCache->get($cat, $key) ?? $default_value; return $this->configCache->get($cat, $key) ?? $default_value;
} }
/** {@inheritDoc} */
public function isSetDisabled(string $cat, string $key): bool
{
return $this->configCache->getSource($cat, $key) >= Cache::SOURCE_ENV;
}
/** {@inheritDoc} */ /** {@inheritDoc} */
public function set(string $cat, string $key, $value): bool public function set(string $cat, string $key, $value): bool
{ {

View file

@ -31,6 +31,15 @@ use ParagonIE\HiddenString\HiddenString;
*/ */
class Cache class Cache
{ {
/** @var int[] A list of valid config source */
const VALID_SOURCES = [
self::SOURCE_STATIC,
self::SOURCE_FILE,
self::SOURCE_DATA,
self::SOURCE_ENV,
self::SOURCE_FIX,
];
/** @var int Indicates that the cache entry is a default value - Lowest Priority */ /** @var int Indicates that the cache entry is a default value - Lowest Priority */
const SOURCE_STATIC = 0; const SOURCE_STATIC = 0;
/** @var int Indicates that the cache entry is set by file - Low Priority */ /** @var int Indicates that the cache entry is set by file - Low Priority */

View file

@ -48,9 +48,15 @@ class Settings extends BaseAdmin
return; return;
} }
if (!DI::config()->isSetDisabled('system', 'logfile')) {
DI::config()->set('system', 'logfile', $logfile); DI::config()->set('system', 'logfile', $logfile);
}
if (!DI::config()->isSetDisabled('system', 'debugging')) {
DI::config()->set('system', 'debugging', $debugging); DI::config()->set('system', 'debugging', $debugging);
}
if (!DI::config()->isSetDisabled('system', 'loglevel')) {
DI::config()->set('system', 'loglevel', $loglevel); DI::config()->set('system', 'loglevel', $loglevel);
}
DI::baseUrl()->redirect('admin/logs'); DI::baseUrl()->redirect('admin/logs');
} }
@ -82,9 +88,9 @@ class Settings extends BaseAdmin
'$clear' => DI::l10n()->t('Clear'), '$clear' => DI::l10n()->t('Clear'),
'$logname' => DI::config()->get('system', 'logfile'), '$logname' => DI::config()->get('system', 'logfile'),
// see /help/smarty3-templates#1_1 on any Friendica node // see /help/smarty3-templates#1_1 on any Friendica node
'$debugging' => ['debugging', DI::l10n()->t("Enable Debugging"), DI::config()->get('system', 'debugging'), ""], '$debugging' => ['debugging', DI::l10n()->t("Enable Debugging"), DI::config()->get('system', 'debugging'), "", DI::config()->isSetDisabled('system', 'debugging') ? 'disabled' : ''],
'$logfile' => ['logfile', DI::l10n()->t("Log file"), DI::config()->get('system', 'logfile'), DI::l10n()->t("Must be writable by web server. Relative to your Friendica top-level directory.")], '$logfile' => ['logfile', DI::l10n()->t("Log file"), DI::config()->get('system', 'logfile'), DI::l10n()->t("Must be writable by web server. Relative to your Friendica top-level directory."), "", DI::config()->isSetDisabled('system', 'logfile') ? 'disabled' : ''],
'$loglevel' => ['loglevel', DI::l10n()->t("Log level"), DI::config()->get('system', 'loglevel'), "", $log_choices], '$loglevel' => ['loglevel', DI::l10n()->t("Log level"), DI::config()->get('system', 'loglevel'), "", $log_choices, DI::config()->isSetDisabled('system', 'loglevel') ? 'disabled' : ''],
'$form_security_token' => self::getFormSecurityToken("admin_logs"), '$form_security_token' => self::getFormSecurityToken("admin_logs"),
'$phpheader' => DI::l10n()->t("PHP logging"), '$phpheader' => DI::l10n()->t("PHP logging"),
'$phphint' => DI::l10n()->t("To temporarily enable logging of PHP errors and warnings you can prepend the following to the index.php file of your installation. The filename set in the 'error_log' line is relative to the friendica top-level directory and must be writeable by the web server. The option '1' for 'log_errors' and 'display_errors' is to enable these options, set to '0' to disable them."), '$phphint' => DI::l10n()->t("To temporarily enable logging of PHP errors and warnings you can prepend the following to the index.php file of your installation. The filename set in the 'error_log' line is relative to the friendica top-level directory and must be writeable by the web server. The option '1' for 'log_errors' and 'display_errors' is to enable these options, set to '0' to disable them."),

View file

@ -165,7 +165,9 @@ class Site extends BaseAdmin
$transactionConfig->set('system', 'poco_discovery' , $poco_discovery); $transactionConfig->set('system', 'poco_discovery' , $poco_discovery);
$transactionConfig->set('system', 'poco_local_search' , $poco_local_search); $transactionConfig->set('system', 'poco_local_search' , $poco_local_search);
$transactionConfig->set('system', 'nodeinfo' , $nodeinfo); $transactionConfig->set('system', 'nodeinfo' , $nodeinfo);
if (!DI::config()->isSetDisabled('config', 'sitename')) {
$transactionConfig->set('config', 'sitename' , $sitename); $transactionConfig->set('config', 'sitename' , $sitename);
}
$transactionConfig->set('config', 'sender_email' , $sender_email); $transactionConfig->set('config', 'sender_email' , $sender_email);
$transactionConfig->set('system', 'suppress_tags' , $suppress_tags); $transactionConfig->set('system', 'suppress_tags' , $suppress_tags);
$transactionConfig->set('system', 'shortcut_icon' , $shortcut_icon); $transactionConfig->set('system', 'shortcut_icon' , $shortcut_icon);
@ -188,7 +190,9 @@ class Site extends BaseAdmin
} else { } else {
$transactionConfig->set('config', 'info', $additional_info); $transactionConfig->set('config', 'info', $additional_info);
} }
if (!DI::config()->isSetDisabled('system', 'language')) {
$transactionConfig->set('system', 'language', $language); $transactionConfig->set('system', 'language', $language);
}
$transactionConfig->set('system', 'theme', $theme); $transactionConfig->set('system', 'theme', $theme);
Theme::install($theme); Theme::install($theme);
@ -413,7 +417,7 @@ class Site extends BaseAdmin
'$relocate_cmd' => DI::l10n()->t('(Friendica directory)# bin/console relocate https://newdomain.com'), '$relocate_cmd' => DI::l10n()->t('(Friendica directory)# bin/console relocate https://newdomain.com'),
// name, label, value, help string, extra data... // name, label, value, help string, extra data...
'$sitename' => ['sitename', DI::l10n()->t('Site name'), DI::config()->get('config', 'sitename'), ''], '$sitename' => ['sitename', DI::l10n()->t('Site name'), DI::config()->get('config', 'sitename'), '', '', DI::config()->isSetDisabled('config', 'sitename') ? 'disabled' : ''],
'$sender_email' => ['sender_email', DI::l10n()->t('Sender Email'), DI::config()->get('config', 'sender_email'), DI::l10n()->t('The email address your server shall use to send notification emails from.'), '', '', 'email'], '$sender_email' => ['sender_email', DI::l10n()->t('Sender Email'), DI::config()->get('config', 'sender_email'), DI::l10n()->t('The email address your server shall use to send notification emails from.'), '', '', 'email'],
'$system_actor_name' => ['system_actor_name', DI::l10n()->t('Name of the system actor'), User::getActorName(), DI::l10n()->t("Name of the internal system account that is used to perform ActivityPub requests. This must be an unused username. If set, this can't be changed again.")], '$system_actor_name' => ['system_actor_name', DI::l10n()->t('Name of the system actor'), User::getActorName(), DI::l10n()->t("Name of the internal system account that is used to perform ActivityPub requests. This must be an unused username. If set, this can't be changed again.")],
'$banner' => ['banner', DI::l10n()->t('Banner/Logo'), $banner, ''], '$banner' => ['banner', DI::l10n()->t('Banner/Logo'), $banner, ''],
@ -421,7 +425,7 @@ class Site extends BaseAdmin
'$shortcut_icon' => ['shortcut_icon', DI::l10n()->t('Shortcut icon'), DI::config()->get('system', 'shortcut_icon'), DI::l10n()->t('Link to an icon that will be used for browsers.')], '$shortcut_icon' => ['shortcut_icon', DI::l10n()->t('Shortcut icon'), DI::config()->get('system', 'shortcut_icon'), DI::l10n()->t('Link to an icon that will be used for browsers.')],
'$touch_icon' => ['touch_icon', DI::l10n()->t('Touch icon'), DI::config()->get('system', 'touch_icon'), DI::l10n()->t('Link to an icon that will be used for tablets and mobiles.')], '$touch_icon' => ['touch_icon', DI::l10n()->t('Touch icon'), DI::config()->get('system', 'touch_icon'), DI::l10n()->t('Link to an icon that will be used for tablets and mobiles.')],
'$additional_info' => ['additional_info', DI::l10n()->t('Additional Info'), $additional_info, DI::l10n()->t('For public servers: you can add additional information here that will be listed at %s/servers.', Search::getGlobalDirectory())], '$additional_info' => ['additional_info', DI::l10n()->t('Additional Info'), $additional_info, DI::l10n()->t('For public servers: you can add additional information here that will be listed at %s/servers.', Search::getGlobalDirectory())],
'$language' => ['language', DI::l10n()->t('System language'), DI::config()->get('system', 'language'), '', $lang_choices], '$language' => ['language', DI::l10n()->t('System language'), DI::config()->get('system', 'language'), '', $lang_choices, DI::config()->isSetDisabled('system', 'language') ? 'disabled' : ''],
'$theme' => ['theme', DI::l10n()->t('System theme'), DI::config()->get('system', 'theme'), DI::l10n()->t('Default system theme - may be over-ridden by user profiles - <a href="%s" id="cnftheme">Change default theme settings</a>', DI::baseUrl() . '/admin/themes'), $theme_choices], '$theme' => ['theme', DI::l10n()->t('System theme'), DI::config()->get('system', 'theme'), DI::l10n()->t('Default system theme - may be over-ridden by user profiles - <a href="%s" id="cnftheme">Change default theme settings</a>', DI::baseUrl() . '/admin/themes'), $theme_choices],
'$theme_mobile' => ['theme_mobile', DI::l10n()->t('Mobile system theme'), DI::config()->get('system', 'mobile-theme', '---'), DI::l10n()->t('Theme for mobile devices'), $theme_choices_mobile], '$theme_mobile' => ['theme_mobile', DI::l10n()->t('Mobile system theme'), DI::config()->get('system', 'mobile-theme', '---'), DI::l10n()->t('Theme for mobile devices'), $theme_choices_mobile],
'$force_ssl' => ['force_ssl', DI::l10n()->t('Force SSL'), DI::config()->get('system', 'force_ssl'), DI::l10n()->t('Force all Non-SSL requests to SSL - Attention: on some systems it could lead to endless loops.')], '$force_ssl' => ['force_ssl', DI::l10n()->t('Force SSL'), DI::config()->get('system', 'force_ssl'), DI::l10n()->t('Force all Non-SSL requests to SSL - Attention: on some systems it could lead to endless loops.')],

View file

@ -76,7 +76,7 @@ class Storage extends BaseAdmin
} }
} }
if (!empty($_POST['submit_save_set'])) { if (!empty($_POST['submit_save_set']) && !DI::config()->isSetDisabled('storage', 'name') ) {
try { try {
$newstorage = DI::storageManager()->getWritableStorageByName($storagebackend); $newstorage = DI::storageManager()->getWritableStorageByName($storagebackend);
@ -129,6 +129,7 @@ class Storage extends BaseAdmin
'prefix' => $storage_form_prefix, 'prefix' => $storage_form_prefix,
'form' => $storage_form, 'form' => $storage_form,
'active' => $current_storage_backend instanceof ICanWriteToStorage && $name === $current_storage_backend::getName(), 'active' => $current_storage_backend instanceof ICanWriteToStorage && $name === $current_storage_backend::getName(),
'set_disabled' => DI::config()->isSetDisabled('storage', 'name'),
]; ];
} }

View file

@ -19,12 +19,14 @@
{{if $storage.form}} {{if $storage.form}}
<input type="submit" name="submit_save" value="{{$save}}"/> <input type="submit" name="submit_save" value="{{$save}}"/>
{{if ! $storage.set_disabled}}
{{if $storage.active}} {{if $storage.active}}
<input type="submit" name="submit_save_set" value="{{$save_reload}}"/> <input type="submit" name="submit_save_set" value="{{$save_reload}}"/>
{{else}} {{else}}
<input type="submit" name="submit_save_set" value="{{$save_use}}"/> <input type="submit" name="submit_save_set" value="{{$save_use}}"/>
{{/if}} {{/if}}
{{else}} {{/if}}
{{elseif ! $storage.set_disabled}}
<br /><input type="submit" name="submit_save_set" {{if $storage.active}}disabled="disabled"{{/if}} value="{{$use}}"/> <br /><input type="submit" name="submit_save_set" {{if $storage.active}}disabled="disabled"{{/if}} value="{{$use}}"/>
{{/if}} {{/if}}
</form> </form>

View file

@ -1,7 +1,7 @@
<div class="field select"> <div class="field select">
<label for="id_{{$field.0}}">{{$field.1}}</label> <label for="id_{{$field.0}}">{{$field.1}}</label>
<select name="{{$field.0}}" id="id_{{$field.0}}" aria-describedby="{{$field.0}}_tip"> <select name="{{$field.0}}" id="id_{{$field.0}}" aria-describedby="{{$field.0}}_tip" {{$field.5 nofilter}}>
{{foreach $field.4 as $opt=>$val}} {{foreach $field.4 as $opt=>$val}}
<option value="{{$opt}}" dir="auto"{{if $opt==$field.2}} selected="selected"{{/if}}>{{$val}}</option> <option value="{{$opt}}" dir="auto"{{if $opt==$field.2}} selected="selected"{{/if}}>{{$val}}</option>
{{/foreach}} {{/foreach}}

View file

@ -33,12 +33,14 @@
<div class="panel-footer"> <div class="panel-footer">
{{if $storage.form}} {{if $storage.form}}
<input type="submit" name="submit_save" class="btn btn-primary" value="{{$save}}"/> <input type="submit" name="submit_save" class="btn btn-primary" value="{{$save}}"/>
{{if ! $storage.set_disabled}}
{{if $storage.active}} {{if $storage.active}}
<input type="submit" name="submit_save_set" class="btn btn-primary" value="{{$save_reload}}"/> <input type="submit" name="submit_save_set" class="btn btn-primary" value="{{$save_reload}}"/>
{{else}} {{else}}
<input type="submit" name="submit_save_set" class="btn btn-primary" value="{{$save_use}}"/> <input type="submit" name="submit_save_set" class="btn btn-primary" value="{{$save_use}}"/>
{{/if}} {{/if}}
{{else}} {{/if}}
{{elseif ! $storage.set_disabled }}
<input type="submit" name="submit_save_set" class="btn btn-primary" {{if $storage.active}}disabled="disabled"{{/if}} value="{{$use}}"/> <input type="submit" name="submit_save_set" class="btn btn-primary" {{if $storage.active}}disabled="disabled"{{/if}} value="{{$use}}"/>
{{/if}} {{/if}}
</div> </div>

View file

@ -1,7 +1,7 @@
<div class="form-group field select"> <div class="form-group field select">
<label for="id_{{$field.0}}">{{$field.1}}</label> <label for="id_{{$field.0}}">{{$field.1}}</label>
<select name="{{$field.0}}" id="id_{{$field.0}}" class="form-control" aria-describedby="{{$field.0}}_tip"> <select name="{{$field.0}}" id="id_{{$field.0}}" class="form-control" aria-describedby="{{$field.0}}_tip" {{$field.5 nofilter}}>
{{foreach $field.4 as $opt=>$val}} {{foreach $field.4 as $opt=>$val}}
<option value="{{$opt}}" {{if $opt==$field.2}}selected="selected"{{/if}}>{{$val}}</option> <option value="{{$opt}}" {{if $opt==$field.2}}selected="selected"{{/if}}>{{$val}}</option>
{{/foreach}} {{/foreach}}