Skip to content

Commit 6e2b93d

Browse files
committed
Merge branch 'fix-settings-version' into main
2 parents b6c9aba + 2e1d01d commit 6e2b93d

File tree

2 files changed

+48
-16
lines changed
  • mullvad-daemon/src/migrations
  • mullvad-types/src/settings

2 files changed

+48
-16
lines changed

mullvad-daemon/src/migrations/mod.rs

+47-15
Original file line numberDiff line numberDiff line change
@@ -133,23 +133,9 @@ pub async fn migrate_all(cache_dir: &Path, settings_dir: &Path) -> Result<Option
133133
let mut settings: serde_json::Value =
134134
serde_json::from_reader(&settings_bytes[..]).map_err(Error::Deserialize)?;
135135

136-
if !settings.is_object() {
137-
return Err(Error::InvalidSettingsContent);
138-
}
139-
140136
let old_settings = settings.clone();
141137

142-
v1::migrate(&mut settings)?;
143-
v2::migrate(&mut settings)?;
144-
v3::migrate(&mut settings)?;
145-
v4::migrate(&mut settings)?;
146-
147-
account_history::migrate_location(cache_dir, settings_dir).await;
148-
account_history::migrate_formats(settings_dir, &mut settings).await?;
149-
150-
let migration_data = v5::migrate(&mut settings)?;
151-
v6::migrate(&mut settings)?;
152-
v7::migrate(&mut settings)?;
138+
let migration_data = migrate_settings(Some((cache_dir, settings_dir)), &mut settings).await?;
153139

154140
if settings == old_settings {
155141
// Nothing changed
@@ -175,6 +161,31 @@ pub async fn migrate_all(cache_dir: &Path, settings_dir: &Path) -> Result<Option
175161
Ok(migration_data)
176162
}
177163

164+
async fn migrate_settings(
165+
directories: Option<(&Path, &Path)>,
166+
settings: &mut serde_json::Value,
167+
) -> Result<Option<MigrationData>> {
168+
if !settings.is_object() {
169+
return Err(Error::InvalidSettingsContent);
170+
}
171+
172+
v1::migrate(settings)?;
173+
v2::migrate(settings)?;
174+
v3::migrate(settings)?;
175+
v4::migrate(settings)?;
176+
177+
if let Some((cache_dir, settings_dir)) = directories {
178+
account_history::migrate_location(cache_dir, settings_dir).await;
179+
account_history::migrate_formats(settings_dir, settings).await?;
180+
}
181+
182+
let migration_data = v5::migrate(settings)?;
183+
v6::migrate(settings)?;
184+
v7::migrate(settings)?;
185+
186+
Ok(migration_data)
187+
}
188+
178189
pub(crate) fn migrate_device(
179190
migration_data: MigrationData,
180191
rest_handle: mullvad_api::rest::MullvadRestHandle,
@@ -383,3 +394,24 @@ mod windows {
383394
unsafe { IsWellKnownSid(sid as *const SID as *mut _, well_known_sid_type) == 1 }
384395
}
385396
}
397+
398+
#[cfg(test)]
399+
mod test {
400+
use mullvad_types::settings::Settings;
401+
402+
use crate::migrations::migrate_settings;
403+
404+
/// Ensure that no migration logic runs for the default settings by checking whether anything
405+
/// has changed after running the migration code
406+
#[tokio::test]
407+
async fn test_settings_format_version() {
408+
let default_settings = serde_json::to_value(Settings::default()).unwrap();
409+
let mut migrated_settings = default_settings.clone();
410+
411+
migrate_settings(None, &mut migrated_settings)
412+
.await
413+
.unwrap();
414+
415+
assert_eq!(default_settings, migrated_settings);
416+
}
417+
}

mullvad-types/src/settings/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ mod dns;
2121
/// latest version that exists in `SettingsVersion`.
2222
/// This should be bumped when a new version is introduced along with a migration
2323
/// being added to `mullvad-daemon`.
24-
pub const CURRENT_SETTINGS_VERSION: SettingsVersion = SettingsVersion::V7;
24+
pub const CURRENT_SETTINGS_VERSION: SettingsVersion = SettingsVersion::V8;
2525

2626
#[derive(Debug, PartialEq, Eq, PartialOrd, Clone, Copy)]
2727
#[repr(u32)]

0 commit comments

Comments
 (0)