Skip to content

Commit 1d2c50a

Browse files
committed
v0.5.1
1 parent 600b85e commit 1d2c50a

File tree

13 files changed

+301
-180
lines changed

13 files changed

+301
-180
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
mail-auth 0.5.1
2+
================================
3+
- Build `AuthenticatedMessage` from `mail-parser::Message`.
4+
15
mail-auth 0.5.0
26
================================
37
- Fix: Use public suffix list for DMARC relaxed alignment verification (#37)

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ lru-cache = "0.1.2"
3030
mail-parser = { version = "0.9", features = ["ludicrous_mode", "full_encoding"] }
3131
mail-builder = { version = "0.3", features = ["ludicrous_mode"] }
3232
parking_lot = "0.12.0"
33-
quick-xml = { version = "0.36", optional = true }
33+
quick-xml = { version = "0.37", optional = true }
3434
ring = { version = "0.17", optional = true }
3535
rsa = { version = "0.9.6", optional = true }
3636
rustls-pemfile = { version = "2", optional = true }

src/arc/mod.rs

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -34,53 +34,53 @@ pub struct ArcSealer<T: SigningKey<Hasher = Sha256>, State = NeedDomain> {
3434

3535
#[derive(Debug, PartialEq, Eq, Clone, Default)]
3636
pub struct Signature {
37-
pub(crate) i: u32,
38-
pub(crate) a: Algorithm,
39-
pub(crate) d: String,
40-
pub(crate) s: String,
41-
pub(crate) b: Vec<u8>,
42-
pub(crate) bh: Vec<u8>,
43-
pub(crate) h: Vec<String>,
44-
pub(crate) z: Vec<String>,
45-
pub(crate) l: u64,
46-
pub(crate) x: u64,
47-
pub(crate) t: u64,
48-
pub(crate) ch: Canonicalization,
49-
pub(crate) cb: Canonicalization,
37+
pub i: u32,
38+
pub a: Algorithm,
39+
pub d: String,
40+
pub s: String,
41+
pub b: Vec<u8>,
42+
pub bh: Vec<u8>,
43+
pub h: Vec<String>,
44+
pub z: Vec<String>,
45+
pub l: u64,
46+
pub x: u64,
47+
pub t: u64,
48+
pub ch: Canonicalization,
49+
pub cb: Canonicalization,
5050
}
5151

5252
#[derive(Debug, PartialEq, Eq, Clone, Default)]
5353
pub struct Seal {
54-
pub(crate) i: u32,
55-
pub(crate) a: Algorithm,
56-
pub(crate) b: Vec<u8>,
57-
pub(crate) d: String,
58-
pub(crate) s: String,
59-
pub(crate) t: u64,
60-
pub(crate) cv: ChainValidation,
54+
pub i: u32,
55+
pub a: Algorithm,
56+
pub b: Vec<u8>,
57+
pub d: String,
58+
pub s: String,
59+
pub t: u64,
60+
pub cv: ChainValidation,
6161
}
6262

6363
#[derive(Debug, PartialEq, Eq, Clone)]
6464
pub struct Results {
65-
pub(crate) i: u32,
65+
pub i: u32,
6666
}
6767

6868
#[derive(Debug, Clone, PartialEq, Eq)]
6969
pub struct ArcSet<'x> {
70-
pub(crate) signature: Signature,
71-
pub(crate) seal: Seal,
72-
pub(crate) results: &'x AuthenticationResults<'x>,
70+
pub signature: Signature,
71+
pub seal: Seal,
72+
pub results: &'x AuthenticationResults<'x>,
7373
}
7474

7575
#[derive(Debug, Clone, PartialEq, Eq)]
7676
pub struct Set<'x> {
77-
pub(crate) signature: Header<'x, &'x Signature>,
78-
pub(crate) seal: Header<'x, &'x Seal>,
79-
pub(crate) results: Header<'x, &'x Results>,
77+
pub signature: Header<'x, &'x Signature>,
78+
pub seal: Header<'x, &'x Seal>,
79+
pub results: Header<'x, &'x Results>,
8080
}
8181

8282
#[derive(Debug, PartialEq, Eq, Clone, Default)]
83-
pub(crate) enum ChainValidation {
83+
pub enum ChainValidation {
8484
#[default]
8585
None,
8686
Fail,
@@ -123,12 +123,17 @@ impl VerifySignature for Seal {
123123
}
124124
}
125125

126-
impl ArcOutput<'_> {
127-
pub(crate) fn with_result(mut self, result: DkimResult) -> Self {
126+
impl<'x> ArcOutput<'x> {
127+
pub fn with_result(mut self, result: DkimResult) -> Self {
128128
self.result = result;
129129
self
130130
}
131131

132+
pub fn with_set(mut self, set: Set<'x>) -> Self {
133+
self.set.push(set);
134+
self
135+
}
136+
132137
pub fn can_be_sealed(&self) -> bool {
133138
self.set.is_empty() || self.set.last().unwrap().seal.header.cv != ChainValidation::Fail
134139
}

src/arc/seal.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ impl Signature {
198198
mod test {
199199
use std::time::{Duration, Instant};
200200

201-
use mail_parser::decoders::base64::base64_decode;
201+
use mail_parser::{decoders::base64::base64_decode, MessageParser};
202202

203203
use crate::{
204204
arc::ArcSealer,
@@ -313,6 +313,13 @@ mod test {
313313
pk: impl SigningKey<Hasher = Sha256>,
314314
) -> String {
315315
let message = AuthenticatedMessage::parse(raw_message.as_bytes()).unwrap();
316+
assert_eq!(
317+
message,
318+
AuthenticatedMessage::from_parsed(
319+
&MessageParser::new().parse(raw_message).unwrap(),
320+
true
321+
)
322+
);
316323
let dkim_result = resolver.verify_dkim(&message).await;
317324
let arc_result = resolver.verify_arc(&message).await;
318325
assert!(

src/arc/verify.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,8 @@ mod test {
183183
time::{Duration, Instant},
184184
};
185185

186+
use mail_parser::MessageParser;
187+
186188
use crate::{
187189
common::{parse::TxtRecordParser, verify::DomainKey},
188190
AuthenticatedMessage, DkimResult, Resolver,
@@ -206,6 +208,13 @@ mod test {
206208
let resolver = new_resolver(dns_records);
207209
let raw_message = raw_message.replace('\n', "\r\n");
208210
let message = AuthenticatedMessage::parse(raw_message.as_bytes()).unwrap();
211+
assert_eq!(
212+
message,
213+
AuthenticatedMessage::from_parsed(
214+
&MessageParser::new().parse(&raw_message).unwrap(),
215+
true
216+
)
217+
);
209218

210219
let arc = resolver.verify_arc(&message).await;
211220
assert_eq!(arc.result(), &DkimResult::Pass);

0 commit comments

Comments
 (0)