2023-06-23 13:36:23 -04:00
|
|
|
use log::*;
|
|
|
|
|
|
|
|
use crate::{AccountManager, ManifestAccountLoadError};
|
|
|
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, Parser)]
|
|
|
|
#[clap(about = "Decrypt all maFiles")]
|
|
|
|
pub struct DecryptCommand;
|
|
|
|
|
2023-07-02 08:57:13 -04:00
|
|
|
impl<T> ManifestCommand<T> for DecryptCommand
|
|
|
|
where
|
|
|
|
T: Transport,
|
|
|
|
{
|
|
|
|
fn execute(&self, _transport: T, manager: &mut AccountManager) -> anyhow::Result<()> {
|
2023-06-23 13:36:23 -04:00
|
|
|
load_accounts_with_prompts(manager)?;
|
|
|
|
for mut entry in manager.iter_mut() {
|
|
|
|
entry.encryption = None;
|
|
|
|
}
|
|
|
|
manager.submit_passkey(None);
|
|
|
|
manager.save()?;
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn load_accounts_with_prompts(manager: &mut AccountManager) -> anyhow::Result<()> {
|
|
|
|
loop {
|
|
|
|
match manager.load_accounts() {
|
|
|
|
Ok(_) => return Ok(()),
|
|
|
|
Err(
|
|
|
|
ManifestAccountLoadError::MissingPasskey
|
|
|
|
| ManifestAccountLoadError::IncorrectPasskey,
|
|
|
|
) => {
|
|
|
|
if manager.has_passkey() {
|
|
|
|
error!("Incorrect passkey");
|
|
|
|
}
|
|
|
|
let passkey = rpassword::prompt_password_stdout("Enter encryption passkey: ").ok();
|
2023-06-25 20:23:26 -04:00
|
|
|
let passkey = passkey.map(SecretString::new);
|
2023-06-23 13:36:23 -04:00
|
|
|
manager.submit_passkey(passkey);
|
|
|
|
}
|
|
|
|
Err(e) => {
|
|
|
|
error!("Could not load accounts: {}", e);
|
|
|
|
return Err(e.into());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|