Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / shared / lib / api / auth.ts
blob47af78c62b78c30ca3aabca15aacc33f7aa73a7c
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;
7 export const SCOPE_REAUTH_SSO = 9107;
9 export const auth = (
10     data:
11         | {
12               Username: string;
13               Payload?: ChallengePayload;
14           }
15         | {
16               SSOResponseToken: string;
17           },
18     persistent: boolean
19 ) => ({
20     method: 'post',
21     url: 'core/v4/auth',
22     data: {
23         ...data,
24         PersistentCookies: Number(persistent),
25     },
26     ignoreHandler: [HTTP_ERROR_CODES.TOO_MANY_REQUESTS],
27 });
29 export const auth2FA = (data: { TwoFactorCode: string } | { FIDO2: AuthenticationCredentialsPayload }) => ({
30     method: 'post',
31     url: 'core/v4/auth/2fa',
32     data: data,
33 });
35 export const authJwt = (data: { Token: String; ClientSecret?: String }) => ({
36     method: 'post',
37     url: 'core/v4/auth/jwt',
38     data,
39 });
41 export const revoke = (params?: { Child?: 1 }) => ({
42     method: 'delete',
43     url: 'core/v4/auth',
44     params,
45 });
47 interface RefreshArgs {
48     RefreshToken: string;
49     RedirectURI?: string;
52 export const setRefreshCookies = (data?: RefreshArgs) => {
53     const config = {
54         method: 'post',
55         // WARNING: The refresh cookie is set with `path=/api/auth/refresh;`
56         url: 'auth/refresh',
57     };
58     if (!data) {
59         return config;
60     }
61     return {
62         ...config,
63         data: {
64             ResponseType: 'token',
65             GrantType: 'refresh_token',
66             RefreshToken: data.RefreshToken,
67             RedirectURI: data.RedirectURI || 'https://protonmail.com',
68         },
69     };
72 interface CookiesArgs {
73     UID: string;
74     RefreshToken: string;
75     State: string;
76     RedirectURI?: string;
77     Persistent?: boolean;
80 export const setCookies = ({
81     UID,
82     RefreshToken,
83     State,
84     RedirectURI = 'https://protonmail.com',
85     Persistent = false,
86 }: CookiesArgs) => ({
87     method: 'post',
88     url: 'core/v4/auth/cookies',
89     data: {
90         UID,
91         ResponseType: 'token',
92         GrantType: 'refresh_token',
93         RefreshToken,
94         RedirectURI,
95         Persistent: Number(Persistent),
96         State,
97     },
98 });
100 export const getLocalKey = () => ({
101     method: 'get',
102     url: 'auth/v4/sessions/local/key',
104 export const setLocalKey = (Key: string) => ({
105     method: 'put',
106     url: 'auth/v4/sessions/local/key',
107     data: {
108         Key,
109     },
111 export const pushForkSession = (data: {
112     Payload?: string;
113     ChildClientID: APP_CLIENT_IDS;
114     Independent: 0 | 1;
115     Selector?: string;
116     UserCode?: string;
117 }) => ({
118     method: 'post',
119     url: 'auth/v4/sessions/forks',
120     data,
123 export const pullForkSession = (selector: string) => ({
124     method: 'get',
125     url: `auth/v4/sessions/forks/${selector}`,
128 export const getLocalSessions = (params?: { Email: string }) => ({
129     method: 'get',
130     url: `auth/v4/sessions/local`,
131     params,
134 export const getInfo = ({
135     username,
136     intent = 'Proton',
137     isTesting,
138     reauthScope,
139 }: {
140     username?: string;
141     intent?: 'Proton' | 'Auto' | 'SSO';
142     isTesting?: boolean;
143     reauthScope?: 'password' | 'locked';
144 }) => ({
145     method: 'post',
146     url: 'core/v4/auth/info',
147     data: {
148         ...(username ? { Username: username } : undefined),
149         Intent: intent,
150         ...(isTesting ? { IsTesting: isTesting } : undefined),
151         ...(reauthScope ? { ReauthScope: reauthScope } : undefined),
152     },
155 export const getModulus = () => ({
156     method: 'get',
157     url: 'core/v4/auth/modulus',
160 export const createSession = (data?: { ClientSecret?: string; Payload?: ChallengePayload }) => ({
161     method: 'post',
162     url: 'auth/v4/sessions',
163     data,
166 export const querySessions = () => ({
167     method: 'get',
168     url: 'auth/v4/sessions',
171 export const revokeOtherSessions = () => ({
172     method: 'delete',
173     url: 'auth/v4/sessions',
176 export const revokeSession = (UID: string | number) => ({
177     method: 'delete',
178     url: `auth/v4/sessions/${UID}`,
181 export const queryScopes = () => ({
182     method: 'get',
183     url: 'core/v4/auth/scopes',
186 export const getMnemonicAuthInfo = (Username?: string) => ({
187     method: 'post',
188     url: 'auth/v4/mnemonic/info',
189     data: Username ? { Username } : undefined,
192 export const authMnemonic = (Username: string, persistent: boolean) => ({
193     method: 'post',
194     url: 'auth/v4/mnemonic',
195     data: { Username, PersistentCookies: Number(persistent) },
196     ignoreHandler: [HTTP_ERROR_CODES.TOO_MANY_REQUESTS],
199 export const payload = (data: ChallengePayload) => ({
200     method: 'post',
201     url: `auth/v4/sessions/payload`,
202     data: {
203         Payload: data,
204     },
207 export const reauthMnemonic = (data: { Username: string; PersistentCookies: boolean }) => ({
208     method: 'post',
209     url: 'auth/v4/mnemonic/reauth',
210     data: {
211         ...data,
212         PersistentCookies: Number(data.PersistentCookies),
213     },