gitadmin
|
28c37f1069
|
feat: 邮件监控 4 项改进 + POP3 地址可配置 + SSRF 加固
改进内容:
1. POP3 备用服务器/端口从硬编码改为可配置(types + settings-manager +
fetchPOP3Emails 参数化 host/port + 两处调用点传配置值 + 设置页字段),
默认 pophz.qiye.163.com:995 保持向后兼容
2. 扫描历史固定保留最近 50 条(saveScanHistory 按 id 排序自动裁剪)
3. 补齐审计缺口:test-mail、scan-history DELETE、test-wechat 失败/异常分支
4. 运行状态"错误"从历史累计(10000+)改为反映最近一次 tick 状态
安全加固:
- settings VALIDATORS 增加 isValidHost 主机名格式校验(imap/pop3/smtp 三处),
拒绝 URL/端口路径/空格等载荷,收窄 SSRF 面(纵深防御)
- 审计 entityType 命名统一(monitor_mail / monitor_wechat)
经 6 Task + 独立审查(零 CRITICAL/HIGH/MEDIUM),2 处逻辑经内存 sqlite 单测验证。
自动安全审查:SSRF 已加固,scan_history DELETE IDOR 为误报(无用户输入)。
|
2026-07-11 19:10:41 +08:00 |
gitadmin
|
5152d7d4f2
|
feat: 全路径建单微信推送 + IMAP BODY 空 POP3 fallback
问题背景:
1. 网易企业邮箱 IMAP 对部分邮件返回空 BODY,worker 与手动扫描均无法获取正文
2. 6 处建单入口中仅 worker 有推送(且因取不到邮件而瘫痪),导入工单后无微信通知
改动:
- 新增 pop3-fetcher.ts:共享 POP3 获取模块(Message-ID 精确匹配,
含 CRLF 防护、TLS 证书校验、50MB 上限、dot-stuffing、超时等加固)
- 新增 ticket-notifier.ts:共享推送模块,fire-and-forget 不阻塞建单,
动态读 webhook、字段截断、assign_time 护栏、限频去重、5s 超时兜底
- mail-monitor.ts:worker fetchUnread 加 POP3 fallback,恢复自动建单
- worker.ts:检查 createTicketFromEmail 返回值,防与 notifier 双推
- 6 处建单入口接入推送:手动建单/外部API/手动扫描/手动扫描导入(单条)、
Excel 批量(事务后汇总单条)、worker(保持内联推送)
- scan-emails 内联 POP3 重构为引用共享模块
经三轮多独立审查员审查(设计+实现+集成)+ LOW 修复复审,全部零阻塞。
|
2026-07-11 17:31:56 +08:00 |
gitadmin
|
c2715d78d3
|
fix: 使用 body: '' 获取邮件内容
- 使用 body: '' 替代 rfc822: true,尝试获取完整邮件内容
- 添加多种获取方式的回退逻辑
|
2026-07-10 13:52:31 +08:00 |
gitadmin
|
f70675412f
|
fix: 使用 rfc822 获取邮件内容
- 使用 rfc822: true 替代 body: '.',兼容性更好
- rfc822 返回原始邮件内容,适用于所有 IMAP 服务器
|
2026-07-10 13:42:30 +08:00 |
gitadmin
|
5430f51885
|
fix: 修复 IMAP 邮件内容获取问题
- 使用 body: '.' 获取邮件完整内容,替代 source(某些 IMAP 服务器不支持)
- 添加详细的 fetch 结果日志,记录返回的字段名
- 改进邮件获取失败时的日志输出
|
2026-07-10 13:33:02 +08:00 |
gitadmin
|
c11e9fbc64
|
feat: 邮件扫描导入功能增强
- 新增 scan-emails/import API 端点,支持手动导入跳过的邮件为工单
- 前端添加'导入跳过的邮件为工单'按钮,扫描完成后可选择导入
- 添加扫描详情日志,记录无内容邮件的跳过原因
- 修复 scan_history 表 details_json 为空的问题
|
2026-07-10 13:22:55 +08:00 |
gitadmin
|
75ca749db7
|
fix: 根本修复 getClientIP tree-shaking 问题
- audit.ts: 直接定义 getClientIP 函数,而非从 shared 库 re-export
- 原因: Next.js standalone 构建的 tree-shaking 会丢弃 re-export 的函数
- 影响: 修复所有使用 getClientIP 的 API 路由(scan-emails、scan-status、auth/login)
|
2026-07-10 13:09:47 +08:00 |
gitadmin
|
73b442717e
|
fix: 修复 getClientIP 导入导致的树摇问题
- scan-emails/route.ts: 直接定义 getClientIP 函数,避免从 @/lib/audit 导入
- scan-status/route.ts: 同上
- 原因: Next.js tree-shaking 在打包时未将 getClientIP 包含在模块导出中
- scan-history API: 新增扫描历史查询接口
- db-schema: 新增 scan_history 表
|
2026-07-10 12:59:21 +08:00 |
gitadmin
|
b6f0393450
|
feat: 邮件扫描功能增强与 Bug 修复
主要更新:
- 新增邮箱工单检测模块,支持扫描邮箱并自动导入工单
- 新增扫描取消机制,支持用户中途取消扫描任务
- 新增扫描历史持久化,保存到 scan_history 表
- 修复 IMAP 连接管理问题,连接失败时正确重置 client
- 修复邮件搜索范围,从今天改为最近 7 天
Bug 修复:
- B-1: 修复 getClientIP 传入 null 问题,正确获取客户端 IP
- B-2: 修复 toISOString() 违反规范,改用 formatBeijingTime
- B-3: 修复 refreshStatus/refreshErrors 缺少 .catch() 处理
- E-1: 添加 detailsTruncated 字段,超过 500 条时显示截断警告
- E-2: 添加 5 分钟整体超时控制,避免扫描长时间挂起
- E-3: 优化 refreshErrors 路径依赖,使用安全的属性合并
- E-4: scanning 状态从 scanState.status 派生,保持状态一致
- 修复超时状态被覆盖为 completed 的 Bug
新增文件:
- src/lib/monitor/scan-state.ts: 共享扫描状态管理
- src/app/api/monitor/scan-emails/route.ts: 邮件扫描 API
- src/app/api/monitor/scan-status/route.ts: 扫描状态查询 API
- src/app/api/monitor/scan-history/route.ts: 扫描历史查询 API
|
2026-07-10 11:49:16 +08:00 |