From 215a6665a7d09c2ba48cab56a82a95177d97b0f0 Mon Sep 17 00:00:00 2001 From: liuzx Date: Wed, 23 Nov 2022 12:09:38 +0800 Subject: [PATCH] fix-2775 --- models/user_mail.go | 21 +++++++++++++++++++++ modules/auth/user_form.go | 4 ++++ routers/routes/routes.go | 2 ++ routers/user/auth.go | 15 +++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/models/user_mail.go b/models/user_mail.go index 8bf74b81b..d0547d589 100755 --- a/models/user_mail.go +++ b/models/user_mail.go @@ -216,6 +216,27 @@ func (email *EmailAddress) updateActivation(e Engine, activate bool) error { return updateUserCols(e, user, "rands") } +// UpdateEmailAddress update an email address of given user. +func (email *EmailAddress) UpdateEmailAddress(newEmailAddress string) error { + return email.updateEmailAddress(x, newEmailAddress) +} +func (email *EmailAddress) updateEmailAddress(e Engine, newEmailAddress string) error { + user, err := getUserByID(e, email.UID) + if err != nil { + return err + } + if user.Rands, err = GetUserSalt(); err != nil { + return err + } + user.Email = newEmailAddress + user.AvatarEmail = newEmailAddress + email.Email = newEmailAddress + if _, err := e.ID(email.ID).Cols("email").Update(email); err != nil { + return err + } + return updateUserCols(e, user, "email", "avartar_email") +} + // DeleteEmailAddress deletes an email address of given user. func DeleteEmailAddress(email *EmailAddress) (err error) { var deleted int64 diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go index ad78607ab..13dbd8155 100755 --- a/modules/auth/user_form.go +++ b/modules/auth/user_form.go @@ -88,6 +88,10 @@ type RegisterForm struct { Agree bool } +type UpdateEmailForm struct { + NewEmail string `binding:"Required;NewEmail;MaxSize(254)"` +} + // Validate valideates the fields func (f *RegisterForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 2b361b507..cdbf11be6 100755 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -417,6 +417,8 @@ func RegisterRoutes(m *macaron.Macaron) { }, openIDSignInEnabled) m.Get("/sign_up", user.SignUp) m.Post("/sign_up", bindIgnErr(auth.RegisterForm{}), user.SignUpPost) + m.Post("/sign_up/update_email", bindIgnErr(auth.UpdateEmailForm{}), user.UpdateEmailPost) + m.Post("/sign_up/resend_email", user.ResendEmailPost) m.Group("/oauth2", func() { m.Get("/:provider", user.SignInOAuth) m.Get("/:provider/callback", user.SignInOAuthCallback) diff --git a/routers/user/auth.go b/routers/user/auth.go index 57ffb1710..586b278e6 100755 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -1413,6 +1413,21 @@ func SignUpPost(ctx *context.Context, cpt *captcha.Captcha, form auth.RegisterFo handleSignInFull(ctx, u, false, true) } +func UpdateEmailPost(ctx *context.Context, form auth.UpdateEmailForm) { + newEmailAddress := form.NewEmail + if used, err := models.IsEmailUsed(newEmailAddress); used { + ctx.ServerError(ctx.Tr("form.email_been_used"), err) + return + } + user := ctx.User + email, err := models.GetEmailAddressByIDAndEmail(user.ID, user.Email) + if err != nil { + ctx.ServerError("GetEmailAddressByIDAndEmail failed", err) + return + } + email.UpdateEmailAddress(newEmailAddress) +} + // Activate render activate user page func Activate(ctx *context.Context) { code := ctx.Query("code")