From 103ee1c4414334b354e91a94c32314f6b47414ad Mon Sep 17 00:00:00 2001 From: Hinton Date: Wed, 23 Jul 2025 12:38:50 +0200 Subject: [PATCH 1/2] PoC for performing API requests using SDK --- crates/bitwarden-core/src/error.rs | 1 + .../src/key_management/km_api_client.rs | 54 +++++++++++++++++++ .../bitwarden-core/src/key_management/mod.rs | 4 ++ 3 files changed, 59 insertions(+) create mode 100644 crates/bitwarden-core/src/key_management/km_api_client.rs diff --git a/crates/bitwarden-core/src/error.rs b/crates/bitwarden-core/src/error.rs index 996d7d43d..96acdcbfd 100644 --- a/crates/bitwarden-core/src/error.rs +++ b/crates/bitwarden-core/src/error.rs @@ -30,6 +30,7 @@ macro_rules! impl_bitwarden_error { /// Errors from performing network requests. #[allow(missing_docs)] #[derive(Debug, Error)] +#[bitwarden_error(flat)] pub enum ApiError { #[error(transparent)] Reqwest(#[from] reqwest::Error), diff --git a/crates/bitwarden-core/src/key_management/km_api_client.rs b/crates/bitwarden-core/src/key_management/km_api_client.rs new file mode 100644 index 000000000..266923d0c --- /dev/null +++ b/crates/bitwarden-core/src/key_management/km_api_client.rs @@ -0,0 +1,54 @@ +use bitwarden_api_api::{ + apis::accounts_key_management_api::accounts_key_management_regenerate_keys_post, + models::KeyRegenerationRequestModel, +}; +use serde::{Deserialize, Serialize}; +#[cfg(feature = "wasm")] +use tsify::Tsify; +#[cfg(feature = "wasm")] +use wasm_bindgen::prelude::*; + +use crate::{ApiError, Client}; + +/// A client for the crypto operations. +#[cfg_attr(feature = "wasm", wasm_bindgen)] +pub struct KeyManagementApiClient { + pub(crate) client: crate::Client, +} + +#[cfg_attr(feature = "wasm", wasm_bindgen)] +impl KeyManagementApiClient { + /// Performs API request to `accounts/key-management/regenerate-keys`. + pub async fn accounts_key_management_regenerate_keys_post( + &self, + req: KeyRegenerationRequest, + ) -> Result<(), ApiError> { + let config = self.client.internal.get_api_configurations().await; + Ok(accounts_key_management_regenerate_keys_post(&config.api, Some(req.into())).await?) + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[cfg_attr(feature = "wasm", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))] +pub struct KeyRegenerationRequest { + user_public_key: String, + user_key_encrypted_user_private_key: String, +} + +impl From for KeyRegenerationRequestModel { + fn from(req: KeyRegenerationRequest) -> Self { + KeyRegenerationRequestModel { + user_public_key: Some(req.user_public_key), + user_key_encrypted_user_private_key: Some(req.user_key_encrypted_user_private_key), + } + } +} + +impl Client { + /// Temporary client for performing API requests for key management endpoints. + pub fn km_api(&self) -> KeyManagementApiClient { + KeyManagementApiClient { + client: self.clone(), + } + } +} diff --git a/crates/bitwarden-core/src/key_management/mod.rs b/crates/bitwarden-core/src/key_management/mod.rs index 10be377a8..53d1539c3 100644 --- a/crates/bitwarden-core/src/key_management/mod.rs +++ b/crates/bitwarden-core/src/key_management/mod.rs @@ -17,6 +17,10 @@ pub mod crypto; mod crypto_client; #[cfg(feature = "internal")] pub use crypto_client::CryptoClient; +#[cfg(feature = "internal")] +mod km_api_client; +#[cfg(feature = "internal")] +pub use km_api_client::KeyManagementApiClient; #[cfg(feature = "internal")] mod security_state; From 1e604e0e527810c212c44bec1e63485a8db2f5e2 Mon Sep 17 00:00:00 2001 From: Hinton Date: Thu, 24 Jul 2025 12:53:47 +0200 Subject: [PATCH 2/2] Wire up wasm --- crates/bitwarden-wasm-internal/src/client.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/bitwarden-wasm-internal/src/client.rs b/crates/bitwarden-wasm-internal/src/client.rs index 4c6760829..721f2383a 100644 --- a/crates/bitwarden-wasm-internal/src/client.rs +++ b/crates/bitwarden-wasm-internal/src/client.rs @@ -1,7 +1,10 @@ extern crate console_error_panic_hook; use std::{fmt::Display, sync::Arc}; -use bitwarden_core::{key_management::CryptoClient, Client, ClientSettings}; +use bitwarden_core::{ + key_management::{CryptoClient, KeyManagementApiClient}, + Client, ClientSettings, +}; use bitwarden_error::bitwarden_error; use bitwarden_exporters::ExporterClientExt; use bitwarden_generators::GeneratorClientsExt; @@ -73,6 +76,10 @@ impl BitwardenClient { pub fn exporters(&self) -> bitwarden_exporters::ExporterClient { self.0.exporters() } + + pub fn km_api(&self) -> KeyManagementApiClient { + self.0.km_api() + } } #[bitwarden_error(basic)]