valis_core/modules/admin/
secrets.rs1use 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 let file = File::open(kdbx_file_path).unwrap();
22 let reader = BufReader::new(file);
23
24 let composite_key = CompositeKey::from_password(&password);
26
27 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}