fetchlib 0.0.13

A lib for remote server connection through ssh
Documentation
use rand::RngExt;
use rand::distr::Alphanumeric;
use ssh_key::PrivateKey;
use ssh_key::rand_core::OsRng;
use std::path::PathBuf;

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() {
            String::new()
        } else {
            password.unwrap()
        };
        generated.encrypt(&mut OsRng, pass).unwrap()
    }

    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() { None } else { Some(pass) }
    }
}