#![warn(missing_docs)]
mod binary;
mod browser;
mod cookie;
mod crypt;
mod error;
mod sqlite;
use log::debug;
use strum::IntoEnumIterator;
use crate::crypt::*;
use crate::sqlite::*;
pub use crate::binary::parse_binarycookie_file;
pub use crate::browser::KnownBrowser;
pub use crate::browser::KnownEngine;
pub use crate::cookie::Cookie;
pub use crate::cookie::SameSite;
pub use crate::error::Error;
fn get_sqlite_dbs(path: &std::path::Path, depth: usize, name: &str) -> Vec<std::path::PathBuf> {
let mut result = Vec::default();
for entry_result in walkdir::WalkDir::new(path)
.follow_links(true)
.min_depth(0)
.max_depth(depth)
.into_iter()
{
match entry_result {
Err(_) => {}
Ok(entry) => {
if entry.file_name() == name {
result.push(entry.into_path());
}
}
}
}
result
}
fn get_chromium_cookies(
path: &std::path::Path,
key: ChromiumKey,
) -> Vec<Result<Vec<Cookie>, Error>> {
get_sqlite_dbs(path, 3, "Cookies")
.iter()
.map(|filepath| {
debug!("Found Chromium cookies at: {:?}", filepath);
let connection = Connection::open_sqlite(filepath)?;
let values =
connection.fetch_sqlite_cookies(SqliteBrowserEngine::Chromium(key.clone()))?;
Ok(values)
})
.collect()
}
fn get_firefox_cookies(path: &std::path::Path) -> Vec<Result<Vec<Cookie>, Error>> {
get_sqlite_dbs(path, 3, "cookies.sqlite")
.iter()
.map(|filepath| {
let connection = Connection::open_sqlite(filepath)?;
let values = connection.fetch_sqlite_cookies(SqliteBrowserEngine::Firefox)?;
Ok(values)
})
.collect()
}
fn get_safari_cookies(path: &std::path::Path) -> Result<Vec<Cookie>, Error> {
let mut all_cookies = Vec::default();
for entry in (path.read_dir()?).flatten() {
if entry.path().extension() == Some(std::ffi::OsStr::new("binarycookies")) {
let contents: Vec<u8> = std::fs::read(entry.path())?;
let mut cookies = parse_binarycookie_file(&contents)?;
all_cookies.append(&mut cookies);
}
}
Ok(all_cookies)
}
pub struct KnownBrowserCookies {
pub browser: KnownBrowser,
pub cookies: Vec<Cookie>,
}
pub fn find_cookies() -> Result<Vec<KnownBrowserCookies>, Error> {
let mut all_cookies = Vec::default();
for browser in KnownBrowser::iter() {
if let Some(path) = browser.default_config_path() {
let mut cookies = find_cookies_at(browser, &path);
all_cookies.append(&mut cookies);
}
}
Ok(all_cookies)
}
pub fn find_cookies_at(browser: KnownBrowser, path: &std::path::Path) -> Vec<KnownBrowserCookies> {
let mut all_cookies = Vec::default();
match browser.engine() {
KnownEngine::Firefox => {
for cookies in get_firefox_cookies(path).into_iter().flatten() {
all_cookies.push(KnownBrowserCookies {
browser: browser.clone(),
cookies,
});
}
}
KnownEngine::Chromium(name) => {
if let Ok(key) = get_chromium_master_key(name, path) {
for cookies in get_chromium_cookies(path, key).into_iter().flatten() {
all_cookies.push(KnownBrowserCookies {
browser: browser.clone(),
cookies,
});
}
}
}
KnownEngine::Safari => {
if let Ok(cookies) = get_safari_cookies(path) {
all_cookies.push(KnownBrowserCookies { browser, cookies });
}
}
};
all_cookies
}
#[cfg(test)]
mod tests {}