From 401aa7c699d87a7c6777893e0dc010a722bfba24 Mon Sep 17 00:00:00 2001 From: Jean-Christophe BEGUE Date: Wed, 15 Aug 2018 17:00:55 +0200 Subject: [PATCH] make SMTP authentication optionnal, let lettre pick the better auth mechanism --- src/mail.rs | 26 ++++++++++++++++---------- src/main.rs | 32 ++++++++++++++++---------------- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/mail.rs b/src/mail.rs index 0af83ce7..fef03c25 100644 --- a/src/mail.rs +++ b/src/mail.rs @@ -3,7 +3,7 @@ use native_tls::TlsConnector; use native_tls::{Protocol}; use lettre::{EmailTransport, SmtpTransport, ClientTlsParameters, ClientSecurity}; use lettre::smtp::{ConnectionReuseParameters, SmtpTransportBuilder}; -use lettre::smtp::authentication::{Credentials, Mechanism}; +use lettre::smtp::authentication::Credentials; use lettre_email::EmailBuilder; use MailConfig; @@ -11,10 +11,7 @@ use MailConfig; fn mailer(config: &MailConfig) -> SmtpTransport { let client_security = if config.smtp_ssl { let mut tls_builder = TlsConnector::builder().unwrap(); - tls_builder.supported_protocols(&[ - Protocol::Tlsv10, Protocol::Tlsv11, Protocol::Tlsv12 - ]).unwrap(); - + tls_builder.supported_protocols(&[Protocol::Tlsv11, Protocol::Tlsv12]).unwrap(); ClientSecurity::Required( ClientTlsParameters::new(config.smtp_host.to_owned(), tls_builder.build().unwrap()) ) @@ -22,12 +19,21 @@ fn mailer(config: &MailConfig) -> SmtpTransport { ClientSecurity::None }; - SmtpTransportBuilder::new((config.smtp_host.to_owned().as_str(), config.smtp_port), client_security) - .unwrap() - .credentials(Credentials::new(config.smtp_username.to_owned(), config.smtp_password.to_owned())) - .authentication_mechanism(Mechanism::Login) + let smtp_transport = SmtpTransportBuilder::new( + (config.smtp_host.to_owned().as_str(), config.smtp_port), + client_security + ).unwrap(); + + let smtp_transport = match (&config.smtp_username, &config.smtp_password) { + (Some(username), Some(password)) => { + smtp_transport.credentials(Credentials::new(username.to_owned(), password.to_owned())) + }, + (_, _) => smtp_transport, + }; + + smtp_transport .smtp_utf8(true) - .connection_reuse(ConnectionReuseParameters::ReuseUnlimited) + .connection_reuse(ConnectionReuseParameters::NoReuse) .build() } diff --git a/src/main.rs b/src/main.rs index 8f39057f..9c0675e7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -163,13 +163,13 @@ pub struct MailConfig { smtp_port: u16, smtp_ssl: bool, smtp_from: String, - smtp_username: String, - smtp_password: String, + smtp_username: Option, + smtp_password: Option, } impl MailConfig { fn load() -> Option { - let smtp_host = util::parse_option_string(env::var("SMTP_HOST").ok()); + let smtp_host = env::var("SMTP_HOST").ok(); // When SMTP_HOST is absent, we assume the user does not want to enable it. if smtp_host.is_none() { @@ -186,24 +186,24 @@ impl MailConfig { } }); + let smtp_username = env::var("SMTP_USERNAME").ok(); + let smtp_password = env::var("SMTP_PASSWORD").ok().or_else(|| { + if smtp_username.as_ref().is_some() { + println!("Please specify SMTP_PASSWORD to enable SMTP support."); + exit(1); + } else { + None + } + }); + Some(MailConfig { smtp_host: smtp_host.unwrap(), smtp_port: smtp_port, smtp_ssl: smtp_ssl, smtp_from: util::parse_option_string(env::var("SMTP_FROM").ok()) - .unwrap_or("bitwarden@localhost".to_string()), - // If username or password is not specified and SMTP support seems to be wanted, - // don't let the app start: the configuration is clearly incomplete. - smtp_username: util::parse_option_string(env::var("SMTP_USERNAME").ok()) - .unwrap_or_else(|| { - println!("Please specify SMTP_USERNAME to enable SMTP support."); - exit(1); - }), - smtp_password: util::parse_option_string(env::var("SMTP_PASSWORD").ok()) - .unwrap_or_else(|| { - println!("Please specify SMTP_PASSWORD to enable SMTP support."); - exit(1); - }), + .unwrap_or("bitwarden-rs@localhost".to_string()), + smtp_username: smtp_username, + smtp_password: smtp_password, }) } }