diff --git a/src/config.rs b/src/config.rs index 8113d66..55b085b 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,6 +1,7 @@ extern crate serde_derive; extern crate toml; use toml::de::Error; +use std::collections::HashMap; // use serde_derive::Deserialize; @@ -25,5 +26,13 @@ impl Config { let config: Config = toml::from_str(&fd).unwrap(); return config; } + pub fn to_map( &self /*cfg: &config::Config*/) -> HashMap { + let mut map = HashMap::new(); + for srv in &self.server { + map.insert(srv.url.clone(), srv.dir.clone()); + } + map + } + } diff --git a/src/main.rs b/src/main.rs index e67d8fd..6860be2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ use std::fs::File; use std::sync::Arc; use std::net::ToSocketAddrs; use std::io::{ self, BufReader }; +use std::collections::HashMap; use futures_util::future::TryFutureExt; use tokio::prelude::*; use tokio::runtime; @@ -23,6 +24,15 @@ use std::error::Error; mod config; mod tls; +fn get_tls_config(cfg: config::Config) -> rustls::ServerConfig { + let store = rustls::RootCertStore::empty(); + let verifier = rustls::AllowAnyAnonymousOrAuthenticatedClient::new(store); + let mut tls_config = rustls::ServerConfig::new( verifier /*NoClientAuth::new()*/); + tls_config.cert_resolver = Arc::new(tls::CertResolver::from_config(cfg).unwrap()); + + tls_config +} + fn get_content(request: String) -> String { let url = Url::parse(&request).unwrap(); @@ -43,7 +53,14 @@ async fn handle_connection(mut stream: TlsStream) -> Result<(), Box) -> Result<(), Box io::Result<()> { let cfg = config::Config::new("config.toml"); + let srv_map = cfg.to_map(); let addr = format!("{}:{}", cfg.host, cfg.port); addr.to_socket_addrs()? .next() .ok_or_else(|| io::Error::from(io::ErrorKind::AddrNotAvailable))?; - let certs = tls::load_certs(&cfg.server[0].cert)?; - let keys = tls::load_key(&cfg.server[0].key); - let mut runtime = runtime::Builder::new() .threaded_scheduler() .enable_io() .build()?; let handle = runtime.handle().clone(); - let mut config = ServerConfig::new(NoClientAuth::new()); - config.set_single_cert(certs, keys) - .map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?; - let acceptor = TlsAcceptor::from(Arc::new(config)); + let config = get_tls_config(cfg); - println!("Serving"); + let acceptor = TlsAcceptor::from(Arc::new(config)); let fut = async { let mut listener = TcpListener::bind(&addr).await?; diff --git a/src/tls.rs b/src/tls.rs index a26fb15..7314e2f 100644 --- a/src/tls.rs +++ b/src/tls.rs @@ -54,19 +54,16 @@ impl CertResolver { certs, signing_key_boxed))); } - println!("Successfully loaded {} HTTPS configurations", map.len()); + println!("Successfully loaded {} TLS configurations", map.len()); Ok(CertResolver{ map }) } } impl ResolvesServerCert for CertResolver { - fn resolve( - &self, - client_hello: ClientHello, - ) -> Option { - if let Some(server_name) = client_hello.server_name() { - if let Some(cert) = self.map.get(server_name.into()) { + fn resolve( &self, client_hello: ClientHello) -> Option { + if let Some(url) = client_hello.server_name() { + if let Some(cert) = self.map.get(url.into()) { return Some(*cert.clone()) } }