wip
This commit is contained in:
		
							parent
							
								
									a6abcd1aa5
								
							
						
					
					
						commit
						5f8ab58446
					
				
					 4 changed files with 62 additions and 53 deletions
				
			
		| 
						 | 
					@ -5,10 +5,12 @@ import Resolver from '../resolver';
 | 
				
			||||||
import Post from '../../../models/post';
 | 
					import Post from '../../../models/post';
 | 
				
			||||||
import uploadFromUrl from '../../../api/drive/upload-from-url';
 | 
					import uploadFromUrl from '../../../api/drive/upload-from-url';
 | 
				
			||||||
import createPost from '../../../api/post/create';
 | 
					import createPost from '../../../api/post/create';
 | 
				
			||||||
 | 
					import { IRemoteUser, isRemoteUser } from '../../../models/user';
 | 
				
			||||||
 | 
					import resolvePerson from '../resolve-person';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const log = debug('misskey:activitypub');
 | 
					const log = debug('misskey:activitypub');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async (actor, activity): Promise<void> => {
 | 
					export default async (actor: IRemoteUser, activity): Promise<void> => {
 | 
				
			||||||
	if ('actor' in activity && actor.account.uri !== activity.actor) {
 | 
						if ('actor' in activity && actor.account.uri !== activity.actor) {
 | 
				
			||||||
		throw new Error('invalid actor');
 | 
							throw new Error('invalid actor');
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -32,71 +34,73 @@ export default async (actor, activity): Promise<void> => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (object.type) {
 | 
						switch (object.type) {
 | 
				
			||||||
	case 'Image':
 | 
						case 'Image':
 | 
				
			||||||
		createImage(object);
 | 
							createImage(resolver, actor, object);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case 'Note':
 | 
						case 'Note':
 | 
				
			||||||
		createNote(object);
 | 
							createNote(resolver, actor, object);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		console.warn(`Unknown type: ${object.type}`);
 | 
							console.warn(`Unknown type: ${object.type}`);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	///
 | 
					async function createImage(resolver: Resolver, actor: IRemoteUser, image) {
 | 
				
			||||||
 | 
						if ('attributedTo' in image && actor.account.uri !== image.attributedTo) {
 | 
				
			||||||
	async function createImage(image) {
 | 
							log(`invalid image: ${JSON.stringify(image, null, 2)}`);
 | 
				
			||||||
		if ('attributedTo' in image && actor.account.uri !== image.attributedTo) {
 | 
							throw new Error('invalid image');
 | 
				
			||||||
			log(`invalid image: ${JSON.stringify(image, null, 2)}`);
 | 
					 | 
				
			||||||
			throw new Error('invalid image');
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		log(`Creating the Image: ${uri}`);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return await uploadFromUrl(image.url, actor);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	async function createNote(note) {
 | 
						log(`Creating the Image: ${image.id}`);
 | 
				
			||||||
		if (
 | 
					 | 
				
			||||||
			('attributedTo' in note && actor.account.uri !== note.attributedTo) ||
 | 
					 | 
				
			||||||
			typeof note.id !== 'string'
 | 
					 | 
				
			||||||
		) {
 | 
					 | 
				
			||||||
			log(`invalid note: ${JSON.stringify(note, null, 2)}`);
 | 
					 | 
				
			||||||
			throw new Error('invalid note');
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		log(`Creating the Note: ${uri}`);
 | 
						return await uploadFromUrl(image.url, actor);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const media = [];
 | 
					async function createNote(resolver: Resolver, actor: IRemoteUser, note) {
 | 
				
			||||||
		if ('attachment' in note && note.attachment != null) {
 | 
						if (
 | 
				
			||||||
			note.attachment.forEach(async media => {
 | 
							('attributedTo' in note && actor.account.uri !== note.attributedTo) ||
 | 
				
			||||||
				const created = await createImage(media);
 | 
							typeof note.id !== 'string'
 | 
				
			||||||
				media.push(created);
 | 
						) {
 | 
				
			||||||
			});
 | 
							log(`invalid note: ${JSON.stringify(note, null, 2)}`);
 | 
				
			||||||
		}
 | 
							throw new Error('invalid note');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		let reply = null;
 | 
						log(`Creating the Note: ${note.id}`);
 | 
				
			||||||
		if ('inReplyTo' in note && note.inReplyTo != null) {
 | 
					 | 
				
			||||||
			const inReplyToPost = await Post.findOne({ uri: note.inReplyTo.id || note.inReplyTo });
 | 
					 | 
				
			||||||
			if (inReplyToPost) {
 | 
					 | 
				
			||||||
				reply = inReplyToPost;
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				reply = await createNote(await resolver.resolve(note));
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		const { window } = new JSDOM(note.content);
 | 
						const media = [];
 | 
				
			||||||
 | 
						if ('attachment' in note && note.attachment != null) {
 | 
				
			||||||
		return await createPost(actor, {
 | 
							note.attachment.forEach(async media => {
 | 
				
			||||||
			createdAt: new Date(note.published),
 | 
								const created = await createImage(resolver, note.actor, media);
 | 
				
			||||||
			media,
 | 
								media.push(created);
 | 
				
			||||||
			reply,
 | 
					 | 
				
			||||||
			repost: undefined,
 | 
					 | 
				
			||||||
			text: window.document.body.textContent,
 | 
					 | 
				
			||||||
			viaMobile: false,
 | 
					 | 
				
			||||||
			geo: undefined,
 | 
					 | 
				
			||||||
			uri: note.id
 | 
					 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
};
 | 
					
 | 
				
			||||||
 | 
						let reply = null;
 | 
				
			||||||
 | 
						if ('inReplyTo' in note && note.inReplyTo != null) {
 | 
				
			||||||
 | 
							const inReplyToPost = await Post.findOne({ uri: note.inReplyTo.id || note.inReplyTo });
 | 
				
			||||||
 | 
							if (inReplyToPost) {
 | 
				
			||||||
 | 
								reply = inReplyToPost;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								const inReplyTo = await resolver.resolve(note.inReplyTo) as any;
 | 
				
			||||||
 | 
								const actor = await resolvePerson(inReplyTo.attributedTo);
 | 
				
			||||||
 | 
								if (isRemoteUser(actor)) {
 | 
				
			||||||
 | 
									reply = await createNote(resolver, actor, inReplyTo);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const { window } = new JSDOM(note.content);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return await createPost(actor, {
 | 
				
			||||||
 | 
							createdAt: new Date(note.published),
 | 
				
			||||||
 | 
							media,
 | 
				
			||||||
 | 
							reply,
 | 
				
			||||||
 | 
							repost: undefined,
 | 
				
			||||||
 | 
							text: window.document.body.textContent,
 | 
				
			||||||
 | 
							viaMobile: false,
 | 
				
			||||||
 | 
							geo: undefined,
 | 
				
			||||||
 | 
							uri: note.id
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,8 +3,9 @@ import performDeleteActivity from './delete';
 | 
				
			||||||
import follow from './follow';
 | 
					import follow from './follow';
 | 
				
			||||||
import undo from './undo';
 | 
					import undo from './undo';
 | 
				
			||||||
import { IObject } from '../type';
 | 
					import { IObject } from '../type';
 | 
				
			||||||
 | 
					import { IUser } from '../../../models/user';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async (actor, activity: IObject): Promise<void> => {
 | 
					export default async (actor: IUser, activity: IObject): Promise<void> => {
 | 
				
			||||||
	switch (activity.type) {
 | 
						switch (activity.type) {
 | 
				
			||||||
	case 'Create':
 | 
						case 'Create':
 | 
				
			||||||
		await create(actor, activity);
 | 
							await create(actor, activity);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +11,7 @@ export default async (value, verifier?: string) => {
 | 
				
			||||||
	const object = await resolver.resolve(value) as any;
 | 
						const object = await resolver.resolve(value) as any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (
 | 
						if (
 | 
				
			||||||
		object === null ||
 | 
							object == null ||
 | 
				
			||||||
		object.type !== 'Person' ||
 | 
							object.type !== 'Person' ||
 | 
				
			||||||
		typeof object.preferredUsername !== 'string' ||
 | 
							typeof object.preferredUsername !== 'string' ||
 | 
				
			||||||
		!validateUsername(object.preferredUsername) ||
 | 
							!validateUsername(object.preferredUsername) ||
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,10 @@ export default class Resolver {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public async resolve(value): Promise<IObject> {
 | 
						public async resolve(value): Promise<IObject> {
 | 
				
			||||||
 | 
							if (value == null) {
 | 
				
			||||||
 | 
								throw new Error('resolvee is null (or undefined)');
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (typeof value !== 'string') {
 | 
							if (typeof value !== 'string') {
 | 
				
			||||||
			return value;
 | 
								return value;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue