@ -56,16 +56,34 @@ async fn ldap_import(data: JsonUpcase<OrgImportData>, token: PublicToken, mut co
if let Some ( mut user_org ) =
if let Some ( mut user_org ) =
UserOrganization ::find_by_email_and_org ( & user_data . Email , & org_id , & mut conn ) . await
UserOrganization ::find_by_email_and_org ( & user_data . Email , & org_id , & mut conn ) . await
{
{
user_org . revoke ( ) ;
// Only revoke a user if it is not the last confirmed owner
user_org . save ( & mut conn ) . await ? ;
let revoked = if user_org . atype = = UserOrgType ::Owner
}
& & user_org . status = = UserOrgStatus ::Confirmed as i32
{
if UserOrganization ::count_confirmed_by_org_and_type ( & org_id , UserOrgType ::Owner , & mut conn ) . await
< = 1
{
warn ! ( "Can't revoke the last owner" ) ;
false
} else {
user_org . revoke ( )
}
} else {
user_org . revoke ( )
} ;
let ext_modified = user_org . set_external_id ( Some ( user_data . ExternalId . clone ( ) ) ) ;
if revoked | | ext_modified {
user_org . save ( & mut conn ) . await ? ;
}
}
// If user is part of the organization, restore it
// If user is part of the organization, restore it
} else if let Some ( mut user_org ) =
} else if let Some ( mut user_org ) =
UserOrganization ::find_by_email_and_org ( & user_data . Email , & org_id , & mut conn ) . await
UserOrganization ::find_by_email_and_org ( & user_data . Email , & org_id , & mut conn ) . await
{
{
if user_org . status < UserOrgStatus ::Revoked as i32 {
let restored = user_org . restore ( ) ;
user_org . restore ( ) ;
let ext_modified = user_org . set_external_id ( Some ( user_data . ExternalId . clone ( ) ) ) ;
if restored | | ext_modified {
user_org . save ( & mut conn ) . await ? ;
user_org . save ( & mut conn ) . await ? ;
}
}
} else {
} else {
@ -73,9 +91,8 @@ async fn ldap_import(data: JsonUpcase<OrgImportData>, token: PublicToken, mut co
let user = match User ::find_by_mail ( & user_data . Email , & mut conn ) . await {
let user = match User ::find_by_mail ( & user_data . Email , & mut conn ) . await {
Some ( user ) = > user , // exists in vaultwarden
Some ( user ) = > user , // exists in vaultwarden
None = > {
None = > {
// doesn't exist in vaultwarden
// User does not exist yet
let mut new_user = User ::new ( user_data . Email . clone ( ) ) ;
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 ? ;
new_user . save ( & mut conn ) . await ? ;
if ! CONFIG . mail_enabled ( ) {
if ! CONFIG . mail_enabled ( ) {
@ -92,6 +109,7 @@ async fn ldap_import(data: JsonUpcase<OrgImportData>, token: PublicToken, mut co
} ;
} ;
let mut new_org_user = UserOrganization ::new ( user . uuid . clone ( ) , org_id . clone ( ) ) ;
let mut new_org_user = UserOrganization ::new ( user . uuid . clone ( ) , org_id . clone ( ) ) ;
new_org_user . set_external_id ( Some ( user_data . ExternalId . clone ( ) ) ) ;
new_org_user . access_all = false ;
new_org_user . access_all = false ;
new_org_user . atype = UserOrgType ::User as i32 ;
new_org_user . atype = UserOrgType ::User as i32 ;
new_org_user . status = user_org_status ;
new_org_user . status = user_org_status ;
@ -132,12 +150,10 @@ async fn ldap_import(data: JsonUpcase<OrgImportData>, token: PublicToken, mut co
GroupUser ::delete_all_by_group ( & group_uuid , & mut conn ) . await ? ;
GroupUser ::delete_all_by_group ( & group_uuid , & mut conn ) . await ? ;
for ext_id in & group_data . MemberExternalIds {
for ext_id in & group_data . MemberExternalIds {
if let Some ( user ) = User ::find_by_external_id ( ext_id , & mut conn ) . await {
if let Some ( user_org ) = UserOrganization ::find_by_external_id_and_org ( ext_id , & org_id , & mut conn ) . await
if let Some ( user_org ) = UserOrganization ::find_by_user_and_org ( & user . uuid , & org_id , & mut conn ) . await
{
{
let mut group_user = GroupUser ::new ( group_uuid . clone ( ) , user_org . uuid . clone ( ) ) ;
let mut group_user = GroupUser ::new ( group_uuid . clone ( ) , user_org . uuid . clone ( ) ) ;
group_user . save ( & mut conn ) . await ? ;
group_user . save ( & mut conn ) . await ? ;
}
}
}
}
}
}
}
@ -150,10 +166,8 @@ async fn ldap_import(data: JsonUpcase<OrgImportData>, token: PublicToken, mut co
// Generate a HashSet to quickly verify if a member is listed or not.
// Generate a HashSet to quickly verify if a member is listed or not.
let sync_members : HashSet < String > = data . Members . into_iter ( ) . map ( | m | m . ExternalId ) . collect ( ) ;
let sync_members : HashSet < String > = data . Members . into_iter ( ) . map ( | m | m . ExternalId ) . collect ( ) ;
for user_org in UserOrganization ::find_by_org ( & org_id , & mut conn ) . await {
for user_org in UserOrganization ::find_by_org ( & org_id , & mut conn ) . await {
if let Some ( user_external_id ) =
if let Some ( ref user_external_id ) = user_org . external_id {
User ::find_by_uuid ( & user_org . user_uuid , & mut conn ) . await . map ( | u | u . external_id )
if ! sync_members . contains ( user_external_id ) {
{
if user_external_id . is_some ( ) & & ! sync_members . contains ( & user_external_id . unwrap ( ) ) {
if user_org . atype = = UserOrgType ::Owner & & user_org . status = = UserOrgStatus ::Confirmed as i32 {
if user_org . atype = = UserOrgType ::Owner & & user_org . status = = UserOrgStatus ::Confirmed as i32 {
// Removing owner, check that there is at least one other confirmed owner
// Removing owner, check that there is at least one other confirmed owner
if UserOrganization ::count_confirmed_by_org_and_type ( & org_id , UserOrgType ::Owner , & mut conn )
if UserOrganization ::count_confirmed_by_org_and_type ( & org_id , UserOrgType ::Owner , & mut conn )