rpawomaster 0.2.2

A secure password manager written in Rust
Documentation
use crate::configtool::*;
use crate::securecrypto::SecureCrypto;
use crate::securecrypto::decrypt_private_key;
use std::path::Path;
use tempfile::tempdir;

pub fn export_vault(
    user: String,
    path: Option<String>,
    vault: Option<String>,
) -> Result<(), String> {
    let output_dir = match path {
        Some(p) => p,
        None => std::env::current_dir()
            .map(|dir| dir.to_string_lossy().into_owned())
            .unwrap_or_else(|_| ".".to_string()),
    };

    let core_password = prompt_core_password(user.clone())?;
    let username = get_username(Some(user.clone()))?.clone();
    let config = load_config(&username, &core_password)?;
    let vaults = config.vaults.clone();
    let select_vaults = if vault.is_some() {
        let vault_name = vault.unwrap();
        let vault = vaults.iter().find(|v| v.name == vault_name)
                                    .ok_or_else(|| format!("未找到指定的Vault: {}", vault_name))?;
        vec![vault.clone()]
    } else {
        vaults
    };
    
    let private_key = decrypt_private_key(&config.encrypted_private_key, &core_password)?;
    let crypto = SecureCrypto::from_pem_keys(&config.public_key, &private_key)
        .map_err(|e| format!("Failed to initialize crypto: {}", e))?;

    let export_dir = Path::new(&output_dir);
    if !export_dir.exists() {
        std::fs::create_dir_all(&export_dir)
            .map_err(|e| format!("创建导出目录失败: {}", e))?;
    }

    let export_filename = format!("{}.tgz", user);
    let export_path = export_dir.join(export_filename);

    let temp_dir = tempdir().map_err(|e| format!("创建临时文件夹失败: {}", e))?;
    let temp_path = temp_dir.path();
    for vault in &select_vaults {
        let src_path = Path::new(&vault.path);
        crypto.encrypt_path(src_path, temp_path)
                .map_err(|e| format!("加密Vault文件失败: {}", e))?;
    }
    let config_file_path = get_config_dir()?.join(format!("{}.json", user));
    let dest_config_path = temp_path.join(format!("{}.json", user));
    std::fs::copy(config_file_path, dest_config_path).map_err(|e| format!("复制配置文件失败: {}", e))?;

    crypto.create_tar_archive(
        temp_path,
        &export_path,
    ).map_err(|e| format!("创建加密归档失败: {}", e))?;

    println!("成功导出用户 '{}' 的数据到: {}", user, export_path.display());
    Ok(())
}