@@ -215,7 +215,7 @@ async fn search<W: AsyncWrite + Unpin>(
215215 w : & mut FramedWrite < W , LdapCodec > ,
216216 app_state : & AppState ,
217217 search_request : SearchRequest < ' _ > ,
218- ) -> Result < Option < ClientState > , LdapError > {
218+ ) -> Result < ( ) , LdapError > {
219219 let SearchRequest {
220220 sr,
221221 msgid,
@@ -265,7 +265,7 @@ async fn search<W: AsyncWrite + Unpin>(
265265 LdapError :: Transport
266266 } ) ?;
267267
268- return Ok ( None ) ;
268+ return Ok ( ( ) ) ;
269269 }
270270 } ;
271271
@@ -328,7 +328,7 @@ async fn search<W: AsyncWrite + Unpin>(
328328 } ) ?;
329329
330330 // Error sent, return with no state change.
331- return Ok ( None ) ;
331+ return Ok ( ( ) ) ;
332332 }
333333 }
334334 }
@@ -378,7 +378,7 @@ async fn search<W: AsyncWrite + Unpin>(
378378 app_state. cache . try_quiesce ( ) ;
379379
380380 // No state change
381- Ok ( None )
381+ Ok ( ( ) )
382382}
383383
384384#[ instrument( level = "info" , skip_all) ]
@@ -471,6 +471,56 @@ pub async fn client_process<W: AsyncWrite + Unpin, R: AsyncRead + Unpin>(
471471 break ;
472472 }
473473
474+ // Unbound handler
475+ (
476+ ClientState :: Unbound ,
477+ LdapMsg {
478+ msgid,
479+ op : LdapOp :: SearchRequest ( sr) ,
480+ ctrl,
481+ } ,
482+ ) => {
483+ // We have to trigger a bind first in case we have a mapping.
484+ let lbr = LdapBindRequest {
485+ dn : "" . to_string ( ) ,
486+ cred : LdapBindCred :: Simple ( "" . to_string ( ) ) ,
487+ } ;
488+
489+ let mut next_state = match bind ( & mut w, & app_state, lbr, 0 , Vec :: default ( ) ) . await {
490+ Ok ( ns) => ns,
491+ Err ( _) => break ,
492+ } ;
493+
494+ match & mut next_state {
495+ Some ( ClientState :: Unbound ) | None => {
496+ error ! ( "Invalid state, bind did not return an authenticated state!" ) ;
497+ break ;
498+ }
499+ Some ( ClientState :: Authenticated {
500+ dn,
501+ display_dn,
502+ config,
503+ ref mut client,
504+ } ) => {
505+ let search_req = SearchRequest {
506+ sr,
507+ msgid,
508+ ctrl,
509+ dn,
510+ display_dn,
511+ config,
512+ client,
513+ } ;
514+ match search ( & mut w, & app_state, search_req) . await {
515+ Ok ( ( ) ) => { }
516+ Err ( _) => break ,
517+ }
518+ }
519+ }
520+
521+ next_state
522+ }
523+
474524 // Authenticated message handler.
475525 // - Search
476526 (
@@ -497,7 +547,7 @@ pub async fn client_process<W: AsyncWrite + Unpin, R: AsyncRead + Unpin>(
497547 } ;
498548
499549 match search ( & mut w, & app_state, search_req) . await {
500- Ok ( ns ) => ns ,
550+ Ok ( ( ) ) => None ,
501551 Err ( _) => break ,
502552 }
503553 }
@@ -520,7 +570,7 @@ pub async fn client_process<W: AsyncWrite + Unpin, R: AsyncRead + Unpin>(
520570 } ,
521571 // Unknown message handler.
522572 ( _, msg) => {
523- debug ! ( ?msg) ;
573+ debug ! ( ?msg, "Invalid message state, triggering disconnection" ) ;
524574 // Return a disconnect.
525575 break ;
526576 }
0 commit comments