@@ -422,13 +422,13 @@ public async Task DisposeAsync(IOBehavior ioBehavior, CancellationToken cancella
422
422
}
423
423
}
424
424
425
- var connected = false ;
426
- if ( cs . ConnectionProtocol == MySqlConnectionProtocol . Sockets )
427
- connected = await OpenTcpSocketAsync ( cs , loadBalancer ?? throw new ArgumentNullException ( nameof ( loadBalancer ) ) , activity , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
428
- else if ( cs . ConnectionProtocol == MySqlConnectionProtocol . UnixSocket )
429
- connected = await OpenUnixSocketAsync ( cs , activity , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
430
- else if ( cs . ConnectionProtocol == MySqlConnectionProtocol . NamedPipe )
431
- connected = await OpenNamedPipeAsync ( cs , startingTimestamp , activity , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
425
+ var connected = cs . ConnectionProtocol switch
426
+ {
427
+ MySqlConnectionProtocol . Sockets => await OpenTcpSocketAsync ( cs , loadBalancer ?? throw new ArgumentNullException ( nameof ( loadBalancer ) ) , activity , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ,
428
+ MySqlConnectionProtocol . UnixSocket => await OpenUnixSocketAsync ( cs , activity , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ,
429
+ MySqlConnectionProtocol . NamedPipe => await OpenNamedPipeAsync ( cs , startingTimestamp , activity , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ,
430
+ _ => false ,
431
+ } ;
432
432
if ( ! connected )
433
433
{
434
434
lock ( m_lock )
@@ -686,12 +686,13 @@ private async Task<PayloadData> SwitchAuthenticationAsync(ConnectionSettings cs,
686
686
return await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
687
687
688
688
case "caching_sha2_password" :
689
+ // see https://dev.mysql.com/doc/dev/mysql-server/latest/page_caching_sha2_authentication_exchanges.html
689
690
var scrambleBytes = AuthenticationUtility . CreateScrambleResponse ( Utility . TrimZeroByte ( switchRequest . Data . AsSpan ( ) ) , password ) ;
690
691
payload = new ( scrambleBytes ) ;
691
692
await SendReplyAsync ( payload , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
692
693
payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
693
694
694
- // OK payload can be sent immediately (e.g., if password is empty( (short-circuiting the )
695
+ // OK payload can be sent immediately (e.g., if password is empty) bypassing even the fast authentication path
695
696
if ( OkPayload . IsOk ( payload . Span , SupportsDeprecateEof ) )
696
697
return payload ;
697
698
@@ -814,7 +815,7 @@ private async Task<string> GetRsaPublicKeyAsync(string switchRequestName, Connec
814
815
{
815
816
// request the RSA public key
816
817
var payloadContent = switchRequestName == "caching_sha2_password" ? ( byte ) 0x02 : ( byte ) 0x01 ;
817
- await SendReplyAsync ( new PayloadData ( [ payloadContent ] ) , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
818
+ await SendReplyAsync ( new PayloadData ( [ payloadContent ] ) , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
818
819
var payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
819
820
var publicKeyPayload = AuthenticationMoreDataPayload . Create ( payload . Span ) ;
820
821
return Encoding . ASCII . GetString ( publicKeyPayload . Data ) ;
0 commit comments