Skip to content

fix(shell): enforce WebView trust boundaries and root crash recovery #167

Description

@Wangnov

背景

#153 已修复正式版默认右键菜单,但 renderer 边界仍未完整收口:release 中没有统一阻止浏览器刷新/打印快捷键与顶层导航;Tauri capability 和 CSP 宽于实际前端调用。

同时现有 ErrorBoundary 只包裹 Shell。祖先 ThemeProvider/I18nProvider 或 sibling QuitConfirm 初次 render 抛错时,错误边界无法捕获,仍存在白窗路径。

当前证据

  • src/app/contextMenuPolicy.ts:69-80:只处理 contextmenu,没有 release accelerator policy。
  • src-tauri/src/lib.rs:99-148:Builder 没有统一 navigation/new-window policy。
  • src-tauri/capabilities/default.json:7-13:仍授予 core:defaultupdater:defaultprocess:default
  • src-tauri/tauri.conf.json:29-31:renderer connect-src 放行多个 HTTPS origin,而 src/** 没有 fetch/XHR/WebSocket。
  • src/app/App.tsx:96-109:ErrorBoundary 只包 Shell,不覆盖 Providers 与 QuitConfirm
  • src/main.tsx:24-28:React 根外没有第二层最小崩溃兜底。

验收标准

  • release 中阻止 F5/Ctrl+R/Cmd+R、Ctrl/Cmd+P、浏览器后退/前进等非产品入口;开发构建保留受控调试能力。
  • ErrorBoundary 页面中的显式“重新加载”仍可用,并在活动任务存在时遵守后端 snapshot/退出策略。
  • 生产 WebView 只允许自身 app origin;外部 http(s) 只能经受控命令交给系统浏览器,新窗口与危险 scheme 被拒绝。
  • capability 缩到实际所需的 event/window/dialog/process restart 权限,移除 JS updater 全工作流、process exit 与宽泛 core 默认。
  • 收紧生产 CSP,并为开发 HMR 单独配置;补齐适用的 base-uriobject-srcform-actionframe-ancestors
  • 最外层 dependency-light crash boundary 覆盖 Providers、QuitConfirm 与 Shell;createRoot 前失败也有最小静态 fallback。
  • 注入 provider、QuitConfirm、Shell 初始 render 与导航/快捷键异常,均能显示可操作错误页、写日志并保留 phase-aware quit。

占位说明

对应 Draft PR 只保留实施入口,不修改 WebView/capability/CSP 或崩溃处理,不应合并。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingpriority: P2Important product completeness or reliability follow-up

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions