summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-01-20 19:35:23 +0100
committerDavid Lönnhager <david.l@mullvad.net>2021-01-22 13:09:15 +0100
commit6edc7c6746c69ea6a438773c7bb7716c08ac9d9c (patch)
tree2b9e701703b68304d72bb2d734c5fd9f7cabb01f
parenta013f4aaf542d7caa3240d4e30c5f8e5976bdb03 (diff)
downloadmullvadvpn-6edc7c6746c69ea6a438773c7bb7716c08ac9d9c.tar.xz
mullvadvpn-6edc7c6746c69ea6a438773c7bb7716c08ac9d9c.zip
Fetch new version info if there is no cache
-rw-r--r--mullvad-daemon/src/lib.rs10
-rw-r--r--mullvad-daemon/src/version_check.rs46
2 files changed, 46 insertions, 10 deletions
diff --git a/mullvad-daemon/src/lib.rs b/mullvad-daemon/src/lib.rs
index 2c943296aa..abf5d9962a 100644
--- a/mullvad-daemon/src/lib.rs
+++ b/mullvad-daemon/src/lib.rs
@@ -1098,7 +1098,7 @@ where
GenerateWireguardKey(tx) => self.on_generate_wireguard_key(tx).await,
GetWireguardKey(tx) => self.on_get_wireguard_key(tx).await,
VerifyWireguardKey(tx) => self.on_verify_wireguard_key(tx).await,
- GetVersionInfo(tx) => self.on_get_version_info(tx),
+ GetVersionInfo(tx) => self.on_get_version_info(tx).await,
GetCurrentVersion(tx) => self.on_get_current_version(tx),
#[cfg(not(target_os = "android"))]
FactoryReset(tx) => self.on_factory_reset(tx).await,
@@ -1468,7 +1468,13 @@ where
}
}
- fn on_get_version_info(&mut self, tx: oneshot::Sender<Option<AppVersionInfo>>) {
+ async fn on_get_version_info(&mut self, tx: oneshot::Sender<Option<AppVersionInfo>>) {
+ if self.app_version_info.is_none() {
+ log::debug!("No version cache found. Fetching new info");
+ let mut handle = self.version_updater_handle.clone();
+ handle.run_version_check().await;
+ }
+
Self::oneshot_send(
tx,
self.app_version_info.clone(),
diff --git a/mullvad-daemon/src/version_check.rs b/mullvad-daemon/src/version_check.rs
index 340ea24600..acb2239d37 100644
--- a/mullvad-daemon/src/version_check.rs
+++ b/mullvad-daemon/src/version_check.rs
@@ -89,20 +89,43 @@ pub(crate) struct VersionUpdater {
platform_version: String,
next_update_time: Instant,
show_beta_releases: bool,
- rx: Option<mpsc::Receiver<bool>>,
+ rx: Option<mpsc::Receiver<VersionUpdaterCommand>>,
}
#[derive(Clone)]
pub(crate) struct VersionUpdaterHandle {
- tx: mpsc::Sender<bool>,
+ tx: mpsc::Sender<VersionUpdaterCommand>,
+}
+
+enum VersionUpdaterCommand {
+ SetShowBetaReleases(bool),
+ RunVersionCheck,
}
impl VersionUpdaterHandle {
pub async fn set_show_beta_releases(&mut self, show_beta_releases: bool) {
- if self.tx.send(show_beta_releases).await.is_err() {
+ if self
+ .tx
+ .send(VersionUpdaterCommand::SetShowBetaReleases(
+ show_beta_releases,
+ ))
+ .await
+ .is_err()
+ {
log::error!("Version updater already down, can't send new `show_beta_releases` state");
}
}
+
+ pub async fn run_version_check(&mut self) {
+ if self
+ .tx
+ .send(VersionUpdaterCommand::RunVersionCheck)
+ .await
+ .is_err()
+ {
+ log::error!("Version updater already down");
+ }
+ }
}
impl VersionUpdater {
@@ -244,15 +267,22 @@ impl VersionUpdater {
loop {
futures::select! {
- show_beta_releases = rx.next() => {
- match show_beta_releases {
- Some(show_beta_releases ) => {
+ command = rx.next() => {
+ match command {
+ Some(VersionUpdaterCommand::SetShowBetaReleases(show_beta_releases)) => {
self.show_beta_releases = show_beta_releases;
- },
+ }
+ Some(VersionUpdaterCommand::RunVersionCheck) => {
+ if self.update_sender.is_closed() {
+ return;
+ }
+ let download_future = self.create_update_future().fuse();
+ version_check = download_future;
+ }
// time to shut down
None => {
return;
- },
+ }
}
},