Files
ElyOffice/tasks/reviews/C06.3-r1.md
T

18 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
FAIL
crates/ely-files/src/recovery.rs:207 — [P1] `restore_copy` 使用 `std::fs::copy`,会截断已有目标并跟随目标符号链接,违反 §6.3 的恢复生成新副本要求。实测将包含 `recovered` 的恢复点复制到已有 `source.md`,或指向该文件的 `restored.md` 符号链接,均返回 `Ok(())`,原内容 `original` 被覆盖。修复方向:排他创建恢复目标,目标已存在时返回错误或选择新名称,保证路径别名也无法覆盖源文件;补已有文件、符号链接与硬链接回归测试。
crates/ely-files/src/recovery.rs:111 — [P1] 恢复内容直接写入正式 `.bin`,枚举时缺少完整提交校验,失败写入会成为可恢复内容。子进程设置 `RLIMIT_FSIZE=1024` 后写入 8192 字节,`write_once` 返回错误、`last_ok` 为 `None`,重建 `Recovery` 后却列出长度仅 1024 的恢复点。清理也有同类中断问题:在删除 `.bin` 后留下 `.cursor`,`points()` 会返回不存在的内容路径,后续写入在 `bytes()` 中持续报 `NotFound`。修复方向:暂存并校验、同步完整恢复点后原子发布,枚举只认可已提交内容,并让中断清理可恢复;补部分写入及清理中断测试。
crates/ely-files/src/recovery.rs:92 — [P1] `last_ok` 在清理前更新,清理能够删除全部恢复点,随后仍返回成功及已删除路径,违反 §6.2 对最后成功恢复时间和持久化状态的要求。实测容量为 4 字节,先写入 `old!`,再写入 `large`:两份内容全部被删除,第二次结果仍为 `Ok(Some(path))`,`last_ok` 变成第二次时间,`points()` 为空;默认容量下单个文档超过 64 MiB 同样触发。修复方向:提交前核算单点容量,超限明确失败并保留最近有效恢复点,最终确认恢复点仍可用后再更新成功状态;补超大单点测试。
crates/ely-files/src/recovery.rs:267 — [P1] 放弃状态只记录在随后会被 `Crash::open` 覆盖的 `session.lock` 中,恢复点没有会话归属或持久放弃状态。实测先生成 `explicitly discarded` 并调用 `discard()`,再由新子进程打开同一文档目录并在首次恢复写入前遭到 SIGKILL;下次检查返回 `Crashed`,恢复列表重新包含已放弃内容,违反 §6.2。修复方向:将放弃结果与对应会话或恢复点持久关联,保证下一次会话开启及崩溃后仍排除该内容;补真实进程终止回归测试。
crates/ely-files/src/recovery.rs:75 — [P1] 加密文档恢复被无条件拒绝,§18.2 要求的加密恢复与系统密钥保护路径缺失。`Recovery::sensitive(...).write_once(...)` 对所有输入直接返回 `PermissionDenied`,代码和依赖均没有获取恢复密钥、加密写入或解密恢复的入口,因此已解锁的加密文档也会永久失去崩溃恢复能力。现有测试仅验证拒绝写入。修复方向:接入成熟加密库及系统密钥保护,验证加密恢复往返、磁盘内容保密和密钥无法解锁时的明确失败。
crates/ely-files/src/recovery.rs:31 — [P2] 10 秒间隔仅为未被执行路径使用的常量,模块提供的写入入口同步完成全部 I/O,缺少 §6.2 要求的后台定时恢复调度。源码检索确认没有调度调用方;实测在时间 100 秒和 101 秒连续调用会立即产生两个恢复点。`running` 仅在同一个持有独占 `&mut self` 的同步调用内设为真再清零,现有并发测试直接篡改私有字段,未验证实际后台任务重叠。修复方向:实现可执行的 10 秒后台调度及同文档任务占用管理,以可控时钟和延迟写入验证周期、跳过重叠任务及失败后继续调度。
crates/ely-files/src/recovery.rs:120 — [P2] 七天清理仅由新恢复点写入触发,重启与读取恢复列表均保留过期副本,违反 §6.2 的最长保留时间。实测写入时间为当前时间减八天的恢复点,随后销毁并重新创建 `Recovery`;`points()` 仍返回该内容,磁盘文件仍存在。用户只查看恢复列表或文档之后没有新编辑时,副本会无限期保留。修复方向:在恢复目录打开、扫描或维护流程中按当前时间执行过期清理,并测试重启后没有新写入的情况。
crates/ely-files/src/recovery.rs:182 — [P2] 容量统计只累计 `.bin`,光标与历史文件完全漏算,实际恢复目录可突破用户设置的上限。实测容量为 4 字节,写入 1 字节内容及 4096 字节光标字符串后返回成功,目录实际占用 4097 字节。修复方向:容量核算覆盖每个恢复点的全部文件,以带元数据的恢复点验证容量清理和超限失败。