use log::*; use crate::{AccountManager, ManifestAccountLoadError}; use super::*; #[derive(Debug, Clone, Parser)] #[clap(about = "Decrypt all maFiles")] pub struct DecryptCommand; impl ManifestCommand for DecryptCommand where T: Transport, { fn execute(&self, _transport: T, manager: &mut AccountManager) -> anyhow::Result<()> { load_accounts_with_prompts(manager)?; #[cfg(feature = "keyring")] if let Some(keyring_id) = manager.keyring_id() { match crate::encryption::clear_passkey(keyring_id.clone()) { Ok(_) => { info!("Cleared passkey from keyring"); manager.clear_keyring_id(); } Err(e) => warn!("Failed to clear passkey from keyring: {}", e), } } 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(); let passkey = passkey.map(SecretString::new); manager.submit_passkey(passkey); } Err(e) => { error!("Could not load accounts: {}", e); return Err(e.into()); } } } }