mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-12-22 00:10:25 +01:00
feat: utility functions to get local followers/counts given a remote actor uri, plumb cid into notes.assert via inbox.announce if a local cid is following the sending actor
This commit is contained in:
@@ -163,3 +163,34 @@ Actors.assert = async (ids, options = {}) => {
|
|||||||
|
|
||||||
return actors;
|
return actors;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Actors.getLocalFollowers = async (id) => {
|
||||||
|
const response = {
|
||||||
|
uids: new Set(),
|
||||||
|
cids: new Set(),
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!activitypub.helpers.isUri(id)) {
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
const members = await db.getSortedSetMembers(`followersRemote:${id}`);
|
||||||
|
|
||||||
|
members.forEach((id) => {
|
||||||
|
if (utils.isNumber(id)) {
|
||||||
|
response.uids.add(parseInt(id, 10));
|
||||||
|
} else if (id.startsWith('cid|') && utils.isNumber(id.slice(4))) {
|
||||||
|
response.cids.add(parseInt(id.slice(4), 10));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return response;
|
||||||
|
};
|
||||||
|
|
||||||
|
Actors.getLocalFollowersCount = async (id) => {
|
||||||
|
if (!activitypub.helpers.isUri(id)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return await db.sortedSetCard(`followersRemote:${id}`);
|
||||||
|
};
|
||||||
|
|||||||
@@ -122,8 +122,8 @@ inbox.announce = async (req) => {
|
|||||||
socketHelpers.sendNotificationToPostOwner(pid, actor, 'announce', 'notifications:activitypub.announce');
|
socketHelpers.sendNotificationToPostOwner(pid, actor, 'announce', 'notifications:activitypub.announce');
|
||||||
} else {
|
} else {
|
||||||
// Remote object
|
// Remote object
|
||||||
const isFollowed = await db.sortedSetCard(`followersRemote:${actor}`);
|
const numFollowers = await activitypub.actors.getLocalFollowersCount(actor);
|
||||||
if (!isFollowed) {
|
if (!numFollowers) {
|
||||||
winston.info(`[activitypub/inbox.announce] Rejecting ${object.id} via ${actor} due to no followers`);
|
winston.info(`[activitypub/inbox.announce] Rejecting ${object.id} via ${actor} due to no followers`);
|
||||||
reject('Announce', object, actor);
|
reject('Announce', object, actor);
|
||||||
return;
|
return;
|
||||||
@@ -135,7 +135,13 @@ inbox.announce = async (req) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
({ tid } = await activitypub.notes.assert(0, pid, { skipChecks: true })); // checks skipped; done above.
|
const { cids } = await activitypub.actors.getLocalFollowers(actor);
|
||||||
|
let cid = null;
|
||||||
|
if (cids.size > 0) {
|
||||||
|
cid = Array.from(cids)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
({ tid } = await activitypub.notes.assert(0, pid, { cid, skipChecks: true })); // checks skipped; done above.
|
||||||
if (!tid) {
|
if (!tid) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => {
|
|||||||
({ cid, mainPid } = await topics.getTopicFields(tid, ['tid', 'cid', 'mainPid']));
|
({ cid, mainPid } = await topics.getTopicFields(tid, ['tid', 'cid', 'mainPid']));
|
||||||
} else {
|
} else {
|
||||||
// mainPid ok to leave as-is
|
// mainPid ok to leave as-is
|
||||||
cid = -1;
|
cid = options.cid || -1;
|
||||||
title = name || utils.decodeHTMLEntities(utils.stripHTMLTags(content));
|
title = name || utils.decodeHTMLEntities(utils.stripHTMLTags(content));
|
||||||
if (title.length > meta.config.maximumTitleLength) {
|
if (title.length > meta.config.maximumTitleLength) {
|
||||||
title = `${title.slice(0, meta.config.maximumTitleLength - 3)}...`;
|
title = `${title.slice(0, meta.config.maximumTitleLength - 3)}...`;
|
||||||
@@ -179,7 +179,7 @@ async function assertRelation(post) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Is followed by at least one local user
|
// Is followed by at least one local user
|
||||||
const isFollowed = await db.sortedSetCard(`followersRemote:${post.uid}`);
|
const numFollowers = await activitypub.actors.getLocalFollowersCount(post.uid);
|
||||||
|
|
||||||
// Local user is mentioned
|
// Local user is mentioned
|
||||||
const { tag } = post._activitypub;
|
const { tag } = post._activitypub;
|
||||||
@@ -199,7 +199,7 @@ async function assertRelation(post) {
|
|||||||
uids = uids.filter(Boolean);
|
uids = uids.filter(Boolean);
|
||||||
}
|
}
|
||||||
|
|
||||||
return isFollowed || uids.length;
|
return numFollowers > 0 || uids.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
Notes.updateLocalRecipients = async (id, { to, cc }) => {
|
Notes.updateLocalRecipients = async (id, { to, cc }) => {
|
||||||
@@ -214,11 +214,12 @@ Notes.updateLocalRecipients = async (id, { to, cc }) => {
|
|||||||
|
|
||||||
const followedUid = await db.getObjectField('followersUrl:uid', recipient);
|
const followedUid = await db.getObjectField('followersUrl:uid', recipient);
|
||||||
if (followedUid) {
|
if (followedUid) {
|
||||||
const followers = await db.getSortedSetMembers(`followersRemote:${followedUid}`);
|
const { uids: followers } = await activitypub.actors.getLocalFollowers(followedUid);
|
||||||
if (followers.length) {
|
if (followers.size > 0) {
|
||||||
uids.add(...followers.map(uid => parseInt(uid, 10)));
|
followers.forEach((uid) => {
|
||||||
|
uids.add(uid);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
// return;
|
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user