diff --git a/classes/Config.php b/classes/Config.php index a7c0a04b2..92037ff74 100644 --- a/classes/Config.php +++ b/classes/Config.php @@ -189,6 +189,9 @@ class Config { /** delay updates for this feed if received HTTP 429 (Too Many Requests) for this amount of seconds (base value, actual delay is base...base*2) */ const HTTP_429_THROTTLE_INTERVAL = "HTTP_429_THROTTLE_INTERVAL"; + /** disables login form controls except HOOK_LOGINFORM_ADDITIONAL_BUTTONS (for SSO providers), also prevents logging in through auth_internal */ + const DISABLE_LOGIN_FORM = "DISABLE_LOGIN_FORM"; + /** default values for all global configuration options */ private const _DEFAULTS = [ Config::DB_TYPE => [ "pgsql", Config::T_STRING ], @@ -245,7 +248,8 @@ class Config { Config::AUTH_MIN_INTERVAL => [ 5, Config::T_INT ], Config::HTTP_USER_AGENT => [ 'Tiny Tiny RSS/%s (https://tt-rss.org/)', Config::T_STRING ], - Config::HTTP_429_THROTTLE_INTERVAL => [ 3600, Config::T_INT ] + Config::HTTP_429_THROTTLE_INTERVAL => [ 3600, Config::T_INT ], + Config::DISABLE_LOGIN_FORM => [ "", Config::T_BOOL ] ]; private static ?Config $instance = null; diff --git a/classes/Handler_Public.php b/classes/Handler_Public.php index efa26646b..abff08376 100644 --- a/classes/Handler_Public.php +++ b/classes/Handler_Public.php @@ -431,6 +431,13 @@ class Handler_Public extends Handler { } function forgotpass(): void { + if (Config::get(Config::DISABLE_LOGIN_FORM) || !str_contains(Config::get(Config::PLUGINS), "auth_internal")) { + header($_SERVER["SERVER_PROTOCOL"]." 403 Forbidden"); + echo "Forbidden."; + + return; + } + startup_gettext(); session_start(); diff --git a/include/login_form.php b/include/login_form.php index c0f1a93af..8fa578c11 100755 --- a/include/login_form.php +++ b/include/login_form.php @@ -121,79 +121,84 @@
" /> + onchange="UtilityApp.fetchProfiles()" + onfocus="UtilityApp.fetchProfiles()" + onblur="UtilityApp.fetchProfiles()" + + required="1" value="" />
"/> + dojoType="dijit.form.TextBox" + class="input input-text" + onchange="UtilityApp.fetchProfiles()" + onfocus="UtilityApp.fetchProfiles()" + onblur="UtilityApp.fetchProfiles()" + + value=""/>
- +
-
- + +
+ - -
- -
- - - -
- -
- -
- -
- - - -
- -
- -
- 0) { ?> + +
-
+ +
+ +
+ +
+ + +
+
+ +
+ + 0) { ?> +
+ + +
+
+ + run_hooks(PluginHost::HOOK_LOGINFORM_ADDITIONAL_BUTTONS) ?>
diff --git a/plugins/auth_internal/init.php b/plugins/auth_internal/init.php index 4f2988262..9ff3ea24f 100644 --- a/plugins/auth_internal/init.php +++ b/plugins/auth_internal/init.php @@ -15,6 +15,9 @@ class Auth_Internal extends Auth_Base implements IAuthModule2 { /** @param string $service */ function authenticate($login, $password, $service = '') { + if (Config::get(Config::DISABLE_LOGIN_FORM)) + return false; + $otp = (int) ($_REQUEST["otp"] ?? 0); // don't bother with null/null logins for auth_external etc