@@ -1139,73 +1139,89 @@ func ForgotPasswdPost(ctx *context.Context) {
1139
1139
ctx .HTML (200 , tplForgotPassword )
1140
1140
}
1141
1141
1142
- // ResetPasswd render the reset password page
1143
- func ResetPasswd (ctx * context.Context ) {
1142
+ func commonResetPassword (ctx * context.Context ) * models.User {
1143
+ code := ctx .Query ("code" )
1144
+
1144
1145
ctx .Data ["Title" ] = ctx .Tr ("auth.reset_password" )
1146
+ ctx .Data ["Code" ] = code
1145
1147
1146
- // TODO for security and convenience, show the username / email here
1148
+ if nil != ctx .User {
1149
+ ctx .Data ["user_signed_in" ] = true
1150
+ }
1147
1151
1148
- code := ctx .Query ("code" )
1149
1152
if len (code ) == 0 {
1150
- ctx .Error (404 )
1151
- return
1153
+ ctx .Flash . Error (ctx . Tr ( "auth.invalid_code" ) )
1154
+ return nil
1152
1155
}
1153
- ctx .Data ["Code" ] = code
1156
+
1157
+ // Fail early, don't frustrate the user
1158
+ u := models .VerifyUserActiveCode (code )
1159
+ if u == nil {
1160
+ ctx .Flash .Error (ctx .Tr ("auth.invalid_code" ))
1161
+ return nil
1162
+ }
1163
+
1164
+ // Show the user that they are affecting the account that they intended to
1165
+ ctx .Data ["user_email" ] = u .Email
1166
+
1167
+ if nil != ctx .User && u .ID != ctx .User .ID {
1168
+ ctx .Flash .Error (ctx .Tr ("auth.reset_password_wrong_user" , ctx .User .Email , u .Email ))
1169
+ return nil
1170
+ }
1171
+
1172
+ return u
1173
+ }
1174
+
1175
+ // ResetPasswd render the reset password page
1176
+ func ResetPasswd (ctx * context.Context ) {
1154
1177
ctx .Data ["IsResetForm" ] = true
1178
+
1179
+ _ = commonResetPassword (ctx )
1180
+
1155
1181
ctx .HTML (200 , tplResetPassword )
1156
1182
}
1157
1183
1158
1184
// ResetPasswdPost response from reset password request
1159
1185
func ResetPasswdPost (ctx * context.Context ) {
1160
- ctx . Data [ "Title" ] = ctx . Tr ( "auth.reset_password" )
1186
+ u := commonResetPassword ( ctx )
1161
1187
1162
- code := ctx . Query ( "code" )
1163
- if len ( code ) == 0 {
1164
- ctx .Error ( 404 )
1188
+ if u == nil {
1189
+ // Flash error has been set
1190
+ ctx .HTML ( 200 , tplResetPassword )
1165
1191
return
1166
1192
}
1167
- ctx .Data ["Code" ] = code
1168
-
1169
- if u := models .VerifyUserActiveCode (code ); u != nil {
1170
- // Validate password length.
1171
- passwd := ctx .Query ("password" )
1172
- if len (passwd ) < setting .MinPasswordLength {
1173
- ctx .Data ["IsResetForm" ] = true
1174
- ctx .Data ["Err_Password" ] = true
1175
- ctx .RenderWithErr (ctx .Tr ("auth.password_too_short" , setting .MinPasswordLength ), tplResetPassword , nil )
1176
- return
1177
- }
1178
1193
1179
- var err error
1180
- if u .Rands , err = models .GetUserSalt (); err != nil {
1181
- ctx .ServerError ("UpdateUser" , err )
1182
- return
1183
- }
1184
- if u .Salt , err = models .GetUserSalt (); err != nil {
1185
- ctx .ServerError ("UpdateUser" , err )
1186
- return
1187
- }
1188
-
1189
- // Just in case the user is signed in to another account
1190
- handleSignOut (ctx )
1191
-
1192
- u .HashPassword (passwd )
1193
- u .MustChangePassword = false
1194
- if err := models .UpdateUserCols (u , "must_change_password" , "passwd" , "rands" , "salt" ); err != nil {
1195
- ctx .ServerError ("UpdateUser" , err )
1196
- return
1197
- }
1194
+ // Validate password length.
1195
+ passwd := ctx .Query ("password" )
1196
+ if len (passwd ) < setting .MinPasswordLength {
1197
+ ctx .Data ["IsResetForm" ] = true
1198
+ ctx .Data ["Err_Password" ] = true
1199
+ ctx .RenderWithErr (ctx .Tr ("auth.password_too_short" , setting .MinPasswordLength ), tplResetPassword , nil )
1200
+ return
1201
+ }
1198
1202
1199
- log .Trace ("User password reset: %s" , u .Name )
1203
+ var err error
1204
+ if u .Rands , err = models .GetUserSalt (); err != nil {
1205
+ ctx .ServerError ("UpdateUser" , err )
1206
+ return
1207
+ }
1208
+ if u .Salt , err = models .GetUserSalt (); err != nil {
1209
+ ctx .ServerError ("UpdateUser" , err )
1210
+ return
1211
+ }
1200
1212
1201
- // TODO change the former form to have password retype and remember me,
1202
- // then sign in here instead of redirecting
1203
- ctx .Redirect (setting .AppSubURL + "/user/login" )
1213
+ u .HashPassword (passwd )
1214
+ u .MustChangePassword = false
1215
+ if err := models .UpdateUserCols (u , "must_change_password" , "passwd" , "rands" , "salt" ); err != nil {
1216
+ ctx .ServerError ("UpdateUser" , err )
1204
1217
return
1205
1218
}
1206
1219
1220
+ log .Trace ("User password reset: %s" , u .Name )
1221
+
1207
1222
ctx .Data ["IsResetFailed" ] = true
1208
- ctx .HTML (200 , tplResetPassword )
1223
+ remember := len (ctx .Query ("remember" )) != 0
1224
+ handleSignInFull (ctx , u , remember , true )
1209
1225
}
1210
1226
1211
1227
// MustChangePassword renders the page to change a user's password
0 commit comments