Reuse password option prompts again on a wrong password (#4380)

* Prompt for password if incorrect in import

* lint and fmt

* Use if instead of match

* Fix issue raised by @chong-he

* Merge branch 'unstable' into reuse-pw-break

* Remove unused function
This commit is contained in:
Pawan Dhananjay
2024-08-12 17:16:21 -07:00
committed by GitHub
parent 6dc614fede
commit 22ccdb6c23

View File

@@ -178,7 +178,13 @@ pub fn cli_run(matches: &ArgMatches, validator_dir: PathBuf) -> Result<(), Strin
let password_opt = loop { let password_opt = loop {
if let Some(password) = previous_password.clone() { if let Some(password) = previous_password.clone() {
eprintln!("Reuse previous password."); eprintln!("Reuse previous password.");
break Some(password); if check_password_on_keystore(&keystore, &password)? {
break Some(password);
} else {
eprintln!("Reused password incorrect. Retry!");
previous_password = None;
continue;
}
} }
eprintln!(); eprintln!();
eprintln!("{}", PASSWORD_PROMPT); eprintln!("{}", PASSWORD_PROMPT);
@@ -201,20 +207,12 @@ pub fn cli_run(matches: &ArgMatches, validator_dir: PathBuf) -> Result<(), Strin
} }
}; };
match keystore.decrypt_keypair(password.as_ref()) { // Check if the password unlocks the keystore
Ok(_) => { if check_password_on_keystore(&keystore, &password)? {
eprintln!("Password is correct."); if reuse_password {
eprintln!(); previous_password = Some(password.clone());
sleep(Duration::from_secs(1)); // Provides nicer UX.
if reuse_password {
previous_password = Some(password.clone());
}
break Some(password);
} }
Err(eth2_keystore::Error::InvalidPassword) => { break Some(password);
eprintln!("Invalid password");
}
Err(e) => return Err(format!("Error whilst decrypting keypair: {:?}", e)),
} }
}; };
@@ -317,3 +315,27 @@ pub fn cli_run(matches: &ArgMatches, validator_dir: PathBuf) -> Result<(), Strin
Ok(()) Ok(())
} }
/// Checks if the given password unlocks the keystore.
///
/// Returns `Ok(true)` if password unlocks the keystore successfully.
/// Returns `Ok(false` if password is incorrect.
/// Otherwise, returns the keystore error.
fn check_password_on_keystore(
keystore: &Keystore,
password: &ZeroizeString,
) -> Result<bool, String> {
match keystore.decrypt_keypair(password.as_ref()) {
Ok(_) => {
eprintln!("Password is correct.");
eprintln!();
sleep(Duration::from_secs(1)); // Provides nicer UX.
Ok(true)
}
Err(eth2_keystore::Error::InvalidPassword) => {
eprintln!("Invalid password");
Ok(false)
}
Err(e) => Err(format!("Error whilst decrypting keypair: {:?}", e)),
}
}