summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-01-13 10:15:51 +0100
committerDavid Lönnhager <david.l@mullvad.net>2020-01-14 10:58:10 +0100
commit4e1cc991c41f82cbe8fe173ecf92ff45d9d560e5 (patch)
treec6a4f47b2a666a8c5e61aaaef0292e71e6c3ceb4
parent8dabfcfc8950e9b249a10cf4ebd964f8685dc5dc (diff)
downloadmullvadvpn-4e1cc991c41f82cbe8fe173ecf92ff45d9d560e5.tar.xz
mullvadvpn-4e1cc991c41f82cbe8fe173ecf92ff45d9d560e5.zip
Clear version check cache if the version has changed
-rw-r--r--mullvad-daemon/src/version_check.rs49
1 files changed, 45 insertions, 4 deletions
diff --git a/mullvad-daemon/src/version_check.rs b/mullvad-daemon/src/version_check.rs
index 45352d3e2d..f4e8f60114 100644
--- a/mullvad-daemon/src/version_check.rs
+++ b/mullvad-daemon/src/version_check.rs
@@ -1,8 +1,10 @@
+use crate::version::PRODUCT_VERSION;
use futures::{sync::mpsc::UnboundedSender, Async, Future, Poll};
use mullvad_rpc::{AppVersionProxy, HttpHandle};
use mullvad_types::version::AppVersionInfo;
+use serde::{Deserialize, Serialize};
use std::{
- fs::File,
+ fs::{self, File},
io,
path::{Path, PathBuf},
time::{Duration, Instant},
@@ -33,6 +35,23 @@ const PLATFORM: &str = "windows";
const PLATFORM: &str = "android";
+#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
+struct CachedAppVersionInfo {
+ #[serde(flatten)]
+ pub version_info: AppVersionInfo,
+ #[serde(default)] // for compatibility with older versions
+ pub cached_from_version: String,
+}
+
+impl From<AppVersionInfo> for CachedAppVersionInfo {
+ fn from(version_info: AppVersionInfo) -> CachedAppVersionInfo {
+ CachedAppVersionInfo {
+ version_info,
+ cached_from_version: PRODUCT_VERSION.to_owned(),
+ }
+ }
+}
+
#[derive(err_derive::Error, Debug)]
#[error(no_from)]
pub enum Error {
@@ -50,6 +69,9 @@ pub enum Error {
#[error(display = "Failed to check the latest app version")]
Download(#[error(source)] mullvad_rpc::Error),
+
+ #[error(display = "Failed to clear version cache")]
+ ClearCache(#[error(source)] io::Error),
}
impl<T> From<TimeoutError<T>> for Error {
@@ -101,7 +123,7 @@ impl<T: From<AppVersionInfo>> VersionUpdater<T> {
) -> Box<dyn Future<Item = AppVersionInfo, Error = Error> + Send + 'static> {
let download_future = self
.version_proxy
- .app_version_check(&crate::version::PRODUCT_VERSION.to_owned(), PLATFORM)
+ .app_version_check(&PRODUCT_VERSION.to_owned(), PLATFORM)
.map_err(Error::Download);
let future = Timer::default().timeout(download_future, DOWNLOAD_TIMEOUT);
Box::new(future)
@@ -113,7 +135,8 @@ impl<T: From<AppVersionInfo>> VersionUpdater<T> {
self.cache_path.display()
);
let file = File::create(&self.cache_path).map_err(Error::WriteRelayCache)?;
- serde_json::to_writer_pretty(io::BufWriter::new(file), &self.last_app_version_info)
+ let cached_app_version = CachedAppVersionInfo::from(self.last_app_version_info.clone());
+ serde_json::to_writer_pretty(io::BufWriter::new(file), &cached_app_version)
.map_err(Error::Serialize)
}
}
@@ -186,5 +209,23 @@ pub fn load_cache(cache_dir: &Path) -> Result<AppVersionInfo, Error> {
let path = cache_dir.join(VERSION_INFO_FILENAME);
log::debug!("Loading version check cache from {}", path.display());
let file = File::open(path).map_err(Error::ReadCachedRelays)?;
- serde_json::from_reader(io::BufReader::new(file)).map_err(Error::Serialize)
+ let version_info: CachedAppVersionInfo =
+ serde_json::from_reader(io::BufReader::new(file)).map_err(Error::Serialize)?;
+
+ if version_info.cached_from_version == PRODUCT_VERSION {
+ Ok(version_info.version_info)
+ } else {
+ log::info!("Clearing version check cache due to a version mismatch");
+
+ let path = cache_dir.join(VERSION_INFO_FILENAME);
+ log::debug!("Removing version check cache in {}", path.display());
+ let _ = fs::remove_file(path).map_err(Error::ClearCache)?;
+
+ Ok(AppVersionInfo {
+ current_is_supported: true,
+ current_is_outdated: false,
+ latest_stable: PRODUCT_VERSION.to_owned(),
+ latest: PRODUCT_VERSION.to_owned(),
+ })
+ }
}