var async = require('async'); var bcrypt = require('bcrypt-nodejs'); var nodemailer = require('nodemailer'); var User = require('../models/User'); /** * GET /reset/:token * Reset Password page. */ exports.getReset = function(req, res) { if (req.isAuthenticated()) { return res.redirect('/'); } User .where('resetPasswordToken', req.params.token) .where('resetPasswordExpires').gt(Date.now()) .exec(function(err, user) { if (!user) { req.flash('errors', { msg: 'Password reset token is invalid or has expired.' }); return res.redirect('/forgot'); } res.render('account/reset', { title: 'Password Reset' }); }); }; /** * POST /reset/:token * Process the reset password request. */ exports.postReset = function(req, res, next) { req.assert('password', 'Password must be at least 4 characters long.').len(4); req.assert('confirm', 'Passwords must match.').equals(req.body.password); var errors = req.validationErrors(); if (errors) { req.flash('errors', errors); return res.redirect('back'); } async.waterfall([ function(done) { User .where('resetPasswordToken', req.params.token) .where('resetPasswordExpires').gt(Date.now()) .exec(function(err, user) { if (!user) { req.flash('errors', { msg: 'Password reset request is invalid. It may have expired.' }); return res.redirect('back'); } done(err, user); }); }, function(user, done) { user.password = req.body.password; user.resetPasswordToken = undefined; user.resetPasswordExpires = undefined; user.save(function(err) { if (err) return next(err); req.logIn(user, function(err) { done(err, user); }); }); }, function(user, done) { var smtpTransport = nodemailer.createTransport('SMTP', { service: 'SendGrid', auth: { user: secrets.sendgrid.user, pass: secrets.sendgrid.password } }); var mailOptions = { to: user.profile.name + ' <' + user.email + '>', from: 'hackathon@starter.com', subject: 'Your Hackathon Starter password has been changed', text: 'Hello,\n\n' + 'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\n' }; smtpTransport.sendMail(mailOptions, function(err) { done(err); }); } ], function(err) { if (err) return next(err); res.redirect('/'); }); };