@@ -1178,77 +1178,89 @@ func ForgotPasswdPost(ctx *context.Context) {
1178
1178
ctx .HTML (200 , tplForgotPassword )
1179
1179
}
1180
1180
1181
- // ResetPasswd render the reset password page
1182
- func ResetPasswd (ctx * context.Context ) {
1181
+ func commonResetPassword (ctx * context.Context ) * models.User {
1182
+ code := ctx .Query ("code" )
1183
+
1183
1184
ctx .Data ["Title" ] = ctx .Tr ("auth.reset_password" )
1185
+ ctx .Data ["Code" ] = code
1184
1186
1185
- // TODO for security and convenience, show the username / email here
1187
+ if nil != ctx .User {
1188
+ ctx .Data ["user_signed_in" ] = true
1189
+ }
1186
1190
1187
- code := ctx .Query ("code" )
1188
1191
if len (code ) == 0 {
1189
- ctx .Error (404 )
1190
- return
1192
+ ctx .Flash . Error (ctx . Tr ( "auth.invalid_code" ) )
1193
+ return nil
1191
1194
}
1192
- ctx .Data ["Code" ] = code
1193
1195
1194
- if u := models .VerifyUserActiveCode (code ); u != nil {
1195
- ctx .Data ["IsResetForm" ] = true
1196
+ // Fail early, don't frustrate the user
1197
+ u := models .VerifyUserActiveCode (code )
1198
+ if u == nil {
1199
+ ctx .Flash .Error (ctx .Tr ("auth.invalid_code" ))
1200
+ return nil
1196
1201
}
1197
1202
1203
+ // Show the user that they are affecting the account that they intended to
1204
+ ctx .Data ["user_email" ] = u .Email
1205
+
1206
+ if nil != ctx .User && u .ID != ctx .User .ID {
1207
+ ctx .Flash .Error (ctx .Tr ("auth.reset_password_wrong_user" , ctx .User .Email , u .Email ))
1208
+ return nil
1209
+ }
1210
+
1211
+ return u
1212
+ }
1213
+
1214
+ // ResetPasswd render the reset password page
1215
+ func ResetPasswd (ctx * context.Context ) {
1216
+ ctx .Data ["IsResetForm" ] = true
1217
+
1218
+ _ = commonResetPassword (ctx )
1219
+
1198
1220
ctx .HTML (200 , tplResetPassword )
1199
1221
}
1200
1222
1201
1223
// ResetPasswdPost response from reset password request
1202
1224
func ResetPasswdPost (ctx * context.Context ) {
1203
- ctx . Data [ "Title" ] = ctx . Tr ( "auth.reset_password" )
1225
+ u := commonResetPassword ( ctx )
1204
1226
1205
- code := ctx . Query ( "code" )
1206
- if len ( code ) == 0 {
1207
- ctx .Error ( 404 )
1227
+ if u == nil {
1228
+ // Flash error has been set
1229
+ ctx .HTML ( 200 , tplResetPassword )
1208
1230
return
1209
1231
}
1210
- ctx .Data ["Code" ] = code
1211
1232
1212
- if u := models .VerifyUserActiveCode (code ); u != nil {
1213
- // Validate password length.
1214
- passwd := ctx .Query ("password" )
1215
- if len (passwd ) < setting .MinPasswordLength {
1216
- ctx .Data ["IsResetForm" ] = true
1217
- ctx .Data ["Err_Password" ] = true
1218
- ctx .RenderWithErr (ctx .Tr ("auth.password_too_short" , setting .MinPasswordLength ), tplResetPassword , nil )
1219
- return
1220
- }
1221
-
1222
- var err error
1223
- if u .Rands , err = models .GetUserSalt (); err != nil {
1224
- ctx .ServerError ("UpdateUser" , err )
1225
- return
1226
- }
1227
- if u .Salt , err = models .GetUserSalt (); err != nil {
1228
- ctx .ServerError ("UpdateUser" , err )
1229
- return
1230
- }
1231
-
1232
- // Just in case the user is signed in to another account
1233
- handleSignOut (ctx )
1234
-
1235
- u .HashPassword (passwd )
1236
- u .MustChangePassword = false
1237
- if err := models .UpdateUserCols (u , "must_change_password" , "passwd" , "rands" , "salt" ); err != nil {
1238
- ctx .ServerError ("UpdateUser" , err )
1239
- return
1240
- }
1233
+ // Validate password length.
1234
+ passwd := ctx .Query ("password" )
1235
+ if len (passwd ) < setting .MinPasswordLength {
1236
+ ctx .Data ["IsResetForm" ] = true
1237
+ ctx .Data ["Err_Password" ] = true
1238
+ ctx .RenderWithErr (ctx .Tr ("auth.password_too_short" , setting .MinPasswordLength ), tplResetPassword , nil )
1239
+ return
1240
+ }
1241
1241
1242
- log .Trace ("User password reset: %s" , u .Name )
1242
+ var err error
1243
+ if u .Rands , err = models .GetUserSalt (); err != nil {
1244
+ ctx .ServerError ("UpdateUser" , err )
1245
+ return
1246
+ }
1247
+ if u .Salt , err = models .GetUserSalt (); err != nil {
1248
+ ctx .ServerError ("UpdateUser" , err )
1249
+ return
1250
+ }
1243
1251
1244
- // TODO change the former form to have password retype and remember me,
1245
- // then sign in here instead of redirecting
1246
- ctx .Redirect (setting .AppSubURL + "/user/login" )
1252
+ u .HashPassword (passwd )
1253
+ u .MustChangePassword = false
1254
+ if err := models .UpdateUserCols (u , "must_change_password" , "passwd" , "rands" , "salt" ); err != nil {
1255
+ ctx .ServerError ("UpdateUser" , err )
1247
1256
return
1248
1257
}
1249
1258
1259
+ log .Trace ("User password reset: %s" , u .Name )
1260
+
1250
1261
ctx .Data ["IsResetFailed" ] = true
1251
- ctx .HTML (200 , tplResetPassword )
1262
+ remember := len (ctx .Query ("remember" )) != 0
1263
+ handleSignInFull (ctx , u , remember , true )
1252
1264
}
1253
1265
1254
1266
// MustChangePassword renders the page to change a user's password
0 commit comments