拆分桌面壳文件载荷边界
桌面壳文件对话框与载荷校验拆成 files 和 file_payloads 桌面壳单端门禁登记文件载荷模块 宿主壳方案和统一协议同步文件桥接分层
This commit is contained in:
@@ -94,6 +94,14 @@ const desktopHostBridgeFilesSource = fs.readFileSync(
|
||||
desktopHostBridgeFilesPath,
|
||||
'utf8',
|
||||
);
|
||||
const desktopHostBridgeFilePayloadsPath = new URL(
|
||||
'../src-tauri/src/host_bridge/file_payloads.rs',
|
||||
import.meta.url,
|
||||
);
|
||||
const desktopHostBridgeFilePayloadsSource = fs.readFileSync(
|
||||
desktopHostBridgeFilePayloadsPath,
|
||||
'utf8',
|
||||
);
|
||||
const desktopHostBridgeNavigationPath = new URL(
|
||||
'../src-tauri/src/host_bridge/navigation.rs',
|
||||
import.meta.url,
|
||||
@@ -259,6 +267,7 @@ const expectedDesktopHostBridgeRustFiles = [
|
||||
'capabilities.rs',
|
||||
'clipboard.rs',
|
||||
'dispatch.rs',
|
||||
'file_payloads.rs',
|
||||
'files.rs',
|
||||
'mod.rs',
|
||||
'navigation.rs',
|
||||
@@ -2060,6 +2069,7 @@ const expectedRustHostBridgeFiles = [
|
||||
'capabilities.rs',
|
||||
'clipboard.rs',
|
||||
'dispatch.rs',
|
||||
'file_payloads.rs',
|
||||
'files.rs',
|
||||
'mod.rs',
|
||||
'navigation.rs',
|
||||
@@ -2318,7 +2328,7 @@ assertSameList(
|
||||
'desktop shell Rust bridge modules',
|
||||
);
|
||||
const desktopExportImagePayloadBody = extractFunctionBody(
|
||||
desktopHostBridgeFilesSource,
|
||||
desktopHostBridgeFilePayloadsSource,
|
||||
'export_image_payload',
|
||||
);
|
||||
if (
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,7 @@ pub(crate) mod capabilities;
|
||||
mod badge;
|
||||
mod clipboard;
|
||||
mod dispatch;
|
||||
pub(crate) mod file_payloads;
|
||||
pub(crate) mod files;
|
||||
mod navigation;
|
||||
mod network;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use crate::host_bridge::files::{import_image_file_payload, import_image_mime_type};
|
||||
use crate::host_bridge::file_payloads::{import_image_file_payload, import_image_mime_type};
|
||||
use crate::shell::events::host_bridge_event_script;
|
||||
use crate::shell::lifecycle::log_desktop_host_event_result;
|
||||
use serde_json::Value;
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
- 2026-06-19 桌面壳系统分享 URL 边界:Tauri `share.open` 写入系统剪贴板前同样只允许把 `url`、`href`、`path`、`targetPath` 和 `work` 归一为 `https://app.genarrative.world` 同源公开 URL;外域、协议相对 URL、`javascript:` 等危险目标必须返回 `invalid_request`,且显式非法 payload 不得回退到之前缓存的 `share.setTarget` 目标。桌面壳配置检查会拒绝移除同源分享 URL 归一和协议相对 URL 拦截。
|
||||
- 2026-06-19 原生壳分享桥接边界:Expo `share.setTarget` / `share.open` 的缓存目标、分享 payload 归一、系统分享调用和 HostBridge 响应统一收口在 `apps/mobile-shell/src/host-bridge/share.ts`;Tauri `share.setTarget` / `share.open` 的缓存目标、分享文本生成、剪贴板 fallback 写入和 HostBridge 响应统一收口在 `apps/desktop-shell/src-tauri/src/host_bridge/share.rs`。两端 `dispatch` 只负责委托对应 share 模块,配置检查会拒绝分发层直接持有分享状态、生成分享文本、写入分享剪贴板结果或包装分享成功响应。
|
||||
- 2026-06-19 桌面壳窗口标题桥接边界:Tauri `app.setTitle` 的 payload 校验、非空 / 控制字符拒绝、80 字符截断和主窗口 `set_title` 调用统一收口在 `apps/desktop-shell/src-tauri/src/host_bridge/title.rs`;`dispatch.rs` 只负责委托 `set_desktop_host_bridge_window_title(...)`。桌面壳配置检查和根级结构门禁会覆盖 `title.rs` 文件清单、共享标题长度镜像和 dispatch 委托关系。
|
||||
- 2026-06-19 桌面壳文件桥接执行边界:Tauri `file.exportText` / `file.importText` / `file.importDocument` / `file.exportImage` / `file.importImage` / `file.importAudio` / `file.exportAudio` 的系统文件对话框过滤器、用户取消语义、路径转换、异步读写编排和 HostBridge 响应统一收口在 `apps/desktop-shell/src-tauri/src/host_bridge/files.rs`;`dispatch.rs` 只负责按 method 委托 `export_desktop_host_bridge_*_file(...)` / `import_desktop_host_bridge_*_file(...)`。桌面壳配置检查会拒绝分发层直接调用 `.dialog()`、`blocking_save_file` / `blocking_pick_file`、文件 payload helper 或落盘 helper,避免文件访问边界重新散落。
|
||||
- 2026-06-19 桌面壳文件桥接执行边界:Tauri `file.exportText` / `file.importText` / `file.importDocument` / `file.exportImage` / `file.importImage` / `file.importAudio` / `file.exportAudio` 的系统文件对话框过滤器、用户取消语义、路径转换、异步读写编排和 HostBridge 响应统一收口在 `apps/desktop-shell/src-tauri/src/host_bridge/files.rs`;MIME、大小、base64、文件名清洗、本地副本读写和 HostBridge payload 组装统一收口在 `apps/desktop-shell/src-tauri/src/host_bridge/file_payloads.rs`;`dispatch.rs` 只负责按 method 委托 `export_desktop_host_bridge_*_file(...)` / `import_desktop_host_bridge_*_file(...)`。桌面壳配置检查会拒绝分发层直接调用 `.dialog()`、`blocking_save_file` / `blocking_pick_file`、文件 payload helper 或落盘 helper,避免文件访问边界重新散落。
|
||||
- 2026-06-19 桌面壳外链打开 helper 共用:Tauri WebView 外域拦截和 HostBridge `app.openExternalUrl` 都必须复用 `open_normalized_desktop_external_url` 执行系统外链打开动作;HostBridge 分支仍先用 `normalize_external_url` 保留 payload 错误语义并把 opener 错误回传给 H5,WebView 拦截保持 best-effort 静默处理。桌面壳配置检查会拒绝 `dispatch.rs` 直接调用 `app.opener().open_url` 绕过该 helper,避免两条离壳路径漂移。
|
||||
- 2026-06-20 H5 原生导航预校验:`navigateHostNativePage()` 在 `native_app` 下发送 `navigation.openNativePage` 前必须先拒绝空值、控制字符、协议相对 URL、外域绝对 URL 和非 `http:` / `https:` 协议目标;同源绝对 URL、`/path` 和保留给桌面壳兼容的相对 route 继续交给 Expo / Tauri 壳二次归一并补写宿主上下文。微信小程序分支仍按小程序页面 URL 语义走 `wx.miniProgram.navigateTo`,不套原生 App 同源 H5 预校验。根级 `npm run check:native-shells` 会反查 H5 facade 仍使用 `normalizeNativeAppPageUrl(...)` 且发送归一后的 URL,避免明显不安全目标触达原生壳。
|
||||
- 2026-06-18 能力声明收紧:`packages/shared/src/contracts/hostBridge.ts` 提供 HostBridge method / capability 白名单,H5 的 `getHostRuntime()` 会解析并过滤 `hostCapabilities`;`openHostShare`、`writeHostClipboardText`、`requestHostHapticsImpact`、`setHostAppTitle`、`exportHostTextFile` 等 native 能力只在宿主声明对应 capability 后调用。发布分享弹窗只有声明 `share.open` 时才显示“系统分享”,避免旧壳或裁剪壳露出不可用入口。
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -303,6 +303,7 @@ const expectedDesktopHostBridgeRustFiles = [
|
||||
'capabilities.rs',
|
||||
'clipboard.rs',
|
||||
'dispatch.rs',
|
||||
'file_payloads.rs',
|
||||
'files.rs',
|
||||
'mod.rs',
|
||||
'navigation.rs',
|
||||
|
||||
Reference in New Issue
Block a user