user.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import HTTPService from '@ente/shared/network/HTTPService';
  2. import { getEndpoint } from '@ente/shared/network/api';
  3. import { getToken } from '@ente/shared/storage/localStorage/helpers';
  4. import { KeyAttributes } from '@ente/shared/user/types';
  5. import { ApiError } from '@ente/shared/error';
  6. import { HttpStatusCode } from 'axios';
  7. import {
  8. UserVerificationResponse,
  9. TwoFactorRecoveryResponse,
  10. TwoFactorVerificationResponse,
  11. TwoFactorSecret,
  12. RecoveryKey,
  13. } from '@ente/accounts/types/user';
  14. import { B64EncryptionResult } from '@ente/shared/crypto/types';
  15. import { logError } from '@ente/shared/sentry';
  16. const ENDPOINT = getEndpoint();
  17. export const sendOtt = (appName: string, email: string) => {
  18. return HTTPService.post(`${ENDPOINT}/users/ott`, {
  19. email,
  20. client: appName,
  21. });
  22. };
  23. export const verifyOtt = (email: string, ott: string) =>
  24. HTTPService.post(`${ENDPOINT}/users/verify-email`, { email, ott });
  25. export const putAttributes = async (keyAttributes: KeyAttributes) => {
  26. const token = getToken();
  27. await HTTPService.put(
  28. `${ENDPOINT}/users/attributes`,
  29. { keyAttributes },
  30. undefined,
  31. {
  32. 'X-Auth-Token': token,
  33. }
  34. );
  35. };
  36. export const _logout = async () => {
  37. // ignore if token missing can be triggered during sign up.
  38. if (!getToken()) return true;
  39. try {
  40. await HTTPService.post(`${ENDPOINT}/users/logout`, null, undefined, {
  41. 'X-Auth-Token': getToken(),
  42. });
  43. return true;
  44. } catch (e) {
  45. // ignore if unauthorized, can be triggered during on token expiry.
  46. if (
  47. e instanceof ApiError &&
  48. e.httpStatusCode === HttpStatusCode.Unauthorized
  49. ) {
  50. return true;
  51. }
  52. logError(e, '/users/logout failed');
  53. throw e;
  54. }
  55. };
  56. export const verifyTwoFactor = async (code: string, sessionID: string) => {
  57. const resp = await HTTPService.post(
  58. `${ENDPOINT}/users/two-factor/verify`,
  59. {
  60. code,
  61. sessionID,
  62. },
  63. null
  64. );
  65. return resp.data as UserVerificationResponse;
  66. };
  67. export const recoverTwoFactor = async (sessionID: string) => {
  68. const resp = await HTTPService.get(`${ENDPOINT}/users/two-factor/recover`, {
  69. sessionID,
  70. });
  71. return resp.data as TwoFactorRecoveryResponse;
  72. };
  73. export const removeTwoFactor = async (sessionID: string, secret: string) => {
  74. const resp = await HTTPService.post(`${ENDPOINT}/users/two-factor/remove`, {
  75. sessionID,
  76. secret,
  77. });
  78. return resp.data as TwoFactorVerificationResponse;
  79. };
  80. export const changeEmail = async (email: string, ott: string) => {
  81. if (!getToken()) {
  82. return null;
  83. }
  84. await HTTPService.post(
  85. `${ENDPOINT}/users/change-email`,
  86. {
  87. email,
  88. ott,
  89. },
  90. null,
  91. {
  92. 'X-Auth-Token': getToken(),
  93. }
  94. );
  95. };
  96. export const sendOTTForEmailChange = async (email: string) => {
  97. if (!getToken()) {
  98. return null;
  99. }
  100. await HTTPService.post(`${ENDPOINT}/users/ott`, {
  101. email,
  102. client: 'web',
  103. purpose: 'change',
  104. });
  105. };
  106. export const setupTwoFactor = async () => {
  107. const resp = await HTTPService.post(
  108. `${ENDPOINT}/users/two-factor/setup`,
  109. null,
  110. null,
  111. {
  112. 'X-Auth-Token': getToken(),
  113. }
  114. );
  115. return resp.data as TwoFactorSecret;
  116. };
  117. export const enableTwoFactor = async (
  118. code: string,
  119. recoveryEncryptedTwoFactorSecret: B64EncryptionResult
  120. ) => {
  121. await HTTPService.post(
  122. `${ENDPOINT}/users/two-factor/enable`,
  123. {
  124. code,
  125. encryptedTwoFactorSecret:
  126. recoveryEncryptedTwoFactorSecret.encryptedData,
  127. twoFactorSecretDecryptionNonce:
  128. recoveryEncryptedTwoFactorSecret.nonce,
  129. },
  130. null,
  131. {
  132. 'X-Auth-Token': getToken(),
  133. }
  134. );
  135. };
  136. export const setRecoveryKey = (token: string, recoveryKey: RecoveryKey) =>
  137. HTTPService.put(`${ENDPOINT}/users/recovery-key`, recoveryKey, null, {
  138. 'X-Auth-Token': token,
  139. });
  140. export const disableTwoFactor = async () => {
  141. await HTTPService.post(`${ENDPOINT}/users/two-factor/disable`, null, null, {
  142. 'X-Auth-Token': getToken(),
  143. });
  144. };