srp.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import HTTPService from "@ente/shared/network/HTTPService";
  2. import { getEndpoint } from "@ente/shared/network/api";
  3. import {
  4. CompleteSRPSetupRequest,
  5. CompleteSRPSetupResponse,
  6. CreateSRPSessionResponse,
  7. GetSRPAttributesResponse,
  8. SRPAttributes,
  9. SRPVerificationResponse,
  10. SetupSRPRequest,
  11. SetupSRPResponse,
  12. UpdateSRPAndKeysRequest,
  13. UpdateSRPAndKeysResponse,
  14. } from "@ente/accounts/types/srp";
  15. import { ApiError, CustomError } from "@ente/shared/error";
  16. import { logError } from "@ente/shared/sentry";
  17. import { HttpStatusCode } from "axios";
  18. const ENDPOINT = getEndpoint();
  19. export const getSRPAttributes = async (
  20. email: string,
  21. ): Promise<SRPAttributes | null> => {
  22. try {
  23. const resp = await HTTPService.get(`${ENDPOINT}/users/srp/attributes`, {
  24. email,
  25. });
  26. return (resp.data as GetSRPAttributesResponse).attributes;
  27. } catch (e) {
  28. logError(e, "failed to get SRP attributes");
  29. return null;
  30. }
  31. };
  32. export const startSRPSetup = async (
  33. token: string,
  34. setupSRPRequest: SetupSRPRequest,
  35. ): Promise<SetupSRPResponse> => {
  36. try {
  37. const resp = await HTTPService.post(
  38. `${ENDPOINT}/users/srp/setup`,
  39. setupSRPRequest,
  40. undefined,
  41. {
  42. "X-Auth-Token": token,
  43. },
  44. );
  45. return resp.data as SetupSRPResponse;
  46. } catch (e) {
  47. logError(e, "failed to post SRP attributes");
  48. throw e;
  49. }
  50. };
  51. export const completeSRPSetup = async (
  52. token: string,
  53. completeSRPSetupRequest: CompleteSRPSetupRequest,
  54. ) => {
  55. try {
  56. const resp = await HTTPService.post(
  57. `${ENDPOINT}/users/srp/complete`,
  58. completeSRPSetupRequest,
  59. undefined,
  60. {
  61. "X-Auth-Token": token,
  62. },
  63. );
  64. return resp.data as CompleteSRPSetupResponse;
  65. } catch (e) {
  66. logError(e, "failed to complete SRP setup");
  67. throw e;
  68. }
  69. };
  70. export const createSRPSession = async (srpUserID: string, srpA: string) => {
  71. try {
  72. const resp = await HTTPService.post(
  73. `${ENDPOINT}/users/srp/create-session`,
  74. {
  75. srpUserID,
  76. srpA,
  77. },
  78. );
  79. return resp.data as CreateSRPSessionResponse;
  80. } catch (e) {
  81. logError(e, "createSRPSession failed");
  82. throw e;
  83. }
  84. };
  85. export const verifySRPSession = async (
  86. sessionID: string,
  87. srpUserID: string,
  88. srpM1: string,
  89. ) => {
  90. try {
  91. const resp = await HTTPService.post(
  92. `${ENDPOINT}/users/srp/verify-session`,
  93. {
  94. sessionID,
  95. srpUserID,
  96. srpM1,
  97. },
  98. undefined,
  99. );
  100. return resp.data as SRPVerificationResponse;
  101. } catch (e) {
  102. logError(e, "verifySRPSession failed");
  103. if (
  104. e instanceof ApiError &&
  105. e.httpStatusCode === HttpStatusCode.Unauthorized
  106. ) {
  107. throw Error(CustomError.INCORRECT_PASSWORD);
  108. } else {
  109. throw e;
  110. }
  111. }
  112. };
  113. export const updateSRPAndKeys = async (
  114. token: string,
  115. updateSRPAndKeyRequest: UpdateSRPAndKeysRequest,
  116. ): Promise<UpdateSRPAndKeysResponse> => {
  117. try {
  118. const resp = await HTTPService.post(
  119. `${ENDPOINT}/users/srp/update`,
  120. updateSRPAndKeyRequest,
  121. null,
  122. {
  123. "X-Auth-Token": token,
  124. },
  125. );
  126. return resp.data as UpdateSRPAndKeysResponse;
  127. } catch (e) {
  128. logError(e, "updateSRPAndKeys failed");
  129. throw e;
  130. }
  131. };