Files
user-system/.workbuddy/memory/2026-04-02.md
long-agent 5b6bd93179 refactor: 整理项目根目录结构
整理内容:
- 删除 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 ./... 通过
2026-04-07 18:10:36 +08:00

81 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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()` 链式注入方法
- `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 仍是 stubauth_handler.go::LoginByEmailCode
- 前端 device_id 稳定化方案(当前为随机生成)
- SlidingWindowLimiter 死代码清理R6-02
---
## Sprint 14 执行完成(同日继续)
**执行时间**: 2026-04-02
### 修复内容(彻底收口所有遗留问题)
#### ✅ 邮箱验证码登录 stub 修复
- `internal/api/handler/auth_handler.go`:
- `SendEmailCode`:从 stub 改为调用 `authService.SendEmailLoginCode`
- `LoginByEmailCode`:从 stub 改为调用 `authService.LoginByEmailCode`,支持设备信息注册
- `SupportsEmailCodeLogin()`:从硬编码 `false` 改为动态检测 `authService.HasEmailCodeService()`
- `ActivateEmail`:从 stub 改为调用 `authService.ActivateEmail`
- `ResendActivationEmail`:从 stub 改为调用 `authService.ResendActivationEmail`(防枚举返回)
- 删除三个永不被路由的 stubForgotPassword/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 已修复
- 死代码已清除
- 前端设备信任链路完整闭环