From ec4745d174fbdf6aaa5fccacb37f7ba30c191cba Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Thu, 2 Apr 2020 15:47:17 -0600 Subject: [PATCH] Tame overeager wallet manager (#9262) * Add helper fn to check for usb cli args * Use helper fn to prevent wallet_manager connecting unnecessarily * Review improvements --- clap-utils/src/keypair.rs | 23 +++++++++++++++++++++++ cli/src/main.rs | 18 ++++++++++++++---- keygen/src/keygen.rs | 8 ++++++-- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/clap-utils/src/keypair.rs b/clap-utils/src/keypair.rs index 40fd5f2e01..9015d57016 100644 --- a/clap-utils/src/keypair.rs +++ b/clap-utils/src/keypair.rs @@ -47,6 +47,13 @@ pub fn parse_keypair_path(path: &str) -> KeypairUrl { } } +pub fn check_for_usb(mut items: impl Iterator) -> bool +where + S: Into, +{ + items.any(|arg| matches!(parse_keypair_path(&arg.into()), KeypairUrl::Usb(_))) +} + pub fn presigner_from_pubkey_sigs( pubkey: &Pubkey, signers: &[(Pubkey, Signature)], @@ -256,4 +263,20 @@ mod tests { sanitize_seed_phrase(seed_phrase) ); } + + #[test] + fn test_check_for_usb() { + let args: Vec<&str> = vec![]; + assert_eq!(check_for_usb(args.into_iter()), false); + let args = vec!["usb://"]; + assert_eq!(check_for_usb(args.into_iter()), true); + let args = vec!["other"]; + assert_eq!(check_for_usb(args.into_iter()), false); + let args = vec!["other", "usb://", "another"]; + assert_eq!(check_for_usb(args.into_iter()), true); + let args = vec!["other", "another"]; + assert_eq!(check_for_usb(args.into_iter()), false); + let args = vec!["usb://", "usb://"]; + assert_eq!(check_for_usb(args.into_iter()), true); + } } diff --git a/cli/src/main.rs b/cli/src/main.rs index fa9baf1ae9..b7be555357 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -2,7 +2,9 @@ use clap::{crate_description, crate_name, AppSettings, Arg, ArgGroup, ArgMatches use console::style; use solana_clap_utils::{ - input_validators::is_url, keypair::SKIP_SEED_PHRASE_VALIDATION_ARG, offline::SIGN_ONLY_ARG, + input_validators::is_url, + keypair::{check_for_usb, SKIP_SEED_PHRASE_VALIDATION_ARG}, + offline::SIGN_ONLY_ARG, DisplayError, }; use solana_cli::{ @@ -233,12 +235,20 @@ fn main() -> Result<(), Box> { ) .get_matches(); - do_main(&matches).map_err(|err| DisplayError::new_as_boxed(err).into()) + do_main(&matches, check_for_usb(std::env::args())) + .map_err(|err| DisplayError::new_as_boxed(err).into()) } -fn do_main(matches: &ArgMatches<'_>) -> Result<(), Box> { +fn do_main( + matches: &ArgMatches<'_>, + need_wallet_manager: bool, +) -> Result<(), Box> { if parse_settings(&matches)? { - let wallet_manager = maybe_wallet_manager()?; + let wallet_manager = if need_wallet_manager { + maybe_wallet_manager()? + } else { + None + }; let (mut config, signers) = parse_args(&matches, wallet_manager)?; config.signers = signers.iter().map(|s| s.as_ref()).collect(); diff --git a/keygen/src/keygen.rs b/keygen/src/keygen.rs index d8302f0692..233891212d 100644 --- a/keygen/src/keygen.rs +++ b/keygen/src/keygen.rs @@ -8,7 +8,7 @@ use num_cpus; use solana_clap_utils::{ input_validators::is_derivation, keypair::{ - keypair_from_seed_phrase, prompt_passphrase, signer_from_path, + check_for_usb, keypair_from_seed_phrase, prompt_passphrase, signer_from_path, SKIP_SEED_PHRASE_VALIDATION_ARG, }, DisplayError, @@ -407,7 +407,11 @@ fn do_main(matches: &ArgMatches<'_>) -> Result<(), Box> { Config::default() }; - let wallet_manager = maybe_wallet_manager()?; + let wallet_manager = if check_for_usb(std::env::args()) { + maybe_wallet_manager()? + } else { + None + }; match matches.subcommand() { ("pubkey", Some(matches)) => {