summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOskar <oskar@mullvad.net>2025-07-01 14:01:47 +0200
committerOskar <oskar@mullvad.net>2025-07-04 12:48:35 +0200
commit116e068b577aa26554d593acfb0e8ef37e72f52f (patch)
treefdc55ac1f6de75c004318692d8afb112287f8d76
parent4fb0191a259a62efc1264ae71135a9114ce99fd7 (diff)
downloadmullvadvpn-116e068b577aa26554d593acfb0e8ef37e72f52f.tar.xz
mullvadvpn-116e068b577aa26554d593acfb0e8ef37e72f52f.zip
Add rpc call to get in-app upgrade cache dir
-rw-r--r--mullvad-daemon/src/lib.rs24
-rw-r--r--mullvad-daemon/src/management_interface.rs17
-rw-r--r--mullvad-daemon/src/version/router.rs23
-rw-r--r--mullvad-management-interface/proto/management_interface.proto1
4 files changed, 64 insertions, 1 deletions
diff --git a/mullvad-daemon/src/lib.rs b/mullvad-daemon/src/lib.rs
index 5550ef3a8a..efdbea5cc6 100644
--- a/mullvad-daemon/src/lib.rs
+++ b/mullvad-daemon/src/lib.rs
@@ -427,6 +427,8 @@ pub enum DaemonCommand {
AppUpgrade(ResponseTx<(), version::Error>),
/// Prompt the daemon to abort the current upgrade.
AppUpgradeAbort(ResponseTx<(), version::Error>),
+ /// Return the storage path for the installers during in-app upgrades.
+ GetAppUpgradeCacheDir(ResponseTx<PathBuf, version::Error>),
}
/// All events that can happen in the daemon. Sent from various threads and exposed interfaces.
@@ -1511,6 +1513,7 @@ impl Daemon {
EnableRelay { relay, tx } => self.on_toggle_relay(relay, true, tx),
AppUpgrade(tx) => self.on_app_upgrade(tx).await,
AppUpgradeAbort(tx) => self.on_app_upgrade_abort(tx).await,
+ GetAppUpgradeCacheDir(tx) => self.on_get_app_upgrade_cache_dir(tx).await,
}
}
@@ -3326,6 +3329,27 @@ impl Daemon {
};
}
+ #[cfg_attr(not(in_app_upgrade), allow(clippy::unused_async))]
+ async fn on_get_app_upgrade_cache_dir(&self, tx: ResponseTx<PathBuf, version::Error>) {
+ #[cfg(in_app_upgrade)]
+ {
+ let result = self.version_handle.get_cache_dir().await;
+ Self::oneshot_send(tx, result, "on_get_app_upgrade_cache_dir response");
+ }
+ #[cfg(not(in_app_upgrade))]
+ {
+ log::warn!(
+ "Can't get cache dir for app upgrades since in-app upgrades are disabled on this OS"
+ );
+
+ Self::oneshot_send(
+ tx,
+ Ok(PathBuf::new()),
+ "on_get_app_upgrade_cache_dir response",
+ )
+ };
+ }
+
/// Set the target state of the client. If it changed trigger the operations needed to
/// progress towards that state.
/// Returns a bool representing whether a state change was initiated.
diff --git a/mullvad-daemon/src/management_interface.rs b/mullvad-daemon/src/management_interface.rs
index aef1d17c45..a578b67610 100644
--- a/mullvad-daemon/src/management_interface.rs
+++ b/mullvad-daemon/src/management_interface.rs
@@ -1217,6 +1217,23 @@ impl ManagementService for ManagementServiceImpl {
Box::new(upgrade_event_stream) as Self::AppUpgradeEventsListenStream
))
}
+
+ async fn get_app_upgrade_cache_dir(&self, _: Request<()>) -> ServiceResult<String> {
+ log::debug!("get_app_upgrade_cache_dir");
+
+ let (tx, rx) = oneshot::channel();
+ self.send_command_to_daemon(DaemonCommand::GetAppUpgradeCacheDir(tx))?;
+
+ let path = self
+ .wait_for_result(rx)
+ .await?
+ .map_err(map_version_check_error)?;
+
+ path.into_os_string()
+ .into_string()
+ .map_err(|_| Status::internal("Failed to convert OsString to String"))
+ .map(Response::new)
+ }
}
impl ManagementServiceImpl {
diff --git a/mullvad-daemon/src/version/router.rs b/mullvad-daemon/src/version/router.rs
index 7a10c90bcf..a1b81ebabe 100644
--- a/mullvad-daemon/src/version/router.rs
+++ b/mullvad-daemon/src/version/router.rs
@@ -67,6 +67,15 @@ impl VersionRouterHandle {
.map_err(|_| Error::VersionRouterClosed)?;
result_rx.await.map_err(|_| Error::VersionRouterClosed)
}
+
+ #[cfg(in_app_upgrade)]
+ pub async fn get_cache_dir(&self) -> Result<PathBuf> {
+ let (result_tx, result_rx) = oneshot::channel();
+ self.tx
+ .send(Message::GetCacheDir { result_tx })
+ .map_err(|_| Error::VersionRouterClosed)?;
+ result_rx.await.map_err(|_| Error::VersionRouterClosed)
+ }
}
// These wrapper traits and type aliases exist to help feature gate the module
@@ -106,6 +115,8 @@ struct VersionRouter<S = DaemonEventSender<AppVersionInfo>, D = DefaultDownloade
/// Broadcast channel for app upgrade events
#[cfg(in_app_upgrade)]
app_upgrade_broadcast: AppUpgradeBroadcast,
+ #[cfg(in_app_upgrade)]
+ cache_dir: PathBuf,
/// Type used to spawn the downloader task, replaced when testing
_phantom: std::marker::PhantomData<D>,
}
@@ -124,6 +135,9 @@ enum Message {
/// Cancel the ongoing update
#[cfg(in_app_upgrade)]
CancelUpdate { result_tx: oneshot::Sender<()> },
+ /// Get the cache dir
+ #[cfg(in_app_upgrade)]
+ GetCacheDir { result_tx: oneshot::Sender<PathBuf> },
}
#[derive(Debug)]
@@ -215,7 +229,7 @@ pub(crate) fn spawn_version_router(
VersionUpdater::spawn(
api_handle,
availability_handle,
- cache_dir,
+ cache_dir.clone(),
new_version_tx,
refresh_version_check_rx,
)
@@ -230,6 +244,8 @@ pub(crate) fn spawn_version_router(
version_request_channels: vec![],
#[cfg(in_app_upgrade)]
app_upgrade_broadcast,
+ #[cfg(in_app_upgrade)]
+ cache_dir,
refresh_version_check_tx,
_phantom: std::marker::PhantomData::<DefaultDownloader>,
}
@@ -298,6 +314,10 @@ where
self.cancel_upgrade();
let _ = result_tx.send(());
}
+ #[cfg(in_app_upgrade)]
+ Message::GetCacheDir { result_tx } => {
+ let _ = result_tx.send(self.cache_dir.clone());
+ }
}
}
@@ -723,6 +743,7 @@ mod test {
version_request_channels: vec![],
app_upgrade_broadcast,
refresh_version_check_tx,
+ cache_dir: PathBuf::new(),
_phantom: std::marker::PhantomData::<D>,
},
VersionRouterChannels {
diff --git a/mullvad-management-interface/proto/management_interface.proto b/mullvad-management-interface/proto/management_interface.proto
index 14a11fff4e..6d0577ebf0 100644
--- a/mullvad-management-interface/proto/management_interface.proto
+++ b/mullvad-management-interface/proto/management_interface.proto
@@ -140,6 +140,7 @@ service ManagementService {
rpc AppUpgrade(google.protobuf.Empty) returns (google.protobuf.Empty) {}
rpc AppUpgradeAbort(google.protobuf.Empty) returns (google.protobuf.Empty) {}
rpc AppUpgradeEventsListen(google.protobuf.Empty) returns (stream AppUpgradeEvent) {}
+ rpc GetAppUpgradeCacheDir(google.protobuf.Empty) returns (google.protobuf.StringValue) {}
}
message AppUpgradeEvent {