Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / pass / lib / items / item.obfuscation.ts
blob4ddac157bcc6312daa68539590b74f078a613b71
1 import type { Item, ItemExtraField, ItemType, UnsafeItem, UnsafeItemExtraField } from '@proton/pass/types';
2 import { deobfuscate, obfuscate } from '@proton/pass/utils/obfuscate/xor';
4 export const obfuscateExtraFields = (extraFields?: UnsafeItemExtraField[]): ItemExtraField[] =>
5     extraFields?.map((field) =>
6         field.type === 'totp'
7             ? { ...field, data: { totpUri: obfuscate(field.data.totpUri) } }
8             : { ...field, data: { content: obfuscate(field.data.content) } }
9     ) ?? [];
11 export const deobfuscateExtraFields = (extraFields?: ItemExtraField[]): UnsafeItemExtraField[] =>
12     extraFields?.map((extraField): UnsafeItemExtraField => {
13         switch (extraField.type) {
14             case 'totp':
15                 return {
16                     ...extraField,
17                     data: { totpUri: deobfuscate(extraField.data.totpUri) },
18                 };
19             default:
20                 return {
21                     ...extraField,
22                     data: { content: deobfuscate(extraField.data.content) },
23                 };
24         }
25     }) ?? [];
27 export const obfuscateItem = <T extends ItemType = ItemType>(item: UnsafeItem): Item<T> => {
28     const base = {
29         metadata: { ...item.metadata, note: obfuscate(item.metadata.note) },
30         extraFields: obfuscateExtraFields(item.extraFields),
31     };
33     switch (item.type) {
34         case 'login':
35             return {
36                 ...item,
37                 ...base,
38                 content: {
39                     ...item.content,
40                     itemEmail: obfuscate(item.content.itemEmail),
41                     itemUsername: obfuscate(item.content.itemUsername),
42                     password: obfuscate(item.content.password),
43                     totpUri: obfuscate(item.content.totpUri),
44                 },
45             } satisfies Item<'login'> as Item<T>;
46         case 'creditCard':
47             return {
48                 ...item,
49                 ...base,
50                 content: {
51                     ...item.content,
52                     number: obfuscate(item.content.number),
53                     verificationNumber: obfuscate(item.content.verificationNumber),
54                     pin: obfuscate(item.content.pin),
55                 },
56             } satisfies Item<'creditCard'> as Item<T>;
58         case 'note':
59             return { ...item, ...base } satisfies Item<'note'> as Item<T>;
60         case 'alias':
61             return { ...item, ...base } satisfies Item<'alias'> as Item<T>;
62         case 'identity':
63             return { ...item, ...base } satisfies Item<'identity'> as Item<T>;
64     }
67 export const deobfuscateItem = <T extends ItemType>(item: Item): UnsafeItem<T> => {
68     const base = {
69         metadata: { ...item.metadata, note: deobfuscate(item.metadata.note) },
70         extraFields: deobfuscateExtraFields(item.extraFields),
71     };
73     switch (item.type) {
74         case 'login':
75             return {
76                 ...item,
77                 ...base,
78                 content: {
79                     ...item.content,
80                     itemEmail: deobfuscate(item.content.itemEmail),
81                     itemUsername: deobfuscate(item.content.itemUsername),
82                     password: deobfuscate(item.content.password),
83                     totpUri: deobfuscate(item.content.totpUri),
84                 },
85             } satisfies UnsafeItem<'login'> as UnsafeItem<T>;
86         case 'creditCard':
87             return {
88                 ...item,
89                 ...base,
90                 content: {
91                     ...item.content,
92                     number: deobfuscate(item.content.number),
93                     verificationNumber: deobfuscate(item.content.verificationNumber),
94                     pin: deobfuscate(item.content.pin),
95                 },
96             } satisfies UnsafeItem<'creditCard'> as UnsafeItem<T>;
98         case 'note':
99             return { ...item, ...base } satisfies UnsafeItem<'note'> as UnsafeItem<T>;
100         case 'alias':
101             return { ...item, ...base } satisfies UnsafeItem<'alias'> as UnsafeItem<T>;
102         case 'identity':
103             return { ...item, ...base } satisfies UnsafeItem<'identity'> as UnsafeItem<T>;
104     }