Skip to content

Commit 1d3095b

Browse files
authored
Check if email is used when updating user (#21289)
Fix #21075 When updating user data should check if email is used by other users
1 parent b7309b8 commit 1d3095b

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

models/user/user.go

+11-6
Original file line numberDiff line numberDiff line change
@@ -893,14 +893,19 @@ func UpdateUser(ctx context.Context, u *User, changePrimaryEmail bool, cols ...s
893893
if err != nil {
894894
return err
895895
}
896-
if !has {
897-
// 1. Update old primary email
898-
if _, err = e.Where("uid=? AND is_primary=?", u.ID, true).Cols("is_primary").Update(&EmailAddress{
899-
IsPrimary: false,
900-
}); err != nil {
901-
return err
896+
if has && emailAddress.UID != u.ID {
897+
return ErrEmailAlreadyUsed{
898+
Email: u.Email,
902899
}
900+
}
901+
// 1. Update old primary email
902+
if _, err = e.Where("uid=? AND is_primary=?", u.ID, true).Cols("is_primary").Update(&EmailAddress{
903+
IsPrimary: false,
904+
}); err != nil {
905+
return err
906+
}
903907

908+
if !has {
904909
emailAddress.Email = u.Email
905910
emailAddress.UID = u.ID
906911
emailAddress.IsActivated = true

models/user/user_test.go

+16
Original file line numberDiff line numberDiff line change
@@ -302,10 +302,26 @@ func TestUpdateUser(t *testing.T) {
302302
user = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
303303
assert.True(t, user.KeepActivityPrivate)
304304

305+
newEmail := "new_" + user.Email
306+
user.Email = newEmail
307+
assert.NoError(t, user_model.UpdateUser(db.DefaultContext, user, true))
308+
user = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
309+
assert.Equal(t, newEmail, user.Email)
310+
305311
user.Email = "no [email protected]"
306312
assert.Error(t, user_model.UpdateUser(db.DefaultContext, user, true))
307313
}
308314

315+
func TestUpdateUserEmailAlreadyUsed(t *testing.T) {
316+
assert.NoError(t, unittest.PrepareTestDatabase())
317+
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
318+
user3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})
319+
320+
user2.Email = user3.Email
321+
err := user_model.UpdateUser(db.DefaultContext, user2, true)
322+
assert.True(t, user_model.IsErrEmailAlreadyUsed(err))
323+
}
324+
309325
func TestNewUserRedirect(t *testing.T) {
310326
// redirect to a completely new name
311327
assert.NoError(t, unittest.PrepareTestDatabase())

0 commit comments

Comments
 (0)