联网短口令¶
历史记录 / Historical record:本文保留当时的计划、研究或验收证据,不代表 0.11 当前能力全集。现行说明见 文档入口;英文入口见 English overview。
最后更新:2026-10-19 12:12
用户明确选择:默认全部联网,不再生成供用户分享的离线长串。旧口令继续接受。
方案¶
复用清华云盘已有的分享凭据。20 位十六进制 token 无损转为 16 位易读 Base32,四位分组,加 ON 前缀,共 22 字符。名片、箱子和组织内容都上传为 manifest;口令长度与内容大小无关。非标准 token 保留完整凭据,不能截断减少随机性。不引入短码服务器或公共映射表。
所有新分享都需要发送方连接云盘;接收方联网匿名读取分享,不必先连接自己的云盘。云盘控制七天有效期与撤销。短码只包含分享凭据,不含登录 token、仓库 ID、私有目录或头像。旧 ONV1/ONV2/ONTOUCH1/ONORG1 继续可导入。
实施与验证¶
- [x] 共享短码编码、识别、解析与云清单发布。
lib/shortCode.ts(Base32 无损互转 + Crockford 形近字符纠正 + ONX 非标准凭据兜底);state/cloudExchange.ts(manifest 发布/匿名解析)。目录分享被云盘拒绝时退化为分享 manifest.json 文件(/f/链接),两种形态都能短写。 - [x] 暂存箱 / 个人名片 / 组织邀请 / 组合分享全部使用短码,NFC 与二维码一致。大头像不再需要缩图:内容走云盘 manifest,口令恒为 22 字符。
- [x] 所有接收入口识别新旧口令,接收内容保存逻辑保留。
receiveExchangeCode(text, vaultTarget)统一入口:导入口令/收碰一碰/扫码/NFC/雷达/抽屉都认箱子、名片、组织、碰一碰四类;旧入口「替换当前箱」的老行为不变(传current)。 - [x] 测试长度、无损转换、大小写/分隔符、旧协议兼容、无云盘/过期/损坏失败,以及跨独立客户端读取。
- [x] 类型检查、浏览器界面与自动化验收,更新记忆。
实施记录(2026-10-19)¶
发布去重与稳定分享位。 同一份内容重复分享不再每次上传:publishExchangeCode(code, contentKey, slotName) 两层机制——内容摘要没变且旧口令仍可匿名读,就直接复用;名片/组织这类会更新的内容走稳定分享位(slot),就地覆盖同一个云盘目录的 manifest,口令不变、内容永远最新,改一次名片也不多一个目录。暂存箱/碰一碰组合是快照语义,只用内容摘要缓存;箱子复用 lastShareCode(任何变更都会清掉它)。
真机暴露的问题与修复。
1. 读取报 Command seafile_share_read not found:用户跑的是 10-11 的安装包,该命令 10-18 才注册。用 dev 应用(或重新打包)即可。
2. 「导入口令」只认 ONV1/ONV2,贴上名片/组织短码就报「应以 ONV1. 开头」——已改为统一入口按类型分发。
3. 重复收同一张名片报「没有可导入的内容」——通讯录去重被当成失败;现在明确回报「本地已有(未重复添加)」。
4. 平台判定把 1256×596 的桌面窗判成手机形态(短边 596 < 600):改为「宽度 < 600 算手机;高度 < 600 且宽度 ≤ 960(横屏手机)才算手机」,桌面窗压矮不再误判。单测 11 例钉住。
5. 雷达第一次分享报「请先连接清华云盘」:小形态没经过暂存箱页,适配器没装;shareCodeForBox 现在自己补装。
验收。 tools/short-code-test.mjs(57 例:编解码/定长/容错/旧前缀不误判/500 抽样无碰撞);tools/short-share-browser-test.mjs(50 例:假云盘上两个独立客户端——发送方已连接、接收方完全匿名——覆盖生成/复用/更新/路由/旧协议/过期/撤销/篡改);tools/platform-test.mjs 补 11 例手机形态判定。既有 vault/org/namecard/mobile-vault/feedback-round2 五个浏览器测试同步改造(假云盘 + 新码型 + 导航结构变化:设置入口改「我的」、组织搬到通讯录页)。雷达与抽屉两个小形态都加了「收口令 / 扫码」。
不部署或使用自建服务;云盘真实互传另行真机联调(需要 dev 应用或重打包,且双方账号实测)。