Allow to set validator password via reimport (#2868)

## Issue Addressed

Resolves #2854 

## Proposed Changes

If validator was imported first without entering password and then imported again with valid password update the password in validator_definitions.yml

## Additional Info

There can be other cases for updating existing validator during import. They are not covered here.

Co-authored-by: Michael Sproul <micsproul@gmail.com>
This commit is contained in:
eklm
2021-12-21 08:23:18 +00:00
parent 3b61ac9cbf
commit 60d917d9e9
2 changed files with 149 additions and 4 deletions

View File

@@ -1,4 +1,5 @@
use crate::wallet::create::{PASSWORD_FLAG, STDIN_INPUTS_FLAG};
use account_utils::validator_definitions::SigningDefinition;
use account_utils::{
eth2_keystore::Keystore,
read_password_from_user,
@@ -208,10 +209,35 @@ pub fn cli_run(matches: &ArgMatches, validator_dir: PathBuf) -> Result<(), Strin
}
};
let voting_pubkey = keystore
.public_key()
.ok_or_else(|| format!("Keystore public key is invalid: {}", keystore.pubkey()))?;
// The keystore is placed in a directory that matches the name of the public key. This
// provides some loose protection against adding the same keystore twice.
let dest_dir = validator_dir.join(format!("0x{}", keystore.pubkey()));
if dest_dir.exists() {
// Check if we should update password for existing validator in case if it was provided via reimport: #2854
let old_validator_def_opt = defs
.as_mut_slice()
.iter_mut()
.find(|def| def.voting_public_key == voting_pubkey);
if let Some(ValidatorDefinition {
signing_definition:
SigningDefinition::LocalKeystore {
voting_keystore_password: ref mut old_passwd,
..
},
..
}) = old_validator_def_opt
{
if old_passwd.is_none() && password_opt.is_some() {
*old_passwd = password_opt;
defs.save(&validator_dir)
.map_err(|e| format!("Unable to save {}: {:?}", CONFIG_FILENAME, e))?;
eprintln!("Password updated for public key {}", voting_pubkey);
}
}
eprintln!(
"Skipping import of keystore for existing public key: {:?}",
src_keystore
@@ -234,9 +260,6 @@ pub fn cli_run(matches: &ArgMatches, validator_dir: PathBuf) -> Result<(), Strin
.map_err(|e| format!("Unable to copy keystore: {:?}", e))?;
// Register with slashing protection.
let voting_pubkey = keystore
.public_key()
.ok_or_else(|| format!("Keystore public key is invalid: {}", keystore.pubkey()))?;
slashing_protection
.register_validator(voting_pubkey.compress())
.map_err(|e| {