应用在检查更新时读取 GitHub 与 Gitee 的静态版本清单。请求是普通 GET:不带请求体、不带 Cookie、不带设备标识,也不带论文或设置里的任何内容;服务器能看到的是这次连接本身的 IP 和 User-Agent(PaperFlow/<版本>)。不发送遥测,也不保存云服务口令。设置里把“更新提示”选成不提示会关闭自动检查;下载新版本永远需要用户点“下载并安装”,程序不会静默安装。
安装目录放在哪个网盘文件夹由用户自己决定,网盘客户端会按各自账户设置同步其中的私人资料。程序的“同步成功”不能证明云端已经收到文件。
公开仓库的 .gitignore 默认拒绝根目录杂项,提交钩子和发布脚本按文件路径白名单检查,并扫描部分个人路径、Notion 私有链接和常见密钥格式。公开源码包使用 git archive HEAD;程序包只包含干净构建的文件。
这些检查不能识别所有自然语言里的个人信息,也不替代人工检查 git diff --cached。一旦秘密已被提交,新增 ignore 并不能从 Git 历史中删除它。请暂停推送,检查历史;已外泄凭据应撤销。公开反馈仅提供脱敏复现,不附真实 data、journal、备份或设置文件。
本机修改先追加到不可变日志,再更新快照。同步收取的有效记录也会缓存到本机。不要手工编辑/删除事件来撤销操作,旧记录会从其他设备重新出现。常规修改通过界面操作;恢复或清空整个资料库需要先退出所有设备、保留完整备份,再设计迁移。
设置里的完整备份导出含论文及本机设置,属于私人文件。网盘同步不等于独立备份,仍建议定期导出到另一个可信位置。
当前版本不提供应用层加密,也没有代码签名。内建更新只在 HTTPS 下读清单,下载发布页上的压缩包,从里面取出 versions/<版本>/PaperFlow.exe,先校验压缩包、再校验里面的程序(长度与 SHA-256 各一层),通过后才装进 versions/<版本>/ 并改写 channel.json(旧清单留一份 .previous);任何一层对不上都会把临时文件删掉,一个字节都不会覆盖现在的程序。
更新有两个来源(Gitee 镜像与 GitHub),取舍规则是:镜像报的版本比 GitHub 高时忽略镜像(镜像只允许落后);两份清单报同一个版本时,必须 SHA-256 与长度完全一致才安装,不一致就本次不更新;只有 GitHub 连不上时才会单凭镜像更新。这挡得住"只改了一边"的情况,也挡得住镜像抢先推一个上游没有的版本。
哈希只能发现传输损坏和放错文件,不能证明发布者身份:能改写两个发布页(或拿到发布令牌)的人仍然可以替换应用。只运行自己信任的发行包,介意这一点就自己从源码构建。