diff --git a/crates/data-model/src/user_agent.rs b/crates/data-model/src/user_agent.rs index dc39fb87..98b9e4ae 100644 --- a/crates/data-model/src/user_agent.rs +++ b/crates/data-model/src/user_agent.rs @@ -80,6 +80,15 @@ impl UserAgent { } } + fn parse_electron(user_agent: &str) -> Option<(&str, &str)> { + let regex = regex::Regex::new(r"(?m)\w+/[\w.]+").unwrap(); + let omit_keys = ["Mozilla", "AppleWebKit", "Chrome", "Electron", "Safari"]; + return regex + .find_iter(user_agent) + .map(|caps| caps.as_str().split_once('/').unwrap()) + .find(|pair| !omit_keys.contains(&pair.0)); + } + #[must_use] pub fn parse(user_agent: String) -> Self { if !user_agent.contains("Mozilla/") { @@ -203,6 +212,14 @@ impl UserAgent { result.os_version = version.into(); } + // Special handling for Electron applications e.g. Element Desktop + if user_agent.contains("Electron/") { + if let Some(app) = UserAgent::parse_electron(&user_agent) { + result.name = app.0; + result.version = app.1; + } + } + Self { name: (result.name != VALUE_UNKNOWN).then(|| result.name.to_owned()), version: (result.version != VALUE_UNKNOWN).then(|| result.version.to_owned()),