@@ -1240,7 +1240,7 @@ func createUserInContext(ctx *context.Context, tpl base.TplName, form interface{
12401240 }
12411241 }
12421242
1243- // TODO: probably we should respect 'remeber ' user's choice...
1243+ // TODO: probably we should respect 'remember ' user's choice...
12441244 linkAccount (ctx , user , * gothUser , true )
12451245 return // user is already created here, all redirects are handled
12461246 } else if setting .OAuth2Client .AccountLinking == setting .OAuth2AccountLinkingLogin {
@@ -1327,12 +1327,11 @@ func handleUserCreated(ctx *context.Context, u *models.User, gothUser *goth.User
13271327// Activate render activate user page
13281328func Activate (ctx * context.Context ) {
13291329 code := ctx .Query ("code" )
1330- password := ctx .Query ("password" )
13311330
13321331 if len (code ) == 0 {
13331332 ctx .Data ["IsActivatePage" ] = true
1334- if ctx .User .IsActive {
1335- ctx .Error ( http . StatusNotFound )
1333+ if ctx .User == nil || ctx . User .IsActive {
1334+ ctx .NotFound ( "invalid user" , nil )
13361335 return
13371336 }
13381337 // Resend confirmation email.
@@ -1364,6 +1363,34 @@ func Activate(ctx *context.Context) {
13641363
13651364 // if account is local account, verify password
13661365 if user .LoginSource == 0 {
1366+ ctx .Data ["Code" ] = code
1367+ ctx .Data ["NeedsPassword" ] = true
1368+ ctx .HTML (http .StatusOK , TplActivate )
1369+ return
1370+ }
1371+
1372+ handleAccountActivation (ctx , user )
1373+ }
1374+
1375+ // ActivatePost handles account activation with password check
1376+ func ActivatePost (ctx * context.Context ) {
1377+ code := ctx .Query ("code" )
1378+ if len (code ) == 0 {
1379+ ctx .Redirect (setting .AppSubURL + "/user/activate" )
1380+ return
1381+ }
1382+
1383+ user := models .VerifyUserActiveCode (code )
1384+ // if code is wrong
1385+ if user == nil {
1386+ ctx .Data ["IsActivateFailed" ] = true
1387+ ctx .HTML (http .StatusOK , TplActivate )
1388+ return
1389+ }
1390+
1391+ // if account is local account, verify password
1392+ if user .LoginSource == 0 {
1393+ password := ctx .Query ("password" )
13671394 if len (password ) == 0 {
13681395 ctx .Data ["Code" ] = code
13691396 ctx .Data ["NeedsPassword" ] = true
@@ -1377,6 +1404,10 @@ func Activate(ctx *context.Context) {
13771404 }
13781405 }
13791406
1407+ handleAccountActivation (ctx , user )
1408+ }
1409+
1410+ func handleAccountActivation (ctx * context.Context , user * models.User ) {
13801411 user .IsActive = true
13811412 var err error
13821413 if user .Rands , err = models .GetUserSalt (); err != nil {
@@ -1385,7 +1416,7 @@ func Activate(ctx *context.Context) {
13851416 }
13861417 if err := models .UpdateUserCols (user , "is_active" , "rands" ); err != nil {
13871418 if models .IsErrUserNotExist (err ) {
1388- ctx .Error ( http . StatusNotFound )
1419+ ctx .NotFound ( "UpdateUserCols" , err )
13891420 } else {
13901421 ctx .ServerError ("UpdateUser" , err )
13911422 }
0 commit comments