diff --git a/routers/routes/web.go b/routers/routes/web.go index 0aa4d4fe4..e4ec3aa52 100644 --- a/routers/routes/web.go +++ b/routers/routes/web.go @@ -470,7 +470,8 @@ func RegisterRoutes(m *web.Route) { m.Group("/user", func() { // r.Get("/feeds", binding.Bind(auth.FeedsForm{}), user.Feeds) - m.Any("/activate", user.Activate, reqSignIn) + m.Get("/activate", user.Activate, reqSignIn) + m.Post("/activate", user.ActivatePost, reqSignIn) m.Any("/activate_email", user.ActivateEmail) m.Get("/avatar/{username}/{size}", user.Avatar) m.Get("/email2user", user.Email2User) diff --git a/routers/user/auth.go b/routers/user/auth.go index 37181c68e..f7e60d5f3 100644 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -1233,12 +1233,11 @@ func SignUpPost(ctx *context.Context) { // Activate render activate user page func Activate(ctx *context.Context) { code := ctx.Query("code") - password := ctx.Query("password") if len(code) == 0 { ctx.Data["IsActivatePage"] = true - if ctx.User.IsActive { - ctx.Error(404) + if ctx.User == nil || ctx.User.IsActive { + ctx.NotFound("invalid user", nil) return } // Resend confirmation email. @@ -1270,6 +1269,34 @@ func Activate(ctx *context.Context) { // if account is local account, verify password if user.LoginSource == 0 { + ctx.Data["Code"] = code + ctx.Data["NeedsPassword"] = true + ctx.HTML(http.StatusOK, TplActivate) + return + } + + handleAccountActivation(ctx, user) +} + +// ActivatePost handles account activation with password check +func ActivatePost(ctx *context.Context) { + code := ctx.Query("code") + if len(code) == 0 { + ctx.Redirect(setting.AppSubURL + "/user/activate") + return + } + + user := models.VerifyUserActiveCode(code) + // if code is wrong + if user == nil { + ctx.Data["IsActivateFailed"] = true + ctx.HTML(http.StatusOK, TplActivate) + return + } + + // if account is local account, verify password + if user.LoginSource == 0 { + password := ctx.Query("password") if len(password) == 0 { ctx.Data["Code"] = code ctx.Data["NeedsPassword"] = true @@ -1283,6 +1310,10 @@ func Activate(ctx *context.Context) { } } + handleAccountActivation(ctx, user) +} + +func handleAccountActivation(ctx *context.Context, user *models.User) { user.IsActive = true var err error if user.Rands, err = models.GetUserSalt(); err != nil { @@ -1291,7 +1322,7 @@ func Activate(ctx *context.Context) { } if err := models.UpdateUserCols(user, "is_active", "rands"); err != nil { if models.IsErrUserNotExist(err) { - ctx.Error(404) + ctx.NotFound("UpdateUserCols", err) } else { ctx.ServerError("UpdateUser", err) } diff --git a/templates/user/auth/activate.tmpl b/templates/user/auth/activate.tmpl index cc6f52b57..8d75c1d92 100644 --- a/templates/user/auth/activate.tmpl +++ b/templates/user/auth/activate.tmpl @@ -19,17 +19,15 @@ {{end}} {{else}} {{if .NeedsPassword}} -
-
- - -
-
- - -
- -
+
+ + +
+
+ + +
+ {{else if .IsSendRegisterMail}}

{{.i18n.Tr "auth.confirmation_mail_sent_prompt" (.Email|Escape) .ActiveCodeLives | Str2html}}

{{else if .IsActivateFailed}}