This commit is contained in:
Mateusz Gruszczyński
2026-07-26 23:32:44 +02:00
parent 364af50a7c
commit 2857006949
28 changed files with 961 additions and 152 deletions
+16 -6
View File
@@ -40,6 +40,7 @@ pub struct LdapIdentity {
pub username: String,
pub email: String,
pub nickname: String,
pub display_name: String,
pub provider: String,
pub external_id: String,
pub external_dn: String,
@@ -157,23 +158,30 @@ pub async fn authenticate(
}
let _ = ldap.unbind().await;
let organization = config.organization.trim();
let nickname = if organization.is_empty() {
display_name
} else {
format!("{organization}/{display_name}")
};
let nickname = directory_nickname(&display_name, &email, &username);
Ok(Some(LdapIdentity {
username,
email,
nickname,
display_name,
provider: config.provider.clone(),
external_id,
external_dn: user_dn,
}))
}
fn directory_nickname(display_name: &str, email: &str, username: &str) -> String {
let words: Vec<&str> = display_name.split_whitespace().filter(|v| !v.is_empty()).collect();
let candidate = if words.len() >= 2 {
let first = words[0].chars().next().unwrap_or('u');
format!("{}.{}", first, words[words.len() - 1])
} else {
email.split('@').next().filter(|v| !v.is_empty()).unwrap_or(username).to_owned()
};
candidate.to_lowercase()
}
fn first_attr(entry: &SearchEntry, name: &str) -> Option<String> {
entry
.attrs
@@ -279,6 +287,7 @@ async fn provision_ldap_user(
.bind(&identity.provider)
.bind(&identity.external_id)
.bind(&identity.external_dn)
.bind(&identity.display_name)
.execute(state.db.pool())
.await
.map_err(AuthError::database)?;
@@ -306,6 +315,7 @@ async fn sync_directory_user(
.bind(&identity.provider)
.bind(&identity.external_id)
.bind(&identity.external_dn)
.bind(&identity.display_name)
.bind(Utc::now().to_rfc3339())
.bind(user.id)
.execute(state.db.pool())