diff options
| author | Oskar <oskar@mullvad.net> | 2025-07-01 14:01:47 +0200 |
|---|---|---|
| committer | Oskar <oskar@mullvad.net> | 2025-07-04 12:48:35 +0200 |
| commit | 116e068b577aa26554d593acfb0e8ef37e72f52f (patch) | |
| tree | fdc55ac1f6de75c004318692d8afb112287f8d76 | |
| parent | 4fb0191a259a62efc1264ae71135a9114ce99fd7 (diff) | |
| download | mullvadvpn-116e068b577aa26554d593acfb0e8ef37e72f52f.tar.xz mullvadvpn-116e068b577aa26554d593acfb0e8ef37e72f52f.zip | |
Add rpc call to get in-app upgrade cache dir
| -rw-r--r-- | mullvad-daemon/src/lib.rs | 24 | ||||
| -rw-r--r-- | mullvad-daemon/src/management_interface.rs | 17 | ||||
| -rw-r--r-- | mullvad-daemon/src/version/router.rs | 23 | ||||
| -rw-r--r-- | mullvad-management-interface/proto/management_interface.proto | 1 |
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 { |
