use std::path::Path;
use config::Browser;
#[derive(Debug, Clone)]
pub(crate) struct Cookie {
pub name: String,
pub value: String,
}
#[cfg(not(target_os = "windows"))]
pub(crate) async fn read_cookies(
browser: Browser,
profile_root: &Path,
domain: &str,
) -> Result<Vec<Cookie>, String> {
let db_path = super::profile::pick_cookies_path(profile_root).ok_or_else(|| {
format!(
"no Cookies database under {} — is `{}` installed?",
profile_root.display(),
browser.label()
)
})?;
let browser_name = browser.id();
let domains = vec![domain.to_string()];
let cookies = tokio::task::spawn_blocking(move || -> Result<Vec<Cookie>, String> {
let config = rookie::config::get_browser_config(browser_name);
let raw =
rookie::chromium_based(config, db_path, Some(domains)).map_err(|e| e.to_string())?;
Ok(raw
.into_iter()
.map(|c| Cookie {
name: c.name,
value: c.value,
})
.collect())
})
.await
.map_err(|e| format!("cookie extract task: {e}"))??;
tracing::trace!(
browser = browser_name,
domain,
count = cookies.len(),
"read cookies from isolated profile"
);
Ok(cookies)
}
#[cfg(target_os = "windows")]
pub(crate) async fn read_cookies(
browser: Browser,
profile_root: &Path,
domain: &str,
) -> Result<Vec<Cookie>, String> {
super::windows_native::read_cookies(browser, profile_root, domain).await
}