94 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var async = require('async');
 | 
						|
var nodemailer = require('nodemailer');
 | 
						|
var User = require('../models/User');
 | 
						|
var secrets = require('../config/secrets');
 | 
						|
 | 
						|
/**
 | 
						|
 * GET /reset/:token
 | 
						|
 * Reset Password page.
 | 
						|
 */
 | 
						|
 | 
						|
exports.getReset = function(req, res) {
 | 
						|
  if (req.isAuthenticated()) {
 | 
						|
    return res.redirect('/');
 | 
						|
  }
 | 
						|
 | 
						|
  User
 | 
						|
    .findOne({ 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
 | 
						|
        .findOne({ 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('back');
 | 
						|
          }
 | 
						|
 | 
						|
          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) {
 | 
						|
        req.flash('success', { msg: 'Success! Your password has been changed.' });
 | 
						|
        done(err);
 | 
						|
      });
 | 
						|
    }
 | 
						|
  ], function(err) {
 | 
						|
    if (err) return next(err);
 | 
						|
    res.redirect('/');
 | 
						|
  });
 | 
						|
};
 |