Skip to main content

auths_cli/adapters/
ssh_agent.rs

1//! CLI adapter for system SSH agent key registration via `ssh-add`.
2
3use auths_core::ports::ssh_agent::{SshAgentError, SshAgentPort};
4use std::path::Path;
5use std::process::Command;
6
7/// Registers keys with the macOS system SSH agent using `ssh-add`.
8///
9/// Usage:
10/// ```ignore
11/// let adapter = MacOsSshAgentAdapter;
12/// adapter.register_key(Path::new("/tmp/auths-key-abc.pem"))?;
13/// ```
14pub struct MacOsSshAgentAdapter;
15
16impl SshAgentPort for MacOsSshAgentAdapter {
17    fn register_key(&self, key_path: &Path) -> Result<(), SshAgentError> {
18        let output = Command::new("ssh-add")
19            .arg(key_path)
20            .output()
21            .map_err(|e| SshAgentError::IoError(e.to_string()))?;
22
23        if output.status.success() {
24            return Ok(());
25        }
26
27        let stderr = String::from_utf8_lossy(&output.stderr).to_lowercase();
28        if stderr.contains("could not open a connection")
29            || stderr.contains("connection refused")
30            || stderr.contains("communication with agent failed")
31        {
32            Err(SshAgentError::NotAvailable(
33                String::from_utf8_lossy(&output.stderr).trim().to_string(),
34            ))
35        } else {
36            Err(SshAgentError::CommandFailed(
37                String::from_utf8_lossy(&output.stderr).trim().to_string(),
38            ))
39        }
40    }
41}