Skip to main content

ssh_vault/cli/actions/
fingerprint.rs

1use crate::cli::actions::Action;
2use crate::vault::{fingerprint, remote};
3use anyhow::Result;
4
5/// Handle the fingerprint action.
6///
7/// # Errors
8///
9/// Returns an error if local or remote key lookup fails.
10pub fn handle(action: Action) -> Result<()> {
11    match action {
12        Action::Fingerprint { key, user } => match (key, user) {
13            (Some(key), None) => {
14                let fingerprint = fingerprint::fingerprint(&key)?;
15                println!("{fingerprint}");
16            }
17            (None, Some(user)) => {
18                let keys = remote::get_keys(&user)?;
19                let fingerprints = fingerprint::get_remote_fingerprints(&keys, None)?;
20
21                let max_key_length = fingerprints
22                    .iter()
23                    .map(|f| f.key.len())
24                    .max()
25                    .unwrap_or_default();
26
27                for fingerprint in &fingerprints {
28                    println!("{fingerprint:max_key_length$}");
29                }
30            }
31            (Some(key), Some(user)) => {
32                let key_number: Result<u32, _> = key.parse();
33                let keys = remote::get_keys(&user)?;
34
35                match key_number {
36                    Ok(key) => {
37                        let fingerprints = fingerprint::get_remote_fingerprints(&keys, Some(key))?;
38
39                        let max_key_length = fingerprints
40                            .iter()
41                            .map(|f| f.key.len())
42                            .max()
43                            .unwrap_or_default();
44
45                        for fingerprint in &fingerprints {
46                            println!("{fingerprint:max_key_length$}");
47                        }
48                    }
49                    Err(_) => {
50                        eprintln!("When using -u, [-k N] must be a numeric key index.");
51                    }
52                }
53            }
54            (None, None) => {
55                let fingerprints = fingerprint::fingerprints()?;
56
57                let max_key_length = fingerprints
58                    .iter()
59                    .map(|f| f.key.len())
60                    .max()
61                    .unwrap_or_default();
62
63                for fingerprint in &fingerprints {
64                    println!("{fingerprint:max_key_length$}");
65                }
66            }
67        },
68        _ => unreachable!(),
69    }
70    Ok(())
71}