summaryrefslogtreecommitdiff
path: root/src/remote/activitypub/act/create.ts
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-04-04 23:12:35 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-04-04 23:12:35 +0900
commite8b42d7e1668679e6a6ee0a7aea1e2ff7f37005b (patch)
tree6973284192eb419bd7bfed2361a594e668b81f9a /src/remote/activitypub/act/create.ts
parentMerge pull request #1393 from akihikodaki/duplicate (diff)
downloadmisskey-e8b42d7e1668679e6a6ee0a7aea1e2ff7f37005b.tar.gz
misskey-e8b42d7e1668679e6a6ee0a7aea1e2ff7f37005b.tar.bz2
misskey-e8b42d7e1668679e6a6ee0a7aea1e2ff7f37005b.zip
wip
Diffstat (limited to 'src/remote/activitypub/act/create.ts')
-rw-r--r--src/remote/activitypub/act/create.ts90
1 files changed, 86 insertions, 4 deletions
diff --git a/src/remote/activitypub/act/create.ts b/src/remote/activitypub/act/create.ts
index fa681982cf..c1a30ce7d0 100644
--- a/src/remote/activitypub/act/create.ts
+++ b/src/remote/activitypub/act/create.ts
@@ -1,10 +1,92 @@
-import create from '../create';
+import { JSDOM } from 'jsdom';
+const createDOMPurify = require('dompurify');
+
import Resolver from '../resolver';
+import DriveFile from '../../../models/drive-file';
+import Post from '../../../models/post';
+import uploadFromUrl from '../../../drive/upload-from-url';
+import createPost from '../../../post/create';
-export default (resolver: Resolver, actor, activity, distribute) => {
+export default async (resolver: Resolver, actor, activity): Promise<void> => {
if ('actor' in activity && actor.account.uri !== activity.actor) {
- throw new Error();
+ throw new Error('invalid actor');
}
- return create(resolver, actor, activity.object, distribute);
+ const uri = activity.id || activity;
+
+ try {
+ await Promise.all([
+ DriveFile.findOne({ 'metadata.uri': uri }).then(file => {
+ if (file !== null) {
+ throw new Error();
+ }
+ }, () => {}),
+ Post.findOne({ uri }).then(post => {
+ if (post !== null) {
+ throw new Error();
+ }
+ }, () => {})
+ ]);
+ } catch (object) {
+ throw new Error(`already registered: ${uri}`);
+ }
+
+ const object = await resolver.resolve(activity);
+
+ switch (object.type) {
+ case 'Image':
+ createImage(resolver, object);
+ break;
+
+ case 'Note':
+ createNote(resolver, object);
+ break;
+ }
+
+ ///
+
+ async function createImage(resolver: Resolver, image) {
+ if ('attributedTo' in image && actor.account.uri !== image.attributedTo) {
+ throw new Error('invalid image');
+ }
+
+ return await uploadFromUrl(image.url, actor);
+ }
+
+ async function createNote(resolver: Resolver, note) {
+ if (
+ ('attributedTo' in note && actor.account.uri !== note.attributedTo) ||
+ typeof note.id !== 'string'
+ ) {
+ throw new Error('invalid note');
+ }
+
+ const mediaIds = [];
+
+ if ('attachment' in note) {
+ note.attachment.forEach(async media => {
+ const created = await createImage(resolver, media);
+ mediaIds.push(created._id);
+ });
+ }
+
+ const { window } = new JSDOM(note.content);
+
+ await createPost(actor, {
+ channelId: undefined,
+ index: undefined,
+ createdAt: new Date(note.published),
+ mediaIds,
+ replyId: undefined,
+ repostId: undefined,
+ poll: undefined,
+ text: window.document.body.textContent,
+ textHtml: note.content && createDOMPurify(window).sanitize(note.content),
+ userId: actor._id,
+ appId: null,
+ viaMobile: false,
+ geo: undefined,
+ uri: note.id
+ }, null, null, []);
+ }
};