From 3bffae34eb3196fbe9a2cbc33c5c52e59461a5f4 Mon Sep 17 00:00:00 2001 From: shukuru Date: Sun, 18 Feb 2024 22:11:16 +0100 Subject: Update XML parsing feature - Implements DMARC raw deserialization - Add test - Add a fixture --- src/parser/deserializer.rs | 86 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/parser/deserializer.rs (limited to 'src/parser/deserializer.rs') diff --git a/src/parser/deserializer.rs b/src/parser/deserializer.rs new file mode 100644 index 0000000..75d3c6e --- /dev/null +++ b/src/parser/deserializer.rs @@ -0,0 +1,86 @@ +use std::io::Read; + +use crate::data_structures; + +fn deserialize_dmarc_report(reader: R) -> +Result { + serde_xml_rs::from_reader(reader) +} + +#[cfg(test)] +mod test { + use super::*; + + use std::fs::File; + use std::io::BufReader; + + #[test] + fn test_deserialize_dmarc_report() { + let dmarc_report_file = File::open("fixtures/dmarc_report_fixture.xml").unwrap(); + + let reader = BufReader::new(dmarc_report_file); + + let should_be = data_structures::Feedback { + version: String::from("1.0"), + report_metadata: data_structures::ReportMetadata { + org_name: String::from("Enterprise Outlook"), + email: String::from("dmarcreport@microsoft.com"), + report_id: String::from("3374fb5148ba40c1a5cf8e3d36f34a34"), + date_range: data_structures::DateRange { + begin: String::from("1707436800"), + end: String::from("1707523200"), + }, + }, + policy_published: data_structures::PolicyPublished { + domain: String::from("boitalett.re"), + adkim: String::from("s"), + aspf: String::from("s"), + p: String::from("reject"), + sp: String::from("reject"), + pct: String::from("100"), + fo: String::from("0"), + }, + record: data_structures::Record { + row: data_structures::Row { + source_ip: String::from("195.154.102.43"), + count: String::from("1"), + policy_evaluated: data_structures::PolicyEvaluated { + disposition: String::from("none"), + dkim: String::from("pass"), + spf: String::from("pass"), + }, + }, + identifiers: data_structures::Identifiers { + envelope_to: String::from("babilou.com"), + envelope_from: String::from("boitalett.re"), + header_from: String::from("boitalett.re"), + }, + auth_results: data_structures::AuthResults { + dkim: data_structures::DKIM { + domain: String::from("boitalett.re"), + selector: String::from("2023101501"), + result: String::from("pass"), + }, + spf: data_structures::SPF { + domain: String::from("boitalett.re"), + scope: String::from("mfrom"), + result: String::from("pass"), + }, + }, + }, + }; + + match deserialize_dmarc_report(reader) { + Ok(report) => { + assert_eq!( + report.report_metadata.report_id, + should_be.report_metadata.report_id + ); + println!("{:?}", report); + }, + Err(err) => { + panic!("{:?}", err); + } + } + } +} -- cgit v1.2.3