From b37e5c8a36e3e7b1811a0c54ade6671ff4a27a4e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 26 May 2021 02:51:36 +0000 Subject: [PATCH] Improve missing default signer error messaging (#17486) (#17500) (cherry picked from commit 6d40d0d14152a915f37b6c7265e2a637e86a9197) Co-authored-by: Jack May --- clap-utils/src/keypair.rs | 30 ++++++++++++++++++++++-------- cli/src/cli.rs | 15 +++------------ cli/src/cluster_query.rs | 5 +---- cli/src/main.rs | 8 ++------ cli/src/nonce.rs | 5 +---- cli/src/program.rs | 30 ++++++------------------------ cli/src/stake.rs | 5 +---- cli/src/vote.rs | 5 +---- 8 files changed, 37 insertions(+), 66 deletions(-) diff --git a/clap-utils/src/keypair.rs b/clap-utils/src/keypair.rs index 68a6c9b74f..a9fddd13e7 100644 --- a/clap-utils/src/keypair.rs +++ b/clap-utils/src/keypair.rs @@ -89,13 +89,33 @@ impl CliSignerInfo { .collect() } } - +#[derive(Debug)] pub struct DefaultSigner { pub arg_name: String, pub path: String, } impl DefaultSigner { + pub fn new(path: String) -> Self { + Self { + arg_name: "keypair".to_string(), + path, + } + } + pub fn from_path(path: String) -> Result> { + std::fs::metadata(&path) + .map_err(|_| { + std::io::Error::new( + std::io::ErrorKind::Other, + format!( + "No default signer found, run \"solana-keygen new -o {}\" to create a new one", + path + ), + ) + .into() + }) + .map(|_| Self::new(path)) + } pub fn generate_unique_signers( &self, bulk_signers: Vec>>, @@ -257,9 +277,7 @@ pub(crate) fn parse_signer_source>( ASK_KEYWORD => Ok(SignerSource::new_legacy(SignerSourceKind::Prompt)), _ => match Pubkey::from_str(source.as_str()) { Ok(pubkey) => Ok(SignerSource::new(SignerSourceKind::Pubkey(pubkey))), - Err(_) => std::fs::metadata(source.as_str()) - .map(|_| SignerSource::new(SignerSourceKind::Filepath(source))) - .map_err(|err| err.into()), + Err(_) => Ok(SignerSource::new(SignerSourceKind::Filepath(source))), }, } } @@ -733,10 +751,6 @@ mod tests { // Catchall into SignerSource::Filepath fails let junk = "sometextthatisnotapubkeyorfile".to_string(); assert!(Pubkey::from_str(&junk).is_err()); - assert!(matches!( - parse_signer_source(&junk), - Err(SignerSourceError::IoError(_)) - )); let prompt = "prompt:".to_string(); assert!(matches!( diff --git a/cli/src/cli.rs b/cli/src/cli.rs index cc29f792c4..a62f15e9ea 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -2296,10 +2296,7 @@ mod tests { let default_keypair_file = make_tmp_path("keypair_file"); write_keypair_file(&default_keypair, &default_keypair_file).unwrap(); - let default_signer = DefaultSigner { - arg_name: "keypair".to_string(), - path: default_keypair_file, - }; + let default_signer = DefaultSigner::new(default_keypair_file); let signer_info = default_signer .generate_unique_signers(vec![], &matches, &mut None) @@ -2377,10 +2374,7 @@ mod tests { let keypair_file = make_tmp_path("keypair_file"); write_keypair_file(&default_keypair, &keypair_file).unwrap(); let keypair = read_keypair_file(&keypair_file).unwrap(); - let default_signer = DefaultSigner { - path: keypair_file.clone(), - arg_name: "".to_string(), - }; + let default_signer = DefaultSigner::new(keypair_file.clone()); // Test Airdrop Subcommand let test_airdrop = test_commands @@ -2908,10 +2902,7 @@ mod tests { let default_keypair = Keypair::new(); let default_keypair_file = make_tmp_path("keypair_file"); write_keypair_file(&default_keypair, &default_keypair_file).unwrap(); - let default_signer = DefaultSigner { - path: default_keypair_file.clone(), - arg_name: "".to_string(), - }; + let default_signer = DefaultSigner::new(default_keypair_file.clone()); //Test Transfer Subcommand, SOL let from_keypair = keypair_from_seed(&[0u8; 32]).unwrap(); diff --git a/cli/src/cluster_query.rs b/cli/src/cluster_query.rs index 59e5957cce..906cdd6fc1 100644 --- a/cli/src/cluster_query.rs +++ b/cli/src/cluster_query.rs @@ -2098,10 +2098,7 @@ mod tests { let default_keypair = Keypair::new(); let (default_keypair_file, mut tmp_file) = make_tmp_file(); write_keypair(&default_keypair, tmp_file.as_file_mut()).unwrap(); - let default_signer = DefaultSigner { - path: default_keypair_file, - arg_name: String::new(), - }; + let default_signer = DefaultSigner::new(default_keypair_file); let test_cluster_version = test_commands .clone() diff --git a/cli/src/main.rs b/cli/src/main.rs index 2ceb2f4d83..d4b4056e21 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -173,16 +173,12 @@ pub fn parse_args<'a>( matches.value_of("json_rpc_url").unwrap_or(""), &config.json_rpc_url, ); - let default_signer_arg_name = "keypair".to_string(); let (_, default_signer_path) = CliConfig::compute_keypair_path_setting( - matches.value_of(&default_signer_arg_name).unwrap_or(""), + matches.value_of("keypair").unwrap_or(""), &config.keypair_path, ); - let default_signer = DefaultSigner { - arg_name: default_signer_arg_name, - path: default_signer_path.clone(), - }; + let default_signer = DefaultSigner::from_path(default_signer_path.clone())?; let CliCommandInfo { command, diff --git a/cli/src/nonce.rs b/cli/src/nonce.rs index cf56bd792e..c978dae6e0 100644 --- a/cli/src/nonce.rs +++ b/cli/src/nonce.rs @@ -596,10 +596,7 @@ mod tests { let default_keypair = Keypair::new(); let (default_keypair_file, mut tmp_file) = make_tmp_file(); write_keypair(&default_keypair, tmp_file.as_file_mut()).unwrap(); - let default_signer = DefaultSigner { - path: default_keypair_file.clone(), - arg_name: String::new(), - }; + let default_signer = DefaultSigner::new(default_keypair_file.clone()); let (keypair_file, mut tmp_file) = make_tmp_file(); let nonce_account_keypair = Keypair::new(); write_keypair(&nonce_account_keypair, tmp_file.as_file_mut()).unwrap(); diff --git a/cli/src/program.rs b/cli/src/program.rs index bcb011ea9c..2c4382a48c 100644 --- a/cli/src/program.rs +++ b/cli/src/program.rs @@ -2131,10 +2131,7 @@ mod tests { let default_keypair = Keypair::new(); let keypair_file = make_tmp_path("keypair_file"); write_keypair_file(&default_keypair, &keypair_file).unwrap(); - let default_signer = DefaultSigner { - path: keypair_file.clone(), - arg_name: "".to_string(), - }; + let default_signer = DefaultSigner::new(keypair_file.clone()); let test_command = test_commands.clone().get_matches_from(vec![ "test", @@ -2342,10 +2339,7 @@ mod tests { let default_keypair = Keypair::new(); let keypair_file = make_tmp_path("keypair_file"); write_keypair_file(&default_keypair, &keypair_file).unwrap(); - let default_signer = DefaultSigner { - path: keypair_file.clone(), - arg_name: "".to_string(), - }; + let default_signer = DefaultSigner::new(keypair_file.clone()); // defaults let test_command = test_commands.clone().get_matches_from(vec![ @@ -2493,10 +2487,7 @@ mod tests { let default_keypair = Keypair::new(); let keypair_file = make_tmp_path("keypair_file"); write_keypair_file(&default_keypair, &keypair_file).unwrap(); - let default_signer = DefaultSigner { - path: keypair_file.clone(), - arg_name: "".to_string(), - }; + let default_signer = DefaultSigner::new(keypair_file.clone()); let program_pubkey = Pubkey::new_unique(); let new_authority_pubkey = Pubkey::new_unique(); @@ -2604,10 +2595,7 @@ mod tests { let default_keypair = Keypair::new(); let keypair_file = make_tmp_path("keypair_file"); write_keypair_file(&default_keypair, &keypair_file).unwrap(); - let default_signer = DefaultSigner { - path: keypair_file.clone(), - arg_name: "".to_string(), - }; + let default_signer = DefaultSigner::new(keypair_file.clone()); let buffer_pubkey = Pubkey::new_unique(); let new_authority_pubkey = Pubkey::new_unique(); @@ -2664,10 +2652,7 @@ mod tests { let default_keypair = Keypair::new(); let keypair_file = make_tmp_path("keypair_file"); write_keypair_file(&default_keypair, &keypair_file).unwrap(); - let default_signer = DefaultSigner { - path: keypair_file, - arg_name: "".to_string(), - }; + let default_signer = DefaultSigner::new(keypair_file); // defaults let buffer_pubkey = Pubkey::new_unique(); @@ -2766,10 +2751,7 @@ mod tests { let default_keypair = Keypair::new(); let keypair_file = make_tmp_path("keypair_file"); write_keypair_file(&default_keypair, &keypair_file).unwrap(); - let default_signer = DefaultSigner { - path: keypair_file.clone(), - arg_name: "".to_string(), - }; + let default_signer = DefaultSigner::new(keypair_file.clone()); // defaults let buffer_pubkey = Pubkey::new_unique(); diff --git a/cli/src/stake.rs b/cli/src/stake.rs index 43927d8e33..d591e65492 100644 --- a/cli/src/stake.rs +++ b/cli/src/stake.rs @@ -2104,10 +2104,7 @@ mod tests { let default_keypair = Keypair::new(); let (default_keypair_file, mut tmp_file) = make_tmp_file(); write_keypair(&default_keypair, tmp_file.as_file_mut()).unwrap(); - let default_signer = DefaultSigner { - path: default_keypair_file.clone(), - arg_name: String::new(), - }; + let default_signer = DefaultSigner::new(default_keypair_file.clone()); let (keypair_file, mut tmp_file) = make_tmp_file(); let stake_account_keypair = Keypair::new(); write_keypair(&stake_account_keypair, tmp_file.as_file_mut()).unwrap(); diff --git a/cli/src/vote.rs b/cli/src/vote.rs index 18ffd1f37a..96e8e046e2 100644 --- a/cli/src/vote.rs +++ b/cli/src/vote.rs @@ -826,10 +826,7 @@ mod tests { let default_keypair = Keypair::new(); let (default_keypair_file, mut tmp_file) = make_tmp_file(); write_keypair(&default_keypair, tmp_file.as_file_mut()).unwrap(); - let default_signer = DefaultSigner { - path: default_keypair_file.clone(), - arg_name: String::new(), - }; + let default_signer = DefaultSigner::new(default_keypair_file.clone()); let test_authorize_voter = test_commands.clone().get_matches_from(vec![ "test",