'use strict'; var async = require('async'); var meta = require('../meta'); var posts = require('../posts'); var topics = require('../topics'); var user = require('../user'); var helpers = require('./helpers'); var plugins = require('../plugins'); module.exports = function(privileges) { privileges.posts = {}; privileges.posts.get = function(pids, uid, callback) { if (!Array.isArray(pids) || !pids.length) { return callback(null, []); } async.waterfall([ function(next) { posts.getCidsByPids(pids, next); }, function(cids, next) { async.parallel({ isAdmin: async.apply(user.isAdministrator, uid), isModerator: async.apply(posts.isModerator, pids, uid), isOwner: async.apply(posts.isOwner, pids, uid), 'topics:read': async.apply(helpers.isUserAllowedTo, 'topics:read', uid, cids), read: async.apply(helpers.isUserAllowedTo, 'read', uid, cids), 'posts:edit': async.apply(helpers.isUserAllowedTo, 'posts:edit', uid, cids), }, next); } ], function(err, results) { if (err) { return callback(err); } var privileges = []; for (var i=0; i postDeleteDuration * 1000)) { return callback(new Error('[[error:post-delete-duration-expired, ' + meta.config.postDeleteDuration + ']]')); } callback(null, results.isOwner); }); }; privileges.posts.canMove = function(pid, uid, callback) { posts.isMain(pid, function(err, isMain) { if (err || isMain) { return callback(err || new Error('[[error:cant-move-mainpost]]')); } isAdminOrMod(pid, uid, callback); }); }; privileges.posts.canPurge = function(pid, uid, callback) { async.waterfall([ function (next) { posts.getCidByPid(pid, next); }, function (cid, next) { async.parallel({ purge: async.apply(privileges.categories.isUserAllowedTo, 'purge', cid, uid), owner: async.apply(posts.isOwner, pid, uid), isAdminOrMod: async.apply(privileges.categories.isAdminOrMod, cid, uid) }, next); }, function (results, next) { next(null, results.isAdminOrMod || (results.purge && results.owner)); } ], callback); }; function isPostEditable(pid, uid, callback) { async.waterfall([ function(next) { posts.getPostFields(pid, ['tid', 'timestamp'], next); }, function(postData, next) { var postEditDuration = parseInt(meta.config.postEditDuration, 10); if (postEditDuration && Date.now() - parseInt(postData.timestamp, 10) > postEditDuration * 1000) { return callback(null, {isEditExpired: true}); } topics.isLocked(postData.tid, next); }, function(isLocked, next) { if (isLocked) { return callback(null, {isLocked: true}); } async.parallel({ owner: async.apply(posts.isOwner, pid, uid), edit: async.apply(privileges.posts.can, 'posts:edit', pid, uid) }, next); }, function(result, next) { next(null, {editable: result.owner && result.edit}); } ], callback); } function isAdminOrMod(pid, uid, callback) { helpers.some([ function(next) { posts.getCidByPid(pid, function(err, cid) { if (err || !cid) { return next(err, false); } user.isModerator(uid, cid, next); }); }, function(next) { user.isAdministrator(uid, next); } ], callback); } };