From f1ff1004dbdcddaadb4ad0d2974ffcb0837875e1 Mon Sep 17 00:00:00 2001 From: Hugo Trentesaux <hugo@trentesaux.fr> Date: Fri, 16 Feb 2024 17:33:31 +0100 Subject: [PATCH] move into function --- src/commands/vault.rs | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/commands/vault.rs b/src/commands/vault.rs index d8e0bc0..14c3766 100644 --- a/src/commands/vault.rs +++ b/src/commands/vault.rs @@ -10,7 +10,7 @@ pub enum Subcommand { List, /// Show where vault stores secret Where, - /// Generate new key (unimplemented) + /// Generate a mnemonic Generate, /// Import mnemonic with interactive prompt Import, @@ -58,33 +58,38 @@ pub fn handle_command(data: Data, command: Subcommand) -> Result<(), GcliError> println!("{}", data.project_dir.data_dir().to_str().unwrap()); } Subcommand::Generate => { - let mnemonic = bip39::Mnemonic::generate(12).unwrap(); // TODO allow word count + // TODO allow custom word count + let mnemonic = bip39::Mnemonic::generate(12).unwrap(); println!("{mnemonic}"); } Subcommand::Import => { - // --- currently only support mnemonic secret - // get secret - let secret = rpassword::prompt_password("Mnemonic: ")?; - // check validity by deriving keypair - let keypair = pair_from_str(&secret)?; - // ask password to protect key + let mnemonic = rpassword::prompt_password("Mnemonic: ")?; + println!("Enter password to protect the key"); let password = rpassword::prompt_password("Password: ")?; - // write encrypted secret in file identitfied by pubkey - let path = data - .project_dir - .data_dir() - .join(keypair.public().to_string()); - let mut file = std::fs::OpenOptions::new() - .create(true) - .write(true) - .open(path)?; - file.write_all(&encrypt(secret.as_bytes(), password).map_err(|e| anyhow!(e))?[..])?; + let address = store_mnemonic(&data, &mnemonic, password)?; + println!("Stored secret for {address}"); } }; Ok(()) } +/// store mnemonic protected with password +pub fn store_mnemonic( + data: &Data, + mnemonic: &str, + password: String, +) -> Result<AccountId, GcliError> { + // check validity by deriving keypair + let keypair = pair_from_str(&mnemonic)?; + let address = keypair.public(); + // write encrypted mnemonic in file identified by pubkey + let path = data.project_dir.data_dir().join(address.to_string()); + let mut file = std::fs::File::create(path)?; + file.write_all(&encrypt(mnemonic.as_bytes(), password).map_err(|e| anyhow!(e))?[..])?; + Ok(keypair.public().into()) +} + /// try get secret in keystore pub fn try_fetch_secret(data: &Data, address: AccountId) -> Result<Option<String>, GcliError> { let path = data.project_dir.data_dir().join(address.to_string()); -- GitLab