mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 02:55:58 +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