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