diff --git a/src/transport/smtp/client/async_net.rs b/src/transport/smtp/client/async_net.rs index 2ce2c6d..5b2dcfe 100644 --- a/src/transport/smtp/client/async_net.rs +++ b/src/transport/smtp/client/async_net.rs @@ -13,7 +13,7 @@ use futures_io::{ Result as IoResult, }; #[cfg(feature = "async-std1-rustls")] -use futures_rustls::client::TlsStream as AsyncStd1RustlsTlsStream; +use futures_rustls::client::TlsStream as AsyncStd1RustlsStream; #[cfg(any(feature = "tokio1-rustls", feature = "async-std1-rustls"))] use rustls::pki_types::ServerName; #[cfg(feature = "tokio1-boring-tls")] @@ -28,7 +28,7 @@ use tokio1_crate::net::{ #[cfg(feature = "tokio1-native-tls")] use tokio1_native_tls_crate::TlsStream as Tokio1TlsStream; #[cfg(feature = "tokio1-rustls")] -use tokio1_rustls::client::TlsStream as Tokio1RustlsTlsStream; +use tokio1_rustls::client::TlsStream as Tokio1RustlsStream; #[cfg(any( feature = "tokio1-native-tls", @@ -79,7 +79,7 @@ enum InnerAsyncNetworkStream { Tokio1NativeTls(Tokio1TlsStream>), /// Encrypted Tokio 1.x TCP stream #[cfg(feature = "tokio1-rustls")] - Tokio1RustlsTls(Tokio1RustlsTlsStream>), + Tokio1Rustls(Tokio1RustlsStream>), /// Encrypted Tokio 1.x TCP stream #[cfg(feature = "tokio1-boring-tls")] Tokio1BoringTls(Tokio1SslStream>), @@ -88,7 +88,7 @@ enum InnerAsyncNetworkStream { AsyncStd1Tcp(AsyncStd1TcpStream), /// Encrypted Tokio 1.x TCP stream #[cfg(feature = "async-std1-rustls")] - AsyncStd1RustlsTls(AsyncStd1RustlsTlsStream), + AsyncStd1Rustls(AsyncStd1RustlsStream), /// Can't be built None, } @@ -113,13 +113,13 @@ impl AsyncNetworkStream { s.get_ref().get_ref().get_ref().peer_addr() } #[cfg(feature = "tokio1-rustls")] - InnerAsyncNetworkStream::Tokio1RustlsTls(s) => s.get_ref().0.peer_addr(), + InnerAsyncNetworkStream::Tokio1Rustls(s) => s.get_ref().0.peer_addr(), #[cfg(feature = "tokio1-boring-tls")] InnerAsyncNetworkStream::Tokio1BoringTls(s) => s.get_ref().peer_addr(), #[cfg(feature = "async-std1")] InnerAsyncNetworkStream::AsyncStd1Tcp(s) => s.peer_addr(), #[cfg(feature = "async-std1-rustls")] - InnerAsyncNetworkStream::AsyncStd1RustlsTls(s) => s.get_ref().0.peer_addr(), + InnerAsyncNetworkStream::AsyncStd1Rustls(s) => s.get_ref().0.peer_addr(), InnerAsyncNetworkStream::None => { debug_assert!(false, "InnerAsyncNetworkStream::None must never be built"); Err(IoError::other( @@ -320,7 +320,7 @@ impl AsyncNetworkStream { match tls_parameters.connector { #[cfg(feature = "native-tls")] - InnerTlsParameters::NativeTls(connector) => { + InnerTlsParameters::NativeTls { connector } => { #[cfg(not(feature = "tokio1-native-tls"))] panic!("built without the tokio1-native-tls feature"); @@ -337,7 +337,7 @@ impl AsyncNetworkStream { }; } #[cfg(feature = "rustls")] - InnerTlsParameters::RustlsTls(config) => { + InnerTlsParameters::Rustls { config } => { #[cfg(not(feature = "tokio1-rustls"))] panic!("built without the tokio1-rustls feature"); @@ -353,18 +353,21 @@ impl AsyncNetworkStream { .connect(domain.to_owned(), tcp_stream) .await .map_err(error::connection)?; - Ok(InnerAsyncNetworkStream::Tokio1RustlsTls(stream)) + Ok(InnerAsyncNetworkStream::Tokio1Rustls(stream)) }; } #[cfg(feature = "boring-tls")] - InnerTlsParameters::BoringTls(connector) => { + InnerTlsParameters::BoringTls { + connector, + accept_invalid_hostnames, + } => { #[cfg(not(feature = "tokio1-boring-tls"))] panic!("built without the tokio1-boring-tls feature"); #[cfg(feature = "tokio1-boring-tls")] return { let mut config = connector.configure().map_err(error::connection)?; - config.set_verify_hostname(tls_parameters.accept_invalid_hostnames); + config.set_verify_hostname(accept_invalid_hostnames); let stream = tokio1_boring::connect(config, &domain, tcp_stream) .await @@ -385,11 +388,11 @@ impl AsyncNetworkStream { match tls_parameters.connector { #[cfg(feature = "native-tls")] - InnerTlsParameters::NativeTls(connector) => { + InnerTlsParameters::NativeTls { connector } => { panic!("native-tls isn't supported with async-std yet. See https://github.com/lettre/lettre/pull/531#issuecomment-757893531"); } #[cfg(feature = "rustls")] - InnerTlsParameters::RustlsTls(config) => { + InnerTlsParameters::Rustls { config } => { #[cfg(not(feature = "async-std1-rustls"))] panic!("built without the async-std1-rustls feature"); @@ -405,11 +408,11 @@ impl AsyncNetworkStream { .connect(domain.to_owned(), tcp_stream) .await .map_err(error::connection)?; - Ok(InnerAsyncNetworkStream::AsyncStd1RustlsTls(stream)) + Ok(InnerAsyncNetworkStream::AsyncStd1Rustls(stream)) }; } #[cfg(feature = "boring-tls")] - InnerTlsParameters::BoringTls(connector) => { + InnerTlsParameters::BoringTls { .. } => { panic!("boring-tls isn't supported with async-std yet."); } } @@ -422,13 +425,13 @@ impl AsyncNetworkStream { #[cfg(feature = "tokio1-native-tls")] InnerAsyncNetworkStream::Tokio1NativeTls(_) => true, #[cfg(feature = "tokio1-rustls")] - InnerAsyncNetworkStream::Tokio1RustlsTls(_) => true, + InnerAsyncNetworkStream::Tokio1Rustls(_) => true, #[cfg(feature = "tokio1-boring-tls")] InnerAsyncNetworkStream::Tokio1BoringTls(_) => true, #[cfg(feature = "async-std1")] InnerAsyncNetworkStream::AsyncStd1Tcp(_) => false, #[cfg(feature = "async-std1-rustls")] - InnerAsyncNetworkStream::AsyncStd1RustlsTls(_) => true, + InnerAsyncNetworkStream::AsyncStd1Rustls(_) => true, InnerAsyncNetworkStream::None => false, } } @@ -443,7 +446,7 @@ impl AsyncNetworkStream { #[cfg(feature = "tokio1-native-tls")] InnerAsyncNetworkStream::Tokio1NativeTls(_) => panic!("Unsupported"), #[cfg(feature = "tokio1-rustls")] - InnerAsyncNetworkStream::Tokio1RustlsTls(_) => panic!("Unsupported"), + InnerAsyncNetworkStream::Tokio1Rustls(_) => panic!("Unsupported"), #[cfg(feature = "tokio1-boring-tls")] InnerAsyncNetworkStream::Tokio1BoringTls(stream) => { stream.ssl().verify_result().map_err(error::tls) @@ -453,7 +456,7 @@ impl AsyncNetworkStream { Err(error::client("Connection is not encrypted")) } #[cfg(feature = "async-std1-rustls")] - InnerAsyncNetworkStream::AsyncStd1RustlsTls(_) => panic!("Unsupported"), + InnerAsyncNetworkStream::AsyncStd1Rustls(_) => panic!("Unsupported"), InnerAsyncNetworkStream::None => panic!("InnerNetworkStream::None must never be built"), } } @@ -466,7 +469,7 @@ impl AsyncNetworkStream { #[cfg(feature = "tokio1-native-tls")] InnerAsyncNetworkStream::Tokio1NativeTls(_) => panic!("Unsupported"), #[cfg(feature = "tokio1-rustls")] - InnerAsyncNetworkStream::Tokio1RustlsTls(stream) => Ok(stream + InnerAsyncNetworkStream::Tokio1Rustls(stream) => Ok(stream .get_ref() .1 .peer_certificates() @@ -487,7 +490,7 @@ impl AsyncNetworkStream { Err(error::client("Connection is not encrypted")) } #[cfg(feature = "async-std1-rustls")] - InnerAsyncNetworkStream::AsyncStd1RustlsTls(stream) => Ok(stream + InnerAsyncNetworkStream::AsyncStd1Rustls(stream) => Ok(stream .get_ref() .1 .peer_certificates() @@ -514,7 +517,7 @@ impl AsyncNetworkStream { .to_der() .map_err(error::tls)?), #[cfg(feature = "tokio1-rustls")] - InnerAsyncNetworkStream::Tokio1RustlsTls(stream) => Ok(stream + InnerAsyncNetworkStream::Tokio1Rustls(stream) => Ok(stream .get_ref() .1 .peer_certificates() @@ -534,7 +537,7 @@ impl AsyncNetworkStream { Err(error::client("Connection is not encrypted")) } #[cfg(feature = "async-std1-rustls")] - InnerAsyncNetworkStream::AsyncStd1RustlsTls(stream) => Ok(stream + InnerAsyncNetworkStream::AsyncStd1Rustls(stream) => Ok(stream .get_ref() .1 .peer_certificates() @@ -574,7 +577,7 @@ impl FuturesAsyncRead for AsyncNetworkStream { } } #[cfg(feature = "tokio1-rustls")] - InnerAsyncNetworkStream::Tokio1RustlsTls(s) => { + InnerAsyncNetworkStream::Tokio1Rustls(s) => { let mut b = Tokio1ReadBuf::new(buf); match Pin::new(s).poll_read(cx, &mut b) { Poll::Ready(Ok(())) => Poll::Ready(Ok(b.filled().len())), @@ -594,7 +597,7 @@ impl FuturesAsyncRead for AsyncNetworkStream { #[cfg(feature = "async-std1")] InnerAsyncNetworkStream::AsyncStd1Tcp(s) => Pin::new(s).poll_read(cx, buf), #[cfg(feature = "async-std1-rustls")] - InnerAsyncNetworkStream::AsyncStd1RustlsTls(s) => Pin::new(s).poll_read(cx, buf), + InnerAsyncNetworkStream::AsyncStd1Rustls(s) => Pin::new(s).poll_read(cx, buf), InnerAsyncNetworkStream::None => { debug_assert!(false, "InnerAsyncNetworkStream::None must never be built"); Poll::Ready(Ok(0)) @@ -616,13 +619,13 @@ impl FuturesAsyncWrite for AsyncNetworkStream { #[cfg(feature = "tokio1-native-tls")] InnerAsyncNetworkStream::Tokio1NativeTls(s) => Pin::new(s).poll_write(cx, buf), #[cfg(feature = "tokio1-rustls")] - InnerAsyncNetworkStream::Tokio1RustlsTls(s) => Pin::new(s).poll_write(cx, buf), + InnerAsyncNetworkStream::Tokio1Rustls(s) => Pin::new(s).poll_write(cx, buf), #[cfg(feature = "tokio1-boring-tls")] InnerAsyncNetworkStream::Tokio1BoringTls(s) => Pin::new(s).poll_write(cx, buf), #[cfg(feature = "async-std1")] InnerAsyncNetworkStream::AsyncStd1Tcp(s) => Pin::new(s).poll_write(cx, buf), #[cfg(feature = "async-std1-rustls")] - InnerAsyncNetworkStream::AsyncStd1RustlsTls(s) => Pin::new(s).poll_write(cx, buf), + InnerAsyncNetworkStream::AsyncStd1Rustls(s) => Pin::new(s).poll_write(cx, buf), InnerAsyncNetworkStream::None => { debug_assert!(false, "InnerAsyncNetworkStream::None must never be built"); Poll::Ready(Ok(0)) @@ -637,13 +640,13 @@ impl FuturesAsyncWrite for AsyncNetworkStream { #[cfg(feature = "tokio1-native-tls")] InnerAsyncNetworkStream::Tokio1NativeTls(s) => Pin::new(s).poll_flush(cx), #[cfg(feature = "tokio1-rustls")] - InnerAsyncNetworkStream::Tokio1RustlsTls(s) => Pin::new(s).poll_flush(cx), + InnerAsyncNetworkStream::Tokio1Rustls(s) => Pin::new(s).poll_flush(cx), #[cfg(feature = "tokio1-boring-tls")] InnerAsyncNetworkStream::Tokio1BoringTls(s) => Pin::new(s).poll_flush(cx), #[cfg(feature = "async-std1")] InnerAsyncNetworkStream::AsyncStd1Tcp(s) => Pin::new(s).poll_flush(cx), #[cfg(feature = "async-std1-rustls")] - InnerAsyncNetworkStream::AsyncStd1RustlsTls(s) => Pin::new(s).poll_flush(cx), + InnerAsyncNetworkStream::AsyncStd1Rustls(s) => Pin::new(s).poll_flush(cx), InnerAsyncNetworkStream::None => { debug_assert!(false, "InnerAsyncNetworkStream::None must never be built"); Poll::Ready(Ok(())) @@ -658,13 +661,13 @@ impl FuturesAsyncWrite for AsyncNetworkStream { #[cfg(feature = "tokio1-native-tls")] InnerAsyncNetworkStream::Tokio1NativeTls(s) => Pin::new(s).poll_shutdown(cx), #[cfg(feature = "tokio1-rustls")] - InnerAsyncNetworkStream::Tokio1RustlsTls(s) => Pin::new(s).poll_shutdown(cx), + InnerAsyncNetworkStream::Tokio1Rustls(s) => Pin::new(s).poll_shutdown(cx), #[cfg(feature = "tokio1-boring-tls")] InnerAsyncNetworkStream::Tokio1BoringTls(s) => Pin::new(s).poll_shutdown(cx), #[cfg(feature = "async-std1")] InnerAsyncNetworkStream::AsyncStd1Tcp(s) => Pin::new(s).poll_close(cx), #[cfg(feature = "async-std1-rustls")] - InnerAsyncNetworkStream::AsyncStd1RustlsTls(s) => Pin::new(s).poll_close(cx), + InnerAsyncNetworkStream::AsyncStd1Rustls(s) => Pin::new(s).poll_close(cx), InnerAsyncNetworkStream::None => { debug_assert!(false, "InnerAsyncNetworkStream::None must never be built"); Poll::Ready(Ok(())) diff --git a/src/transport/smtp/client/net.rs b/src/transport/smtp/client/net.rs index dd4e431..dc7397f 100644 --- a/src/transport/smtp/client/net.rs +++ b/src/transport/smtp/client/net.rs @@ -37,7 +37,7 @@ enum InnerNetworkStream { NativeTls(TlsStream), /// Encrypted TCP stream #[cfg(feature = "rustls")] - RustlsTls(StreamOwned), + Rustls(StreamOwned), #[cfg(feature = "boring-tls")] BoringTls(SslStream), /// Can't be built @@ -60,7 +60,7 @@ impl NetworkStream { #[cfg(feature = "native-tls")] InnerNetworkStream::NativeTls(s) => s.get_ref().peer_addr(), #[cfg(feature = "rustls")] - InnerNetworkStream::RustlsTls(s) => s.get_ref().peer_addr(), + InnerNetworkStream::Rustls(s) => s.get_ref().peer_addr(), #[cfg(feature = "boring-tls")] InnerNetworkStream::BoringTls(s) => s.get_ref().peer_addr(), InnerNetworkStream::None => { @@ -80,7 +80,7 @@ impl NetworkStream { #[cfg(feature = "native-tls")] InnerNetworkStream::NativeTls(s) => s.get_ref().shutdown(how), #[cfg(feature = "rustls")] - InnerNetworkStream::RustlsTls(s) => s.get_ref().shutdown(how), + InnerNetworkStream::Rustls(s) => s.get_ref().shutdown(how), #[cfg(feature = "boring-tls")] InnerNetworkStream::BoringTls(s) => s.get_ref().shutdown(how), InnerNetworkStream::None => { @@ -174,27 +174,30 @@ impl NetworkStream { ) -> Result { Ok(match &tls_parameters.connector { #[cfg(feature = "native-tls")] - InnerTlsParameters::NativeTls(connector) => { + InnerTlsParameters::NativeTls { connector } => { let stream = connector .connect(tls_parameters.domain(), tcp_stream) .map_err(error::connection)?; InnerNetworkStream::NativeTls(stream) } #[cfg(feature = "rustls")] - InnerTlsParameters::RustlsTls(connector) => { + InnerTlsParameters::Rustls { config } => { let domain = ServerName::try_from(tls_parameters.domain()) .map_err(|_| error::connection("domain isn't a valid DNS name"))?; - let connection = ClientConnection::new(Arc::clone(connector), domain.to_owned()) + let connection = ClientConnection::new(Arc::clone(config), domain.to_owned()) .map_err(error::connection)?; let stream = StreamOwned::new(connection, tcp_stream); - InnerNetworkStream::RustlsTls(stream) + InnerNetworkStream::Rustls(stream) } #[cfg(feature = "boring-tls")] - InnerTlsParameters::BoringTls(connector) => { + InnerTlsParameters::BoringTls { + connector, + accept_invalid_hostnames, + } => { let stream = connector .configure() .map_err(error::connection)? - .verify_hostname(tls_parameters.accept_invalid_hostnames) + .verify_hostname(*accept_invalid_hostnames) .connect(tls_parameters.domain(), tcp_stream) .map_err(error::connection)?; InnerNetworkStream::BoringTls(stream) @@ -208,7 +211,7 @@ impl NetworkStream { #[cfg(feature = "native-tls")] InnerNetworkStream::NativeTls(_) => true, #[cfg(feature = "rustls")] - InnerNetworkStream::RustlsTls(_) => true, + InnerNetworkStream::Rustls(_) => true, #[cfg(feature = "boring-tls")] InnerNetworkStream::BoringTls(_) => true, InnerNetworkStream::None => { @@ -225,7 +228,7 @@ impl NetworkStream { #[cfg(feature = "native-tls")] InnerNetworkStream::NativeTls(_) => panic!("Unsupported"), #[cfg(feature = "rustls")] - InnerNetworkStream::RustlsTls(_) => panic!("Unsupported"), + InnerNetworkStream::Rustls(_) => panic!("Unsupported"), #[cfg(feature = "boring-tls")] InnerNetworkStream::BoringTls(stream) => { stream.ssl().verify_result().map_err(error::tls) @@ -241,7 +244,7 @@ impl NetworkStream { #[cfg(feature = "native-tls")] InnerNetworkStream::NativeTls(_) => panic!("Unsupported"), #[cfg(feature = "rustls")] - InnerNetworkStream::RustlsTls(stream) => Ok(stream + InnerNetworkStream::Rustls(stream) => Ok(stream .conn .peer_certificates() .unwrap() @@ -272,7 +275,7 @@ impl NetworkStream { .to_der() .map_err(error::tls)?), #[cfg(feature = "rustls")] - InnerNetworkStream::RustlsTls(stream) => Ok(stream + InnerNetworkStream::Rustls(stream) => Ok(stream .conn .peer_certificates() .unwrap() @@ -296,7 +299,7 @@ impl NetworkStream { #[cfg(feature = "native-tls")] InnerNetworkStream::NativeTls(stream) => stream.get_ref().set_read_timeout(duration), #[cfg(feature = "rustls")] - InnerNetworkStream::RustlsTls(stream) => stream.get_ref().set_read_timeout(duration), + InnerNetworkStream::Rustls(stream) => stream.get_ref().set_read_timeout(duration), #[cfg(feature = "boring-tls")] InnerNetworkStream::BoringTls(stream) => stream.get_ref().set_read_timeout(duration), InnerNetworkStream::None => { @@ -314,7 +317,7 @@ impl NetworkStream { #[cfg(feature = "native-tls")] InnerNetworkStream::NativeTls(stream) => stream.get_ref().set_write_timeout(duration), #[cfg(feature = "rustls")] - InnerNetworkStream::RustlsTls(stream) => stream.get_ref().set_write_timeout(duration), + InnerNetworkStream::Rustls(stream) => stream.get_ref().set_write_timeout(duration), #[cfg(feature = "boring-tls")] InnerNetworkStream::BoringTls(stream) => stream.get_ref().set_write_timeout(duration), InnerNetworkStream::None => { @@ -332,7 +335,7 @@ impl Read for NetworkStream { #[cfg(feature = "native-tls")] InnerNetworkStream::NativeTls(s) => s.read(buf), #[cfg(feature = "rustls")] - InnerNetworkStream::RustlsTls(s) => s.read(buf), + InnerNetworkStream::Rustls(s) => s.read(buf), #[cfg(feature = "boring-tls")] InnerNetworkStream::BoringTls(s) => s.read(buf), InnerNetworkStream::None => { @@ -350,7 +353,7 @@ impl Write for NetworkStream { #[cfg(feature = "native-tls")] InnerNetworkStream::NativeTls(s) => s.write(buf), #[cfg(feature = "rustls")] - InnerNetworkStream::RustlsTls(s) => s.write(buf), + InnerNetworkStream::Rustls(s) => s.write(buf), #[cfg(feature = "boring-tls")] InnerNetworkStream::BoringTls(s) => s.write(buf), InnerNetworkStream::None => { @@ -366,7 +369,7 @@ impl Write for NetworkStream { #[cfg(feature = "native-tls")] InnerNetworkStream::NativeTls(s) => s.flush(), #[cfg(feature = "rustls")] - InnerNetworkStream::RustlsTls(s) => s.flush(), + InnerNetworkStream::Rustls(s) => s.flush(), #[cfg(feature = "boring-tls")] InnerNetworkStream::BoringTls(s) => s.flush(), InnerNetworkStream::None => { diff --git a/src/transport/smtp/client/tls.rs b/src/transport/smtp/client/tls.rs index 0b7366f..15791eb 100644 --- a/src/transport/smtp/client/tls.rs +++ b/src/transport/smtp/client/tls.rs @@ -165,8 +165,6 @@ pub struct TlsParameters { pub(crate) connector: InnerTlsParameters, /// The domain name which is expected in the TLS certificate from the server pub(super) domain: String, - #[cfg(feature = "boring-tls")] - pub(super) accept_invalid_hostnames: bool, } /// Builder for `TlsParameters` @@ -328,10 +326,8 @@ impl TlsParametersBuilder { let connector = tls_builder.build().map_err(error::tls)?; Ok(TlsParameters { - connector: InnerTlsParameters::NativeTls(connector), + connector: InnerTlsParameters::NativeTls { connector }, domain: self.domain, - #[cfg(feature = "boring-tls")] - accept_invalid_hostnames: self.accept_invalid_hostnames, }) } @@ -389,9 +385,11 @@ impl TlsParametersBuilder { .map_err(error::tls)?; let connector = tls_builder.build(); Ok(TlsParameters { - connector: InnerTlsParameters::BoringTls(connector), + connector: InnerTlsParameters::BoringTls { + connector, + accept_invalid_hostnames: self.accept_invalid_hostnames, + }, domain: self.domain, - accept_invalid_hostnames: self.accept_invalid_hostnames, }) } @@ -480,10 +478,10 @@ impl TlsParametersBuilder { }; Ok(TlsParameters { - connector: InnerTlsParameters::RustlsTls(Arc::new(tls)), + connector: InnerTlsParameters::Rustls { + config: Arc::new(tls), + }, domain: self.domain, - #[cfg(feature = "boring-tls")] - accept_invalid_hostnames: self.accept_invalid_hostnames, }) } } @@ -492,11 +490,14 @@ impl TlsParametersBuilder { #[allow(clippy::enum_variant_names)] pub(crate) enum InnerTlsParameters { #[cfg(feature = "native-tls")] - NativeTls(TlsConnector), + NativeTls { connector: TlsConnector }, #[cfg(feature = "rustls")] - RustlsTls(Arc), + Rustls { config: Arc }, #[cfg(feature = "boring-tls")] - BoringTls(SslConnector), + BoringTls { + connector: SslConnector, + accept_invalid_hostnames: bool, + }, } impl TlsParameters {