use std::{io::Error, sync::Arc, thread};
use openssl::ssl::{Ssl, SslAcceptor, SslFiletype, SslMethod};
use tokio::net::TcpListener;
use tokio_openssl::SslStream;
use crate::{
protocol::prelude::common::utils::{Certificate, Listener, DEVICES},
server::tcp::handle_client,
};
#[allow(unused_must_use)]
pub async fn listen(port: String, cert: Certificate) -> Result<(), Error> {
let acceptor = load_acceptor(cert);
let listener = TcpListener::bind(format!("127.0.0.1:{}", port)).await?;
let static_listener: &'static TcpListener = Box::leak(Box::new(listener));
DEVICES.lock().unwrap().insert(
("127.0.0.1".to_string(), port.clone()),
Listener::TokioServer(static_listener),
);
println!("[SHDP:TLS] Listening on port {}", port.clone());
while let Ok((stream, _)) = DEVICES
.lock()
.unwrap()
.get(&("127.0.0.1".to_string(), port.clone()))
.unwrap()
.get_tokio_server()
.accept()
.await
{
println!(
"[SHDP:TLS] New connection from {}",
stream.peer_addr().unwrap()
);
let acceptor_duplicate = acceptor.clone();
thread::spawn(move || {
let ssl = Ssl::new(acceptor_duplicate.context()).unwrap();
let tls_stream = SslStream::new(ssl, stream);
match tls_stream {
Ok(tls_stream) => {
handle_client(tls_stream);
}
Err(e) => println!("[SHDP:TLS] Error: {:?}", e),
}
});
}
Ok(())
}
fn load_acceptor(cert: Certificate) -> Arc<SslAcceptor> {
let mut builder = SslAcceptor::mozilla_intermediate(SslMethod::tls()).unwrap();
builder
.set_private_key_file(&cert.key_path, SslFiletype::PEM)
.unwrap();
builder.set_certificate_chain_file(&cert.cert_path).unwrap();
Arc::new(builder.build())
}