Skip to content

Commit 5699ff9

Browse files
check existing user based on name and email both
1 parent fb6cb36 commit 5699ff9

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

src/handlers/http/oidc.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,30 @@ pub async fn reply_login(
186186
}
187187
}
188188

189-
let existing_user = Users.get_user(&username);
189+
/// Attempts to find an existing user by trying both name and email identifiers
190+
/// This handles the case where OIDC provider configuration changes over time:
191+
/// - User was initially created with email as username (when name wasn't provided)
192+
/// - Later OIDC provider starts providing name, but user already exists with email as username
193+
fn find_existing_user(user_info: &user::UserInfo) -> Option<User> {
194+
// Try to find user by name first (current preferred identifier)
195+
if let Some(name) = &user_info.name {
196+
if let Some(user) = Users.get_user(name) {
197+
return Some(user);
198+
}
199+
}
200+
201+
// If not found by name, try by email (fallback for legacy users)
202+
if let Some(email) = &user_info.email {
203+
if let Some(user) = Users.get_user(email) {
204+
return Some(user);
205+
}
206+
}
207+
208+
None
209+
}
210+
211+
let existing_user = find_existing_user(&user_info);
212+
190213
let final_roles = match existing_user {
191214
Some(ref user) => {
192215
// For existing users: keep existing roles + add new valid OIDC roles

0 commit comments

Comments
 (0)