From 27f86edfda7629642dcc2cccf9c54ae9735468b5 Mon Sep 17 00:00:00 2001 From: Andrew Leech Date: Tue, 4 Jul 2023 10:42:02 +1000 Subject: [PATCH] tugger-wix: Sanitise characters in Directory/ComponentGroup Id's. --- Cargo.lock | 28 ++++++++++++++++++++++------ tugger-wix/Cargo.toml | 1 + tugger-wix/src/common.rs | 26 +++++++++----------------- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aaa719499..7aaff824b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,6 +28,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + [[package]] name = "android_system_properties" version = "0.1.5" @@ -2079,7 +2088,7 @@ version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" dependencies = [ - "aho-corasick", + "aho-corasick 0.7.20", "bstr", "fnv", "log", @@ -2561,7 +2570,7 @@ dependencies = [ "petgraph", "pico-args", "regex", - "regex-syntax", + "regex-syntax 0.6.28", "string_cache", "term", "tiny-keccak", @@ -3843,13 +3852,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.1" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" dependencies = [ - "aho-corasick", + "aho-corasick 1.0.2", "memchr", - "regex-syntax", + "regex-syntax 0.7.2", ] [[package]] @@ -3864,6 +3873,12 @@ version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +[[package]] +name = "regex-syntax" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" + [[package]] name = "release" version = "0.1.0" @@ -5118,6 +5133,7 @@ dependencies = [ "log", "msi", "once_cell", + "regex", "simple-file-manifest", "tempfile", "tugger-common", diff --git a/tugger-wix/Cargo.toml b/tugger-wix/Cargo.toml index 49d210057..c97b66c72 100644 --- a/tugger-wix/Cargo.toml +++ b/tugger-wix/Cargo.toml @@ -16,6 +16,7 @@ anyhow = "1.0.68" duct = "0.13.6" log = "0.4.17" once_cell = "1.17.0" +regex = "1.8.4" simple-file-manifest = "0.11.0" url = "2.3.1" uuid = { version = "1.2.2", features = ["v4", "v5"] } diff --git a/tugger-wix/src/common.rs b/tugger-wix/src/common.rs index 0a57221c8..ab73b06ae 100644 --- a/tugger-wix/src/common.rs +++ b/tugger-wix/src/common.rs @@ -7,6 +7,7 @@ use { duct::cmd, log::warn, once_cell::sync::Lazy, + regex::Regex, simple_file_manifest::FileManifest, std::{ io::{BufRead, BufReader, Write}, @@ -30,16 +31,15 @@ static WIX_TOOLSET: Lazy = Lazy::new(|| RemoteContent { sha256: "2c1888d5d1dba377fc7fa14444cf556963747ff9a0a289a3599cf09da03b9e2e".to_string(), }); +pub fn path_id(path: &Path) -> String { + // Identifiers may contain ASCII characters A-Z, a-z, digits, underscores (_), or periods (.) + let re = Regex::new(r"[^A-Za-z0-9_\.]").unwrap(); + re.replace_all(&path.to_string_lossy().replace('\\', ".").replace('/', "."), "_").to_string() +} + /// Compute the `Id` of a directory. pub fn directory_to_id(prefix: &str, path: &Path) -> String { - format!( - "{}.dir.{}", - prefix, - path.to_string_lossy() - .replace('\\', "/") - .replace('/', ".") - .replace('-', "_") - ) + format!("{}.dir.{}", prefix, path_id(path)) } const GUID_NAMESPACE: &str = "https://github.com/indygreg/PyOxidizer/tugger/wix"; @@ -88,15 +88,7 @@ pub fn file_id(prefix: &str, path: &Path) -> String { } pub fn component_group_id(prefix: &str, path: &Path) -> String { - format!( - "{}.group.{}", - prefix, - path.display() - .to_string() - .replace('\\', "/") - .replace('/', ".") - .replace('-', "_") - ) + format!("{}.group.{}", prefix, path_id(path)) } /// Convert a `FileManifest` to WiX XML defining those files.