From 329343686752d501dd18e735aa8cb2acc47b09e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 11 Feb 2015 14:44:56 -0500 Subject: [PATCH] closes #2640 --- public/src/admin/manage/users.js | 13 +++++++++++++ src/emailer.js | 1 + src/socket.io/admin/user.js | 29 +++++++++++++++++++++++++++-- src/user/email.js | 15 ++++++++++++--- src/views/admin/manage/users.tpl | 1 + 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index fdd63556e4..dad64e35af 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -134,6 +134,19 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable) return false; }); + $('.send-validation-email').on('click', function() { + var uids = getSelectedUids(); + if (!uids.length) { + return; + } + socket.emit('admin.user.sendValidationEmail', uids, function(err) { + if (err) { + return app.alertError(err.message); + } + app.alertSuccess('[[notifications:email-confirm-sent]]'); + }); + }) + $('.password-reset-email').on('click', function() { var uids = getSelectedUids(); if (!uids.length) { diff --git a/src/emailer.js b/src/emailer.js index e7c92fa812..557de96f6e 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -64,6 +64,7 @@ var fs = require('fs'), uid: uid, pid: params.pid }); + callback(); } else { winston.warn('[emailer] No active email plugin found!'); callback(); diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index aab9eb02e8..0fa583d742 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -1,12 +1,13 @@ "use strict"; -var db = require('../../database'), +var async = require('async'), + db = require('../../database'), groups = require('../../groups'), user = require('../../user'), events = require('../../events'), + meta = require('../../meta'), websockets = require('../index'), - async = require('async'), User = {}; @@ -127,6 +128,30 @@ User.validateEmail = function(socket, uids, callback) { }, callback); }; +User.sendValidationEmail = function(socket, uids, callback) { + if (!Array.isArray(uids)) { + return callback(new Error('[[error:invalid-data]]')); + } + + if (parseInt(meta.config.requireEmailConfirmation, 10) !== 1) { + return callback(new Error('[[error:email-confirmations-are-disabled]]')); + } + + user.getMultipleUserFields(uids, ['uid', 'email'], function(err, usersData) { + if (err) { + return callback(err); + } + + async.eachLimit(usersData, 50, function(userData, next) { + if (userData.email && userData.uid) { + user.email.verify(userData.uid, userData.email, next); + } else { + next(); + } + }, callback); + }); +}; + User.sendPasswordResetEmail = function(socket, uids, callback) { if (!Array.isArray(uids)) { return callback(new Error('[[error:invalid-data]]')); diff --git a/src/user/email.js b/src/user/email.js index 9a4fd2cd73..74b86c0cfe 100644 --- a/src/user/email.js +++ b/src/user/email.js @@ -27,11 +27,16 @@ var async = require('async'), }); }; - UserEmail.verify = function(uid, email) { + UserEmail.verify = function(uid, email, callback) { + callback = callback || function() {}; var confirm_code = utils.generateUUID(), confirm_link = nconf.get('url') + '/confirm/' + confirm_code; plugins.fireHook('filter:user.verify.code', confirm_code, function(err, confirm_code) { + if (err) { + return callback(err); + } + async.series([ function(next) { db.setObject('confirm:' + confirm_code, { @@ -43,7 +48,9 @@ var async = require('async'), db.expireAt('confirm:' + confirm_code, Math.floor(Date.now() / 1000 + 60 * 60 * 2), next); } ], function(err) { - + if (err) { + return callback(err); + } user.getUserField(uid, 'username', function(err, username) { if (err) { return winston.error(err.stack); @@ -64,10 +71,12 @@ var async = require('async'), if (plugins.hasListeners('action:user.verify')) { plugins.fireHook('action:user.verify', {uid: uid, data: data}); + callback(); } else if (plugins.hasListeners('action:email.send')) { - emailer.send('welcome', uid, data); + emailer.send('welcome', uid, data, callback); } else { winston.warn('No emailer to send verification email!'); + callback(); } }); }); diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index 1e034474b8..13aa80caa4 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -18,6 +18,7 @@
  • Remove Admin
  • Validate Email
  • +
  • Send Validation Email
  • Send Password Reset Email
  • Ban User