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:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user