Use same lock values as mobile clients
[ProtonMail-WebClient.git] / packages / shared / lib / api / auth.ts
blobe3c0185c93ff6a415cef727ff80c4485dab283f3
1 import type { ChallengePayload } from '../authentication/interface';
2 import type { APP_CLIENT_IDS } from '../constants';
3 import { HTTP_ERROR_CODES } from '../errors';
4 import type { AuthenticationCredentialsPayload } from '../webauthn/interface';
6 export const PASSWORD_WRONG_ERROR = 8002;
8 export const auth = (
9     data:
10         | {
11               Username: string;
12               Payload?: ChallengePayload;
13           }
14         | {
15               SSOResponseToken: string;
16           },
17     persistent: boolean
18 ) => ({
19     method: 'post',
20     url: 'core/v4/auth',
21     data: {
22         ...data,
23         PersistentCookies: Number(persistent),
24     },
25     ignoreHandler: [HTTP_ERROR_CODES.TOO_MANY_REQUESTS],
26 });
28 export const auth2FA = (data: { TwoFactorCode: string } | { FIDO2: AuthenticationCredentialsPayload }) => ({
29     method: 'post',
30     url: 'core/v4/auth/2fa',
31     data: data,
32 });
34 export const authJwt = (data: { Token: String; ClientSecret?: String }) => ({
35     method: 'post',
36     url: 'core/v4/auth/jwt',
37     data,
38 });
40 export const revoke = (params?: { Child?: 1 }) => ({
41     method: 'delete',
42     url: 'core/v4/auth',
43     params,
44 });
46 interface RefreshArgs {
47     RefreshToken: string;
48     RedirectURI?: string;
51 export const setRefreshCookies = (data?: RefreshArgs) => {
52     const config = {
53         method: 'post',
54         // WARNING: The refresh cookie is set with `path=/api/auth/refresh;`
55         url: 'auth/refresh',
56     };
57     if (!data) {
58         return config;
59     }
60     return {
61         ...config,
62         data: {
63             ResponseType: 'token',
64             GrantType: 'refresh_token',
65             RefreshToken: data.RefreshToken,
66             RedirectURI: data.RedirectURI || 'https://protonmail.com',
67         },
68     };
71 interface CookiesArgs {
72     UID: string;
73     RefreshToken: string;
74     State: string;
75     RedirectURI?: string;
76     Persistent?: boolean;
79 export const setCookies = ({
80     UID,
81     RefreshToken,
82     State,
83     RedirectURI = 'https://protonmail.com',
84     Persistent = false,
85 }: CookiesArgs) => ({
86     method: 'post',
87     url: 'core/v4/auth/cookies',
88     data: {
89         UID,
90         ResponseType: 'token',
91         GrantType: 'refresh_token',
92         RefreshToken,
93         RedirectURI,
94         Persistent: Number(Persistent),
95         State,
96     },
97 });
99 export const getLocalKey = () => ({
100     method: 'get',
101     url: 'auth/v4/sessions/local/key',
103 export const setLocalKey = (Key: string) => ({
104     method: 'put',
105     url: 'auth/v4/sessions/local/key',
106     data: {
107         Key,
108     },
110 export const pushForkSession = (data: {
111     Payload?: string;
112     ChildClientID: APP_CLIENT_IDS;
113     Independent: 0 | 1;
114     Selector?: string;
115     UserCode?: string;
116 }) => ({
117     method: 'post',
118     url: 'auth/v4/sessions/forks',
119     data,
122 export const pullForkSession = (selector: string) => ({
123     method: 'get',
124     url: `auth/v4/sessions/forks/${selector}`,
127 export const getLocalSessions = (params?: { Email: string }) => ({
128     method: 'get',
129     url: `auth/v4/sessions/local`,
130     params,
133 export const getInfo = (Username?: string, intent: 'Proton' | 'Auto' | 'SSO' = 'Proton', isTesting?: boolean) => ({
134     method: 'post',
135     url: 'core/v4/auth/info',
136     data: {
137         ...(Username ? { Username } : undefined),
138         Intent: intent,
139         ...(isTesting ? { IsTesting: isTesting } : undefined),
140     },
143 export const getModulus = () => ({
144     method: 'get',
145     url: 'core/v4/auth/modulus',
148 export const createSession = (data?: { ClientSecret?: string; Payload?: ChallengePayload }) => ({
149     method: 'post',
150     url: 'auth/v4/sessions',
151     data,
154 export const querySessions = () => ({
155     method: 'get',
156     url: 'auth/v4/sessions',
159 export const revokeOtherSessions = () => ({
160     method: 'delete',
161     url: 'auth/v4/sessions',
164 export const revokeSession = (UID: string | number) => ({
165     method: 'delete',
166     url: `auth/v4/sessions/${UID}`,
169 export const queryScopes = () => ({
170     method: 'get',
171     url: 'core/v4/auth/scopes',
174 export const getMnemonicAuthInfo = (Username?: string) => ({
175     method: 'post',
176     url: 'auth/v4/mnemonic/info',
177     data: Username ? { Username } : undefined,
180 export const authMnemonic = (Username: string, persistent: boolean) => ({
181     method: 'post',
182     url: 'auth/v4/mnemonic',
183     data: { Username, PersistentCookies: Number(persistent) },
184     ignoreHandler: [HTTP_ERROR_CODES.TOO_MANY_REQUESTS],
187 export const payload = (data: ChallengePayload) => ({
188     method: 'post',
189     url: `auth/v4/sessions/payload`,
190     data: {
191         Payload: data,
192     },
195 export const reauthMnemonic = (data: { Username: string; PersistentCookies: boolean }) => ({
196     method: 'post',
197     url: 'auth/v4/mnemonic/reauth',
198     data: {
199         ...data,
200         PersistentCookies: Number(data.PersistentCookies),
201     },