Skip to content

Commit 6b0dd9b

Browse files
feat: add functions for interval-based secret loading
1 parent 8014451 commit 6b0dd9b

File tree

3 files changed

+99
-7
lines changed

3 files changed

+99
-7
lines changed

bitwarden_license/bitwarden-sm/src/client_secrets.rs

+12-5
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ use bitwarden_core::Client;
33
use crate::{
44
error::SecretsManagerError,
55
secrets::{
6-
create_secret, delete_secrets, get_secret, get_secrets_by_ids, list_secrets,
7-
list_secrets_by_project, sync_secrets, update_secret, SecretCreateRequest,
6+
create_secret, delete_secrets, get_secret, get_secrets_by_ids, get_secrets_by_project,
7+
list_secrets, list_secrets_by_project, sync_secrets, update_secret, SecretCreateRequest,
88
SecretGetRequest, SecretIdentifiersByProjectRequest, SecretIdentifiersRequest,
9-
SecretIdentifiersResponse, SecretPutRequest, SecretResponse, SecretsDeleteRequest,
10-
SecretsDeleteResponse, SecretsGetRequest, SecretsResponse, SecretsSyncRequest,
11-
SecretsSyncResponse,
9+
SecretIdentifiersResponse, SecretPutRequest, SecretResponse, SecretsByProjectGetRequest,
10+
SecretsDeleteRequest, SecretsDeleteResponse, SecretsGetRequest, SecretsResponse,
11+
SecretsSyncRequest, SecretsSyncResponse,
1212
},
1313
};
1414

@@ -79,6 +79,13 @@ impl SecretsClient {
7979
) -> Result<SecretsSyncResponse, SecretsManagerError> {
8080
sync_secrets(&self.client, input).await
8181
}
82+
83+
pub async fn get_by_project(
84+
&self,
85+
input: &SecretsByProjectGetRequest,
86+
) -> Result<SecretsResponse, SecretsManagerError> {
87+
get_secrets_by_project(&self.client, input).await
88+
}
8289
}
8390

8491
/// This trait is for backward compatibility

bitwarden_license/bitwarden-sm/src/secrets/get.rs

+85
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
use bitwarden_api_api::models::GetSecretsRequestModel;
12
use bitwarden_core::Client;
23
use schemars::JsonSchema;
34
use serde::{Deserialize, Serialize};
45
use uuid::Uuid;
56

67
use crate::{error::SecretsManagerError, secrets::SecretResponse};
78

9+
use super::SecretsResponse;
10+
811
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
912
#[serde(rename_all = "camelCase", deny_unknown_fields)]
1013
pub struct SecretGetRequest {
@@ -23,3 +26,85 @@ pub(crate) async fn get_secret(
2326

2427
SecretResponse::process_response(res, &mut key_store.context())
2528
}
29+
30+
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
31+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
32+
/// Request to sync secrets for a specific project
33+
pub struct SecretsByProjectGetRequest {
34+
/// Project ID to sync secrets from
35+
pub project_id: Uuid,
36+
}
37+
38+
// get_secrets_full(id: ProjectId);
39+
// return: Vec<{ secrets_name: }>
40+
41+
// get_secrets_by_project_view(id: ProjectId)
42+
// return: Vec<{ secret_id: SecretId, secret_name: &str, revision_date: DateTime<Utc> }>
43+
44+
// get_secret(id: SecretId)
45+
46+
// Will call on initial load to get all the data
47+
pub(crate) async fn get_secrets_by_project(
48+
client: &Client,
49+
input: &SecretsByProjectGetRequest,
50+
) -> Result<SecretsResponse, SecretsManagerError> {
51+
let config = client.internal.get_api_configurations().await;
52+
// let last_synced_date = input.last_synced_date.map(|date| date.to_rfc3339());
53+
54+
let secrets_with_project_list =
55+
bitwarden_api_api::apis::secrets_api::projects_project_id_secrets_get(
56+
&config.api,
57+
input.project_id,
58+
// last_synced_date,
59+
)
60+
.await?;
61+
62+
let secret_ids: Vec<Uuid> = secrets_with_project_list
63+
.secrets
64+
.unwrap_or_default()
65+
.into_iter()
66+
.map(|s| s.id.unwrap_or_default())
67+
.collect();
68+
69+
let request = Some(GetSecretsRequestModel { ids: secret_ids });
70+
71+
let res =
72+
bitwarden_api_api::apis::secrets_api::secrets_get_by_ids_post(&config.api, request).await?;
73+
74+
let key_store = client.internal.get_key_store();
75+
76+
SecretsResponse::process_response(res, &mut key_store.context())
77+
}
78+
79+
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
80+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
81+
pub struct SecretSlimResponse {
82+
pub id: Uuid,
83+
pub revision_date: chrono::DateTime<chrono::Utc>,
84+
}
85+
86+
pub(crate) async fn get_secrets_view_by_project(
87+
client: &Client,
88+
input: &SecretsByProjectGetRequest,
89+
) -> Result<Vec<SecretSlimResponse>, SecretsManagerError> {
90+
let config = client.internal.get_api_configurations().await;
91+
92+
let secrets_with_project_list =
93+
bitwarden_api_api::apis::secrets_api::projects_project_id_secrets_get(
94+
&config.api,
95+
input.project_id,
96+
)
97+
.await?;
98+
99+
secrets_with_project_list
100+
.secrets
101+
.unwrap_or_default()
102+
.into_iter()
103+
.map(|s| {
104+
Ok(SecretSlimResponse {
105+
id: bitwarden_core::require!(s.id),
106+
revision_date: bitwarden_core::require!(s.revision_date).parse()?,
107+
})
108+
})
109+
.collect()
110+
}

bitwarden_license/bitwarden-sm/src/secrets/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ pub(crate) use create::create_secret;
1111
pub use create::SecretCreateRequest;
1212
pub(crate) use delete::delete_secrets;
1313
pub use delete::{SecretsDeleteRequest, SecretsDeleteResponse};
14-
pub(crate) use get::get_secret;
15-
pub use get::SecretGetRequest;
14+
pub(crate) use get::{get_secret, get_secrets_by_project, get_secrets_view_by_project};
15+
pub use get::{SecretGetRequest, SecretsByProjectGetRequest};
1616
pub(crate) use get_by_ids::get_secrets_by_ids;
1717
pub use get_by_ids::SecretsGetRequest;
1818
pub(crate) use list::{list_secrets, list_secrets_by_project};

0 commit comments

Comments
 (0)