Fix CRX ID extraction
This commit is contained in:
parent
723f73c276
commit
b584983097
1 changed files with 28 additions and 5 deletions
|
|
@ -304,7 +304,12 @@ fn match_startup_wm_class(
|
||||||
|
|
||||||
#[cfg(not(windows))]
|
#[cfg(not(windows))]
|
||||||
fn is_crx_id(candidate: &str) -> bool {
|
fn is_crx_id(candidate: &str) -> bool {
|
||||||
candidate.len() == 32 && candidate.chars().all(|c| matches!(c, 'a'..='p'))
|
is_crx_bytes(candidate.as_bytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(windows))]
|
||||||
|
fn is_crx_bytes(bytes: &[u8]) -> bool {
|
||||||
|
bytes.len() == 32 && bytes.iter().all(|b| matches!(b, b'a'..=b'p'))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(windows))]
|
#[cfg(not(windows))]
|
||||||
|
|
@ -328,13 +333,15 @@ pub fn extract_crx_id(value: &str) -> Option<String> {
|
||||||
if is_crx_id(value) {
|
if is_crx_id(value) {
|
||||||
return Some(value.to_string());
|
return Some(value.to_string());
|
||||||
}
|
}
|
||||||
let bytes = value.as_bytes();
|
|
||||||
for i in 0..bytes.len().saturating_sub(31) {
|
for window in value.as_bytes().windows(32) {
|
||||||
let slice = &value[i..i + 32];
|
if is_crx_bytes(window) {
|
||||||
if is_crx_id(slice) {
|
// SAFETY: `is_crx_bytes` guarantees the window is ASCII.
|
||||||
|
let slice = std::str::from_utf8(window).expect("ASCII window");
|
||||||
return Some(slice.to_string());
|
return Some(slice.to_string());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1103,4 +1110,20 @@ Icon=vmware-workstation\n\
|
||||||
assert!(resolved.exec().is_some());
|
assert!(resolved.exec().is_some());
|
||||||
assert_eq!(resolved.startup_wm_class(), Some(&format!("crx_{}", id)));
|
assert_eq!(resolved.startup_wm_class(), Some(&format!("crx_{}", id)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn crx_extraction_handles_utf8_prefixes() {
|
||||||
|
let id = "cadlkienfkclaiaibeoongdcgmdikeeg";
|
||||||
|
let prefixed = format!("å{}", id);
|
||||||
|
assert_eq!(super::extract_crx_id(&prefixed), Some(id.to_string()));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn crx_extraction_ignores_non_ascii_sequences() {
|
||||||
|
let id = "cadlkienfkclaiaibeoongdcgmdikeeg";
|
||||||
|
let embedded = format!("{id}æøå");
|
||||||
|
|
||||||
|
assert_eq!(super::extract_crx_id(&embedded), Some(id.to_string()));
|
||||||
|
assert_eq!(super::extract_crx_id("æøå"), None);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue