mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
fix: #12510, blocking of a single remote user causes content from all remote users to be blocked
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
const db = require('../database');
|
const db = require('../database');
|
||||||
const plugins = require('../plugins');
|
const plugins = require('../plugins');
|
||||||
|
const utils = require('../utils');
|
||||||
const cacheCreate = require('../cache/lru');
|
const cacheCreate = require('../cache/lru');
|
||||||
|
|
||||||
module.exports = function (User) {
|
module.exports = function (User) {
|
||||||
@@ -17,7 +18,9 @@ module.exports = function (User) {
|
|||||||
const isArray = Array.isArray(uids);
|
const isArray = Array.isArray(uids);
|
||||||
uids = isArray ? uids : [uids];
|
uids = isArray ? uids : [uids];
|
||||||
const blocks = await User.blocks.list(uids);
|
const blocks = await User.blocks.list(uids);
|
||||||
const isBlocked = uids.map((uid, index) => blocks[index] && blocks[index].includes(parseInt(targetUid, 10)));
|
const isBlocked = uids.map((uid, index) => blocks[index] && blocks[index].includes(
|
||||||
|
utils.isNumber(targetUid) ? parseInt(targetUid, 10) : targetUid
|
||||||
|
));
|
||||||
return isArray ? isBlocked : isBlocked[0];
|
return isArray ? isBlocked : isBlocked[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -45,13 +48,13 @@ module.exports = function (User) {
|
|||||||
|
|
||||||
User.blocks.list = async function (uids) {
|
User.blocks.list = async function (uids) {
|
||||||
const isArray = Array.isArray(uids);
|
const isArray = Array.isArray(uids);
|
||||||
uids = (isArray ? uids : [uids]).map(uid => parseInt(uid, 10));
|
uids = (isArray ? uids : [uids]).map(uid => String(uid));
|
||||||
const cachedData = {};
|
const cachedData = {};
|
||||||
const unCachedUids = User.blocks._cache.getUnCachedKeys(uids, cachedData);
|
const unCachedUids = User.blocks._cache.getUnCachedKeys(uids, cachedData);
|
||||||
if (unCachedUids.length) {
|
if (unCachedUids.length) {
|
||||||
const unCachedData = await db.getSortedSetsMembers(unCachedUids.map(uid => `uid:${uid}:blocked_uids`));
|
const unCachedData = await db.getSortedSetsMembers(unCachedUids.map(uid => `uid:${uid}:blocked_uids`));
|
||||||
unCachedUids.forEach((uid, index) => {
|
unCachedUids.forEach((uid, index) => {
|
||||||
cachedData[uid] = (unCachedData[index] || []).map(uid => parseInt(uid, 10));
|
cachedData[uid] = (unCachedData[index] || []).map(uid => String(uid));
|
||||||
User.blocks._cache.set(uid, cachedData[uid]);
|
User.blocks._cache.set(uid, cachedData[uid]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -63,7 +66,7 @@ module.exports = function (User) {
|
|||||||
await User.blocks.applyChecks('block', targetUid, uid);
|
await User.blocks.applyChecks('block', targetUid, uid);
|
||||||
await db.sortedSetAdd(`uid:${uid}:blocked_uids`, Date.now(), targetUid);
|
await db.sortedSetAdd(`uid:${uid}:blocked_uids`, Date.now(), targetUid);
|
||||||
await User.incrementUserFieldBy(uid, 'blocksCount', 1);
|
await User.incrementUserFieldBy(uid, 'blocksCount', 1);
|
||||||
User.blocks._cache.del(parseInt(uid, 10));
|
User.blocks._cache.del(String(uid));
|
||||||
plugins.hooks.fire('action:user.blocks.add', { uid: uid, targetUid: targetUid });
|
plugins.hooks.fire('action:user.blocks.add', { uid: uid, targetUid: targetUid });
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -71,7 +74,7 @@ module.exports = function (User) {
|
|||||||
await User.blocks.applyChecks('unblock', targetUid, uid);
|
await User.blocks.applyChecks('unblock', targetUid, uid);
|
||||||
await db.sortedSetRemove(`uid:${uid}:blocked_uids`, targetUid);
|
await db.sortedSetRemove(`uid:${uid}:blocked_uids`, targetUid);
|
||||||
await User.decrementUserFieldBy(uid, 'blocksCount', 1);
|
await User.decrementUserFieldBy(uid, 'blocksCount', 1);
|
||||||
User.blocks._cache.del(parseInt(uid, 10));
|
User.blocks._cache.del(String(uid));
|
||||||
plugins.hooks.fire('action:user.blocks.remove', { uid: uid, targetUid: targetUid });
|
plugins.hooks.fire('action:user.blocks.remove', { uid: uid, targetUid: targetUid });
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -105,7 +108,11 @@ module.exports = function (User) {
|
|||||||
const blocked_uids = await User.blocks.list(uid);
|
const blocked_uids = await User.blocks.list(uid);
|
||||||
const blockedSet = new Set(blocked_uids);
|
const blockedSet = new Set(blocked_uids);
|
||||||
|
|
||||||
set = set.filter(item => !blockedSet.has(parseInt(isPlain ? item : (item && item[property]), 10)));
|
set = set.filter((item) => {
|
||||||
|
let uid = isPlain ? item : (item && item[property]);
|
||||||
|
uid = utils.isNumber(uid) ? parseInt(uid, 10) : uid;
|
||||||
|
return !blockedSet.has(uid);
|
||||||
|
});
|
||||||
const data = await plugins.hooks.fire('filter:user.blocks.filter', { set: set, property: property, uid: uid, blockedSet: blockedSet });
|
const data = await plugins.hooks.fire('filter:user.blocks.filter', { set: set, property: property, uid: uid, blockedSet: blockedSet });
|
||||||
|
|
||||||
return data.set;
|
return data.set;
|
||||||
|
|||||||
Reference in New Issue
Block a user