new privilege: Access Topic

differentiation between Access Category and Access Topic, ie. allows you
to see the category view but not actually enter the topic itself
v1.18.x
psychobunny 10 years ago
parent 839ff06967
commit b37b083a4d

@ -316,7 +316,7 @@ define('admin/manage/category', [
autocomplete.user(inputEl, function(ev, ui) { autocomplete.user(inputEl, function(ev, ui) {
socket.emit('admin.categories.setPrivilege', { socket.emit('admin.categories.setPrivilege', {
cid: ajaxify.data.category.cid, cid: ajaxify.data.category.cid,
privilege: ['find', 'read'], privilege: ['find', 'read', 'topics:read'],
set: true, set: true,
member: ui.item.user.uid member: ui.item.user.uid
}, function(err) { }, function(err) {

@ -48,7 +48,7 @@ module.exports = function(Categories) {
function(data, next) { function(data, next) {
category = data.category; category = data.category;
var defaultPrivileges = ['find', 'read', 'topics:create', 'topics:reply']; var defaultPrivileges = ['find', 'read', 'topics:read', 'topics:create', 'topics:reply'];
async.series([ async.series([
async.apply(db.setObject, 'category:' + category.cid, category), async.apply(db.setObject, 'category:' + category.cid, category),
@ -57,7 +57,7 @@ module.exports = function(Categories) {
async.apply(db.sortedSetAdd, 'cid:' + parentCid + ':children', category.order, category.cid), async.apply(db.sortedSetAdd, 'cid:' + parentCid + ':children', category.order, category.cid),
async.apply(privileges.categories.give, defaultPrivileges, category.cid, 'administrators'), async.apply(privileges.categories.give, defaultPrivileges, category.cid, 'administrators'),
async.apply(privileges.categories.give, defaultPrivileges, category.cid, 'registered-users'), async.apply(privileges.categories.give, defaultPrivileges, category.cid, 'registered-users'),
async.apply(privileges.categories.give, ['find', 'read'], category.cid, 'guests') async.apply(privileges.categories.give, ['find', 'read', 'topics:read'], category.cid, 'guests')
], next); ], next);
}, },
function(results, next) { function(results, next) {
@ -130,7 +130,7 @@ module.exports = function(Categories) {
Categories.copyPrivilegesFrom = function(fromCid, toCid, callback) { Categories.copyPrivilegesFrom = function(fromCid, toCid, callback) {
var privilegeList = [ var privilegeList = [
'find', 'read', 'topics:create', 'topics:reply', 'purge', 'mods', 'find', 'read', 'topics:create', 'topics:read', 'topics:reply', 'purge', 'mods',
'groups:find', 'groups:read', 'groups:topics:create', 'groups:topics:reply', 'groups:purge', 'groups:moderate' 'groups:find', 'groups:read', 'groups:topics:create', 'groups:topics:reply', 'groups:purge', 'groups:moderate'
]; ];

@ -50,7 +50,7 @@ topicsController.get = function(req, res, callback) {
userPrivileges = results.privileges; userPrivileges = results.privileges;
if (!userPrivileges.read || (parseInt(results.topic.deleted, 10) && !userPrivileges.view_deleted)) { if (!userPrivileges.read || !userPrivileges['topics:read'] || (parseInt(results.topic.deleted, 10) && !userPrivileges.view_deleted)) {
return helpers.notAllowed(req, res); return helpers.notAllowed(req, res);
} }

@ -18,8 +18,9 @@ module.exports = function(privileges) {
// Method used in admin/category controller to show all users/groups with privs in that given cid // Method used in admin/category controller to show all users/groups with privs in that given cid
var privilegeLabels = [ var privilegeLabels = [
{name: 'Find category'}, {name: 'Find Category'},
{name: 'Access & Read'}, {name: 'Access Category'},
{name: 'Access Topics'},
{name: 'Create Topics'}, {name: 'Create Topics'},
{name: 'Reply to Topics'}, {name: 'Reply to Topics'},
{name: 'Purge'}, {name: 'Purge'},
@ -27,10 +28,10 @@ module.exports = function(privileges) {
]; ];
var userPrivilegeList = [ var userPrivilegeList = [
'find', 'read', 'topics:create', 'topics:reply', 'purge', 'mods' 'find', 'read', 'topics:read', 'topics:create', 'topics:reply', 'purge', 'mods'
]; ];
var groupPrivilegeList = [ var groupPrivilegeList = [
'groups:find', 'groups:read', 'groups:topics:create', 'groups:topics:reply', 'groups:purge', 'groups:moderate' 'groups:find', 'groups:read', 'groups:topics:read', 'groups:topics:create', 'groups:topics:reply', 'groups:purge', 'groups:moderate'
]; ];
async.parallel({ async.parallel({
@ -162,6 +163,9 @@ module.exports = function(privileges) {
'topics:create': function(next) { 'topics:create': function(next) {
helpers.isUserAllowedTo('topics:create', uid, [cid], next); helpers.isUserAllowedTo('topics:create', uid, [cid], next);
}, },
'topics:read': function(next) {
helpers.isUserAllowedTo('topics:read', uid, [cid], next);
},
read: function(next) { read: function(next) {
helpers.isUserAllowedTo('read', uid, [cid], next); helpers.isUserAllowedTo('read', uid, [cid], next);
}, },
@ -182,6 +186,7 @@ module.exports = function(privileges) {
cid: cid, cid: cid,
uid: uid, uid: uid,
'topics:create': results['topics:create'][0] || isAdminOrMod, 'topics:create': results['topics:create'][0] || isAdminOrMod,
'topics:read': results['topics:read'][0] || isAdminOrMod,
editable: isAdminOrMod, editable: isAdminOrMod,
view_deleted: isAdminOrMod, view_deleted: isAdminOrMod,
read: results.read[0] || isAdminOrMod, read: results.read[0] || isAdminOrMod,
@ -356,6 +361,9 @@ module.exports = function(privileges) {
'topics:create': function(next) { 'topics:create': function(next) {
groups.isMember(uid, 'cid:' + cid + ':privileges:topics:create', next); groups.isMember(uid, 'cid:' + cid + ':privileges:topics:create', next);
}, },
'topics:read': function(next) {
groups.isMember(uid, 'cid:' + cid + ':privileges:topics:read', next);
},
'topics:reply': function(next) { 'topics:reply': function(next) {
groups.isMember(uid, 'cid:' + cid + ':privileges:topics:reply', next); groups.isMember(uid, 'cid:' + cid + ':privileges:topics:reply', next);
}, },
@ -376,6 +384,9 @@ module.exports = function(privileges) {
}, },
'groups:topics:reply': function(next) { 'groups:topics:reply': function(next) {
groups.isMember(groupName, 'cid:' + cid + ':privileges:groups:topics:reply', next); groups.isMember(groupName, 'cid:' + cid + ':privileges:groups:topics:reply', next);
},
'groups:topics:read': function(next) {
groups.isMember(groupName, 'cid:' + cid + ':privileges:groups:topics:read', next);
} }
}, callback); }, callback);
}; };

@ -21,6 +21,7 @@ module.exports = function(privileges) {
topic = _topic; topic = _topic;
async.parallel({ async.parallel({
'topics:reply': async.apply(helpers.isUserAllowedTo, 'topics:reply', uid, [topic.cid]), 'topics:reply': async.apply(helpers.isUserAllowedTo, 'topics:reply', uid, [topic.cid]),
'topics:read': async.apply(helpers.isUserAllowedTo, 'topics:read', uid, [topic.cid]),
read: async.apply(helpers.isUserAllowedTo, 'read', uid, [topic.cid]), read: async.apply(helpers.isUserAllowedTo, 'read', uid, [topic.cid]),
isOwner: function(next) { isOwner: function(next) {
next(null, !!parseInt(uid, 10) && parseInt(uid, 10) === parseInt(topic.uid, 10)); next(null, !!parseInt(uid, 10) && parseInt(uid, 10) === parseInt(topic.uid, 10));
@ -44,6 +45,7 @@ module.exports = function(privileges) {
plugins.fireHook('filter:privileges.topics.get', { plugins.fireHook('filter:privileges.topics.get', {
'topics:reply': (results['topics:reply'][0] && !locked) || isAdminOrMod, 'topics:reply': (results['topics:reply'][0] && !locked) || isAdminOrMod,
read: results.read[0] || isAdminOrMod, read: results.read[0] || isAdminOrMod,
'topics:read': results['topics:read'][0] || isAdminOrMod,
view_thread_tools: editable || deletable, view_thread_tools: editable || deletable,
editable: editable, editable: editable,
deletable: deletable, deletable: deletable,

@ -38,7 +38,7 @@ function generateForTopic(req, res, callback) {
if (parseInt(results.topic.deleted, 10) && !results.privileges.view_deleted) { if (parseInt(results.topic.deleted, 10) && !results.privileges.view_deleted) {
return callback(); return callback();
} }
if (!results.privileges.read) { if (!results.privileges.read || !results.privileges['topics:read']) {
return helpers.notAllowed(req, res); return helpers.notAllowed(req, res);
} }
userPrivileges = results.privileges; userPrivileges = results.privileges;

@ -5,8 +5,9 @@
Privileges <span class="caret"></span> Privileges <span class="caret"></span>
</button> </button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">
<li role="presentation"><a href="#" data-priv="groups:find" class="<!-- IF groups.privileges.groups:find -->active<!-- ENDIF groups.privileges.groups:find -->">Find category</a></li> <li role="presentation"><a href="#" data-priv="groups:find" class="<!-- IF groups.privileges.groups:find -->active<!-- ENDIF groups.privileges.groups:find -->">Find Category</a></li>
<li role="presentation"><a href="#" data-priv="groups:read" class="<!-- IF groups.privileges.groups:read -->active<!-- ENDIF groups.privileges.groups:read -->">Access &amp; Read</a></li> <li role="presentation"><a href="#" data-priv="groups:read" class="<!-- IF groups.privileges.groups:read -->active<!-- ENDIF groups.privileges.groups:read -->">Access Category</a></li>
<li role="presentation"><a href="#" data-priv="groups:topics:read" class="<!-- IF groups.privileges.groups:topics:read -->active<!-- ENDIF groups.privileges.groups:topics:read -->">Access Topics</a></li>
<li role="presentation"><a href="#" data-priv="groups:topics:create" class="<!-- IF groups.privileges.groups:topics:create -->active<!-- ENDIF groups.privileges.groups:topics:create -->">Create Topics</a></li> <li role="presentation"><a href="#" data-priv="groups:topics:create" class="<!-- IF groups.privileges.groups:topics:create -->active<!-- ENDIF groups.privileges.groups:topics:create -->">Create Topics</a></li>
<li role="presentation"><a href="#" data-priv="groups:topics:reply" class="<!-- IF groups.privileges.groups:topics:reply -->active<!-- ENDIF groups.privileges.groups:topics:reply -->">Reply to Topics</a></li> <li role="presentation"><a href="#" data-priv="groups:topics:reply" class="<!-- IF groups.privileges.groups:topics:reply -->active<!-- ENDIF groups.privileges.groups:topics:reply -->">Reply to Topics</a></li>
</ul> </ul>

@ -5,8 +5,9 @@
Privileges <span class="caret"></span> Privileges <span class="caret"></span>
</button> </button>
<ul class="dropdown-menu" role="menu"> <ul class="dropdown-menu" role="menu">
<li role="presentation"><a href="#" data-priv="find" class="<!-- IF users.privileges.find -->active<!-- ENDIF users.privileges.find -->">Find category</a></li> <li role="presentation"><a href="#" data-priv="find" class="<!-- IF users.privileges.find -->active<!-- ENDIF users.privileges.find -->">Find Category</a></li>
<li role="presentation"><a href="#" data-priv="read" class="<!-- IF users.privileges.read -->active<!-- ENDIF users.privileges.read -->">Access &amp; Read</a></li> <li role="presentation"><a href="#" data-priv="read" class="<!-- IF users.privileges.read -->active<!-- ENDIF users.privileges.read -->">Access Category</a></li>
<li role="presentation"><a href="#" data-priv="topics:read" class="<!-- IF users.privileges.topics:read -->active<!-- ENDIF users.privileges.topics:read -->">Access Topics</a></li>
<li role="presentation"><a href="#" data-priv="topics:create" class="<!-- IF users.privileges.topics:create -->active<!-- ENDIF users.privileges.topics:create -->">Create Topics</a></li> <li role="presentation"><a href="#" data-priv="topics:create" class="<!-- IF users.privileges.topics:create -->active<!-- ENDIF users.privileges.topics:create -->">Create Topics</a></li>
<li role="presentation"><a href="#" data-priv="topics:reply" class="<!-- IF users.privileges.topics:reply -->active<!-- ENDIF users.privileges.topics:reply -->">Reply to Topics</a></li> <li role="presentation"><a href="#" data-priv="topics:reply" class="<!-- IF users.privileges.topics:reply -->active<!-- ENDIF users.privileges.topics:reply -->">Reply to Topics</a></li>
<li role="presentation" class="divider"></li> <li role="presentation" class="divider"></li>

Loading…
Cancel
Save