From 24c7182575dcb79f3ea8c66418656879f8bb0445 Mon Sep 17 00:00:00 2001 From: amrbashir Date: Tue, 23 May 2023 16:45:50 +0300 Subject: [PATCH] fix(bundler/nsis): write installer templates UTF16LE encoded, closes #7036 --- .changes/nsis-encoding.md | 5 ++ tooling/bundler/Cargo.toml | 1 - tooling/bundler/src/bundle/windows/nsis.rs | 89 +++++++------------ .../templates/nsis-languages/Persian.nsh | 2 +- tooling/cli/Cargo.lock | 44 +++++++-- 5 files changed, 75 insertions(+), 66 deletions(-) create mode 100644 .changes/nsis-encoding.md diff --git a/.changes/nsis-encoding.md b/.changes/nsis-encoding.md new file mode 100644 index 000000000000..5c554bf7d628 --- /dev/null +++ b/.changes/nsis-encoding.md @@ -0,0 +1,5 @@ +--- +'tauri-bundler': 'patch' +--- + +Fix NSIS bundler failing to build when `productName` contained chinsese characters. diff --git a/tooling/bundler/Cargo.toml b/tooling/bundler/Cargo.toml index 88428c494c6b..fdf20a098a30 100644 --- a/tooling/bundler/Cargo.toml +++ b/tooling/bundler/Cargo.toml @@ -31,7 +31,6 @@ handlebars = "4.3" tempfile = "3.5.0" log = { version = "0.4.17", features = [ "kv_unstable" ] } dirs-next = "2.0" -encoding_rs = "0.8" os_pipe = "1" attohttpc = { version = "0.25", default-features = false } hex = "0.4" diff --git a/tooling/bundler/src/bundle/windows/nsis.rs b/tooling/bundler/src/bundle/windows/nsis.rs index 09e51c77ab8f..103008e80f2a 100644 --- a/tooling/bundler/src/bundle/windows/nsis.rs +++ b/tooling/bundler/src/bundle/windows/nsis.rs @@ -417,19 +417,14 @@ fn build_nsis_app_installer( .expect("Failed to setup handlebar template"); } let installer_nsi_path = output_path.join("installer.nsi"); - write( + write_ut16_le_with_bom( &installer_nsi_path, - encoding_rs::UTF_8 - .encode(handlebars.render("installer.nsi", &data)?.as_str()) - .0, + handlebars.render("installer.nsi", &data)?.as_str(), )?; for (lang, data) in languages_data.iter() { - if let Some((content, encoding)) = data { - write( - output_path.join(lang).with_extension("nsh"), - encoding.encode(content).0, - )?; + if let Some(content) = data { + write_ut16_le_with_bom(output_path.join(lang).with_extension("nsh"), &content)?; } } @@ -553,12 +548,7 @@ fn generate_binaries_data(settings: &Settings) -> crate::Result { fn get_lang_data( lang: &str, custom_lang_files: Option<&HashMap>, -) -> Option<( - String, - Option<(&'static str, &'static encoding_rs::Encoding)>, -)> { - use encoding_rs::*; - +) -> Option<(String, Option<&'static str>)> { if let Some(path) = custom_lang_files.and_then(|h| h.get(lang)) { return Some(( dunce::canonicalize(path) @@ -573,86 +563,71 @@ fn get_lang_data( match lang.to_lowercase().as_str() { "arabic" => Some(( lang_file, - Some(( - include_str!("./templates/nsis-languages/Arabic.nsh"), - UTF_16LE, - )), + Some(include_str!("./templates/nsis-languages/Arabic.nsh")), )), "dutch" => Some(( lang_file, - Some((include_str!("./templates/nsis-languages/Dutch.nsh"), UTF_8)), + Some(include_str!("./templates/nsis-languages/Dutch.nsh")), )), "english" => Some(( lang_file, - Some(( - include_str!("./templates/nsis-languages/English.nsh"), - UTF_8, - )), + Some(include_str!("./templates/nsis-languages/English.nsh")), )), "japanese" => Some(( lang_file, - Some(( - include_str!("./templates/nsis-languages/Japanese.nsh"), - UTF_8, - )), + Some(include_str!("./templates/nsis-languages/Japanese.nsh")), )), "korean" => Some(( lang_file, - Some((include_str!("./templates/nsis-languages/Korean.nsh"), UTF_8)), + Some(include_str!("./templates/nsis-languages/Korean.nsh")), )), "portuguesebr" => Some(( lang_file, - Some(( - include_str!("./templates/nsis-languages/PortugueseBR.nsh"), - UTF_8, - )), + Some(include_str!("./templates/nsis-languages/PortugueseBR.nsh")), )), "tradchinese" => Some(( lang_file, - Some(( - include_str!("./templates/nsis-languages/TradChinese.nsh"), - UTF_8, - )), + Some(include_str!("./templates/nsis-languages/TradChinese.nsh")), )), "simpchinese" => Some(( lang_file, - Some(( - include_str!("./templates/nsis-languages/SimpChinese.nsh"), - UTF_8, - )), + Some(include_str!("./templates/nsis-languages/SimpChinese.nsh")), )), "french" => Some(( lang_file, - Some((include_str!("./templates/nsis-languages/French.nsh"), UTF_8)), + Some(include_str!("./templates/nsis-languages/French.nsh")), )), "spanish" => Some(( lang_file, - Some(( - include_str!("./templates/nsis-languages/Spanish.nsh"), - UTF_8, - )), + Some(include_str!("./templates/nsis-languages/Spanish.nsh")), )), "spanishinternational" => Some(( lang_file, - Some(( - include_str!("./templates/nsis-languages/SpanishInternational.nsh"), - UTF_8, + Some(include_str!( + "./templates/nsis-languages/SpanishInternational.nsh" )), )), "persian" => Some(( lang_file, - Some(( - include_str!("./templates/nsis-languages/Persian.nsh"), - UTF_16LE, - )), + Some(include_str!("./templates/nsis-languages/Persian.nsh")), )), "turkish" => Some(( lang_file, - Some(( - include_str!("./templates/nsis-languages/Turkish.nsh"), - UTF_8, - )), + Some(include_str!("./templates/nsis-languages/Turkish.nsh")), )), _ => None, } } + +fn write_ut16_le_with_bom>(path: P, content: &str) -> crate::Result<()> { + use std::fs::File; + use std::io::{BufWriter, Write}; + + let file = File::create(path)?; + let mut output = BufWriter::new(file); + output.write_all(&[0xFF, 0xFE])?; // the BOM part + for utf16 in content.encode_utf16() { + output.write_all(&utf16.to_le_bytes())?; + } + Ok(()) +} diff --git a/tooling/bundler/src/bundle/windows/templates/nsis-languages/Persian.nsh b/tooling/bundler/src/bundle/windows/templates/nsis-languages/Persian.nsh index 1522bec2bca6..5e509f9016f9 100644 --- a/tooling/bundler/src/bundle/windows/templates/nsis-languages/Persian.nsh +++ b/tooling/bundler/src/bundle/windows/templates/nsis-languages/Persian.nsh @@ -24,4 +24,4 @@ LangString webview2DownloadSuccess ${LANG_PERSIAN} "WebView2 بوت استرپر LangString webview2Downloading ${LANG_PERSIAN} "دانلود بوت استرپر WebView2..." LangString webview2InstallError ${LANG_PERSIAN} "ارور: نصب WebView2 با کد $1 شکست خورد" LangString webview2InstallSuccess ${LANG_PERSIAN} "WebView2 با موفقیت نصب شد" -LangString deleteAppData ${LANG_PERSIAN} "حذف دیتا های اپلیکیشن" \ No newline at end of file +LangString deleteAppData ${LANG_PERSIAN} "حذف دیتا های اپلیکیشن" diff --git a/tooling/cli/Cargo.lock b/tooling/cli/Cargo.lock index f1910b9af289..24e0b3aa63d0 100644 --- a/tooling/cli/Cargo.lock +++ b/tooling/cli/Cargo.lock @@ -163,17 +163,17 @@ dependencies = [ [[package]] name = "attohttpc" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" +checksum = "7e57d6e7a84f33ff3316e97af3180fe7f86597a6a60161c0be70c0e45f382620" dependencies = [ "http", "log", "native-tls", - "rustls", + "rustls 0.21.1", "url", "webpki", - "webpki-roots", + "webpki-roots 0.23.0", ] [[package]] @@ -2764,6 +2764,28 @@ dependencies = [ "webpki", ] +[[package]] +name = "rustls" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c911ba11bc8433e811ce56fde130ccf32f5127cab0e0194e9c68c5a5b671791e" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-webpki" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "ryu" version = "1.0.13" @@ -3253,7 +3275,6 @@ dependencies = [ "bitness", "dirs-next", "dunce", - "encoding_rs", "glob", "handlebars", "heck", @@ -3762,10 +3783,10 @@ dependencies = [ "flate2", "log", "once_cell", - "rustls", + "rustls 0.20.8", "url", "webpki", - "webpki-roots", + "webpki-roots 0.22.6", ] [[package]] @@ -3952,6 +3973,15 @@ dependencies = [ "webpki", ] +[[package]] +name = "webpki-roots" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa54963694b65584e170cf5dc46aeb4dcaa5584e652ff5f3952e56d66aff0125" +dependencies = [ + "rustls-webpki", +] + [[package]] name = "weezl" version = "0.1.7"