0.17.0-rc.2
Pre-release预发布版本。请勿在唯一的真实 Vault 上使用。
rc.1 的 iOS 与 Android 实机自检已完成,两份报告都是 0 条不安全。
这一版修掉的是那次实测暴露出来的自检判定逻辑本身的缺陷。
修了什么
自检的判定逻辑写错了
rc.1 的报告顶部会挂着「
没有一条是危险的——错的是判据。
原实现用「实测 == 预言」的严格相等。这个判据是错的:
规则比现实更严完全安全,只是多拦一次。
真正危险的只有一个方向:规则比现实宽松——我们以为两个名字不同、
文件系统认为相同,于是后写的静默覆盖先写的。
iOS 的文件系统是大小写敏感的,我们的规则仍判碰撞,也就是比现实更严——
最安全的方向,却被标成了红色。而一份大部分是红色的报告等于没有报告:
真出问题的那一行会被淹掉。
现在是三档判定:
| 判定 | 含义 |
|---|---|
| ✓ 安全 | 规则与现实一致,或比现实更严 |
| △ 受限 | 设备接受某个名字而规则拒绝它 → 该文件在部分设备上不同步,不丢数据 |
| ✗ 不安全 | 规则比现实宽松 → 可能静默覆盖。只有这一类需要立刻处理 |
碰撞类与可创建性类分开判定:后者的危险方向是反的(规则接受而设备建不出来 →
写入会失败),原来两类混用同一个判据也是错的。
报告里新增「判定的含义」一节——读报告的人得知道该不该慌。
rc.1 实测带来的其他更新
README 用实测数据替换了推测
iOS 与 Android 在两项关键行为上完全相反:
| iOS | Android | |
|---|---|---|
| 大小写 | 敏感 | 不敏感 |
| Unicode 归一 | 会归一 | 不归一 |
这正好是「碰撞规则为什么不按平台分支」最有力的论据——按本地平台判断,
这两台设备会对「两个名字是不是同一个文件」给出相反答案,然后互相覆盖。
我们的规则取所有平台里最严的一套(小写化 + NFC 归一 + 去尾随点空格),
因此在两台行为相反的设备上都是「一致或更严」。
原子替换那条也改成实测结论:已测的五个平台(Windows / Linux / macOS /
iOS / Android)全部支持原子安装,因此退化路径是安全网而不是日常行为。
跨平台 CI
新增 ubuntu / macos / windows 三平台矩阵,每次推送都在真实文件系统上验证
路径规则。这一路上抓到一个只在 macOS 的 bash 3.2 上出现的解析 bug——
$VAR 后紧跟全角字符时,变量名会把那个字符的首字节吃进去。靠推理是想不到的。
rc.1 已包含、此版沿用
- 大小混淆(LSE4 信封 + 填充桶,默认关闭)
- 时间混淆(上传对齐窗口 + 抖动,mtime 量化,默认关闭)
- 不可原子替换平台的退化路径修复(远端更新此前根本收不到)
- 每个请求上报
X-Client-Version,服务端obsync migration preflight据此
确认「所有设备都升级了吗」
已知限制
- 大小混淆不覆盖元数据信封(LSM1)与分享名信封(LSN1)
- 时间混淆不隐藏「你在某个窗口里到底有没有编辑」——那需要持续的掩护流量,
本插件不做,也不暗示自己做了 - LSE4 需要 v0.17+ 客户端才能读。开启大小混淆前请确认所有设备都已升级
- 网络盘 / 云同步盘仍不支持作为 Vault 位置
安装
用 BRAT 添加 KJoner/litesync
并勾选包含预发布版本。服务端对应 v0.17.0-rc.1。