1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//! Method auth Result

/// Parsed auth (per RFC)
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SmtpAuthResult<'hdr> {
    /// Result
    pub code: SmtpAuthResultCode,
    /// smtp.auth
    pub smtp_auth: Option<&'hdr str>,
    /// smtp.mailfrom
    pub smtp_mailfrom: Option<&'hdr str>,
    /// Unparsed raw
    pub raw: Option<&'hdr str>,
}

impl<'hdr> SmtpAuthResult<'hdr> {
    pub(crate) fn set_smtp(&mut self, prop: &ptypes::AuthSmtp<'hdr>) -> bool {
        match prop {
            ptypes::AuthSmtp::MailFrom(val) => self.smtp_mailfrom = Some(val),
            ptypes::AuthSmtp::Auth(val) => self.smtp_auth = Some(val),
        }
        true
    }
}

/// SMTP AUTH Result Codes - s.2.7.4
/// This SMTP Authentication (not DKIM)
#[derive(Clone, Debug, Default, PartialEq)]
pub enum SmtpAuthResultCode {
    /// Result not seen
    #[default]
    Unknown,
    /// SMTP authentication was not attempted.
    NoneSmtp,
    /// The SMTP client authenticated to the server
    Pass,
    /// The SMTP client attempted to authenticate but was not successful
    Fail,
    /// The SMTP client attempted to authenticate but was not able to complete
    /// the attempt due to some error that is likely transient in nature
    TempError,
    /// The SMTP client attempted to authenticate but was not able to complete
    /// the attempt due to some error that is likely not transient in nature
    PermError,
}

pub mod ptypes;
pub use ptypes::AuthProperty;