mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-02 16:21:42 +00:00
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:
@@ -178,7 +178,13 @@ pub fn cli_run(matches: &ArgMatches, validator_dir: PathBuf) -> Result<(), Strin
|
||||
let password_opt = loop {
|
||||
if let Some(password) = previous_password.clone() {
|
||||
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!("{}", PASSWORD_PROMPT);
|
||||
@@ -201,20 +207,12 @@ pub fn cli_run(matches: &ArgMatches, validator_dir: PathBuf) -> Result<(), Strin
|
||||
}
|
||||
};
|
||||
|
||||
match keystore.decrypt_keypair(password.as_ref()) {
|
||||
Ok(_) => {
|
||||
eprintln!("Password is correct.");
|
||||
eprintln!();
|
||||
sleep(Duration::from_secs(1)); // Provides nicer UX.
|
||||
if reuse_password {
|
||||
previous_password = Some(password.clone());
|
||||
}
|
||||
break Some(password);
|
||||
// Check if the password unlocks the keystore
|
||||
if check_password_on_keystore(&keystore, &password)? {
|
||||
if reuse_password {
|
||||
previous_password = Some(password.clone());
|
||||
}
|
||||
Err(eth2_keystore::Error::InvalidPassword) => {
|
||||
eprintln!("Invalid password");
|
||||
}
|
||||
Err(e) => return Err(format!("Error whilst decrypting keypair: {:?}", e)),
|
||||
break Some(password);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -317,3 +315,27 @@ pub fn cli_run(matches: &ArgMatches, validator_dir: PathBuf) -> Result<(), Strin
|
||||
|
||||
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)),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user