1- use std:: sync:: Arc ;
2-
31use common:: net:: Packet ;
42use null_talk_server:: {
53 ServerConfig ,
64 handlers:: { handle_client, task:: start_writer_task} ,
75} ;
6+ use rustls:: pki_types:: PrivateKeyDer ;
7+ use std:: { fs, io:: BufReader , sync:: Arc } ;
88use tokio:: {
99 net:: TcpListener ,
1010 sync:: { Mutex as AsyncMutex , mpsc} ,
1111} ;
12+ use tokio_rustls:: { TlsAcceptor , rustls:: ServerConfig as RustlsServerConfig } ;
1213
1314/// Main entry point for the server
1415#[ tokio:: main]
@@ -23,23 +24,86 @@ async fn main() {
2324 println ! ( "🔧 Configuration Loaded" ) ;
2425
2526 let server_address = config. get_addr ( ) ;
26- let listener = TcpListener :: bind ( & server_address) . await . unwrap ( ) ;
27- println ! ( "🚀 Server listening on {}" , & server_address) ;
2827
28+ // Shared channel for communication
2929 let ( tx, rx) = mpsc:: unbounded_channel :: < Packet > ( ) ;
3030 let _ = start_writer_task ( rx) . await ;
31-
3231 let sender: Arc < AsyncMutex < mpsc:: UnboundedSender < Packet > > > = Arc :: new ( AsyncMutex :: new ( tx) ) ;
32+
33+ // TLS check
34+ if let Some ( tls_cfg) = & config. tls {
35+ if tls_cfg. enabled {
36+ // Load certs
37+ let certs = {
38+ let file = fs:: File :: open ( tls_cfg. cert_path . as_ref ( ) . unwrap ( ) )
39+ . expect ( "Cannot open cert file" ) ;
40+ let mut reader = BufReader :: new ( file) ;
41+ rustls_pemfile:: certs ( & mut reader)
42+ . into_iter ( )
43+ . map ( |v| v. expect ( "Failed to read certificate" ) )
44+ . collect :: < Vec < _ > > ( )
45+ } ;
46+
47+ let key = {
48+ let file = fs:: File :: open ( tls_cfg. key_path . as_ref ( ) . unwrap ( ) )
49+ . expect ( "Cannot open key file" ) ;
50+ let mut reader = BufReader :: new ( file) ;
51+ let first_key = rustls_pemfile:: pkcs8_private_keys ( & mut reader)
52+ . next ( )
53+ . ok_or ( "No private keys found" )
54+ . expect ( "Failed to read private key" )
55+ . expect ( "Failed to read private key" ) ;
56+
57+ PrivateKeyDer :: Pkcs8 ( first_key)
58+ } ;
59+
60+ let tls_config = RustlsServerConfig :: builder ( )
61+ . with_no_client_auth ( )
62+ . with_single_cert ( certs, key)
63+ . expect ( "Failed to create TLS config" ) ;
64+
65+ let acceptor = TlsAcceptor :: from ( Arc :: new ( tls_config) ) ;
66+ let listener = TcpListener :: bind ( & server_address) . await . unwrap ( ) ;
67+ println ! ( "🔒 TLS Server listening on {}" , & server_address) ;
68+
69+ loop {
70+ match listener. accept ( ) . await {
71+ Ok ( ( stream, _) ) => {
72+ let acceptor = acceptor. clone ( ) ;
73+ let sd_clone = sender. clone ( ) ;
74+
75+ tokio:: spawn ( async move {
76+ match acceptor. accept ( stream) . await {
77+ Ok ( tls_stream) => {
78+ handle_client ( Box :: new ( tls_stream) , sd_clone) . await
79+ }
80+ Err ( e) => eprintln ! ( "TLS handshake failed: {:?}" , e) ,
81+ }
82+ } ) ;
83+ }
84+ Err ( e) => eprintln ! ( "Failed to accept connection: {:?}" , e) ,
85+ }
86+ }
87+ } else {
88+ start_plain_server ( & server_address, sender) . await ;
89+ }
90+ } else {
91+ start_plain_server ( & server_address, sender) . await ;
92+ }
93+ }
94+
95+ /// Helper to start plain TCP server
96+ async fn start_plain_server ( addr : & str , sender : Arc < AsyncMutex < mpsc:: UnboundedSender < Packet > > > ) {
97+ let listener = TcpListener :: bind ( addr) . await . unwrap ( ) ;
98+ println ! ( "🚀 Plain TCP Server listening on {}" , addr) ;
99+
33100 loop {
34101 match listener. accept ( ) . await {
35102 Ok ( ( stream, _) ) => {
36103 let sd_clone = sender. clone ( ) ;
37- tokio:: spawn ( async move { handle_client ( stream, sd_clone) . await } ) ;
104+ tokio:: spawn ( async move { handle_client ( Box :: new ( stream) , sd_clone) . await } ) ;
38105 }
39- Err ( e) => {
40- eprintln ! ( "Failed to accept connection: {:?}" , e) ;
41- continue ;
42- }
43- } ;
106+ Err ( e) => eprintln ! ( "Failed to accept connection: {:?}" , e) ,
107+ }
44108 }
45109}
0 commit comments