use std::fs;
use std::path::Path;
use std::path::PathBuf;
use rand::Rng;
use rand::RngExt;
use rand::distr::Alphabetic;
use rand::distr::Alphanumeric;
use rand::rngs::ThreadRng;
use serde::Deserialize;
use serde::Serialize;
use ssh_key::PrivateKey;
use ssh_key::rand_core::OsRng;
pub mod credentials;
pub struct Secrets {
pub pass: Option<String>,
key: PrivateKey,
pub fname: String,
}
impl Secrets {
pub fn gen_key(password: Option<String>) -> PrivateKey {
let generated = PrivateKey::random(&mut OsRng, ssh_key::Algorithm::Ed25519).unwrap();
let pass;
if password.is_none() {
pass = String::new();
} else {
pass = password.unwrap();
}
let encrypted = generated.encrypt(&mut OsRng, pass).unwrap();
encrypted
}
pub fn gen_name() -> String {
let length = 20;
rand::rng()
.sample_iter(&Alphanumeric)
.take(length)
.map(char::from)
.collect()
}
pub fn generate(pass: Option<String>) -> Self {
let encyrpted_key = Secrets::gen_key(pass.clone());
let fname = Secrets::gen_name();
Self {
pass: pass,
key: encyrpted_key,
fname: fname,
}
}
pub fn write_openssh_to_file(&self, priv_path: PathBuf) {
let path = priv_path.join(self.fname.clone());
self.key
.write_openssh_file(path.as_path(), ssh_key::LineEnding::LF)
.unwrap();
}
pub fn get_pass(pass: String) -> Option<String> {
if pass.is_empty() {
return None;
} else {
return Some(pass);
}
}
}