From 5fd9a108ece2184d7a763ad86d5dc84a76fb5086 Mon Sep 17 00:00:00 2001 From: BlackDex Date: Sun, 27 Aug 2023 17:24:35 +0200 Subject: [PATCH] Fix External ID not set during DC Sync If a user already had an account, it didn't updated the `external_id`. This PR fixes this by setting this when needed. Fixes #3777 --- src/api/core/public.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/api/core/public.rs b/src/api/core/public.rs index ab30635c7f2..41cf72b0d2b 100644 --- a/src/api/core/public.rs +++ b/src/api/core/public.rs @@ -51,6 +51,8 @@ async fn ldap_import(data: JsonUpcase, token: PublicToken, mut co let data = data.into_inner().data; for user_data in &data.Members { + let user = User::find_by_mail(&user_data.Email, &mut conn).await; + if user_data.Deleted { // If user is marked for deletion and it exists, revoke it if let Some(mut user_org) = @@ -68,12 +70,23 @@ async fn ldap_import(data: JsonUpcase, token: PublicToken, mut co user_org.restore(); user_org.save(&mut conn).await?; } + + // Set external_id if the user is restored. + if let Some(mut user) = user { + user.set_external_id(Some(user_data.ExternalId.clone())); + user.save(&mut conn).await?; + } } else { // If user is not part of the organization - let user = match User::find_by_mail(&user_data.Email, &mut conn).await { - Some(user) => user, // exists in vaultwarden + let user = match user { + Some(mut user) => { + // User already exists, but we still need to update/replace the ExternalId here. + user.set_external_id(Some(user_data.ExternalId.clone())); + user.save(&mut conn).await?; + user + } None => { - // doesn't exist in vaultwarden + // User does not exist yet let mut new_user = User::new(user_data.Email.clone()); new_user.set_external_id(Some(user_data.ExternalId.clone())); new_user.save(&mut conn).await?;