diff options
| author | David Lönnhager <david.l@mullvad.net> | 2025-02-12 22:10:34 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2025-03-05 23:32:01 +0100 |
| commit | 7e86e610ec9330c038dda59f70cc6cc8b7f099f5 (patch) | |
| tree | beb7902f95e1dd5c6e442901b53b7826483c8a3e | |
| parent | 0d789aa30a2f21217d5f0894c3056f2c9923b5c1 (diff) | |
| download | mullvadvpn-7e86e610ec9330c038dda59f70cc6cc8b7f099f5.tar.xz mullvadvpn-7e86e610ec9330c038dda59f70cc6cc8b7f099f5.zip | |
Always fail if there are duplicate versions
| -rw-r--r-- | mullvad-update/src/api.rs | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/mullvad-update/src/api.rs b/mullvad-update/src/api.rs index bcb5dd951a..debadb0682 100644 --- a/mullvad-update/src/api.rs +++ b/mullvad-update/src/api.rs @@ -89,8 +89,20 @@ impl VersionInfo { params: &VersionParameters, response: format::Response, ) -> anyhow::Result<Self> { - let mut releases: Vec<_> = response - .releases + let mut releases = response.releases; + + // Sort releases by version + releases.sort_by(|a, b| mullvad_version::Version::version_ordering(&a.version, &b.version)); + + // Fail if there are duplicate versions. + // Check this before anything else so that it's rejected indepentently of `params`. + // Important! This must occur after sorting + if let Some(dup_version) = Self::find_duplicate_version(&releases) { + anyhow::bail!("API response contains at least one duplicated version: {dup_version}"); + } + + // Filter releases based on rollout and architecture + let releases: Vec<_> = releases .into_iter() // Filter out releases that are not rolled out to us .filter(|release| release.rollout >= params.rollout) @@ -111,15 +123,6 @@ impl VersionInfo { }) .collect(); - // Sort releases by version - releases.sort_by(|a, b| mullvad_version::Version::version_ordering(&a.version, &b.version)); - - // Fail if there are duplicate versions - // Important! This must occur after sorting - if let Some(dup_version) = Self::find_duplicate_version(&releases) { - anyhow::bail!("API response contains at least one duplicated version: {dup_version}"); - } - // Find latest stable version let stable = releases .iter() @@ -146,9 +149,7 @@ impl VersionInfo { /// Returns the first duplicated version found in `releases`. /// `None` is returned if there are no duplicates. /// NOTE: `releases` MUST be sorted - fn find_duplicate_version( - releases: &[IntermediateVersion], - ) -> Option<&mullvad_version::Version> { + fn find_duplicate_version(releases: &[format::Release]) -> Option<&mullvad_version::Version> { releases .windows(2) .find(|pair| { |
