use chrono::{DateTime, Utc};
use serde::{Serialize, Deserialize};
use struct_metadata::Described;
use crate::{Sha256, MD5, SSDeepHash, Sha1, ElasticMeta, ExpandingClassification};
#[derive(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(Serialize, Deserialize, Described, Clone)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=true)]
pub struct Seen {
#[serde(default = "default_seen_count")]
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(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: f64,
#[metadata(store=false)]
pub expiry_ts: Option<DateTime<Utc>>,
#[serde(default)]
pub is_section_image: bool,
#[metadata(index=false, store=false)]
pub hex: String,
#[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,
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>,
}