bitwarden_vault/folder/
folder_models.rs

1use bitwarden_api_api::models::FolderResponseModel;
2use bitwarden_core::{
3    key_management::{KeyIds, SymmetricKeyId},
4    require,
5};
6use bitwarden_crypto::{
7    CompositeEncryptable, CryptoError, Decryptable, EncString, IdentifyKey, KeyStoreContext,
8    PrimitiveEncryptable,
9};
10use chrono::{DateTime, Utc};
11use serde::{Deserialize, Serialize};
12use uuid::Uuid;
13#[cfg(feature = "wasm")]
14use {tsify::Tsify, wasm_bindgen::prelude::*};
15
16use crate::VaultParseError;
17
18#[allow(missing_docs)]
19#[derive(Serialize, Deserialize, Debug, Clone)]
20#[serde(rename_all = "camelCase")]
21#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
22#[cfg_attr(feature = "wasm", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))]
23pub struct Folder {
24    pub id: Option<Uuid>,
25    pub name: EncString,
26    pub revision_date: DateTime<Utc>,
27}
28
29bitwarden_state::register_repository_item!(Folder, "Folder");
30
31#[allow(missing_docs)]
32#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
33#[serde(rename_all = "camelCase")]
34#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
35#[cfg_attr(feature = "wasm", derive(Tsify), tsify(into_wasm_abi, from_wasm_abi))]
36pub struct FolderView {
37    pub id: Option<Uuid>,
38    pub name: String,
39    pub revision_date: DateTime<Utc>,
40}
41
42#[cfg(feature = "wasm")]
43impl wasm_bindgen::__rt::VectorIntoJsValue for FolderView {
44    fn vector_into_jsvalue(
45        vector: wasm_bindgen::__rt::std::boxed::Box<[Self]>,
46    ) -> wasm_bindgen::JsValue {
47        wasm_bindgen::__rt::js_value_vector_into_jsvalue(vector)
48    }
49}
50
51impl IdentifyKey<SymmetricKeyId> for Folder {
52    fn key_identifier(&self) -> SymmetricKeyId {
53        SymmetricKeyId::User
54    }
55}
56impl IdentifyKey<SymmetricKeyId> for FolderView {
57    fn key_identifier(&self) -> SymmetricKeyId {
58        SymmetricKeyId::User
59    }
60}
61
62impl CompositeEncryptable<KeyIds, SymmetricKeyId, Folder> for FolderView {
63    fn encrypt_composite(
64        &self,
65        ctx: &mut KeyStoreContext<KeyIds>,
66        key: SymmetricKeyId,
67    ) -> Result<Folder, CryptoError> {
68        Ok(Folder {
69            id: self.id,
70            name: self.name.encrypt(ctx, key)?,
71            revision_date: self.revision_date,
72        })
73    }
74}
75
76impl Decryptable<KeyIds, SymmetricKeyId, FolderView> for Folder {
77    fn decrypt(
78        &self,
79        ctx: &mut KeyStoreContext<KeyIds>,
80        key: SymmetricKeyId,
81    ) -> Result<FolderView, CryptoError> {
82        Ok(FolderView {
83            id: self.id,
84            name: self.name.decrypt(ctx, key).ok().unwrap_or_default(),
85            revision_date: self.revision_date,
86        })
87    }
88}
89
90impl TryFrom<FolderResponseModel> for Folder {
91    type Error = VaultParseError;
92
93    fn try_from(folder: FolderResponseModel) -> Result<Self, Self::Error> {
94        Ok(Folder {
95            id: folder.id,
96            name: require!(EncString::try_from_optional(folder.name)?),
97            revision_date: require!(folder.revision_date).parse()?,
98        })
99    }
100}