@@ -100,7 +100,14 @@ exports.showLogin = function(req, res) {
100
100
req . session . _loginReferer = req . headers . referer ;
101
101
res . render ( 'sign/signin' ) ;
102
102
} ;
103
-
103
+ /**
104
+ * define some page when login just jump to the home page
105
+ * @type {Array }
106
+ */
107
+ var notJump = [
108
+ '/active_account' , //active page
109
+ '/reset_pass' //reset password page, avoid to reset twice
110
+ ] ;
104
111
/**
105
112
* Handle user login.
106
113
*
@@ -131,7 +138,15 @@ exports.login = function(req, res, next) {
131
138
}
132
139
// store session cookie
133
140
gen_session ( user , res ) ;
134
- res . redirect ( req . session . _loginReferer || 'home' ) ;
141
+ //check at some page just jump to home page
142
+ var refer = req . session . _loginReferer || 'home' ;
143
+ for ( var i = 0 , len = notJump . length ; i != len ; ++ i ) {
144
+ if ( refer . indexOf ( notJump [ i ] ) >= 0 ) {
145
+ refer = 'home' ;
146
+ break ;
147
+ }
148
+ }
149
+ res . redirect ( refer ) ;
135
150
} ) ;
136
151
} ;
137
152
@@ -179,35 +194,75 @@ exports.search_pass = function(req,res,next){
179
194
return ;
180
195
}
181
196
182
- User . findOne ( { email :email } , function ( err , user ) {
183
- if ( ! user ) {
184
- res . render ( 'sign/search_pass' , { error :'没有这个电子邮箱。' , email :email } ) ;
185
- return ;
186
- }
187
- mail_ctrl . send_reset_pass_mail ( email , md5 ( email + config . session_secret ) , user . name , function ( err , success ) {
188
- res . render ( 'notify/notify' , { success : '我们已给您填写的电子邮箱发送了一封邮件,请点击里面的链接来重置密码。' } ) ;
197
+ // User.findOne({email:email},function(err,user){
198
+ //动态生成retrive_key和timestamp到users collection,之后重置密码进行验证
199
+ var retrieveKey = randomString ( 15 ) ;
200
+ var retrieveTime = new Date ( ) . getTime ( ) ;
201
+ User . findOne ( { email : email } , function ( err , user ) {
202
+ if ( ! user ) {
203
+ res . render ( 'sign/search_pass' , { error :'没有这个电子邮箱。' , email :email } ) ;
204
+ return ;
205
+ }
206
+ user . retrieve_key = retrieveKey ;
207
+ user . retrieve_time = retrieveTime ;
208
+ user . save ( function ( err ) {
209
+ if ( err ) {
210
+ return next ( err ) ;
211
+ }
212
+ mail_ctrl . send_reset_pass_mail ( email , retrieveKey , user . name , function ( err , success ) {
213
+ res . render ( 'notify/notify' , { success : '我们已给您填写的电子邮箱发送了一封邮件,请在24小时内点击里面的链接来重置密码。' } ) ;
214
+ } ) ;
189
215
} ) ;
190
216
} ) ;
191
217
}
192
218
}
193
-
194
- exports . reset_pass = function ( req , res , next ) {
195
- var key = req . query . key ;
196
- var name = req . query . name ;
197
- var new_pass = '' ;
198
-
199
- User . findOne ( { name :name } , function ( err , user ) {
200
- if ( ! user || md5 ( user . email + config . session_secret ) != key ) {
201
- res . render ( 'notify/notify' , { error : '信息有误,密码无法重置。' } ) ;
202
- return ;
203
- }
204
- new_pass = random_password ( ) ;
205
- user . pass = md5 ( new_pass ) ;
206
- user . save ( function ( err ) {
207
- res . render ( 'notify/notify' , { success : '你的密码已被重置为:' + new_pass + ',请立即用此密码登录后在设置页面更改密码。' } ) ;
208
- } ) ;
209
- } ) ;
210
-
219
+ /**
220
+ * reset password
221
+ * 'get' to show the page, 'post' to reset password
222
+ * after reset password, retrieve_key&time will be destroy
223
+ * @param {http.req } req
224
+ * @param {http.res } res
225
+ * @param {Function } next
226
+ */
227
+ exports . reset_pass = function ( req , res , next ) {
228
+ var method = req . method . toLowerCase ( ) ;
229
+ if ( method === 'get' ) {
230
+ var key = req . query . key ;
231
+ var name = req . query . name ;
232
+ User . findOne ( { name :name , retrieve_key :key } , function ( err , user ) {
233
+ if ( ! user ) {
234
+ return res . render ( 'notify/notify' , { error : '信息有误,密码无法重置。' } ) ;
235
+ }
236
+ var now = new Date ( ) . getTime ( ) ;
237
+ var oneDay = 1000 * 60 * 60 * 24 ;
238
+ if ( ! user . retrieve_time || now - user . retrieve_time > oneDay ) {
239
+ return res . render ( 'notify/notify' , { error : '该链接已过期,请重新申请。' } ) ;
240
+ }
241
+ return res . render ( 'sign/reset' , { name : name , key : key } ) ;
242
+ } ) ;
243
+ } else {
244
+ var psw = req . body . psw || '' ;
245
+ var repsw = req . body . repsw || '' ;
246
+ var key = req . body . key || '' ;
247
+ var name = req . body . name || '' ;
248
+ if ( psw !== repsw ) {
249
+ return res . render ( 'sign/reset' , { name : name , key : key , error : '两次密码输入不一致。' } ) ;
250
+ }
251
+ User . findOne ( { name :name , retrieve_key : key } , function ( err , user ) {
252
+ if ( ! user ) {
253
+ return res . render ( 'notify/notify' , { error : '错误的激活链接' } ) ;
254
+ }
255
+ user . pass = md5 ( psw ) ;
256
+ user . retrieve_key = null ;
257
+ user . retrieve_time = null ;
258
+ user . save ( function ( err ) {
259
+ if ( err ) {
260
+ return next ( err ) ;
261
+ }
262
+ return res . render ( 'notify/notify' , { success : '你的密码已重置。' } ) ;
263
+ } )
264
+ } )
265
+ }
211
266
}
212
267
213
268
// auth_user middleware
@@ -250,30 +305,30 @@ exports.auth_user = function(req,res,next){
250
305
} ;
251
306
252
307
// private
253
- function gen_session ( user , res ) {
308
+ function gen_session ( user , res ) {
254
309
var auth_token = encrypt ( user . _id + '\t' + user . name + '\t' + user . pass + '\t' + user . email , config . session_secret ) ;
255
310
res . cookie ( config . auth_cookie_name , auth_token , { path : '/' , maxAge : 1000 * 60 * 60 * 24 * 7 } ) ; //cookie 有效期1周
256
311
}
257
- function encrypt ( str , secret ) {
312
+ function encrypt ( str , secret ) {
258
313
var cipher = crypto . createCipher ( 'aes192' , secret ) ;
259
314
var enc = cipher . update ( str , 'utf8' , 'hex' ) ;
260
315
enc += cipher . final ( 'hex' ) ;
261
316
return enc ;
262
317
}
263
- function decrypt ( str , secret ) {
318
+ function decrypt ( str , secret ) {
264
319
var decipher = crypto . createDecipher ( 'aes192' , secret ) ;
265
320
var dec = decipher . update ( str , 'hex' , 'utf8' ) ;
266
321
dec += decipher . final ( 'utf8' ) ;
267
322
return dec ;
268
323
}
269
- function md5 ( str ) {
324
+ function md5 ( str ) {
270
325
var md5sum = crypto . createHash ( 'md5' ) ;
271
326
md5sum . update ( str ) ;
272
327
str = md5sum . digest ( 'hex' ) ;
273
328
return str ;
274
329
}
275
- function random_password ( passwd_size ) {
276
- var size = passwd_size || 6 ;
330
+ function randomString ( size ) {
331
+ size = size || 6 ;
277
332
var code_string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' ;
278
333
var max_num = code_string . length + 1 ;
279
334
var new_pass = '' ;
0 commit comments