Browse Source
Merge pull request #1137 from BlackDex/smtp-multi-auth-mechanism
Allow multiple SMTP Auth meganisms.
pull/1141/head
Daniel García
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
25 additions and
12 deletions
.env.template
src/config.rs
src/mail.rs
@ -210,6 +210,9 @@
# SMTP_EXPLICIT_TLS=true # N.B. This variable configures Implicit TLS. It's currently mislabelled (see bug #851)
# SMTP_USERNAME=username
# SMTP_PASSWORD=password
## Defaults for SSL is "Plain" and "Login" and nothing for Non-SSL connections.
## Possible values: ["Plain", "Login", "Xoauth2"].
## Multiple options need to be separated by a comma ','.
# SMTP_AUTH_MECHANISM="Plain"
# SMTP_TIMEOUT=15
@ -400,7 +400,7 @@ make_config! {
smtp_username : String , true , option ;
/// Password
smtp_password : Pass , true , option ;
/// Json form auth mechanism |> Defaults for ssl is "Plain" and "Login" and nothing for non-ssl connections. Possible values: ["Plain", "Login", "Xoauth2"]
/// Json form auth mechanism |> Defaults for ssl is "Plain" and "Login" and nothing for non-ssl connections. Possible values: ["Plain", "Login", "Xoauth2"]. Multiple options need to be separated by a comma.
smtp_auth_mechanism : String , true , option ;
/// SMTP connection timeout |> Number of seconds when to stop trying to connect to the SMTP server
smtp_timeout : u64 , true , def , 15 ;
@ -49,12 +49,22 @@ fn mailer() -> SmtpTransport {
let smtp_client = match CONFIG . smtp_auth_mechanism ( ) {
Some ( mechanism ) = > {
let correct_mechanism = format ! ( "\"{}\"" , crate ::util ::upcase_first ( mechanism . trim_matches ( '"' ) ) ) ;
let allowed_mechanisms = vec ! [ SmtpAuthMechanism ::Plain , SmtpAuthMechanism ::Login , SmtpAuthMechanism ::Xoauth2 ] ;
let mut selected_mechanisms = vec ! [ ] ;
for wanted_mechanism in mechanism . split ( ',' ) {
for m in & allowed_mechanisms {
if m . to_string ( ) . to_lowercase ( ) = = wanted_mechanism . trim_matches ( | c | c = = '"' | | c = = '\'' | | c = = ' ' ) . to_lowercase ( ) {
selected_mechanisms . push ( m . clone ( ) ) ;
}
}
} ;
// TODO: Allow more than one mechanism
match serde_json ::from_str ::< SmtpAuthMechanism > ( & correct_mechanism ) {
Ok ( auth_mechanism ) = > smtp_client . authentication ( vec ! [ auth_mechanism ] ) ,
_ = > panic ! ( "Failure to parse mechanism. Is it proper Json? Eg. `\"Plain\"` not `Plain`" ) ,
if ! selected_mechanisms . is_empty ( ) {
smtp_client . authentication ( selected_mechanisms )
} else {
// Only show a warning, and return without setting an actual authentication mechanism
warn ! ( "No valid SMTP Auth mechanism found for '{}', using default values" , mechanism ) ;
smtp_client
}
}
_ = > smtp_client ,