finall ldap support

This commit is contained in:
Mateusz Gruszczyński
2026-07-25 22:13:53 +02:00
parent 852074e61c
commit 4bfe3f7ade
17 changed files with 517 additions and 93 deletions
+31 -3
View File
@@ -51,7 +51,7 @@ pub struct Config {
pub anonymous_access_token_ttl_days: i64,
pub user_session_ttl_days: i64,
pub authorization_type: AuthorizationType,
pub ldap: Option<crate::ldap_auth::LdapConfig>,
pub ldap: Option<crate::auth::ldap::LdapConfig>,
}
impl Config {
@@ -101,17 +101,37 @@ impl Config {
),
AuthorizationType::Local => unreachable!(),
};
Some(crate::ldap_auth::LdapConfig {
Some(crate::auth::ldap::LdapConfig {
url: required_nonempty_env("LDAP_URL", &context)?,
starttls: env_bool("LDAP_STARTTLS", false)?,
bind_dn: env::var("LDAP_BIND_DN").unwrap_or_default(),
bind_password: env::var("LDAP_BIND_PASSWORD").unwrap_or_default(),
base_dn: required_nonempty_env("LDAP_BASE_DN", &context)?,
user_filter: env_var("LDAP_USER_FILTER", default_filter),
username_attribute: env_var("LDAP_USERNAME_ATTRIBUTE", default_username_attribute),
username_attribute: env_var(
"LDAP_USERNAME_ATTRIBUTE",
default_username_attribute,
),
email_attribute: env_var("LDAP_EMAIL_ATTRIBUTE", "mail"),
display_name_attribute: env_var("LDAP_DISPLAY_NAME_ATTRIBUTE", "displayName"),
external_id_attribute: env_var(
"LDAP_EXTERNAL_ID_ATTRIBUTE",
match authorization_type {
AuthorizationType::Ldap => "entryUUID",
AuthorizationType::Ad => "objectGUID",
AuthorizationType::Local => unreachable!(),
},
),
organization: env_var("LDAP_ORGANIZATION", "organization"),
provider: authorization_type.as_str().to_owned(),
email_required: env_bool("LDAP_EMAIL_REQUIRED", true)?,
link_existing_by_email: env_bool("LDAP_LINK_EXISTING_BY_EMAIL", false)?,
tls_verify: env_bool("LDAP_TLS_VERIFY", true)?,
connect_timeout_seconds: env_positive_u64("LDAP_CONNECT_TIMEOUT_SECONDS", 5)?,
operation_timeout_seconds: env_positive_u64(
"LDAP_OPERATION_TIMEOUT_SECONDS",
10,
)?,
})
}
};
@@ -192,6 +212,14 @@ fn env_positive_i64(name: &str, default: i64) -> Result<i64, Box<dyn std::error:
Ok(value)
}
fn env_positive_u64(name: &str, default: u64) -> Result<u64, Box<dyn std::error::Error>> {
let value: u64 = env_var(name, &default.to_string()).parse()?;
if value == 0 {
return Err(format!("{name} must be greater than 0").into());
}
Ok(value)
}
fn env_nonnegative_u64(name: &str, default: u64) -> Result<u64, Box<dyn std::error::Error>> {
Ok(env_var(name, &default.to_string()).parse()?)
}