From bbdc2aee9e50c44a694689f5f45063ba89f742fe Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Thu, 27 Jul 2023 19:22:07 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E9=80=9A=E5=A0=B1=E3=82=92Discord?= =?UTF-8?q?=E3=81=AEWebhook=E3=81=AB=E9=80=81=E4=BF=A1=E3=81=A7=E3=81=8D?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + packages/backend/src/config.ts | 4 ++ .../src/core/AbuseDiscordHookService.ts | 40 +++++++++++++++++++ packages/backend/src/core/CoreModule.ts | 3 ++ .../src/core/activitypub/ApInboxService.ts | 8 +++- .../api/endpoints/users/report-abuse.ts | 4 ++ 6 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/core/AbuseDiscordHookService.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 47f59b7864..bfd9bb22c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,7 @@ - Export notes with file detail - Add unix socket support - 設定ファイルでioredisの全てのオプションを指定可能に +- 通報をDiscordのWebhookに送信できるように - Fix: エクスポートしたカスタム絵文字のzipが大きいと読み込めない問題を修正 - Fix: リモートサーバーに無意味なActivityPubの配信を行うことがあるのを修正 - Fix: Remove Meilisearch index when notes are deleted diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index 253975096e..9252712c49 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -87,6 +87,10 @@ export type Source = { videoThumbnailGenerator?: string; signToActivityPubGet?: boolean; + + nirila?: { + abuseDiscordHook: string; + } }; /** diff --git a/packages/backend/src/core/AbuseDiscordHookService.ts b/packages/backend/src/core/AbuseDiscordHookService.ts new file mode 100644 index 0000000000..be69bf17a8 --- /dev/null +++ b/packages/backend/src/core/AbuseDiscordHookService.ts @@ -0,0 +1,40 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { DI } from '@/di-symbols.js'; +import type { User } from '@/models/entities/User.js'; +import { bindThis } from '@/decorators.js'; +import type { Config } from '@/config.js'; +import { HttpRequestService } from '@/core/HttpRequestService.js'; + +@Injectable() +export class AbuseDiscordHookService { + constructor( + @Inject(DI.config) + private config: Config, + + private httpRequestService: HttpRequestService, + ) { + } + + @bindThis + public send(me: User, user: User, comment: string): void { + const webhookUrl = this.config.nirila?.abuseDiscordHook; + if (webhookUrl) { + setImmediate(async () => { + const content = 'New abuse report created!\n' + + `author: \`@${me.username}${me.host ? `@${me.host}` : ''}\`\n` + + `target user: \`@${user.username}${user.host ? `@${user.host}` : ''}\`\n` + + 'Comment:\n' + + comment; + + await this.httpRequestService.send(webhookUrl, { + method: 'POST', + headers: { + 'User-Agent': 'Niri-la-Misskey-Hooks', + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ content }), + }); + }); + } + } +} diff --git a/packages/backend/src/core/CoreModule.ts b/packages/backend/src/core/CoreModule.ts index c7c98b3bdd..31c7123d7f 100644 --- a/packages/backend/src/core/CoreModule.ts +++ b/packages/backend/src/core/CoreModule.ts @@ -118,6 +118,7 @@ import { ApQuestionService } from './activitypub/models/ApQuestionService.js'; import { QueueModule } from './QueueModule.js'; import { QueueService } from './QueueService.js'; import { LoggerService } from './LoggerService.js'; +import { AbuseDiscordHookService } from './AbuseDiscordHookService.js'; import type { Provider } from '@nestjs/common'; //#region 文字列ベースでのinjection用(循環参照対応のため) @@ -366,6 +367,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting ApPersonService, ApQuestionService, QueueService, + AbuseDiscordHookService, //#region 文字列ベースでのinjection用(循環参照対応のため) $LoggerService, @@ -606,6 +608,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting ApPersonService, ApQuestionService, QueueService, + AbuseDiscordHookService, //#region 文字列ベースでのinjection用(循環参照対応のため) $LoggerService, diff --git a/packages/backend/src/core/activitypub/ApInboxService.ts b/packages/backend/src/core/activitypub/ApInboxService.ts index 8d5f4883e4..8b80753a55 100644 --- a/packages/backend/src/core/activitypub/ApInboxService.ts +++ b/packages/backend/src/core/activitypub/ApInboxService.ts @@ -24,6 +24,7 @@ import { QueueService } from '@/core/QueueService.js'; import type { UsersRepository, NotesRepository, FollowingsRepository, AbuseUserReportsRepository, FollowRequestsRepository } from '@/models/index.js'; import { bindThis } from '@/decorators.js'; import type { RemoteUser } from '@/models/entities/User.js'; +import { AbuseDiscordHookService } from '@/core/AbuseDiscordHookService.js'; import { getApHrefNullable, getApId, getApIds, getApType, isAccept, isActor, isAdd, isAnnounce, isBlock, isCollection, isCollectionOrOrderedCollection, isCreate, isDelete, isFlag, isFollow, isLike, isMove, isPost, isReject, isRemove, isTombstone, isUndo, isUpdate, validActor, validPost } from './type.js'; import { ApNoteService } from './models/ApNoteService.js'; import { ApLoggerService } from './ApLoggerService.js'; @@ -81,6 +82,7 @@ export class ApInboxService { private accountMoveService: AccountMoveService, private cacheService: CacheService, private queueService: QueueService, + private abuseDiscordHookService: AbuseDiscordHookService, ) { this.logger = this.apLoggerService.logger; } @@ -512,6 +514,8 @@ export class ApInboxService { }); if (users.length < 1) return 'skip'; + const comment = `${activity.content}\n${JSON.stringify(uris, null, 2)}`; + await this.abuseUserReportsRepository.insert({ id: this.idService.genId(), createdAt: new Date(), @@ -519,9 +523,11 @@ export class ApInboxService { targetUserHost: users[0].host, reporterId: actor.id, reporterHost: actor.host, - comment: `${activity.content}\n${JSON.stringify(uris, null, 2)}`, + comment, }); + this.abuseDiscordHookService.send(actor, users[0], comment); + return 'ok'; } diff --git a/packages/backend/src/server/api/endpoints/users/report-abuse.ts b/packages/backend/src/server/api/endpoints/users/report-abuse.ts index be361e02c4..b2cbe8e299 100644 --- a/packages/backend/src/server/api/endpoints/users/report-abuse.ts +++ b/packages/backend/src/server/api/endpoints/users/report-abuse.ts @@ -9,6 +9,7 @@ import { EmailService } from '@/core/EmailService.js'; import { DI } from '@/di-symbols.js'; import { GetterService } from '@/server/api/GetterService.js'; import { RoleService } from '@/core/RoleService.js'; +import { AbuseDiscordHookService } from '@/core/AbuseDiscordHookService.js'; import { ApiError } from '../../error.js'; export const meta = { @@ -64,6 +65,7 @@ export default class extends Endpoint { private getterService: GetterService, private roleService: RoleService, private globalEventService: GlobalEventService, + private abuseDiscordHookService: AbuseDiscordHookService, ) { super(meta, paramDef, async (ps, me) => { // Lookup user @@ -110,6 +112,8 @@ export default class extends Endpoint { sanitizeHtml(ps.comment)); } }); + + this.abuseDiscordHookService.send(me, user, ps.comment); }); } } From c35883f18111a023d24fa1821c28267615c80acb Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Thu, 27 Jul 2023 19:49:59 +0900 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20=E7=AE=A1=E7=90=86=E8=80=85?= =?UTF-8?q?=E5=B0=82=E7=94=A8=E3=81=AE=E4=BB=96=E4=BA=BA=E3=82=92=E8=A6=8B?= =?UTF-8?q?=E3=82=8Bwebhook=E3=81=8C=E5=A2=97=E3=81=88=E3=81=BE=E3=81=97?= =?UTF-8?q?=E3=81=9F=E3=81=AE=E5=A0=B4=E6=89=80=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fce11441d..02f4ad27ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ - ユーザーにロールが期限付きでアサインされている場合、その期限をユーザーのモデレーションページで確認できるようになりました - identicon生成を無効にしてパフォーマンスを向上させることができるようになりました - サーバーのマシン情報の公開を無効にしてパフォーマンスを向上させることができるようになりました +- 管理者専用の他人を見るwebhookが増えました ### Client - ドライブファイルのメニューで画像をクロップできるように @@ -42,7 +43,6 @@ - リストTLで、ユーザーが追加・削除されてもTLを初期化しないように - URL取得変数を関数に変更 CURRENT_URL -> Mk:url() - プレビューの表示状態を記憶するように -- 管理者専用の他人を見るwebhookが増えました - Fix: サーバーメトリクスが90度傾いている - Fix: 非ログイン時にクレデンシャルが必要なページに行くとエラーが出る問題を修正 - Fix: sparkle内にリンクを入れるとクリック不能になる問題の修正