Files
NodeBB/src/socket.io/admin/user.js

226 lines
5.4 KiB
JavaScript
Raw Normal View History

2017-02-18 01:56:23 -07:00
'use strict';
2014-04-15 02:25:42 -04:00
2016-01-25 13:36:10 +02:00
var async = require('async');
var winston = require('winston');
2016-09-27 13:31:50 +03:00
2016-01-25 13:36:10 +02:00
var db = require('../../database');
var groups = require('../../groups');
var user = require('../../user');
var events = require('../../events');
var meta = require('../../meta');
2016-12-14 16:49:03 +03:00
var plugins = require('../../plugins');
2014-04-15 02:25:42 -04:00
2017-05-26 00:02:20 -04:00
var User = module.exports;
2014-04-15 02:25:42 -04:00
User.makeAdmins = function (socket, uids, callback) {
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
2014-04-15 02:25:42 -04:00
2017-05-26 00:02:20 -04:00
async.waterfall([
function (next) {
user.getUsersFields(uids, ['banned'], next);
},
function (userData, next) {
for (var i = 0; i < userData.length; i += 1) {
2018-10-25 17:02:59 -04:00
if (userData[i] && userData[i].banned) {
2017-05-26 00:02:20 -04:00
return callback(new Error('[[error:cant-make-banned-users-admin]]'));
}
2014-10-06 12:41:56 -04:00
}
2017-05-26 00:02:20 -04:00
async.each(uids, function (uid, next) {
groups.join('administrators', uid, next);
}, next);
},
], callback);
2014-04-15 02:25:42 -04:00
};
User.removeAdmins = function (socket, uids, callback) {
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
async.eachSeries(uids, function (uid, next) {
2017-05-26 00:02:20 -04:00
async.waterfall([
function (next) {
groups.getMemberCount('administrators', next);
},
function (count, next) {
if (count === 1) {
return next(new Error('[[error:cant-remove-last-admin]]'));
}
2017-05-26 00:02:20 -04:00
groups.leave('administrators', uid, next);
},
], next);
}, callback);
};
User.createUser = function (socket, userData, callback) {
2014-04-15 02:25:42 -04:00
if (!userData) {
return callback(new Error('[[error:invalid-data]]'));
}
user.create(userData, callback);
};
User.resetLockouts = function (socket, uids, callback) {
2014-08-14 08:34:38 -04:00
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
async.each(uids, user.auth.resetLockout, callback);
};
User.validateEmail = function (socket, uids, callback) {
2014-10-06 13:11:12 -04:00
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
2018-11-05 08:20:43 -05:00
uids = uids.filter(uid => parseInt(uid, 10));
2014-10-06 13:11:12 -04:00
2017-05-26 00:02:20 -04:00
async.waterfall([
function (next) {
async.each(uids, function (uid, next) {
user.setUserField(uid, 'email:confirmed', 1, next);
}, next);
},
function (next) {
db.sortedSetRemove('users:notvalidated', uids, next);
},
], callback);
2014-11-03 15:31:41 -05:00
};
User.sendValidationEmail = function (socket, uids, callback) {
2015-02-11 14:44:56 -05:00
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
2015-04-13 17:29:43 -04:00
if (!meta.config.requireEmailConfirmation) {
2015-02-11 14:44:56 -05:00
return callback(new Error('[[error:email-confirmations-are-disabled]]'));
}
async.eachLimit(uids, 50, function (uid, next) {
user.email.sendValidationEmail(uid, next);
}, callback);
2015-02-11 14:44:56 -05:00
};
User.sendPasswordResetEmail = function (socket, uids, callback) {
2014-11-03 15:31:41 -05:00
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
2018-11-05 08:20:43 -05:00
uids = uids.filter(uid => parseInt(uid, 10));
2014-11-03 15:31:41 -05:00
async.each(uids, function (uid, next) {
2017-05-26 00:02:20 -04:00
async.waterfall([
function (next) {
user.getUserFields(uid, ['email', 'username'], next);
},
function (userData, next) {
if (!userData.email) {
return next(new Error('[[error:user-doesnt-have-email, ' + userData.username + ']]'));
}
user.reset.send(userData.email, next);
},
], next);
2014-10-06 13:11:12 -04:00
}, callback);
};
User.deleteUsers = function (socket, uids, callback) {
deleteUsers(socket, uids, function (uid, next) {
2016-08-12 01:55:38 +03:00
user.deleteAccount(uid, next);
}, callback);
};
User.deleteUsersAndContent = function (socket, uids, callback) {
deleteUsers(socket, uids, function (uid, next) {
2016-08-12 01:55:38 +03:00
user.delete(socket.uid, uid, next);
}, callback);
};
function deleteUsers(socket, uids, method, callback) {
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
async.waterfall([
function (next) {
groups.isMembers(uids, 'administrators', next);
},
function (isMembers, next) {
if (isMembers.includes(true)) {
return callback(new Error('[[error:cant-delete-other-admins]]'));
}
2014-04-15 02:25:42 -04:00
callback();
async.each(uids, function (uid, next) {
async.waterfall([
function (next) {
method(uid, next);
},
function (userData, next) {
events.log({
type: 'user-delete',
uid: socket.uid,
targetUid: uid,
ip: socket.ip,
username: userData.username,
email: userData.email,
}, next);
},
function (next) {
plugins.fireHook('action:user.delete', {
callerUid: socket.uid,
uid: uid,
ip: socket.ip,
});
next();
},
], next);
}, next);
},
], function (err) {
if (err) {
winston.error(err);
}
});
2016-08-12 01:55:38 +03:00
}
2014-04-15 02:25:42 -04:00
User.search = function (socket, data, callback) {
2016-11-15 14:01:06 +03:00
var searchData;
async.waterfall([
function (next) {
2017-12-07 12:15:02 -05:00
user.search({
query: data.query,
searchBy: data.searchBy,
uid: socket.uid,
}, next);
2016-11-15 14:01:06 +03:00
},
function (_searchData, next) {
searchData = _searchData;
if (!searchData.users.length) {
return callback(null, searchData);
2014-12-21 16:29:32 -05:00
}
2018-11-05 08:20:43 -05:00
var uids = searchData.users.map(user => user && user.uid);
2016-11-15 14:01:06 +03:00
user.getUsersFields(uids, ['email', 'flags', 'lastonline', 'joindate'], next);
},
function (userInfo, next) {
searchData.users.forEach(function (user, index) {
2016-07-04 17:49:02 +03:00
if (user && userInfo[index]) {
2019-02-11 14:29:25 -05:00
user.email = userInfo[index].email;
2016-07-04 17:49:02 +03:00
user.flags = userInfo[index].flags || 0;
2016-10-07 17:35:24 +03:00
user.lastonlineISO = userInfo[index].lastonlineISO;
user.joindateISO = userInfo[index].joindateISO;
2014-12-21 16:29:32 -05:00
}
});
2016-11-15 14:01:06 +03:00
next(null, searchData);
2017-02-17 19:31:21 -07:00
},
2016-11-15 14:01:06 +03:00
], callback);
2014-04-15 02:25:42 -04:00
};
User.restartJobs = function (socket, data, callback) {
2016-08-26 10:04:38 -04:00
user.startJobs(callback);
};