diff --git a/sample_upstream_provider/docker-compose.yaml b/sample_upstream_provider/docker-compose.yaml index 0062395..11d8e65 100644 --- a/sample_upstream_provider/docker-compose.yaml +++ b/sample_upstream_provider/docker-compose.yaml @@ -35,6 +35,7 @@ services: network_mode: host environment: - STORAGE_PATH=/storage + - DISABLE_LOCAL_LOGIN=true #- RUST_LOG=debug volumes: - ../:/app diff --git a/src/controllers/login_controller.rs b/src/controllers/login_controller.rs index 26697c4..47eecbc 100644 --- a/src/controllers/login_controller.rs +++ b/src/controllers/login_controller.rs @@ -49,6 +49,7 @@ impl Default for BaseLoginPage { struct LoginTemplate { p: BaseLoginPage, login: String, + show_local_login: bool, providers: Vec, } @@ -156,8 +157,10 @@ pub async fn login_route( "Given login could not be processed, because it has an invalid format!".to_string(), ); } - // Try to authenticate user - else if let Some(req) = &req { + // Try to authenticate user (local login) + else if let Some(req) = &req + && !AppConfig::get().disable_local_login + { login.clone_from(&req.login); let response: LoginResult = users .send(users_actor::LocalLoginRequest { @@ -224,6 +227,10 @@ pub async fn login_route( } } } + // If there is only a single provider, trigger auto-login + else if AppConfig::get().disable_local_login && providers.len() == 1 { + return redirect_user(&providers.cloned()[0].login_url(&query.redirect)); + } HttpResponse::Ok().content_type("text/html").body( LoginTemplate { @@ -235,6 +242,7 @@ pub async fn login_route( ..Default::default() }, login, + show_local_login: !AppConfig::get().disable_local_login, providers: providers.cloned(), } .render() diff --git a/src/controllers/settings_controller.rs b/src/controllers/settings_controller.rs index 3efbab6..a2923af 100644 --- a/src/controllers/settings_controller.rs +++ b/src/controllers/settings_controller.rs @@ -18,6 +18,7 @@ pub(crate) struct BaseSettingsPage<'a> { pub success_message: Option, pub page_title: &'static str, pub app_name: &'static str, + pub local_login_enabled: bool, pub user: &'a User, pub version: &'static str, pub ip_location_api: Option<&'static str>, @@ -37,6 +38,7 @@ impl<'a> BaseSettingsPage<'a> { app_name: APP_NAME, user, version: env!("CARGO_PKG_VERSION"), + local_login_enabled: !AppConfig::get().disable_local_login, ip_location_api: AppConfig::get().ip_location_service.as_deref(), } } diff --git a/src/data/app_config.rs b/src/data/app_config.rs index f4f2fcd..1f06b48 100644 --- a/src/data/app_config.rs +++ b/src/data/app_config.rs @@ -62,6 +62,11 @@ pub struct AppConfig { /// Login background image #[arg(long, env, default_value = "/assets/img/forest.jpg")] pub login_background_image: String, + + /// Disable local login. If this option is set without any upstream providers set, it will be impossible + /// to authenticate + #[arg(long, env)] + pub disable_local_login: bool, } lazy_static::lazy_static! { diff --git a/templates/login/login.html b/templates/login/login.html index 75458f9..8803b29 100644 --- a/templates/login/login.html +++ b/templates/login/login.html @@ -18,6 +18,8 @@ + +{% if show_local_login %}
@@ -36,6 +38,7 @@ +{% endif %} {% if !providers.is_empty() %} diff --git a/templates/settings/base_settings_page.html b/templates/settings/base_settings_page.html index 41f3259..431f925 100644 --- a/templates/settings/base_settings_page.html +++ b/templates/settings/base_settings_page.html @@ -24,7 +24,7 @@ Account details - {% if p.user.allow_local_login %} + {% if p.user.allow_local_login && p.local_login_enabled %}
  • Change password