You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

270 lines
6.4 KiB
JavaScript

"use strict";
9 years ago
var async = require('async');
9 years ago
var validator = require('validator');
9 years ago
var db = require('../../database');
var groups = require('../../groups');
var user = require('../../user');
var events = require('../../events');
var meta = require('../../meta');
var plugins = require('../../plugins');
9 years ago
var User = {};
User.makeAdmins = function (socket, uids, callback) {
if(!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
user.getUsersFields(uids, ['banned'], function (err, userData) {
11 years ago
if (err) {
return callback(err);
}
for(var i = 0; i < userData.length; i += 1) {
11 years ago
if (userData[i] && parseInt(userData[i].banned, 10) === 1) {
return callback(new Error('[[error:cant-make-banned-users-admin]]'));
}
}
async.each(uids, function (uid, next) {
11 years ago
groups.join('administrators', uid, next);
}, callback);
});
};
User.removeAdmins = function (socket, uids, callback) {
if(!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
async.eachSeries(uids, function (uid, next) {
groups.getMemberCount('administrators', function (err, count) {
if (err) {
return next(err);
}
if (count === 1) {
return next(new Error('[[error:cant-remove-last-admin]]'));
}
groups.leave('administrators', uid, next);
});
}, callback);
};
User.createUser = function (socket, userData, callback) {
if (!userData) {
return callback(new Error('[[error:invalid-data]]'));
}
user.create(userData, callback);
};
User.resetLockouts = function (socket, uids, callback) {
11 years ago
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
async.each(uids, user.auth.resetLockout, callback);
};
User.resetFlags = function (socket, uids, callback) {
10 years ago
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
user.resetFlags(uids, callback);
};
User.validateEmail = function (socket, uids, callback) {
11 years ago
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
uids = uids.filter(function (uid) {
11 years ago
return parseInt(uid, 10);
});
async.each(uids, function (uid, next) {
11 years ago
user.setUserField(uid, 'email:confirmed', 1, next);
}, function (err) {
9 years ago
if (err) {
return callback(err);
}
db.sortedSetRemove('users:notvalidated', uids, callback);
});
10 years ago
};
User.sendValidationEmail = function (socket, uids, callback) {
10 years ago
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
10 years ago
10 years ago
if (parseInt(meta.config.requireEmailConfirmation, 10) !== 1) {
return callback(new Error('[[error:email-confirmations-are-disabled]]'));
}
8 years ago
async.waterfall([
function (next) {
user.getUsersFields(uids, ['uid', 'email'], next);
},
function (usersData, next) {
async.eachLimit(usersData, 50, function (userData, next) {
if (userData.email && userData.uid) {
user.email.sendValidationEmail(userData.uid, userData.email, next);
} else {
next();
}
}, next);
},
8 years ago
], callback);
10 years ago
};
User.sendPasswordResetEmail = function (socket, uids, callback) {
10 years ago
if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
uids = uids.filter(function (uid) {
10 years ago
return parseInt(uid, 10);
});
async.each(uids, function (uid, next) {
user.getUserFields(uid, ['email', 'username'], function (err, userData) {
10 years ago
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);
});
11 years ago
}, callback);
};
User.deleteUsers = function (socket, uids, callback) {
deleteUsers(socket, uids, function (uid, next) {
9 years ago
user.deleteAccount(uid, next);
}, callback);
};
User.deleteUsersAndContent = function (socket, uids, callback) {
deleteUsers(socket, uids, function (uid, next) {
9 years ago
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.each(uids, function (uid, next) {
async.waterfall([
function (next) {
user.isAdministrator(uid, next);
},
function (isAdmin, next) {
if (isAdmin) {
return next(new Error('[[error:cant-delete-other-admins]]'));
}
9 years ago
method(uid, next);
},
function (next) {
events.log({
type: 'user-delete',
uid: socket.uid,
targetUid: uid,
ip: socket.ip,
}, next);
},
function (next) {
plugins.fireHook('action:user.delete', {
callerUid: socket.uid,
uid: uid,
ip: socket.ip,
});
next();
},
], next);
}, callback);
9 years ago
}
User.search = function (socket, data, callback) {
8 years ago
var searchData;
async.waterfall([
function (next) {
user.search({query: data.query, searchBy: data.searchBy, uid: socket.uid}, next);
},
function (_searchData, next) {
searchData = _searchData;
if (!searchData.users.length) {
return callback(null, searchData);
10 years ago
}
8 years ago
var uids = searchData.users.map(function (user) {
return user && user.uid;
});
user.getUsersFields(uids, ['email', 'flags', 'lastonline', 'joindate'], next);
},
function (userInfo, next) {
searchData.users.forEach(function (user, index) {
9 years ago
if (user && userInfo[index]) {
9 years ago
user.email = validator.escape(String(userInfo[index].email || ''));
9 years ago
user.flags = userInfo[index].flags || 0;
user.lastonlineISO = userInfo[index].lastonlineISO;
user.joindateISO = userInfo[index].joindateISO;
10 years ago
}
});
8 years ago
next(null, searchData);
},
8 years ago
], callback);
};
User.deleteInvitation = function (socket, data, callback) {
user.deleteInvitation(data.invitedBy, data.email, callback);
};
User.acceptRegistration = function (socket, data, callback) {
async.waterfall([
function (next) {
user.acceptRegistration(data.username, next);
},
function (uid, next) {
events.log({
type: 'registration-approved',
uid: socket.uid,
ip: socket.ip,
targetUid: uid,
});
next(null, uid);
},
], callback);
10 years ago
};
User.rejectRegistration = function (socket, data, callback) {
async.waterfall([
function (next) {
user.rejectRegistration(data.username, next);
},
function (next) {
events.log({
type: 'registration-rejected',
uid: socket.uid,
ip: socket.ip,
username: data.username,
});
next();
},
], callback);
10 years ago
};
User.restartJobs = function (socket, data, callback) {
9 years ago
user.startJobs(callback);
};
10 years ago
module.exports = User;