Skip to content

Commit 3685cc7

Browse files
authored
Fix ldap user sync missed email in email_address table (#18786) (#18876)
* Fix ldap user sync missed email in email_address table (#18786)
1 parent 9d9ccdb commit 3685cc7

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

models/user/user.go

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -827,8 +827,9 @@ func validateUser(u *User) error {
827827
return ValidateEmail(u.Email)
828828
}
829829

830-
func updateUser(ctx context.Context, u *User, changePrimaryEmail bool) error {
831-
if err := validateUser(u); err != nil {
830+
func updateUser(ctx context.Context, u *User, changePrimaryEmail bool, cols ...string) error {
831+
err := validateUser(u)
832+
if err != nil {
832833
return err
833834
}
834835

@@ -860,15 +861,35 @@ func updateUser(ctx context.Context, u *User, changePrimaryEmail bool) error {
860861
}); err != nil {
861862
return err
862863
}
864+
} else { // check if primary email in email_address table
865+
primaryEmailExist, err := e.Where("uid=? AND is_primary=?", u.ID, true).Exist(&EmailAddress{})
866+
if err != nil {
867+
return err
868+
}
869+
870+
if !primaryEmailExist {
871+
if _, err = e.Insert(&EmailAddress{
872+
Email: u.Email,
873+
UID: u.ID,
874+
IsActivated: true,
875+
IsPrimary: true,
876+
}); err != nil {
877+
return err
878+
}
879+
}
863880
}
864881

865-
_, err := e.ID(u.ID).AllCols().Update(u)
882+
if len(cols) == 0 {
883+
_, err = e.ID(u.ID).AllCols().Update(u)
884+
} else {
885+
_, err = e.ID(u.ID).Cols(cols...).Update(u)
886+
}
866887
return err
867888
}
868889

869890
// UpdateUser updates user's information.
870-
func UpdateUser(u *User, emailChanged bool) error {
871-
return updateUser(db.DefaultContext, u, emailChanged)
891+
func UpdateUser(u *User, emailChanged bool, cols ...string) error {
892+
return updateUser(db.DefaultContext, u, emailChanged, cols...)
872893
}
873894

874895
// UpdateUserCols update user according special columns

services/auth/source/ldap/source_sync.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ func (source *Source) Sync(ctx context.Context, updateExisting bool) error {
143143
log.Trace("SyncExternalUsers[%s]: Updating user %s", source.authSource.Name, usr.Name)
144144

145145
usr.FullName = fullName
146+
emailChanged := usr.Email != su.Mail
146147
usr.Email = su.Mail
147148
// Change existing admin flag only if AdminFilter option is set
148149
if len(source.AdminFilter) > 0 {
@@ -154,7 +155,7 @@ func (source *Source) Sync(ctx context.Context, updateExisting bool) error {
154155
}
155156
usr.IsActive = true
156157

157-
err = user_model.UpdateUserCols(db.DefaultContext, usr, "full_name", "email", "is_admin", "is_restricted", "is_active")
158+
err = user_model.UpdateUser(usr, emailChanged, "full_name", "email", "is_admin", "is_restricted", "is_active")
158159
if err != nil {
159160
log.Error("SyncExternalUsers[%s]: Error updating user %s: %v", source.authSource.Name, usr.Name, err)
160161
}

0 commit comments

Comments
 (0)