From 1372827b411a4aaec1f0d6d8903d615687260da9 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Wed, 26 Jan 2022 11:42:43 -0500 Subject: [PATCH] Adding starttls support. Fixes #1997 (#2051) * Adding starttls support. Fixes #1997 * Change name to tls_type, make a string --- config/defaults.hjson | 4 ++-- crates/utils/src/email.rs | 18 ++++++++---------- crates/utils/src/settings/structs.rs | 8 +++++--- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/config/defaults.hjson b/config/defaults.hjson index 663aa4b57..bdf19142e 100644 --- a/config/defaults.hjson +++ b/config/defaults.hjson @@ -76,8 +76,8 @@ smtp_password: "string" # Address to send emails from, eg noreply@your-instance.com smtp_from_address: "noreply@example.com" - # Whether or not smtp connections should use tls - use_tls: true + # Whether or not smtp connections should use tls. Can be none, tls, or starttls + tls_type: "none" } # Parameters for automatic configuration of new instance (only used at first start) setup: { diff --git a/crates/utils/src/email.rs b/crates/utils/src/email.rs index d9ac1710d..69c0fb17b 100644 --- a/crates/utils/src/email.rs +++ b/crates/utils/src/email.rs @@ -1,11 +1,7 @@ use crate::{settings::structs::Settings, LemmyError}; use lettre::{ message::{header, Mailbox, MultiPart, SinglePart}, - transport::smtp::{ - authentication::Credentials, - client::{Tls, TlsParameters}, - extension::ClientId, - }, + transport::smtp::{authentication::Credentials, extension::ClientId}, Address, Message, SmtpTransport, @@ -77,13 +73,15 @@ pub fn send_email( // don't worry about 'dangeous'. it's just that leaving it at the default configuration // is bad. - let mut builder = SmtpTransport::builder_dangerous(smtp_server).port(smtp_port); // Set the TLS - if email_config.use_tls { - let tls_config = TlsParameters::new(smtp_server.to_string()).expect("the TLS backend is happy"); - builder = builder.tls(Tls::Wrapper(tls_config)); - } + let builder_dangerous = SmtpTransport::builder_dangerous(smtp_server).port(smtp_port); + + let mut builder = match email_config.tls_type.as_str() { + "starttls" => SmtpTransport::starttls_relay(smtp_server)?, + "tls" => SmtpTransport::relay(smtp_server)?, + _ => builder_dangerous, + }; // Set the creds if they exist if let (Some(username), Some(password)) = (email_config.smtp_login, email_config.smtp_password) { diff --git a/crates/utils/src/settings/structs.rs b/crates/utils/src/settings/structs.rs index 1f7121347..6e66b92d6 100644 --- a/crates/utils/src/settings/structs.rs +++ b/crates/utils/src/settings/structs.rs @@ -89,7 +89,7 @@ pub struct DatabaseConfig { pub pool_size: u32, } -#[derive(Debug, Deserialize, Serialize, Clone, Document)] +#[derive(Debug, Deserialize, Serialize, Clone, Document, SmartDefault)] pub struct EmailConfig { /// Hostname and port of the smtp server #[doku(example = "localhost:25")] @@ -101,8 +101,10 @@ pub struct EmailConfig { #[doku(example = "noreply@example.com")] /// Address to send emails from, eg "noreply@your-instance.com" pub smtp_from_address: String, - /// Whether or not smtp connections should use tls - pub use_tls: bool, + /// Whether or not smtp connections should use tls. Can be none, tls, or starttls + #[default("none")] + #[doku(example = "none")] + pub tls_type: String, } #[derive(Debug, Deserialize, Serialize, Clone, SmartDefault, Document)]