diff --git a/src/controllers/index.js b/src/controllers/index.js index 9955eaaef8..47ea0dcd88 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -78,8 +78,8 @@ Controllers.home = function(req, res, next) { } async.filter(data.categories, function (category, next) { - privileges.categories.canRead(category.cid, uid, function(err, canRead) { - next(!err && canRead); + privileges.categories.can('find', category.cid, uid, function(err, findable) { + next(!err && findable); }); }, function(visibleCategories) { data.categories = visibleCategories; diff --git a/src/privileges/categories.js b/src/privileges/categories.js index af2f50cdaf..8f0d25de5d 100644 --- a/src/privileges/categories.js +++ b/src/privileges/categories.js @@ -44,6 +44,20 @@ module.exports = function(privileges) { }); }; + privileges.categories.can = function(privilege, cid, uid, callback) { + helpers.some([ + function(next) { + helpers.allowedTo(privilege, uid, cid, next); + }, + function(next) { + user.isModerator(uid, cid, next); + }, + function(next) { + user.isAdministrator(uid, next); + } + ], callback); + }; + privileges.categories.canRead = function(cid, uid, callback) { helpers.some([ function(next) { @@ -80,6 +94,7 @@ module.exports = function(privileges) { privileges.categories.userPrivileges = function(cid, uid, callback) { async.parallel({ + find: async.apply(helpers.isMember, groups.isMember, 'cid:' + cid + ':privileges:find', uid), read: function(next) { helpers.isMember(groups.isMember, 'cid:' + cid + ':privileges:read', uid, next); }, @@ -97,6 +112,7 @@ module.exports = function(privileges) { privileges.categories.groupPrivileges = function(cid, groupName, callback) { async.parallel({ + 'groups:find': async.apply(helpers.isMember, groups.isMember, 'cid:' + cid + ':privileges:groups:find', groupName), 'groups:read': function(next) { helpers.isMember(groups.isMember, 'cid:' + cid + ':privileges:groups:read', groupName, function(err, isMember){ next(err, !!isMember); diff --git a/src/privileges/helpers.js b/src/privileges/helpers.js index 2bf2f49226..2c043fd6ac 100644 --- a/src/privileges/helpers.js +++ b/src/privileges/helpers.js @@ -30,13 +30,31 @@ helpers.allowedTo = function(privilege, uid, cid, callback) { return callback(null, false); } + // Guests handling + if (parseInt(uid, 10) === 0) { + return async.parallel([ + function(next) { + groups.exists('cid:' + cid + ':privileges:' + privilege, function(err, exists) { + next(err, !err ? !exists : false); + }); + }, + function(next) { + helpers.isMember(groups.isMember, 'cid:' + cid + ':privileges:groups:' + privilege, 'guests', function(err, isMember) { + next(err, privilege !== 'find' ? isMember : isMember !== false); + }); + } + ], function(err, results) { + callback(err, results[0] && results[1]); + }); + } + async.parallel({ hasUserPrivilege: function(next) { helpers.isMember(groups.isMember, 'cid:' + cid + ':privileges:' + privilege, uid, next); }, hasGroupPrivilege: function(next) { helpers.isMember(groups.isMemberOfGroupList, 'cid:' + cid + ':privileges:groups:' + privilege, uid, next); - }, + } }, function(err, results) { if (err) { return callback(err); diff --git a/src/socket.io/admin/categories.js b/src/socket.io/admin/categories.js index 4c70599e14..86e913af37 100644 --- a/src/socket.io/admin/categories.js +++ b/src/socket.io/admin/categories.js @@ -58,7 +58,7 @@ Categories.setPrivilege = function(socket, data, callback) { }; Categories.getPrivilegeSettings = function(socket, cid, callback) { - var privileges = ['read', 'topics:create', 'topics:reply', 'mods']; + var privileges = ['find', 'read', 'topics:create', 'topics:reply', 'mods']; async.reduce(privileges, [], function(members, privilege, next) { groups.get('cid:' + cid + ':privileges:' + privilege, { expand: true }, function(err, groupObj) {