diff options
| -rw-r--r-- | app/Controllers/userController.php | 11 | ||||
| -rw-r--r-- | app/Models/Context.php | 8 | ||||
| -rw-r--r-- | app/Models/UserConfiguration.php | 35 | ||||
| -rw-r--r-- | app/views/auth/formLogin.phtml | 2 | ||||
| -rw-r--r-- | app/views/auth/register.phtml | 2 | ||||
| -rw-r--r-- | docs/en/developers/03_Backend/05_Extensions.md | 1 | ||||
| -rw-r--r-- | lib/Minz/Configuration.php | 43 | ||||
| -rw-r--r-- | lib/Minz/ExtensionManager.php | 9 |
8 files changed, 68 insertions, 43 deletions
diff --git a/app/Controllers/userController.php b/app/Controllers/userController.php index 35851fceb..4ce02946b 100644 --- a/app/Controllers/userController.php +++ b/app/Controllers/userController.php @@ -54,8 +54,8 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { } foreach ($userConfigUpdated as $configName => $configValue) { - if ($configValue !== null) { - $userConfig->_param($configName, $configValue); + if ($configName !== '' && $configValue !== null) { + $userConfig->_attribute($configName, $configValue); } } @@ -624,7 +624,12 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController { return; } - $userConfig->_param($field, $value); + if ($field === '') { + Minz_Error::error(400, 'Invalid field name'); + return; + } + + $userConfig->_attribute($field, $value); $ok = $userConfig->save(); FreshRSS_UserDAO::touch($username); diff --git a/app/Models/Context.php b/app/Models/Context.php index 9a4e0192e..27b1c4309 100644 --- a/app/Models/Context.php +++ b/app/Models/Context.php @@ -55,10 +55,12 @@ final class FreshRSS_Context { public static bool $isCli = false; /** + * @access private * @deprecated Will be made `private`; use `FreshRSS_Context::systemConf()` instead. */ public static ?FreshRSS_SystemConfiguration $system_conf = null; /** + * @access private * @deprecated Will be made `private`; use `FreshRSS_Context::userConf()` instead. */ public static ?FreshRSS_UserConfiguration $user_conf = null; @@ -128,10 +130,8 @@ final class FreshRSS_Context { FreshRSS_Context::$search = new FreshRSS_BooleanSearch(''); //Legacy - $oldEntries = FreshRSS_Context::$user_conf->param('old_entries', 0); - $oldEntries = is_numeric($oldEntries) ? (int)$oldEntries : 0; - $keepMin = FreshRSS_Context::$user_conf->param('keep_history_default', -5); - $keepMin = is_numeric($keepMin) ? (int)$keepMin : -5; + $oldEntries = FreshRSS_Context::$user_conf->attributeInt('old_entries') ?? 0; + $keepMin = FreshRSS_Context::$user_conf->attributeInt('keep_history_default') ?? -5; if ($oldEntries > 0 || $keepMin > -5) { //Freshrss < 1.15 $archiving = FreshRSS_Context::$user_conf->archiving; $archiving['keep_max'] = false; diff --git a/app/Models/UserConfiguration.php b/app/Models/UserConfiguration.php index e53de00d3..919487bf0 100644 --- a/app/Models/UserConfiguration.php +++ b/app/Models/UserConfiguration.php @@ -105,39 +105,4 @@ final class FreshRSS_UserConfiguration extends Minz_Configuration { } return $default_user_conf; } - - /** - * @param non-empty-string $key - * @return array<int|string,mixed>|null - */ - public function attributeArray(string $key): ?array { - $a = parent::param($key, null); - return is_array($a) ? $a : null; - } - - /** @param non-empty-string $key */ - public function attributeBool(string $key): ?bool { - $a = parent::param($key, null); - return is_bool($a) ? $a : null; - } - - /** @param non-empty-string $key */ - public function attributeInt(string $key): ?int { - $a = parent::param($key, null); - return is_numeric($a) ? (int)$a : null; - } - - /** @param non-empty-string $key */ - public function attributeString(string $key): ?string { - $a = parent::param($key, null); - return is_string($a) ? $a : null; - } - - /** - * @param non-empty-string $key - * @param array<string,mixed>|mixed|null $value Value, not HTML-encoded - */ - public function _attribute(string $key, $value = null): void { - parent::_param($key, $value); - } } diff --git a/app/views/auth/formLogin.phtml b/app/views/auth/formLogin.phtml index 6deade3f4..d72d0b1b3 100644 --- a/app/views/auth/formLogin.phtml +++ b/app/views/auth/formLogin.phtml @@ -38,6 +38,8 @@ </label> </div> + <?= Minz_ExtensionManager::callHookString('before_login_btn') ?> + <div class="form-group form-group-actions"> <button id="loginButton" type="submit" class="btn btn-important" disabled="disabled"> <?= _t('gen.auth.login') ?> diff --git a/app/views/auth/register.phtml b/app/views/auth/register.phtml index fee221708..daaf08b8c 100644 --- a/app/views/auth/register.phtml +++ b/app/views/auth/register.phtml @@ -66,6 +66,8 @@ </div> <?php } ?> + <?= Minz_ExtensionManager::callHookString('before_login_btn') ?> + <div class="form-group form-group-actions"> <?php $redirect_url = urlencode(Minz_Url::display( diff --git a/docs/en/developers/03_Backend/05_Extensions.md b/docs/en/developers/03_Backend/05_Extensions.md index 4f905ec9b..6550b8e6a 100644 --- a/docs/en/developers/03_Backend/05_Extensions.md +++ b/docs/en/developers/03_Backend/05_Extensions.md @@ -166,6 +166,7 @@ The following events are available: * `api_misc` (`function(): void`): to allow extensions to have own API endpoint on `/api/misc.php/Extension%20Name/` or `/api/misc.php?ext=Extension%20Name`. +* `before_login_btn` (`function(): string`): Allows to insert HTML before the login button. Applies to the create button on the register page as well. Example use case is inserting a captcha widget. * `check_url_before_add` (`function($url) -> Url | null`): will be executed every time a URL is added. The URL itself will be passed as parameter. This way a website known to have feeds which doesn’t advertise it in the header can still be automatically supported. * `custom_favicon_btn_url` (`function(FreshRSS_Feed $feed): string | null`): Allows extensions to implement a button for setting a custom favicon for individual feeds by providing an URL. The URL will be sent a POST request with the `extAction` field set to either `query_icon_info` or `update_icon`, along with an `id` field which describes the feed's ID. Example response for a `query_icon_info` request: diff --git a/lib/Minz/Configuration.php b/lib/Minz/Configuration.php index b56268b4a..a79c364d3 100644 --- a/lib/Minz/Configuration.php +++ b/lib/Minz/Configuration.php @@ -155,6 +155,8 @@ class Minz_Configuration { * @param string $key the name of the param. * @param mixed $default default value to return if key does not exist. * @return array|mixed value corresponding to the key. + * @access private + * @deprecated Use `attribute*()` methods instead. */ public function param(string $key, mixed $default = null): mixed { if (isset($this->data[$key])) { @@ -170,6 +172,8 @@ class Minz_Configuration { /** * A wrapper for param(). * @return array|mixed + * @access private + * @deprecated */ public function __get(string $key): mixed { return $this->param($key); @@ -180,6 +184,8 @@ class Minz_Configuration { * * @param string $key the param name to set. * @param mixed $value the value to set. If null, the key is removed from the configuration. + * @access private + * @deprecated Use `_attribute()` instead. */ public function _param(string $key, mixed $value = null): void { if ($this->configuration_setter !== null && $this->configuration_setter->support($key)) { @@ -193,6 +199,8 @@ class Minz_Configuration { /** * A wrapper for _param(). + * @access private + * @deprecated */ public function __set(string $key, mixed $value): void { $this->_param($key, $value); @@ -217,4 +225,39 @@ class Minz_Configuration { return true; } + + /** + * @param non-empty-string $key + * @return array<int|string,mixed>|null + */ + public function attributeArray(string $key): ?array { + $a = self::param($key, null); + return is_array($a) ? $a : null; + } + + /** @param non-empty-string $key */ + public function attributeBool(string $key): ?bool { + $a = self::param($key, null); + return is_bool($a) ? $a : null; + } + + /** @param non-empty-string $key */ + public function attributeInt(string $key): ?int { + $a = self::param($key, null); + return is_numeric($a) ? (int)$a : null; + } + + /** @param non-empty-string $key */ + public function attributeString(string $key): ?string { + $a = self::param($key, null); + return is_string($a) ? $a : null; + } + + /** + * @param non-empty-string $key + * @param array<string,mixed>|mixed|null $value Value, not HTML-encoded + */ + public function _attribute(string $key, $value = null): void { + self::_param($key, $value); + } } diff --git a/lib/Minz/ExtensionManager.php b/lib/Minz/ExtensionManager.php index fc6a7f08a..936af82a1 100644 --- a/lib/Minz/ExtensionManager.php +++ b/lib/Minz/ExtensionManager.php @@ -26,6 +26,10 @@ final class Minz_ExtensionManager { 'list' => [], 'signature' => 'NoneToNone', ], + 'before_login_btn' => [ // function(): string + 'list' => [], + 'signature' => 'NoneToString', + ], 'check_url_before_add' => [ // function($url) -> Url | null 'list' => [], 'signature' => 'OneToOne', @@ -155,7 +159,10 @@ final class Minz_ExtensionManager { $list_potential_extensions = array_merge($list_core_extensions, $list_thirdparty_extensions); $system_conf = Minz_Configuration::get('system'); - self::$ext_auto_enabled = $system_conf->extensions_enabled; + self::$ext_auto_enabled = array_filter( + $system_conf->attributeArray('extensions_enabled') ?? [], + fn($value, $key): bool => is_string($key) && is_bool($value), + ARRAY_FILTER_USE_BOTH); foreach ($list_potential_extensions as $ext_pathname) { if (!is_dir($ext_pathname)) { |
