From 02f61c6433c4f54581e6c905be96e7b5bfbf4580 Mon Sep 17 00:00:00 2001 From: AdityaVKochar Date: Fri, 17 Oct 2025 19:41:07 +0530 Subject: [PATCH 1/8] feat: added functions to get browser details and chrome profiles --- apps/desktop/src-tauri/src/browser_details.rs | 62 +++++++++++++++++++ apps/desktop/src-tauri/src/commands.rs | 4 ++ 2 files changed, 66 insertions(+) create mode 100644 apps/desktop/src-tauri/src/browser_details.rs create mode 100644 apps/desktop/src-tauri/src/commands.rs diff --git a/apps/desktop/src-tauri/src/browser_details.rs b/apps/desktop/src-tauri/src/browser_details.rs new file mode 100644 index 0000000..acbde42 --- /dev/null +++ b/apps/desktop/src-tauri/src/browser_details.rs @@ -0,0 +1,62 @@ +use crowser::{browser}; +use std::{fs, path::PathBuf, io::{self, Read}}; +use dirs::{config_dir, data_local_dir}; +use serde_json::Value; + +pub fn get_browsers() -> Vec { + let browser_vector = browser::get_all_existing_browsers(); + let browser_names: Vec = browser_vector.iter().map(|s| s.name.to_owned()).collect(); + + return browser_names; +} + +pub fn get_chrome_profiles() -> Result, Box> { + + let base_dir = if cfg!(target_os = "windows") || cfg!(target_os = "macos") { + data_local_dir() + } else { + config_dir() + }; + + if let Some(mut path) = base_dir { + + #[cfg(target_os = "windows")] + path.push("Google\\Chrome\\User Data\\Local State"); + + #[cfg(target_os = "macos")] + path.push("Google/Chrome/Local State"); + + #[cfg(target_os = "linux")] + path.push("google-chrome/Local State"); + + if path.exists() { + + let mut file = fs::File::open(path)?; + let mut contents = String::new(); + file.read_to_string(&mut contents)?; + + let json_value: Value = serde_json::from_str(&contents)?; + + let info_cache = json_value + .get("profile") + .and_then(|p| p.get("info_cache")) + .and_then(|ic| ic.as_object()) + .ok_or_else(|| "Could not find 'profile' or 'info_cache' in JSON.")?; + + let mut profile_names: Vec = Vec::new(); + + for (_profile_key, profile_data) in info_cache.iter() { + if let Some(name_value) = profile_data.get("gaia_name") { + if let Some(name_str) = name_value.as_str() { + profile_names.push(name_str.to_owned()); + } + } + } + + return Ok(profile_names); + + } + } + + Ok(Vec::new()) +} \ No newline at end of file diff --git a/apps/desktop/src-tauri/src/commands.rs b/apps/desktop/src-tauri/src/commands.rs new file mode 100644 index 0000000..fa9ae7c --- /dev/null +++ b/apps/desktop/src-tauri/src/commands.rs @@ -0,0 +1,4 @@ +#[tauri::command] +pub fn get_available_browser() { + get_browsers(); +} \ No newline at end of file From 3872a46768d8d71ef58b36f3880ff3c7e39c3ec7 Mon Sep 17 00:00:00 2001 From: AdityaVKochar Date: Fri, 17 Oct 2025 19:41:43 +0530 Subject: [PATCH 2/8] feat: added required libraries --- apps/desktop/src-tauri/Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index a1f18f0..053d39a 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -22,4 +22,6 @@ tauri = { version = "2", features = [] } tauri-plugin-opener = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" +crowser = "0.4.1" +dirs = "6.0.0" From 8f1579e6062f801f111441e36d084eca87f0c9b0 Mon Sep 17 00:00:00 2001 From: AdityaVKochar Date: Fri, 17 Oct 2025 23:57:51 +0530 Subject: [PATCH 3/8] feat: added for chromium based browsers --- apps/desktop/src-tauri/src/browser_details.rs | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/apps/desktop/src-tauri/src/browser_details.rs b/apps/desktop/src-tauri/src/browser_details.rs index acbde42..80020fd 100644 --- a/apps/desktop/src-tauri/src/browser_details.rs +++ b/apps/desktop/src-tauri/src/browser_details.rs @@ -3,6 +3,14 @@ use std::{fs, path::PathBuf, io::{self, Read}}; use dirs::{config_dir, data_local_dir}; use serde_json::Value; +pub enum Browsers { + Chrome, + Edge, + Brave, + FireFox, + Safari +} + pub fn get_browsers() -> Vec { let browser_vector = browser::get_all_existing_browsers(); let browser_names: Vec = browser_vector.iter().map(|s| s.name.to_owned()).collect(); @@ -10,7 +18,7 @@ pub fn get_browsers() -> Vec { return browser_names; } -pub fn get_chrome_profiles() -> Result, Box> { +pub fn get_chrome_based_profiles(os_paths: Vec<&str>) -> Result, Box> { let base_dir = if cfg!(target_os = "windows") || cfg!(target_os = "macos") { data_local_dir() @@ -21,13 +29,13 @@ pub fn get_chrome_profiles() -> Result, Box> if let Some(mut path) = base_dir { #[cfg(target_os = "windows")] - path.push("Google\\Chrome\\User Data\\Local State"); + path.push(os_paths[0]); #[cfg(target_os = "macos")] - path.push("Google/Chrome/Local State"); + path.push(os_paths[1]); #[cfg(target_os = "linux")] - path.push("google-chrome/Local State"); + path.push(os_paths[2]); if path.exists() { @@ -59,4 +67,28 @@ pub fn get_chrome_profiles() -> Result, Box> } Ok(Vec::new()) -} \ No newline at end of file +} + +pub fn get_chrome_profiles(kind: Browsers) -> Result, Box> { + + let paths: Vec<&str> = match kind { + Browsers::Chrome => vec![ + "Google\\Chrome\\User Data\\Local State", + "Google/Chrome/Local State", + "google-chrome/Local State", + ], + Browsers::Edge => vec![ + "Microsoft\\Edge\\User Data\\Local State", + "Microsoft/Edge/Local State", + "microsoft-edge/Local State", + ], + Browsers::Brave => vec![ + "BraveSoftware\\Brave-Browser\\User Data\\Local State", + "BraveSoftware/Brave-Browser/Local State", + "brave/Local State", + ], + _ => Vec::new(), + }; + + return get_chrome_based_profiles(paths); +} \ No newline at end of file From 950ac46721133c65583178b7cda2164d41b2165c Mon Sep 17 00:00:00 2001 From: AdityaVKochar Date: Sat, 18 Oct 2025 01:02:56 +0530 Subject: [PATCH 4/8] fix: fixed error handling --- apps/desktop/src-tauri/src/browser_details.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/src-tauri/src/browser_details.rs b/apps/desktop/src-tauri/src/browser_details.rs index 80020fd..93062bb 100644 --- a/apps/desktop/src-tauri/src/browser_details.rs +++ b/apps/desktop/src-tauri/src/browser_details.rs @@ -49,7 +49,7 @@ pub fn get_chrome_based_profiles(os_paths: Vec<&str>) -> Result, Box .get("profile") .and_then(|p| p.get("info_cache")) .and_then(|ic| ic.as_object()) - .ok_or_else(|| "Could not find 'profile' or 'info_cache' in JSON.")?; + .ok_or_else(|| {Box::new(io::Error::new(io::ErrorKind::InvalidData, "Could not find 'profile' or 'info_cache' in JSON.")) as Box})?; let mut profile_names: Vec = Vec::new(); From 065e885ef45a334da7cc6d0ecb2d451fff895b7d Mon Sep 17 00:00:00 2001 From: AdityaVKochar Date: Sat, 18 Oct 2025 09:51:30 +0530 Subject: [PATCH 5/8] feat: added profile paths for firefox --- apps/desktop/src-tauri/src/browser_details.rs | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/apps/desktop/src-tauri/src/browser_details.rs b/apps/desktop/src-tauri/src/browser_details.rs index 93062bb..94f3de8 100644 --- a/apps/desktop/src-tauri/src/browser_details.rs +++ b/apps/desktop/src-tauri/src/browser_details.rs @@ -91,4 +91,51 @@ pub fn get_chrome_profiles(kind: Browsers) -> Result, Box Result, Box> { + + let base_dir = if cfg!(target_os = "windows") || cfg!(target_os = "macos") { + data_local_dir() + } else { + config_dir() + }; + + if let Some(mut path) = base_dir { + + #[cfg(target_os = "windows")] + path.push("Mozilla\\Firefox\\Profiles"); + + #[cfg(target_os = "macos")] + path.push("Mozilla/Firefox/Profiles"); + + #[cfg(target_os = "linux")] + path.push("mozilla-firefox/"); + + if path.exists() { + match fs::read_dir(path) { + Ok(entries) => { + let profile_names: Vec = entries + .filter_map(Result::ok) + .filter_map(|entry| { + match entry.file_type() { + Ok(file_type) if file_type.is_dir() => { + Some(entry.file_name().to_string_lossy().into_owned()) + } + _ => None, + } + }) + .collect(); + return Ok(profile_names); + } + Err(e) => { + eprintln!("Error reading directory: {}", e); + return Ok(Vec::new()); + } + } + } + } + + return Ok(Vec::new()); + } \ No newline at end of file From 5a862185c0d5dda198e82accfd1322ad86470643 Mon Sep 17 00:00:00 2001 From: AdityaVKochar Date: Sat, 18 Oct 2025 10:01:35 +0530 Subject: [PATCH 6/8] fix: fixed for linux --- apps/desktop/src-tauri/src/browser_details.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/src-tauri/src/browser_details.rs b/apps/desktop/src-tauri/src/browser_details.rs index 94f3de8..1d1cce3 100644 --- a/apps/desktop/src-tauri/src/browser_details.rs +++ b/apps/desktop/src-tauri/src/browser_details.rs @@ -98,7 +98,7 @@ pub fn get_firefox_profiles() -> Result, Box> let base_dir = if cfg!(target_os = "windows") || cfg!(target_os = "macos") { data_local_dir() } else { - config_dir() + dirs::home_dir() }; if let Some(mut path) = base_dir { From fb63e25a646ae25acffdb2db2f9abafa10cf75bd Mon Sep 17 00:00:00 2001 From: AdityaVKochar Date: Sat, 18 Oct 2025 21:09:34 +0530 Subject: [PATCH 7/8] fix returns empty vector on wrong kind --- apps/desktop/src-tauri/src/browser_details.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/src-tauri/src/browser_details.rs b/apps/desktop/src-tauri/src/browser_details.rs index 1d1cce3..41b9ddd 100644 --- a/apps/desktop/src-tauri/src/browser_details.rs +++ b/apps/desktop/src-tauri/src/browser_details.rs @@ -87,7 +87,7 @@ pub fn get_chrome_profiles(kind: Browsers) -> Result, Box Vec::new(), + _ => return Ok(Vec::new()), }; return get_chrome_based_profiles(paths); From bee10bff78eaa5a7042e1b12c0273417412c5093 Mon Sep 17 00:00:00 2001 From: AdityaVKochar Date: Sat, 18 Oct 2025 21:21:12 +0530 Subject: [PATCH 8/8] fix: fixed paths in mac and linux --- apps/desktop/src-tauri/src/browser_details.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/desktop/src-tauri/src/browser_details.rs b/apps/desktop/src-tauri/src/browser_details.rs index 41b9ddd..af26107 100644 --- a/apps/desktop/src-tauri/src/browser_details.rs +++ b/apps/desktop/src-tauri/src/browser_details.rs @@ -107,10 +107,10 @@ pub fn get_firefox_profiles() -> Result, Box> path.push("Mozilla\\Firefox\\Profiles"); #[cfg(target_os = "macos")] - path.push("Mozilla/Firefox/Profiles"); + path.push("Firefox/Profiles"); #[cfg(target_os = "linux")] - path.push("mozilla-firefox/"); + path.push("~/.mozilla/firefox"); if path.exists() { match fs::read_dir(path) {