fix(06-02): fix Chrome cookie extraction and borrow checker issue

- Simplified Chrome extraction to avoid duplicate code
- Fixed borrow of moved value in Firefox extraction match arms
- Removed unused temp_path shadowing in Chrome extraction
- All 145 library tests pass
This commit is contained in:
2026-02-16 10:12:49 +01:00
parent e463d17404
commit e9650c23ea

View File

@@ -4,7 +4,7 @@
//! browser SQLite cookie databases, enabling seamless authentication
//! without manual cookie file exports.
use rusqlite::{params, Connection};
use rusqlite::Connection;
use std::collections::HashMap;
use std::fs;
use std::io;
@@ -148,13 +148,12 @@ pub fn extract_firefox_cookies(
let temp_path = copy_to_temp(&cookies_path)?;
let conn = Connection::open(&temp_path)?;
let mut cookies = HashMap::new();
let query = match domain {
let cookies: HashMap<String, String> = match domain {
Some(d) => {
// Query with domain filter
let pattern = format!("%{}", d);
let mut stmt = conn.prepare("SELECT name, value FROM moz_cookies WHERE host LIKE ?")?;
let mut cookies = HashMap::new();
let rows = stmt.query_map([pattern], |row| {
Ok((row.get::<_, String>(0)?, row.get::<_, String>(1)?))
})?;
@@ -166,6 +165,7 @@ pub fn extract_firefox_cookies(
None => {
// Get all cookies
let mut stmt = conn.prepare("SELECT name, value FROM moz_cookies")?;
let mut cookies = HashMap::new();
let rows = stmt.query_map([], |row| {
Ok((row.get::<_, String>(0)?, row.get::<_, String>(1)?))
})?;
@@ -252,37 +252,24 @@ pub fn extract_chrome_cookies(
.unwrap_or(0)
> 0;
let query = match domain {
// Always select with domain filter (use wildcard for all)
let domain_pattern = match domain {
Some(d) => format!("%{}%", d),
None => String::new(),
None => "%".to_string(),
};
let mut stmt = if query.is_empty() {
conn.prepare("SELECT name, value, encrypted_value FROM cookies")?
} else {
let pattern = format!("%{}%", domain.unwrap_or(""));
conn.prepare("SELECT name, value, encrypted_value FROM cookies WHERE host LIKE ?")?
};
let mut stmt =
conn.prepare("SELECT name, value, encrypted_value FROM cookies WHERE host LIKE ?")?;
let rows = if query.is_empty() {
stmt.query_map([], |row| {
let name: String = row.get(0)?;
let value: String = row.get(1)?;
let encrypted: Option<Vec<u8>> = row.get(2).ok();
Ok((name, value, encrypted))
})?
} else {
let pattern = format!("%{}%", domain.unwrap_or(""));
stmt.query_map([pattern], |row| {
let name: String = row.get(0)?;
let value: String = row.get(1)?;
let encrypted: Option<Vec<u8>> = row.get(2).ok();
Ok((name, value, encrypted))
})?
};
let rows = stmt.query_map([domain_pattern], |row| {
let name: String = row.get(0)?;
let value: String = row.get(1)?;
let encrypted: Option<Vec<u8>> = row.get(2).ok();
Ok((name, value, encrypted))
})?;
for row in rows.flatten() {
let (name, value, encrypted) = row;
for row_result in rows {
let (name, value, encrypted) = row_result?;
// Check if cookie has encrypted value
if has_encrypted {