再次提交一下代码

This commit is contained in:
andy
2026-07-17 13:13:47 +07:00
parent f4d86248d4
commit 980a3a2535
41 changed files with 1699 additions and 187 deletions

View File

@@ -219,7 +219,7 @@ SOURCE_MESSAGE_READ
// 邮件来源记录读取权限:允许查看列表和摘要详情
SOURCE_MESSAGE_ORIGINAL_READ
// 邮件原文读取权限允许读取正文、HTML、正文图片 URL 和附件 URL
// 邮件原文读取附加权限:需叠加 SOURCE_MESSAGE_READ允许读取正文、HTML、正文图片 URL 和附件 URL
```
## 6. Success Metrics
@@ -233,7 +233,7 @@ SOURCE_MESSAGE_ORIGINAL_READ
- 重复投递去重成功率:重复外部邮件不会重复创建 SourceMessage。
- 查询可用性:可以按时间、状态、外部邮件 ID、外部邮件链 ID 查询本项目已接收邮件。
- 原文读取可控性:只有具备 `SOURCE_MESSAGE_ORIGINAL_READ` 权限的调用方可以读取原文和媒体 URL。
- 原文读取可控性:只有同时具备 `SOURCE_MESSAGE_READ` `SOURCE_MESSAGE_ORIGINAL_READ` 权限的调用方可以读取原文和媒体 URL。
### Guardrail Metrics
@@ -310,10 +310,10 @@ so that 后续业务功能可以在需要时展示完整邮件上下文
Acceptance Criteria:
- Given 调用方具备 `SOURCE_MESSAGE_ORIGINAL_READ` 权限
- Given 调用方同时具备 `SOURCE_MESSAGE_READ` `SOURCE_MESSAGE_ORIGINAL_READ` 权限
When 调用邮件原文读取接口
Then 返回 `textBody``htmlBody``inlineImages[]``attachments[]`
- Given 调用方不具备 `SOURCE_MESSAGE_ORIGINAL_READ` 权限
- Given 调用方不具备 `SOURCE_MESSAGE_READ``SOURCE_MESSAGE_ORIGINAL_READ` 任一权限
When 调用邮件原文读取接口
Then 系统拒绝访问
- Given 原文接口返回 `htmlBody`
@@ -347,9 +347,9 @@ Acceptance Criteria:
### Dependencies
- AgentBus payload 字段稳定性:依赖 `source.external_message_id``source.external_conversation_id``body.text``body.html``inline_images[]``attachments[]`
- 权限体系:需要后续确认 `SOURCE_MESSAGE_READ``SOURCE_MESSAGE_ORIGINAL_READ` 如何落到角色
- 审计体系:需要记录原文读取行为,具体表结构可与平台审计能力统一设计
- HTML 安全展示:前端展示 HTML 前必须 sanitize后端接口文档也要明确该约束
- 权限体系:已落地 `SOURCE_MESSAGE_READ``SOURCE_MESSAGE_ORIGINAL_READ`,内置角色映射以 M003 和当前代码为准
- 审计体系:原文读取已使用 `platform_source_message_original_access_audit` 独立记录
- HTML 安全展示:后端已返回 `html_body_sanitized` / `html_render_mode`,前端生产展示优先使用清洗字段
### Risks & Mitigations
@@ -358,7 +358,7 @@ Acceptance Criteria:
- Risk重复投递 payload 内容不同,覆盖原始事实会破坏追溯。
Mitigation幂等命中后不覆盖原 payload差异通过安全摘要或后续 attempt 记录表达。
- Risk邮件原文或媒体 URL 在列表、日志、错误响应中过度暴露。
Mitigation列表只返回安全摘要原文接口独立权限;日志和错误响应脱敏。
Mitigation列表只返回安全摘要原文接口必须同时校验摘要读取和原文读取权限;日志和错误响应脱敏。
- Risk业务模块直接依赖 AgentBus DTO。
Mitigation业务模块只依赖 SourceMessage ID 和平台接口AgentBus DTO 只留在 `integrations.messaging.agentbus`
- RiskHTML 原文直接渲染带来安全问题。
@@ -368,10 +368,10 @@ Acceptance Criteria:
| 问题 | 负责人 | 状态 |
| --- | --- | --- |
| 第一个 checkpoint 是否直接实现 `/api/source-messages/{id}/original` 原文读取接口,还是只写接口契约并后置实现? | 产品 / 后端 | Open |
| `SOURCE_MESSAGE_READ``SOURCE_MESSAGE_ORIGINAL_READ` 第一阶段如何映射到角色? | 产品 / 后端 | Open |
| 原文读取审计是否使用独立表,还是复用后续统一审计能力? | 后端 | Open |
| HTML sanitize 主要在前端完成,还是后端也提供清洗后的安全 HTML | 前端 / 后端 | Open |
| 第一个 checkpoint 是否直接实现 `/api/source-messages/{id}/original` 原文读取接口,还是只写接口契约并后置实现? | 产品 / 后端 | Closed已实现单封原文读取并补充会话完整正文接口。 |
| `SOURCE_MESSAGE_READ``SOURCE_MESSAGE_ORIGINAL_READ` 第一阶段如何映射到角色? | 产品 / 后端 | Closed内置 `RESERVATION_OPERATOR` 含原文读取权限,`RESERVATION_VIEWER` 仅含安全摘要读取权限;系统管理员拥有全部权限。 |
| 原文读取审计是否使用独立表,还是复用后续统一审计能力? | 后端 | Closed使用 `platform_source_message_original_access_audit` 独立记录原文读取审计。 |
| HTML sanitize 主要在前端完成,还是后端也提供清洗后的安全 HTML | 前端 / 后端 | Closed后端返回 `html_body_sanitized` / `html_render_mode`,前端生产展示优先使用清洗字段。 |
| 是否需要第一阶段支持按正文摘要关键字搜索,还是只按 ID、时间、状态、邮件链查询 | 产品 | Open |
## PRD Self-Assessment

View File

@@ -263,7 +263,7 @@ platform.security
| 权限码 | 中文说明 |
| --- | --- |
| `SOURCE_MESSAGE_READ` | 查看来源消息安全摘要 |
| `SOURCE_MESSAGE_ORIGINAL_READ` | 查看来源消息原文和媒体 URL |
| `SOURCE_MESSAGE_ORIGINAL_READ` | 查看来源消息原文和媒体 URL;必须叠加 `SOURCE_MESSAGE_READ` 使用 |
| `RESERVATION_ORDER_READ` | 查看订单 |
| `RESERVATION_TASK_READ` | 查看任务 |
| `RESERVATION_TASK_EDIT` | 保存任务草稿 |
@@ -289,7 +289,7 @@ platform.security
中文说明:
- `SYSTEM_ADMIN` 用于系统初始化和调试能力,第一版可访问所有启用酒店。
- `RESERVATION_OPERATOR` 需要查看邮件原文和附件外链来处理任务,因此第一版包含 `SOURCE_MESSAGE_ORIGINAL_READ`
- `RESERVATION_OPERATOR` 需要查看邮件原文和附件外链来处理任务,因此第一版同时包含 `SOURCE_MESSAGE_READ` `SOURCE_MESSAGE_ORIGINAL_READ`
- `RESERVATION_VIEWER` 只读查看订单、任务、审计和来源消息安全摘要;不允许保存、确认、执行 OPERA 模拟,也不允许访问 Debug EML。
- `SYSTEM_DEBUG_EML_RUN` 第一版只授予 `SYSTEM_ADMIN`,避免普通业务用户触发 SuperAgent 调试链路。
- 启动初始化会按上表同步内置角色权限矩阵:矩阵中新增的权限会补齐,矩阵中移除的旧关系会清理。后续如果管理后台允许人工改内置角色,需要先重新确认“代码矩阵”和“后台配置”的优先级。
@@ -477,9 +477,9 @@ Authorization: Bearer <access_token>
后续强制鉴权时应按接口分批启用:
1. 查询类接口先要求登录和酒店权限。
1. 查询类接口先要求登录和酒店权限。已完成Reservation / SourceMessage 第一批只读查询。
2. 写操作再要求具体操作权限。
3. 邮件原文读取迁移到 `SOURCE_MESSAGE_ORIGINAL_READ`
3. 邮件原文读取迁移到 `SOURCE_MESSAGE_READ` + `SOURCE_MESSAGE_ORIGINAL_READ`。已完成:`/api/source-messages/{id}/original``/api/source-messages/{id}/conversation`
4. OPERA 模拟迁移到 `RESERVATION_OPERA_SIM_EXECUTE`
5. 审计查询迁移到 `RESERVATION_AUDIT_READ`
@@ -519,7 +519,7 @@ Authorization: Bearer <access_token>
| 用户最终确认任务 | 有 token 时记录当前用户;无 token 时继续兼容本地占位 |
| Fallback 转换 | 有 token 时记录当前用户 |
| OPERA 模拟执行 / 重试 | 有 token 时记录当前用户 |
| 邮件原文读取 | 后续从 access-key 迁移到 `SOURCE_MESSAGE_ORIGINAL_READ` 权限 |
| 邮件原文读取 | 从 access-key 迁移到 `SOURCE_MESSAGE_READ` + `SOURCE_MESSAGE_ORIGINAL_READ` 权限,并记录当前登录用户稳定 ID |
第一期不强制改完所有业务审计 actor但需要提供可复用的当前用户上下文接口。
@@ -602,7 +602,7 @@ AUTH_TEST_SESSION_TTL_MINUTES=720
- Reservation 查询接口校验登录和酒店权限。
- Reservation 写接口校验具体权限。
- SourceMessage 原文读取迁移到 `SOURCE_MESSAGE_ORIGINAL_READ`
- SourceMessage 原文读取迁移到 `SOURCE_MESSAGE_READ` + `SOURCE_MESSAGE_ORIGINAL_READ`已完成 CP2后续保持回归。
- 审计 actor 全面迁移到当前用户。
### CP4管理后台接口

View File

@@ -840,7 +840,7 @@ GET /api/admin/audits
- Reservation 查询接口强制登录和酒店权限。
- Reservation 写接口强制具体操作权限。
- SourceMessage 原文读取迁移到 `SOURCE_MESSAGE_ORIGINAL_READ`
- SourceMessage 原文读取迁移到 `SOURCE_MESSAGE_READ` + `SOURCE_MESSAGE_ORIGINAL_READ`。已通过接口权限与酒店隔离收口 CP2 完成
- 业务审计 actor 全面迁移到当前用户。
该阶段和 M003 CP3、M005 酒店上下文统一收口有关,建议单独拆文档和任务。