Skip to content

Commit 295d3c5

Browse files
authored
[SM-1153] Part 2 Secrets sync | Expose in SM SDK (#678)
## Type of change <!-- (mark with an `X`) --> ``` - [ ] Bug fix - [X] New feature development - [ ] Tech debt (refactoring, code cleanup, dependency upgrades, etc) - [ ] Build/deploy pipeline (DevOps) - [ ] Other ``` ## Objective <!--Describe what the purpose of this PR is. For example: what bug you're fixing or what new feature you're adding--> The purpose of this PR is to expose the ability to preform secrets syncs via the Secrets Manager SDK. Requires API bindings in #674 This should not be merged into main prior to: - The server PR bitwarden/server#3906 being merged and released - The API bindings PR #674 being merged into main ## Code changes <!--Explain the changes you've made to each file or major component. This should help the reviewer understand your changes--> <!--Also refer to any related changes or PRs in other repositories--> - **crates/bitwarden/src/secrets_manager/client_secrets.rs:** Add the `sync` method to the client secrets. - **crates/bitwarden/src/secrets_manager/secrets/mod.rs:** Expose `sync` `SecretsSyncRequest`, and `SecretsSyncResponse` - **crates/bitwarden/src/secrets_manager/secrets/sync.rs:** Implement `sync` `SecretsSyncRequest`, and `SecretsSyncResponse` ## Before you submit - Please add **unit tests** where it makes sense to do so
1 parent f07d9a7 commit 295d3c5

File tree

4 files changed

+90
-4
lines changed

4 files changed

+90
-4
lines changed

crates/bitwarden/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- Support for secrets sync (#678)
13+
1014
## [0.5.0] - 2024-04-26
1115

1216
### Changed

crates/bitwarden/src/secrets_manager/client_secrets.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ use crate::{
22
error::Result,
33
secrets_manager::secrets::{
44
create_secret, delete_secrets, get_secret, get_secrets_by_ids, list_secrets,
5-
list_secrets_by_project, update_secret, SecretCreateRequest, SecretGetRequest,
6-
SecretIdentifiersByProjectRequest, SecretIdentifiersRequest, SecretIdentifiersResponse,
7-
SecretPutRequest, SecretResponse, SecretsDeleteRequest, SecretsDeleteResponse,
8-
SecretsGetRequest, SecretsResponse,
5+
list_secrets_by_project, sync_secrets, update_secret, SecretCreateRequest,
6+
SecretGetRequest, SecretIdentifiersByProjectRequest, SecretIdentifiersRequest,
7+
SecretIdentifiersResponse, SecretPutRequest, SecretResponse, SecretsDeleteRequest,
8+
SecretsDeleteResponse, SecretsGetRequest, SecretsResponse, SecretsSyncRequest,
9+
SecretsSyncResponse,
910
},
1011
Client,
1112
};
@@ -48,6 +49,10 @@ impl<'a> ClientSecrets<'a> {
4849
pub async fn delete(&mut self, input: SecretsDeleteRequest) -> Result<SecretsDeleteResponse> {
4950
delete_secrets(self.client, input).await
5051
}
52+
53+
pub async fn sync(&mut self, input: &SecretsSyncRequest) -> Result<SecretsSyncResponse> {
54+
sync_secrets(self.client, input).await
55+
}
5156
}
5257

5358
impl<'a> Client {

crates/bitwarden/src/secrets_manager/secrets/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ mod get;
44
mod get_by_ids;
55
mod list;
66
mod secret_response;
7+
mod sync;
78
mod update;
89

910
pub(crate) use create::create_secret;
@@ -19,5 +20,7 @@ pub use list::{
1920
SecretIdentifiersByProjectRequest, SecretIdentifiersRequest, SecretIdentifiersResponse,
2021
};
2122
pub use secret_response::{SecretResponse, SecretsResponse};
23+
pub(crate) use sync::sync_secrets;
24+
pub use sync::{SecretsSyncRequest, SecretsSyncResponse};
2225
pub(crate) use update::update_secret;
2326
pub use update::SecretPutRequest;
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
use bitwarden_api_api::models::SecretsSyncResponseModel;
2+
use chrono::{DateTime, Utc};
3+
use schemars::JsonSchema;
4+
use serde::{Deserialize, Serialize};
5+
use uuid::Uuid;
6+
7+
use super::SecretResponse;
8+
use crate::{
9+
client::encryption_settings::EncryptionSettings,
10+
error::{require, Result},
11+
Client,
12+
};
13+
14+
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
15+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
16+
pub struct SecretsSyncRequest {
17+
/// Organization to sync secrets from
18+
pub organization_id: Uuid,
19+
/// Optional date time a sync last occurred
20+
pub last_synced_date: Option<DateTime<Utc>>,
21+
}
22+
23+
pub(crate) async fn sync_secrets(
24+
client: &mut Client,
25+
input: &SecretsSyncRequest,
26+
) -> Result<SecretsSyncResponse> {
27+
let config = client.get_api_configurations().await;
28+
let last_synced_date = input.last_synced_date.map(|date| date.to_rfc3339());
29+
30+
let res = bitwarden_api_api::apis::secrets_api::organizations_organization_id_secrets_sync_get(
31+
&config.api,
32+
input.organization_id,
33+
last_synced_date,
34+
)
35+
.await?;
36+
37+
let enc = client.get_encryption_settings()?;
38+
39+
SecretsSyncResponse::process_response(res, enc)
40+
}
41+
42+
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
43+
#[serde(rename_all = "camelCase", deny_unknown_fields)]
44+
pub struct SecretsSyncResponse {
45+
pub has_changes: bool,
46+
pub secrets: Option<Vec<SecretResponse>>,
47+
}
48+
49+
impl SecretsSyncResponse {
50+
pub(crate) fn process_response(
51+
response: SecretsSyncResponseModel,
52+
enc: &EncryptionSettings,
53+
) -> Result<SecretsSyncResponse> {
54+
let has_changes = require!(response.has_changes);
55+
56+
if has_changes {
57+
let secrets = require!(response.secrets)
58+
.data
59+
.unwrap_or_default()
60+
.into_iter()
61+
.map(|r| SecretResponse::process_base_response(r, enc))
62+
.collect::<Result<_, _>>()?;
63+
return Ok(SecretsSyncResponse {
64+
has_changes,
65+
secrets: Some(secrets),
66+
});
67+
}
68+
69+
Ok(SecretsSyncResponse {
70+
has_changes: false,
71+
secrets: None,
72+
})
73+
}
74+
}

0 commit comments

Comments
 (0)