From 01a8d5e67bb002cb0c51471b9c2e418c6f4c117d Mon Sep 17 00:00:00 2001 From: Ryan Hutchison Date: Tue, 4 Aug 2015 00:14:42 -0400 Subject: [PATCH] reset-password enhancements and bug fix --- scripts/reset-password.js | 128 +++++++++++++++++++++++++------------- 1 file changed, 84 insertions(+), 44 deletions(-) diff --git a/scripts/reset-password.js b/scripts/reset-password.js index 8a268567fa..fcc4f87e27 100755 --- a/scripts/reset-password.js +++ b/scripts/reset-password.js @@ -1,50 +1,90 @@ var nodemailer = require('nodemailer'), - mongoose = require('mongoose'), - config = require('../config/config'), - mg = require('../config/lib/mongoose'); + mongoose = require('mongoose'), + chalk = require('chalk'), + config = require('../config/config'), + mg = require('../config/lib/mongoose'); var transporter = nodemailer.createTransport(config.mailer.options); var link = 'reset link here'; // PUT reset link here +var email = { + from: config.mailer.from, + subject: 'Security update' +}; +var text = [ + 'Dear {{name}},', + '\n', + 'We have updated our password storage systems to be more secure and more efficient, please click the link below to reset your password so you can login in the future.', + link, + '\n', + 'Thanks,', + 'The Team' +].join('\n'); -mg.connect(function(db) { - var User = mongoose.model('User'); - - User.find().exec(function(err, users) { - if (err) { - throw err; - } - - var email = { - from: 'noreply@xyz.com', - subject: 'Security update' - }; - - for (var i = 0; i < users.length; i++) { - var text = [ - 'Dear ' + users[i].displayName, - '\n', - 'We have updated our password storage systems to be more secure and more efficient, please click the link below to reset your password so you can login in the future.', - link, - '\n', - 'Thanks,', - 'The Team' - ].join('\n'); - - email.to = users[i].email; - email.text = text; - email.html = text; - - transporter.sendMail(email, function(err, info) { - if (err) { - console.log('Error: ', err); - console.log('Could not send email for ', users[i].displayName); - } else { - console.log('Sent reset password email for ', users[i].displayName); - } - }); - } - - console.log('Sent all emails'); - process.exit(0); - }); +mg.loadModels(); + +mg.connect(function (db) { + var User = mongoose.model('User'); + + User.find().exec(function (err, users) { + if (err) { + throw err; + } + + var processedCount = 0, + errorCount = 0; + + // report and exit if no users were found + if (users.length === 0) { + return reportAndExit(processedCount, errorCount); + } + + for (var i = 0; i < users.length; i++) { + sendEmail(users[i]); + } + + function sendEmail(user) { + email.to = user.email; + email.text = email.html = text.replace('{{name}}', user.displayName); + + transporter.sendMail(email, emailCallback(user)); + }; + + function emailCallback(user) { + return function (err, info) { + processedCount++; + + if (err) { + errorCount++; + + if (config.mailer.options.debug) { + console.log('Error: ', err); + } + console.error('[' + processedCount + '/' + users.length + '] ' + chalk.red('Could not send email for ' + user.displayName)); + } else { + console.log('[' + processedCount + '/' + users.length + '] Sent reset password email for ' + user.displayName); + } + + if (processedCount === users.length) { + return reportAndExit(processedCount, errorCount); + } + }; + }; + + // report the processing results and exit + function reportAndExit(processedCount, errorCount) { + var successCount = processedCount - errorCount; + + console.log(); + + if (processedCount === 0) { + console.log(chalk.yellow('No users were found.')); + } else { + var alert = (!errorCount) ? chalk.green : ((successCount / processedCount) < .8) ? chalk.red : chalk.yellow; + + console.log(alert('Sent ' + successCount + ' of ' + processedCount + ' emails successfully.')); + } + + process.exit(0); + } + }); });