@@ -62,7 +62,7 @@ use tokio_tungstenite::{
6262use crate :: stream:: Dispatcher ;
6363#[ cfg( feature ="ws" ) ]
6464use crate :: ws:: WsStream ;
65- use crate :: { Error , Result } ;
65+ use crate :: { CertInfo , Error , Result , TlsCertExtractor } ;
6666
6767/// Configuration builder for MQTT server instances
6868#[ derive( Clone , Debug ) ]
@@ -659,7 +659,7 @@ where
659659#[ inline]
660660pub fn tcp ( self ) ->Result < Dispatcher < S > > {
661661if matches ! ( self . typ, ListenerType :: TCP ) {
662- Ok ( Dispatcher :: new ( self . socket , self . remote_addr , self . cfg ) )
662+ Ok ( Dispatcher :: new ( self . socket , self . remote_addr , None , self . cfg ) )
663663} else {
664664Err ( anyhow ! ( "Protocol mismatch: Expected TCP listener" ) )
665665}
@@ -680,7 +680,10 @@ where
680680Ok ( Err ( e) ) =>return Err ( e. into ( ) ) ,
681681Err ( _) =>return Err ( crate :: MqttError :: ReadTimeout . into ( ) ) ,
682682} ;
683- Ok ( Dispatcher :: new ( tls_s, self . remote_addr , self . cfg ) )
683+
684+ let cert_info =Self :: get_extract_cert_info ( & tls_s, self . cfg . cert_cn_as_username ) ;
685+
686+ Ok ( Dispatcher :: new ( tls_s, self . remote_addr , cert_info, self . cfg ) )
684687}
685688
686689#[ cfg( feature ="ws" ) ]
@@ -695,7 +698,7 @@ where
695698. await
696699{
697700Ok ( Ok ( ws_stream) ) =>{
698- Ok ( Dispatcher :: new ( WsStream :: new ( ws_stream) , self . remote_addr , self . cfg . clone ( ) ) )
701+ Ok ( Dispatcher :: new ( WsStream :: new ( ws_stream) , self . remote_addr , None , self . cfg . clone ( ) ) )
699702}
700703Ok ( Err ( e) ) =>Err ( e. into ( ) ) ,
701704Err ( _) =>Err ( crate :: MqttError :: ReadTimeout . into ( ) ) ,
@@ -718,14 +721,35 @@ where
718721Ok ( Err ( e) ) =>return Err ( e. into ( ) ) ,
719722Err ( _) =>return Err ( crate :: MqttError :: ReadTimeout . into ( ) ) ,
720723} ;
724+
725+ let cert_info =Self :: get_extract_cert_info ( & tls_s, self . cfg . cert_cn_as_username ) ;
726+
721727match tokio:: time:: timeout ( self . cfg . handshake_timeout , accept_hdr_async ( tls_s, on_handshake) ) . await {
722728Ok ( Ok ( ws_stream) ) =>{
723- Ok ( Dispatcher :: new ( WsStream :: new ( ws_stream) , self . remote_addr , self . cfg . clone ( ) ) )
729+ Ok ( Dispatcher :: new ( WsStream :: new ( ws_stream) , self . remote_addr , cert_info , self . cfg . clone ( ) ) )
724730}
725731Ok ( Err ( e) ) =>Err ( e. into ( ) ) ,
726732Err ( _) =>Err ( crate :: MqttError :: ReadTimeout . into ( ) ) ,
727733}
728734}
735+
736+ #[ inline]
737+ #[ cfg( feature ="tls" ) ]
738+ fn get_extract_cert_info < C : TlsCertExtractor > ( io : & C , cert_cn_as_username : bool ) ->Option < CertInfo > {
739+ if cert_cn_as_username{
740+ // Extract cert info BEFORE consuming self
741+ let cert_info: Option < CertInfo > = io. extract_cert_info ( ) ;
742+ // Certificate info is now available in s.cert_info
743+ if let Some ( ref cert) = cert_info{
744+ log:: info!( "Client certificate: {}" , cert) ;
745+ log:: info!( "CN: {:?}, Org: {:?}" , cert. common_name, cert. organization) ;
746+ }
747+ log:: info!( "cert_info: {:?}" , cert_info) ;
748+ cert_info
749+ } else {
750+ None
751+ }
752+ }
729753}
730754
731755#[ allow( clippy:: result_large_err) ]