feat: 安全增强 + 删除密码重置申请功能 + 登录提醒开关

安全增强:
- 新增 SSRF、XXE、模板注入、敏感路径探测检测规则
- security/constants.py: 添加新的威胁类型和检测模式
- security/threat_detector.py: 实现新检测逻辑

删除密码重置申请功能:
- 移除 /api/password_resets 相关API
- 删除 password_reset_requests 数据库表
- 前端移除密码重置申请页面和菜单
- 用户只能通过邮��找回密码,未绑定邮箱需联系管理员

登录提醒全局开关:
- email_service.py: 添加 login_alert_enabled 字段
- routes/api_auth.py: 检查开关状态再发送登录提醒
- EmailPage.vue: 添加新设备登录提醒开关

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-27 12:08:36 +08:00
parent 4ba933b001
commit 89f3fd9759
65 changed files with 555 additions and 784 deletions

View File

@@ -1,34 +1,34 @@
{
"_email-DoKk83fr.js": {
"file": "assets/email-DoKk83fr.js",
"_email-BghJNgj1.js": {
"file": "assets/email-BghJNgj1.js",
"name": "email",
"imports": [
"index.html"
]
},
"_tasks-Bgkd54ac.js": {
"file": "assets/tasks-Bgkd54ac.js",
"_tasks-Cx_Yf55V.js": {
"file": "assets/tasks-Cx_Yf55V.js",
"name": "tasks",
"imports": [
"index.html"
]
},
"_update-BVJ0Pp6O.js": {
"file": "assets/update-BVJ0Pp6O.js",
"_update-D34iQbO6.js": {
"file": "assets/update-D34iQbO6.js",
"name": "update",
"imports": [
"index.html"
]
},
"_users-Bw5HW1mw.js": {
"file": "assets/users-Bw5HW1mw.js",
"_users-DCcrmSwH.js": {
"file": "assets/users-DCcrmSwH.js",
"name": "users",
"imports": [
"index.html"
]
},
"index.html": {
"file": "assets/index-CDhtYQo-.js",
"file": "assets/index-C9w-iZIr.js",
"name": "index",
"src": "index.html",
"isEntry": true,
@@ -44,11 +44,11 @@
"src/pages/SettingsPage.vue"
],
"css": [
"assets/index-DiIt7W4Z.css"
"assets/index-_5Ec1Hmd.css"
]
},
"src/pages/AnnouncementsPage.vue": {
"file": "assets/AnnouncementsPage-BSLa6sED.js",
"file": "assets/AnnouncementsPage-DEX_yASt.js",
"name": "AnnouncementsPage",
"src": "src/pages/AnnouncementsPage.vue",
"isDynamicEntry": true,
@@ -60,20 +60,20 @@
]
},
"src/pages/EmailPage.vue": {
"file": "assets/EmailPage-BHdschU6.js",
"file": "assets/EmailPage-Cev_X_Ce.js",
"name": "EmailPage",
"src": "src/pages/EmailPage.vue",
"isDynamicEntry": true,
"imports": [
"_email-DoKk83fr.js",
"_email-BghJNgj1.js",
"index.html"
],
"css": [
"assets/EmailPage-BxzHc6tN.css"
"assets/EmailPage-BH6ksrcc.css"
]
},
"src/pages/FeedbacksPage.vue": {
"file": "assets/FeedbacksPage-CLu2KtuG.js",
"file": "assets/FeedbacksPage-BKxylUkG.js",
"name": "FeedbacksPage",
"src": "src/pages/FeedbacksPage.vue",
"isDynamicEntry": true,
@@ -85,13 +85,13 @@
]
},
"src/pages/LogsPage.vue": {
"file": "assets/LogsPage-CbeqOQSe.js",
"file": "assets/LogsPage-CemQ-Y_T.js",
"name": "LogsPage",
"src": "src/pages/LogsPage.vue",
"isDynamicEntry": true,
"imports": [
"_users-Bw5HW1mw.js",
"_tasks-Bgkd54ac.js",
"_users-DCcrmSwH.js",
"_tasks-Cx_Yf55V.js",
"index.html"
],
"css": [
@@ -99,22 +99,22 @@
]
},
"src/pages/ReportPage.vue": {
"file": "assets/ReportPage-DVC8Kawd.js",
"file": "assets/ReportPage-D6vDD1zK.js",
"name": "ReportPage",
"src": "src/pages/ReportPage.vue",
"isDynamicEntry": true,
"imports": [
"index.html",
"_email-DoKk83fr.js",
"_tasks-Bgkd54ac.js",
"_update-BVJ0Pp6O.js"
"_email-BghJNgj1.js",
"_tasks-Cx_Yf55V.js",
"_update-D34iQbO6.js"
],
"css": [
"assets/ReportPage-TpqQWWvU.css"
"assets/ReportPage-CSbGJlZV.css"
]
},
"src/pages/SecurityPage.vue": {
"file": "assets/SecurityPage-CuXCrXIZ.js",
"file": "assets/SecurityPage-DGvsGoGa.js",
"name": "SecurityPage",
"src": "src/pages/SecurityPage.vue",
"isDynamicEntry": true,
@@ -126,7 +126,7 @@
]
},
"src/pages/SettingsPage.vue": {
"file": "assets/SettingsPage-cKC6DywW.js",
"file": "assets/SettingsPage-Bw1ItHlK.js",
"name": "SettingsPage",
"src": "src/pages/SettingsPage.vue",
"isDynamicEntry": true,
@@ -138,12 +138,12 @@
]
},
"src/pages/SystemPage.vue": {
"file": "assets/SystemPage-2XepJLfC.js",
"file": "assets/SystemPage-RgAQwtHu.js",
"name": "SystemPage",
"src": "src/pages/SystemPage.vue",
"isDynamicEntry": true,
"imports": [
"_update-BVJ0Pp6O.js",
"_update-D34iQbO6.js",
"index.html"
],
"css": [
@@ -151,16 +151,16 @@
]
},
"src/pages/UsersPage.vue": {
"file": "assets/UsersPage-CGNuB954.js",
"file": "assets/UsersPage-CFbr6Y3k.js",
"name": "UsersPage",
"src": "src/pages/UsersPage.vue",
"isDynamicEntry": true,
"imports": [
"_users-Bw5HW1mw.js",
"_users-DCcrmSwH.js",
"index.html"
],
"css": [
"assets/UsersPage-CbiPbpuj.css"
"assets/UsersPage-CC4Unpwt.css"
]
}
}