Integrate validated catalog loading (T-201)

This commit is contained in:
ila
2026-07-16 16:52:46 +08:00
parent 9da72caa01
commit 2e21c9f327
20 changed files with 1450 additions and 40 deletions
+14 -7
View File
@@ -29,8 +29,9 @@
"version": "1.2.0",
"channel": "stable",
"status": "active",
"category": "开发工具",
"tags": ["工具", "JSON"],
"icon": "sha256:...",
"icon": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
"homepage": "https://example.com",
"tutorial": "https://example.com/tutorial",
"min_os": "windows-7-sp1",
@@ -53,21 +54,27 @@
行为要求:
- 网络成功:验签通过才替换本地缓存;验签失败**拒绝**,继续用最后一次验证成功的缓存。
- 网络成功:按“HTTPS 获取 → 验签 → Schema/字段/目标 channel 校验 → 替换缓存”处理;任一步失败都**拒绝**新内容,继续用最后一次验证且客户端可消费的缓存。
- 网络失败:用缓存;清单过期给提示,但保留已安装软件的启动能力。
- 下架:显式 `status: deprecated | hidden`,不用名称前缀。
- 过滤:按 `min_os` 与 `architectures` 过滤;不兼容软件可见说明但不可下载。
- 分类:`category` 是单一稳定分类,`tags` 是搜索/多标签展示数据;两者都不得为空。
- 过滤:先校验 manifest `channel`,再按 `min_os`、`architectures` 和 `packages` 过滤;不兼容软件可见说明但不可下载。
- 状态:`active` 可安装;`deprecated` 可见但不可新装/更新;`hidden` 不进入目录结果,但本地已安装记录仍由本地状态模块保留。
- URL:Catalog、package、homepage、tutorial 只接受无用户信息、无 fragment 的绝对 HTTPS URL。
- 架构:MVP Schema 接受 `386` / `amd64`;一个 app 的 `architectures` 必须与 `packages` 键一一对应。当前两个客户端发布目标仍是 amd64。
- 系统版本:`min_os` v1 只允许 `windows-7-sp1`、`windows-10`、`windows-11`;更高系统可消费更低最低版本的软件。
- Schema:客户端协议文件为 `schemas/manifest.schema.json`;标准包元数据为 `schemas/app.schema.json`。运行时还会执行 JSON Schema 难以表达的重复 ID、架构映射和 channel 目标一致性检查。
### 1.1 Phase 1 签名域原型
### 1.1 Catalog 签名域
T-101 验证采用以下签名域,供客户端与后续发布器实现对齐:
客户端采用以下签名域,供发布器实现对齐:
1. 输入必须是单个 UTF-8 JSON object;重复字段、尾随 JSON、浮点/指数数字直接拒绝。
2. 读取顶层 `signature`(标准 Base64 编码的 64 字节 Ed25519 签名),然后从对象中移除该字段。
3. 对剩余值递归规范化:对象键按 Unicode 字符串升序排列;数组保持原顺序;字符串按 JSON 转义;数字仅允许 JSON 整数并保持其合法十进制写法;不保留无意义空白。
4. Ed25519 直接签名/验证上述规范 JSON 字节。
这是 Phase 1 风险原型结论。T-201 正式接入时必须与 `softbox-catalog` 发布端做跨实现向量测试,再冻结 Schema、密钥 ID/轮换字段和版本兼容策略;在此之前不得另造签名域。
T-201 已把该签名域接入正式客户端加载链路并用客户端测试向量覆盖。`softbox-catalog` 发布端仍必须补跨实现向量测试;密钥 ID/轮换字段尚未定稿,在单公钥协议升级前不得另造签名域。
## 2. 标准软件包协议 v1(ZIP)
@@ -223,7 +230,7 @@ V1.1:命名管道 `\\.\pipe\softbox.<app-id>`,盒子发送 `{"command": "prepare
## 待实现时确认
- 清单签名封装格式(签名域、密钥轮换字段)定稿后同步 `schemas/`。
- 清单密钥 ID/轮换字段定稿后同步 `schemas/`。
- 错误码完整枚举表。
- 图标资源的分发方式(内嵌哈希 vs 独立 URL)。
- 撤销名单的结构与宽限期时长。