From ee5720df2c93a852d5429cb3919cdecc8b8051f8 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Thu, 25 Apr 2019 04:07:39 +0900 Subject: [PATCH] Fix #4704 (#4797) * Fix #4632 * Fix #4795 --- src/remote/activitypub/models/note.ts | 2 +- src/server/api/endpoints/ap/show.ts | 28 ++++++++++++++++++++++++++- src/services/note/create.ts | 4 +++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts index 850b5e65e6..d7ca625521 100644 --- a/src/remote/activitypub/models/note.ts +++ b/src/remote/activitypub/models/note.ts @@ -247,7 +247,7 @@ export async function resolveNote(value: string | IObject, resolver?: Resolver): // リモートサーバーからフェッチしてきて登録 // ここでuriの代わりに添付されてきたNote Objectが指定されていると、サーバーフェッチを経ずにノートが生成されるが // 添付されてきたNote Objectは偽装されている可能性があるため、常にuriを指定してサーバーフェッチを行う。 - return await createNote(uri, resolver).catch(e => { + return await createNote(uri, resolver, true).catch(e => { if (e.name === 'duplicated') { return fetchNote(uri).then(note => { if (note == null) { diff --git a/src/server/api/endpoints/ap/show.ts b/src/server/api/endpoints/ap/show.ts index 1bb15117dd..9724a044b1 100644 --- a/src/server/api/endpoints/ap/show.ts +++ b/src/server/api/endpoints/ap/show.ts @@ -101,6 +101,32 @@ async function fetchAny(uri: string) { // /@user のような正規id以外で取得できるURIが指定されていた場合、ここで初めて正規URIが確定する // これはDBに存在する可能性があるため再度DB検索 if (uri !== object.id) { + if (object.id.startsWith(config.url + '/')) { + const parts = object.id.split('/'); + const id = parts.pop(); + const type = parts.pop(); + + if (type === 'notes') { + const note = await Notes.findOne(id); + + if (note) { + return { + type: 'Note', + object: await Notes.pack(note, null, { detail: true }) + }; + } + } else if (type === 'users') { + const user = await Users.findOne(id); + + if (user) { + return { + type: 'User', + object: await Users.pack(user, null, { detail: true }) + }; + } + } + } + const [user, note] = await Promise.all([ Users.findOne({ uri: object.id }), Notes.findOne({ uri: object.id }) @@ -120,7 +146,7 @@ async function fetchAny(uri: string) { } if (['Note', 'Question', 'Article'].includes(object.type)) { - const note = await createNote(object.id); + const note = await createNote(object.id, undefined, true); return { type: 'Note', object: await Notes.pack(note!, null, { detail: true }) diff --git a/src/services/note/create.ts b/src/services/note/create.ts index ce229d6393..2195ecc55f 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -240,7 +240,9 @@ export default async (user: User, data: Option, silent = false) => new Promise