use dirs_next::config_dir;
use rpassword::read_password;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::fs::{self, File, OpenOptions};
use std::io::{self, BufReader, BufWriter, Write};
use std::path::PathBuf;
#[derive(Serialize, Deserialize)]
pub struct Credentials {
pub username: String,
pub password: String,
}
type CredentialsMap = HashMap<String, Credentials>;
fn get_credentials_file_path() -> PathBuf {
let config_dir = config_dir().expect("Failed to get config directory");
let llogin_dir = config_dir.join("llogin");
if !llogin_dir.exists() {
fs::create_dir_all(&llogin_dir).expect("Failed to create llogin directory");
}
llogin_dir.join("credentials.json")
}
pub fn read_credentials() -> CredentialsMap {
let path = get_credentials_file_path();
if path.exists() {
let file = File::open(path).expect("Failed to open credentials file");
let reader = BufReader::new(file);
serde_json::from_reader(reader).expect("Failed to read credentials")
} else {
HashMap::new()
}
}
fn write_credentials(credentials: &CredentialsMap) {
let path = get_credentials_file_path();
let file = OpenOptions::new()
.write(true)
.create(true)
.truncate(true)
.open(path)
.expect("Failed to open credentials file");
let writer = BufWriter::new(file);
serde_json::to_writer(writer, credentials).expect("Failed to write credentials");
}
pub fn store_lpu_credentials() {
print!("Enter a unique identifier for this account: ");
io::stdout().flush().unwrap();
let account_id = prompt_for_account_id();
let mut credentials = read_credentials();
if credentials.contains_key(&account_id) {
println!("Credentials already exist for account ID '{}'.", account_id);
return;
}
print!("Enter your LPU username: ");
io::stdout().flush().unwrap();
let mut username = String::new();
io::stdin().read_line(&mut username).unwrap();
print!("Enter your LPU password: ");
io::stdout().flush().unwrap();
let password = read_password().unwrap();
credentials.insert(
account_id.clone(),
Credentials {
username: username.trim().to_string(),
password: password.trim().to_string(),
},
);
write_credentials(&credentials);
println!("LPU username and password have been stored securely.");
}
fn prompt_for_account_id() -> String {
let mut account_id = String::new();
io::stdin().read_line(&mut account_id).unwrap();
account_id.trim().to_string()
}