| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var groups = require('../../groups'), | 
					
						
							|  |  |  | 	user = require('../../user'), | 
					
						
							|  |  |  | 	events = require('../../events'), | 
					
						
							| 
									
										
										
										
											2014-04-28 22:39:27 -04:00
										 |  |  | 	websockets = require('../index'), | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | 	async = require('async'), | 
					
						
							|  |  |  | 	User = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | User.makeAdmins = function(socket, uids, callback) { | 
					
						
							| 
									
										
										
										
											2014-06-13 22:48:24 -04:00
										 |  |  | 	if(!Array.isArray(uids)) { | 
					
						
							|  |  |  | 		return callback(new Error('[[error:invalid-data]]')); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-06 12:41:56 -04:00
										 |  |  | 	user.getMultipleUserFields(uids, ['banned'], function(err, userData) { | 
					
						
							|  |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return callback(err); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		for(var i=0; i<userData.length; i++) { | 
					
						
							|  |  |  | 			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) { | 
					
						
							|  |  |  | 			groups.join('administrators', uid, next); | 
					
						
							|  |  |  | 		}, callback); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-13 22:48:24 -04:00
										 |  |  | User.removeAdmins = function(socket, uids, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 	if(!Array.isArray(uids)) { | 
					
						
							|  |  |  | 		return callback(new Error('[[error:invalid-data]]')); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-13 22:48:24 -04:00
										 |  |  | 	if (uids.indexOf(socket.uid.toString()) !== -1) { | 
					
						
							|  |  |  | 		return callback(new Error('[[error:cant-remove-self-as-admin]]')); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	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); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 	}, callback); | 
					
						
							| 
									
										
										
										
											2014-06-13 22:48:24 -04:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | User.createUser = function(socket, userData, callback) { | 
					
						
							|  |  |  | 	if (!userData) { | 
					
						
							|  |  |  | 		return callback(new Error('[[error:invalid-data]]')); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	user.create(userData, callback); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | User.banUsers = function(socket, uids, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-13 16:44:40 -04:00
										 |  |  | 	toggleBan(uids, User.banUser, callback); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | User.unbanUsers = function(socket, uids, callback) { | 
					
						
							|  |  |  | 	toggleBan(uids, user.unban, callback); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-13 16:45:37 -04:00
										 |  |  | function toggleBan(uids, method, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 	if(!Array.isArray(uids)) { | 
					
						
							|  |  |  | 		return callback(new Error('[[error:invalid-data]]')); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-05-13 16:44:40 -04:00
										 |  |  | 	async.each(uids, method, callback); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-12 14:51:39 -04:00
										 |  |  | User.banUser = function(uid, callback) { | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 	user.isAdministrator(uid, function(err, isAdmin) { | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | 		if (err || isAdmin) { | 
					
						
							|  |  |  | 			return callback(err || new Error('[[error:cant-ban-other-admins]]')); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 		user.ban(uid, function(err) { | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-04 17:41:00 -04:00
										 |  |  | 			websockets.in('uid_' + uid).emit('event:banned'); | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 			websockets.logoutUser(uid); | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | 			callback(); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2014-05-12 14:51:39 -04:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-14 08:34:38 -04:00
										 |  |  | User.resetLockouts = function(socket, uids, callback) { | 
					
						
							|  |  |  | 	if (!Array.isArray(uids)) { | 
					
						
							|  |  |  | 		return callback(new Error('[[error:invalid-data]]')); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async.each(uids, user.auth.resetLockout, callback); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-06 13:11:12 -04:00
										 |  |  | User.validateEmail = 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.setUserField(uid, 'email:confirmed', 1, next); | 
					
						
							|  |  |  | 	}, callback); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | User.deleteUsers = function(socket, uids, callback) { | 
					
						
							|  |  |  | 	if(!Array.isArray(uids)) { | 
					
						
							|  |  |  | 		return callback(new Error('[[error:invalid-data]]')); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 	async.each(uids, function(uid, next) { | 
					
						
							| 
									
										
										
										
											2014-09-16 12:19:58 -04:00
										 |  |  | 		user.isAdministrator(uid, function(err, isAdmin) { | 
					
						
							|  |  |  | 			if (err || isAdmin) { | 
					
						
							|  |  |  | 				return callback(err || new Error('[[error:cant-ban-other-admins]]')); | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-16 12:19:58 -04:00
										 |  |  | 			user.delete(uid, function(err) { | 
					
						
							|  |  |  | 				if (err) { | 
					
						
							|  |  |  | 					return next(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				events.logAdminUserDelete(socket.uid, uid); | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-16 12:19:58 -04:00
										 |  |  | 				websockets.logoutUser(uid); | 
					
						
							|  |  |  | 				next(); | 
					
						
							|  |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2014-05-05 16:48:09 -04:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}, callback); | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | User.search = function(socket, username, callback) { | 
					
						
							|  |  |  | 	user.search(username, function(err, data) { | 
					
						
							|  |  |  | 		function isAdmin(userData, next) { | 
					
						
							|  |  |  | 			user.isAdministrator(userData.uid, function(err, isAdmin) { | 
					
						
							|  |  |  | 				if(err) { | 
					
						
							|  |  |  | 					return next(err); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-04 11:58:05 -04:00
										 |  |  | 				userData.administrator = isAdmin; | 
					
						
							| 
									
										
										
										
											2014-04-15 02:25:42 -04:00
										 |  |  | 				next(); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return callback(err); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		async.each(data.users, isAdmin, function(err) { | 
					
						
							|  |  |  | 			callback(err, data); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = User; |