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<N
 		(noteObj as any).isFirstNote = true;
 	}
 
-	publishNotesStream(noteObj);
+	if (!silent) {
+		publishNotesStream(noteObj);
+	}
 
 	const nm = new NotificationManager(user, note);
 	const nmRelatedPromises = [];