@metamask-previews/seedless-onboarding-controller 2.3.0-preview-91d59c3 → 2.3.0-preview-feec3582

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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,14 @@ 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 `getAccessToken` public method in the seedless-onboarding-controller. ([#6155](https://github.com/MetaMask/core/pull/6155))
13
+
14
+ ### Fixed
15
+
16
+ - Retrieve `accessToken` from the encrypted vault if it's not available as an in-memory state. ([#6155](https://github.com/MetaMask/core/pull/6155))
17
+
10
18
  ## [2.3.0]
11
19
 
12
20
  ### Uncategorized
@@ -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_setUnlocked, _SeedlessOnboardingController_persistOprfKey, _SeedlessOnboardingController_persistAuthPubKey, _SeedlessOnboardingController_storeKeyringEncryptionKey, _SeedlessOnboardingController_loadKeyringEncryptionKey, _SeedlessOnboardingController_loadSeedlessEncryptionKey, _SeedlessOnboardingController_recoverAuthPubKey, _SeedlessOnboardingController_recoverEncKey, _SeedlessOnboardingController_fetchAllSecretDataFromMetadataStore, _SeedlessOnboardingController_changeEncryptionKey, _SeedlessOnboardingController_encryptAndStoreSecretData, _SeedlessOnboardingController_unlockVaultAndGetBackupEncKey, _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_submitGlobalPassword, _SeedlessOnboardingController_setUnlocked, _SeedlessOnboardingController_persistOprfKey, _SeedlessOnboardingController_persistAuthPubKey, _SeedlessOnboardingController_storeKeyringEncryptionKey, _SeedlessOnboardingController_loadKeyringEncryptionKey, _SeedlessOnboardingController_loadSeedlessEncryptionKey, _SeedlessOnboardingController_recoverAuthPubKey, _SeedlessOnboardingController_recoverEncKey, _SeedlessOnboardingController_fetchAllSecretDataFromMetadataStore, _SeedlessOnboardingController_changeEncryptionKey, _SeedlessOnboardingController_encryptAndStoreSecretData, _SeedlessOnboardingController_unlockVaultAndGetBackupEncKeyAndTokens, _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");
@@ -317,7 +317,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
317
317
  });
318
318
  const performBackup = async () => {
319
319
  // verify the password and unlock the vault
320
- const { toprfEncryptionKey, toprfAuthKeyPair } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKey).call(this);
320
+ const { toprfEncryptionKey, toprfAuthKeyPair } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKeyAndTokens).call(this);
321
321
  // encrypt and store the secret data
322
322
  await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_encryptAndStoreSecretData).call(this, {
323
323
  data,
@@ -354,7 +354,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
354
354
  else {
355
355
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsUnlocked).call(this);
356
356
  // verify the password and unlock the vault
357
- const keysFromVault = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKey).call(this);
357
+ const keysFromVault = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKeyAndTokens).call(this);
358
358
  encKey = keysFromVault.toprfEncryptionKey;
359
359
  pwEncKey = keysFromVault.toprfPwEncryptionKey;
360
360
  authKeyPair = keysFromVault.toprfAuthKeyPair;
@@ -485,7 +485,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
485
485
  */
486
486
  async submitPassword(password) {
487
487
  return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withControllerLock).call(this, async () => {
488
- const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, revokeToken, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKey).call(this, password);
488
+ const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, revokeToken, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKeyAndTokens).call(this, password);
489
489
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
490
490
  if (revokeToken) {
491
491
  await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_revokeRefreshTokenAndUpdateState).call(this, revokeToken);
@@ -603,6 +603,28 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
603
603
  ? await doCheckIsPasswordExpired()
604
604
  : await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withControllerLock).call(this, doCheckIsPasswordExpired), 'checkIsPasswordOutdated');
605
605
  }
606
+ /**
607
+ * Get the access token from the state or the vault.
608
+ * If the access token is not in the state, it will be retrieved from the vault by decrypting it with the password.
609
+ *
610
+ * If both the access token and the vault are not available, an error will be thrown.
611
+ *
612
+ * @param password - The password to unlock the vault.
613
+ * @returns The access token.
614
+ */
615
+ async getAccessToken(password) {
616
+ const { accessToken, vault } = this.state;
617
+ if (accessToken) {
618
+ // if the access token is in the state, return it
619
+ return accessToken;
620
+ }
621
+ // otherwise, check the vault availability and decrypt the access token from the vault
622
+ if (!vault) {
623
+ throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.InvalidAccessToken);
624
+ }
625
+ const { accessToken: accessTokenFromVault } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKeyAndTokens).call(this, password);
626
+ return accessTokenFromVault;
627
+ }
606
628
  /**
607
629
  * Clears the current state of the SeedlessOnboardingController.
608
630
  */
@@ -619,7 +641,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
619
641
  * @param keyringEncryptionKey - The keyring encryption key.
620
642
  */
621
643
  async storeKeyringEncryptionKey(keyringEncryptionKey) {
622
- const { toprfPwEncryptionKey: encKey } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKey).call(this);
644
+ const { toprfPwEncryptionKey: encKey } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKeyAndTokens).call(this);
623
645
  await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_storeKeyringEncryptionKey).call(this, encKey, keyringEncryptionKey);
624
646
  }
625
647
  /**
@@ -629,7 +651,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
629
651
  * @returns The keyring encryption key.
630
652
  */
631
653
  async loadKeyringEncryptionKey() {
632
- const { toprfPwEncryptionKey: encKey } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKey).call(this);
654
+ const { toprfPwEncryptionKey: encKey } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKeyAndTokens).call(this);
633
655
  return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_loadKeyringEncryptionKey).call(this, encKey);
634
656
  }
635
657
  /**
@@ -746,7 +768,7 @@ async function _SeedlessOnboardingController_submitGlobalPassword({ targetAuthPu
746
768
  const { pwEncKey } = res;
747
769
  const vaultKey = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_loadSeedlessEncryptionKey).call(this, pwEncKey);
748
770
  // Unlock the controller
749
- const { revokeToken, toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKey).call(this, undefined, vaultKey);
771
+ const { revokeToken, toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetBackupEncKeyAndTokens).call(this, undefined, vaultKey);
750
772
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
751
773
  if (revokeToken) {
752
774
  // revoke and recyle refresh token after unlock to keep refresh token fresh, avoid malicious use of leaked refresh token
@@ -978,7 +1000,7 @@ async function _SeedlessOnboardingController_encryptAndStoreSecretData(params) {
978
1000
  log('Error encrypting and storing secret data backup', error);
979
1001
  throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.FailedToEncryptAndStoreSecretData);
980
1002
  }
981
- }, _SeedlessOnboardingController_unlockVaultAndGetBackupEncKey =
1003
+ }, _SeedlessOnboardingController_unlockVaultAndGetBackupEncKeyAndTokens =
982
1004
  /**
983
1005
  * Unlocks the encrypted vault using the provided password and returns the decrypted vault data.
984
1006
  * This method ensures thread-safety by using a mutex lock when accessing the vault.
@@ -988,13 +1010,15 @@ async function _SeedlessOnboardingController_encryptAndStoreSecretData(params) {
988
1010
  * @returns A promise that resolves to an object containing:
989
1011
  * - toprfEncryptionKey: The decrypted TOPRF encryption key
990
1012
  * - toprfAuthKeyPair: The decrypted TOPRF authentication key pair
1013
+ * - revokeToken: The decrypted revoke token
1014
+ * - accessToken: The decrypted access token
991
1015
  * @throws {Error} If:
992
1016
  * - The password is invalid or empty
993
1017
  * - The vault is not initialized
994
1018
  * - The password is incorrect (from encryptor.decrypt)
995
1019
  * - The decrypted vault data is malformed
996
1020
  */
997
- async function _SeedlessOnboardingController_unlockVaultAndGetBackupEncKey(password, encryptionKey) {
1021
+ async function _SeedlessOnboardingController_unlockVaultAndGetBackupEncKeyAndTokens(password, encryptionKey) {
998
1022
  return __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withVaultLock).call(this, async () => {
999
1023
  let { vaultEncryptionKey } = this.state;
1000
1024
  const { vault: encryptedVault, vaultEncryptionSalt } = this.state;
@@ -1113,9 +1137,7 @@ async function _SeedlessOnboardingController_withPersistedSecretMetadataBackupsS
1113
1137
  */
1114
1138
  async function _SeedlessOnboardingController_createNewVaultWithAuthData({ password, rawToprfEncryptionKey, rawToprfPwEncryptionKey, rawToprfAuthKeyPair, }) {
1115
1139
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsAuthenticatedUser).call(this, this.state);
1116
- if (!this.state.accessToken) {
1117
- throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.InvalidAccessToken);
1118
- }
1140
+ const accessToken = await this.getAccessToken(password);
1119
1141
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
1120
1142
  const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair } = __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_serializeKeyData).call(this, rawToprfEncryptionKey, rawToprfPwEncryptionKey, rawToprfAuthKeyPair);
1121
1143
  const serializedVaultData = JSON.stringify({
@@ -1123,7 +1145,7 @@ async function _SeedlessOnboardingController_createNewVaultWithAuthData({ passwo
1123
1145
  toprfPwEncryptionKey,
1124
1146
  toprfAuthKeyPair,
1125
1147
  revokeToken: this.state.revokeToken,
1126
- accessToken: this.state.accessToken,
1148
+ accessToken,
1127
1149
  });
1128
1150
  await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_updateVault).call(this, {
1129
1151
  password,