summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1
-rw-r--r--mullvad-api/Cargo.toml1
-rw-r--r--mullvad-api/src/version.rs16
-rw-r--r--mullvad-daemon/src/version/check.rs38
-rw-r--r--test/Cargo.lock1
5 files changed, 26 insertions, 31 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 3dad552b8f..801bf03b00 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2986,6 +2986,7 @@ dependencies = [
"mullvad-fs",
"mullvad-types",
"mullvad-update",
+ "mullvad-version",
"rustls-pemfile 2.1.3",
"serde",
"serde_json",
diff --git a/mullvad-api/Cargo.toml b/mullvad-api/Cargo.toml
index 1ffd0bc08c..e7750f183e 100644
--- a/mullvad-api/Cargo.toml
+++ b/mullvad-api/Cargo.toml
@@ -53,6 +53,7 @@ mullvad-api-constants = { path = "./mullvad-api-constants" }
mullvad-encrypted-dns-proxy = { path = "../mullvad-encrypted-dns-proxy" }
mullvad-fs = { path = "../mullvad-fs" }
mullvad-types = { path = "../mullvad-types" }
+mullvad-version = { path = "../mullvad-version" }
talpid-types = { path = "../talpid-types" }
talpid-time = { path = "../talpid-time" }
diff --git a/mullvad-api/src/version.rs b/mullvad-api/src/version.rs
index a78e1d784f..2593836aea 100644
--- a/mullvad-api/src/version.rs
+++ b/mullvad-api/src/version.rs
@@ -1,8 +1,9 @@
use std::future::Future;
+use std::str::FromStr;
use std::sync::Arc;
use http::StatusCode;
-use mullvad_update::version::{VersionInfo, VersionParameters};
+use mullvad_update::version::{VersionInfo, VersionParameters, is_version_supported};
type AppVersion = String;
@@ -29,6 +30,8 @@ pub struct AppVersionResponse2 {
/// Index of the metadata version used to sign the response.
/// Used to prevent replay/downgrade attacks.
pub metadata_version: usize,
+ /// Whether or not the current app version (mullvad_version::VERSION) is supported.
+ pub current_version_supported: bool,
}
impl AppVersionProxy {
@@ -66,13 +69,17 @@ impl AppVersionProxy {
architecture: mullvad_update::format::Architecture,
rollout: f32,
lowest_metadata_version: usize,
+ platform_version: String,
) -> impl Future<Output = Result<AppVersionResponse2, rest::Error>> + use<> {
let service = self.handle.service.clone();
let path = format!("app/releases/{platform}.json");
let request = self.handle.factory.get(&path);
async move {
- let request = request?.expected_status(&[StatusCode::OK]);
+ let request = request?
+ .expected_status(&[StatusCode::OK])
+ .header("M-App-Version", mullvad_version::VERSION)?
+ .header("M-Platform-Version", &platform_version)?;
let response = service.request(request).await?;
let bytes = response.body_with_max_size(Self::SIZE_LIMIT).await?;
@@ -90,12 +97,17 @@ impl AppVersionProxy {
lowest_metadata_version,
};
+ let current_version =
+ mullvad_version::Version::from_str(mullvad_version::VERSION).unwrap();
+ let current_version_supported = is_version_supported(current_version, &response.signed);
+
let metadata_version = response.signed.metadata_version;
Ok(AppVersionResponse2 {
version_info: VersionInfo::try_from_response(&params, response.signed)
.map_err(Arc::new)
.map_err(rest::Error::FetchVersions)?,
metadata_version,
+ current_version_supported,
})
}
}
diff --git a/mullvad-daemon/src/version/check.rs b/mullvad-daemon/src/version/check.rs
index 82cfe035be..0fc07cd830 100644
--- a/mullvad-daemon/src/version/check.rs
+++ b/mullvad-daemon/src/version/check.rs
@@ -377,27 +377,11 @@ fn do_version_check_in_background(
}
/// Combine the old version and new version endpoint
-#[cfg(in_app_upgrade)]
+#[cfg(any(in_app_upgrade, target_os = "linux"))]
fn version_check_inner(
api: &ApiContext,
min_metadata_version: usize,
) -> impl Future<Output = Result<VersionCache, Error>> + use<> {
- use futures::future::Either;
- use mullvad_api::version::AppVersionResponse2;
-
- let supported_fut = if !APP_VERSION.is_dev() {
- let v1_endpoint = api.version_proxy.version_check(
- mullvad_version::VERSION.to_owned(),
- PLATFORM,
- api.platform_version.clone(),
- );
- Either::Left(async { Ok(v1_endpoint.await?.supported) })
- } else {
- // NOTE: Treat all dev versions as unsupported. The old endpoint returns 404 for dev
- // versions.
- Either::Right(async { Ok(false) })
- };
-
let architecture = match talpid_platform_metadata::get_native_arch()
.expect("IO error while getting native architecture")
.expect("Failed to get native architecture")
@@ -407,31 +391,27 @@ fn version_check_inner(
mullvad_update::format::Architecture::Arm64
}
};
- let v2_endpoint = api.version_proxy.version_check_2(
+ let endpoint = api.version_proxy.version_check_2(
PLATFORM,
architecture,
mullvad_update::version::SUPPORTED_VERSION,
min_metadata_version,
+ api.platform_version.clone(),
);
async move {
- let (
- current_version_supported,
- AppVersionResponse2 {
- version_info,
- metadata_version,
- },
- ) = tokio::try_join!(supported_fut, v2_endpoint).map_err(Error::Download)?;
+ let result = endpoint.await.map_err(Error::Download)?;
Ok(VersionCache {
cache_version: APP_VERSION.clone(),
- current_version_supported,
- version_info,
- metadata_version,
+ current_version_supported: result.current_version_supported,
+ version_info: result.version_info,
+ #[cfg(in_app_upgrade)]
+ metadata_version: result.metadata_version,
})
}
}
-#[cfg(not(in_app_upgrade))]
+#[cfg(target_os = "android")]
fn version_check_inner(
api: &ApiContext,
// NOTE: This is unused when `update` is disabled
diff --git a/test/Cargo.lock b/test/Cargo.lock
index d03bcc622e..ccdedcc77f 100644
--- a/test/Cargo.lock
+++ b/test/Cargo.lock
@@ -2046,6 +2046,7 @@ dependencies = [
"mullvad-fs",
"mullvad-types",
"mullvad-update",
+ "mullvad-version",
"rustls-pemfile 2.1.3",
"serde",
"serde_json",