Skip to content

Commit 030cdd6

Browse files
committed
[GITEA] Allow changing the email address before activation (squash)
See https://codeberg.org/forgejo/forgejo/pulls/2300
1 parent ecfc3cb commit 030cdd6

File tree

5 files changed

+52
-52
lines changed

5 files changed

+52
-52
lines changed

models/user/email_address.go

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ func updateActivation(ctx context.Context, email *EmailAddress, activate bool) e
332332
return UpdateUserCols(ctx, user, "rands")
333333
}
334334

335-
func makeEmailPrimary(ctx context.Context, user *User, email *EmailAddress) error {
335+
func MakeEmailPrimaryWithUser(ctx context.Context, user *User, email *EmailAddress) error {
336336
ctx, committer, err := db.TxContext(ctx)
337337
if err != nil {
338338
return err
@@ -362,33 +362,6 @@ func makeEmailPrimary(ctx context.Context, user *User, email *EmailAddress) erro
362362
return committer.Commit()
363363
}
364364

365-
// ReplaceInactivePrimaryEmail replaces the primary email of a given user, even if the primary is not yet activated.
366-
func ReplaceInactivePrimaryEmail(ctx context.Context, oldEmail string, email *EmailAddress) error {
367-
user := &User{}
368-
has, err := db.GetEngine(ctx).ID(email.UID).Get(user)
369-
if err != nil {
370-
return err
371-
} else if !has {
372-
return ErrUserNotExist{
373-
UID: email.UID,
374-
Name: "",
375-
KeyID: 0,
376-
}
377-
}
378-
379-
err = AddEmailAddress(ctx, email)
380-
if err != nil {
381-
return err
382-
}
383-
384-
err = makeEmailPrimary(ctx, user, email)
385-
if err != nil {
386-
return err
387-
}
388-
389-
return DeleteEmailAddress(ctx, &EmailAddress{UID: email.UID, Email: oldEmail})
390-
}
391-
392365
// MakeEmailPrimary sets primary email address of given user.
393366
func MakeEmailPrimary(ctx context.Context, email *EmailAddress) error {
394367
has, err := db.GetEngine(ctx).Get(email)
@@ -410,7 +383,7 @@ func MakeEmailPrimary(ctx context.Context, email *EmailAddress) error {
410383
return ErrUserNotExist{UID: email.UID}
411384
}
412385

413-
return makeEmailPrimary(ctx, user, email)
386+
return MakeEmailPrimaryWithUser(ctx, user, email)
414387
}
415388

416389
// VerifyActiveEmailCode verifies active email code when active account

models/user/email_address_test.go

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -77,28 +77,6 @@ func TestMakeEmailPrimary(t *testing.T) {
7777
assert.Equal(t, "[email protected]", user.Email)
7878
}
7979

80-
func TestReplaceInactivePrimaryEmail(t *testing.T) {
81-
assert.NoError(t, unittest.PrepareTestDatabase())
82-
83-
email := &user_model.EmailAddress{
84-
85-
UID: 9999999,
86-
}
87-
err := user_model.ReplaceInactivePrimaryEmail(db.DefaultContext, "[email protected]", email)
88-
assert.Error(t, err)
89-
assert.True(t, user_model.IsErrUserNotExist(err))
90-
91-
email = &user_model.EmailAddress{
92-
93-
UID: 10,
94-
}
95-
err = user_model.ReplaceInactivePrimaryEmail(db.DefaultContext, "[email protected]", email)
96-
assert.NoError(t, err)
97-
98-
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10})
99-
assert.Equal(t, "[email protected]", user.Email)
100-
}
101-
10280
func TestActivate(t *testing.T) {
10381
assert.NoError(t, unittest.PrepareTestDatabase())
10482

routers/web/auth/auth.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,7 @@ func ActivatePost(ctx *context.Context) {
715715
ctx.Data["ResendLimited"] = true
716716
} else {
717717
ctx.Data["ActiveCodeLives"] = timeutil.MinutesToFriendly(setting.Service.ActiveCodeLives, ctx.Locale)
718-
err := user_model.ReplaceInactivePrimaryEmail(ctx, ctx.Doer.Email, &user_model.EmailAddress{
718+
err := user_service.ReplaceInactivePrimaryEmail(ctx, ctx.Doer.Email, &user_model.EmailAddress{
719719
UID: ctx.Doer.ID,
720720
Email: email,
721721
})

services/user/email.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,33 @@ func AddEmailAddresses(ctx context.Context, u *user_model.User, emails []string)
145145
return nil
146146
}
147147

148+
// ReplaceInactivePrimaryEmail replaces the primary email of a given user, even if the primary is not yet activated.
149+
func ReplaceInactivePrimaryEmail(ctx context.Context, oldEmail string, email *user_model.EmailAddress) error {
150+
user := &user_model.User{}
151+
has, err := db.GetEngine(ctx).ID(email.UID).Get(user)
152+
if err != nil {
153+
return err
154+
} else if !has {
155+
return user_model.ErrUserNotExist{
156+
UID: email.UID,
157+
Name: "",
158+
KeyID: 0,
159+
}
160+
}
161+
162+
err = AddEmailAddresses(ctx, user, []string{email.Email})
163+
if err != nil {
164+
return err
165+
}
166+
167+
err = user_model.MakeEmailPrimaryWithUser(ctx, user, email)
168+
if err != nil {
169+
return err
170+
}
171+
172+
return DeleteEmailAddresses(ctx, user, []string{oldEmail})
173+
}
174+
148175
func DeleteEmailAddresses(ctx context.Context, u *user_model.User, emails []string) error {
149176
for _, emailStr := range emails {
150177
// Check if address exists

services/user/email_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,28 @@ func TestAddEmailAddresses(t *testing.T) {
107107
assert.True(t, user_model.IsErrEmailAlreadyUsed(err))
108108
}
109109

110+
func TestReplaceInactivePrimaryEmail(t *testing.T) {
111+
assert.NoError(t, unittest.PrepareTestDatabase())
112+
113+
email := &user_model.EmailAddress{
114+
115+
UID: 9999999,
116+
}
117+
err := ReplaceInactivePrimaryEmail(db.DefaultContext, "[email protected]", email)
118+
assert.Error(t, err)
119+
assert.True(t, user_model.IsErrUserNotExist(err))
120+
121+
email = &user_model.EmailAddress{
122+
123+
UID: 10,
124+
}
125+
err = ReplaceInactivePrimaryEmail(db.DefaultContext, "[email protected]", email)
126+
assert.NoError(t, err)
127+
128+
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10})
129+
assert.Equal(t, "[email protected]", user.Email)
130+
}
131+
110132
func TestDeleteEmailAddresses(t *testing.T) {
111133
assert.NoError(t, unittest.PrepareTestDatabase())
112134

0 commit comments

Comments
 (0)