diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c1e2de..8505437 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +mail-auth 0.3.3 +================================ +- Bump `mail-parser` dependency to 0.9 +- Bump `trust-dns-resolver` dependency to 0.23 + mail-auth 0.3.2 ================================ - Bump `mail-builder` dependency to 0.3 diff --git a/Cargo.toml b/Cargo.toml index 1e767b5..196a6da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "mail-auth" description = "DKIM, ARC, SPF and DMARC library for Rust" -version = "0.3.2" +version = "0.3.3" edition = "2021" authors = [ "Stalwart Labs "] license = "Apache-2.0 OR MIT" @@ -22,21 +22,21 @@ test = [] [dependencies] ahash = "0.8.0" -ed25519-dalek = { version = "1.0.1", optional = true } +ed25519-dalek = { version = "1.0", optional = true } flate2 = "1.0.25" lru-cache = "0.1.2" -mail-parser = { version = "0.8", git = "https://github.com/stalwartlabs/mail-parser", features = ["ludicrous_mode", "full_encoding"] } +mail-parser = { version = "0.9", git = "https://github.com/stalwartlabs/mail-parser", features = ["ludicrous_mode", "full_encoding"] } mail-builder = { version = "0.3", git = "https://github.com/stalwartlabs/mail-builder", features = ["ludicrous_mode"] } parking_lot = "0.12.0" -quick-xml = "0.28" +quick-xml = "0.30" ring = { version = "0.16.20", optional = true } -rsa = { version = "0.7.0", optional = true } +rsa = { version = "0.7", optional = true } rustls-pemfile = { version = "1", optional = true } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" sha1 = { version = "0.10", features = ["oid"], optional = true } sha2 = { version = "0.10.6", features = ["oid"], optional = true } -trust-dns-resolver = { version = "0.22.0", features = ["dns-over-rustls", "dnssec-ring"] } +trust-dns-resolver = { version = "0.23", features = ["dns-over-rustls", "dnssec-ring"] } zip = "0.6.3" [dev-dependencies] diff --git a/src/common/headers.rs b/src/common/headers.rs index 51cdb07..2cf0265 100644 --- a/src/common/headers.rs +++ b/src/common/headers.rs @@ -539,7 +539,7 @@ mod test { #[test] fn chained_header_iterator() { - let parts = vec![ + let parts = [ &b"From: a\nTo: b\nEmpty:\nMulti: 1\n 2\n"[..], &b"Subject: c\nReceived: d\n\nhey"[..], ]; diff --git a/src/common/message.rs b/src/common/message.rs index 7575405..e570a29 100644 --- a/src/common/message.rs +++ b/src/common/message.rs @@ -8,7 +8,7 @@ * except according to those terms. */ -use mail_parser::{parsers::MessageStream, HeaderValue}; +use mail_parser::{parsers::MessageStream, Address, HeaderValue}; use crate::{arc, common::crypto::HashAlgorithm, dkim, AuthenticatedMessage}; @@ -96,26 +96,13 @@ impl<'x> AuthenticatedMessage<'x> { } AuthenticatedHeader::From(name) => { match MessageStream::new(value).parse_address() { - HeaderValue::Address(addr) => { - if let Some(addr) = addr.address { - message.from.push(addr.to_lowercase()); - } - } - HeaderValue::AddressList(list) => { + HeaderValue::Address(Address::List(list)) => { message.from.extend( list.into_iter() .filter_map(|a| a.address.map(|a| a.to_lowercase())), ); } - HeaderValue::Group(group) => { - message.from.extend( - group - .addresses - .into_iter() - .filter_map(|a| a.address.map(|a| a.to_lowercase())), - ); - } - HeaderValue::GroupList(group_list) => { + HeaderValue::Address(Address::Group(group_list)) => { message .from .extend(group_list.into_iter().flat_map(|group| { diff --git a/src/common/resolver.rs b/src/common/resolver.rs index 85d566c..87b0e2c 100644 --- a/src/common/resolver.rs +++ b/src/common/resolver.rs @@ -72,7 +72,7 @@ impl Resolver { capacity: usize, ) -> Result { Ok(Self { - resolver: AsyncResolver::tokio(config, options)?, + resolver: AsyncResolver::tokio(config, options), cache_txt: LruCache::with_capacity(capacity), cache_mx: LruCache::with_capacity(capacity), cache_ipv4: LruCache::with_capacity(capacity), @@ -91,7 +91,7 @@ impl Resolver { ptr_capacity: usize, ) -> Result { Ok(Self { - resolver: AsyncResolver::tokio(config, options)?, + resolver: AsyncResolver::tokio(config, options), cache_txt: LruCache::with_capacity(txt_capacity), cache_mx: LruCache::with_capacity(mx_capacity), cache_ipv4: LruCache::with_capacity(ipv4_capacity), @@ -196,10 +196,10 @@ impl Resolver { } let ipv4_lookup = self.resolver.ipv4_lookup(key.as_ref()).await?; - let ips = ipv4_lookup + let ips: Vec = ipv4_lookup .as_lookup() .record_iter() - .filter_map(|r| (*r.data()?.as_a()?).into()) + .filter_map(|r| r.data()?.as_a()?.0.into()) .collect::>(); Ok(self @@ -225,7 +225,7 @@ impl Resolver { let ips = ipv6_lookup .as_lookup() .record_iter() - .filter_map(|r| (*r.data()?.as_aaaa()?).into()) + .filter_map(|r| r.data()?.as_aaaa()?.0.into()) .collect::>(); Ok(self @@ -325,7 +325,7 @@ impl Resolver { match self.resolver.lookup_ip(key.as_ref()).await { Ok(result) => Ok(result.as_lookup().record_iter().any(|r| { r.data().map_or(false, |d| { - matches!(d.to_record_type(), RecordType::A | RecordType::AAAA) + matches!(d.record_type(), RecordType::A | RecordType::AAAA) }) })), Err(err) => { diff --git a/src/report/arf/parse.rs b/src/report/arf/parse.rs index b5ecf0f..a93cd85 100644 --- a/src/report/arf/parse.rs +++ b/src/report/arf/parse.rs @@ -10,7 +10,7 @@ use std::borrow::Cow; -use mail_parser::{parsers::MessageStream, HeaderValue, Message, MimeHeaders, PartType}; +use mail_parser::{parsers::MessageStream, HeaderValue, MessageParser, MimeHeaders, PartType}; use crate::{ common::headers::HeaderIterator, @@ -19,7 +19,9 @@ use crate::{ impl<'x> Feedback<'x> { pub fn parse_rfc5322(message: &'x [u8]) -> Result { - let message = Message::parse(message).ok_or(Error::MailParseError)?; + let message = MessageParser::new() + .parse(message) + .ok_or(Error::MailParseError)?; let mut feedback = None; let mut included_message = None; let mut included_headers = None; diff --git a/src/report/dmarc/parse.rs b/src/report/dmarc/parse.rs index 274b5a9..a7646f4 100644 --- a/src/report/dmarc/parse.rs +++ b/src/report/dmarc/parse.rs @@ -13,7 +13,7 @@ use std::net::IpAddr; use std::str::FromStr; use flate2::read::GzDecoder; -use mail_parser::{Message, MimeHeaders, PartType}; +use mail_parser::{MessageParser, MimeHeaders, PartType}; use quick_xml::events::{BytesStart, Event}; use quick_xml::reader::Reader; @@ -26,7 +26,9 @@ use crate::report::{ impl Report { pub fn parse_rfc5322(report: &[u8]) -> Result { - let message = Message::parse(report).ok_or(Error::MailParseError)?; + let message = MessageParser::new() + .parse(report) + .ok_or(Error::MailParseError)?; let mut error = Error::NoReportsFound; for part in &message.parts { diff --git a/src/report/tlsrpt/parse.rs b/src/report/tlsrpt/parse.rs index b3d5aed..97e3d5e 100644 --- a/src/report/tlsrpt/parse.rs +++ b/src/report/tlsrpt/parse.rs @@ -11,7 +11,7 @@ use std::io::{Cursor, Read}; use flate2::read::GzDecoder; -use mail_parser::{Message, MimeHeaders, PartType}; +use mail_parser::{MessageParser, MimeHeaders, PartType}; use zip::ZipArchive; use crate::report::Error; @@ -24,7 +24,9 @@ impl TlsReport { } pub fn parse_rfc5322(report: &[u8]) -> Result { - let message = Message::parse(report).ok_or(Error::MailParseError)?; + let message = MessageParser::new() + .parse(report) + .ok_or(Error::MailParseError)?; let mut error = Error::NoReportsFound; for part in &message.parts {