From 55d5a9358b3726cef83ddbaeed422978b9343f1e Mon Sep 17 00:00:00 2001 From: NimBold Date: Sat, 22 Aug 2026 01:59:59 +0330 Subject: [PATCH] fix(settings): harden persisted consumer state - validate complete settings snapshots before replacing durable state - sanitize malformed proxy, user-agent, sidebar, speed, and path values at native and renderer hydration boundaries - add hostile persisted-settings regression coverage --- src-tauri/src/lib.rs | 6 +++- src-tauri/src/settings.rs | 57 +++++++++++++++++++++++++++++- src/store/useSettingsStore.test.ts | 26 ++++++++++++++ src/store/useSettingsStore.ts | 38 +++++++++++++++++--- 4 files changed, 120 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index b392feb..856669b 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -10912,8 +10912,12 @@ fn db_save_settings( crate::db::preserve_legacy_pairing_token(existing.as_deref(), &sanitized)? }; let merged = crate::settings::canonicalize_torrent_network_settings(&merged)?; + let decoded = crate::settings::decode_stored_settings(&serde_json::Value::String(merged.clone()))?; + // Validate the complete settings document before replacing the durable + // copy. A malformed renderer snapshot must not poison restart hydration or + // leave the previous valid settings unrecoverable after this command + // reports an error. crate::db::save_settings(&connection, &merged)?; - let decoded = crate::settings::decode_stored_settings(&serde_json::Value::String(merged))?; let prevent_system_sleep = decoded.prevents_sleep_while_downloading; let prevent_display_sleep = decoded.prevents_display_sleep_while_downloading; if let Ok(mut cached) = app_state.scheduler_settings.write() { diff --git a/src-tauri/src/settings.rs b/src-tauri/src/settings.rs index 2cdf04e..ad9f19d 100644 --- a/src-tauri/src/settings.rs +++ b/src-tauri/src/settings.rs @@ -229,6 +229,19 @@ pub fn canonicalize_torrent_network_settings(stored: &str) -> Result