Skip to content
Snippets Groups Projects
Commit 5f8ab584 authored by syuilo's avatar syuilo
Browse files

wip

parent a6abcd1a
No related branches found
No related tags found
No related merge requests found
......@@ -5,10 +5,12 @@ import Resolver from '../resolver';
import Post from '../../../models/post';
import uploadFromUrl from '../../../api/drive/upload-from-url';
import createPost from '../../../api/post/create';
import { IRemoteUser, isRemoteUser } from '../../../models/user';
import resolvePerson from '../resolve-person';
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) {
throw new Error('invalid actor');
}
......@@ -32,71 +34,73 @@ export default async (actor, activity): Promise<void> => {
switch (object.type) {
case 'Image':
createImage(object);
createImage(resolver, actor, object);
break;
case 'Note':
createNote(object);
createNote(resolver, actor, object);
break;
default:
console.warn(`Unknown type: ${object.type}`);
break;
}
};
///
async function createImage(resolver: Resolver, actor: IRemoteUser, image) {
if ('attributedTo' in image && actor.account.uri !== image.attributedTo) {
log(`invalid image: ${JSON.stringify(image, null, 2)}`);
throw new Error('invalid image');
}
async function createImage(image) {
if ('attributedTo' in image && actor.account.uri !== image.attributedTo) {
log(`invalid image: ${JSON.stringify(image, null, 2)}`);
throw new Error('invalid image');
}
log(`Creating the Image: ${image.id}`);
log(`Creating the Image: ${uri}`);
return await uploadFromUrl(image.url, actor);
}
return await uploadFromUrl(image.url, actor);
async function createNote(resolver: Resolver, actor: IRemoteUser, note) {
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');
}
async function createNote(note) {
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}`);
log(`Creating the Note: ${note.id}`);
const media = [];
if ('attachment' in note && note.attachment != null) {
note.attachment.forEach(async media => {
const created = await createImage(media);
media.push(created);
});
}
const media = [];
if ('attachment' in note && note.attachment != null) {
note.attachment.forEach(async media => {
const created = await createImage(resolver, note.actor, media);
media.push(created);
});
}
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 {
reply = await createNote(await resolver.resolve(note));
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
});
}
};
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 undo from './undo';
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) {
case 'Create':
await create(actor, activity);
......
......@@ -11,7 +11,7 @@ export default async (value, verifier?: string) => {
const object = await resolver.resolve(value) as any;
if (
object === null ||
object == null ||
object.type !== 'Person' ||
typeof object.preferredUsername !== 'string' ||
!validateUsername(object.preferredUsername) ||
......
......@@ -33,6 +33,10 @@ export default class Resolver {
}
public async resolve(value): Promise<IObject> {
if (value == null) {
throw new Error('resolvee is null (or undefined)');
}
if (typeof value !== 'string') {
return value;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment