use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_with::{DeserializeFromStr, SerializeDisplay};
use struct_metadata::Described;
use crate::{ElasticMeta, Readable};
use crate::types::{ClassificationString, ExpandingClassification, Sha1, Sha256, MD5};
use super::badlist::SourceTypes;
#[derive(SerializeDisplay, DeserializeFromStr, strum::Display, strum::EnumString, Described, Debug, Clone, Copy, PartialEq, Eq)]
#[metadata_type(ElasticMeta)]
#[strum(serialize_all = "lowercase")]
pub enum SafehashTypes {
File,
Tag,
Signature
}
#[derive(Debug, Serialize, Deserialize, Described, Default, PartialEq, Eq)]
#[serde(default)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=true)]
pub struct Hashes {
#[metadata(copyto="__text__")]
pub md5: Option<MD5>,
#[metadata(copyto="__text__")]
pub sha1: Option<Sha1>,
#[metadata(copyto="__text__")]
pub sha256: Option<Sha256>,
}
#[derive(Debug, Serialize, Deserialize, Described, Default, PartialEq, Eq)]
#[serde(default)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=false)]
pub struct File {
#[metadata(store=true, copyto="__text__")]
pub name: Vec<String>,
#[metadata(mapping="long")]
pub size: Option<u64>,
#[serde(rename="type")]
pub type_: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Described, PartialEq, Eq)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=false)]
pub struct Source {
pub classification: ClassificationString,
#[metadata(store=true)]
pub name: String,
pub reason: Vec<String>,
#[serde(rename="type")]
pub type_: SourceTypes
}
#[derive(Debug, Serialize, Deserialize, Described, PartialEq, Eq)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=true)]
pub struct Tag {
#[serde(rename="type")]
pub type_: String,
#[metadata(copyto="__text__")]
pub value: String,
}
#[derive(Debug, Serialize, Deserialize, Described, PartialEq, Eq)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=true)]
pub struct Signature {
#[metadata(copyto="__text__")]
pub name: String,
}
#[derive(Debug, Serialize, Deserialize, Described, PartialEq, Eq)]
#[metadata_type(ElasticMeta)]
#[metadata(index=true, store=true)]
pub struct Safelist {
pub added: DateTime<Utc>,
#[serde(flatten)]
pub classification: ExpandingClassification,
#[serde(default="default_enabled")]
pub enabled: bool,
pub expiry_ts: Option<DateTime<Utc>>,
#[serde(default)]
pub hashes: Hashes,
pub file: Option<File>,
pub sources: Vec<Source>,
pub tag: Option<Tag>,
pub signature: Option<Signature>,
#[serde(rename="type")]
pub type_: SafehashTypes,
pub updated: DateTime<Utc>,
}
fn default_enabled() -> bool { true }
impl Readable for Safelist {
fn set_from_archive(&mut self, _from_archive: bool) {}
}