gitadmin
|
46b220d6ca
|
feat: #21 Phase 5 — Tailwind v4 语法迁移 (globals.css + 删除 tailwind.config.js)
|
2026-07-15 16:05:51 +08:00 |
gitadmin
|
7346031fc4
|
feat: #21 Phase 1-4 — CSS导入+OKLCh+登录页统一+Sidebar品牌/权限+docker安全
|
2026-07-15 16:03:34 +08:00 |
gitadmin
|
fc8dd6f0c8
|
fix: #26 logout 修复 + auth/ldap 认证对齐
|
2026-07-15 16:00:23 +08:00 |
gitadmin
|
e20189d5f8
|
docs: 更新 CLAUDE.md/CHANGELOG — 记录7/13统一结单推送+wechat独立页+useDirtyTracker
|
2026-07-13 17:20:42 +08:00 |
gitadmin
|
459e19cbb8
|
refactor: wechat页per-webhook独立保存 + monitor页用useDirtyTracker统一section保存
- wechat页: 每推送组底部独立保存按钮(仅修改后显示),移除全局保存按钮
- monitor页: 用 useDirtyTracker 替代 originalConfig+hasSectionChanged 模式
|
2026-07-13 16:41:07 +08:00 |
gitadmin
|
991b7b85c3
|
fix: webhook测试masked URL导致93000 invalid url
- settings-manager: getMaskedConfig 用 .map() 替代直接 mutate wh.url
- test-wechat API: 检测 mask URL(含••••••••)时从DB查真实URL再发送
|
2026-07-13 16:30:51 +08:00 |
gitadmin
|
ada95e4e7f
|
fix: 补全4处审计日志缺失 + audit_logs.username列迁移
- api-keys/[id] PUT: 添加 diffObjects 变更审计
- reports/[id] DELETE: 添加删除报告快照审计
- auth/logout POST: 从 session cookie 提取 username 记录登出审计
- reports/download POST: 添加 export 审计
- db-schema: 添加 audit_logs.username/api_key_id 列迁移(修复审计日志静默失败)
|
2026-07-13 16:10:20 +08:00 |
gitadmin
|
b5e9cfbcd2
|
fix: 添加 audit_logs.username 列迁移,修复审计日志静默写入失败
writeAuditLog 共享库写入 username 列,但 issue-ai 数据库未添加此列,
导致所有审计日志 INSERT 失败(7月2日至今无新记录)。
服务器已执行 ALTER TABLE 修复,代码加迁移防未来部署遗漏。
|
2026-07-13 16:03:57 +08:00 |
gitadmin
|
629924c342
|
feat: 统一结单推送 + close_time 口径 + 微信推送独立页
- 结单推送从 worker 轮询上移到 API 层(PUT [id]/batch 状态跳变触发)
- 新增 notifyTicketResolved(结单)与 notifyTicketCreated(建单)并列构成完整通知层
- 移除 worker.checkRecoveryUpdates,副作用迁移至 resolution-side-effects
- 月度统计改为 close_time 归组,修复月报第四章跨月重复计算
- 微信推送独立为 /settings/wechat 页面,前端与邮件监控完全解耦
- 方案: docs/superpowers/specs/2026-07-13-unified-resolution-notification-design.md
- 计划: docs/superpowers/plans/2026-07-13-unified-resolution-notification-plan.md
|
2026-07-13 15:46:41 +08:00 |
gitadmin
|
7ea37afc75
|
feat: 删除故障分类冗余选项 + 报告口径统一 + SSRF 非规范IP加固
- 故障大类删除'其他'、故障小类删除'无故障'(TicketForm/ProcessForm/TicketList)
- 周报按'真实故障+设备类型'分章节(去 ticketType 判断,新增 isRealFault 排除 无故障/误判/空)
- 月报口径与周报对齐,统一排除'误判'
- 监控设置 SSRF 加固:拒绝整数/十六进制/八进制/短式等非规范数字型 IP,防绕过内网黑名单
|
2026-07-13 09:56:03 +08:00 |
gitadmin
|
f7bc9fd5fb
|
fix: SSRF 加固增强 — 拒绝内网/回环/链路本地 IPv4 邮箱服务器地址
响应 push 安全审查:settings VALIDATORS 的 isValidHost 增加内网 IPv4 字面量
检测,拒绝 0/8、10/8、127/8(回环)、169.254/16(链路本地/云元数据)、
172.16/12、192.168/16、100.64/10(CGNAT),防止 imap/pop3/smtp 服务器地址
被指向内网主机(SSRF 纵深防御)。
未做 DNS 解析 + rebinding 防御:host 需 monitor:write 权限修改、且为 POP3/TLS
协议连接(非 HTTP),对 admin-only 邮箱配置属过度设计。IPv6 字面量含 ':'
已被字符集正则天然拒绝。
|
2026-07-13 09:17:01 +08:00 |
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 |
gitadmin
|
d64c950894
|
fix: middleware publicPaths /api/internal + Dockerfile sqlite3
|
2026-07-08 10:35:59 +08:00 |
gitadmin
|
c179e47c6b
|
fix: logout redirect uses OIDC_REDIRECT_URI instead of request headers (open redirect fix)
|
2026-07-07 17:24:49 +08:00 |
gitadmin
|
c50c06f095
|
fix: logout 302 redirect instead of JSON, use x-forwarded-host
|
2026-07-07 17:18:19 +08:00 |
gitadmin
|
248ccaeb66
|
chore: .env.example 统一为本地开发配置(JWT_SECRET/AUTHELIA_URL/COOKIE_DOMAIN)
|
2026-07-03 14:01:38 +08:00 |
gitadmin
|
36aee38160
|
feat: SSO切换账号按钮 + 生产配置模板
|
2026-07-03 12:12:11 +08:00 |
gitadmin
|
6bba264927
|
fix: 移除 middleware adminPaths,解决非 admin 角色 Forbidden 问题
- 移除 middleware 中的 adminPaths: ['/settings'] 配置
- settings 页面权限由各 API 端点自行检查,middleware 仅负责认证
- 修复 viewer/operator 等非 admin 角色访问 /settings/* 返回 403 的问题
- 侧边栏 hasAnyAdminPerm 增加 audit-logs 和 monitor 权限检查
|
2026-07-02 18:02:12 +08:00 |
gitadmin
|
f507adfaa1
|
feat: 权限细化 tickets:edit/tickets:delete + 多 Webhook 推送组
- tickets:write 拆分为 tickets:edit(处理工单)和 tickets:delete(删除工单)
- 内置 operator 角色默认同时拥有两个权限
- 迁移脚本自动将已有角色的 tickets:write 替换为两个新权限
- 微信推送支持多个 webhook 推送组,每个可独立启用/禁用
- 每个推送组包含独立的运行参数(检查间隔、静默期)
- 旧格式 wechat.webhook_url 自动迁移为新数组格式
- worker 推送逻辑适配多 webhook(遍历所有启用的推送组)
|
2026-07-02 17:39:36 +08:00 |
gitadmin
|
38129bdb67
|
docs: 更新 CHANGELOG — 企业微信消息格式对齐 + 时区修复
|
2026-07-02 17:12:10 +08:00 |
gitadmin
|
02918fa907
|
feat: 企业微信推送消息格式全面对齐 zabbix-01 脚本
- P1-P5: 结单消息按 fault_type 分支,补齐机架位置/故障类型/故障时间/月度统计
- P6: OEM 维修档位标题补全「基于月度内累计故障时长计算」
- P7: OEM 诊断字段顺序调整(到期时间在故障信息之前)
- P8: 每小时提醒显示「X小时Y分」
- P9/P10: 静默期积压消息格式对齐(动态剩余时间、机架位置、30min 区分)
- 修复: isInSilentPeriod/isTimeToFlush 时区问题(UTC+8 偏移)
- 修复: 先推送后更新 DB,防止推送失败通知丢失
- 修复: faultDetail 截断 500 字符防止超限
- 修复: tierPenaltyMap 提取为类级常量
|
2026-07-02 16:45:43 +08:00 |
gitadmin
|
d39d2e65b3
|
refactor: P1 共享库迁移
- audit.ts: 引用 shared/lib/audit(包装器保持原接口)
- jwt-shared.ts: 引用 shared/lib/auth/jwt(包装器保持 signSharedJwt/verifySharedJwt)
- wechat-pusher.ts: pushText 改用 shared WeChatPusher,保留 formatAvailabilityMessage
- middleware.ts: 使用 shared/lib/auth/middleware 工厂
- tsconfig: 添加 @shared/* 路径
- 添加 shared symlink
独立审查通过
|
2026-07-01 18:42:49 +08:00 |
gitadmin
|
091ef426db
|
feat: SSO 统一认证登录
- 集成 Authelia OIDC,支持统一认证登录
- 添加 OIDC 登录页面和回调处理
- 更新 docker-compose.yml 统一环境变量管理
- 更新 CHANGELOG.md 和 CLAUDE.md
|
2026-06-30 17:09:24 +08:00 |
gitadmin
|
565f891e1e
|
fix: logout 端点添加 domain 参数清除跨域 cookie
- logout 端点清除 cookie 时添加 domain 参数
- 修复 .tlyq.ai 域的 tlyq_session cookie 未正确清除的问题
|
2026-06-29 20:05:19 +08:00 |
gitadmin
|
d8c65d5121
|
feat: SSO 统一认证 + ThemeProvider 三模式 + Card 边框统一
- 安装 openid-client v5,新增 OIDC 登录/callback 端点
- ThemeProvider 支持 light/dark/auto 三种模式
- TopBar 主题切换改为下拉菜单
- Card 暗色边框统一为 slate-800
- middleware 登录页已登录自动跳转 + /api/auth/login 放行
- 登录页添加 SSO 按钮 + LDAP 回退
|
2026-06-29 18:39:46 +08:00 |
gitadmin
|
24581166bc
|
fix(monitor): OEM维修超时提醒消息格式优化
- 超时提醒格式:第X档已超时,达到第Y档扣XX%
- 提前1小时提醒格式:距离第X档(扣XX%)还剩1小时
- 第四档超时提示:已触发全额扣费(100%)
- 第四档还剩1小时提示:距离全额扣费(100%)还剩1小时
- 静默期积压消息:动态计算剩余时间并显示扣费比例
- 消息内容与空行分隔
|
2026-06-25 11:49:10 +08:00 |
gitadmin
|
3fd09dec25
|
fix(monitor): OEM维修第五档提醒消息区分扣费比例
- 第四档:⏰ 图标 + '距离第四档(扣50%)超时还剩1小时'
- 第五档:🚨 图标 + '距离第五档(扣100%)超时还剩1小时'
- 第五档额外提示:'即将进入全额扣费,请立即处理'
|
2026-06-25 11:12:45 +08:00 |
gitadmin
|
b7b2b34a1f
|
feat: 审计日志 + 邮件监控 + 修复删除工单 bug
|
2026-06-24 15:43:18 +08:00 |
gitadmin
|
1c1555e417
|
feat: 添加审计日志功能
- 新增 audit.ts 核心函数(writeAuditLog、diffObjects、getClientIP)
- 新增审计日志 API(分页查询、CSV 导出)
- 新增审计日志前端页面
- 更新 Sidebar 添加审计日志菜单项
- 添加审计权限配置
- 在所有写操作 API 中集成审计日志
- 更新 CLAUDE.md 添加审计日志开发规范
|
2026-06-23 10:59:24 +08:00 |
gitadmin
|
5f0c312e9c
|
feat: 用户管理 UI 全面统一 + LDAP 邮箱同步 + 角色/Key 页面对齐
- 新增用户详情页,支持编辑(状态切换/密码确认)、键盘导航
- Modal/Button 拆分为独立文件,样式与 assets-ai 对齐
- LDAP 邮箱三路径同步:密码登录、SSO 免登录、批量同步接口
- 角色权限页:Badge 按角色分色、增加保存 loading、checkbox dark 样式
- API Key 页:成功提示颜色对齐、取消按钮 ghost 统一
- 全站字体/颜色一致:text-sm、dark mode 补全
- 删除确认统一改用 Modal 替换原生 confirm
|
2026-05-18 16:57:30 +08:00 |
gitadmin
|
703ed1a8d4
|
docs: 添加 Git Tag 日期版本号规范
|
2026-05-18 14:58:38 +08:00 |
gitadmin
|
b40802efbf
|
fix: SSO 免登录和本地 JWT 路径现在也会更新 last_login_at
此前仅密码登录路径更新 last_login_at,导致通过 SSO 共享 JWT
或本地 JWT 访问系统的用户始终显示"从未登录"。
|
2026-05-18 14:49:16 +08:00 |
gitadmin
|
726c8bee27
|
docs: 记录 middleware Edge Runtime 修复与连通性检查重试优化
|
2026-05-15 15:21:45 +08:00 |
gitadmin
|
651971e0fe
|
fix: middleware 移除 better-sqlite3 依赖,修复 Edge Runtime 报错
middleware 运行在 Edge Runtime,不支持 Node.js 原生模块。
API Key 验证回归 ALLOWED_API_KEYS 环境变量检查,DB 验证由 route handler 负责。
|
2026-05-15 09:26:20 +08:00 |
gitadmin
|
dce8b0b6cc
|
docs: 记录 API Key 修复与中间件安全加固(v2026.05.14)
- [修复] IP 查询失败:assets-ai api_keys 表注册缺失的 key
- [优化] 中间件 API Key 验证统一为 ALLOWED_API_KEYS → DB 两级
- [新增] deploy-ai.sh 部署后自动验证 issue→assets 连通性
|
2026-05-15 09:13:46 +08:00 |
gitadmin
|
2697aaaa75
|
fix: 内置角色可编辑不可删除,修复种子迁移覆盖用户权限
- admin/operator/viewer 均为内置不可删除,但可编辑
- 移除 initDatabase() 中的权限合并迁移逻辑,避免每次启动覆盖用户自定义权限
- admin 在 API 层禁止删除
|
2026-05-14 17:29:55 +08:00 |
gitadmin
|
2d74f0a05b
|
feat: 前端按钮基于 permissions 显隐 — 导出/新建报告/下载/删除
三处修改:
- TicketList 导出按钮基于 tickets:export 权限显隐
- 报告列表页新建/批量下载/批量删除按钮及各状态行内操作基于 reports:create/reports:download 显隐
- 报告详情页生成文档/下载报告/重新生成按钮基于 permissions 显隐
|
2026-05-14 17:05:14 +08:00 |
gitadmin
|
152241e666
|
feat: 前端侧边栏和全部工单页面改为基于permissions数组控制显隐
- Sidebar: isAdmin boolean → permissions string[],所有导航项按 perm 属性过滤
- 侧边栏 navItems 新增 perm 字段,canSee() 检查 tickets:read/tickets:create/tickets:import/reports:read
- "全部工单"仅 permissions.includes('*') 可见,"系统设置"区由 hasAnyAdminPerm() 控制
- 设置子项按各自 perm 过滤(users:read/roles:read/api-keys:read)
- /tickets/all 页面权限检查同步改为 permissions.includes('*')
|
2026-05-14 17:01:22 +08:00 |
gitadmin
|
48f8084b9b
|
feat: 报告API三层权限检查 — read/download/create 全覆盖
- GET /api/reports — 新增 reports:read 权限检查
- POST /api/reports — 修复为 reports:create(原错误使用 reports:read)
- DELETE /api/reports — 新增 reports:create 权限检查
- GET /api/reports/[id] — 新增 reports:read 权限检查
- DELETE /api/reports/[id] — 新增 reports:create 权限检查
- POST /api/reports/[id]/generate — 从 reports:write 改为 reports:create
- GET /api/reports/[id]/download — 新增 reports:download 权限检查
- POST /api/reports/download — 新增 reports:download 权限检查
5 个文件,共 8 个改动点
|
2026-05-14 16:57:29 +08:00 |
gitadmin
|
200fd7d3a1
|
feat: 工单API细粒度权限 — create/import/export 独立检查
- POST /api/tickets 手动建单改用 tickets:create
- POST /api/tickets/import 导入改用 tickets:import
- GET /api/tickets/export 新增 tickets:export 权限检查(此前仅有登录检查,是一个安全漏洞)
- PUT/DELETE /api/tickets/[id] 和 PUT /api/tickets/batch 保持 tickets:write 不变
|
2026-05-14 16:54:34 +08:00 |
gitadmin
|
a52241f4db
|
feat: 角色管理UI扩展权限项至14个,种子数据自动迁移operator/viewer权限
|
2026-05-14 16:51:11 +08:00 |
gitadmin
|
1ae84294bb
|
feat: UserPayload 增加 permissions 字段,getCurrentUser 补全权限列表
- UserPayload 新增 permissions: string[] 字段
- getCurrentUser() 三个返回路径(共享JWT查DB/SSO自动创建/本地JWT)
均通过 getUserPermissions() 从 roles 表实时查询补全权限
- 新增 getUserPermissions(role) 工具函数,admin 返回 ['*'],
其他角色从 roles 表解析 permissions JSON
- login() 函数和 login API 路由同步补全 permissions
- verifyToken() 返回对象补全 permissions 空值防止类型错误
|
2026-05-14 16:47:35 +08:00 |