桌面端插件系统评审:使用期间安装卸载与数据恢复
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 的待登记任务- 正在进行的上传
- 卸载后这些对象在远端变成孤儿,永远不会被登记或清理。
- Web 端 Photo(
**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/插件系统/桌面端插件系统评审使用期间安装卸载与数据恢复/ 相关文章 智能推荐
1
存储插件引入与操作逻辑
MO Gallery 存储插件引入与操作逻辑
2
字段添加评审
MO Gallery 字段添加评审
3
客户端防破解
MO Gallery 客户端防破解
4
SQLite 驱动、查询与备份实现选型
MO Gallery SQLite 驱动、查询与备份实现选型
5
本地资源库加载速度优化
MO Gallery 本地资源库加载速度优化
随机文章 随机推荐