use crate::forensics::ForensicConfig;
use crate::types::{Cookie, Result};
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Evidence {
pub id: Uuid,
pub collected_at: DateTime<Utc>,
pub collector: String,
pub items: Vec<Cookie>,
pub chain_of_custody: Vec<CustodyEntry>,
pub hash: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CustodyEntry {
pub timestamp: DateTime<Utc>,
pub accessor: String,
pub action: String,
pub hash: String,
}
pub struct EvidenceCollector;
impl EvidenceCollector {
pub fn collect(cookies: &[Cookie], _config: &ForensicConfig) -> Result<Evidence> {
let id = Uuid::new_v4();
let collected_at = Utc::now();
let collector = std::env::var("USER").unwrap_or_else(|_| "unknown".to_string());
let evidence_hash = Self::calculate_hash(cookies);
let chain_of_custody = vec![CustodyEntry {
timestamp: collected_at,
accessor: collector.clone(),
action: "Initial collection".to_string(),
hash: evidence_hash.clone(),
}];
Ok(Evidence {
id,
collected_at,
collector,
items: cookies.to_vec(),
chain_of_custody,
hash: evidence_hash,
})
}
fn calculate_hash(cookies: &[Cookie]) -> String {
use sha2::{Digest, Sha256};
let serialized = serde_json::to_string(cookies).unwrap_or_default();
let mut hasher = Sha256::new();
hasher.update(serialized.as_bytes());
format!("{:x}", hasher.finalize())
}
}