@@ -39,34 +39,46 @@ impl CredentialManager {
3939 Ok ( ( user, password) )
4040 }
4141
42+ /// Prompts for credentials and verifies them, handling passwordless scenarios.
4243 pub fn prompt_credentials_with_connection_test ( & self ) -> Result < ( String , String ) > {
4344 let max_retries = 3 ;
44- for attempt in 0 ..max_retries {
45+ for _ in 0 ..max_retries {
4546 let ( user, password) = self . prompt_for_credentials ( ) ?;
46- // Build a temporary DorisConfig for connection test
47- let config = DorisConfig {
48- mysql : Some ( MySQLConfig {
49- user : user. clone ( ) ,
50- password : self . encrypt_password ( & password) ?,
51- } ) ,
52- ..Default :: default ( )
53- } ;
54- // Try to run a simple query to test credentials
55- let test_result = MySQLTool :: query_sql_with_config ( & config, "SELECT 1" ) ;
56- match test_result {
57- Ok ( _) => return Ok ( ( user, password) ) ,
47+
48+ match self . test_connection ( & user, & password) {
49+ Ok ( _) => {
50+ if password. is_empty ( ) || self . test_connection ( & user, "" ) . is_err ( ) {
51+ return Ok ( ( user, password) ) ;
52+ } else {
53+ return Ok ( ( user, "" . to_string ( ) ) ) ;
54+ }
55+ }
5856 Err ( CliError :: MySQLAccessDenied ( _) ) => {
59- println ! ( "Access denied for user. Please try again." ) ;
57+ crate :: ui:: print_error (
58+ "Access denied. Please check your password and try again." ,
59+ ) ;
60+ }
61+ Err ( e) => {
62+ return Err ( e) ;
6063 }
61- Err ( e) => return Err ( e) ,
62- }
63- if attempt == max_retries - 1 {
64- return Err ( CliError :: MySQLAccessDenied (
65- "Maximum retries reached" . to_string ( ) ,
66- ) ) ;
6764 }
6865 }
69- unreachable ! ( )
66+
67+ Err ( CliError :: MySQLAccessDenied (
68+ "Maximum retries reached" . to_string ( ) ,
69+ ) )
70+ }
71+
72+ /// Helper function to test a MySQL connection with specific credentials.
73+ fn test_connection ( & self , user : & str , password : & str ) -> Result < ( ) > {
74+ let config = DorisConfig {
75+ mysql : Some ( MySQLConfig {
76+ user : user. to_string ( ) ,
77+ password : self . encrypt_password ( password) ?,
78+ } ) ,
79+ ..Default :: default ( )
80+ } ;
81+ MySQLTool :: query_sql_with_config ( & config, "SELECT 1" ) . map ( |_| ( ) )
7082 }
7183
7284 pub fn encrypt_credentials ( & self , user : & str , password : & str ) -> Result < MySQLConfig > {
0 commit comments