From 91648d1bd4e788da3b580c486e84afe0662a675f Mon Sep 17 00:00:00 2001
From: fuyu <54523771+mfmfuyu@users.noreply.github.com>
Date: Sun, 12 Jul 2020 00:44:31 +0900
Subject: [PATCH] =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=AD=E3=83=AF=E3=83=BC?=
 =?UTF-8?q?=E3=81=A7=E3=81=AF=E3=81=AA=E3=81=84=E3=83=AA=E3=83=A2=E3=83=BC?=
 =?UTF-8?q?=E3=83=88=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E3=81=AB=E5=89=8A?=
 =?UTF-8?q?=E9=99=A4=E9=80=9A=E7=9F=A5=E3=81=8C=E9=85=8D=E4=BF=A1=E3=81=95?=
 =?UTF-8?q?=E3=82=8C=E3=81=AA=E3=81=84=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE?=
 =?UTF-8?q?=E6=AD=A3=20(#6475)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* フォロワーではないリモートユーザーに削除通知が配信されない問題を修正

* 同じ処理を一つにまとめた

* Inのエラー修正, Renote/Quote対応

Co-authored-by: mei23 <m@m544.net>
---
 src/services/note/delete.ts | 48 ++++++++++++++++++++++++++++++-------
 1 file changed, 40 insertions(+), 8 deletions(-)

diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts
index 1972801ab7..5526302602 100644
--- a/src/services/note/delete.ts
+++ b/src/services/note/delete.ts
@@ -6,14 +6,14 @@ import { renderActivity } from '../../remote/activitypub/renderer';
 import renderTombstone from '../../remote/activitypub/renderer/tombstone';
 import config from '../../config';
 import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
-import { User } from '../../models/entities/user';
-import { Note } from '../../models/entities/note';
+import { User, ILocalUser, IRemoteUser } from '../../models/entities/user';
+import { Note, IMentionedRemoteUsers } from '../../models/entities/note';
 import { Notes, Users, Instances } from '../../models';
 import { notesChart, perUserNotesChart, instanceChart } from '../chart';
-import { deliverToFollowers } from '../../remote/activitypub/deliver-manager';
+import { deliverToFollowers, deliverToUser } from '../../remote/activitypub/deliver-manager';
 import { countSameRenotes } from '../../misc/count-same-renotes';
 import { deliverToRelays } from '../relay';
-import { Brackets } from 'typeorm';
+import { Brackets, In } from 'typeorm';
 
 /**
  * 投稿を削除します。
@@ -49,8 +49,7 @@ export default async function(user: User, note: Note, quiet = false) {
 				? renderUndo(renderAnnounce(renote.uri || `${config.url}/notes/${renote.id}`, note), user)
 				: renderDelete(renderTombstone(`${config.url}/notes/${note.id}`), user));
 
-			deliverToFollowers(user, content);
-			deliverToRelays(user, content);
+			deliverToConcerned(user, note, content);
 		}
 
 		// also deliever delete activity to cascaded notes
@@ -59,8 +58,7 @@ export default async function(user: User, note: Note, quiet = false) {
 			if (!cascadingNote.user) continue;
 			if (!Users.isLocalUser(cascadingNote.user)) continue;
 			const content = renderActivity(renderDelete(renderTombstone(`${config.url}/notes/${cascadingNote.id}`), cascadingNote.user));
-			deliverToFollowers(cascadingNote.user, content);
-			deliverToRelays(cascadingNote.user, content);
+			deliverToConcerned(cascadingNote.user, cascadingNote, content);
 		}
 		//#endregion
 
@@ -103,3 +101,37 @@ async function findCascadingNotes(note: Note) {
 
 	return cascadingNotes.filter(note => note.userHost === null); // filter out non-local users
 }
+
+async function getMentionedRemoteUsers(note: Note) {
+	const where = [] as any[];
+
+	// mention / reply / dm
+	const uris = (JSON.parse(note.mentionedRemoteUsers) as IMentionedRemoteUsers).map(x => x.uri);
+	if (uris.length > 0) {
+		where.push(
+			{ uri: In(uris) }
+		);
+	}
+
+	// renote / quote
+	if (note.renoteUserId) {
+		where.push({
+			id: note.renoteUserId
+		});
+	}
+
+	if (where.length === 0) return [];
+
+	return await Users.find({
+		where
+	}) as IRemoteUser[];
+}
+
+async function deliverToConcerned(user: ILocalUser, note: Note, content: any) {
+	deliverToFollowers(user, content);
+	deliverToRelays(user, content);
+	const remoteUsers = await getMentionedRemoteUsers(note);
+	for (const remoteUser of remoteUsers) {
+		deliverToUser(user, content, remoteUser);
+	}
+}
-- 
GitLab