Cleanup - unused files / unused exports / duplicate exports
[ProtonMail-WebClient.git] / packages / shared / lib / contacts / globalOperations.ts
blobd43730e9d0f41482cb22c2d93a2eabd493a5ebab
1 import { CryptoProxy, VERIFICATION_STATUS } from '@proton/crypto';
3 import { getContact, updateContact } from '../api/contacts';
4 import { CONTACT_CARD_TYPE } from '../constants';
5 import type { Api, DecryptedKey, Key } from '../interfaces';
6 import type { Contact } from '../interfaces/contacts';
7 import { splitKeys } from '../keys/keys';
8 import { getKeyUsedForContact } from './keyVerifications';
9 import { resignCards } from './resign';
11 /**
12  * Process all contacts and update each of them without the content encrypted with the given key
13  */
14 export const dropDataEncryptedWithAKey = async (
15     contacts: Contact[],
16     referenceKey: Key,
17     userKeys: DecryptedKey[],
18     api: Api,
19     progressionCallback: (progress: number, updated: number) => void,
20     exitRef: { current: boolean }
21 ) => {
22     let updated = 0;
23     const { privateKeys } = splitKeys(userKeys);
25     for (let i = 0; i < contacts.length && !exitRef.current; i++) {
26         const contactID = contacts[i].ID;
27         const { Contact } = await api<{ Contact: Contact }>(getContact(contactID));
28         const match = await getKeyUsedForContact(Contact, [referenceKey], true);
29         if (match) {
30             updated++;
31             const Cards = await Promise.all(
32                 Contact.Cards.filter(
33                     (card) =>
34                         card.Type !== CONTACT_CARD_TYPE.ENCRYPTED &&
35                         card.Type !== CONTACT_CARD_TYPE.ENCRYPTED_AND_SIGNED
36                 ).map(async (card) => {
37                     let { Signature } = card;
38                     if (card.Type === CONTACT_CARD_TYPE.SIGNED) {
39                         const signature = await CryptoProxy.signMessage({
40                             textData: card.Data,
41                             stripTrailingSpaces: true,
42                             signingKeys: [privateKeys[0]],
43                             detached: true,
44                         });
45                         Signature = signature;
46                     }
47                     return { ...card, Signature };
48                 })
49             );
50             await api<{ Contact: Contact }>(updateContact(contactID, { Cards }));
51             // console.log('dropDataEncryptedWithAKey', updateContact(contactID, { Cards }));
52         }
53         progressionCallback(i + 1, updated);
54     }
57 /**
58  * Process all contacts and resign each of them with the given key
59  */
60 export const resignAllContacts = async (
61     contacts: Contact[],
62     userKeys: DecryptedKey[],
63     api: Api,
64     progressionCallback: (progress: number, updated: number) => void,
65     exitRef: { current: boolean }
66 ) => {
67     let updated = 0;
68     const { publicKeys, privateKeys } = splitKeys(userKeys);
70     for (let i = 0; i < contacts.length && !exitRef.current; i++) {
71         const contactID = contacts[i].ID;
72         const { Contact } = await api<{ Contact: Contact }>(getContact(contactID));
74         // Should only be one signed card
75         const signedCard = Contact.Cards.find((card) => card.Type === CONTACT_CARD_TYPE.SIGNED);
77         if (!signedCard || !signedCard.Signature) {
78             progressionCallback(i + 1, updated);
79             continue;
80         }
82         const { verified } = await CryptoProxy.verifyMessage({
83             textData: signedCard.Data,
84             stripTrailingSpaces: true,
85             verificationKeys: publicKeys,
86             armoredSignature: signedCard.Signature,
87         });
89         if (verified !== VERIFICATION_STATUS.SIGNED_AND_VALID) {
90             updated++;
91             const Cards = await resignCards({
92                 contactCards: Contact.Cards,
93                 privateKeys: [privateKeys[0]],
94             });
95             await api<{ Contact: Contact }>(updateContact(contactID, { Cards }));
96             // console.log('resignAllContacts', updateContact(contactID, { Cards }));
97         }
98         progressionCallback(i + 1, updated);
99     }