mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-12-21 16:00:26 +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