@metamask-previews/seedless-onboarding-controller 2.5.0-preview-5bf6b6e → 2.5.0-preview-1def870e

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
@@ -13,6 +13,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
13
13
  - Moved `@noble/ciphers` from dev dependencies to main dependencies and bumped from `^0.5.2` to `^1.3.0` ([#6101](https://github.com/MetaMask/core/pull/6101))
14
14
  - Moved `@noble/curves` from dev dependencies to main dependencies and bumped from `^1.2.0` to `^1.9.2` ([#6101](https://github.com/MetaMask/core/pull/6101))
15
15
 
16
+ ### Fixed
17
+
18
+ - Fixed the vault creation with incorrect revokeToken value after fetching new revoke token asynchronously. ([#6272](https://github.com/MetaMask/core/pull/6272))
19
+
16
20
  ## [2.5.0]
17
21
 
18
22
  ### Added
@@ -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_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
+ 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_decryptAndParseVaultData, _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;
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");
@@ -695,18 +695,20 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
695
695
  connection: this.state.authConnection,
696
696
  revokeToken,
697
697
  });
698
- this.update((state) => {
699
- // set new revoke token in state temporarily for persisting in vault
700
- state.revokeToken = newRevokeToken;
701
- // set new refresh token to persist in state
702
- state.refreshToken = newRefreshToken;
703
- });
704
- await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
705
- password,
706
- rawToprfEncryptionKey,
707
- rawToprfPwEncryptionKey,
708
- rawToprfAuthKeyPair,
709
- });
698
+ if (newRevokeToken && newRefreshToken) {
699
+ this.update((state) => {
700
+ // set new revoke token in state temporarily for persisting in vault
701
+ state.revokeToken = newRevokeToken;
702
+ // set new refresh token to persist in state
703
+ state.refreshToken = newRefreshToken;
704
+ });
705
+ await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
706
+ password,
707
+ rawToprfEncryptionKey,
708
+ rawToprfPwEncryptionKey,
709
+ rawToprfAuthKeyPair,
710
+ });
711
+ }
710
712
  });
711
713
  }
712
714
  /**
@@ -821,8 +823,8 @@ async function _SeedlessOnboardingController_getAccessToken(password) {
821
823
  if (!vault) {
822
824
  throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.InvalidAccessToken);
823
825
  }
824
- const { accessToken: accessTokenFromVault } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, password);
825
- return accessTokenFromVault;
826
+ const { parsedVaultData } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_decryptAndParseVaultData).call(this, password);
827
+ return parsedVaultData.accessToken;
826
828
  }, _SeedlessOnboardingController_setUnlocked = function _SeedlessOnboardingController_setUnlocked() {
827
829
  __classPrivateFieldSet(this, _SeedlessOnboardingController_isUnlocked, true, "f");
828
830
  }, _SeedlessOnboardingController_persistOprfKey =
@@ -1071,42 +1073,11 @@ async function _SeedlessOnboardingController_encryptAndStoreSecretData(params) {
1071
1073
  */
1072
1074
  async function _SeedlessOnboardingController_unlockVaultAndGetVaultData(password, encryptionKey) {
1073
1075
  return __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withVaultLock).call(this, async () => {
1074
- let { vaultEncryptionKey } = this.state;
1075
- const { vault: encryptedVault, vaultEncryptionSalt } = this.state;
1076
- if (!encryptedVault) {
1077
- throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.VaultError);
1078
- }
1079
- if (encryptionKey) {
1080
- vaultEncryptionKey = encryptionKey;
1081
- }
1082
- let decryptedVaultData;
1083
- const updatedState = {};
1084
- if (password) {
1085
- assertIsValidPassword(password);
1086
- // Note that vault decryption using the password is a very costly operation as it involves deriving the encryption key
1087
- // from the password using an intentionally slow key derivation function.
1088
- // We should make sure that we only call it very intentionally.
1089
- const result = await __classPrivateFieldGet(this, _SeedlessOnboardingController_vaultEncryptor, "f").decryptWithDetail(password, encryptedVault);
1090
- decryptedVaultData = result.vault;
1091
- updatedState.vaultEncryptionKey = result.exportedKeyString;
1092
- updatedState.vaultEncryptionSalt = result.salt;
1093
- }
1094
- else {
1095
- assertIsVaultEncryptionKeyDefined(vaultEncryptionKey);
1096
- const parsedEncryptedVault = JSON.parse(encryptedVault);
1097
- if (vaultEncryptionSalt &&
1098
- vaultEncryptionSalt !== parsedEncryptedVault.salt) {
1099
- throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.ExpiredCredentials);
1100
- }
1101
- const key = await __classPrivateFieldGet(this, _SeedlessOnboardingController_vaultEncryptor, "f").importKey(vaultEncryptionKey);
1102
- decryptedVaultData = await __classPrivateFieldGet(this, _SeedlessOnboardingController_vaultEncryptor, "f").decryptWithKey(key, parsedEncryptedVault);
1103
- updatedState.vaultEncryptionKey = vaultEncryptionKey;
1104
- updatedState.vaultEncryptionSalt = vaultEncryptionSalt;
1105
- }
1106
- const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, revokeToken, accessToken, } = __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_parseVaultData).call(this, decryptedVaultData);
1076
+ const { parsedVaultData, vaultEncryptionKey, vaultEncryptionSalt } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_decryptAndParseVaultData).call(this, password, encryptionKey);
1077
+ const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, revokeToken, accessToken, } = parsedVaultData;
1107
1078
  this.update((state) => {
1108
- state.vaultEncryptionKey = updatedState.vaultEncryptionKey;
1109
- state.vaultEncryptionSalt = updatedState.vaultEncryptionSalt;
1079
+ state.vaultEncryptionKey = vaultEncryptionKey;
1080
+ state.vaultEncryptionSalt = vaultEncryptionSalt;
1110
1081
  state.revokeToken = revokeToken;
1111
1082
  state.accessToken = accessToken;
1112
1083
  });
@@ -1118,6 +1089,50 @@ async function _SeedlessOnboardingController_unlockVaultAndGetVaultData(password
1118
1089
  accessToken,
1119
1090
  };
1120
1091
  });
1092
+ }, _SeedlessOnboardingController_decryptAndParseVaultData =
1093
+ /**
1094
+ * Decrypts the vault data and parses it into a usable format.
1095
+ *
1096
+ * @param password - The optional password to decrypt the vault.
1097
+ * @param encryptionKey - The optional encryption key to decrypt the vault.
1098
+ * @returns A promise that resolves to an object containing:
1099
+ */
1100
+ async function _SeedlessOnboardingController_decryptAndParseVaultData(password, encryptionKey) {
1101
+ let { vaultEncryptionKey, vaultEncryptionSalt } = this.state;
1102
+ const { vault: encryptedVault } = this.state;
1103
+ if (!encryptedVault) {
1104
+ throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.VaultError);
1105
+ }
1106
+ if (encryptionKey) {
1107
+ vaultEncryptionKey = encryptionKey;
1108
+ }
1109
+ let decryptedVaultData;
1110
+ if (password) {
1111
+ assertIsValidPassword(password);
1112
+ // Note that vault decryption using the password is a very costly operation as it involves deriving the encryption key
1113
+ // from the password using an intentionally slow key derivation function.
1114
+ // We should make sure that we only call it very intentionally.
1115
+ const result = await __classPrivateFieldGet(this, _SeedlessOnboardingController_vaultEncryptor, "f").decryptWithDetail(password, encryptedVault);
1116
+ decryptedVaultData = result.vault;
1117
+ vaultEncryptionKey = result.exportedKeyString;
1118
+ vaultEncryptionSalt = result.salt;
1119
+ }
1120
+ else {
1121
+ assertIsVaultEncryptionKeyDefined(vaultEncryptionKey);
1122
+ const parsedEncryptedVault = JSON.parse(encryptedVault);
1123
+ if (vaultEncryptionSalt &&
1124
+ vaultEncryptionSalt !== parsedEncryptedVault.salt) {
1125
+ throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.ExpiredCredentials);
1126
+ }
1127
+ const key = await __classPrivateFieldGet(this, _SeedlessOnboardingController_vaultEncryptor, "f").importKey(vaultEncryptionKey);
1128
+ decryptedVaultData = await __classPrivateFieldGet(this, _SeedlessOnboardingController_vaultEncryptor, "f").decryptWithKey(key, parsedEncryptedVault);
1129
+ }
1130
+ const parsedVaultData = __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_parseVaultData).call(this, decryptedVaultData);
1131
+ return {
1132
+ parsedVaultData,
1133
+ vaultEncryptionKey,
1134
+ vaultEncryptionSalt,
1135
+ };
1121
1136
  }, _SeedlessOnboardingController_withPersistedSecretMetadataBackupsState =
1122
1137
  /**
1123
1138
  * Executes a callback function that creates or restores secret data and persists their hashes in the controller state.
@@ -1184,18 +1199,20 @@ async function _SeedlessOnboardingController_withPersistedSecretMetadataBackupsS
1184
1199
  * @param params.password - The password to encrypt the vault.
1185
1200
  * @param params.rawToprfEncryptionKey - The encryption key to encrypt the vault.
1186
1201
  * @param params.rawToprfPwEncryptionKey - The encryption key to encrypt the password.
1187
- * @param params.rawToprfAuthKeyPair - The authentication key pair to encrypt the vault.
1202
+ * @param params.rawToprfAuthKeyPair - The authentication key pair for Toprf operations.
1203
+ * @param params.revokeToken - The optional revoke token.
1204
+ * @param params.shouldSetUnlocked - Whether to set the controller as unlocked. @default true
1188
1205
  */
1189
1206
  async function _SeedlessOnboardingController_createNewVaultWithAuthData({ password, rawToprfEncryptionKey, rawToprfPwEncryptionKey, rawToprfAuthKeyPair, }) {
1190
1207
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsAuthenticatedUser).call(this, this.state);
1208
+ const revokeToken = this.state.revokeToken;
1191
1209
  const accessToken = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_getAccessToken).call(this, password);
1192
- __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
1193
1210
  const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair } = __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_serializeKeyData).call(this, rawToprfEncryptionKey, rawToprfPwEncryptionKey, rawToprfAuthKeyPair);
1194
1211
  const serializedVaultData = JSON.stringify({
1195
1212
  toprfEncryptionKey,
1196
1213
  toprfPwEncryptionKey,
1197
1214
  toprfAuthKeyPair,
1198
- revokeToken: this.state.revokeToken,
1215
+ revokeToken,
1199
1216
  accessToken,
1200
1217
  });
1201
1218
  await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_updateVault).call(this, {
@@ -1207,6 +1224,7 @@ async function _SeedlessOnboardingController_createNewVaultWithAuthData({ passwo
1207
1224
  __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_persistAuthPubKey).call(this, {
1208
1225
  authPubKey: rawToprfAuthKeyPair.pk,
1209
1226
  });
1227
+ __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
1210
1228
  }, _SeedlessOnboardingController_updateVault =
1211
1229
  /**
1212
1230
  * Encrypt and update the vault with the given authentication data.