use anyhow::Context;
use auths_core::error::AgentError;
use auths_core::signing::PassphraseProvider;
use zeroize::Zeroizing;
#[derive(Debug, Clone, Default)]
pub struct CliPassphraseProvider;
impl CliPassphraseProvider {
pub fn new() -> Self {
Self
}
}
impl PassphraseProvider for CliPassphraseProvider {
fn get_passphrase(&self, prompt_message: &str) -> Result<Zeroizing<String>, AgentError> {
eprintln!("{}", prompt_message);
let password = rpassword::prompt_password("Enter passphrase: ")
.context("Failed to read passphrase from terminal") .map_err(|e| {
eprintln!("Error reading passphrase: {:?}", e); if let Some(io_err) = e.downcast_ref::<std::io::Error>() {
AgentError::IO(std::io::Error::new(io_err.kind(), format!("{}", e))) } else {
AgentError::SecurityError(format!("Failed to get passphrase: {}", e)) }
})?;
Ok(Zeroizing::new(password))
}
}
pub struct PrefilledPassphraseProvider {
passphrase: Zeroizing<String>,
}
impl PrefilledPassphraseProvider {
pub fn new(passphrase: Zeroizing<String>) -> Self {
Self { passphrase }
}
}
impl PassphraseProvider for PrefilledPassphraseProvider {
fn get_passphrase(&self, _prompt_message: &str) -> Result<Zeroizing<String>, AgentError> {
Ok(self.passphrase.clone())
}
}