补齐游戏分发安全下架取证并记录发行包对象可匿名直取
Project CI / AI game creator shell Rust crates (push) Successful in 1m32s
Project CI / AI game creator shell Rust smoke (push) Successful in 2m6s
Project CI / Backend tests (push) Successful in 4m55s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 8m34s
Project CI / Frontend tests (push) Successful in 2m19s
Project CI / Native shell tests (push) Successful in 7m14s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 9m55s
Project CI / AI game creator shell web tests (push) Successful in 1m57s
Project CI / Repository checks (push) Successful in 2m28s
Project CI / AI game creator shell Rust crates (push) Successful in 1m32s
Project CI / AI game creator shell Rust smoke (push) Successful in 2m6s
Project CI / Backend tests (push) Successful in 4m55s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 8m34s
Project CI / Frontend tests (push) Successful in 2m19s
Project CI / Native shell tests (push) Successful in 7m14s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 9m55s
Project CI / AI game creator shell web tests (push) Successful in 1m57s
Project CI / Repository checks (push) Successful in 2m28s
- 媒体链路脚本新增管理员安全下架与恢复段:suspend 后目录/详情/发行读取全部关闭、过期 revision 的 suspend 被 CAS 拒绝、restore 后重新公开且可玩 - 新增匿名直取发行包对象探测:本地 dev bucket 返回 200(同 bucket 不存在 key 为 404),默认只打 WARN,E2E_REQUIRE_PRIVATE_BUCKET=1 时按失败处理 - 游戏分发里程碑阶段 B 第 7 条补上「不能绕过网关直取 OSS 在当前环境不成立」的实测、根因与剩余缺口 - pitfalls 记录 platform-oss 的 put_internal_object_bytes 从不发送 x-oss-object-acl 的问题与上线前处理
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
以下是已落地的实现与本地运行时证据,**不等于阶段验收**:B/C 的隔离托管、域名与生产验收仍缺少真实发行域名、TLS/CDN 与生产账号。
|
||||
|
||||
- 阶段 A:真实 ZIP 上传、游戏身份、owner/幂等/CAS、状态机、DTO 与 schema 门禁已完成;真实 SpacetimeDB + 私有 OSS 的创建/上传/确认/重启恢复已有证据。**2026-09-28 更新**:阶段 A 的六条行为与验收已全部勾选(含跨账号越权、并发上传不混写、进程退出后按权威偏移续传、DTO/envelope 一致性),正式验收仍待 owner 评审。
|
||||
- 阶段 B:人工审核(后台列表、通过需 HTTPS 入口、拒绝需理由)、公开投影、发行网关(按公开版本服务、扩展名白名单、`nosniff`/CORP/CSP、带 Cookie 403)与作者下架已实现;**2026-09-28 更新**:审核治理(待审可见、可批可拒、结论可追溯、作者不能提交审核)、「更新待审/被拒不改变在线旧版」、`publicationRevision` CAS(过期审核、并发激活、过期下架、陈旧审核不复活已下架游戏)与下架后的目录/详情/发行读取不可见都已在本地真实栈取证(见文末阶段 B 核对);每游戏独立来源已有可执行工件 `deploy/nginx/genarrative-release-origin.conf` 与门禁 `npm run check:release-origin-config`,并已在本机用真实 nginx + 真实网关验证按主机映射、Cookie 403 与平台命名空间 404;生产域名、通配证书与 CDN TTL 仍需上线环境确认。
|
||||
- 阶段 B:人工审核(后台列表、通过需 HTTPS 入口、拒绝需理由)、公开投影、发行网关(按公开版本服务、扩展名白名单、`nosniff`/CORP/CSP、带 Cookie 403)与作者下架已实现;**2026-09-28 更新**:审核治理(待审可见、可批可拒、结论可追溯、作者不能提交审核)、「更新待审/被拒不改变在线旧版」、`publicationRevision` CAS(过期审核、并发激活、过期下架、陈旧审核不复活已下架游戏)与作者/管理员下架后目录/详情/发行读取全部关闭都已在本地真实栈取证(见文末阶段 B 核对);匿名直取私有 bucket 这一条在本地 dev bucket 上**不成立**(对象可匿名读,脚本给 WARN / 严格模式失败,见 pitfalls);每游戏独立来源已有可执行工件 `deploy/nginx/genarrative-release-origin.conf` 与门禁 `npm run check:release-origin-config`,并已在本机用真实 nginx + 真实网关验证按主机映射、Cookie 403 与平台命名空间 404;生产域名、通配证书与 CDN TTL 仍需上线环境确认。
|
||||
- 阶段 C:AGC 客户端「发布到平台」面板与发布链路(dist 归一化根 `index.html`、摘要/字节数声明、幂等键、`localProjectId` 复用)已实现并有请求组装与 Rust 导出测试;网页 `/games/publish` 走同一服务端管道,本地已用真实文件选择验证;AGC GUI 自身的端到端发布仍待客户端环境验收。目录(关键词/分类/设备筛选、滚动与筛选恢复)、详情、游玩页(主动作后加载、超时重试、旋转提示、全屏、移动端门槛)与作者中心(状态、驳回理由、撤回、下架)已实现;本地已在桌面与 `390x844` 移动视口真实游玩。
|
||||
- 阶段 D:容量/额度、重启恢复、CDN 撤销与回滚演练尚未开始,依赖生产资源。
|
||||
|
||||
@@ -188,4 +188,4 @@
|
||||
- 已勾选(第 4 条:游客目录、详情和启动接口只返回已公开投影;未公开和已下架状态均不可见、不返回私有快照地址)——本轮补齐
|
||||
- 待审期间公开目录不含该游戏、封面没有匿名读授权(第 1 条取证里已跑);**本轮**补下架半边:作者 `unpublish` 成功后公开目录不含该游戏、`GET /api/game-distribution/games/{id}` 返回 404、发行网关 `GET /api/game-distribution/releases/{id}/index.html` 返回 404,且目录与详情的响应文本里没有 `aliyuncs.com` / `oss-cn` / `Signature=` 这类对象存储地址。- 仍未勾选(阶段 B 其余条目)
|
||||
- 第 5/6 条(每游戏独立 HTTPS origin、iframe sandbox、CSP/CORS/MIME/禁止 Worker、外站请求阻断):需要真实域名与真实浏览器,本轮未做;api-server 侧只有同源网关单测(`release_gateway_is_mounted_and_never_serves_cookie_bearing_requests`、`release_response_sets_nosniff_and_scopes_csp_to_html`、`release_response_allows_opaque_sandbox_asset_loads`)。
|
||||
- 第 7 条(下架会关闭新启动与发行读取、不能绕过网关直取公开 OSS、撤销传播在最大缓存窗口内):需要真实 OSS 与 CDN,本轮未做。- 说明:以上都是实现侧取证;里程碑与阶段的正式验收仍按原门禁流程(需要 owner 评审记录),本次只更新可证的勾选项与缺口。
|
||||
- 第 7 条(下架会关闭新启动与发行读取、不能绕过网关直取公开 OSS、撤销传播在最大缓存窗口内):前半句本轮已取证——作者 `unpublish` 与管理员 `suspend` 之后公开目录不含该游戏、详情 404、发行网关 404,`restore` 后重新可玩。**仍缺**:①「不能绕过网关直取公开 OSS」在当前环境**不成立**:匿名 `GET https://agc-dev.oss-rg-china-mainland.aliyuncs.com/agc/project-snapshots/v1/game-distribution/<gameId>/<versionId>.zip` 返回 **200**(同 bucket 不存在的 key 是 404),根因是 `platform-oss` 的 `put_internal_object_bytes` 收了 `OssObjectAccess` 却从不发送 `x-oss-object-acl`,对象继承 bucket 默认 ACL;脚本默认把这条打成 `WARN`,`E2E_REQUIRE_PRIVATE_BUCKET=1` 时转成硬失败(本轮两种模式都实测)。②「撤销传播符合最大缓存窗口」需要真实 CDN/TTL,本轮未做。
|
||||
|
||||
@@ -6052,3 +6052,11 @@ Cocos Creator 根目录由 `package.json.creator.version` 与普通 `assets/`
|
||||
- **判据**:拿它当门禁会得到假红。要判断某次改动是否真的破坏了这些用例,必须做 A/B:在当前改动与改动前(或 `master`)上分别**单独**跑同一条用例。
|
||||
- **本轮实测(2026-09-28)**:`tests::collaboration::delegation::background_agent_runtime_delegate_respects_project_policy` 在机器被其它 cargo 任务压住时曾失败(`Timeout` 与状态竞争各一次),安静状态下合并前后都 3/3 通过;`background_agent_runtime_can_delegate_task_to_other_agent` 与 `runtime_state::foreground_agent_chat_releases_lane_then_drains_queued_background_task` 在合并前的 `74b83aa1a` 上同样失败。
|
||||
- **做法**:AGC Rust 验证只跑受影响模块的定向过滤(例如 `direct_thread_manager`、`platform_maintenance`、`external_generation_state`、`write_lock`、`gui_`),全量或 `background` 这类宽过滤留给 CI 分片;本地要排查该家族时一次只跑一条、且先确认没有其它 cargo/链接任务在跑。
|
||||
|
||||
## 2026-09-28 game-distribution 发行包对象在 dev bucket 可匿名直取(platform-oss 不发对象级 ACL)
|
||||
|
||||
- **现象**:匿名请求 `https://agc-dev.oss-rg-china-mainland.aliyuncs.com/agc/project-snapshots/v1/game-distribution/<gameId>/<versionId>.zip` 返回 **200**,可以绕过发行网关直接下载发行包;同一 bucket 里不存在的 key 返回 404,所以是 bucket 默认 ACL 允许匿名读,而不是 404 兜底。
|
||||
- **根因**:`server-rs/crates/platform-oss/src/lib.rs` 的 `put_internal_object_bytes` 收下 `OssObjectAccess` 却只把它交给 `oss_access_label` 写日志,PUT 请求从不带 `x-oss-object-acl`;对象 ACL 因此继承 bucket 默认值(dev 的 `agc-dev` 是允许匿名读的)。
|
||||
- **判据**:`npm run check:game-distribution-media-e2e` 默认把这条打印成 `WARN`(本地 dev bucket 允许匿名读是环境现状),设 `E2E_REQUIRE_PRIVATE_BUCKET=1` 时按失败处理;本轮两种模式都实测过(默认 63 PASS + WARN,强制模式该条 FAIL)。
|
||||
- **处理**:上线前必须 ① 确认生产 bucket 不是 public-read;② 给 `platform-oss` 的内部 PUT、分片追加与直传策略补对象级 ACL(或干脆在 bucket 策略层对 `agc/project-snapshots/**` 收紧)。
|
||||
- **影响面**:所有经 `platform-oss` 写入「private」对象的链路(游戏发行包、AGC 项目快照、后台导出)在公开 bucket 上都继承公开读。
|
||||
Reference in New Issue
Block a user