diff --git a/packages/backend/src/auth/auth.controller.ts b/packages/backend/src/auth/auth.controller.ts index 6574c87..690f8d2 100644 --- a/packages/backend/src/auth/auth.controller.ts +++ b/packages/backend/src/auth/auth.controller.ts @@ -206,6 +206,7 @@ export const verifyPasskeyAuthenticationHandler = async (req: Request, res: Resp reason: 'Verification failed', ip: clientIp }); + notificationService.sendNotification('PASSKEY_AUTH_FAILURE', { credentialId: authenticationResponseJSON?.id || 'unknown', reason: 'Verification failed', ip: clientIp }); res.status(401).json({ verified: false, message: 'Passkey 认证失败。' }); } } catch (error: any) { @@ -216,6 +217,7 @@ export const verifyPasskeyAuthenticationHandler = async (req: Request, res: Resp reason: error.message, ip: clientIp }); + notificationService.sendNotification('PASSKEY_AUTH_FAILURE', { credentialId: authenticationResponseJSON?.id || 'unknown', reason: error.message, ip: clientIp }); res.status(500).json({ verified: false, message: '验证 Passkey 认证失败。', error: error.message }); } }; diff --git a/packages/frontend/src/components/NotificationSettingForm.vue b/packages/frontend/src/components/NotificationSettingForm.vue index 2503bcf..9f75558 100644 --- a/packages/frontend/src/components/NotificationSettingForm.vue +++ b/packages/frontend/src/components/NotificationSettingForm.vue @@ -268,16 +268,19 @@ const canTestUnsaved = computed(() => { // Define all possible events (aligned with AuditLogView's allActionTypes) const allNotificationEvents: NotificationEvent[] = [ - 'LOGIN_SUCCESS', 'LOGIN_FAILURE', 'LOGOUT', 'PASSWORD_CHANGED', // Added LOGOUT, PASSWORD_CHANGED - '2FA_ENABLED', '2FA_DISABLED', // Added 2FA, + 'LOGIN_SUCCESS', 'LOGIN_FAILURE', 'LOGOUT', 'PASSWORD_CHANGED', + '2FA_ENABLED', '2FA_DISABLED', + // Passkey Events + 'PASSKEY_AUTH_SUCCESS', + 'PASSKEY_AUTH_FAILURE', 'CONNECTION_CREATED', 'CONNECTION_UPDATED', 'CONNECTION_DELETED', - 'PROXY_CREATED', 'PROXY_UPDATED', 'PROXY_DELETED', // Changed _ADDED - 'TAG_CREATED', 'TAG_UPDATED', 'TAG_DELETED', // Changed _ADDED - 'SETTINGS_UPDATED', 'IP_WHITELIST_UPDATED', // Added IP_WHITELIST_UPDATED - 'NOTIFICATION_SETTING_CREATED', 'NOTIFICATION_SETTING_UPDATED', 'NOTIFICATION_SETTING_DELETED', // Added NOTIFICATION types - 'SSH_CONNECT_SUCCESS', 'SSH_CONNECT_FAILURE', 'SSH_SHELL_FAILURE', // Added SSH types - 'DATABASE_MIGRATION', 'ADMIN_SETUP_COMPLETE' - // Removed IP_BLACKLISTED as it's not in the Audit Log list source + 'PROXY_CREATED', 'PROXY_UPDATED', 'PROXY_DELETED', + 'TAG_CREATED', 'TAG_UPDATED', 'TAG_DELETED', + 'SETTINGS_UPDATED', 'IP_WHITELIST_UPDATED', 'IP_BLOCKED', // Added IP_BLOCKED as it's in backend types + 'NOTIFICATION_SETTING_CREATED', 'NOTIFICATION_SETTING_UPDATED', 'NOTIFICATION_SETTING_DELETED', + 'SSH_CONNECT_SUCCESS', 'SSH_CONNECT_FAILURE', 'SSH_SHELL_FAILURE', + 'DATABASE_MIGRATION', 'ADMIN_SETUP_COMPLETE' + // Removed IP_BLACKLISTED as it's not in the Audit Log list source, but IP_BLOCKED is present in backend types ]; // Reactive form data structure diff --git a/packages/frontend/src/locales/en-US.json b/packages/frontend/src/locales/en-US.json index 10f540d..624c8ae 100644 --- a/packages/frontend/src/locales/en-US.json +++ b/packages/frontend/src/locales/en-US.json @@ -611,6 +611,10 @@ "PASSWORD_CHANGED": "Password Changed", "2FA_ENABLED": "2FA Enabled", "2FA_DISABLED": "2FA Disabled", + "PASSKEY_REGISTERED": "Passkey Registered", + "PASSKEY_AUTH_SUCCESS": "Passkey Authentication Successful", + "PASSKEY_AUTH_FAILURE": "Passkey Authentication Failed", + "PASSKEY_DELETED": "Passkey Deleted", "CONNECTION_CREATED": "Connection Created", "CONNECTION_UPDATED": "Connection Updated", "CONNECTION_DELETED": "Connection Deleted", @@ -622,6 +626,7 @@ "TAG_DELETED": "Tag Deleted", "SETTINGS_UPDATED": "Settings Updated", "IP_WHITELIST_UPDATED": "IP Whitelist Updated", + "IP_BLOCKED": "IP Blocked", "NOTIFICATION_SETTING_CREATED": "Notification Setting Created", "NOTIFICATION_SETTING_UPDATED": "Notification Setting Updated", "NOTIFICATION_SETTING_DELETED": "Notification Setting Deleted", diff --git a/packages/frontend/src/locales/ja-JP.json b/packages/frontend/src/locales/ja-JP.json index 0673a4c..2892dc3 100644 --- a/packages/frontend/src/locales/ja-JP.json +++ b/packages/frontend/src/locales/ja-JP.json @@ -758,6 +758,10 @@ "events": { "2FA_DISABLED": "2段階認証無効", "2FA_ENABLED": "2段階認証有効", + "PASSKEY_REGISTERED": "パスキー登録済み", + "PASSKEY_AUTH_SUCCESS": "パスキー認証成功", + "PASSKEY_AUTH_FAILURE": "パスキー認証失敗", + "PASSKEY_DELETED": "パスキー削除済み", "ADMIN_SETUP_COMPLETE": "初期管理者設定完了", "CONNECTIONS_EXPORTED": "接続がエクスポートされました", "CONNECTION_CREATED": "接続作成", @@ -765,6 +769,7 @@ "CONNECTION_UPDATED": "接続更新", "DATABASE_MIGRATION": "データベース移行", "IP_WHITELIST_UPDATED": "IP ホワイトリスト更新", + "IP_BLOCKED": "IPブロック済み", "LOGIN_FAILURE": "ログイン失敗", "LOGIN_SUCCESS": "ログイン成功", "LOGOUT": "ログアウト", diff --git a/packages/frontend/src/locales/zh-CN.json b/packages/frontend/src/locales/zh-CN.json index 7eb826a..80d5e4a 100644 --- a/packages/frontend/src/locales/zh-CN.json +++ b/packages/frontend/src/locales/zh-CN.json @@ -609,6 +609,10 @@ "PASSWORD_CHANGED": "密码已修改", "2FA_ENABLED": "两步验证已启用", "2FA_DISABLED": "两步验证已禁用", + "PASSKEY_REGISTERED": "Passkey 已注册", + "PASSKEY_AUTH_SUCCESS": "Passkey 认证成功", + "PASSKEY_AUTH_FAILURE": "Passkey 认证失败", + "PASSKEY_DELETED": "Passkey 已删除", "CONNECTION_CREATED": "连接已创建", "CONNECTION_UPDATED": "连接已更新", "CONNECTION_DELETED": "连接已删除", @@ -621,6 +625,7 @@ "TAG_DELETED": "标签已删除", "SETTINGS_UPDATED": "设置已更新", "IP_WHITELIST_UPDATED": "IP 白名单已更新", + "IP_BLOCKED": "IP 已封禁", "NOTIFICATION_SETTING_CREATED": "通知设置已创建", "NOTIFICATION_SETTING_UPDATED": "通知设置已更新", "NOTIFICATION_SETTING_DELETED": "通知设置已删除", diff --git a/packages/frontend/src/types/server.types.ts b/packages/frontend/src/types/server.types.ts index d664712..b153207 100644 --- a/packages/frontend/src/types/server.types.ts +++ b/packages/frontend/src/types/server.types.ts @@ -22,17 +22,18 @@ export type NotificationChannelType = 'webhook' | 'email' | 'telegram'; export type NotificationEvent = | 'LOGIN_SUCCESS' | 'LOGIN_FAILURE' | 'LOGOUT' | 'PASSWORD_CHANGED' | '2FA_ENABLED' | '2FA_DISABLED' + // Passkey Events + | 'PASSKEY_REGISTERED' + | 'PASSKEY_AUTH_SUCCESS' + | 'PASSKEY_AUTH_FAILURE' + | 'PASSKEY_DELETED' | 'CONNECTION_CREATED' | 'CONNECTION_UPDATED' | 'CONNECTION_DELETED' | 'PROXY_CREATED' | 'PROXY_UPDATED' | 'PROXY_DELETED' | 'TAG_CREATED' | 'TAG_UPDATED' | 'TAG_DELETED' - | 'SETTINGS_UPDATED' | 'IP_WHITELIST_UPDATED' + | 'SETTINGS_UPDATED' | 'IP_WHITELIST_UPDATED' | 'IP_BLOCKED' | 'NOTIFICATION_SETTING_CREATED' | 'NOTIFICATION_SETTING_UPDATED' | 'NOTIFICATION_SETTING_DELETED' - // SSH Actions | 'SSH_CONNECT_SUCCESS' | 'SSH_CONNECT_FAILURE' | 'SSH_SHELL_FAILURE' - // System/Error | 'DATABASE_MIGRATION' | 'ADMIN_SETUP_COMPLETE'; - // Settings (Specific) - Keep aligned with AuditLogActionType - // Note: IP_BLACKLISTED was in NotificationEvent but not AuditLogActionType, removed for consistency based on user request export interface WebhookConfig { url: string;