edit | blame | history | raw

2026-06-28 MEXP05 安全读取

用户目标

作为 Mindraw 主项目 coder,只领取 MD-MEXP05-04,修复 PM-MEXP05-GATE 第三轮 independent review No-Go:AssetStore inspect / repair hydrate 的 blob 读取必须统一到 no-follow directory-handle / openat(O_NOFOLLOW) 路径,repair hydrate 写回 inline dataURL 前必须即时复验 manifest sha256 / byteLength

已完成事项

  • src-tauri/src/asset_store.rs 删除旧 checked_asset_path 普通读取路径,inspect / repair hydrate 统一调用 read_existing_asset_blob()
  • Unix 读取路径在打开父目录后、打开最终 blob 前后复验父目录仍在 .assets 内,最终 blob 通过 openat(O_NOFOLLOW) 读取;非 Unix 缺少可证明安全读路径时 fail-closed。
  • repair hydrate 重读 blob 后,在写入 inline dataURL 前复验实际 bytes 的 manifest sha256 / byteLength;blob 被替换、缺失、变 symlink 或内容不匹配时不修改 scene。
  • src-tauri/src/lib.rs 新增 5 个 MEXP05 回归,并给共享 race hook 测试加互斥锁,避免并行测试互相覆盖 hook。
  • 已回写 02-P/qa/mindraw-mexp05-assetstore-authority-check.mdCODEGRAPH.mdCHANGELOG.md02-P/plan-progress.markdownINDEX.md 无新增入口未改。

关键决策

  • 不扩大到 H8 / formal release、Windows 支持、inlineCache optional、m4c 真实 smoke、AssetStore public transport。
  • 不触碰 p.mindrawforcodex/03-O 未确认改动。
  • 全量扫描 src-tauri/src/lib.rs 会命中既有 MEXP04 originalPath 元数据字段,因此本轮隐私 / path 泄漏扫描限定到 asset_store.rs、MEXP05 QA 报告和 lib.rs 的 MEXP05 测试区。

文件变更

  • src-tauri/src/asset_store.rs
  • src-tauri/src/lib.rs
  • 02-P/qa/mindraw-mexp05-assetstore-authority-check.md
  • CODEGRAPH.md
  • CHANGELOG.md
  • 02-P/plan-progress.markdown
  • .codex-sessionhistory/2026-06-28-MEXP05安全读取.md

验证结论

  • cargo test --manifest-path src-tauri/Cargo.toml mexp05:18 PASS。
  • cargo test --manifest-path src-tauri/Cargo.toml mindraw_package_tests:47 PASS。
  • cargo test --manifest-path src-tauri/Cargo.toml:68 PASS。
  • cargo check --manifest-path src-tauri/Cargo.toml:PASS。
  • 前端目标回归:5 files / 64 tests PASS。
  • npm run build:PASS,仅既有字体解析、dialog 动态/静态导入和大 chunk 警告。
  • git diff --check:PASS。
  • 限定隐私 / path 泄漏扫描:无命中。

未决问题

  • PM-MEXP05-GATE 仍需 PM 复跑 independent review / Gate;本轮 coder 不声明 Gate GO。
  • AssetStore API 仍未暴露到 H5 live transport;真实 generated asset smoke 需 PM 另行派工。
  • 本轮未打包、未递增版本、未做 formal release。