Files
ElyOffice/tasks/reviews/C06.2-r2.md
T

3.3 KiB
Raw Blame History

FAIL

crates/ely-files/src/save.rs:253 — [P1] 新增的统一保存入口始终调用 save_atomic,跳过 atomic_capable 和 save_with_backup,违反 §6.1 对非本地目标保留上一份文件并提示限制的要求。隔离验证中,通过 macOS statfs 拦截清除 MNT_LOCAL,确认 atomic_capable(target) 返回 false;随后调用 save,结果仍为成功、会话进入 Saved,目录仅留下新内容的目标文件,旧版本已消失。修复方向:在统一保存流程内探测目标能力,为受限目标执行保留旧版本的保存路径,并向调用者返回限制与备份信息;覆盖能力为 false 的分支。

crates/ely-files/src/save.rs:73 — [P1] 上轮权限保留问题仍存在:COPYFILE_ACL 被写成 1 << 2,macOS 系统头文件中该值实际为 COPYFILE_XATTR,ACL 的值是 1 << 0。实测给 0644 文档添加 user:nobody deny read ACL,调用 save_atomic 返回成功后,该 ACL 条目消失,文件访问限制被放宽。现有测试仅核对 mode 位。修复方向:使用正确的 ACL 标志并传播复制失败,增加保存前后 ACL 一致的回归测试。

crates/ely-files/src/save.rs:133 — [P1] 新备份按默认创建权限落盘,遗漏源文件的访问限制。实测在 /private/tmp 下的 0755 目录创建 0600 文档,在 umask 022 下执行 save_with_backup,得到的备份权限为 0644,其他本机用户因此可以读取原本受保护的文档内容。修复方向:排他创建备份时先限制访问,在复制内容前应用源文件适用的权限和 ACL,任何失败均传播;增加共享目录中的私有文件备份回归测试。

crates/ely-files/src/save.rs:63 — [P1] 保存通过符号链接加载的文档时,persist(path) 替换链接本身,使会话与实际加载的文件分离。实测创建 alias.md -> report.md,通过 Session::load(alias.md) 加载并编辑,再执行 save;函数成功且状态为 Saved,alias.md 已变为普通文件,report.md 仍为旧内容。后续从原文件路径打开时看不到已保存的编辑。修复方向:将保存目标解析到实际加载文件,在该目标目录暂存并替换,保留链接关系,同时让外部修改检查针对同一目标;补充经文件符号链接保存的回归测试。

crates/ely-files/src/save.rs:126 — [P2] 备份名称只有 100 个候选,而每次成功保存都会永久占用一个,导致正常重复保存达到固定上限后持续失败。实测对同一 report.md 连续调用 save_with_backup,前 100 次成功,第 101 次返回 AlreadyExists / no free backup name;目录仍可写且有可用空间。修复方向:使用能够持续生成排他备份名称的策略,保持已有文件保护,并增加超过 100 次连续保存的回归测试。

crates/ely-files/src/save.rs:30 — [P2] 上轮附件长文件名问题仍有遗漏:长度预算只截断 stem,suffix 超过 NAME_MAX 时仍被完整追加。实测源文件名为 a. 加 253 个 x,共 255 字节;首次导入成功,第二次生成 -1. 加 253 个 x,共 256 字节,返回 InvalidFilename / File name too long。修复方向:对完整候选名统一分配长度预算,覆盖扩展名本身接近上限的情况,并增加长扩展名重复导入测试。