From d4923398417ac8130b6e5bc347abfefbc7444352 Mon Sep 17 00:00:00 2001
From: barisusakli <barisusakli@gmail.com>
Date: Mon, 3 Nov 2014 15:31:41 -0500
Subject: [PATCH] closes #2315

---
 public/src/admin/manage/users.js | 14 ++++++++++++++
 src/emailer.js                   | 24 ++++++++++++++----------
 src/socket.io/admin/user.js      | 22 ++++++++++++++++++++++
 src/views/admin/manage/users.tpl |  1 +
 4 files changed, 51 insertions(+), 10 deletions(-)

diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js
index 54eead3572..d4d5f50404 100644
--- a/public/src/admin/manage/users.js
+++ b/public/src/admin/manage/users.js
@@ -124,6 +124,20 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable)
 			return false;
 		});
 
+		$('.password-reset-email').on('click', function() {
+			var uids = getSelectedUids();
+			if (!uids.length) {
+				return;
+			}
+
+			bootbox.confirm('Do you want to send password reset email(s) to these user(s)?', function(confirm) {
+				if (confirm) {
+					socket.emit('admin.user.sendPasswordResetEmail', uids, done('Emails sent'));
+				}
+			});
+			return false;
+		});
+
 		$('.delete-user').on('click', function() {
 			var uids = getSelectedUids();
 			if (!uids.length) {
diff --git a/src/emailer.js b/src/emailer.js
index d77cc9556a..d3b7d1f9aa 100644
--- a/src/emailer.js
+++ b/src/emailer.js
@@ -36,21 +36,25 @@ Emailer.send = function(template, uid, params) {
 				next(undefined, translated);
 			});
 		}, function(err, translated) {
-			if(err) {
+			if (err) {
 				return winston.error(err.message);
 			} else if (!results.email) {
 				return winston.warn('uid : ' + uid + ' has no email, not sending.');
 			}
 
-			Plugins.fireHook('action:email.send', {
-				to: results.email,
-				from: meta.config['email:from'] || 'no-reply@localhost.lan',
-				subject: translated[2],
-				html: translated[0],
-				plaintext: translated[1],
-				template: template,
-				uid: uid
-			});
+			if (Plugins.hasListeners('action:email.send')) {
+				Plugins.fireHook('action:email.send', {
+					to: results.email,
+					from: meta.config['email:from'] || 'no-reply@localhost.lan',
+					subject: translated[2],
+					html: translated[0],
+					plaintext: translated[1],
+					template: template,
+					uid: uid
+				});
+			} else {
+				winston.warn('[emailer] No active email plugin found!');
+			}
 		});
 	});
 };
diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js
index 0647b1397b..a8ebe9659e 100644
--- a/src/socket.io/admin/user.js
+++ b/src/socket.io/admin/user.js
@@ -118,6 +118,28 @@ User.validateEmail = function(socket, uids, callback) {
 	}, callback);
 };
 
+User.sendPasswordResetEmail = function(socket, uids, callback) {
+	if (!Array.isArray(uids)) {
+		return callback(new Error('[[error:invalid-data]]'));
+	}
+
+	uids = uids.filter(function(uid) {
+		return parseInt(uid, 10);
+	});
+
+	async.each(uids, function(uid, next) {
+		user.getUserFields(uid, ['email', 'username'], function(err, userData) {
+			if (err) {
+				return next(err);
+			}
+			if (!userData.email) {
+				return next(new Error('[[error:user-doesnt-have-email, ' + userData.username + ']]'));
+			}
+			user.reset.send(userData.email, next);
+		});
+	}, callback);
+};
+
 User.deleteUsers = function(socket, uids, callback) {
 	if(!Array.isArray(uids)) {
 		return callback(new Error('[[error:invalid-data]]'));
diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl
index 056ae48ad7..9f8ab3f322 100644
--- a/src/views/admin/manage/users.tpl
+++ b/src/views/admin/manage/users.tpl
@@ -18,6 +18,7 @@
 							<li><a href="#" class="remove-admin-user"><i class="fa fa-fw fa-ban"></i> Remove Admin</a></li>
 							<li class="divider"></li>
 							<li><a href="#" class="validate-email"><i class="fa fa-fw fa-check"></i> Validate Email</a></li>
+							<li><a href="#" class="password-reset-email"><i class="fa fa-fw fa-key"></i> Send Password Reset Email</a></li>
 							<li class="divider"></li>
 							<li><a href="#" class="ban-user"><i class="fa fa-fw fa-gavel"></i> Ban User</a></li>
 							<li><a href="#" class="unban-user"><i class="fa fa-fw fa-comment-o"></i> Unban User</a></li>