valis_core/modules/admin/
secrets.rs

1use std::fs::File;
2use std::io::BufReader;
3use std::path::PathBuf;
4
5use kdbx_rs;
6use kdbx_rs::CompositeKey;
7
8#[derive(Clone)]
9pub struct Secret {
10    pub entry: String,
11    pub field: String,
12    pub env_var: String,
13}
14
15pub fn read_fields_from_entry(
16    kdbx_file_path: &PathBuf,
17    password: String,
18    secrets: Vec<Secret>,
19) -> Result<Vec<Option<String>>, Box<dyn std::error::Error>> {
20    // Open the KDBX file
21    let file = File::open(kdbx_file_path).unwrap();
22    let reader = BufReader::new(file);
23
24    // Create a composite key using the provided password
25    let composite_key = CompositeKey::from_password(&password);
26
27    // Read the KDBX file and create a database
28    // let db = kdbx_rs::(reader, &composite_key)?;
29    let locked_db = kdbx_rs::open(kdbx_file_path).unwrap();
30    let db = locked_db.unlock(&composite_key).ok().unwrap();
31
32    let values = secrets
33        .into_iter()
34        .map(|secret| {
35            let entry = db
36                .root()
37                .entries()
38                .find(|e| e.title().unwrap() == secret.entry);
39
40            match entry {
41                None => return None,
42                Some(e) => {
43                    let field_value = e.fields().find(|f| f.key() == secret.field);
44                    match field_value {
45                        None => return None,
46                        Some(f) => return Some(f.value().unwrap().to_string()),
47                    }
48                }
49            };
50        })
51        .collect::<Vec<Option<String>>>();
52
53    Ok(values)
54}