1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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)
        }
    }
}