diff --git a/src/license.rs b/src/license.rs index 8875d2b64..1ad16f6f0 100644 --- a/src/license.rs +++ b/src/license.rs @@ -36,24 +36,38 @@ pub fn get_license_from_string(s: &str) -> ResultType<License> { } 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-") @@ -68,3 +82,60 @@ pub fn get_license_from_string(s: &str) -> ResultType<License> { } 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(), + }) + ); + } +}