diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-01-13 10:15:51 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-01-14 10:58:10 +0100 |
| commit | 4e1cc991c41f82cbe8fe173ecf92ff45d9d560e5 (patch) | |
| tree | c6a4f47b2a666a8c5e61aaaef0292e71e6c3ceb4 | |
| parent | 8dabfcfc8950e9b249a10cf4ebd964f8685dc5dc (diff) | |
| download | mullvadvpn-4e1cc991c41f82cbe8fe173ecf92ff45d9d560e5.tar.xz mullvadvpn-4e1cc991c41f82cbe8fe173ecf92ff45d9d560e5.zip | |
Clear version check cache if the version has changed
| -rw-r--r-- | mullvad-daemon/src/version_check.rs | 49 |
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(), + }) + } } |
