aboutsummaryrefslogtreecommitdiff
path: root/src/parser
diff options
context:
space:
mode:
authorshukuru <shukuru@boitalett.re>2024-02-18 22:11:16 +0100
committershukuru <shukuru@boitalett.re>2024-02-18 22:11:16 +0100
commit3bffae34eb3196fbe9a2cbc33c5c52e59461a5f4 (patch)
tree4296d412cfb7befb54c5abfb89b4e35484e61300 /src/parser
parent374acb9972034e0c53683c3ac44473e36c0fe406 (diff)
Update XML parsing feature
- Implements DMARC raw deserialization - Add test - Add a fixture
Diffstat (limited to 'src/parser')
-rw-r--r--src/parser/deserializer.rs86
-rw-r--r--src/parser/mod.rs1
2 files changed, 87 insertions, 0 deletions
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<R: Read>(reader: R) ->
+Result<data_structures::Feedback, serde_xml_rs::Error> {
+ 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);
+ }
+ }
+ }
+}
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
new file mode 100644
index 0000000..218d426
--- /dev/null
+++ b/src/parser/mod.rs
@@ -0,0 +1 @@
+pub mod deserializer;