diff --git a/src/posts.js b/src/posts.js index ec75efc126..1191e5f9f1 100644 --- a/src/posts.js +++ b/src/posts.js @@ -472,10 +472,7 @@ var async = require('async'), Posts.isOwner = function(pid, uid, callback) { Posts.getPostField(pid, 'uid', function(err, author) { - if (err) { - return callback(err); - } - callback(null, parseInt(author, 10) === parseInt(uid, 10)); + callback(err, parseInt(author, 10) === parseInt(uid, 10)); }); }; diff --git a/src/privileges/posts.js b/src/privileges/posts.js index 81539419f7..23e8740a95 100644 --- a/src/privileges/posts.js +++ b/src/privileges/posts.js @@ -73,20 +73,16 @@ module.exports = function(privileges) { helpers.hasEnoughReputationFor('privileges:manage_topic', uid, next); }, function(next) { - posts.getCidByPid(pid, function(err, cid) { - if (err) { - return next(err); - } - user.isModerator(uid, cid, next); - }); - }, - function(next) { - user.isAdministrator(uid, next); + isAdminOrMod(pid, uid, next); } ], callback); }; privileges.posts.canMove = function(pid, uid, callback) { + isAdminOrMod(pid, uid, callback); + }; + + function isAdminOrMod(pid, uid, callback) { helpers.some([ function(next) { posts.getCidByPid(pid, function(err, cid) { @@ -100,5 +96,5 @@ module.exports = function(privileges) { user.isAdministrator(uid, next); } ], callback); - }; + } }; diff --git a/src/privileges/topics.js b/src/privileges/topics.js index 5dd7bedc92..ef0a2cb23d 100644 --- a/src/privileges/topics.js +++ b/src/privileges/topics.js @@ -27,6 +27,9 @@ module.exports = function(privileges) { read: function(next) { helpers.allowedTo('read', uid, cid, next); }, + isOwner: function(next) { + topics.isOwner(tid, uid, next); + }, manage_topic: function(next) { helpers.hasEnoughReputationFor('privileges:manage_topic', uid, next); }, @@ -40,14 +43,17 @@ module.exports = function(privileges) { if(err) { return callback(err); } - - var editable = results.isAdministrator || results.isModerator || results.manage_topic; + var isAdminOrMod = results.isAdministrator || results.isModerator; + var editable = isAdminOrMod || results.manage_topic; + var deletable = isAdminOrMod || results.isOwner; callback(null, { 'topics:reply': results['topics:reply'], + read: results.read, + view_thread_tools: editable || deletable, editable: editable, - view_deleted: editable, - read: results.read + deletable: deletable, + view_deleted: isAdminOrMod || results.manage_topic || results.isOwner }); }); }); @@ -65,24 +71,23 @@ module.exports = function(privileges) { privileges.topics.canEdit = function(tid, uid, callback) { helpers.some([ + function(next) { + topics.isOwner(tid, uid, next); + }, function(next) { helpers.hasEnoughReputationFor('privileges:manage_topic', uid, next); }, function(next) { - topics.getTopicField(tid, 'cid', function(err, cid) { - if (err) { - return next(err); - } - user.isModerator(uid, cid, next); - }); - }, - function(next) { - user.isAdministrator(uid, next); + isAdminOrMod(tid, uid, next); } ], callback); }; privileges.topics.canMove = function(tid, uid, callback) { + isAdminOrMod(tid, uid, callback); + }; + + function isAdminOrMod(tid, uid, callback) { helpers.some([ function(next) { topics.getTopicField(tid, 'cid', function(err, cid) { @@ -96,5 +101,5 @@ module.exports = function(privileges) { user.isAdministrator(uid, next); } ], callback); - }; + } }; diff --git a/src/topics.js b/src/topics.js index 52572d729e..52f84f575f 100644 --- a/src/topics.js +++ b/src/topics.js @@ -395,6 +395,12 @@ var async = require('async'), }); }; + Topics.isOwner = function(tid, uid, callback) { + Topics.getTopicField(tid, 'uid', function(err, author) { + callback(err, parseInt(author, 10) === parseInt(uid, 10)); + }); + }; + Topics.updateTimestamp = function(tid, timestamp) { db.sortedSetAdd('topics:recent', timestamp, tid); Topics.setTopicField(tid, 'lastposttime', timestamp);