From b5de72ecd41a2f23660afc69b163d6c219748655 Mon Sep 17 00:00:00 2001 From: Joseph Birr-Pixton Date: Sat, 17 Jun 2017 11:03:41 +0100 Subject: [PATCH] Clone for ServerConfig too And test for clone/debug on our types --- src/server.rs | 21 +++++++++++---------- src/ticketer.rs | 6 +++--- tests/api.rs | 24 +++++++++++++++++++++++- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/server.rs b/src/server.rs index 3ca84ee0..7e6c9764 100644 --- a/src/server.rs +++ b/src/server.rs @@ -94,6 +94,7 @@ pub trait ResolvesServerCert : Send + Sync { /// /// Making one of these can be expensive, and should be /// once per process rather than once per connection. +#[derive(Clone)] pub struct ServerConfig { /// List of ciphersuites, in preference order. pub ciphersuites: Vec<&'static SupportedCipherSuite>, @@ -104,13 +105,13 @@ pub struct ServerConfig { pub ignore_client_order: bool, /// How to store client sessions. - pub session_storage: Mutex>, + pub session_storage: Arc>>, /// How to produce tickets. - pub ticketer: Box, + pub ticketer: Arc, /// How to choose a server cert and key. - pub cert_resolver: Box, + pub cert_resolver: Arc, /// Protocol names we support, most preferred first. /// If empty we don't do ALPN at all. @@ -131,7 +132,7 @@ pub struct ServerConfig { pub versions: Vec, /// How to verify client certificates. - verifier: Box, + verifier: Arc, } /// Something which never stores sessions. @@ -265,15 +266,15 @@ impl ServerConfig { ServerConfig { ciphersuites: ALL_CIPHERSUITES.to_vec(), ignore_client_order: false, - session_storage: Mutex::new(Box::new(NoSessionStorage {})), - ticketer: Box::new(NeverProducesTickets {}), + session_storage: Arc::new(Mutex::new(Box::new(NoSessionStorage {}))), + ticketer: Arc::new(NeverProducesTickets {}), alpn_protocols: Vec::new(), - cert_resolver: Box::new(FailResolveChain {}), + cert_resolver: Arc::new(FailResolveChain {}), client_auth_roots: anchors::RootCertStore::empty(), client_auth_offer: false, client_auth_mandatory: false, versions: vec![ ProtocolVersion::TLSv1_3, ProtocolVersion::TLSv1_2 ], - verifier: Box::new(verify::WebPKIVerifier {}), + verifier: Arc::new(verify::WebPKIVerifier {}), } } @@ -284,7 +285,7 @@ impl ServerConfig { /// Sets the session persistence layer to `persist`. pub fn set_persistence(&mut self, persist: Box) { - self.session_storage = Mutex::new(persist); + self.session_storage = Arc::new(Mutex::new(persist)); } /// Sets a single certificate chain and matching private key. This @@ -296,7 +297,7 @@ impl ServerConfig { pub fn set_single_cert(&mut self, cert_chain: Vec, key_der: key::PrivateKey) { - self.cert_resolver = Box::new(AlwaysResolvesChain::new_rsa(cert_chain, &key_der)); + self.cert_resolver = Arc::new(AlwaysResolvesChain::new_rsa(cert_chain, &key_der)); } /// Set the ALPN protocol list to the given protocol names. diff --git a/src/ticketer.rs b/src/ticketer.rs index a5ece8ef..d81d07db 100644 --- a/src/ticketer.rs +++ b/src/ticketer.rs @@ -4,7 +4,7 @@ use rand; use time; use std::mem; -use std::sync::Mutex; +use std::sync::{Mutex, Arc}; use ring::aead; /// This is a `ProducesTickets` implementation which uses @@ -188,7 +188,7 @@ impl Ticketer { /// with a 12 hour life and randomly generated keys. /// /// The encryption mechanism used in Chacha20Poly1305. - pub fn new() -> Box { - Box::new(TicketSwitcher::new(6 * 60 * 60, generate_inner)) + pub fn new() -> Arc { + Arc::new(TicketSwitcher::new(6 * 60 * 60, generate_inner)) } } diff --git a/tests/api.rs b/tests/api.rs index 96cc91bc..bb50cd8c 100644 --- a/tests/api.rs +++ b/tests/api.rs @@ -387,7 +387,7 @@ fn server_cert_resolve_with_sni() { let client_config = make_client_config(); let mut server_config = make_server_config(); - server_config.cert_resolver = Box::new(ServerCheckCertResolve::new("the-value-from-sni")); + server_config.cert_resolver = Arc::new(ServerCheckCertResolve::new("the-value-from-sni")); let mut client = ClientSession::new(&Arc::new(client_config), "the-value-from-sni"); let mut server = ServerSession::new(&Arc::new(server_config)); @@ -757,3 +757,25 @@ fn server_stream_read() { check_read(&mut stream, b"world"); } } + +#[test] +fn server_config_is_clone() { + make_server_config().clone(); +} + +#[test] +fn client_config_is_clone() { + make_client_config().clone(); +} + +#[test] +fn client_session_is_debug() { + let client = ClientSession::new(&Arc::new(make_client_config()), "localhost"); + println!("{:?}", client); +} + +#[test] +fn server_session_is_debug() { + let server = ServerSession::new(&Arc::new(make_server_config())); + println!("{:?}", server); +}