Skip to main content

bitwarden_pam/
pam_client.rs

1use std::sync::Arc;
2
3use bitwarden_core::{Client, FromClient, client::ApiConfigurations, key_management::KeySlotIds};
4use bitwarden_crypto::KeyStore;
5
6use crate::{
7    access_requests::AccessRequestsClient, access_rules::AccessRulesClient,
8    approvals::ApprovalsClient, leases::LeasesClient, rotation::RotationClient,
9};
10
11/// Entry point for Privileged Access Management (PAM) operations.
12#[derive(Clone, FromClient)]
13#[bitwarden_ffi::wasm_object]
14pub struct PamClient {
15    pub(crate) key_store: KeyStore<KeySlotIds>,
16    pub(crate) api_configurations: Arc<ApiConfigurations>,
17}
18
19#[bitwarden_ffi::wasm_export]
20impl PamClient {
21    /// Access rule CRUD operations.
22    pub fn access_rules(&self) -> AccessRulesClient {
23        AccessRulesClient {
24            api_configurations: self.api_configurations.clone(),
25        }
26    }
27
28    /// Access request operations (submit, activate, cancel, and read the caller's requests).
29    pub fn access_requests(&self) -> AccessRequestsClient {
30        AccessRequestsClient {
31            api_configurations: self.api_configurations.clone(),
32        }
33    }
34
35    /// Approver-side access request operations (inbox, history, and recording a decision).
36    pub fn approvals(&self) -> ApprovalsClient {
37        ApprovalsClient {
38            api_configurations: self.api_configurations.clone(),
39        }
40    }
41
42    /// Access lease operations (read, extend, and end the caller's leases).
43    pub fn leases(&self) -> LeasesClient {
44        LeasesClient {
45            key_store: self.key_store.clone(),
46            api_configurations: self.api_configurations.clone(),
47        }
48    }
49
50    /// Credential rotation operations (access connectors, target systems, and managed credentials).
51    pub fn rotation(&self) -> RotationClient {
52        RotationClient {
53            key_store: self.key_store.clone(),
54            api_configurations: self.api_configurations.clone(),
55        }
56    }
57}
58
59/// Extension trait that exposes [`PamClient`] on [`Client`].
60pub trait PamClientExt {
61    /// Returns a [`PamClient`] backed by this client.
62    fn pam(&self) -> PamClient;
63}
64
65impl PamClientExt for Client {
66    fn pam(&self) -> PamClient {
67        PamClient::from_client(self)
68    }
69}