From 97951aec1597ff809ecdfac03325c4d31a091c1c Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Wed, 25 Mar 2020 15:41:27 +0100 Subject: [PATCH] implement imape secure upgrade --- Cargo.lock | 2 +- src/imap/client.rs | 23 +++++++++++++---------- src/imap/session.rs | 1 + 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a17a654ed..85cc6be72 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -93,7 +93,7 @@ dependencies = [ [[package]] name = "async-imap" version = "0.2.0" -source = "git+https://github.com/async-email/async-imap?branch=feat/send#be7b9cace12d0f323ef1e6e0a9fc698f4e26b64d" +source = "git+https://github.com/async-email/async-imap?branch=feat/send#94a48158d6cc622aa0ed99d10b84088e9e53eb2f" dependencies = [ "async-native-tls 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "async-std 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/src/imap/client.rs b/src/imap/client.rs index 923bc65ec..e93b273b8 100644 --- a/src/imap/client.rs +++ b/src/imap/client.rs @@ -120,21 +120,24 @@ impl Client { pub async fn secure>( self, - _domain: S, - _certificate_checks: CertificateChecks, + domain: S, + certificate_checks: CertificateChecks, ) -> ImapResult { if self.is_secure { Ok(self) } else { - unimplemented!() - // let Client { inner, .. } = self; - // let tls = dc_build_tls(certificate_checks); - // let client_sec = inner.secure(domain, tls).await?; + let Client { mut inner, .. } = self; + let tls = dc_build_tls(certificate_checks); + inner.run_command_and_check_ok("STARTTLS", None).await?; - // Ok(Client { - // is_secure: true, - // inner: client_sec, - // }) + let stream = inner.into_inner(); + let ssl_stream = tls.connect(domain.as_ref(), stream).await?; + let boxed: Box = Box::new(ssl_stream); + + Ok(Client { + is_secure: true, + inner: ImapClient::new(boxed), + }) } } } diff --git a/src/imap/session.rs b/src/imap/session.rs index 8b8a680a3..e533cc22e 100644 --- a/src/imap/session.rs +++ b/src/imap/session.rs @@ -14,6 +14,7 @@ pub(crate) trait SessionStream: { } +impl SessionStream for TlsStream> {} impl SessionStream for TlsStream {} impl SessionStream for TcpStream {}