assemblyline_models/datastore/
file.rsuse chrono::{DateTime, Utc};
use serde::{Serialize, Deserialize};
use serde_with::{DeserializeFromStr, SerializeDisplay};
use struct_metadata::Described;
use crate::{ElasticMeta, ExpandingClassification, SSDeepHash, Sha1, Sha256, Text, MD5};
#[derive(Debug, Serialize, Deserialize, Described, Clone)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=true)]
pub struct File {
#[metadata(index=false, store=false)]
pub ascii: String,
#[serde(flatten)]
pub classification: ExpandingClassification,
pub entropy: f32,
#[metadata(store=false)]
pub expiry_ts: Option<DateTime<Utc>>,
#[serde(default)]
pub is_section_image: bool,
#[serde(default)]
pub is_supplementary: bool,
#[metadata(index=false, store=false)]
pub hex: String,
#[serde(default)]
#[metadata(copyto="__text__")]
pub labels: Vec<String>,
#[serde(default)]
pub label_categories: LabelCategories,
#[metadata(copyto="__text__")]
pub md5: MD5,
#[metadata(store=false)]
pub magic: String,
#[metadata(store=false)]
pub mime: Option<String>,
#[serde(default)]
pub seen: Seen,
#[metadata(copyto="__text__")]
pub sha1: Sha1,
#[metadata(copyto="__text__")]
pub sha256: Sha256,
#[metadata(mapping="integer")]
pub size: u64,
#[metadata(store=false)]
pub ssdeep: SSDeepHash,
#[serde(rename = "type")]
#[metadata(copyto="__text__")]
pub file_type: String,
#[metadata(copyto="__text__")]
pub tlsh: Option<String>,
#[serde(default)]
#[metadata(index=false, store=false)]
pub from_archive: bool,
pub uri_info: Option<URIInfo>,
#[serde(default)]
pub comments: Vec<Comment>,
}
#[derive(Debug, Serialize, Deserialize, Described, Clone)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=true)]
pub struct URIInfo {
pub uri: String,
scheme: String,
netloc: String,
path: Option<String>,
params: Option<String>,
query: Option<String>,
fragment: Option<String>,
username: Option<String>,
password: Option<String>,
hostname: String,
port: Option<u16>,
}
#[derive(Debug, Serialize, Deserialize, Described, Clone)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=true)]
pub struct Seen {
#[serde(default = "default_seen_count")]
#[metadata(mapping="integer")]
pub count: u64,
#[serde(default = "default_now")]
pub first: DateTime<Utc>,
#[serde(default = "default_now")]
pub last: DateTime<Utc>,
}
fn default_seen_count() -> u64 { 1 }
fn default_now() -> DateTime<Utc> { Utc::now() }
impl Default for Seen {
fn default() -> Self {
Self {
count: default_seen_count(),
first: default_now(),
last: default_now()
}
}
}
#[derive(Debug, Serialize, Deserialize, Described, Clone, Default)]
#[serde(default)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=true)]
pub struct LabelCategories {
pub info: Vec<String>,
pub technique: Vec<String>,
pub attribution: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize, Described, Clone)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=false)]
pub struct Comment {
pub cid: String,
pub uname: String,
#[serde(default="Utc::now")]
#[metadata(store=true)]
pub date: DateTime<Utc>,
pub text: Text,
#[serde(default)]
pub reactions: Vec<Reaction>,
}
#[derive(Debug, Serialize, Deserialize, Described, Clone)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=false)]
pub struct Reaction {
pub icon: ReactionsTypes,
pub uname: String,
}
#[derive(SerializeDisplay, DeserializeFromStr, strum::Display, strum::EnumString, Described, PartialEq, Eq, Debug, Clone, Copy)]
#[metadata_type(ElasticMeta)]
#[metadata(mapping="keyword")]
#[strum(serialize_all = "snake_case")]
pub enum ReactionsTypes {
ThumbsUp,
ThumbsDown,
Love,
Smile,
Surprised,
Party
}