Skip to content

0.17.0-rc.3

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 13 Aug 06:06
· 2 commits to master since this release

预发布版本。请勿在唯一的真实 Vault 上使用。

rc.2 的五平台实测(Windows + iOS + Web)暴露了一批真实缺陷,这一版全部修复,
并新增首次配置的三选项接入。需要配套服务端 v0.17.0-rc.4(分享附件的查看端
与 restore 响应字段在服务端仓)。


修了什么

冲突解决死循环(实测 T2.3)与删除重建出冲突副本(实测 T2.2)

同一个根因:E2EE 上传的内容世代一律从本地缓存推导。对端在本机离线期间推高过
世代的话,合并保存必然被服务器按「世代不增」拒绝——而重试并不会改变本地缓存,
每一次都撞同一堵墙;三次自动合并失败后落到保底路径,凭空多出一个冲突副本。

现在「基于刚下载的远端内容上传」的场景(合并保存、自动合并、删除后重建的恢复
重传)都以刚下载并经认证的远端世代为下限。删除后重建不再产生冲突副本——
它是一次干净的恢复:同一对象身份、revision 连续、删除前的历史仍然可见。

改名被当成「新建」,旧文件成为孤儿(实测 T3.2)

协议 v6 的改名只发一条「新路径 + 同 fileId」的变更,不发删除——但只有元数据
加密模式的拉取端会按 fileId 认出改名。明文模式把它当新文件下载,旧文件永远
没人清理,另一台设备上出现新旧名各一份。

现在明文模式同样按 fileId 对账,顺带修复了三个相邻缺陷:

  • 纯大小写改名note.md → Note.md)在大小写不敏感的设备上不再被误判
    「目标被占用」而卡死——用两步探测消歧,中途崩溃可自动恢复;
  • 两台设备并发改成不同名字:本地的改名意图会在对端改名落地后自动换基,
    作为同一对象的正常改名推送——收敛到一个名字,不产生假删除、不复制内容;
  • 快照对账中的改名不再退化为「回收站 + 全量重新下载」(2GB 的视频改个名
    不该重新传 2GB)。

分享的图片终于显示了(实测 T2.4)

以前分享包里只有那一篇笔记的密文,内嵌图片的字节根本没进包——查看页只能显示
文件名。现在创建分享时把笔记内嵌的图片一起加密打包(总预算 64MB,超出的单张
跳过并提示),查看页在本地解密渲染。服务器看到的仍然只是一个密文 blob:
附件的数量、名字、内容都在密文里。

旧分享没有附件,图片位置仍是文字——重建一次分享即可。

顺带修了离线查看器的两个问题:0.13.3 之后创建的分享会在正文开头渲染出帧头
垃圾(漏了解帧);页面没有 CSP,笔记里的外链图片会把查看者 IP 报给第三方
(现在一律不加载外部资源)。

首次配置的三选项(新功能)

第一台设备填好地址与 Token 后点「测试连接」,如果远端仓库还是空的,不再只弹
一条成功消息,而是当场给出下一步:

  • 关闭 —— 什么都不做;
  • 立即同步 —— 初始化并开始首轮同步;
  • 添加 E2EE 并立即同步 —— 先设加密密码再初始化。远端是空的,没有迁移
    过程:首次上传就是密文,明文从头到尾不经过服务器

远端已有内容或已启用加密时不弹(那是第二台设备的接入,走原有向导)。

元数据迁移 abort 后的回声(代码核查发现)

修复 T3.2 引入的新改名检测有一个盲区:路径加密迁移中止后,迁移期间产生的
伪名化变更会被当成真实改名,把本地文件改名成 32 位十六进制。已修复并有
回归测试锁住——这类变更按对象的真实路径应用、按伪名寻址服务器。


测试

插件 286 条(新增 16 条回归,覆盖上述全部修复路径)、服务端全量通过。
验收手册的 T1.1 / T2.2 / T2.4 描述已同步更新。