Disallow bad combination of arguments in keygen grind (#17251)

* Use constant for outfile sentinel value

* Require --use-mnemonic flag when --no-outfile flag passed to keygen grind
This commit is contained in:
steviez 2021-05-18 10:35:07 -05:00 committed by GitHub
parent f7b0184f81
commit 6cba53421e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 6 deletions

View File

@ -17,6 +17,9 @@ use {
std::{str::FromStr, sync::Arc}, std::{str::FromStr, sync::Arc},
}; };
// Sentinel value used to indicate to write to screen instead of file
pub const STDOUT_OUTFILE_TOKEN: &str = "-";
// Return parsed values from matches at `name` // Return parsed values from matches at `name`
pub fn values_of<T>(matches: &ArgMatches<'_>, name: &str) -> Option<Vec<T>> pub fn values_of<T>(matches: &ArgMatches<'_>, name: &str) -> Option<Vec<T>>
where where

View File

@ -1,6 +1,6 @@
use { use {
crate::{ crate::{
input_parsers::pubkeys_sigs_of, input_parsers::{pubkeys_sigs_of, STDOUT_OUTFILE_TOKEN},
offline::{SIGNER_ARG, SIGN_ONLY_ARG}, offline::{SIGNER_ARG, SIGN_ONLY_ARG},
ArgConstant, ArgConstant,
}, },
@ -235,7 +235,7 @@ pub(crate) fn parse_signer_source<S: AsRef<str>>(
} }
} else { } else {
match source { match source {
"-" => Ok(SignerSource::new(SignerSourceKind::Stdin)), STDOUT_OUTFILE_TOKEN => Ok(SignerSource::new(SignerSourceKind::Stdin)),
ASK_KEYWORD => Ok(SignerSource::new_legacy(SignerSourceKind::Prompt)), ASK_KEYWORD => Ok(SignerSource::new_legacy(SignerSourceKind::Prompt)),
_ => match Pubkey::from_str(source) { _ => match Pubkey::from_str(source) {
Ok(pubkey) => Ok(SignerSource::new(SignerSourceKind::Pubkey(pubkey))), Ok(pubkey) => Ok(SignerSource::new(SignerSourceKind::Pubkey(pubkey))),
@ -632,7 +632,7 @@ mod tests {
#[test] #[test]
fn test_parse_signer_source() { fn test_parse_signer_source() {
assert!(matches!( assert!(matches!(
parse_signer_source("-").unwrap(), parse_signer_source(STDOUT_OUTFILE_TOKEN).unwrap(),
SignerSource { SignerSource {
kind: SignerSourceKind::Stdin, kind: SignerSourceKind::Stdin,
derivation_path: None, derivation_path: None,

View File

@ -5,6 +5,7 @@ use clap::{
Arg, ArgMatches, SubCommand, Arg, ArgMatches, SubCommand,
}; };
use solana_clap_utils::{ use solana_clap_utils::{
input_parsers::STDOUT_OUTFILE_TOKEN,
input_validators::{is_parsable, is_prompt_signer_source}, input_validators::{is_parsable, is_prompt_signer_source},
keypair::{ keypair::{
keypair_from_path, keypair_from_seed_phrase, prompt_passphrase, signer_from_path, keypair_from_path, keypair_from_seed_phrase, prompt_passphrase, signer_from_path,
@ -105,6 +106,9 @@ fn no_outfile_arg<'a, 'b>() -> Arg<'a, 'b> {
Arg::with_name(NO_OUTFILE_ARG.name) Arg::with_name(NO_OUTFILE_ARG.name)
.long(NO_OUTFILE_ARG.long) .long(NO_OUTFILE_ARG.long)
.conflicts_with_all(&["outfile", "silent"]) .conflicts_with_all(&["outfile", "silent"])
// Require a seed phrase to avoid generating a keypair
// but having no way to get the private key
.requires("use_mnemonic")
.help(NO_OUTFILE_ARG.help) .help(NO_OUTFILE_ARG.help)
} }
@ -151,7 +155,7 @@ fn output_keypair(
outfile: &str, outfile: &str,
source: &str, source: &str,
) -> Result<(), Box<dyn error::Error>> { ) -> Result<(), Box<dyn error::Error>> {
if outfile == "-" { if outfile == STDOUT_OUTFILE_TOKEN {
let mut stdout = std::io::stdout(); let mut stdout = std::io::stdout();
write_keypair(&keypair, &mut stdout)?; write_keypair(&keypair, &mut stdout)?;
} else { } else {
@ -550,7 +554,7 @@ fn do_main(matches: &ArgMatches<'_>) -> Result<(), Box<dyn error::Error>> {
}; };
match outfile { match outfile {
Some("-") => (), Some(STDOUT_OUTFILE_TOKEN) => (),
Some(outfile) => check_for_overwrite(&outfile, &matches), Some(outfile) => check_for_overwrite(&outfile, &matches),
None => (), None => (),
} }
@ -592,7 +596,7 @@ fn do_main(matches: &ArgMatches<'_>) -> Result<(), Box<dyn error::Error>> {
path.to_str().unwrap() path.to_str().unwrap()
}; };
if outfile != "-" { if outfile != STDOUT_OUTFILE_TOKEN {
check_for_overwrite(&outfile, &matches); check_for_overwrite(&outfile, &matches);
} }