rpawomaster 0.2.2

A secure password manager written in Rust
Documentation
use crate::configtool::*;
use crate::securecrypto::SecureCrypto;
use crate::pwsmanager::PasswordManager;
use crate::xotp::XOTP;

pub fn add_otp(
    name: String,
    user: Option<String>,
    vault: Option<String>,
    secret: String,
) -> Result<(), String> {
    let user = get_username(user)?;
    let core_password = prompt_core_password(user.clone())?;
    let config = load_config(&user, &core_password)?;
    let vault = select_vault(&config, vault)?;
    let mut vault_metadata = VaultMetadata::get_vaultmetadata(&vault.path).unwrap();
    let (private_key, public_key) = vault_metadata.get_keypair();
    let secure_crypto = SecureCrypto::from_pem_keys(&public_key, &private_key)
                                        .map_err(|e| format!("Failed to initialize crypto: {}", e))?;
    let otp = XOTP::from_text(&secret, &secure_crypto);
    let pw = PasswordManager::new(&vault.path)
                                                .map_err(|e| e.to_string())?;
    let uuid = pw.get_uuid(&name).map_err(|e| e.to_string())?;
    pw.add_otp(uuid, otp).map_err(|e| e.to_string())?;
    Ok(())
}

pub fn list_otps(
    user: Option<String>,
    vault: Option<String>,
) -> Result<(), String> {
    let user = get_username(user)?;
    let core_password = prompt_core_password(user.clone())?;
    let config = load_config(&user, &core_password)?;
    let vault = select_vault(&config, vault)?;
    let pw = PasswordManager::new(&vault.path)
                                                .map_err(|e| e.to_string())?;
    let otp_entries = pw.list_otp().map_err(|e| e.to_string())?;
    if otp_entries.is_empty() {
        println!("No OTP entries found.");
    } else {
        println!("OTP Entries (name | note | url):");
        for entry in otp_entries.clone() {
            let uuid = entry.id;
            let passentry = pw.get_password_entry(uuid).map_err(|e| e.to_string())?;
            println!("- {} | {} | {}", 
                    passentry.name, 
                    passentry.note.unwrap_or("-".to_string()), 
                    passentry.url.unwrap_or("-".to_string()));
        }
        println!("Total: {} entries", otp_entries.len());
    }
    Ok(())
}