桌面端插件系统评审:使用期间安装卸载与数据恢复

1198 字
6 分钟
桌面端插件系统评审:使用期间安装卸载与数据恢复

桌面端插件系统评审:使用期间安装/卸载与数据恢复#

Q:关于本项目桌面端插件功能,还需要考虑哪些问题?涉及使用期间卸载、安装、数据恢复。#


A:分析完成#

当前实现核对范围:desktop/storage_plugins/、desktop/services/upload.go、desktop/app.go、docs/plugin-system/。

以下是与「使用期间安装/卸载、数据恢复」直接相关的缺口和建议。


已有基础#

  • 安装:市场下载校验 SHA-256 + 包内 checksums/Ed25519 签名、zip-slip 防护、平台/兼容性校验;升级时备份旧版本目录、失败回退(desktop/storage_plugins/catalog.go:375)。
  • 卸载:有依赖检查(本地 source 仍引用时拒绝卸载,desktop/storage_plugins/manager.go:305)。
  • 数据补偿:对象上传成功但登记失败会写入 pending-storage-registrations.json 并重试(desktop/services/upload.go:638)。
  • 安全:生产模式启动前重新校验完整性和签名,凭据走 OS 凭据库引用。

安装(含使用中升级)#

  • 升级/重装没有先停 runtime:InstallPluginPackage → commitInstalledPackage 直接 rename 版本目录;而 RollbackPlugin 会先 stopRuntimesForPlugin(manager.go:274)。Windows 上正在运行的 node 进程占用文件会导致改名失败,或旧进程继续跑旧代码、而 current 已指向新版本。建议:安装/升级前也停掉该插件的全部 runtime,激活后按需重启 source。
  • current 指针提交非原子 + 回退排序问题:activePackageDir 在 current 缺失时按字符串排序取最后一个(catalog.go:426-439),1.9.0 会排在 1.10.0 之后。建议:保留上一版本指针用于启动自愈,fallback 按语义版本并校验完整性。

使用期间卸载#

  • 依赖检查只覆盖本地 source,漏了三类引用:
    • Web 端 Photo(storageSourceId/storagePluginId)
    • pending-storage-registrations.json 中该 source 的待登记任务
    • 正在进行的上传
    • 卸载后这些对象在远端变成孤儿,永远不会被登记或清理。
  • **DeleteSource(manager.go:452)不检查 Photo 引用**:删除 source/卸载插件后,桌面端再删这些照片会卡在 deleteDesktopPhotoObjects(app.go:590)→ runtimeForSource 报 “storage source not found”,导致连元数据都删不掉。删除参数里已有 Force,但该路径没有用它做”对象删除失败时仅解除元数据”。
  • 插件级启用/停用缺失:spec 承诺”启用状态”,实现只有 per-source enabled。停用是比卸载安全的中间态,能保留配置、凭据和待办,建议补上。
  • UI 卸载提示只说”必须先删除存储源”,没有列出具体依赖的 source 名称;后端手上有 source.Name,应拼进错误信息。
  • 安装/卸载/回滚没有审计日志(对比 Photo/Story 都有 Logger 记录),破坏性操作应留痕。

数据恢复#

  • 卸载即删除凭据(registry.remove → deleteSourceCredentials),远端对象仍在但失去访问/清理手段。建议:卸载前生成”受影响对象清单”(pending 任务 + Web Photo 引用数),提供导出,并二次确认后再删凭据。
  • 没有配置与状态的整体备份/恢复:sources、pending 任务、已安装版本没有统一导出。建议:提供”插件与存储源配置导出/导入”,凭据只导出 refs、恢复时重录;导入时校验插件版本和 configSchema 兼容。
  • 跨版本 config 迁移缺失:升级后 configSchema 变化时旧 config 可能不再被新版本接受,source 直接变 error。需版本级 config 校验/迁移,或升级前强制导出配置。
  • 崩溃窗口会产生不可恢复孤儿:当前”先上传、后写 pending”,若进程在两者之间崩溃,对象无任何记录。建议:改为两阶段任务记录(先持久化计划 → 上传 → 标记完成),崩溃后可按 source 对账清理。
  • 签名密钥轮换风险:宿主更新信任根后,旧版本插件可能因新 trust store 校验失败而无法启动(数据在远端但无法访问)。需保留历史信任根或已安装版本指纹白名单。
  • 回滚只切指针,若新版本改过对象 key 规则/编码,回滚后旧代码找不到对象。建议:source 上记录的 active 版本与 current 指针一致性校验,回滚后强制重启该插件全部 source 并重新 source.validate。

建议优先级#

P1(高优先级)#

  • 升级/卸载前停止 runtime 与 in-flight 任务
  • 卸载依赖检查扩展到 pending 任务和 Web Photo 引用
  • 删 source/卸载后允许对悬空 Photo 强制仅解除元数据
  • 卸载前生成受影响对象清单 + 凭据删除二次确认
  • 补插件安装/卸载/回滚审计日志

P2(中优先级)#

  • 两阶段上传任务记录以消除孤儿窗口
  • 插件级 enable/disable
  • 配置导出/恢复
  • activePackageDir 语义版本排序与启动自愈
  • 安装互斥锁
  • 密钥轮换白名单

需要的话,可以把以上整理进 docs/plugin-system/插件评审.md 或单独一份评审记录。

 

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

桌面端插件系统评审:使用期间安装卸载与数据恢复
https://shaio.top/posts/03mogallery/插件系统/桌面端插件系统评审使用期间安装卸载与数据恢复/
作者
沙海
发布于
2026-09-02
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
沙海
Hello, I'm Shai.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
84
分类
15
标签
48
总字数
67,035
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.12.2
文章许可
CC BY-NC-SA 4.0

文章目录