Skip to content

Commit c6b2f40

Browse files
committed
feat: Phase 6 风险修复 + 前端 UI 保护 + 后端删除/编辑守卫
- refresh.py 排除 CF pool 账号进入 OAuth 刷新链路 - 前端 groups.js: CF provider 标签 + 编辑/删除按钮禁用 - 后端 accounts.py: CF pool 账号禁止手动删除/编辑(403) - 全量测试 917/917 通过
1 parent 61f48fa commit c6b2f40

5 files changed

Lines changed: 434 additions & 115 deletions

File tree

WORKSPACE.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,49 @@
106106

107107
**修改文件**
108108
- `outlook_web/services/mailbox_resolver.py` — 新增 CF pool 账号 → `kind='temp'` 逻辑
109+
- `outlook_web/services/refresh.py` — 排除 CF pool 账号进入 OAuth 刷新链路(`provider='cloudflare_temp_mail'`
109110
- `tests/test_pool_cf_real_e2e.py`**新增** 真实 CF Worker E2E 测试(4 个用例)
110111
- `tests/test_pool_cf_integration_tdd_skeleton.py` — E2E mock 测试 skip(已由真实 E2E 替代)
111112

113+
#### 7d. Phase 6 风险修复 + 联调验收
114+
115+
**时间**:2026-04-09
116+
117+
**发现并修复的风险**
118+
- CF pool 账号(account_type='outlook')会被 `refresh.py` 误选入 OAuth token 刷新链路
119+
- 修复:`is_refreshable_outlook_account()` 新增 `provider` 参数,排除 `cloudflare_temp_mail`
120+
- 修复:`build_refreshable_outlook_account_where()` SQL 新增 `provider != 'cloudflare_temp_mail'` 条件
121+
- 验证:refresh 测试 7/7 通过
122+
123+
**Phase 6 进度**
124+
- ✅ Task 6.1: 本地联调脚本(已被真实 E2E 覆盖)
125+
- ✅ Task 6.3: 日志与审计(claim/complete audit 有 provider、account_id、result)
126+
- ✅ Task 6.4: 风险清单复核(refresh 排除 + 缓存依赖已通过 E2E 验证)
127+
- ✅ Task 6.5: 验收清单(claim → read → complete 全链路真实验证通过)
128+
129+
#### 7e. Phase 6.2 前端 UI 保护 + 后端删除/编辑守卫
130+
131+
**时间**:2026-04-09
132+
133+
**操作内容**
134+
135+
1. **前端 UI 保护**`static/js/features/groups.js`):
136+
- `getProviderLabel()` 新增 `cloudflare_temp_mail: 'CF 临时邮箱'` 标签
137+
- 新增 `isCfPoolAccount` 变量,识别 CF pool 账号
138+
- CF pool 账号的编辑和删除按钮设为 `disabled` + `opacity:0.3` + 提示文案
139+
140+
2. **后端删除保护**`outlook_web/controllers/accounts.py`):
141+
- `api_delete_account()` 新增 CF pool 检查,返回 403
142+
- `api_delete_account_by_email()` 新增 CF pool 检查,返回 403
143+
- `api_batch_delete_accounts()` 新增 CF pool 跳过逻辑
144+
- `api_update_account()` 新增 CF pool 检查,返回 403
145+
146+
3. **全量测试**:917 测试通过,0 failures
147+
148+
**修改文件**
149+
- `static/js/features/groups.js` — CF provider 标签 + 编辑/删除按钮禁用
150+
- `outlook_web/controllers/accounts.py` — 删除/编辑 CF pool 账号保护(4 处)
151+
112152
---
113153

114154
#### 4. CF临时邮箱接入邮箱池:文档补齐 + TDD 编写

docs/TODO/2026-04-09-CF临时邮箱接入邮箱池TODO.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
| Phase 3: Pool - complete 智能删除(Service) | 5 | 60 min | ✅ 已完成 |
2424
| Phase 4: external 读信/验证码链路适配 | 4 | 60 min | ✅ 已完成(真实 CF Worker E2E 4/4 通过) |
2525
| Phase 5: 测试补齐(按 TDD) | 6 | 120 min | ✅ 已完成(18 TDD 骨架 + 52 Pool 测试 + 4 真实 E2E) |
26-
| Phase 6: 联调与验收 | 5 | 60 min | ⬜ 待开始 |
26+
| Phase 6: 联调与验收 | 5 | 60 min | ✅ 已完成(含前端 UI 保护 + 后端删除/编辑守卫) |
2727

2828
---
2929

@@ -298,8 +298,9 @@ mailbox = {
298298

299299
### Task 6.2:前端 UI 只读展示(如本期做)
300300

301-
- [ ] accounts 列表能显示 provider=cloudflare_temp_mail 的记录
302-
- [ ] 禁用编辑/删除(按 PRD)
301+
- [x] accounts 列表能显示 provider=cloudflare_temp_mail 的记录(`getProviderLabel()` 新增标签)
302+
- [x] 禁用编辑/删除按钮(前端 `disabled` + 后端 403 双重保护)
303+
- [x] 后端 `api_delete_account()` / `api_delete_account_by_email()` / `api_batch_delete_accounts()` / `api_update_account()` 新增 CF pool 保护
303304

304305
### Task 6.3:日志与审计
305306

@@ -308,14 +309,15 @@ mailbox = {
308309

309310
### Task 6.4:风险清单复核
310311

311-
- [ ] 主要风险:external 读信缓存依赖 temp_emails 记录(见 Task 4.4
312-
- [ ] 主要风险:CF pool 账号被 refresh 任务误刷新(通过 account_type='outlook' + refresh_token='' 可能仍被选中,需确保 refresh 筛选不会把空 refresh_token 当可刷新
312+
- [x] 主要风险:external 读信缓存依赖 temp_emails 记录(已通过 E2E 验证,mailbox_resolver 返回 kind='temp'
313+
- [x] 主要风险:CF pool 账号被 refresh 任务误刷新(已修复:refresh.py 排除 cloudflare_temp_mail
313314

314315
### Task 6.5:验收清单(最小)
315316

316-
- [ ] claim-random 能返回 CF 邮箱
317-
- [ ] verification-code 能从该邮箱提取验证码(mock 或真实环境)
318-
- [ ] complete success 后远程邮箱被删除(可从 CF Worker 管理台确认)
317+
- [x] claim-random 能返回 CF 邮箱(真实 CF Worker E2E 通过)
318+
- [x] verification-code 能从该邮箱提取验证码(E2E 读信链路通过)
319+
- [x] complete success 后远程邮箱被删除(E2E-03 通过:远程状态 401/403/404)
320+
- [x] 全量测试 917/917 通过
319321

320322
---
321323

0 commit comments

Comments
 (0)