@@ -16,17 +16,17 @@ async fn handle_authenticate(
1616 services : Conditional < ServicesTarget < ' _ > > ,
1717 text : & str ,
1818) -> CommandResult {
19- let authenticate_request = if let Some ( session) = source. sasl_session . get ( ) {
19+ let mut session_ref = source. sasl_session . lock ( ) . await ;
20+ let authenticate_request = if let Some ( session) = * session_ref {
2021 // A session already exists, so the argument is "*" or base64-encoded session data
22+ tracing:: debug!( ?session, "Resuming SASL session" ) ;
2123 if text == "*" {
22- RemoteServicesServerRequestType :: AbortAuthenticate ( * session)
24+ RemoteServicesServerRequestType :: AbortAuthenticate ( session)
2325 } else {
24- let Ok ( data) = BASE64_STANDARD . decode ( text) else {
25- response. numeric ( make_numeric ! ( SaslFail ) ) ;
26- return Ok ( ( ) ) ;
27- } ;
28-
29- RemoteServicesServerRequestType :: Authenticate ( * session, data)
26+ match BASE64_STANDARD . decode ( text) {
27+ Err ( _) => RemoteServicesServerRequestType :: FailAuthenticate ( session) ,
28+ Ok ( data) => RemoteServicesServerRequestType :: Authenticate ( session, data) ,
29+ }
3030 }
3131 } else {
3232 // No session, so the argument is the mechanism name
@@ -46,13 +46,15 @@ async fn handle_authenticate(
4646
4747 // Special case for EXTERNAL, which we can handle without going to services
4848 if text == "EXTERNAL" {
49+ drop ( session_ref) ; // release lock, which borrows 'source'
4950 return do_sasl_external ( source, cmd. connection ( ) , net, response) ;
5051 }
5152
5253 let mechanism = text. to_owned ( ) ;
5354
5455 let session = server. ids ( ) . next ( ) ;
55- source. sasl_session . set ( session) . ok ( ) ;
56+ * session_ref = Some ( session) ;
57+ tracing:: debug!( ?session, "Beginning new SASL session " ) ;
5658
5759 RemoteServicesServerRequestType :: BeginAuthenticate ( session, mechanism)
5860 } ;
@@ -88,9 +90,11 @@ async fn handle_authenticate(
8890 response. numeric ( make_numeric ! ( SaslSuccess ) ) ;
8991 }
9092 Fail => {
93+ * session_ref = None ;
9194 response. numeric ( make_numeric ! ( SaslFail ) ) ;
9295 }
9396 Aborted => {
97+ * session_ref = None ;
9498 response. numeric ( make_numeric ! ( SaslAborted ) ) ;
9599 }
96100 }
0 commit comments