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::*;
9
10#[derive(Debug, serde::Deserialize)]
11pub struct Entry {
12 pub name: String,
13 pub keys: Box<[Box<Source>]>,
14}
15
16impl Entry {
17 pub fn fetch(&self) -> (String, Vec<ssh_key::PublicKey>) {
18 let mut stream: Vec<_> = self.keys
19 .par_iter()
20 .map(|k| k.fetch())
21 .flatten()
22 .collect();
23
24 // Deduplicate keys, no need for duplicated entries
25 stream.sort();
26 stream.dedup_by(|a, b| {
27 a.key_data() == b.key_data()
28 });
29
30 (self.name.clone(), stream)
31 }
32}
33
34#[derive(Debug, serde::Deserialize)]
35pub struct Config {
36 #[serde(rename = "entry")]
37 pub entries: Box<[Entry]>,
38}
39
40impl Config {
41 pub fn fetch(&self) -> Result<Output, ()> {
42 let keys = self.entries
43 .par_iter()
44 .map(Entry::fetch)
45 .collect();
46
47 Ok(Output { keys })
48 }
49}