整理内容: - 删除 60+ 临时测试输出文件 (*.txt) - 移动二进制文件到 bin/ 目录 - 移动 Shell 脚本到 scripts/ 目录 - scripts/dev/: check_gitea.sh, check_sub2api.sh, run_tests.sh - scripts/deploy/: deploy_*.sh, simple_deploy.sh - scripts/ops/: fix_nginx.sh, fix_ssl.sh, install_docker.sh - scripts/test/: test_*.sh, test_*.bat - 移动批处理文件到 scripts/ - 移动 Python 脚本到 tools/ - 清理临时日志文件 保留根目录必要文件: - go.mod, go.sum, go.work - Makefile, docker-compose.yml - .env.example, .gitignore - README.md, AGENTS.md, DEPLOY_GUIDE.md 验证: go build ./... && go test ./... 通过
3.3 KiB
3.3 KiB
2026-04-02 工作记录
Sprint 13 执行完成
执行时间: 2026-04-02
完成的修复
✅ GAP-01: 角色继承 — 确认已完整实现
internal/service/role.go: 循环检测 + 深度限制(5层)已实现internal/api/middleware/auth.go: 祖先权限汇总已接线- 无需修改
✅ GAP-02 + 密码历史: SMS重置时序泄漏修复 + doResetPassword补写历史
internal/service/password_reset.go:- SMS验证码比较改用
crypto/subtle.ConstantTimeCompare doResetPassword新增密码历史检查与记录- 新增
WithPasswordHistoryRepo()链式注入方法
- SMS验证码比较改用
cmd/server/main.go: 注入 passwordHistoryRepo 到 passwordResetService
✅ GAP-05: AnomalyDetector — 确认已接线
- main.go 第111-112行已完整初始化
- 无需修改
✅ GAP-03: 设备信任链路补齐
internal/api/handler/auth_handler.go: Login 补齐 device_id/name/browser/os 字段internal/api/handler/sms_handler.go: 从 stub 重写为真实实现,调用 AuthService.LoginByCode,支持设备注册internal/service/auth.go: 导出 BestEffortRegisterDevicePublic 供外部调用
验证结果
- ✅ go build ./... 通过
- ✅ go vet ./... 通过
- ✅ go test ./... -count=1 全部通过
遗留项(Sprint 14)
- 邮箱验证码登录 handler 仍是 stub(auth_handler.go::LoginByEmailCode)
- 前端 device_id 稳定化方案(当前为随机生成)
- SlidingWindowLimiter 死代码清理(R6-02)
Sprint 14 执行完成(同日继续)
执行时间: 2026-04-02(续)
修复内容(彻底收口所有遗留问题)
✅ 邮箱验证码登录 stub 修复
internal/api/handler/auth_handler.go:SendEmailCode:从 stub 改为调用authService.SendEmailLoginCodeLoginByEmailCode:从 stub 改为调用authService.LoginByEmailCode,支持设备信息注册SupportsEmailCodeLogin():从硬编码false改为动态检测authService.HasEmailCodeService()ActivateEmail:从 stub 改为调用authService.ActivateEmailResendActivationEmail:从 stub 改为调用authService.ResendActivationEmail(防枚举返回)- 删除三个永不被路由的 stub(ForgotPassword/ResetPassword/ValidateResetToken)
internal/service/auth_email.go: 新增HasEmailCodeService()检测方法
✅ R6-01 webhook recordDelivery context.Background 修复
internal/service/webhook.go: 用context.WithTimeout(context.Background(), 5*time.Second)替换裸context.Background()
✅ R6-02 SlidingWindowLimiter 死代码清理
- 删除
internal/security/ratelimit.go(整个文件,全部类型均无外部引用)
✅ 前端 device_id 稳定化
frontend/admin/src/pages/auth/LoginPage/LoginPage.tsx:buildDeviceFingerprint改为从 localStorage 读取ums_device_id- 不存在时用
crypto.randomUUID()生成并持久化 - 优雅降级:localStorage 不可用时退化为一次性 ID
验证结果(最终)
- ✅ go build ./... 通过
- ✅ go vet ./... 通过
- ✅ go test ./... -count=1 全部通过(无 FAIL)
- ✅ npm lint 通过(exitCode=0)
- ✅ npm build 通过(657ms)
所有遗留问题清零
- 所有已知 P2 stub handler 已修复
- 死代码已清除
- 前端设备信任链路完整闭环