Skip to main content

bitwarden_vault/cipher/
linked_id.rs

1use bitwarden_core::MissingFieldError;
2use serde::{Deserialize, Serialize};
3use serde_repr::{Deserialize_repr, Serialize_repr};
4
5#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Debug)]
6#[serde(untagged)]
7#[bitwarden_ffi::wasm_record]
8pub enum LinkedIdType {
9    Login(LoginLinkedIdType),
10    Card(CardLinkedIdType),
11    Identity(IdentityLinkedIdType),
12}
13
14#[cfg(feature = "uniffi")]
15uniffi::custom_type!(LinkedIdType, u32);
16
17impl From<LinkedIdType> for u32 {
18    fn from(v: LinkedIdType) -> Self {
19        serde_json::to_value(v)
20            .expect("LinkedIdType should be serializable")
21            .as_u64()
22            .expect("Not a numeric enum value") as u32
23    }
24}
25
26#[derive(Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr, Debug)]
27#[repr(u16)]
28#[bitwarden_ffi::wasm_object]
29pub enum LoginLinkedIdType {
30    Username = 100,
31    Password = 101,
32}
33
34#[derive(Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr, Debug)]
35#[repr(u16)]
36#[bitwarden_ffi::wasm_object]
37pub enum CardLinkedIdType {
38    CardholderName = 300,
39    ExpMonth = 301,
40    ExpYear = 302,
41    Code = 303,
42    Brand = 304,
43    Number = 305,
44}
45
46#[derive(Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr, Debug)]
47#[repr(u16)]
48#[bitwarden_ffi::wasm_object]
49pub enum IdentityLinkedIdType {
50    Title = 400,
51    MiddleName = 401,
52    Address1 = 402,
53    Address2 = 403,
54    Address3 = 404,
55    City = 405,
56    State = 406,
57    PostalCode = 407,
58    Country = 408,
59    Company = 409,
60    Email = 410,
61    Phone = 411,
62    Ssn = 412,
63    Username = 413,
64    PassportNumber = 414,
65    LicenseNumber = 415,
66    FirstName = 416,
67    LastName = 417,
68    FullName = 418,
69}
70
71impl TryFrom<u32> for LinkedIdType {
72    type Error = MissingFieldError;
73
74    fn try_from(val: u32) -> Result<Self, Self::Error> {
75        let val = serde_json::Value::Number(val.into());
76        serde_json::from_value(val).map_err(|_| MissingFieldError("LinkedIdType"))
77    }
78}
79
80#[cfg(test)]
81mod tests {
82
83    #[test]
84    fn test_linked_id_serialization() {
85        use super::{LinkedIdType, LoginLinkedIdType};
86
87        #[derive(serde::Serialize, serde::Deserialize)]
88        struct Test {
89            id: LinkedIdType,
90        }
91
92        let json = "{\"id\":100}";
93        let val = serde_json::from_str::<Test>(json).unwrap();
94
95        assert_eq!(val.id, LinkedIdType::Login(LoginLinkedIdType::Username));
96
97        let serialized = serde_json::to_string(&val).unwrap();
98        assert_eq!(serialized, json);
99    }
100
101    #[cfg(feature = "uniffi")]
102    #[test]
103    fn test_linked_id_serialization_uniffi() {
104        use super::{CardLinkedIdType, LinkedIdType, LoginLinkedIdType};
105
106        assert_eq!(
107            100,
108            u32::from(LinkedIdType::Login(LoginLinkedIdType::Username))
109        );
110        assert_eq!(303, u32::from(LinkedIdType::Card(CardLinkedIdType::Code)));
111
112        assert_eq!(
113            LinkedIdType::Login(LoginLinkedIdType::Username),
114            100.try_into().unwrap()
115        );
116        assert_eq!(
117            LinkedIdType::Card(CardLinkedIdType::Code),
118            303.try_into().unwrap()
119        );
120    }
121}