mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 11:05:54 +01:00 
			
		
		
		
	closes #4103
This commit is contained in:
		| @@ -52,7 +52,7 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable) | ||||
|  | ||||
| 			bootbox.confirm('Do you really want to ban?', function(confirm) { | ||||
| 				if (confirm) { | ||||
| 					socket.emit('admin.user.banUsers', uids, done('User(s) banned!', '.ban', true)); | ||||
| 					socket.emit('user.banUsers', uids, done('User(s) banned!', '.ban', true)); | ||||
| 				} | ||||
| 			}); | ||||
| 			return false; | ||||
| @@ -64,7 +64,7 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable) | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			socket.emit('admin.user.unbanUsers', uids, done('User(s) unbanned!', '.ban', false)); | ||||
| 			socket.emit('user.unbanUsers', uids, done('User(s) unbanned!', '.ban', false)); | ||||
| 			return false; | ||||
| 		}); | ||||
|  | ||||
|   | ||||
| @@ -103,7 +103,7 @@ define('forum/account/header', [ | ||||
| 				if (!confirm) { | ||||
| 					return; | ||||
| 				} | ||||
| 				socket.emit('admin.user.banUsers', [ajaxify.data.theirid], function(err) { | ||||
| 				socket.emit('user.banUsers', [ajaxify.data.theirid], function(err) { | ||||
| 					if (err) { | ||||
| 						return app.alertError(err.message); | ||||
| 					} | ||||
| @@ -115,7 +115,7 @@ define('forum/account/header', [ | ||||
| 	} | ||||
|  | ||||
| 	function unbanAccount() { | ||||
| 		socket.emit('admin.user.unbanUsers', [ajaxify.data.theirid], function(err) { | ||||
| 		socket.emit('user.unbanUsers', [ajaxify.data.theirid], function(err) { | ||||
| 			if (err) { | ||||
| 				return app.alertError(err.message); | ||||
| 			} | ||||
|   | ||||
| @@ -32,6 +32,9 @@ helpers.getUserDataByUserSlug = function(userslug, callerUID, callback) { | ||||
| 				isAdmin : function(next) { | ||||
| 					user.isAdministrator(callerUID, next); | ||||
| 				}, | ||||
| 				isGlobalModerator: function(next) { | ||||
| 					user.isGlobalModerator(callerUID, next); | ||||
| 				}, | ||||
| 				ips: function(next) { | ||||
| 					user.getIPs(uid, 4, next); | ||||
| 				}, | ||||
| @@ -78,6 +81,8 @@ helpers.getUserDataByUserSlug = function(userslug, callerUID, callback) { | ||||
| 			userData.yourid = callerUID; | ||||
| 			userData.theirid = userData.uid; | ||||
| 			userData.isAdmin = isAdmin; | ||||
| 			userData.isGlobalModerator = results.isGlobalModerator; | ||||
| 			userData.canBan = isAdmin || results.isGlobalModerator; | ||||
| 			userData.isSelf = self; | ||||
| 			userData.showHidden = self || isAdmin; | ||||
| 			userData.groups = Array.isArray(results.groups) && results.groups.length ? results.groups[0] : []; | ||||
|   | ||||
| @@ -9,7 +9,7 @@ var async = require('async'), | ||||
| module.exports = function(Groups) { | ||||
|  | ||||
| 	Groups.create = function(data, callback) { | ||||
| 		var system = data.name === 'administrators' || data.name === 'registered-users' || Groups.isPrivilegeGroup(data.name); | ||||
| 		var system = data.name === 'administrators' || data.name === 'registered-users' || data.name === 'Global Moderators' || Groups.isPrivilegeGroup(data.name); | ||||
| 		var groupData; | ||||
| 		var timestamp = data.timestamp || Date.now(); | ||||
|  | ||||
| @@ -26,6 +26,7 @@ module.exports = function(Groups) { | ||||
| 				} | ||||
|  | ||||
| 				var memberCount = data.hasOwnProperty('ownerUid') ? 1 : 0; | ||||
| 				var isPrivate = data.hasOwnProperty('private') ? parseInt(data.private, 10) : 1; | ||||
| 				var slug = utils.slugify(data.name); | ||||
| 				groupData = { | ||||
| 					name: data.name, | ||||
| @@ -34,10 +35,11 @@ module.exports = function(Groups) { | ||||
| 					userTitle: data.name, | ||||
| 					description: data.description || '', | ||||
| 					memberCount: memberCount, | ||||
| 					deleted: '0', | ||||
| 					hidden: data.hidden || '0', | ||||
| 					system: system ? '1' : '0', | ||||
| 					private: data.private || '1' | ||||
| 					deleted: 0, | ||||
| 					hidden: parseInt(data.hidden, 10) === 1 ? 1 : 0, | ||||
| 					system: system ? 1 : 0, | ||||
| 					private: isPrivate, | ||||
| 					disableJoinRequests: parseInt(data.disableJoinRequests, 10) === 1 ? 1 : 0 | ||||
| 				}; | ||||
| 				plugins.fireHook('filter:group.create', {group: groupData, data: data}, next); | ||||
| 			}, | ||||
|   | ||||
| @@ -330,6 +330,31 @@ function createAdmin(callback) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function createGlobalModeratorsGroup(next) { | ||||
| 	var groups = require('./groups'); | ||||
| 	async.waterfall([ | ||||
| 		function (next) { | ||||
| 			groups.exists('Global Moderators', next); | ||||
| 		}, | ||||
| 		function (exists, next) { | ||||
| 			if (exists) { | ||||
| 				winston.info('Global Moderators group found, skipping creation!'); | ||||
| 				return next(); | ||||
| 			} | ||||
| 			groups.create({ | ||||
| 				name: 'Global Moderators', | ||||
| 				description: 'Forum wide moderators', | ||||
| 				hidden: 0, | ||||
| 				private: 1, | ||||
| 				disableJoinRequests: 1 | ||||
| 			}, next); | ||||
| 		}, | ||||
| 		function (groupData, next) { | ||||
| 			groups.show('Global Moderators', next); | ||||
| 		} | ||||
| 	], next); | ||||
| } | ||||
|  | ||||
| function createCategories(next) { | ||||
| 	var Categories = require('./categories'); | ||||
|  | ||||
| @@ -476,6 +501,7 @@ install.setup = function (callback) { | ||||
| 		enableDefaultTheme, | ||||
| 		createCategories, | ||||
| 		createAdministrator, | ||||
| 		createGlobalModeratorsGroup, | ||||
| 		createMenuItems, | ||||
| 		createWelcomePost, | ||||
| 		enableDefaultPlugins, | ||||
|   | ||||
| @@ -1,16 +1,13 @@ | ||||
|  | ||||
| 'use strict'; | ||||
|  | ||||
| var async = require('async'), | ||||
| 	winston = require('winston'), | ||||
| var async = require('async'); | ||||
|  | ||||
| 	db = require('../database'), | ||||
| 	topics = require('../topics'), | ||||
| 	user = require('../user'), | ||||
| 	helpers = require('./helpers'), | ||||
| 	groups = require('../groups'), | ||||
| 	categories = require('../categories'), | ||||
| 	plugins = require('../plugins'); | ||||
| var topics = require('../topics'); | ||||
| var user = require('../user'); | ||||
| var helpers = require('./helpers'); | ||||
| var categories = require('../categories'); | ||||
| var plugins = require('../plugins'); | ||||
|  | ||||
| module.exports = function(privileges) { | ||||
|  | ||||
|   | ||||
| @@ -1,16 +1,10 @@ | ||||
|  | ||||
| 'use strict'; | ||||
|  | ||||
| var async = require('async'), | ||||
| 	winston = require('winston'), | ||||
| var async = require('async'); | ||||
|  | ||||
| 	db = require('../database'), | ||||
| 	topics = require('../topics'), | ||||
| 	user = require('../user'), | ||||
| 	helpers = require('./helpers'), | ||||
| 	groups = require('../groups'), | ||||
| 	categories = require('../categories'), | ||||
| 	plugins = require('../plugins'); | ||||
| var groups = require('../groups'); | ||||
| var plugins = require('../plugins'); | ||||
|  | ||||
| module.exports = function(privileges) { | ||||
|  | ||||
| @@ -24,6 +18,14 @@ module.exports = function(privileges) { | ||||
| 		} | ||||
| 	}; | ||||
|  | ||||
| 	privileges.users.isGlobalModerator = function(uid, callback) { | ||||
| 		if (Array.isArray(uid)) { | ||||
| 			groups.isMembers(uid, 'Global Moderators', callback); | ||||
| 		} else { | ||||
| 			groups.isMember(uid, 'Global Moderators', callback); | ||||
| 		} | ||||
| 	}; | ||||
|  | ||||
| 	privileges.users.isModerator = function(uid, cid, callback) { | ||||
| 		if (Array.isArray(cid)) { | ||||
| 			isModeratorOfCategories(cid, uid, callback); | ||||
| @@ -41,14 +43,24 @@ module.exports = function(privileges) { | ||||
| 			return filterIsModerator(cids, uid, cids.map(function() {return false;}), callback); | ||||
| 		} | ||||
|  | ||||
| 		privileges.users.isGlobalModerator(uid, function(err, isGlobalModerator) { | ||||
| 			if (err) { | ||||
| 				return callback(err); | ||||
| 			} | ||||
| 			if (isGlobalModerator) { | ||||
| 				return filterIsModerator(cids, uid, cids.map(function() {return true;}), callback); | ||||
| 			} | ||||
|  | ||||
|  | ||||
| 			var uniqueCids = cids.filter(function(cid, index, array) { | ||||
| 				return array.indexOf(cid) === index; | ||||
| 			}); | ||||
|  | ||||
| 			var groupNames = uniqueCids.map(function(cid) { | ||||
| 				return 'cid:' + cid + ':privileges:mods';	// At some point we should *probably* change this to "moderate" as well | ||||
| 			}), | ||||
| 			groupListNames = uniqueCids.map(function(cid) { | ||||
| 			}); | ||||
|  | ||||
| 			var groupListNames = uniqueCids.map(function(cid) { | ||||
| 				return 'cid:' + cid + ':privileges:groups:moderate'; | ||||
| 			}); | ||||
|  | ||||
| @@ -75,10 +87,12 @@ module.exports = function(privileges) { | ||||
|  | ||||
| 				filterIsModerator(cids, uid, isModerator, callback); | ||||
| 			}); | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	function isModeratorsOfCategory(cid, uids, callback) { | ||||
| 		async.parallel([ | ||||
| 			async.apply(privileges.users.isGlobalModerator, uids), | ||||
| 			async.apply(groups.isMembers, uids, 'cid:' + cid + ':privileges:mods'), | ||||
| 			async.apply(groups.isMembersOfGroupList, uids, 'cid:' + cid + ':privileges:groups:moderate') | ||||
| 		], function(err, checks) { | ||||
| @@ -87,7 +101,7 @@ module.exports = function(privileges) { | ||||
| 			} | ||||
|  | ||||
| 			var isModerator = checks[0].map(function(isMember, idx) { | ||||
| 					return isMember || checks[1][idx]; | ||||
| 				return isMember || checks[1][idx] || checks[2][idx]; | ||||
| 			}); | ||||
|  | ||||
| 			filterIsModerator(cid, uids, isModerator, callback); | ||||
| @@ -96,6 +110,7 @@ module.exports = function(privileges) { | ||||
|  | ||||
| 	function isModeratorOfCategory(cid, uid, callback) { | ||||
| 		async.parallel([ | ||||
| 			async.apply(privileges.users.isGlobalModerator, uid), | ||||
| 			async.apply(groups.isMember, uid, 'cid:' + cid + ':privileges:mods'), | ||||
| 			async.apply(groups.isMemberOfGroupList, uid, 'cid:' + cid + ':privileges:groups:moderate') | ||||
| 		], function(err, checks) { | ||||
| @@ -103,7 +118,7 @@ module.exports = function(privileges) { | ||||
| 				return callback(err); | ||||
| 			} | ||||
|  | ||||
| 			var isModerator = checks[0] || checks[1]; | ||||
| 			var isModerator = checks[0] || checks[1] || checks[2]; | ||||
| 			filterIsModerator(cid, uid, isModerator, callback); | ||||
| 		}); | ||||
| 	} | ||||
|   | ||||
| @@ -1,15 +1,14 @@ | ||||
| "use strict"; | ||||
|  | ||||
|  | ||||
| var async = require('async'), | ||||
| 	db = require('../../database'), | ||||
| 	groups = require('../../groups'), | ||||
| 	user = require('../../user'), | ||||
| 	events = require('../../events'), | ||||
| 	meta = require('../../meta'), | ||||
| 	websockets = require('../index'), | ||||
| 	User = {}; | ||||
| var async = require('async'); | ||||
| var db = require('../../database'); | ||||
| var groups = require('../../groups'); | ||||
| var user = require('../../user'); | ||||
| var events = require('../../events'); | ||||
| var meta = require('../../meta'); | ||||
|  | ||||
| var User = {}; | ||||
|  | ||||
| User.makeAdmins = function(socket, uids, callback) { | ||||
| 	if(!Array.isArray(uids)) { | ||||
| @@ -60,38 +59,6 @@ User.createUser = function(socket, userData, callback) { | ||||
| 	user.create(userData, callback); | ||||
| }; | ||||
|  | ||||
| User.banUsers = function(socket, uids, callback) { | ||||
| 	toggleBan(uids, User.banUser, callback); | ||||
| }; | ||||
|  | ||||
| User.unbanUsers = function(socket, uids, callback) { | ||||
| 	toggleBan(uids, user.unban, callback); | ||||
| }; | ||||
|  | ||||
| function toggleBan(uids, method, callback) { | ||||
| 	if(!Array.isArray(uids)) { | ||||
| 		return callback(new Error('[[error:invalid-data]]')); | ||||
| 	} | ||||
| 	async.each(uids, method, callback); | ||||
| } | ||||
|  | ||||
| User.banUser = function(uid, callback) { | ||||
| 	user.isAdministrator(uid, function(err, isAdmin) { | ||||
| 		if (err || isAdmin) { | ||||
| 			return callback(err || new Error('[[error:cant-ban-other-admins]]')); | ||||
| 		} | ||||
|  | ||||
| 		user.ban(uid, function(err) { | ||||
| 			if (err) { | ||||
| 				return callback(err); | ||||
| 			} | ||||
|  | ||||
| 			websockets.in('uid_' + uid).emit('event:banned'); | ||||
|  | ||||
| 			callback(); | ||||
| 		}); | ||||
| 	}); | ||||
| }; | ||||
|  | ||||
| User.resetLockouts = function(socket, uids, callback) { | ||||
| 	if (!Array.isArray(uids)) { | ||||
|   | ||||
| @@ -8,7 +8,6 @@ var topics = require('../topics'); | ||||
| var notifications = require('../notifications'); | ||||
| var messaging = require('../messaging'); | ||||
| var plugins = require('../plugins'); | ||||
| var websockets = require('./index'); | ||||
| var meta = require('../meta'); | ||||
| var events = require('../events'); | ||||
| var emailer = require('../emailer'); | ||||
| @@ -16,11 +15,11 @@ var db = require('../database'); | ||||
|  | ||||
| var SocketUser = {}; | ||||
|  | ||||
|  | ||||
| require('./user/profile')(SocketUser); | ||||
| require('./user/search')(SocketUser); | ||||
| require('./user/status')(SocketUser); | ||||
| require('./user/picture')(SocketUser); | ||||
| require('./user/ban')(SocketUser); | ||||
|  | ||||
| SocketUser.exists = function(socket, data, callback) { | ||||
| 	if (data && data.username) { | ||||
|   | ||||
							
								
								
									
										70
									
								
								src/socket.io/user/ban.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/socket.io/user/ban.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| var async = require('async'); | ||||
| var user = require('../../user'); | ||||
| var websockets = require('../index'); | ||||
| var events = require('../../events'); | ||||
|  | ||||
| module.exports = function(SocketUser) { | ||||
|  | ||||
| 	SocketUser.banUsers = function(socket, uids, callback) { | ||||
| 		toggleBan(socket.uid, uids, SocketUser.banUser, function(err) { | ||||
| 			if (err) { | ||||
| 				return callback(err); | ||||
| 			} | ||||
| 			async.each(uids, function(uid, next) { | ||||
| 				events.log({ | ||||
| 					type: 'user-ban', | ||||
| 					uid: socket.uid, | ||||
| 					targetUid: uid, | ||||
| 					ip: socket.ip | ||||
| 				}, next); | ||||
| 			}, callback); | ||||
| 		}); | ||||
| 	}; | ||||
|  | ||||
| 	SocketUser.unbanUsers = function(socket, uids, callback) { | ||||
| 		toggleBan(socket.uid, uids, user.unban, callback); | ||||
| 	}; | ||||
|  | ||||
| 	function toggleBan(uid, uids, method, callback) { | ||||
| 		if (!Array.isArray(uids)) { | ||||
| 			return callback(new Error('[[error:invalid-data]]')); | ||||
| 		} | ||||
|  | ||||
| 		async.waterfall([ | ||||
| 			function (next) { | ||||
| 				async.parallel({ | ||||
| 					isAdmin: async.apply(user.isAdministrator, uid), | ||||
| 					isGlobalMod: async.apply(user.isGlobalModerator, uid) | ||||
| 				}, next); | ||||
| 			}, | ||||
| 			function (results, next) { | ||||
| 				if (!results.isAdmin && !results.isGlobalMod) { | ||||
| 					return next(new Error('[[error:no-privileges]]')); | ||||
| 				} | ||||
| 				async.each(uids, method, next); | ||||
| 			} | ||||
| 		], callback); | ||||
| 	} | ||||
|  | ||||
| 	SocketUser.banUser = function(uid, callback) { | ||||
| 		async.waterfall([ | ||||
| 			function (next) { | ||||
| 				user.isAdministrator(uid, next); | ||||
| 			}, | ||||
| 			function (isAdmin, next) { | ||||
| 				if (isAdmin) { | ||||
| 					return next(new Error('[[error:cant-ban-other-admins]]')); | ||||
| 				} | ||||
| 				user.ban(uid, next); | ||||
| 			}, | ||||
| 			function (next) { | ||||
| 				websockets.in('uid_' + uid).emit('event:banned'); | ||||
| 				next(); | ||||
| 			} | ||||
| 		], callback); | ||||
| 	}; | ||||
|  | ||||
| }; | ||||
|  | ||||
| @@ -10,7 +10,7 @@ var db = require('./database'), | ||||
| 	schemaDate, thisSchemaDate, | ||||
|  | ||||
| 	// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema | ||||
| 	latestSchema = Date.UTC(2016, 0, 20); | ||||
| 	latestSchema = Date.UTC(2016, 0, 23); | ||||
|  | ||||
| Upgrade.check = function(callback) { | ||||
| 	db.get('schemaDate', function(err, value) { | ||||
| @@ -369,6 +369,46 @@ Upgrade.upgrade = function(callback) { | ||||
| 				winston.info('[2016/01/20] Creating users:notvalidated skipped!'); | ||||
| 				next(); | ||||
| 			} | ||||
| 		}, | ||||
| 		function(next) { | ||||
| 			thisSchemaDate = Date.UTC(2016, 0, 23); | ||||
|  | ||||
| 			if (schemaDate < thisSchemaDate) { | ||||
| 				updatesMade = true; | ||||
| 				winston.info('[2016/01/23] Creating Global moderators group'); | ||||
|  | ||||
| 				var groups = require('./groups'); | ||||
| 				async.waterfall([ | ||||
| 					function (next) { | ||||
| 						groups.exists('Global Moderators', next); | ||||
| 					}, | ||||
| 					function (exists, next) { | ||||
| 						if (exists) { | ||||
| 							return next(); | ||||
| 						} | ||||
| 						groups.create({ | ||||
| 							name: 'Global Moderators', | ||||
| 							description: 'Forum wide moderators', | ||||
| 							hidden: 0, | ||||
| 							private: 1, | ||||
| 							disableJoinRequests: 1 | ||||
| 						}, next); | ||||
| 					}, | ||||
| 					function (groupData, next) { | ||||
| 						groups.show('Global Moderators', next); | ||||
| 					} | ||||
| 				], function(err) { | ||||
| 					if (err) { | ||||
| 						return next(err); | ||||
| 					} | ||||
|  | ||||
| 					winston.info('[2016/01/23] Creating Global moderators group done!'); | ||||
| 					Upgrade.update(thisSchemaDate, next); | ||||
| 				}); | ||||
| 			} else { | ||||
| 				winston.info('[2016/01/23] Creating Global moderators group skipped!'); | ||||
| 				next(); | ||||
| 			} | ||||
| 		} | ||||
| 		// Add new schema updates here | ||||
| 		// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 24!!! | ||||
|   | ||||
| @@ -230,6 +230,10 @@ var	async = require('async'), | ||||
| 		privileges.users.isAdministrator(uid, callback); | ||||
| 	}; | ||||
|  | ||||
| 	User.isGlobalModerator = function(uid, callback) { | ||||
| 		privileges.users.isGlobalModerator(uid, callback); | ||||
| 	}; | ||||
|  | ||||
| 	User.isAdminOrSelf = function(callerUid, uid, callback) { | ||||
| 		if (parseInt(callerUid, 10) === parseInt(uid, 10)) { | ||||
| 			return callback(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user