diff --git a/public/src/forum/admin/users.js b/public/src/forum/admin/users.js index 4bd33c8657..554f78660b 100644 --- a/public/src/forum/admin/users.js +++ b/public/src/forum/admin/users.js @@ -73,6 +73,22 @@ define('forum/admin/users', function() { unselectAll(); }); + $('.reset-lockout').on('click', function() { + var uids = getSelectedUids(); + if (!uids.length) { + return; + } + + socket.emit('admin.user.resetLockouts', uids, function(err) { + if (err) { + return app.alertError(err.message); + } + app.alertSuccess('Lockout(s) reset!'); + }); + + unselectAll(); + }); + $('.admin-user').on('click', function() { var uids = getSelectedUids(); if (!uids.length) { diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index bdd3d2566d..dd8cf8de04 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -88,6 +88,14 @@ User.banUser = function(uid, callback) { }); }; +User.resetLockouts = function(socket, uids, callback) { + if (!Array.isArray(uids)) { + return callback(new Error('[[error:invalid-data]]')); + } + + async.each(uids, user.auth.resetLockout, callback); +}; + User.deleteUsers = function(socket, uids, callback) { if(!Array.isArray(uids)) { return callback(new Error('[[error:invalid-data]]')); diff --git a/src/user/auth.js b/src/user/auth.js index b9c7b348ce..0aaa6f658a 100644 --- a/src/user/auth.js +++ b/src/user/auth.js @@ -1,6 +1,7 @@ 'use strict'; -var db = require('../database'), +var async = require('async'), + db = require('../database'), meta = require('../meta'); module.exports = function(User) { @@ -42,4 +43,11 @@ module.exports = function(User) { User.auth.clearLoginAttempts = function(uid) { db.delete('loginAttempts:' + uid); }; + + User.auth.resetLockout = function(uid, callback) { + async.parallel([ + async.apply(db.delete, 'loginAttemps:' + uid), + async.apply(db.delete, 'lockout:' + uid) + ], callback); + } }; \ No newline at end of file diff --git a/src/user/reset.js b/src/user/reset.js index ee80679bcd..2b101e8c27 100644 --- a/src/user/reset.js +++ b/src/user/reset.js @@ -88,10 +88,8 @@ var async = require('async'), db.deleteObjectField('reset:uid', code); db.deleteObjectField('reset:expiry', code); - db.delete('lockout:' + uid); - user.auth.clearLoginAttempts(uid); - callback(); + user.auth.resetLockout(uid, callback); }); }); });