use anyhow::{Result, anyhow};
use clap::Args;
use pspp::crypto::EncryptedFile;
use std::{fs::File, path::PathBuf};
use zeroize::Zeroizing;
#[derive(Args, Clone, Debug)]
pub struct Decrypt {
input: PathBuf,
output: PathBuf,
#[clap(short, long)]
password: Option<String>,
}
impl Decrypt {
pub fn run(self) -> Result<()> {
let input = EncryptedFile::new(File::open(&self.input)?)?;
let password = match self.password {
Some(password) => Zeroizing::new(password),
None => {
eprintln!("Please enter the password for {}:", self.input.display());
readpass::from_tty().unwrap()
}
};
let mut reader = match input.unlock(password) {
Ok(reader) => reader,
Err(_) => return Err(anyhow!("Incorrect password.")),
};
let mut writer = File::create(self.output)?;
std::io::copy(&mut reader, &mut writer)?;
Ok(())
}
}