Prevent passphrase mistakes with confirmation prompt (#7207)

This commit is contained in:
Justin Starry 2019-12-02 22:42:42 -05:00 committed by GitHub
parent a35087a5ed
commit b874441a47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 5 deletions

View File

@ -41,6 +41,18 @@ impl KeypairWithSource {
}
}
/// Prompts user for a passphrase and then asks for confirmirmation to check for mistakes
pub fn prompt_passphrase(prompt: &str) -> Result<String, Box<dyn error::Error>> {
let passphrase = prompt_password_stderr(&prompt)?;
if !passphrase.is_empty() {
let confirmed = rpassword::prompt_password_stderr("Enter same passphrase again: ")?;
if confirmed != passphrase {
return Err("Passphrases did not match".into());
}
}
Ok(passphrase)
}
/// Reads user input from stdin to retrieve a seed phrase and passphrase for keypair derivation
pub fn keypair_from_seed_phrase(
keypair_name: &str,
@ -54,11 +66,11 @@ pub fn keypair_from_seed_phrase(
);
if skip_validation {
let passphrase = prompt_password_stderr(&passphrase_prompt)?;
let passphrase = prompt_passphrase(&passphrase_prompt)?;
keypair_from_seed_phrase_and_passphrase(&seed_phrase, &passphrase)
} else {
let mnemonic = Mnemonic::from_phrase(seed_phrase, Language::English)?;
let passphrase = prompt_password_stderr(&passphrase_prompt)?;
let passphrase = prompt_passphrase(&passphrase_prompt)?;
let seed = Seed::new(&mnemonic, &passphrase);
keypair_from_seed(seed.as_bytes())
}

View File

@ -5,7 +5,7 @@ use clap::{
};
use num_cpus;
use solana_clap_utils::keypair::{
keypair_from_seed_phrase, ASK_KEYWORD, SKIP_SEED_PHRASE_VALIDATION_ARG,
keypair_from_seed_phrase, prompt_passphrase, ASK_KEYWORD, SKIP_SEED_PHRASE_VALIDATION_ARG,
};
use solana_sdk::{
pubkey::write_pubkey_file,
@ -236,8 +236,8 @@ fn main() -> Result<(), Box<dyn error::Error>> {
NO_PASSPHRASE.to_string()
} else {
eprintln!("Generating a new keypair");
rpassword::prompt_password_stderr(
"For added security, enter a passphrase (empty for no passphrase):",
prompt_passphrase(
"For added security, enter a passphrase (empty for no passphrase): ",
)?
};
let seed = Seed::new(&mnemonic, &passphrase);