use crate::db::types::FileMetadata;
use crate::State;
use malwaredb_types::KnownType;
use std::sync::Arc;
use anyhow::{bail, Result};
use tracing::{error, trace};
pub async fn incoming_sample(
state: Arc<State>,
data: Vec<u8>,
uid: i32,
sid: i32,
file_name: String,
) -> Result<()> {
let known_type = match KnownType::new(&data) {
Ok(t) => t,
Err(e) => {
error!("Error determining type: {e}");
return Err(e);
}
};
let meta_data = FileMetadata::new(&data, Some(&file_name));
let db_file_type = state.db_type.get_type_id_for_bytes(&data).await;
if let Err(e) = db_file_type {
error!("db_file_type error or is none: {e}");
bail!("file type unknown or error: {e}");
}
let db_file_type = db_file_type.unwrap();
match state
.db_type
.add_file(&meta_data, known_type, uid, sid, db_file_type, None)
.await
{
Ok(_) => {
trace!("Storing sample!");
if let Err(e) = state.store_bytes(&data) {
error!("Error storing sample: {e}");
Err(e)
} else {
Ok(())
}
}
Err(e) => {
error!("Error storing bytes: {e}");
Err(e)
}
}
}