Browse Source

fix(core): updater not replacing variables, closes #3428 (#3432)

Lucas Fernandes Nogueira 3 years ago
parent
commit
20f0477f95

+ 5 - 0
.changes/fix-updater-percent-decode.md

@@ -0,0 +1,5 @@
+---
+"tauri": patch
+---
+
+Fixes an issue with the updater when replacing the `{{target}}` and `{{current_version}}` variables due to percent-encoding on the `Url` that is parsed from the configuration.

+ 55 - 2
core/tauri/src/updater/core.rs

@@ -199,7 +199,11 @@ impl<'a> UpdateBuilder<'a> {
 
   #[allow(dead_code)]
   pub fn url(mut self, url: String) -> Self {
-    self.urls.push(url);
+    self.urls.push(
+      percent_encoding::percent_decode(url.as_bytes())
+        .decode_utf8_lossy()
+        .to_string(),
+    );
     self
   }
 
@@ -207,7 +211,11 @@ impl<'a> UpdateBuilder<'a> {
   pub fn urls(mut self, urls: &[String]) -> Self {
     let mut formatted_vec: Vec<String> = Vec::new();
     for url in urls {
-      formatted_vec.push(url.to_owned());
+      formatted_vec.push(
+        percent_encoding::percent_decode(url.as_bytes())
+          .decode_utf8_lossy()
+          .to_string(),
+      );
     }
     self.urls = formatted_vec;
     self
@@ -963,6 +971,51 @@ mod test {
     assert!(updater.should_update);
   }
 
+  #[test]
+  fn simple_http_updater_percent_decode() {
+    let _m = mockito::mock("GET", "/darwin/1.0.0")
+      .with_status(200)
+      .with_header("content-type", "application/json")
+      .with_body(generate_sample_platform_json(
+        "2.0.0",
+        "SampleTauriKey",
+        "https://tauri.studio",
+      ))
+      .create();
+
+    let check_update = block!(builder(Default::default())
+      .current_version("1.0.0")
+      .url(
+        url::Url::parse(&format!(
+          "{}/darwin/{{{{current_version}}}}",
+          mockito::server_url()
+        ))
+        .unwrap()
+        .to_string()
+      )
+      .build());
+
+    assert!(check_update.is_ok());
+    let updater = check_update.expect("Can't check update");
+
+    assert!(updater.should_update);
+
+    let check_update = block!(builder(Default::default())
+      .current_version("1.0.0")
+      .urls(&[url::Url::parse(&format!(
+        "{}/darwin/{{{{current_version}}}}",
+        mockito::server_url()
+      ))
+      .unwrap()
+      .to_string()])
+      .build());
+
+    assert!(check_update.is_ok());
+    let updater = check_update.expect("Can't check update");
+
+    assert!(updater.should_update);
+  }
+
   #[test]
   fn simple_http_updater_with_elevated_task() {
     let _m = mockito::mock("GET", "/win64/1.0.0")

+ 6 - 6
core/tauri/tests/restart/Cargo.lock

@@ -2534,7 +2534,7 @@ dependencies = [
 
 [[package]]
 name = "tauri"
-version = "1.0.0-rc.0"
+version = "1.0.0-rc.1"
 dependencies = [
  "bincode",
  "cfg_aliases",
@@ -2574,7 +2574,7 @@ dependencies = [
 
 [[package]]
 name = "tauri-codegen"
-version = "1.0.0-rc.0"
+version = "1.0.0-rc.1"
 dependencies = [
  "base64",
  "blake3",
@@ -2592,7 +2592,7 @@ dependencies = [
 
 [[package]]
 name = "tauri-macros"
-version = "1.0.0-rc.0"
+version = "1.0.0-rc.1"
 dependencies = [
  "heck 0.4.0",
  "proc-macro2",
@@ -2604,7 +2604,7 @@ dependencies = [
 
 [[package]]
 name = "tauri-runtime"
-version = "0.3.0"
+version = "0.3.1"
 dependencies = [
  "gtk",
  "http",
@@ -2621,7 +2621,7 @@ dependencies = [
 
 [[package]]
 name = "tauri-runtime-wry"
-version = "0.3.0"
+version = "0.3.1"
 dependencies = [
  "gtk",
  "ico",
@@ -2637,7 +2637,7 @@ dependencies = [
 
 [[package]]
 name = "tauri-utils"
-version = "1.0.0-rc.0"
+version = "1.0.0-rc.1"
 dependencies = [
  "ctor",
  "heck 0.4.0",