diff options
| author | David Lönnhager <david.l@mullvad.net> | 2025-08-29 13:25:14 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2025-08-29 13:25:14 +0200 |
| commit | 4f03db1de3224d666cf6fc5ab255f3629435a59a (patch) | |
| tree | 444c4a37a3b24f275af9131badeb06a1b109951f | |
| parent | b1390ed043db3889382da6e9b788102ee1ebeb95 (diff) | |
| parent | 87f9305942b0144796837160652b9e9e9243e6bd (diff) | |
| download | mullvadvpn-4f03db1de3224d666cf6fc5ab255f3629435a59a.tar.xz mullvadvpn-4f03db1de3224d666cf6fc5ab255f3629435a59a.zip | |
Merge branch 'linux-query-metadata-version'
6 files changed, 95 insertions, 4 deletions
diff --git a/installer-downloader/src/controller.rs b/installer-downloader/src/controller.rs index 94a1a84e73..2dad0d0c90 100644 --- a/installer-downloader/src/controller.rs +++ b/installer-downloader/src/controller.rs @@ -215,6 +215,7 @@ where architecture, // For the downloader, the rollout version is always preferred rollout: mullvad_update::version::IGNORE, + allow_empty: false, // The downloader allows any version lowest_metadata_version: mullvad_update::version::MIN_VERIFY_METADATA_VERSION, }; diff --git a/mullvad-api/src/version.rs b/mullvad-api/src/version.rs index ff8d647e09..a78e1d784f 100644 --- a/mullvad-api/src/version.rs +++ b/mullvad-api/src/version.rs @@ -85,6 +85,8 @@ impl AppVersionProxy { let params = VersionParameters { architecture, rollout, + // NOTE: On Linux, version metadata contains no installers + allow_empty: cfg!(target_os = "linux"), lowest_metadata_version, }; diff --git a/mullvad-update/src/client/snapshots/mullvad_update__client__api__test__http_version_provider.snap b/mullvad-update/src/client/snapshots/mullvad_update__client__api__test__http_version_provider.snap index a7266769fc..0ab318fa1f 100644 --- a/mullvad-update/src/client/snapshots/mullvad_update__client__api__test__http_version_provider.snap +++ b/mullvad-update/src/client/snapshots/mullvad_update__client__api__test__http_version_provider.snap @@ -6,10 +6,10 @@ snapshot_kind: text signatures: - keytype: ed25519 keyid: bb4ef63ffdcc6bd5a19c30cd23b9de03099407a04463418f17ae338b98aa09d4 - sig: 253ec37846dcd909bfc5119c0e0d06535767e179eb8b4465015eaa95f4bed362c8c9186311192c987871722bf7d319d44e4f04eaf79c269820bc13ff1a901f0b + sig: fb0f0d608f82101ca294c9150ce268c29bdaf99d4a726541e59523ef00b0d534d65cac277f1355e2838f5ac1b1f1e7013411da70049ba19a208515c67a97de06 signed: metadata_version: 0 - metadata_expiry: "2025-07-02T15:33:00Z" + metadata_expiry: "2025-10-02T15:33:00Z" releases: - version: "2025.2" changelog: "[macos] Adding support for quicfuscator\n[windows] Less bugs" @@ -64,3 +64,6 @@ signed: - "https://releases.mullvad.net/desktop/releases/2025.3-beta1/MullvadVPN-2025.3-beta1_arm64.exe" size: 111488248 sha256: 82948D3DB5B869EE5F0D246DB557A81B72B68DFDDD2267872B7B8A5B19A05444 + - version: "2026.10" + changelog: "" + installers: [] diff --git a/mullvad-update/src/snapshots/mullvad_update__version__test__version_info_empty.snap b/mullvad-update/src/snapshots/mullvad_update__version__test__version_info_empty.snap new file mode 100644 index 0000000000..6c5a8fc498 --- /dev/null +++ b/mullvad-update/src/snapshots/mullvad_update__version__test__version_info_empty.snap @@ -0,0 +1,44 @@ +--- +source: mullvad-update/src/version.rs +expression: info +snapshot_kind: text +--- +stable: + version: "2026.10" + urls: [] + size: 0 + changelog: "" + sha256: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 +beta: ~ diff --git a/mullvad-update/src/version.rs b/mullvad-update/src/version.rs index 19b83aa511..94b3f52e38 100644 --- a/mullvad-update/src/version.rs +++ b/mullvad-update/src/version.rs @@ -22,6 +22,8 @@ pub struct VersionParameters { pub architecture: VersionArchitecture, /// Rollout threshold. Any version in the response below this threshold will be ignored pub rollout: Rollout, + /// Allow versions without any installers to be returned + pub allow_empty: bool, /// Lowest allowed `metadata_version` in the version data /// Typically the current version plus 1 pub lowest_metadata_version: usize, @@ -85,6 +87,16 @@ impl VersionInfo { // Filter out dev versions .filter(|release| !release.version.is_dev()) .flat_map(|format::Release { version, changelog, installers, .. }| { + if installers.is_empty() && params.allow_empty { + // HACK: If there are no installers (e.g. on Linux), return the version anyway + return Some(anyhow::Ok(Version { + version, + size: 0, + urls: vec![], + changelog, + sha256: [0u8; 32], + })); + } installers .into_iter() // Find installer for the requested architecture (assumed to be unique) @@ -145,6 +157,7 @@ mod test { let params = VersionParameters { architecture: VersionArchitecture::X86, rollout: 1., + allow_empty: false, lowest_metadata_version: 0, }; @@ -166,6 +179,7 @@ mod test { let params = VersionParameters { architecture: VersionArchitecture::Arm64, rollout: 0.01, + allow_empty: false, lowest_metadata_version: 0, }; @@ -176,4 +190,26 @@ mod test { Ok(()) } + + /// Versions without installers should be returned if `allow_empty` is set + #[test] + fn test_version_info_empty() -> anyhow::Result<()> { + let response = format::SignedResponse::deserialize_insecure(include_bytes!( + "../test-version-response.json" + ))?; + + let params = VersionParameters { + architecture: VersionArchitecture::X86, + rollout: 0.01, + allow_empty: true, + lowest_metadata_version: 0, + }; + + let info = VersionInfo::try_from_response(¶ms, response.signed)?; + + // Expect: The available latest versions for x86, where the rollout is .01. + assert_yaml_snapshot!(info); + + Ok(()) + } } diff --git a/mullvad-update/test-version-response.json b/mullvad-update/test-version-response.json index b6466e48c2..17e3c57aba 100644 --- a/mullvad-update/test-version-response.json +++ b/mullvad-update/test-version-response.json @@ -3,12 +3,12 @@ { "keytype": "ed25519", "keyid": "bb4ef63ffdcc6bd5a19c30cd23b9de03099407a04463418f17ae338b98aa09d4", - "sig": "253ec37846dcd909bfc5119c0e0d06535767e179eb8b4465015eaa95f4bed362c8c9186311192c987871722bf7d319d44e4f04eaf79c269820bc13ff1a901f0b" + "sig": "fb0f0d608f82101ca294c9150ce268c29bdaf99d4a726541e59523ef00b0d534d65cac277f1355e2838f5ac1b1f1e7013411da70049ba19a208515c67a97de06" } ], "signed": { "metadata_version": 0, - "metadata_expiry": "2025-07-02T15:33:00Z", + "metadata_expiry": "2025-10-02T15:33:00Z", "releases": [ { "version": "2025.2", @@ -98,6 +98,11 @@ "sha256": "82948D3DB5B869EE5F0D246DB557A81B72B68DFDDD2267872B7B8A5B19A05444" } ] + }, + { + "version": "2026.10", + "changelog": "", + "installers": [] } ] } |
