3.0 KiB
FAIL
crates/ely-office/src/open.rs:229 — 恢复出的敏感文档丢失封存属性。Source::Copy 在第 163 行把 tried 设为 false,reopening 也只携带路径、时间和名称,因此新标签以 sealed:false 登记。实测:用固定测试密钥替代钥匙串读取,给原生 ElyDoc 提供含 C065_SENSITIVE_SECRET 的有效 .enc 恢复点;恢复后的下一轮生成 .bin,新 index 全为 sealed:false,直接解压该文件即可读取正文(/tmp/c065-sensitive-mock-result.log)。违反 C06.5 的加密文档封存要求。修复方向:把原恢复点的敏感属性传到新标签,在进程恢复和引擎重开后持续使用封存恢复点。
crates/ely-office/src/recover.rs:232 — 恢复交接提前删除唯一持久副本。发起异步 load 后立即删除旧恢复目录,第 224、244 行同时从持久索引移除旧条目;新标签的恢复点要等下一轮计时才生成,载入失败也失去原索引。实测:第一次启动从恢复点显示 C065_UNSAVED,此时恢复点数量为 0;立即再次 SIGKILL 并完整等待下一次启动,原内容消失,只剩新的空白标签(/tmp/c065-double-crash2-result.log、/tmp/c065-double-crash2.log)。违反 §6.2、§6.3 的持久恢复要求。修复方向:在新标签已有持久恢复点或用户明确处理该副本之后交接旧目录和索引,载入及解封失败保留原恢复条目;引擎重开的释放路径应用同一交接规则。
apps/ely-pdf/src/engine.rs:135 — 加密 PDF 的恢复快照沿用普通保存,快照仍需原 PDF 密码;恢复却通过 Source::Copy 使用空密码,open.rs:190 又仅为带 registry 的文件询问密码,导致恢复副本载入失败。实测:用 aes128.pdf 的 owner 密码打开、旋转页面、写快照,重新打开快照得到 locked:true;将此快照封存为有效 .enc 并交给原生 ElyPDF 恢复,日志报告 did not open: a password is needed,最终 index 为空(固定测试密钥仅替代钥匙串,/tmp/c065-encrypted-recovery2.log、/tmp/c065-encrypted-mock-result.log)。违反 C06.5 的加密文档崩溃恢复要求。修复方向:为封存恢复生成解封后可加载的 PDF 内容,并持续携带敏感属性;覆盖加密 PDF 的进程恢复和引擎重开。
crates/ely-office/src/stopped.rs:18 — worker 退出检测依赖视图先发出引擎错误,空闲 ElyPDF 缺少退出通知。实测:打开 tests/fixtures/office/t.pdf,等待页面绘制完成,单独 SIGKILL 其 ely-pdf-worker,再等待 13 秒;AX 树仍保留文件标签,故障提示和 Reopen documents 按钮均缺失,日志也未记录引擎退出(/tmp/c065-pdf-stopped-result.log、/tmp/c065-pdf-stopped-ax.log、/tmp/c065-pdf-stopped.log)。用户无法从窗口重新打开文档,违反 §6.3 及任务所声称的引擎退出提示。修复方向:通过 worker 退出通知更新 Stopped 并显示最近恢复时间和重开入口,覆盖空闲 PDF 的退出场景。