From ca683c6d52d405e89a83e263b9b53245a2705088 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 9 Oct 2024 15:09:06 -0400 Subject: [PATCH] refactor: followers url filtering logic, #12834 --- src/activitypub/notes.js | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/activitypub/notes.js b/src/activitypub/notes.js index 2b443c0e22..5841d68d0f 100644 --- a/src/activitypub/notes.js +++ b/src/activitypub/notes.js @@ -195,27 +195,26 @@ Notes.assertPrivate = async (object) => { // Given an object, adds it to an existing chat or creates a new chat otherwise // todo: context stuff - const recipients = new Set([...object.to, ...object.cc]); - - // Remove follower urls - const isFollowerUrl = await db.isObjectFields('followersUrl:uid', Array.from(recipients)); - Array.from(recipients).forEach((id, idx) => { - if (isFollowerUrl[idx]) { - recipients.delete(id); - } - }); - const localUids = []; - const recipientsResolved = new Set([...recipients]); + const recipients = new Set([...object.to, ...object.cc]); await Promise.all(Array.from(recipients).map(async (value) => { const { type, id } = await activitypub.helpers.resolveLocalId(value); if (type === 'user') { localUids.push(id); - recipientsResolved.delete(value); - recipientsResolved.add(parseInt(id, 10)); + recipients.delete(value); + recipients.add(parseInt(id, 10)); } })); + // Trim recipient list down to asserted actors (and local users) only + await activitypub.actors.assert([...recipients]); + const exists = await user.exists([...recipients]); + Array.from(recipients).forEach((uid, idx) => { + if (!exists[idx]) { + recipients.delete(uid); + } + }); + // Locate the roomId based on `inReplyTo` let roomId; const resolved = await activitypub.helpers.resolveLocalId(object.inReplyTo); @@ -229,9 +228,7 @@ Notes.assertPrivate = async (object) => { const participantUids = participants.map(user => user.uid); if (roomId) { const omitted = participants.filter((user) => { - // todo: this could use recipientsResolved - let { uid } = user; - uid = utils.isNumber(uid) ? `${nconf.get('url')}/uid/${uid}` : uid; + const { uid } = user; return !recipients.has(uid) && uid !== object.attributedTo; }); if (omitted.length) { @@ -248,11 +245,11 @@ Notes.assertPrivate = async (object) => { } if (!roomId) { - roomId = await messaging.newRoom(object.attributedTo, { uids: [...recipientsResolved] }); + roomId = await messaging.newRoom(object.attributedTo, { uids: [...recipients] }); } // Add any new members to the chat - const added = Array.from(recipientsResolved).filter(uid => !participantUids.includes(uid)); + const added = Array.from(recipients).filter(uid => !participantUids.includes(uid)); const assertion = await activitypub.actors.assert(added); if (assertion) { await messaging.addUsersToRoom(object.attributedTo, added, roomId);