From 83db116c46e64ad6a9a479cbd00e96030821c1e9 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Thu, 3 Oct 2024 15:06:04 +0900 Subject: [PATCH] enhance(backend): notify new login (#14673) * wip * Update CHANGELOG.md * wip * fix * Update index.d.ts * Update SigninService.ts * Update MkNotification.vue --- CHANGELOG.md | 2 +- locales/index.d.ts | 8 +++++++ locales/ja-JP.yml | 2 ++ .../backend/assets/tabler-badges/login-2.png | Bin 0 -> 3770 bytes packages/backend/src/models/Notification.ts | 6 +++++- .../src/models/json-schema/notification.ts | 10 +++++++++ .../backend/src/server/api/SigninService.ts | 20 +++++++++++++++--- packages/backend/src/types.ts | 2 ++ packages/frontend-shared/js/const.ts | 1 + .../src/components/MkNotification.vue | 13 ++++++++++-- packages/misskey-js/src/autogen/types.ts | 17 ++++++++++----- .../sw/src/scripts/create-notification.ts | 6 ++++++ packages/sw/src/types.ts | 3 ++- 13 files changed, 77 insertions(+), 13 deletions(-) create mode 100644 packages/backend/assets/tabler-badges/login-2.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f0fd24c44..72c3b22d69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ - Enhance: フォロワーへのメッセージ欄のデザイン改良 ### Server -- +- Enhance: セキュリティ向上のため、ログイン時にメール通知を行うように ## 2024.9.0 diff --git a/locales/index.d.ts b/locales/index.d.ts index 29c93453ff..0a9123f03d 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -9285,6 +9285,10 @@ export interface Locale extends ILocale { * {x}のエクスポートが完了しました */ "exportOfXCompleted": ParameterizedString<"x">; + /** + * ログインがありました + */ + "login": string; "_types": { /** * すべて @@ -9342,6 +9346,10 @@ export interface Locale extends ILocale { * エクスポートが完了した */ "exportCompleted": string; + /** + * ログイン + */ + "login": string; /** * 通知のテスト */ diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 678af6987c..cfbe0dcc75 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -2451,6 +2451,7 @@ _notification: followedBySomeUsers: "{n}人にフォローされました" flushNotification: "通知の履歴をリセットする" exportOfXCompleted: "{x}のエクスポートが完了しました" + login: "ログインがありました" _types: all: "すべて" @@ -2467,6 +2468,7 @@ _notification: roleAssigned: "ロールが付与された" achievementEarned: "実績の獲得" exportCompleted: "エクスポートが完了した" + login: "ログイン" test: "通知のテスト" app: "連携アプリからの通知" diff --git a/packages/backend/assets/tabler-badges/login-2.png b/packages/backend/assets/tabler-badges/login-2.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ca8de3ddd0125ef523a249dd0ebd8d086c7566 GIT binary patch literal 3770 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 { - // Append signin history + this.notificationService.createNotification(user.id, 'login', {}); + const record = await this.signinsRepository.insertOne({ id: this.idService.gen(), userId: user.id, @@ -37,8 +45,14 @@ export class SigninService { success: true, }); - // Publish signin event this.globalEventService.publishMainStream(user.id, 'signin', await this.signinEntityService.pack(record)); + + const profile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id }); + if (profile.email && profile.emailVerified) { + this.emailService.sendEmail(profile.email, 'New login / ログインがありました', + 'There is a new login. If you do not recognize this login, update the security status of your account, including changing your password. / 新しいログインがありました。このログインに心当たりがない場合は、パスワードを変更するなど、アカウントのセキュリティ状態を更新してください。', + 'There is a new login. If you do not recognize this login, update the security status of your account, including changing your password. / 新しいログインがありました。このログインに心当たりがない場合は、パスワードを変更するなど、アカウントのセキュリティ状態を更新してください。'); + } }); reply.code(200); diff --git a/packages/backend/src/types.ts b/packages/backend/src/types.ts index 5854c6b392..0389143daf 100644 --- a/packages/backend/src/types.ts +++ b/packages/backend/src/types.ts @@ -17,6 +17,7 @@ * roleAssigned - ロールが付与された * achievementEarned - 実績を獲得 * exportCompleted - エクスポートが完了 + * login - ログイン * app - アプリ通知 * test - テスト通知(サーバー側) */ @@ -34,6 +35,7 @@ export const notificationTypes = [ 'roleAssigned', 'achievementEarned', 'exportCompleted', + 'login', 'app', 'test', ] as const; diff --git a/packages/frontend-shared/js/const.ts b/packages/frontend-shared/js/const.ts index aec4a4a58b..4fe5cbb205 100644 --- a/packages/frontend-shared/js/const.ts +++ b/packages/frontend-shared/js/const.ts @@ -68,6 +68,7 @@ export const notificationTypes = [ 'roleAssigned', 'achievementEarned', 'exportCompleted', + 'login', 'test', 'app', ] as const; diff --git a/packages/frontend/src/components/MkNotification.vue b/packages/frontend/src/components/MkNotification.vue index 12c2974de4..b27d883b85 100644 --- a/packages/frontend/src/components/MkNotification.vue +++ b/packages/frontend/src/components/MkNotification.vue @@ -7,13 +7,12 @@ SPDX-License-Identifier: AGPL-3.0-only
- +
-
@@ -40,6 +40,7 @@ SPDX-License-Identifier: AGPL-3.0-only +