@metamask-previews/seedless-onboarding-controller 2.4.0-preview-89ee3f6 → 2.4.0-preview-4aa55b88

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 +9 -0
  2. package/dist/SeedlessOnboardingController.cjs +51 -51
  3. package/dist/SeedlessOnboardingController.cjs.map +1 -1
  4. package/dist/SeedlessOnboardingController.d.cts +2 -13
  5. package/dist/SeedlessOnboardingController.d.cts.map +1 -1
  6. package/dist/SeedlessOnboardingController.d.mts +2 -13
  7. package/dist/SeedlessOnboardingController.d.mts.map +1 -1
  8. package/dist/SeedlessOnboardingController.mjs +52 -52
  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 +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Added
11
+
12
+ - Added an optional parameter, `passwordOutdatedCacheTTL` to the constructor params and exported `SecretMetadata` class from the controller.([#6169](https://github.com/MetaMask/core/pull/6169))
13
+
14
+ ### Removed
15
+
16
+ - Removed `syncLatestGlobalPassword` from the Controller. ([#6180](https://github.com/MetaMask/core/pull/6180))
17
+ - Moved the vault syncing to the `submitGlobalPassword` method
18
+
10
19
  ## [2.4.0]
11
20
 
12
21
  ### Fixed
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  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");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- 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;
13
+ 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_revokeRefreshTokenAndUpdateState, _SeedlessOnboardingController_isTokenExpiredError, _SeedlessOnboardingController_isMaxKeyChainLengthError, _SeedlessOnboardingController_executeWithTokenRefresh;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.SeedlessOnboardingController = exports.getDefaultSeedlessOnboardingControllerState = void 0;
16
16
  const auth_network_utils_1 = require("@metamask/auth-network-utils");
@@ -136,8 +136,9 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
136
136
  * @param options.network - The network to be used for the Seedless Onboarding flow.
137
137
  * @param options.refreshJWTToken - A function to get a new jwt token using refresh token.
138
138
  * @param options.revokeRefreshToken - A function to revoke the refresh token.
139
+ * @param options.passwordOutdatedCacheTTL - The TTL of the password outdated cache in milliseconds.,
139
140
  */
140
- constructor({ messenger, state, encryptor, toprfKeyDeriver, network = constants_1.Web3AuthNetwork.Mainnet, refreshJWTToken, revokeRefreshToken, }) {
141
+ constructor({ messenger, state, encryptor, toprfKeyDeriver, network = constants_1.Web3AuthNetwork.Mainnet, refreshJWTToken, revokeRefreshToken, passwordOutdatedCacheTTL = constants_1.PASSWORD_OUTDATED_CACHE_TTL_MS, }) {
141
142
  super({
142
143
  name: constants_1.controllerName,
143
144
  metadata: seedlessOnboardingMetadata,
@@ -159,6 +160,12 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
159
160
  * The controller lock is synchronized with the keyring lock.
160
161
  */
161
162
  _SeedlessOnboardingController_isUnlocked.set(this, false);
163
+ /**
164
+ * The TTL of the password outdated cache in milliseconds.
165
+ */
166
+ _SeedlessOnboardingController_passwordOutdatedCacheTTL.set(this, void 0);
167
+ (0, assertions_1.assertIsPasswordOutdatedCacheValid)(passwordOutdatedCacheTTL);
168
+ __classPrivateFieldSet(this, _SeedlessOnboardingController_passwordOutdatedCacheTTL, passwordOutdatedCacheTTL, "f");
162
169
  __classPrivateFieldSet(this, _SeedlessOnboardingController_vaultEncryptor, encryptor, "f");
163
170
  this.toprfClient = new toprf_secure_backup_1.ToprfSecureBackup({
164
171
  network,
@@ -514,33 +521,6 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
514
521
  });
515
522
  __classPrivateFieldSet(this, _SeedlessOnboardingController_isUnlocked, false, "f");
516
523
  }
517
- /**
518
- * Sync the latest global password to the controller.
519
- * reset vault with latest globalPassword,
520
- * persist the latest global password authPubKey
521
- *
522
- * @param params - The parameters for syncing the latest global password.
523
- * @param params.globalPassword - The latest global password.
524
- * @returns A promise that resolves to the success of the operation.
525
- */
526
- async syncLatestGlobalPassword({ globalPassword, }) {
527
- return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withControllerLock).call(this, async () => {
528
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this);
529
- const doSyncPassword = async () => {
530
- // update vault with latest globalPassword
531
- const { encKey, pwEncKey, authKeyPair } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_recoverEncKey).call(this, globalPassword);
532
- // update and encrypt the vault with new password
533
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
534
- password: globalPassword,
535
- rawToprfEncryptionKey: encKey,
536
- rawToprfPwEncryptionKey: pwEncKey,
537
- rawToprfAuthKeyPair: authKeyPair,
538
- });
539
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_resetPasswordOutdatedCache).call(this);
540
- };
541
- return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_executeWithTokenRefresh).call(this, doSyncPassword, 'syncLatestGlobalPassword');
542
- });
543
- }
544
524
  /**
545
525
  * @description Unlock the controller with the latest global password.
546
526
  *
@@ -581,7 +561,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
581
561
  const now = Date.now();
582
562
  const isCacheValid = passwordOutdatedCache &&
583
563
  now - passwordOutdatedCache.timestamp <
584
- constants_1.PASSWORD_OUTDATED_CACHE_TTL_MS;
564
+ __classPrivateFieldGet(this, _SeedlessOnboardingController_passwordOutdatedCacheTTL, "f");
585
565
  if (isCacheValid) {
586
566
  return passwordOutdatedCache.isExpiredPwd;
587
567
  }
@@ -590,11 +570,16 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
590
570
  const currentDeviceAuthPubKey = __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_recoverAuthPubKey).call(this);
591
571
  let globalAuthPubKey = options?.globalAuthPubKey;
592
572
  if (!globalAuthPubKey) {
593
- const { authPubKey } = await this.toprfClient.fetchAuthPubKey({
573
+ const { authPubKey } = await this.toprfClient
574
+ .fetchAuthPubKey({
594
575
  nodeAuthTokens,
595
576
  authConnectionId,
596
577
  groupedAuthConnectionId,
597
578
  userId,
579
+ })
580
+ .catch((error) => {
581
+ log('Error fetching auth pub key', error);
582
+ throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.FailedToFetchAuthPubKey);
598
583
  });
599
584
  globalAuthPubKey = authPubKey;
600
585
  }
@@ -727,7 +712,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
727
712
  }
728
713
  }
729
714
  exports.SeedlessOnboardingController = SeedlessOnboardingController;
730
- _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 =
715
+ _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 =
731
716
  /**
732
717
  * @description Submit the global password to the controller, verify the
733
718
  * password validity and unlock the controller.
@@ -741,31 +726,32 @@ _SeedlessOnboardingController_vaultEncryptor = new WeakMap(), _SeedlessOnboardin
741
726
  * corresponding to the current authPubKey in state.
742
727
  */
743
728
  async function _SeedlessOnboardingController_submitGlobalPassword({ targetAuthPubKey, globalPassword, maxKeyChainLength, }) {
744
- const { pwEncKey: curPwEncKey, authKeyPair: curAuthKeyPair } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_recoverEncKey).call(this, globalPassword);
729
+ const { pwEncKey: latestPwEncKey, authKeyPair: latestAuthKeyPair, encKey: latestEncKey, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_recoverEncKey).call(this, globalPassword);
745
730
  try {
746
731
  // Recover vault encryption key.
747
- const res = await this.toprfClient.recoverPwEncKey({
732
+ const { pwEncKey } = await this.toprfClient.recoverPwEncKey({
748
733
  targetAuthPubKey,
749
- curPwEncKey,
750
- curAuthKeyPair,
734
+ curPwEncKey: latestPwEncKey,
735
+ curAuthKeyPair: latestAuthKeyPair,
751
736
  maxPwChainLength: maxKeyChainLength,
752
737
  });
753
- const { pwEncKey } = res;
754
738
  const vaultKey = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_loadSeedlessEncryptionKey).call(this, pwEncKey);
739
+ const keyringEncryptionKey = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_loadKeyringEncryptionKey).call(this, pwEncKey);
755
740
  // Unlock the controller
756
- const { revokeToken, toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, undefined, vaultKey);
741
+ const { revokeToken } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, undefined, vaultKey);
757
742
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
758
743
  if (revokeToken) {
759
744
  // revoke and recyle refresh token after unlock to keep refresh token fresh, avoid malicious use of leaked refresh token
760
745
  await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_revokeRefreshTokenAndUpdateState).call(this, revokeToken);
761
- // re-creating vault to persist the new revoke token
762
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
763
- password: globalPassword,
764
- rawToprfEncryptionKey: toprfEncryptionKey,
765
- rawToprfPwEncryptionKey: toprfPwEncryptionKey,
766
- rawToprfAuthKeyPair: toprfAuthKeyPair,
767
- });
768
746
  }
747
+ // re-creating vault to persist the new revoke token
748
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
749
+ password: globalPassword,
750
+ rawToprfEncryptionKey: latestEncKey,
751
+ rawToprfPwEncryptionKey: latestPwEncKey,
752
+ rawToprfAuthKeyPair: latestAuthKeyPair,
753
+ });
754
+ await this.storeKeyringEncryptionKey(keyringEncryptionKey);
769
755
  }
770
756
  catch (error) {
771
757
  if (__classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_isTokenExpiredError).call(this, error)) {
@@ -945,16 +931,25 @@ async function _SeedlessOnboardingController_recoverEncKey(password) {
945
931
  async function _SeedlessOnboardingController_changeEncryptionKey({ oldPassword, newPassword, latestKeyIndex, }) {
946
932
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsAuthenticatedUser).call(this, this.state);
947
933
  const { authConnectionId, groupedAuthConnectionId, userId } = this.state;
948
- let { toprfEncryptionKey: encKey, toprfPwEncryptionKey: pwEncKey, toprfAuthKeyPair: authKeyPair, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, oldPassword);
949
- let newKeyShareIndex = latestKeyIndex;
950
- if (!newKeyShareIndex || !encKey || !pwEncKey || !authKeyPair) {
934
+ let encKey;
935
+ let pwEncKey;
936
+ let authKeyPair;
937
+ let globalKeyIndex = latestKeyIndex;
938
+ if (!globalKeyIndex) {
951
939
  ({
952
940
  encKey,
953
941
  pwEncKey,
954
942
  authKeyPair,
955
- keyShareIndex: newKeyShareIndex,
943
+ keyShareIndex: globalKeyIndex,
956
944
  } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_recoverEncKey).call(this, oldPassword));
957
945
  }
946
+ else {
947
+ ({
948
+ toprfEncryptionKey: encKey,
949
+ toprfPwEncryptionKey: pwEncKey,
950
+ toprfAuthKeyPair: authKeyPair,
951
+ } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, oldPassword));
952
+ }
958
953
  const result = await this.toprfClient.changeEncKey({
959
954
  nodeAuthTokens: this.state.nodeAuthTokens,
960
955
  authConnectionId,
@@ -963,7 +958,7 @@ async function _SeedlessOnboardingController_changeEncryptionKey({ oldPassword,
963
958
  oldEncKey: encKey,
964
959
  oldPwEncKey: pwEncKey,
965
960
  oldAuthKeyPair: authKeyPair,
966
- newKeyShareIndex,
961
+ newKeyShareIndex: globalKeyIndex,
967
962
  newPassword,
968
963
  });
969
964
  return result;
@@ -1313,11 +1308,16 @@ async function _SeedlessOnboardingController_assertPasswordInSync(options) {
1313
1308
  if (!nodeAuthTokens || !authConnectionId || !userId) {
1314
1309
  throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.MissingAuthUserInfo);
1315
1310
  }
1316
- const { authPubKey, keyIndex: latestKeyIndex } = await this.toprfClient.fetchAuthPubKey({
1311
+ const { authPubKey, keyIndex: latestKeyIndex } = await this.toprfClient
1312
+ .fetchAuthPubKey({
1317
1313
  nodeAuthTokens,
1318
1314
  authConnectionId,
1319
1315
  groupedAuthConnectionId,
1320
1316
  userId,
1317
+ })
1318
+ .catch((error) => {
1319
+ log('Error fetching auth pub key', error);
1320
+ throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.FailedToFetchAuthPubKey);
1321
1321
  });
1322
1322
  const isPasswordOutdated = await this.checkIsPasswordOutdated({
1323
1323
  ...options,