1- use ironrdp_connector:: credssp:: { CredsspProcessGenerator , CredsspSequence , KerberosConfig } ;
1+ use ironrdp_connector:: credssp:: { CredsspProcessGenerator , KerberosConfig } ;
22use ironrdp_connector:: sspi:: credssp:: ClientState ;
33use ironrdp_connector:: sspi:: generator:: GeneratorState ;
44use ironrdp_connector:: {
5- custom_err, general_err, ClientConnector , ClientConnectorState , ConnectionResult , ConnectorError , ConnectorResult ,
6- ServerName , State as _ ,
5+ custom_err, general_err, ClientConnector , ClientConnectorState , ConnectionResult , ConnectorCore , ConnectorError ,
6+ ConnectorResult , SecurityConnector , ServerName ,
77} ;
88use ironrdp_core:: WriteBuf ;
99use tracing:: { debug, info, instrument, trace} ;
@@ -15,7 +15,10 @@ use crate::{single_sequence_step, AsyncNetworkClient};
1515pub struct ShouldUpgrade ;
1616
1717#[ instrument( skip_all) ]
18- pub async fn connect_begin < S > ( framed : & mut Framed < S > , connector : & mut ClientConnector ) -> ConnectorResult < ShouldUpgrade >
18+ pub async fn connect_begin < S > (
19+ framed : & mut Framed < S > ,
20+ connector : & mut dyn ConnectorCore ,
21+ ) -> ConnectorResult < ShouldUpgrade >
1922where
2023 S : Sync + FramedRead + FramedWrite ,
2124{
3336/// # Panics
3437///
3538/// Panics if connector state is not [ClientConnectorState::EnhancedSecurityUpgrade].
36- pub fn skip_connect_begin ( connector : & mut ClientConnector ) -> ShouldUpgrade {
39+ pub fn skip_connect_begin ( connector : & mut dyn SecurityConnector ) -> ShouldUpgrade {
3740 assert ! ( connector. should_perform_security_upgrade( ) ) ;
3841 ShouldUpgrade
3942}
@@ -42,22 +45,26 @@ pub fn skip_connect_begin(connector: &mut ClientConnector) -> ShouldUpgrade {
4245pub struct Upgraded ;
4346
4447#[ instrument( skip_all) ]
45- pub fn mark_as_upgraded ( _: ShouldUpgrade , connector : & mut ClientConnector ) -> Upgraded {
48+ pub fn mark_as_upgraded ( _: ShouldUpgrade , connector : & mut dyn SecurityConnector ) -> Upgraded {
4649 trace ! ( "Marked as upgraded" ) ;
4750 connector. mark_security_upgrade_as_done ( ) ;
4851 Upgraded
4952}
5053
51- #[ instrument( skip_all) ]
52- pub async fn connect_finalize < S > (
54+ #[ non_exhaustive]
55+ pub struct CredSSPFinished {
56+ pub ( crate ) write_buf : WriteBuf ,
57+ }
58+
59+ pub async fn perform_credssp < S > (
5360 _: Upgraded ,
61+ connector : & mut dyn ConnectorCore ,
5462 framed : & mut Framed < S > ,
55- mut connector : ClientConnector ,
5663 server_name : ServerName ,
5764 server_public_key : Vec < u8 > ,
5865 network_client : Option < & mut dyn AsyncNetworkClient > ,
5966 kerberos_config : Option < KerberosConfig > ,
60- ) -> ConnectorResult < ConnectionResult >
67+ ) -> ConnectorResult < CredSSPFinished >
6168where
6269 S : FramedRead + FramedWrite ,
6370{
6673 if connector. should_perform_credssp ( ) {
6774 perform_credssp_step (
6875 framed,
69- & mut connector,
76+ connector,
7077 & mut buf,
7178 server_name,
7279 server_public_key,
7683 . await ?;
7784 }
7885
86+ Ok ( CredSSPFinished { write_buf : buf } )
87+ }
88+
89+ #[ instrument( skip_all) ]
90+ pub async fn connect_finalize < S > (
91+ CredSSPFinished { write_buf : mut buf } : CredSSPFinished ,
92+ framed : & mut Framed < S > ,
93+ mut connector : ClientConnector ,
94+ ) -> ConnectorResult < ConnectionResult >
95+ where
96+ S : FramedRead + FramedWrite ,
97+ {
98+ buf. clear ( ) ;
7999 let result = loop {
80100 single_sequence_step ( framed, & mut connector, & mut buf) . await ?;
81101
@@ -112,7 +132,7 @@ async fn resolve_generator(
112132#[ instrument( level = "trace" , skip_all) ]
113133async fn perform_credssp_step < S > (
114134 framed : & mut Framed < S > ,
115- connector : & mut ClientConnector ,
135+ connector : & mut dyn ConnectorCore ,
116136 buf : & mut WriteBuf ,
117137 server_name : ServerName ,
118138 server_public_key : Vec < u8 > ,
@@ -124,70 +144,70 @@ where
124144{
125145 assert ! ( connector. should_perform_credssp( ) ) ;
126146
127- let selected_protocol = match connector. state {
128- ClientConnectorState :: Credssp { selected_protocol, .. } => selected_protocol,
129- _ => return Err ( general_err ! ( "invalid connector state for CredSSP sequence" ) ) ,
130- } ;
131-
132- let ( mut sequence, mut ts_request) = CredsspSequence :: init (
133- connector. config . credentials . clone ( ) ,
134- connector. config . domain . as_deref ( ) ,
135- selected_protocol,
136- server_name,
137- server_public_key,
138- kerberos_config,
139- ) ?;
140-
141- loop {
142- let client_state = {
143- let mut generator = sequence. process_ts_request ( ts_request) ;
147+ let selected_protocol = connector
148+ . selected_protocol ( )
149+ . ok_or_else ( || general_err ! ( "CredSSP protocol not selected, cannot perform CredSSP step" ) ) ?;
144150
145- if let Some ( network_client_ref) = network_client. as_deref_mut ( ) {
146- trace ! ( "resolving network" ) ;
147- resolve_generator ( & mut generator, network_client_ref) . await ?
148- } else {
149- generator
150- . resolve_to_result ( )
151- . map_err ( |e| custom_err ! ( "resolve without network client" , e) ) ?
151+ {
152+ let ( mut sequence, mut ts_request) = connector. init_credssp (
153+ connector. config ( ) . credentials . clone ( ) ,
154+ connector. config ( ) . domain . as_deref ( ) ,
155+ selected_protocol,
156+ server_name,
157+ server_public_key,
158+ kerberos_config,
159+ ) ?;
160+
161+ loop {
162+ let client_state = {
163+ let mut generator = sequence. process_ts_request ( ts_request) ;
164+
165+ if let Some ( network_client_ref) = network_client. as_deref_mut ( ) {
166+ trace ! ( "resolving network" ) ;
167+ resolve_generator ( & mut generator, network_client_ref) . await ?
168+ } else {
169+ generator
170+ . resolve_to_result ( )
171+ . map_err ( |e| custom_err ! ( "resolve without network client" , e) ) ?
172+ }
173+ } ; // drop generator
174+
175+ buf. clear ( ) ;
176+ let written = sequence. handle_process_result ( client_state, buf) ?;
177+
178+ if let Some ( response_len) = written. size ( ) {
179+ let response = & buf[ ..response_len] ;
180+ trace ! ( response_len, "Send response" ) ;
181+ framed
182+ . write_all ( response)
183+ . await
184+ . map_err ( |e| ironrdp_connector:: custom_err!( "write all" , e) ) ?;
152185 }
153- } ; // drop generator
154186
155- buf. clear ( ) ;
156- let written = sequence. handle_process_result ( client_state, buf) ?;
187+ let Some ( next_pdu_hint) = sequence. next_pdu_hint ( ) else {
188+ break ;
189+ } ;
157190
158- if let Some ( response_len) = written. size ( ) {
159- let response = & buf[ ..response_len] ;
160- trace ! ( response_len, "Send response" ) ;
161- framed
162- . write_all ( response)
163- . await
164- . map_err ( |e| ironrdp_connector:: custom_err!( "write all" , e) ) ?;
165- }
166-
167- let Some ( next_pdu_hint) = sequence. next_pdu_hint ( ) else {
168- break ;
169- } ;
170-
171- debug ! (
172- connector. state = connector. state. name( ) ,
173- hint = ?next_pdu_hint,
174- "Wait for PDU"
175- ) ;
191+ debug ! (
192+ connector. state = connector. state( ) . name( ) ,
193+ hint = ?next_pdu_hint,
194+ "Wait for PDU"
195+ ) ;
176196
177- let pdu = framed
178- . read_by_hint ( next_pdu_hint)
179- . await
180- . map_err ( |e| ironrdp_connector:: custom_err!( "read frame by hint" , e) ) ?;
197+ let pdu = framed
198+ . read_by_hint ( next_pdu_hint)
199+ . await
200+ . map_err ( |e| ironrdp_connector:: custom_err!( "read frame by hint" , e) ) ?;
181201
182- trace ! ( length = pdu. len( ) , "PDU received" ) ;
202+ trace ! ( length = pdu. len( ) , "PDU received" ) ;
183203
184- if let Some ( next_request) = sequence. decode_server_message ( & pdu) ? {
185- ts_request = next_request;
186- } else {
187- break ;
204+ if let Some ( next_request) = sequence. decode_server_message ( & pdu) ? {
205+ ts_request = next_request;
206+ } else {
207+ break ;
208+ }
188209 }
189210 }
190-
191211 connector. mark_credssp_as_done ( ) ;
192212
193213 Ok ( ( ) )
0 commit comments