@metamask-previews/seedless-onboarding-controller 2.4.0-preview-bd86fa14 → 2.5.0-preview-3f5f144a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +14 -5
  2. package/dist/SeedlessOnboardingController.cjs +109 -57
  3. package/dist/SeedlessOnboardingController.cjs.map +1 -1
  4. package/dist/SeedlessOnboardingController.d.cts +15 -1
  5. package/dist/SeedlessOnboardingController.d.cts.map +1 -1
  6. package/dist/SeedlessOnboardingController.d.mts +15 -1
  7. package/dist/SeedlessOnboardingController.d.mts.map +1 -1
  8. package/dist/SeedlessOnboardingController.mjs +110 -58
  9. package/dist/SeedlessOnboardingController.mjs.map +1 -1
  10. package/dist/assertions.cjs +16 -1
  11. package/dist/assertions.cjs.map +1 -1
  12. package/dist/assertions.d.cts +7 -0
  13. package/dist/assertions.d.cts.map +1 -1
  14. package/dist/assertions.d.mts +7 -0
  15. package/dist/assertions.d.mts.map +1 -1
  16. package/dist/assertions.mjs +14 -0
  17. package/dist/assertions.mjs.map +1 -1
  18. package/dist/constants.cjs +3 -1
  19. package/dist/constants.cjs.map +1 -1
  20. package/dist/constants.d.cts +4 -2
  21. package/dist/constants.d.cts.map +1 -1
  22. package/dist/constants.d.mts +4 -2
  23. package/dist/constants.d.mts.map +1 -1
  24. package/dist/constants.mjs +3 -1
  25. package/dist/constants.mjs.map +1 -1
  26. package/dist/index.cjs +3 -1
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +1 -0
  29. package/dist/index.d.cts.map +1 -1
  30. package/dist/index.d.mts +1 -0
  31. package/dist/index.d.mts.map +1 -1
  32. package/dist/index.mjs +1 -0
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/types.cjs.map +1 -1
  35. package/dist/types.d.cts +6 -0
  36. package/dist/types.d.cts.map +1 -1
  37. package/dist/types.d.mts +6 -0
  38. package/dist/types.d.mts.map +1 -1
  39. package/dist/types.mjs.map +1 -1
  40. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"SeedlessOnboardingController.d.mts","sourceRoot":"","sources":["../src/SeedlessOnboardingController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SeedlessOnboardingController.d.mts","sourceRoot":"","sources":["../src/SeedlessOnboardingController.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _SeedlessOnboardingController_instances, _SeedlessOnboardingController_vaultEncryptor, _SeedlessOnboardingController_controllerOperationMutex, _SeedlessOnboardingController_vaultOperationMutex, _SeedlessOnboardingController_refreshJWTToken, _SeedlessOnboardingController_revokeRefreshToken, _SeedlessOnboardingController_isUnlocked, _SeedlessOnboardingController_submitGlobalPassword, _SeedlessOnboardingController_getAccessToken, _SeedlessOnboardingController_setUnlocked, _SeedlessOnboardingController_persistOprfKey, _SeedlessOnboardingController_persistAuthPubKey, _SeedlessOnboardingController_storeKeyringEncryptionKey, _SeedlessOnboardingController_loadKeyringEncryptionKey, _SeedlessOnboardingController_loadSeedlessEncryptionKey, _SeedlessOnboardingController_recoverAuthPubKey, _SeedlessOnboardingController_recoverEncKey, _SeedlessOnboardingController_fetchAllSecretDataFromMetadataStore, _SeedlessOnboardingController_changeEncryptionKey, _SeedlessOnboardingController_encryptAndStoreSecretData, _SeedlessOnboardingController_unlockVaultAndGetVaultData, _SeedlessOnboardingController_withPersistedSecretMetadataBackupsState, _SeedlessOnboardingController_filterDupesAndUpdateSocialBackupsMetadata, _SeedlessOnboardingController_createNewVaultWithAuthData, _SeedlessOnboardingController_updateVault, _SeedlessOnboardingController_withControllerLock, _SeedlessOnboardingController_withVaultLock, _SeedlessOnboardingController_serializeKeyData, _SeedlessOnboardingController_parseVaultData, _SeedlessOnboardingController_assertIsUnlocked, _SeedlessOnboardingController_assertIsAuthenticatedUser, _SeedlessOnboardingController_assertIsSRPBackedUpUser, _SeedlessOnboardingController_assertPasswordInSync, _SeedlessOnboardingController_resetPasswordOutdatedCache, _SeedlessOnboardingController_revokeRefreshTokenAndUpdateState, _SeedlessOnboardingController_isTokenExpiredError, _SeedlessOnboardingController_isMaxKeyChainLengthError, _SeedlessOnboardingController_executeWithTokenRefresh;
12
+ var _SeedlessOnboardingController_instances, _SeedlessOnboardingController_vaultEncryptor, _SeedlessOnboardingController_controllerOperationMutex, _SeedlessOnboardingController_vaultOperationMutex, _SeedlessOnboardingController_refreshJWTToken, _SeedlessOnboardingController_revokeRefreshToken, _SeedlessOnboardingController_isUnlocked, _SeedlessOnboardingController_passwordOutdatedCacheTTL, _SeedlessOnboardingController_submitGlobalPassword, _SeedlessOnboardingController_getAccessToken, _SeedlessOnboardingController_setUnlocked, _SeedlessOnboardingController_persistOprfKey, _SeedlessOnboardingController_persistAuthPubKey, _SeedlessOnboardingController_storeKeyringEncryptionKey, _SeedlessOnboardingController_loadKeyringEncryptionKey, _SeedlessOnboardingController_loadSeedlessEncryptionKey, _SeedlessOnboardingController_recoverAuthPubKey, _SeedlessOnboardingController_recoverEncKey, _SeedlessOnboardingController_fetchAllSecretDataFromMetadataStore, _SeedlessOnboardingController_changeEncryptionKey, _SeedlessOnboardingController_encryptAndStoreSecretData, _SeedlessOnboardingController_unlockVaultAndGetVaultData, _SeedlessOnboardingController_withPersistedSecretMetadataBackupsState, _SeedlessOnboardingController_filterDupesAndUpdateSocialBackupsMetadata, _SeedlessOnboardingController_createNewVaultWithAuthData, _SeedlessOnboardingController_updateVault, _SeedlessOnboardingController_withControllerLock, _SeedlessOnboardingController_withVaultLock, _SeedlessOnboardingController_serializeKeyData, _SeedlessOnboardingController_parseVaultData, _SeedlessOnboardingController_assertIsUnlocked, _SeedlessOnboardingController_assertIsAuthenticatedUser, _SeedlessOnboardingController_assertIsSRPBackedUpUser, _SeedlessOnboardingController_assertPasswordInSync, _SeedlessOnboardingController_resetPasswordOutdatedCache, _SeedlessOnboardingController_isTokenExpiredError, _SeedlessOnboardingController_isMaxKeyChainLengthError, _SeedlessOnboardingController_executeWithTokenRefresh;
13
13
  import { keccak256AndHexify } from "@metamask/auth-network-utils";
14
14
  import { BaseController } from "@metamask/base-controller";
15
15
  import { ToprfSecureBackup, TOPRFErrorCode, TOPRFError } from "@metamask/toprf-secure-backup";
@@ -19,7 +19,7 @@ import { bytesToUtf8, utf8ToBytes } from "@noble/ciphers/utils";
19
19
  import { managedNonce } from "@noble/ciphers/webcrypto";
20
20
  import { secp256k1 } from "@noble/curves/secp256k1";
21
21
  import { Mutex } from "async-mutex";
22
- import { assertIsValidVaultData } from "./assertions.mjs";
22
+ import { assertIsPasswordOutdatedCacheValid, assertIsValidVaultData } from "./assertions.mjs";
23
23
  import { controllerName, PASSWORD_OUTDATED_CACHE_TTL_MS, SecretType, SeedlessOnboardingControllerErrorMessage, Web3AuthNetwork } from "./constants.mjs";
24
24
  import { PasswordSyncError, RecoveryError } from "./errors.mjs";
25
25
  import { projectLogger, createModuleLogger } from "./logger.mjs";
@@ -132,8 +132,9 @@ export class SeedlessOnboardingController extends BaseController {
132
132
  * @param options.network - The network to be used for the Seedless Onboarding flow.
133
133
  * @param options.refreshJWTToken - A function to get a new jwt token using refresh token.
134
134
  * @param options.revokeRefreshToken - A function to revoke the refresh token.
135
+ * @param options.passwordOutdatedCacheTTL - The TTL of the password outdated cache in milliseconds.,
135
136
  */
136
- constructor({ messenger, state, encryptor, toprfKeyDeriver, network = Web3AuthNetwork.Mainnet, refreshJWTToken, revokeRefreshToken, }) {
137
+ constructor({ messenger, state, encryptor, toprfKeyDeriver, network = Web3AuthNetwork.Mainnet, refreshJWTToken, revokeRefreshToken, passwordOutdatedCacheTTL = PASSWORD_OUTDATED_CACHE_TTL_MS, }) {
137
138
  super({
138
139
  name: controllerName,
139
140
  metadata: seedlessOnboardingMetadata,
@@ -155,6 +156,12 @@ export class SeedlessOnboardingController extends BaseController {
155
156
  * The controller lock is synchronized with the keyring lock.
156
157
  */
157
158
  _SeedlessOnboardingController_isUnlocked.set(this, false);
159
+ /**
160
+ * The TTL of the password outdated cache in milliseconds.
161
+ */
162
+ _SeedlessOnboardingController_passwordOutdatedCacheTTL.set(this, void 0);
163
+ assertIsPasswordOutdatedCacheValid(passwordOutdatedCacheTTL);
164
+ __classPrivateFieldSet(this, _SeedlessOnboardingController_passwordOutdatedCacheTTL, passwordOutdatedCacheTTL, "f");
158
165
  __classPrivateFieldSet(this, _SeedlessOnboardingController_vaultEncryptor, encryptor, "f");
159
166
  this.toprfClient = new ToprfSecureBackup({
160
167
  network,
@@ -387,7 +394,7 @@ export class SeedlessOnboardingController extends BaseController {
387
394
  await this.verifyVaultPassword(oldPassword, {
388
395
  skipLock: true, // skip lock since we already have the lock
389
396
  });
390
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertPasswordInSync).call(this, {
397
+ const { latestKeyIndex } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertPasswordInSync).call(this, {
391
398
  skipCache: true,
392
399
  skipLock: true, // skip lock since we already have the lock
393
400
  });
@@ -401,6 +408,7 @@ export class SeedlessOnboardingController extends BaseController {
401
408
  const { encKey: newEncKey, pwEncKey: newPwEncKey, authKeyPair: newAuthKeyPair, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_changeEncryptionKey).call(this, {
402
409
  oldPassword,
403
410
  newPassword,
411
+ latestKeyIndex,
404
412
  });
405
413
  // update and encrypt the vault with new password
406
414
  await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
@@ -481,18 +489,8 @@ export class SeedlessOnboardingController extends BaseController {
481
489
  */
482
490
  async submitPassword(password) {
483
491
  return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withControllerLock).call(this, async () => {
484
- const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, revokeToken, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, password);
492
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, password);
485
493
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
486
- if (revokeToken) {
487
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_revokeRefreshTokenAndUpdateState).call(this, revokeToken);
488
- // re-creating vault to persist the new revoke token
489
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
490
- password,
491
- rawToprfEncryptionKey: toprfEncryptionKey,
492
- rawToprfPwEncryptionKey: toprfPwEncryptionKey,
493
- rawToprfAuthKeyPair: toprfAuthKeyPair,
494
- });
495
- }
496
494
  });
497
495
  }
498
496
  /**
@@ -560,6 +558,8 @@ export class SeedlessOnboardingController extends BaseController {
560
558
  * @description Check if the current password is outdated compare to the global password.
561
559
  *
562
560
  * @param options - Optional options object.
561
+ * @param options.globalAuthPubKey - The global auth public key to compare with the current auth public key.
562
+ * If not provided, the global auth public key will be fetched from the backend.
563
563
  * @param options.skipCache - If true, bypass the cache and force a fresh check.
564
564
  * @param options.skipLock - Whether to skip the lock acquisition. (to prevent deadlock in case the caller already acquired the lock)
565
565
  * @returns A promise that resolves to true if the password is outdated, false otherwise.
@@ -574,19 +574,28 @@ export class SeedlessOnboardingController extends BaseController {
574
574
  const now = Date.now();
575
575
  const isCacheValid = passwordOutdatedCache &&
576
576
  now - passwordOutdatedCache.timestamp <
577
- PASSWORD_OUTDATED_CACHE_TTL_MS;
577
+ __classPrivateFieldGet(this, _SeedlessOnboardingController_passwordOutdatedCacheTTL, "f");
578
578
  if (isCacheValid) {
579
579
  return passwordOutdatedCache.isExpiredPwd;
580
580
  }
581
581
  }
582
582
  const { nodeAuthTokens, authConnectionId, groupedAuthConnectionId, userId, } = this.state;
583
583
  const currentDeviceAuthPubKey = __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_recoverAuthPubKey).call(this);
584
- const { authPubKey: globalAuthPubKey } = await this.toprfClient.fetchAuthPubKey({
585
- nodeAuthTokens,
586
- authConnectionId,
587
- groupedAuthConnectionId,
588
- userId,
589
- });
584
+ let globalAuthPubKey = options?.globalAuthPubKey;
585
+ if (!globalAuthPubKey) {
586
+ const { authPubKey } = await this.toprfClient
587
+ .fetchAuthPubKey({
588
+ nodeAuthTokens,
589
+ authConnectionId,
590
+ groupedAuthConnectionId,
591
+ userId,
592
+ })
593
+ .catch((error) => {
594
+ log('Error fetching auth pub key', error);
595
+ throw new Error(SeedlessOnboardingControllerErrorMessage.FailedToFetchAuthPubKey);
596
+ });
597
+ globalAuthPubKey = authPubKey;
598
+ }
590
599
  // use noble lib to deserialize and compare curve point
591
600
  const isExpiredPwd = !secp256k1.ProjectivePoint.fromHex(currentDeviceAuthPubKey).equals(secp256k1.ProjectivePoint.fromHex(globalAuthPubKey));
592
601
  // Cache the result in state
@@ -662,6 +671,40 @@ export class SeedlessOnboardingController extends BaseController {
662
671
  throw new Error(SeedlessOnboardingControllerErrorMessage.AuthenticationError);
663
672
  }
664
673
  }
674
+ /**
675
+ * Revoke the refresh token and get new refresh token and new revoke token
676
+ * and also updates the vault with the new revoke token.
677
+ * This method is to be called after user is authenticated.
678
+ *
679
+ * @param password - The password to encrypt the vault.
680
+ * @returns A Promise that resolves to void.
681
+ */
682
+ async revokeRefreshToken(password) {
683
+ return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withControllerLock).call(this, async () => {
684
+ __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsAuthenticatedUser).call(this, this.state);
685
+ const { vaultEncryptionKey } = this.state;
686
+ const { toprfEncryptionKey: rawToprfEncryptionKey, toprfPwEncryptionKey: rawToprfPwEncryptionKey, toprfAuthKeyPair: rawToprfAuthKeyPair, revokeToken, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, password, vaultEncryptionKey);
687
+ if (!revokeToken) {
688
+ throw new Error(SeedlessOnboardingControllerErrorMessage.InvalidRevokeToken);
689
+ }
690
+ const { newRevokeToken, newRefreshToken } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_revokeRefreshToken, "f").call(this, {
691
+ connection: this.state.authConnection,
692
+ revokeToken,
693
+ });
694
+ this.update((state) => {
695
+ // set new revoke token in state temporarily for persisting in vault
696
+ state.revokeToken = newRevokeToken;
697
+ // set new refresh token to persist in state
698
+ state.refreshToken = newRefreshToken;
699
+ });
700
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
701
+ password,
702
+ rawToprfEncryptionKey,
703
+ rawToprfPwEncryptionKey,
704
+ rawToprfAuthKeyPair,
705
+ });
706
+ });
707
+ }
665
708
  /**
666
709
  * Check if the current node auth token is expired.
667
710
  *
@@ -715,7 +758,7 @@ export class SeedlessOnboardingController extends BaseController {
715
758
  }
716
759
  }
717
760
  }
718
- _SeedlessOnboardingController_vaultEncryptor = new WeakMap(), _SeedlessOnboardingController_controllerOperationMutex = new WeakMap(), _SeedlessOnboardingController_vaultOperationMutex = new WeakMap(), _SeedlessOnboardingController_refreshJWTToken = new WeakMap(), _SeedlessOnboardingController_revokeRefreshToken = new WeakMap(), _SeedlessOnboardingController_isUnlocked = new WeakMap(), _SeedlessOnboardingController_instances = new WeakSet(), _SeedlessOnboardingController_submitGlobalPassword =
761
+ _SeedlessOnboardingController_vaultEncryptor = new WeakMap(), _SeedlessOnboardingController_controllerOperationMutex = new WeakMap(), _SeedlessOnboardingController_vaultOperationMutex = new WeakMap(), _SeedlessOnboardingController_refreshJWTToken = new WeakMap(), _SeedlessOnboardingController_revokeRefreshToken = new WeakMap(), _SeedlessOnboardingController_isUnlocked = new WeakMap(), _SeedlessOnboardingController_passwordOutdatedCacheTTL = new WeakMap(), _SeedlessOnboardingController_instances = new WeakSet(), _SeedlessOnboardingController_submitGlobalPassword =
719
762
  /**
720
763
  * @description Submit the global password to the controller, verify the
721
764
  * password validity and unlock the controller.
@@ -741,19 +784,8 @@ async function _SeedlessOnboardingController_submitGlobalPassword({ targetAuthPu
741
784
  const { pwEncKey } = res;
742
785
  const vaultKey = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_loadSeedlessEncryptionKey).call(this, pwEncKey);
743
786
  // Unlock the controller
744
- const { revokeToken, toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, undefined, vaultKey);
787
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, undefined, vaultKey);
745
788
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
746
- if (revokeToken) {
747
- // revoke and recyle refresh token after unlock to keep refresh token fresh, avoid malicious use of leaked refresh token
748
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_revokeRefreshTokenAndUpdateState).call(this, revokeToken);
749
- // re-creating vault to persist the new revoke token
750
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
751
- password: globalPassword,
752
- rawToprfEncryptionKey: toprfEncryptionKey,
753
- rawToprfPwEncryptionKey: toprfPwEncryptionKey,
754
- rawToprfAuthKeyPair: toprfAuthKeyPair,
755
- });
756
- }
757
789
  }
758
790
  catch (error) {
759
791
  if (__classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_isTokenExpiredError).call(this, error)) {
@@ -927,12 +959,31 @@ async function _SeedlessOnboardingController_recoverEncKey(password) {
927
959
  * @param params - The function parameters.
928
960
  * @param params.oldPassword - The old password to verify.
929
961
  * @param params.newPassword - The new password to update.
962
+ * @param params.latestKeyIndex - The key index of the latest key.
930
963
  * @returns A promise that resolves to new encryption key and authentication key pair.
931
964
  */
932
- async function _SeedlessOnboardingController_changeEncryptionKey({ oldPassword, newPassword, }) {
965
+ async function _SeedlessOnboardingController_changeEncryptionKey({ oldPassword, newPassword, latestKeyIndex, }) {
933
966
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsAuthenticatedUser).call(this, this.state);
934
967
  const { authConnectionId, groupedAuthConnectionId, userId } = this.state;
935
- const { encKey, pwEncKey, authKeyPair, keyShareIndex: newKeyShareIndex, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_recoverEncKey).call(this, oldPassword);
968
+ let encKey;
969
+ let pwEncKey;
970
+ let authKeyPair;
971
+ let globalKeyIndex = latestKeyIndex;
972
+ if (!globalKeyIndex) {
973
+ ({
974
+ encKey,
975
+ pwEncKey,
976
+ authKeyPair,
977
+ keyShareIndex: globalKeyIndex,
978
+ } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_recoverEncKey).call(this, oldPassword));
979
+ }
980
+ else {
981
+ ({
982
+ toprfEncryptionKey: encKey,
983
+ toprfPwEncryptionKey: pwEncKey,
984
+ toprfAuthKeyPair: authKeyPair,
985
+ } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, oldPassword));
986
+ }
936
987
  const result = await this.toprfClient.changeEncKey({
937
988
  nodeAuthTokens: this.state.nodeAuthTokens,
938
989
  authConnectionId,
@@ -941,7 +992,7 @@ async function _SeedlessOnboardingController_changeEncryptionKey({ oldPassword,
941
992
  oldEncKey: encKey,
942
993
  oldPwEncKey: pwEncKey,
943
994
  oldAuthKeyPair: authKeyPair,
944
- newKeyShareIndex,
995
+ newKeyShareIndex: globalKeyIndex,
945
996
  newPassword,
946
997
  });
947
998
  return result;
@@ -1283,36 +1334,37 @@ async function _SeedlessOnboardingController_withVaultLock(callback) {
1283
1334
  * @param options - The options for asserting the password is in sync.
1284
1335
  * @param options.skipCache - Whether to skip the cache check.
1285
1336
  * @param options.skipLock - Whether to skip the lock acquisition. (to prevent deadlock in case the caller already acquired the lock)
1337
+ * @returns The global auth public key and the latest key index.
1286
1338
  * @throws If the password is outdated.
1287
1339
  */
1288
1340
  async function _SeedlessOnboardingController_assertPasswordInSync(options) {
1289
- const isPasswordOutdated = await this.checkIsPasswordOutdated(options);
1341
+ const { nodeAuthTokens, authConnectionId, groupedAuthConnectionId, userId, } = this.state;
1342
+ if (!nodeAuthTokens || !authConnectionId || !userId) {
1343
+ throw new Error(SeedlessOnboardingControllerErrorMessage.MissingAuthUserInfo);
1344
+ }
1345
+ const { authPubKey, keyIndex: latestKeyIndex } = await this.toprfClient
1346
+ .fetchAuthPubKey({
1347
+ nodeAuthTokens,
1348
+ authConnectionId,
1349
+ groupedAuthConnectionId,
1350
+ userId,
1351
+ })
1352
+ .catch((error) => {
1353
+ log('Error fetching auth pub key', error);
1354
+ throw new Error(SeedlessOnboardingControllerErrorMessage.FailedToFetchAuthPubKey);
1355
+ });
1356
+ const isPasswordOutdated = await this.checkIsPasswordOutdated({
1357
+ ...options,
1358
+ globalAuthPubKey: authPubKey,
1359
+ });
1290
1360
  if (isPasswordOutdated) {
1291
1361
  throw new Error(SeedlessOnboardingControllerErrorMessage.OutdatedPassword);
1292
1362
  }
1363
+ return { authPubKey, latestKeyIndex };
1293
1364
  }, _SeedlessOnboardingController_resetPasswordOutdatedCache = function _SeedlessOnboardingController_resetPasswordOutdatedCache() {
1294
1365
  this.update((state) => {
1295
1366
  delete state.passwordOutdatedCache;
1296
1367
  });
1297
- }, _SeedlessOnboardingController_revokeRefreshTokenAndUpdateState =
1298
- /**
1299
- * Revoke the refresh token and get new refresh token and new revoke token.
1300
- * This method is to be called after user is authenticated.
1301
- *
1302
- * @param revokeToken - The revoke token to use for revoking the refresh token.
1303
- */
1304
- async function _SeedlessOnboardingController_revokeRefreshTokenAndUpdateState(revokeToken) {
1305
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsAuthenticatedUser).call(this, this.state);
1306
- const { newRevokeToken, newRefreshToken } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_revokeRefreshToken, "f").call(this, {
1307
- connection: this.state.authConnection,
1308
- revokeToken,
1309
- });
1310
- this.update((state) => {
1311
- // set new revoke token in state temporarily for persisting in vault
1312
- state.revokeToken = newRevokeToken;
1313
- // set new refresh token to persist in state
1314
- state.refreshToken = newRefreshToken;
1315
- });
1316
1368
  }, _SeedlessOnboardingController_isTokenExpiredError = function _SeedlessOnboardingController_isTokenExpiredError(error) {
1317
1369
  if (error instanceof TOPRFError) {
1318
1370
  // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison