mod containers_parsing;
mod decode;
pub mod types;
pub use types::{
ArtifactDescriptor, ArtifactLocation, ArtifactParsingProfile, ArtifactQuery, ArtifactRecord,
ArtifactValue, BinaryField, BinaryFieldType, ContainerProfile, ContainerSignature, DataScope,
DecodeError, Decoder, FieldSchema, ForensicCatalog, HiveTarget, OsScope, Platform,
PlatformMask, RecordSignature, TriagePriority, ValueType,
};
pub use containers_parsing::{
all_container_profiles, all_container_signatures, all_parsing_profiles, all_record_signatures,
container_profile, container_signature, parsing_profile, record_signatures_for_container,
};
#[doc(hidden)]
pub use decode::{filetime_to_iso8601, rot13};
impl ForensicCatalog {
pub fn parsing_profile(&self, id: &str) -> Option<&'static ArtifactParsingProfile> {
containers_parsing::parsing_profile(id)
}
pub fn container_profile(&self, id: &str) -> Option<&'static ContainerProfile> {
if let Some(binding) = containers_parsing::artifact_container_bindings()
.iter()
.find(|b| b.artifact_id.eq_ignore_ascii_case(id))
{
return containers_parsing::container_profile(binding.container_id);
}
let desc = self.by_id(id)?;
containers_parsing::infer_container_profile_pub(desc)
}
pub fn container_signature(&self, id: &str) -> Option<&'static ContainerSignature> {
let profile = self.container_profile(id)?;
containers_parsing::container_signature(profile.id)
}
pub fn record_signatures(&self, id: &str) -> Vec<&'static RecordSignature> {
let direct: Vec<&'static RecordSignature> = containers_parsing::all_record_signatures()
.iter()
.filter(|sig| {
sig.artifact_id
.is_some_and(|artifact_id| artifact_id.eq_ignore_ascii_case(id))
})
.collect();
if !direct.is_empty() {
return direct;
}
if let Some(profile) = self.container_profile(id) {
return containers_parsing::record_signatures_for_container(profile.id);
}
Vec::new()
}
pub fn decode(
&self,
descriptor: &ArtifactDescriptor,
name: &str,
raw: &[u8],
) -> Result<ArtifactRecord, DecodeError> {
decode::decode_artifact(descriptor, name, raw)
}
}