cp_microservice/impl/core/
bitwarden_secrets_manager.rs

1use 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}