Fixed OIDC small bug

This commit is contained in:
Ultradesu
2026-05-20 14:43:24 +03:00
parent a65488c304
commit 0cda791d44
+24 -4
View File
@@ -769,11 +769,15 @@ async fn oidc_callback(request: Request, session: Session, db: Database) -> cot:
// Find or create user // Find or create user
let login = preferred_username.clone(); let login = preferred_username.clone();
let user = query!(User, $login == login).get(&db).await?; let existing = query!(User, $login == login).get(&db).await?;
let user = match user { let user = match existing {
Some(u) => u, Some(u) => {
tracing::info!(target: "oidc", username = %u.login, "SSO login: existing user");
u
}
None => { None => {
tracing::info!(target: "oidc", username = %preferred_username, "SSO login: creating new user");
let mut new_user = User { let mut new_user = User {
id: Auto::auto(), id: Auto::auto(),
login: preferred_username.clone(), login: preferred_username.clone(),
@@ -786,19 +790,35 @@ async fn oidc_callback(request: Request, session: Session, db: Database) -> cot:
updated_at: now_utc(), updated_at: now_utc(),
}; };
new_user.save(&db).await?; new_user.save(&db).await?;
new_user // Re-query to get the DB-assigned id (Auto::auto() may not be
// populated in the struct after save)
let login2 = preferred_username.clone();
match query!(User, $login == login2).get(&db).await? {
Some(u) => {
tracing::info!(target: "oidc", username = %u.login, id = ?u.id, "SSO login: new user created and fetched");
u
}
None => {
tracing::error!(target: "oidc", username = %preferred_username, "SSO login: user not found after creation");
return Redirect::new(fail("sso")).into_response();
}
}
} }
}; };
if user.status != "active" { if user.status != "active" {
tracing::warn!(target: "oidc", username = %user.login, status = %user.status, "SSO login: user disabled");
return Redirect::new(fail("sso_disabled")).into_response(); return Redirect::new(fail("sso_disabled")).into_response();
} }
let display = user let display = user
.display_name .display_name
.as_deref() .as_deref()
.filter(|s| !s.is_empty())
.unwrap_or(&user.login) .unwrap_or(&user.login)
.to_string(); .to_string();
tracing::info!(target: "oidc", username = %user.login, display = %display, "SSO login: session established");
session.insert(SESSION_USER_ID, user.id.unwrap()).await?; session.insert(SESSION_USER_ID, user.id.unwrap()).await?;
session.insert(SESSION_USER_NAME, display).await?; session.insert(SESSION_USER_NAME, display).await?;