Fetch User Keys - simple tool for fetching SSH keys from various sources
1// SPDX-FileCopyrightText: 2024 Łukasz Niemier <#@hauleth.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5use crate::output::Output;
6use crate::sources::*;
7
8use rayon::prelude::*;
9use simple_eyre::eyre::Result;
10
11#[derive(Debug, serde::Deserialize)]
12pub struct Entry {
13 pub name: String,
14 pub keys: Box<[Source]>,
15}
16
17impl Entry {
18 pub fn fetch(self) -> Result<(String, Vec<ssh_key::PublicKey>)> {
19 let mut stream: Vec<ssh_key::PublicKey> = self
20 .keys
21 .par_iter()
22 .flat_map(|k| k.fetch().unwrap())
23 .collect();
24
25 // Deduplicate keys, no need for duplicated entries
26 stream.sort();
27 stream.dedup_by(|a, b| a.key_data() == b.key_data());
28
29 Ok((self.name.clone(), stream))
30 }
31}
32
33#[derive(Debug, serde::Deserialize)]
34pub struct Config {
35 #[serde(rename = "entry")]
36 pub entries: Box<[Entry]>,
37}
38
39impl Config {
40 pub fn fetch(self) -> Result<Output> {
41 self.entries.into_par_iter().map(Entry::fetch).collect()
42 }
43}