Skip to content

Commit 5340db4

Browse files
authored
Fix bug when updating user email (go-gitea#36058)
Fix go-gitea#20390 We should use `ReplacePrimaryEmailAddress` instead of `AdminAddOrSetPrimaryEmailAddress` when modify user's email from admin panel. And also we need a database transaction to keep deletion and insertion succeed at the same time.
1 parent 7d6861a commit 5340db4

File tree

2 files changed

+33
-32
lines changed

2 files changed

+33
-32
lines changed

routers/web/admin/users.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ func EditUserPost(ctx *context.Context) {
409409
}
410410

411411
if form.Email != "" {
412-
if err := user_service.AdminAddOrSetPrimaryEmailAddress(ctx, u, form.Email); err != nil {
412+
if err := user_service.ReplacePrimaryEmailAddress(ctx, u, form.Email); err != nil {
413413
switch {
414414
case user_model.IsErrEmailCharIsNotSupported(err), user_model.IsErrEmailInvalid(err):
415415
ctx.Data["Err_Email"] = true

services/user/email.go

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -77,43 +77,44 @@ func ReplacePrimaryEmailAddress(ctx context.Context, u *user_model.User, emailSt
7777
return err
7878
}
7979

80-
if !u.IsOrganization() {
81-
// Check if address exists already
82-
email, err := user_model.GetEmailAddressByEmail(ctx, emailStr)
83-
if err != nil && !errors.Is(err, util.ErrNotExist) {
84-
return err
85-
}
86-
if email != nil {
87-
if email.IsPrimary && email.UID == u.ID {
88-
return nil
80+
return db.WithTx(ctx, func(ctx context.Context) error {
81+
if !u.IsOrganization() {
82+
// Check if address exists already
83+
email, err := user_model.GetEmailAddressByEmail(ctx, emailStr)
84+
if err != nil && !errors.Is(err, util.ErrNotExist) {
85+
return err
86+
}
87+
if email != nil {
88+
if email.IsPrimary && email.UID == u.ID {
89+
return nil
90+
}
91+
return user_model.ErrEmailAlreadyUsed{Email: emailStr}
8992
}
90-
return user_model.ErrEmailAlreadyUsed{Email: emailStr}
91-
}
9293

93-
// Remove old primary address
94-
primary, err := user_model.GetPrimaryEmailAddressOfUser(ctx, u.ID)
95-
if err != nil {
96-
return err
97-
}
98-
if _, err := db.DeleteByID[user_model.EmailAddress](ctx, primary.ID); err != nil {
99-
return err
100-
}
94+
// Remove old primary address
95+
primary, err := user_model.GetPrimaryEmailAddressOfUser(ctx, u.ID)
96+
if err != nil {
97+
return err
98+
}
99+
if _, err := db.DeleteByID[user_model.EmailAddress](ctx, primary.ID); err != nil {
100+
return err
101+
}
101102

102-
// Insert new primary address
103-
email = &user_model.EmailAddress{
104-
UID: u.ID,
105-
Email: emailStr,
106-
IsActivated: true,
107-
IsPrimary: true,
108-
}
109-
if _, err := user_model.InsertEmailAddress(ctx, email); err != nil {
110-
return err
103+
// Insert new primary address
104+
if _, err := user_model.InsertEmailAddress(ctx, &user_model.EmailAddress{
105+
UID: u.ID,
106+
Email: emailStr,
107+
IsActivated: true,
108+
IsPrimary: true,
109+
}); err != nil {
110+
return err
111+
}
111112
}
112-
}
113113

114-
u.Email = emailStr
114+
u.Email = emailStr
115115

116-
return user_model.UpdateUserCols(ctx, u, "email")
116+
return user_model.UpdateUserCols(ctx, u, "email")
117+
})
117118
}
118119

119120
func AddEmailAddresses(ctx context.Context, u *user_model.User, emails []string) error {

0 commit comments

Comments
 (0)