quantus_cli/wallet/
password.rs

1use crate::{error::Result, log_print, log_verbose, wallet::WalletManager};
2use colored::Colorize;
3
4/// Get wallet password with convenience options
5pub fn get_wallet_password(
6	wallet_name: &str,
7	password: Option<String>,
8	password_file: Option<String>,
9) -> Result<String> {
10	// Option 1: Use CLI password flag if provided
11	if let Some(pwd) = password {
12		log_verbose!("🔑 Using password from --password flag");
13		return Ok(pwd);
14	}
15
16	// Option 2: Read password from file if provided
17	if let Some(file_path) = password_file {
18		log_verbose!("🔑 Reading password from file: {}", file_path);
19		let pwd = std::fs::read_to_string(&file_path)
20			.map_err(|e| {
21				crate::error::QuantusError::Generic(format!(
22					"Failed to read password file '{file_path}': {e}"
23				))
24			})?
25			.trim()
26			.to_string();
27		return Ok(pwd);
28	}
29
30	// Option 3: Check environment variable
31	if let Ok(env_password) = std::env::var("QUANTUS_WALLET_PASSWORD") {
32		log_verbose!("🔑 Using password from QUANTUS_WALLET_PASSWORD environment variable");
33		return Ok(env_password);
34	}
35
36	// Option 4: Check for wallet-specific environment variable
37	let wallet_env_var = format!("QUANTUS_WALLET_PASSWORD_{}", wallet_name.to_uppercase());
38	if let Ok(env_password) = std::env::var(&wallet_env_var) {
39		log_verbose!("🔑 Using password from {} environment variable", wallet_env_var);
40		return Ok(env_password);
41	}
42
43	// Option 5: Try empty password first (for development wallets)
44	log_verbose!("🔑 Trying empty password first...");
45	let wallet_manager = WalletManager::new()?;
46	if wallet_manager.load_wallet(wallet_name, "").is_ok() {
47		log_verbose!("✅ Empty password works for wallet '{}'", wallet_name);
48		return Ok("".to_string());
49	}
50
51	// Option 6: Prompt user for password
52	get_password_from_user(&format!("Enter password for wallet '{wallet_name}'"))
53}
54
55/// Get mnemonic phrase from user
56pub fn get_mnemonic_from_user() -> Result<String> {
57	log_print!("{}", "Please enter or paste your secret phrase:".bright_yellow());
58	let mnemonic = rpassword::read_password().map_err(|e| {
59		crate::error::QuantusError::Generic(format!("Failed to read secret phrase: {e}"))
60	})?;
61	Ok(mnemonic.trim().to_string())
62}
63
64/// Get password from user securely
65pub fn get_password_from_user(prompt: &str) -> Result<String> {
66	log_print!("{}", prompt.bright_yellow());
67	let password = rpassword::read_password().map_err(|e| {
68		crate::error::QuantusError::Generic(format!("Failed to read password: {e}"))
69	})?;
70	Ok(password)
71}