Files
go-omni/reports/signedReadAcceptance.md

3.0 KiB
Raw Permalink Blame History

v0.29.0 通用签名读取验收

范围:Local、S3/R2、OSS 的签名读取选项和本地范围读取。接口不包含业务身份、租户、分享记录、数据库、撤销或固定有效期。旧 Presigner、旧本地链接和默认下载行为兼容。

本地回归

2026-09-30,macOS arm64,Go 1.27.1:

  • GO_OMNI_SCAFFOLD_INTEGRATION=1 go test -race -count=1 ./...:57 个测试包通过,apigen 集成包 123.143 秒。
  • GOTOOLCHAIN=go1.22.12 GO_OMNI_SCAFFOLD_INTEGRATION=1 go test -count=1 ./...:57 个测试包通过,apigen 集成包 113.212 秒。
  • go vet ./...、go build ./...、git diff --check:通过。
  • go run ./examples/signedRead -check:真实回环 HTTP 预览、中文文件名、下载、HEAD、Range 通过。
  • python3 scripts/verifyUploads.py --output reports/signedReadMinio.json:真实隔离 MinIO 的新读取选项、原上传/分片与存储契约通过,见 报告和日志。独立容器无外部网络、不映射端口,已清理,原有容器保持运行。

首次 MinIO 回归中,原有契约故意发送错误长度触发 SDK 重试退避,耗尽契约的 10 秒预算。测试专用 client 改为 MaxRetries=1,与现有协议测试一致;生产 client 配置未变,修正后通过。

覆盖内容

  • 默认 attachment、inline、可选 MIME、ASCII/中文/特殊字符文件名,拒绝 CR/LF、控制字符、路径、过长参数、非法 MIME 和 disposition。
  • 本地签名绑定版本、key、有效期、全部响应选项,重复参数、未知参数、签名篡改、版本剥离和旧下载 URL 注入 inline 均拒绝,拒绝前不读存储。
  • 30 分钟实际签名到期时间、TTL 上下限、精确到期边界、取消 context;过期 Range/HEAD/条件请求不得读取文件或返回缓存命中。
  • 本地真实文件 GET/HEAD 内容长度、前缀/后缀/开放区间/截断/多段范围、206/416,Seek 不暴露元数据,按范围读取而非全文件缓冲;顺序读取 Store 回退完整 200。
  • 错误及条件响应保持 private/no-store,HEAD 成功与失败均无响应体。
  • OSS SDK V1/V4 独立重新计算签名,验证响应头在签名前加入,中文文件名、配置域名、到期时间及选项篡改;拒绝未签名配置。S3/R2 验证原生 SDK 查询参数与实际到期时间。
  • MinIO 实际 GET/Range 的响应头、字节和状态正确,篡改 disposition/type/cache/expiry 被服务端拒绝。

验证边界

OSS/R2 未使用云账号实测;SDK/MinIO 验证不能代替实际桶和域名验收。OSS 默认域名可能强制下载,其响应头覆盖受平台规则限制,需部署方检查实际 200/206。

浏览器控制工具不可用,隔离 Chrome/Chromium 截图尝试未获得成功渲染证据,因此不计为浏览器预览通过。真实 PDF 的 HTTP 响应已检查,浏览器视觉预览与实际云域名接入仍需项目侧回归。

远程固定版本空缓存验收结果在发布后记录;不移动已发布标签。