mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 19:15:58 +01:00 
			
		
		
		
	feat: additional logic to handle special case where a queried object id reports a context, but it is not actually contained in the resolved context's collection
This commit is contained in:
		| @@ -52,7 +52,11 @@ Contexts.get = async (uid, id) => { | |||||||
| 	return false; | 	return false; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| Contexts.getItems = async (uid, id, root = true) => { | Contexts.getItems = async (uid, id, options) => { | ||||||
|  | 	if (!options.hasOwnProperty('root')) { | ||||||
|  | 		options.root = true; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	winston.verbose(`[activitypub/context] Retrieving context ${id}`); | 	winston.verbose(`[activitypub/context] Retrieving context ${id}`); | ||||||
| 	let { type, items, orderedItems, first, next } = await activitypub.get('uid', uid, id); | 	let { type, items, orderedItems, first, next } = await activitypub.get('uid', uid, id); | ||||||
| 	if (!acceptableTypes.includes(type)) { | 	if (!acceptableTypes.includes(type)) { | ||||||
| @@ -71,19 +75,31 @@ Contexts.getItems = async (uid, id, root = true) => { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	const chain = new Set(items || []); | 	const chain = new Set(items || []); | ||||||
| 	if (!next && root && first) { | 	if (!next && options.root && first) { | ||||||
| 		next = first; | 		next = first; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (next) { | 	if (next) { | ||||||
| 		winston.verbose('[activitypub/context] Fetching next page...'); | 		winston.verbose('[activitypub/context] Fetching next page...'); | ||||||
| 		Array | 		Array | ||||||
| 			.from(await Contexts.getItems(uid, next, false)) | 			.from(await Contexts.getItems(uid, next, { | ||||||
|  | 				...options, | ||||||
|  | 				root: false, | ||||||
|  | 			})) | ||||||
| 			.forEach((item) => { | 			.forEach((item) => { | ||||||
| 				chain.add(item); | 				chain.add(item); | ||||||
| 			}); | 			}); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// Handle special case where originating object is not actually part of the context collection | ||||||
|  | 	const inputId = activitypub.helpers.isUri(options.input) ? options.input : options.input.id; | ||||||
|  | 	const inCollection = Array.from(chain).map(p => p.pid).includes(inputId); | ||||||
|  | 	if (!inCollection) { | ||||||
|  | 		chain.add(activitypub.helpers.isUri(options.input) ? | ||||||
|  | 			parseString(uid, options.input) : | ||||||
|  | 			parseItem(uid, options.input)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return chain; | 	return chain; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -48,7 +48,7 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => { | |||||||
| 		const { tid } = context; | 		const { tid } = context; | ||||||
| 		return { tid, count: 0 }; | 		return { tid, count: 0 }; | ||||||
| 	} else if (context.context) { | 	} else if (context.context) { | ||||||
| 		chain = Array.from(await activitypub.contexts.getItems(uid, context.context)); | 		chain = Array.from(await activitypub.contexts.getItems(uid, context.context, { input })); | ||||||
| 	} else { | 	} else { | ||||||
| 		// Fall back to inReplyTo traversal | 		// Fall back to inReplyTo traversal | ||||||
| 		chain = Array.from(await Notes.getParentChain(uid, input)); | 		chain = Array.from(await Notes.getParentChain(uid, input)); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user