diff --git a/Cargo.toml b/Cargo.toml index fba11f1..cdd0a52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ name = "imap" path = "src/lib.rs" [dependencies] -openssl = "0.8" +openssl = "0.9" regex = "0.2" [dev-dependencies] diff --git a/examples/basic.rs b/examples/basic.rs index 54e3fec..343b625 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -1,14 +1,14 @@ extern crate imap; extern crate openssl; -use openssl::ssl::{SslContext, SslMethod}; +use openssl::ssl::{SslConnectorBuilder, SslMethod}; use imap::client::Client; // To connect to the gmail IMAP server with this you will need to allow unsecure apps access. // See: https://support.google.com/accounts/answer/6010255?hl=en // Look at the gmail_oauth2.rs example on how to connect to a gmail server securely. fn main() { - let mut imap_socket = Client::secure_connect(("imap.gmail.com", 993), SslContext::new(SslMethod::Sslv23).unwrap()).unwrap(); + let mut imap_socket = Client::secure_connect(("imap.gmail.com", 993), "imap.gmail.com",SslConnectorBuilder::new(SslMethod::tls()).unwrap().build()).unwrap(); imap_socket.login("username", "password").unwrap(); diff --git a/examples/gmail_oauth2.rs b/examples/gmail_oauth2.rs index 143be36..00a0ae8 100644 --- a/examples/gmail_oauth2.rs +++ b/examples/gmail_oauth2.rs @@ -2,7 +2,7 @@ extern crate imap; extern crate openssl; extern crate base64; -use openssl::ssl::{SslContext, SslMethod}; +use openssl::ssl::{SslConnectorBuilder, SslMethod}; use base64::{encode}; use imap::client::Client; use imap::authenticator::Authenticator; @@ -24,7 +24,7 @@ fn main() { user: String::from("sombody@gmail.com"), access_token: String::from("") }; - let mut imap_socket = Client::secure_connect(("imap.gmail.com", 993), SslContext::new(SslMethod::Sslv23).unwrap()).unwrap(); + let mut imap_socket = Client::secure_connect(("imap.gmail.com", 993),"imap.gmail.com", SslConnectorBuilder::new(SslMethod::tls()).unwrap().build()).unwrap(); imap_socket.authenticate("XOAUTH2", gmail_auth).unwrap(); diff --git a/src/client.rs b/src/client.rs index 0e5faf0..eeb36b0 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,5 +1,5 @@ use std::net::{TcpStream, ToSocketAddrs}; -use openssl::ssl::{SslContext, SslStream}; +use openssl::ssl::{SslConnector, SslStream}; use std::io::{self, Read, Write}; use std::time::Duration; @@ -178,21 +178,23 @@ impl Client { } /// This will upgrade a regular TCP connection to use SSL. - pub fn secure(mut self, ssl_context: SslContext) -> Result>> { + /// + /// Use the domain parameter for openssl's SNI and hostname verification. + pub fn secure(mut self, domain: &str,ssl_connector: SslConnector) -> Result>> { // TODO This needs to be tested - try!(self.run_command_and_check_ok("STARTTLS")); - SslStream::connect(&ssl_context, self.stream) - .map(|s| Client::new(s)) - .map_err(|e| Error::Ssl(e)) + self.run_command_and_check_ok("STARTTLS")?; + SslConnector::connect(&ssl_connector,domain, self.stream) + .map(Client::new) + .map_err(Error::Ssl) } } impl Client> { /// Creates a client with an SSL wrapper. - pub fn secure_connect(addr: A, ssl_context: SslContext) -> Result>> { + pub fn secure_connect(addr: A, domain: &str,ssl_connector: SslConnector) -> Result>> { match TcpStream::connect(addr) { Ok(stream) => { - let ssl_stream = match SslStream::connect(&ssl_context, stream) { + let ssl_stream = match SslConnector::connect(&ssl_connector, domain,stream) { Ok(s) => s, Err(e) => return Err(Error::Ssl(e)) };