From 5a25573125f6a5b9064ab079b7cb1cb4a1eecbba Mon Sep 17 00:00:00 2001 From: Guido Falsi Date: Thu, 27 Apr 2023 18:47:26 +0200 Subject: [PATCH 1/2] Reimplement code extracting information from file name. This code tokenizes the file name based on commas and extracts relevant parts sequentially. `host=` is expected to be the first part. Since Windows renames files adding (1), (2) etc. before the .exe in case of duplicates, which causes the host or key values to be garbled. This allows using a `,` (comma) symbol as a final delimiter. Fixes #4162 --- src/license.rs | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/license.rs b/src/license.rs index 8875d2b64..9d87ec7eb 100644 --- a/src/license.rs +++ b/src/license.rs @@ -36,24 +36,38 @@ pub fn get_license_from_string(s: &str) -> ResultType { } else { s }; + /* + * The following code tokenizes the file name based on commas and + * extracts relevant parts sequentially. + * + * host= is expected to be the first part. + * + * Since Windows renames files adding (1), (2) etc. before the .exe + * in case of duplicates, which causes the host or key values to be + * garbled. + * + * This allows using a ',' (comma) symbol as a final delimiter. + */ if s.contains("host=") { - let strs: Vec<&str> = s.split("host=").collect(); - if strs.len() == 2 { - let strs2: Vec<&str> = strs[1].split(",key=").collect(); - let host; - let mut key = ""; - if strs2.len() == 2 { - host = strs2[0]; - key = strs2[1]; - } else { - host = strs[1]; + let stripped = &s[s.find("host=").unwrap_or(0)..s.len()]; + let strs: Vec<&str> = stripped.split(",").collect(); + let mut host = ""; + let mut key = ""; + let strs_iter = strs.iter(); + for el in strs_iter { + if el.starts_with("host=") { + host = &el[5..el.len()]; + } + + if el.starts_with("key=") { + key = &el[4..el.len()]; } - return Ok(License { - host: host.to_owned(), - key: key.to_owned(), - api: "".to_owned(), - }); } + return Ok(License { + host: host.to_owned(), + key: key.to_owned(), + api: "".to_owned(), + }); } else { let strs = if s.contains("-licensed-") { s.split("-licensed-") From 1b899a5ce8cdc6aba83db1f3e8335fba2bdead34 Mon Sep 17 00:00:00 2001 From: Guido Falsi Date: Fri, 28 Apr 2023 10:28:39 +0200 Subject: [PATCH 2/2] Add test for host and name extraction from filename. --- src/license.rs | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/license.rs b/src/license.rs index 9d87ec7eb..1ad16f6f0 100644 --- a/src/license.rs +++ b/src/license.rs @@ -82,3 +82,60 @@ pub fn get_license_from_string(s: &str) -> ResultType { } bail!("Failed to parse"); } + +#[cfg(test)] +#[cfg(target_os = "windows")] +mod test { + #[test] + fn test_filename_license_string() { + assert_eq!( + get_license_from_string("rustdesk.exe"), + Ok(License { + host: "".to_owned(), + key: "".to_owned(), + api: "".to_owned(), + }) + ); + assert_eq!( + get_license_from_string("rustdesk"), + Ok(License { + host: "".to_owned(), + key: "".to_owned(), + api: "".to_owned(), + }) + ); + assert_eq!( + get_license_from_string("rustdesk-host=server.example.net.exe"), + Ok(License { + host: "server.example.net".to_owned(), + key: "".to_owned(), + api: "".to_owned(), + }) + ); + assert_eq!( + get_license_from_string("rustdesk-host=server.example.net,.exe"), + Ok(License { + host: "server.example.net".to_owned(), + key: "".to_owned(), + api: "".to_owned(), + }) + ); + // key in these tests is "foobar.,2" base64 encoded + assert_eq!( + get_license_from_string("rustdesk-host=server.example.net,key=Zm9vYmFyLiwyCg==.exe"), + Ok(License { + host: "server.example.net".to_owned(), + key: "Zm9vYmFyLiwyCg==".to_owned(), + api: "".to_owned(), + }) + ); + assert_eq!( + get_license_from_string("rustdesk-host=server.example.net,key=Zm9vYmFyLiwyCg==,.exe"), + Ok(License { + host: "server.example.net".to_owned(), + key: "Zm9vYmFyLiwyCg==".to_owned(), + api: "".to_owned(), + }) + ); + } +}