From bb5fb5292c588d22d4c6307de721ae3ba3138159 Mon Sep 17 00:00:00 2001 From: kdletters Date: Sat, 20 Jun 2026 23:41:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B6=E5=8F=A3=E6=A1=8C=E9=9D=A2=E5=A3=B3?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E9=98=BB=E6=96=AD=E8=AF=8A=E6=96=AD=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 桌面壳 WebView 下载阻断日志只记录固定能力标签 扩展桌面壳配置门禁禁止下载阻断日志输出 URL 补充宿主壳方案中的桌面下载诊断边界 --- apps/desktop-shell/scripts/check-config.mjs | 9 +++++++++ .../src-tauri/src/shell/navigation.rs | 14 ++++++++++++-- ...构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md | 2 ++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/apps/desktop-shell/scripts/check-config.mjs b/apps/desktop-shell/scripts/check-config.mjs index 45783267c..20acab2a1 100644 --- a/apps/desktop-shell/scripts/check-config.mjs +++ b/apps/desktop-shell/scripts/check-config.mjs @@ -2677,6 +2677,7 @@ const requiredRustHostSnippets = [ 'handle_desktop_webview_download', 'log_desktop_webview_download_blocked', 'desktop host event blocked for webview.download', + 'desktop_webview_download_blocked_logs_stable_label_only', 'desktop_webview_download_handler_logs_blocked_requests', '.on_download(|_webview, event| handle_desktop_webview_download(&event))', 'NewWindowResponse::Deny', @@ -2718,6 +2719,14 @@ if ( ); } +if ( + desktopShellNavigationSource.includes( + 'eprintln!("desktop host event blocked for webview.download: {url}")', + ) +) { + throw new Error('desktop WebView download diagnostics must not log URLs'); +} + assertSameList( allowedTauriCommands, ['host_bridge_request'], diff --git a/apps/desktop-shell/src-tauri/src/shell/navigation.rs b/apps/desktop-shell/src-tauri/src/shell/navigation.rs index 160d49e09..8ff40270e 100644 --- a/apps/desktop-shell/src-tauri/src/shell/navigation.rs +++ b/apps/desktop-shell/src-tauri/src/shell/navigation.rs @@ -179,8 +179,8 @@ pub(crate) fn should_allow_desktop_webview_download(event: &DownloadEvent<'_>) - } } -fn log_desktop_webview_download_blocked(url: &Url) -> bool { - eprintln!("desktop host event blocked for webview.download: {url}"); +fn log_desktop_webview_download_blocked(_url: &Url) -> bool { + eprintln!("desktop host event blocked for webview.download"); false } @@ -309,6 +309,16 @@ mod tests { assert!(!handle_desktop_webview_download(&requested)); } + #[test] + fn desktop_webview_download_blocked_logs_stable_label_only() { + let url = Url::parse( + "https://app.genarrative.world/download.txt?token=private&work=PZ-1", + ) + .expect("download url"); + + assert!(!log_desktop_webview_download_blocked(&url)); + } + #[test] fn native_page_url_normalization_allows_same_origin_routes() { let route = diff --git a/docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md b/docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md index 04a8da8ab..05c68766d 100644 --- a/docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md +++ b/docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md @@ -525,6 +525,8 @@ GameBridge 禁止: 2026-06-20 追加:桌面壳注入到 H5 的 history 追踪脚本同样只记录稳定标签。Tauri 桌面壳的 `desktop_navigation_state_script` 在 H5 `replaceState` 同步失败时只输出 `desktop navigation state sync failed`,不把页面内 error 对象传给控制台;`apps/desktop-shell/scripts/check-config.mjs` 会拒绝恢复 `console.warn(..., error)` 形式,避免桌面 WebView 内脚本异常对象进入可分发壳诊断日志。 +2026-06-20 追加:桌面壳 WebView 下载阻断诊断只记录固定能力标签。Tauri 主窗口默认拒绝网页自动下载落盘;当 WebView download 事件被阻断时,宿主 stderr 只输出 `desktop host event blocked for webview.download`,不记录完整下载 URL、query、blob 标识或本地路径。`apps/desktop-shell/scripts/check-config.mjs` 会拒绝恢复 `...: {url}` 形式,确保桌面下载诊断不外泄 H5 运行态地址或私有参数。 + 2026-06-18 追加:微信 / Expo / Tauri 三端壳的生产源码和配置禁止出现 mock / fake / placeholder / stub / TODO / FIXME / 占位 / 模拟 / 伪造 / 未实现 / 临时 等脚手架或替身词;测试文件仍可使用 `vi.mock` 或等价测试替身。`apps/mobile-shell/scripts/check-config.mjs` 与 `apps/desktop-shell/scripts/check-config.mjs` 会扫描各自生产入口、配置和壳实现;移动壳 EAS / Expo config / Metro export smoke 脚本也属于可分发验收入口,必须纳入移动壳单端结构清单和替身词扫描。根级 `npm run check:native-shells` 会统一扫描 `miniprogram`、`apps/mobile-shell`、`apps/desktop-shell`、H5 HostBridge transport 和共享 HostBridge 契约生产源码,防止把临时替身或占位文案带进可分发壳。 2026-06-19 追加:H5 HostBridge 真实调用链扫描改为自动发现。根级 `npm run check:native-shells` 会从 `src/` 生产文件里收集直接导入并调用真实宿主能力 facade 的文件,以及 `useHostLifecycleActive`、`useHostNetworkOnline`、`platformProfileHostClipboard` 等薄 wrapper 的消费者;新增 `reloadHostWebView`、`showHostLocalNotification`、`setHostAppBadgeCount`、`importHostTextFile`、`importHostImageFile`、`captureHostImageFile`、`subscribeHostImageDrop`、`readHostClipboardText`、`openHostExternalUrl` 等 H5 调用点时,不再手工维护单个扫描文件清单。登录与支付外链属于敏感跳转路径,`src/services/authService.ts` 和 `src/services/payment/paymentRedirect.ts` 额外列入必扫清单,防止后续绕回裸浏览器跳转却脱离 HostBridge 调用链门禁。H5 业务文件允许正常表单 `placeholder` 属性、业务占位图文案和真实兼容 / 故障语义中的“未实现”“临时”表述,但仍会拒绝 mock / fake / stub / TODO / FIXME / 模拟 / 伪造等替身痕迹。