cp_microservice/impl/core/
bitwarden_secrets_manager.rs1use std::process::Command;
2
3use serde::Deserialize;
4
5use crate::core::secrets::secrets_manager::SecretsManager;
6
7#[derive(Deserialize)]
8struct BitwardenSecret {
9 pub object: String,
10 pub id: String,
11 pub organizationId: String,
12 pub projectId: String,
13 pub key: String,
14 pub value: String,
15 pub note: String,
16 pub creationDate: String,
17 pub revisionDate: String,
18}
19
20pub struct BitwardenSecretsManager {
21 access_token: String,
22}
23
24impl BitwardenSecretsManager {
25 pub fn new(access_token: String) -> Self {
26 Self { access_token }
27 }
28}
29
30impl SecretsManager for BitwardenSecretsManager {
31 fn get(&self, id: &str) -> Option<String> {
32 let secret_data = match Command::new("bws")
33 .arg("secret")
34 .arg("get")
35 .arg(id)
36 .arg("--access-token")
37 .arg(&self.access_token)
38 .output()
39 {
40 Ok(secret_data) => secret_data.stdout,
41 Err(error) => {
42 log::warn!("failed to retrieve secret '{}': {}", id, &error);
43 return None;
44 }
45 };
46
47 let secret = match serde_json::from_slice::<BitwardenSecret>(&secret_data) {
48 Ok(secret) => secret,
49 Err(error) => {
50 log::warn!("failed to deserialize secret: {}", &error);
51 return None;
52 }
53 };
54
55 Some(secret.value)
56 }
57}