diff --git a/apps/desktop-shell/scripts/check-config.mjs b/apps/desktop-shell/scripts/check-config.mjs index ccaf2b317..61754135b 100644 --- a/apps/desktop-shell/scripts/check-config.mjs +++ b/apps/desktop-shell/scripts/check-config.mjs @@ -2666,6 +2666,7 @@ const requiredRustHostSnippets = [ 'log_desktop_network_probe_failure', 'desktop network reachability probe failed', 'desktop_network_reachability_reports_missing_probe_target', + 'desktop_network_probe_failure_logs_stable_label_only', 'register_desktop_navigation_events', 'desktop_navigation_state_script', 'navigation.canGoBack', @@ -2794,6 +2795,10 @@ if ( throw new Error('desktop HostBridge replay diagnostics must not log Rust error details'); } +if (desktopShellNetworkSource.includes('desktop network reachability probe failed: {reason}')) { + throw new Error('desktop network probe diagnostics must not log resolver or connection details'); +} + assertSameList( allowedTauriCommands, ['host_bridge_request'], diff --git a/apps/desktop-shell/src-tauri/src/shell/network.rs b/apps/desktop-shell/src-tauri/src/shell/network.rs index 7d0c2c5dd..bb71efb13 100644 --- a/apps/desktop-shell/src-tauri/src/shell/network.rs +++ b/apps/desktop-shell/src-tauri/src/shell/network.rs @@ -64,8 +64,8 @@ fn resolve_desktop_network_reachability( )) } -fn log_desktop_network_probe_failure(reason: &str) { - eprintln!("desktop network reachability probe failed: {reason}"); +fn log_desktop_network_probe_failure(_reason: &str) { + eprintln!("desktop network reachability probe failed"); } pub(crate) fn resolve_desktop_network_status() -> Value { @@ -131,4 +131,9 @@ mod tests { Err("network probe target unavailable".to_string()) ); } + + #[test] + fn desktop_network_probe_failure_logs_stable_label_only() { + log_desktop_network_probe_failure("private network detail"); + } } diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index 4add90ed4..fd78876fa 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -2997,7 +2997,7 @@ ## 2026-06-20 桌面壳网络探测失败不可静默 - 背景:Tauri 桌面壳 `network.status` 会把主站 TCP 可达性作为当前宿主网络状态;如果探测目标解析、DNS 或 TCP 连接失败后只折叠为 offline,H5 可以收到离线状态,但开发侧无法判断是配置、解析还是连接问题。 -- 决策:`resolve_desktop_network_status()` 必须通过 `resolve_desktop_network_reachability(...)` 得到可达性或失败原因;失败时记录 `desktop network reachability probe failed: ...`,再继续按离线 payload 返回。配置检查拒绝网络探测重新用 `.to_socket_addrs().ok()` 或 `connect_timeout(...).map(...).unwrap_or(false)` 静默吞错。 +- 决策:`resolve_desktop_network_status()` 必须通过 `resolve_desktop_network_reachability(...)` 得到可达性或失败原因;失败时只记录 `desktop network reachability probe failed` 固定标签,再继续按离线 payload 返回,不把解析目标、DNS 或 TCP 错误详情写入可分发桌面壳 stderr。配置检查拒绝网络探测重新用 `.to_socket_addrs().ok()` 或 `connect_timeout(...).map(...).unwrap_or(false)` 静默吞错,也拒绝重新拼接 `: {reason}`。 - 影响范围:`apps/desktop-shell/src-tauri/src/shell/network.rs`、`apps/desktop-shell/scripts/check-config.mjs`。 - 验证方式:`cargo test --manifest-path apps/desktop-shell/src-tauri/Cargo.toml shell::network`、`npm run desktop-shell:typecheck`、`npm run check:native-shells`、`npm run check:encoding`、`git diff --check`。 diff --git a/docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md b/docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md index 4058b7295..2e9d53b30 100644 --- a/docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md +++ b/docs/【前端架构】ExpoReactNative与Tauri宿主壳方案-2026-06-17.md @@ -361,6 +361,8 @@ GameBridge 禁止: 2026-06-20 追加:桌面壳网络状态查询系统异常必须可观测。Tauri 桌面壳后台解析网络状态任务失败时必须记录 `desktop network failed for status.resolve` 日志;HostBridge 回包仍只暴露稳定 `network status unavailable` 语义,不透传 resolver、线程或系统错误细节。2026-06-21 调整:该日志只记录固定标签,不把后台任务 join 错误或 resolver 异常写入 stderr。 +2026-06-21 追加:桌面壳主站可达性探测失败诊断只允许记录 `desktop network reachability probe failed` 固定标签,不把探测 host / port、DNS 解析错误或 TCP 连接错误写入可分发桌面壳 stderr;`network.status` 回包继续只表达在线 / 离线稳定状态。 + 2026-06-20 追加:桌面壳分享缓存内部异常必须可观测。Tauri 桌面壳读写 `share.setTarget` 缓存失败时必须记录 `desktop share failed for ...` 日志;HostBridge 回包仍只暴露稳定 `share unavailable` 语义,不透传锁状态、内部缓存状态或 Rust 同步原语细节。2026-06-21 调整:该日志只记录 `desktop share failed for target.lock` / `desktop share failed for target.store` 固定标签,不把锁异常说明写入 stderr。 2026-06-18 追加:H5 账号状态刷新开始消费 `app.reloadWebView`。用户登录成功、退出登录、其它身份边界变化或登录状态异常页点击重新尝试时,`AuthGate` 会优先请求 Expo 壳刷新当前 WebView;宿主未声明或刷新失败时再回退浏览器刷新,避免在移动壳内绕过受控容器刷新入口。