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}