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
This commit is part of merge request !22. Comments created here will be created in the context of that merge request.
...@@ -10,7 +10,7 @@ pub enum Subcommand { ...@@ -10,7 +10,7 @@ pub enum Subcommand {
List, List,
/// Show where vault stores secret /// Show where vault stores secret
Where, Where,
/// Generate new key (unimplemented) /// Generate a mnemonic
Generate, Generate,
/// Import mnemonic with interactive prompt /// Import mnemonic with interactive prompt
Import, Import,
...@@ -58,33 +58,38 @@ pub fn handle_command(data: Data, command: Subcommand) -> Result<(), GcliError> ...@@ -58,33 +58,38 @@ pub fn handle_command(data: Data, command: Subcommand) -> Result<(), GcliError>
println!("{}", data.project_dir.data_dir().to_str().unwrap()); println!("{}", data.project_dir.data_dir().to_str().unwrap());
} }
Subcommand::Generate => { 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}"); println!("{mnemonic}");
} }
Subcommand::Import => { Subcommand::Import => {
// --- currently only support mnemonic secret let mnemonic = rpassword::prompt_password("Mnemonic: ")?;
// get secret println!("Enter password to protect the key");
let secret = rpassword::prompt_password("Mnemonic: ")?;
// check validity by deriving keypair
let keypair = pair_from_str(&secret)?;
// ask password to protect key
let password = rpassword::prompt_password("Password: ")?; let password = rpassword::prompt_password("Password: ")?;
// write encrypted secret in file identitfied by pubkey let address = store_mnemonic(&data, &mnemonic, password)?;
let path = data println!("Stored secret for {address}");
.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))?[..])?;
} }
}; };
Ok(()) 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 /// try get secret in keystore
pub fn try_fetch_secret(data: &Data, address: AccountId) -> Result<Option<String>, GcliError> { pub fn try_fetch_secret(data: &Data, address: AccountId) -> Result<Option<String>, GcliError> {
let path = data.project_dir.data_dir().join(address.to_string()); 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