Skip to main content

bitwarden_policies/
policy.rs

1use std::collections::HashMap;
2
3use bitwarden_api_api::models::PolicyResponseModel;
4use bitwarden_core::{MissingFieldError, require};
5use serde::{Deserialize, Serialize};
6use serde_repr::{Deserialize_repr, Serialize_repr};
7use uuid::Uuid;
8
9/// Represents a policy that can be applied to an organization.
10#[derive(Serialize, Deserialize, Debug)]
11pub struct Policy {
12    id: Uuid,
13    organization_id: Uuid,
14    r#type: PolicyType,
15    data: Option<HashMap<String, serde_json::Value>>,
16    enabled: bool,
17}
18
19#[derive(Serialize_repr, Deserialize_repr, Debug)]
20#[repr(u8)]
21pub enum PolicyType {
22    /// Requires users to have 2fa enabled
23    TwoFactorAuthentication = 0,
24    /// Sets minimum requirements for master password complexity
25    MasterPassword = 1,
26    /// Sets minimum requirements/default type for generated passwords/passphrases
27    PasswordGenerator = 2,
28    /// Allows users to only be apart of one organization
29    SingleOrg = 3,
30    /// Requires users to authenticate with SSO
31    RequireSso = 4,
32    /// Disables personal vault ownership for adding/cloning items
33    PersonalOwnership = 5,
34    /// Disables the ability to create and edit Bitwarden Sends
35    DisableSend = 6,
36    /// Sets restrictions or defaults for Bitwarden Sends
37    SendOptions = 7,
38    /// Allows orgs to use reset password : also can enable auto-enrollment during invite flow
39    ResetPassword = 8,
40    /// Sets the maximum allowed vault timeout
41    MaximumVaultTimeout = 9,
42    /// Disable personal vault export
43    DisablePersonalVaultExport = 10,
44    /// Activates autofill with page load on the browser extension
45    ActivateAutofill = 11,
46    AutomaticAppLogIn = 12,
47    FreeFamiliesSponsorshipPolicy = 13,
48    RemoveUnlockWithPin = 14,
49    RestrictedItemTypesPolicy = 15,
50    UriMatchDefaults = 16,
51    AutotypeDefaultSetting = 17,
52    AutomaticUserConfirmation = 18,
53    BlockClaimedDomainAccountCreation = 19,
54}
55
56impl TryFrom<PolicyResponseModel> for Policy {
57    type Error = MissingFieldError;
58
59    fn try_from(policy: PolicyResponseModel) -> Result<Self, Self::Error> {
60        Ok(Self {
61            id: require!(policy.id),
62            organization_id: require!(policy.organization_id),
63            r#type: require!(policy.r#type).try_into()?,
64            data: policy.data,
65            enabled: require!(policy.enabled),
66        })
67    }
68}
69
70impl TryFrom<bitwarden_api_api::models::PolicyType> for PolicyType {
71    type Error = MissingFieldError;
72
73    fn try_from(policy_type: bitwarden_api_api::models::PolicyType) -> Result<Self, Self::Error> {
74        Ok(match policy_type {
75            bitwarden_api_api::models::PolicyType::TwoFactorAuthentication => {
76                PolicyType::TwoFactorAuthentication
77            }
78            bitwarden_api_api::models::PolicyType::MasterPassword => PolicyType::MasterPassword,
79            bitwarden_api_api::models::PolicyType::PasswordGenerator => {
80                PolicyType::PasswordGenerator
81            }
82            bitwarden_api_api::models::PolicyType::SingleOrg => PolicyType::SingleOrg,
83            bitwarden_api_api::models::PolicyType::RequireSso => PolicyType::RequireSso,
84            bitwarden_api_api::models::PolicyType::OrganizationDataOwnership => {
85                PolicyType::PersonalOwnership
86            }
87            bitwarden_api_api::models::PolicyType::DisableSend => PolicyType::DisableSend,
88            bitwarden_api_api::models::PolicyType::SendOptions => PolicyType::SendOptions,
89            bitwarden_api_api::models::PolicyType::ResetPassword => PolicyType::ResetPassword,
90            bitwarden_api_api::models::PolicyType::MaximumVaultTimeout => {
91                PolicyType::MaximumVaultTimeout
92            }
93            bitwarden_api_api::models::PolicyType::DisablePersonalVaultExport => {
94                PolicyType::DisablePersonalVaultExport
95            }
96            bitwarden_api_api::models::PolicyType::ActivateAutofill => PolicyType::ActivateAutofill,
97            bitwarden_api_api::models::PolicyType::AutomaticAppLogIn => {
98                PolicyType::AutomaticAppLogIn
99            }
100            bitwarden_api_api::models::PolicyType::FreeFamiliesSponsorshipPolicy => {
101                PolicyType::FreeFamiliesSponsorshipPolicy
102            }
103            bitwarden_api_api::models::PolicyType::RemoveUnlockWithPin => {
104                PolicyType::RemoveUnlockWithPin
105            }
106            bitwarden_api_api::models::PolicyType::RestrictedItemTypesPolicy => {
107                PolicyType::RestrictedItemTypesPolicy
108            }
109            bitwarden_api_api::models::PolicyType::UriMatchDefaults => PolicyType::UriMatchDefaults,
110            bitwarden_api_api::models::PolicyType::AutotypeDefaultSetting => {
111                PolicyType::AutotypeDefaultSetting
112            }
113            bitwarden_api_api::models::PolicyType::AutomaticUserConfirmation => {
114                PolicyType::AutomaticUserConfirmation
115            }
116            bitwarden_api_api::models::PolicyType::BlockClaimedDomainAccountCreation => {
117                PolicyType::BlockClaimedDomainAccountCreation
118            }
119            bitwarden_api_api::models::PolicyType::__Unknown(_) => {
120                return Err(MissingFieldError("type"));
121            }
122        })
123    }
124}