Fixed OIDC small bug
This commit is contained in:
+24
-4
@@ -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?;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user