From 3fff95daecdd6f88a1bcbe16919cb55b07d416e9 Mon Sep 17 00:00:00 2001 From: int 80h Date: Thu, 14 May 2020 15:33:45 -0400 Subject: [PATCH] Added default server if client doesn't use sni --- config.toml | 3 ++- src/main.rs | 25 +++++++++++-------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/config.toml b/config.toml index 0624e18..e7e8605 100644 --- a/config.toml +++ b/config.toml @@ -2,7 +2,8 @@ port = 1965 # use "::" for ipv6 and ipv4 or "0.0.0.0" for ipv4 only host = "::" -# There must be at least 1 server tag +# There must be at least 1 server tag if a client doesn't send sni the server +# will use this tag as its default. # Server 1 [[server]] hostname = "example.com" diff --git a/src/main.rs b/src/main.rs index f1cb734..e067574 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,7 +12,6 @@ use std::io::{self, BufRead, BufReader}; use std::net::ToSocketAddrs; use std::os::unix::fs::PermissionsExt; use std::path::{Path, PathBuf}; -use tokio::io::AsyncWriteExt; use tokio::net::TcpListener; use tokio::prelude::*; use tokio::runtime; @@ -264,6 +263,7 @@ fn main() -> io::Result<()> { let cfg = config::Config::new(&p)?; let cmap = cfg.to_map(); + let default = &cfg.server[0].hostname; println!("Serving {} vhosts", cfg.server.len()); let addr = format!("{}:{}", cfg.host, cfg.port); @@ -286,24 +286,21 @@ fn main() -> io::Result<()> { let (stream, peer_addr) = listener.accept().await?; let acceptor = acceptor.clone(); let cmap = cmap.clone(); + let default = default.clone(); let fut = async move { - let mut stream = tokio_openssl::accept(&acceptor, stream) + let stream = tokio_openssl::accept(&acceptor, stream) .await .expect("Couldn't accept"); - let sni = match stream.ssl().servername(NameType::HOST_NAME) { - Some(s) => s, - None => return Ok(()), - }; - let srv = match cmap.get(sni) { - Some(h) => h, - None => { - // I'm not sure this will actually get called? - stream.write_all(b"59\tNotFound!\r\n").await?; - stream.flush().await?; - return Ok(()); - } + let srv = match stream.ssl().servername(NameType::HOST_NAME) { + Some(s) => { + match cmap.get(s) { + Some(ss) => ss, + None => cmap.get(&default).unwrap(), + } + }, + None => cmap.get(&default).unwrap(), }; let con = conn::Connection { stream, peer_addr };