diff options
| -rw-r--r-- | mullvad-daemon/src/settings.rs | 103 |
1 files changed, 54 insertions, 49 deletions
diff --git a/mullvad-daemon/src/settings.rs b/mullvad-daemon/src/settings.rs index 490c7db849..591143e38b 100644 --- a/mullvad-daemon/src/settings.rs +++ b/mullvad-daemon/src/settings.rs @@ -30,31 +30,7 @@ pub struct SettingsPersister { impl SettingsPersister { pub fn load() -> Self { - let mut settings = match Self::load_settings_from_file() { - Ok(settings) => settings, - #[cfg(windows)] - Err(LoadSettingsError::FileNotFound) => { - if Self::migrate_after_windows_update() { - match Settings::load() { - Ok(settings) => { - info!("Successfully loaded migrated settings"); - settings - } - Err(_) => { - warn!("Failed to load migrated settings, using defaults"); - Settings::default() - } - } - } else { - info!("Failed to migrate settings, using defaults"); - Settings::default() - } - } - Err(_) => { - info!("Failed to load settings, using defaults"); - Settings::default() - } - }; + let mut settings = Self::load_settings(); // Force IPv6 to be enabled on Android if cfg!(target_os = "android") { @@ -64,30 +40,17 @@ impl SettingsPersister { SettingsPersister { settings } } - #[cfg(windows)] - fn migrate_after_windows_update() -> bool { - info!("No settings file found. Attempting migration from Windows Update backup location"); - - match unsafe { - ffi::WinUtil_MigrateAfterWindowsUpdate(Some(log_sink), b"Settings migrator\0".as_ptr()) - } { - ffi::WinUtilMigrationStatus::Success => { - info!("Migration completed successfully"); - true - } - ffi::WinUtilMigrationStatus::Aborted => { - error!("Migration was aborted to avoid overwriting current settings"); - false - } - ffi::WinUtilMigrationStatus::NothingToMigrate => { - info!("Could not migrate settings - no backup present"); - false - } - ffi::WinUtilMigrationStatus::Failed | _ => { - error!("Migration failed"); - false - } - } + fn load_settings() -> Settings { + Self::load_settings_from_file() + .or_else(|error| match error { + #[cfg(windows)] + LoadSettingsError::FileNotFound => Self::try_load_settings_after_windows_update(), + _ => Err(error), + }) + .unwrap_or_else(|_| { + info!("Failed to load settings, using defaults"); + Settings::default() + }) } fn load_settings_from_file() -> Result<Settings, LoadSettingsError> { @@ -117,6 +80,48 @@ impl SettingsPersister { .map_err(|_| LoadSettingsError::Other) } + #[cfg(windows)] + fn try_load_settings_after_windows_update() -> Result<Settings, LoadSettingsError> { + info!("No settings file found. Attempting migration from Windows Update backup location"); + + if Self::migrate_after_windows_update() { + let result = Self::load_settings_from_file(); + + match &result { + Ok(_) => info!("Successfully loaded migrated settings"), + Err(_) => warn!("Failed to load migrated settings, using defaults"), + } + + result + } else { + Err(LoadSettingsError::Other) + } + } + + #[cfg(windows)] + fn migrate_after_windows_update() -> bool { + match unsafe { + ffi::WinUtil_MigrateAfterWindowsUpdate(Some(log_sink), b"Settings migrator\0".as_ptr()) + } { + ffi::WinUtilMigrationStatus::Success => { + info!("Migration completed successfully"); + true + } + ffi::WinUtilMigrationStatus::Aborted => { + error!("Migration was aborted to avoid overwriting current settings"); + false + } + ffi::WinUtilMigrationStatus::NothingToMigrate => { + info!("Could not migrate settings - no backup present"); + false + } + ffi::WinUtilMigrationStatus::Failed | _ => { + error!("Migration failed"); + false + } + } + } + pub fn to_settings(&self) -> Settings { self.settings.clone() } |
