Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / shared / lib / api / keys.ts
blobb40418e887af905f6e6cdb7f3dbd38921583b819
1 import type { ProductParam } from '@proton/shared/lib/apps/product';
2 import { getProductHeaders } from '@proton/shared/lib/apps/product';
4 import type { AddressKeyPayload, AddressKeyPayloadV2, SignedKeyList } from '../interfaces';
6 interface GetPublicKeysForInboxParams {
7     Email: string;
8     Fingerprint?: string;
11 /** @deprecated in favor of `getAllPublicKeys` */
12 export const getPublicKeys = (params: GetPublicKeysForInboxParams) => ({
13     url: 'core/v4/keys',
14     method: 'get',
15     params,
16 });
18 interface GetAllPublicKeysParams {
19     Email: string;
20     InternalOnly?: 0 | 1;
23 export const getAllPublicKeys = (params: GetAllPublicKeysParams) => ({
24     url: 'core/v4/keys/all',
25     method: 'get',
26     params,
27 });
29 export const getKeySalts = () => ({
30     url: 'core/v4/keys/salts',
31     method: 'get',
32 });
34 interface CreateUserKeyPayload {
35     Primary: number;
36     PrivateKey: string;
39 export const createUserKeyRoute = (data: CreateUserKeyPayload) => ({
40     url: 'core/v4/keys/user',
41     method: 'post',
42     data,
43 });
45 interface AddressKeyToken {
46     AddressKeyID: string;
47     KeyPacket: string;
48     Signature: string;
51 interface AddressTokensPayload {
52     AddressKeyTokens: AddressKeyToken[];
55 export const replaceAddressTokens = (data: AddressTokensPayload) => ({
56     url: 'core/v4/keys/tokens',
57     method: 'put',
58     data,
59 });
61 interface CreateAddressKeyPayload {
62     AddressID: string;
63     Primary: number;
64     PrivateKey: string;
65     SignedKeyList: SignedKeyList;
66     AddressForwardingID?: string;
67     GroupMemberID?: string;
70 export const createAddressKeyRoute = (data: CreateAddressKeyPayload) => ({
71     url: 'core/v4/keys',
72     method: 'post',
73     data,
74 });
76 interface CreateAddressKeyPayloadV2 extends CreateAddressKeyPayload {
77     Token: string;
78     Signature: string;
81 export const createAddressKeyRouteV2 = (data: CreateAddressKeyPayloadV2) => ({
82     url: 'core/v4/keys/address',
83     method: 'post',
84     data,
85 });
87 interface CreateGroupAddressKeyPayload {
88     AddressID: string;
89     PrivateKey: string;
90     OrgToken: string;
91     OrgSignature: string;
92     SignedKeyList: SignedKeyList;
95 export const createGroupAddressKeyRoute = (data: CreateGroupAddressKeyPayload) => ({
96     url: 'core/v4/keys/group',
97     method: 'post',
98     data,
99 });
101 export enum AddressActiveStatus {
102     INACTIVE = 0,
103     ACTIVE = 1,
106 export interface ActiveAddressKeyPayload {
107     AddressKeyID: string;
108     Active: AddressActiveStatus;
111 interface UpdateAddressActiveKeysRoutePayload {
112     AddressID: string;
113     Keys: ActiveAddressKeyPayload[];
114     SignedKeyList: SignedKeyList;
117 export const updateAddressActiveKeysRoute = (data: UpdateAddressActiveKeysRoutePayload) => ({
118     url: 'core/v4/keys/address/active',
119     method: 'put',
120     data,
123 interface BaseSetupKeysPayload {
124     PrimaryKey: string;
125     KeySalt: string;
126     AddressKeys: (AddressKeyPayload | AddressKeyPayloadV2)[];
127     EncryptedSecret?: string;
130 interface UnprivatizationSetupKeysPayload extends BaseSetupKeysPayload {
131     OrgActivationToken: string;
132     OrgPrimaryUserKey: string;
135 type SetupKeysPayload = UnprivatizationSetupKeysPayload | BaseSetupKeysPayload;
137 export const setupKeys = (data: SetupKeysPayload, product: ProductParam) => ({
138     url: 'core/v4/keys/setup',
139     method: 'post',
140     timeout: 60_000,
141     data,
142     headers: getProductHeaders(product, {
143         endpoint: 'core/v4/keys/setup',
144         product,
145     }),
148 interface ActivateKeyPayload {
149     ID: string;
150     PrivateKey: string;
151     SignedKeyList: SignedKeyList;
154 export const activateKeyRoute = ({ ID, ...data }: ActivateKeyPayload) => ({
155     url: `core/v4/keys/${ID}/activate`,
156     method: 'put',
157     data,
160 interface ActivateKeyPayloadV2 extends ActivateKeyPayload {
161     Signature: string;
162     Token: string;
165 export const activateKeyRouteV2 = ({ ID, ...data }: ActivateKeyPayloadV2) => ({
166     url: `core/v4/keys/address/${ID}`,
167     method: 'put',
168     data,
171 export const reactiveLegacyAddressKeyRouteV2 = ({ ID, ...data }: ActivateKeyPayloadV2) => ({
172     url: `core/v4/keys/address/${ID}`,
173     method: 'put',
174     data,
177 interface ReactivateKeyPayload {
178     ID: string;
179     PrivateKey: string;
180     SignedKeyList?: SignedKeyList;
183 export const reactivateKeyRoute = ({ ID, PrivateKey, SignedKeyList }: ReactivateKeyPayload) => ({
184     url: `core/v4/keys/${ID}`,
185     method: 'put',
186     data: {
187         PrivateKey,
188         SignedKeyList,
189     },
192 interface ReactivateUserKeyPayloadV2 {
193     ID: string;
194     PrivateKey: string;
195     AddressKeyFingerprints: string[];
196     SignedKeyLists: {
197         [key: string]: SignedKeyList;
198     };
201 export const reactivateUserKeyRouteV2 = ({ ID, ...data }: ReactivateUserKeyPayloadV2) => ({
202     url: `core/v4/keys/user/${ID}`,
203     method: 'put',
204     data,
207 interface SetKeyPrimaryPayload {
208     ID: string;
209     SignedKeyList: SignedKeyList;
212 export const setKeyPrimaryRoute = ({ ID, ...data }: SetKeyPrimaryPayload) => ({
213     url: `core/v4/keys/${ID}/primary`,
214     method: 'put',
215     data,
218 interface SetKeyFlagsPayload {
219     ID: string;
220     Flags: number;
221     SignedKeyList: SignedKeyList;
224 export const setKeyFlagsRoute = ({ ID, ...data }: SetKeyFlagsPayload) => ({
225     url: `core/v4/keys/${ID}/flags`,
226     method: 'put',
227     data,
230 interface RemoveUserKeyPayload {
231     ID: string;
234 export const removeUserKeyRoute = ({ ID }: RemoveUserKeyPayload) => ({
235     url: `core/v4/keys/user/${ID}`,
236     method: 'delete',
239 interface RemoveAddressKeyPayload {
240     ID: string;
241     SignedKeyList: SignedKeyList | null;
244 export const removeAddressKeyRoute = ({ ID, ...data }: RemoveAddressKeyPayload) => ({
245     url: `core/v4/keys/address/${ID}/delete`,
246     method: 'post',
247     data,
250 export interface UpdatePrivateKeyPayload {
251     KeySalt: string;
252     Keys: { ID: string; PrivateKey: string }[];
253     OrganizationKey?: string;
254     PersistPasswordScope?: boolean;
257 export interface UpdatePrivateKeyPayloadV2 {
258     KeySalt: string;
259     UserKeys: { ID: string; PrivateKey: string }[];
260     OrganizationKey?: string;
261     PersistPasswordScope?: boolean;
262     EncryptedSecret?: string;
265 export const updatePrivateKeyRoute = (data: UpdatePrivateKeyPayload | UpdatePrivateKeyPayloadV2) => ({
266     url: 'core/v4/keys/private',
267     method: 'put',
268     data,
271 export interface ResetKeysPayload {
272     Username: string;
273     Token: string;
274     KeySalt: string;
277 export interface ResetKeysPayloadWithKeys extends ResetKeysPayload {
278     PrimaryKey: string;
279     AddressKeys: AddressKeyPayload[];
282 export interface ResetKeysPayloadV2 extends ResetKeysPayload {
283     PrimaryKey: string;
284     AddressKeys: AddressKeyPayloadV2[];
287 export const resetKeysRoute = (data: ResetKeysPayloadWithKeys | ResetKeysPayloadV2 | ResetKeysPayload) => ({
288     url: 'core/v4/keys/reset',
289     method: 'post',
290     data,
293 interface UpgradeKeyPayload {
294     ID: string;
295     PrivateKey: string;
298 interface UpgradeKeysPayload {
299     KeySalt: string;
300     Keys: UpgradeKeyPayload[];
301     OrganizationKey?: string;
304 export interface UpgradeAddressKeyPayload {
305     ID: string;
306     PrivateKey: string;
307     Token: string;
308     Signature: string;
311 interface UpgradeKeysPayloadV2 {
312     KeySalt: string;
313     UserKeys: UpgradeKeyPayload[];
314     AddressKeys: UpgradeAddressKeyPayload[];
315     OrganizationKey?: string;
316     SignedKeyLists: {
317         [key: string]: SignedKeyList;
318     };
321 export const upgradeKeysRoute = (data: UpgradeKeysPayload | UpgradeKeysPayloadV2) => ({
322     url: 'core/v4/keys/private/upgrade',
323     method: 'post',
324     data,
327 export interface MigrateAddressKeyPayload {
328     ID: string;
329     Token: string;
330     Signature: string;
331     PrivateKey: string;
334 export interface MigrateAddressKeysPayload {
335     AddressKeys: MigrateAddressKeyPayload[];
336     SignedKeyLists: { [key: string]: SignedKeyList };
339 export const migrateAddressKeysRoute = (data: MigrateAddressKeysPayload) => ({
340     url: 'core/v4/keys/migrate',
341     method: 'post',
342     data,
345 export interface GetSignedKeyListsParams {
346     AfterRevision?: number;
347     Identifier: string;
350 export const getSignedKeyListsRoute = (params: GetSignedKeyListsParams) => ({
351     url: 'core/v4/keys/signedkeylists',
352     method: 'get',
353     params,
356 export interface GetSignedKeyListParams {
357     Revision: number;
358     Identifier: string;
361 export const getSignedKeyListRoute = (params: GetSignedKeyListParams) => ({
362     url: 'keys/signedkeylist',
363     method: 'get',
364     params,
367 export interface UpdateSignedKeyListPayload {
368     AddressID: string;
369     SignedKeyList: SignedKeyList;
372 export const updateSignedKeyListRoute = (data: UpdateSignedKeyListPayload) => ({
373     url: 'core/v4/keys/signedkeylists',
374     method: 'post',
375     data,
378 export interface UpdateSignedKeyListSignatureData {
379     AddressID: string;
380     Revision: number;
381     Signature: string;
384 export const updateSignedKeyListSignatureRoute = (data: UpdateSignedKeyListSignatureData) => ({
385     url: 'core/v4/keys/signedkeylists/signature',
386     method: 'put',
387     data,