You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nodebb/src/user/blocks.js

123 lines
3.7 KiB
JavaScript

'use strict';
var async = require('async');
var LRU = require('lru-cache');
var db = require('../database');
var pubsub = require('../pubsub');
module.exports = function (User) {
User.blocks = {
6 years ago
_cache: new LRU({
max: 100,
length: function () { return 1; },
maxAge: 0,
}),
};
User.blocks.is = async function (targetUid, uid) {
const blocks = await User.blocks.list(uid);
return blocks.includes(parseInt(targetUid, 10));
};
User.blocks.can = async function (callerUid, blockerUid, blockeeUid) {
// Guests can't block
if (blockerUid === 0 || blockeeUid === 0) {
throw new Error('[[error:cannot-block-guest]]');
} else if (blockerUid === blockeeUid) {
throw new Error('[[error:cannot-block-self]]');
}
7 years ago
// Administrators and global moderators cannot be blocked
// Only admins/mods can block users as another user
const [isCallerAdminOrMod, isBlockeeAdminOrMod] = await Promise.all([
User.isAdminOrGlobalMod(callerUid),
User.isAdminOrGlobalMod(blockeeUid),
]);
if (isBlockeeAdminOrMod) {
throw new Error('[[error:cannot-block-privileged]]');
}
if (parseInt(callerUid, 10) !== parseInt(blockerUid, 10) && !isCallerAdminOrMod) {
throw new Error();
}
7 years ago
};
User.blocks.list = async function (uid) {
7 years ago
if (User.blocks._cache.has(parseInt(uid, 10))) {
return User.blocks._cache.get(parseInt(uid, 10));
}
let blocked = await db.getSortedSetRange('uid:' + uid + ':blocked_uids', 0, -1);
blocked = blocked.map(uid => parseInt(uid, 10)).filter(Boolean);
User.blocks._cache.set(parseInt(uid, 10), blocked);
return blocked;
};
pubsub.on('user:blocks:cache:del', function (uid) {
User.blocks._cache.del(uid);
});
User.blocks.add = async function (targetUid, uid) {
await User.blocks.applyChecks('block', targetUid, uid);
await db.sortedSetAdd('uid:' + uid + ':blocked_uids', Date.now(), targetUid);
await User.incrementUserFieldBy(uid, 'blocksCount', 1);
User.blocks._cache.del(parseInt(uid, 10));
pubsub.publish('user:blocks:cache:del', parseInt(uid, 10));
};
User.blocks.remove = async function (targetUid, uid) {
await User.blocks.applyChecks('unblock', targetUid, uid);
await db.sortedSetRemove('uid:' + uid + ':blocked_uids', targetUid);
await User.decrementUserFieldBy(uid, 'blocksCount', 1);
User.blocks._cache.del(parseInt(uid, 10));
pubsub.publish('user:blocks:cache:del', parseInt(uid, 10));
};
User.blocks.applyChecks = async function (type, targetUid, uid) {
await User.blocks.can(uid, uid, targetUid);
const isBlock = type === 'block';
const is = await User.blocks.is(targetUid, uid);
if (is === isBlock) {
throw new Error('[[error:already-' + (isBlock ? 'blocked' : 'unblocked') + ']]');
}
};
User.blocks.filterUids = async function (targetUid, uids) {
return await async.filter(uids, async function (uid) {
const isBlocked = await User.blocks.is(targetUid, uid);
return !isBlocked;
});
7 years ago
};
User.blocks.filter = async function (uid, property, set) {
// Given whatever is passed in, iterates through it, and removes entries made by blocked uids
// property is optional
if (Array.isArray(property) && typeof set === 'undefined') {
set = property;
property = 'uid';
}
fix(style): updated code to follow new eslint recommendations Squashed commit of the following: commit f9ce878b269b3568f0d649309aae1af4dcfdfeef Author: Julian Lam <[email protected]> Date: Tue Aug 13 14:30:46 2019 -0400 fix(style): updated code to follow new eslint recommendations commit 80dd370e413f22badb96ff2138e7991dfff6d836 Author: Julian Lam <[email protected]> Date: Tue Aug 13 14:14:58 2019 -0400 fix(deps): update dependency sitemap to v4 Squashed commit of the following: commit f4dd9cabb21e26fdc21f8413be822ea7c64251f8 Author: Julian Lam <[email protected]> Date: Tue Aug 13 11:33:05 2019 -0400 fix: resolved breaking changes from sitemap v4 upgrade commit 9043415ee16dcc27a8dcc2e4479d1bc5e2d1b60e Merge: e3352b272 72590b346 Author: Julian Lam <[email protected]> Date: Tue Aug 13 11:09:55 2019 -0400 Merge branch 'master' into renovate/sitemap-4.x commit e3352b272eb9400bdb00774973181397803765e4 Author: Renovate Bot <[email protected]> Date: Mon Aug 12 07:59:05 2019 +0000 fix(deps): update dependency sitemap to v4 commit 8e3c0cdcae22acc32d352be8bb72d60e7502dbc5 Author: Renovate Bot <[email protected]> Date: Fri Aug 9 00:49:51 2019 +0000 fix(deps): update dependency commander to v3 commit 2104449d38818f2fa4d44b3a58a0a168781acbfb Author: Renovate Bot <[email protected]> Date: Tue Aug 13 15:00:27 2019 +0000 fix(deps): update dependency mongodb to v3.3.0 commit d2937f446a21131c070ae5d0ff33d67cfe465b8c Author: Barış Soner Uşaklı <[email protected]> Date: Tue Aug 13 10:36:48 2019 -0400 feat: async/await admin/controllers commit 1b97e8b199f960dc24e5722702f27499ae049914 Author: Misty (Bot) <[email protected]> Date: Tue Aug 13 09:28:39 2019 +0000 Latest translations and fallbacks commit 69a48957a2f0d23c4d194b664bda3a0431179c01 Author: Barış Soner Uşaklı <[email protected]> Date: Mon Aug 12 21:56:09 2019 -0400 feat: async/await commit b9b2a7e593a452de4bef6d0ab6abe368a3bdb8dd Author: Barış Soner Uşaklı <[email protected]> Date: Mon Aug 12 20:58:29 2019 -0400 feat: async/await refactor controllers/accounts commit a8d43a175974a0c8ae3dc132bf51a7ed9a4c6305 Author: Baris Usakli <[email protected]> Date: Mon Aug 12 14:49:40 2019 -0400 feat: async/await controllers/accounts commit 2f25aae57bf9dbe98d655276770e56bed9ec023b Author: Barış Soner Uşaklı <[email protected]> Date: Sun Aug 11 23:09:50 2019 -0400 fix: #7831, fix pagination convert to async/await commit c9e83f2374572264855a04156278eef256b0a20c Author: Barış Soner Uşaklı <[email protected]> Date: Sun Aug 11 00:14:35 2019 -0400 fix: remove empty line commit 30be91b26c4dd7583412c4e8d56e9c1688e48a44 Author: Barış Soner Uşaklı <[email protected]> Date: Sun Aug 11 00:13:41 2019 -0400 fix: remove useless catchs and empty line commit 2e4a71c0b6104738f15ffbfe3246105b922fdfb3 Author: Renovate Bot <[email protected]> Date: Sat Aug 10 06:51:50 2019 +0000 chore(deps): update dependency eslint-config-airbnb-base to v14
6 years ago
if (!Array.isArray(set) || !set.length || !set.every(item => {
7 years ago
if (!item) {
return false;
}
const check = item.hasOwnProperty(property) ? item[property] : item;
7 years ago
return ['number', 'string'].includes(typeof check);
})) {
return set;
}
const isPlain = typeof set[0] !== 'object';
const blocked_uids = await User.blocks.list(uid);
const blockedSet = new Set(blocked_uids);
set = set.filter(function (item) {
return !blockedSet.has(parseInt(isPlain ? item : item[property], 10));
});
return set;
};
};