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:
parent
f7b0184f81
commit
6cba53421e
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue