summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mullvad-daemon/src/settings.rs103
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()
}