Skip to content
Snippets Groups Projects
Commit f1ff1004 authored by Hugo Trentesaux's avatar Hugo Trentesaux
Browse files

move into function

parent c70b26e8
No related branches found
No related tags found
1 merge request!22add vault
......@@ -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());
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment