use crate::cli::actions::{process_input, Action};
use crate::vault::{crypto, dio, find, parse, ssh::decrypt_private_key, SshVault};
use anyhow::Result;
use secrecy::Secret;
use std::io::{Read, Write};
pub fn handle(action: Action) -> Result<()> {
match action {
Action::Edit {
key,
vault,
passphrase,
} => {
let mut vault_data = String::new();
let (mut input, mut output) = dio::setup_io(Some(vault.clone()), Some(vault))?;
input.read_to_string(&mut vault_data)?;
let (key_type, fingerprint, password, data) = parse(&vault_data)?;
let mut private_key = find::private_key_type(key, key_type)?;
if private_key.is_encrypted() {
private_key = decrypt_private_key(&private_key, passphrase)?;
}
let key_type = find::key_type(&private_key.algorithm())?;
let vault = SshVault::new(&key_type, None, Some(private_key))?;
let secret = vault.view(&password, &data, &fingerprint)?;
let mut new_secret = Vec::new();
process_input(&mut new_secret, Some(Secret::new(secret)))?;
let password: Secret<[u8; 32]> = crypto::gen_password()?;
let out = vault.create(password, &mut new_secret)?;
output.truncate()?;
output.write_all(out.as_bytes())?;
}
_ => unreachable!(),
}
Ok(())
}