Skip to content

feat(restore): 恢复到指定目录(文件类型本机恢复 + 确认弹窗输入)#86

Merged
Awuqing merged 2 commits into
mainfrom
feat/restore-alt-path
May 31, 2026
Merged

feat(restore): 恢复到指定目录(文件类型本机恢复 + 确认弹窗输入)#86
Awuqing merged 2 commits into
mainfrom
feat/restore-alt-path

Conversation

@Awuqing

@Awuqing Awuqing commented May 27, 2026

Copy link
Copy Markdown
Owner

背景(丰富核心恢复能力)

恢复此前只能覆盖原始源路径。新增「恢复到指定目录」——把文件备份还原到任意目录,用于测试恢复 / 迁移 / 并排恢复而不覆盖现网数据。这是备份产品的核心恢复灵活性。

后端

  • backup.TaskSpec +RestoreTargetPathFileRunner.Restore 非空时把归档解压到该目录(沿用原有目录穿越防护)。
  • model.RestoreRecord +TargetPath(持久化/审计)。
  • RestoreService.Start(…, targetPath, …) 校验:仅文件类型需绝对路径远程节点暂不支持(清晰报错);executeLocally 透传到 spec。
  • 恢复触发端点接受可选请求体 {targetPath}(无 body 时恢复到原始路径,向后兼容)。

前端

  • 恢复确认弹窗:文件类型 + 本机恢复时新增「恢复到指定目录」输入(可选、绝对路径、留空=原位置),并实时反映在「恢复目标」摘要中。

测试

  • 恢复到指定目录后文件确实落在该目录;相对路径被拒。
  • 后端 go test ./... 全绿;前端 tsc + vite build 通过。

@Awuqing

Awuqing commented May 27, 2026

Copy link
Copy Markdown
Owner Author

⚠️ CodeQL 安全门拦截(合理告警,非误报)

本 PR 让恢复目标路径来自请求体(用户可控),流入 file_runner.go 的文件写入操作,CodeQL 据此报出 4 处 go/path-injection(high)。这并非误报——它意味着 operator 可借「恢复到指定目录」把备份内容写入服务器任意路径(如 /etc、/usr/bin),是真实的越权写入面。仓库 ruleset 的 code_scanning(high) 因此阻止合并。

不采用 --admin 绕过、也不擅自 dismiss 告警(这属于安全决策)。可选方案,待定夺:

  1. 限定到暂存根目录:恢复目标限制在配置的 staging 根(如 /var/lib/backupx/restores)之下 → 路径受限、CodeQL 通过、仍可用于「取出文件再人工搬运」。
  2. admin-only + dismiss:仅管理员可用任意路径,并把该告警标记为 by-design(与现有节点文件浏览的 path-injection 基线一致)。
  3. 暂不并入:保留本分支待设计定夺。

其余 5 个功能(#82#86 中的 #82/#83/#84/#85)已正常合入。请指示采用哪种方案。

Awuqing added 2 commits June 1, 2026 00:28
恢复此前只能覆盖原始源路径。新增「恢复到指定目录」:把文件备份还原到任意目录,
用于测试恢复、迁移、并排恢复而不覆盖现网数据。

- backup.TaskSpec +RestoreTargetPath;FileRunner.Restore 非空时把归档解压到该目录。
- model.RestoreRecord +TargetPath(持久化/审计)。
- RestoreService.Start 增加 targetPath 参数与校验:仅文件类型、需绝对路径、
  远程节点暂不支持(清晰报错);executeLocally 透传到 spec。
- 恢复触发端点接受可选请求体 {targetPath}(无 body 时恢复到原始路径)。
- 测试:恢复到指定目录后文件落在该目录;相对路径被拒。
文件类型 + 本机恢复时,恢复确认弹窗新增「恢复到指定目录」输入(可选、绝对路径、
留空=原位置),并实时反映在「恢复目标」摘要中;经 startRestoreFromBackup 透传 targetPath。
@Awuqing Awuqing force-pushed the feat/restore-alt-path branch from 9ab4dd4 to b0314c3 Compare May 31, 2026 16:28
@Awuqing Awuqing merged commit 50ce658 into main May 31, 2026
6 checks passed
@Awuqing Awuqing deleted the feat/restore-alt-path branch May 31, 2026 16:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant