generate.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import { t } from "i18next";
  2. import { useEffect, useState } from "react";
  3. import { putAttributes } from "@ente/accounts/api/user";
  4. import { configureSRP } from "@ente/accounts/services/srp";
  5. import { logoutUser } from "@ente/accounts/services/user";
  6. import { generateKeyAndSRPAttributes } from "@ente/accounts/utils/srp";
  7. import {
  8. generateAndSaveIntermediateKeyAttributes,
  9. saveKeyInSessionStore,
  10. } from "@ente/shared/crypto/helpers";
  11. import { LS_KEYS, getData } from "@ente/shared/storage/localStorage";
  12. import { SESSION_KEYS, getKey } from "@ente/shared/storage/sessionStorage";
  13. import SetPasswordForm from "@ente/accounts/components/SetPasswordForm";
  14. import { PAGES } from "@ente/accounts/constants/pages";
  15. import { APP_HOMES } from "@ente/shared/apps/constants";
  16. import { PageProps } from "@ente/shared/apps/types";
  17. import { VerticallyCentered } from "@ente/shared/components/Container";
  18. import EnteSpinner from "@ente/shared/components/EnteSpinner";
  19. import FormPaper from "@ente/shared/components/Form/FormPaper";
  20. import FormPaperFooter from "@ente/shared/components/Form/FormPaper/Footer";
  21. import FormTitle from "@ente/shared/components/Form/FormPaper/Title";
  22. import LinkButton from "@ente/shared/components/LinkButton";
  23. import RecoveryKey from "@ente/shared/components/RecoveryKey";
  24. import { logError } from "@ente/shared/sentry";
  25. import {
  26. justSignedUp,
  27. setJustSignedUp,
  28. } from "@ente/shared/storage/localStorage/helpers";
  29. import { KeyAttributes, User } from "@ente/shared/user/types";
  30. export default function Generate({ router, appContext, appName }: PageProps) {
  31. const [token, setToken] = useState<string>();
  32. const [user, setUser] = useState<User>();
  33. const [recoverModalView, setRecoveryModalView] = useState(false);
  34. const [loading, setLoading] = useState(true);
  35. useEffect(() => {
  36. const main = async () => {
  37. const key: string = getKey(SESSION_KEYS.ENCRYPTION_KEY);
  38. const keyAttributes: KeyAttributes = getData(
  39. LS_KEYS.ORIGINAL_KEY_ATTRIBUTES,
  40. );
  41. const user: User = getData(LS_KEYS.USER);
  42. setUser(user);
  43. if (!user?.token) {
  44. router.push(PAGES.ROOT);
  45. } else if (key) {
  46. if (justSignedUp()) {
  47. setRecoveryModalView(true);
  48. setLoading(false);
  49. } else {
  50. router.push(APP_HOMES.get(appName));
  51. }
  52. } else if (keyAttributes?.encryptedKey) {
  53. router.push(PAGES.CREDENTIALS);
  54. } else {
  55. setToken(user.token);
  56. setLoading(false);
  57. }
  58. };
  59. main();
  60. appContext.showNavBar(true);
  61. }, []);
  62. const onSubmit = async (passphrase, setFieldError) => {
  63. try {
  64. const { keyAttributes, masterKey, srpSetupAttributes } =
  65. await generateKeyAndSRPAttributes(passphrase);
  66. await putAttributes(token, keyAttributes);
  67. await configureSRP(srpSetupAttributes);
  68. await generateAndSaveIntermediateKeyAttributes(
  69. passphrase,
  70. keyAttributes,
  71. masterKey,
  72. );
  73. await saveKeyInSessionStore(SESSION_KEYS.ENCRYPTION_KEY, masterKey);
  74. setJustSignedUp(true);
  75. setRecoveryModalView(true);
  76. } catch (e) {
  77. logError(e, "failed to generate password");
  78. setFieldError("passphrase", t("PASSWORD_GENERATION_FAILED"));
  79. }
  80. };
  81. return (
  82. <>
  83. {loading ? (
  84. <VerticallyCentered>
  85. <EnteSpinner />
  86. </VerticallyCentered>
  87. ) : recoverModalView ? (
  88. <RecoveryKey
  89. appContext={appContext}
  90. show={recoverModalView}
  91. onHide={() => {
  92. setRecoveryModalView(false);
  93. router.push(APP_HOMES.get(appName));
  94. }}
  95. somethingWentWrong={() => null}
  96. />
  97. ) : (
  98. <VerticallyCentered>
  99. <FormPaper>
  100. <FormTitle>{t("SET_PASSPHRASE")}</FormTitle>
  101. <SetPasswordForm
  102. userEmail={user?.email}
  103. callback={onSubmit}
  104. buttonText={t("SET_PASSPHRASE")}
  105. />
  106. <FormPaperFooter>
  107. <LinkButton onClick={logoutUser}>
  108. {t("GO_BACK")}
  109. </LinkButton>
  110. </FormPaperFooter>
  111. </FormPaper>
  112. </VerticallyCentered>
  113. )}
  114. </>
  115. );
  116. }