AskaEth
b34e86bba5
feat(core): 整合包格式无关模型与格式扩展点(M110)
从零建 `core::addon::pack`:格式无关中间模型 + 格式扩展点 + 安全读取层,
不碰网络、不碰 UI(core-no-ui 依赖表未变)。
- `PackManifest` 无损表达 CF / mrpack / MultiMC 三方字段:包名/版本/作者/简介/
格式版本/游戏版本/加载器依赖/文件条目/覆盖目录;`files[].hashes` 保留整张摘要表
(mrpack 允许 sha1+sha256+sha512+md5 共存),`disabled` 记语义(导出按 D10 映射成
env.client=optional,CF 落 required=false)。
- 未知字段按条目用 serde flatten 接住(清单顶层 / CF `minecraft` 对象 / 文件条目 /
env / 加载器条目),导出时并回且已知字段优先;两格式各有一条「读→写→再读相等」测试。
- `trait PackFormat`(id / label / metadata_entry / detect -> Option<证据> /
read / render / 默认 write)+ `PackRegistry`:注册表顺序即优先级,写死
CurseForge → Modrinth → MultiMC;同一份包命中多格式时 `also_matched` 暴露歧义。
测试里用一个 toy 格式(单文件、一行注册)证明扩展点真的可扩展。
- `PackArchive` 把目录与 zip 统一成规整条目表:路径穿越双检(自研七条规则 +
zip crate 的 enclosed_name)、符号链接条目拒绝、条目数/解压体积/单条目上限、
规整后重名拒绝、篡改载荷不当场吞掉;每条都有恶意样本测试。
- 格式实现:CF 可读写(缺路径如实记 None)、mrpack 可读写(强制 sha512 形状、
env 三态、三个覆盖目录成三侧)、MultiMC 只读(.minecraft 当覆盖目录,
组件顺序与非加载器组件全保留)。
- 三种格式各一个手造夹具(含截断 TOML / 半截 jar / 零字节 jar),来源在
`tests/fixtures.rs` 里声明为手造,不冒充真实导出。
2026-11-04 00:20:24 +08:00
..
2026-10-31 21:54:10 +08:00
2026-11-02 09:29:31 +08:00
2026-11-03 23:59:07 +08:00
2026-11-02 08:08:16 +08:00
2026-11-04 00:20:24 +08:00
2026-11-02 13:12:44 +08:00
2026-11-03 13:19:17 +08:00
2026-11-02 11:05:06 +08:00
2026-11-02 18:46:43 +08:00