@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 +4 -0
- package/dist/SeedlessOnboardingController.cjs +71 -53
- package/dist/SeedlessOnboardingController.cjs.map +1 -1
- package/dist/SeedlessOnboardingController.d.cts.map +1 -1
- package/dist/SeedlessOnboardingController.d.mts.map +1 -1
- package/dist/SeedlessOnboardingController.mjs +71 -53
- package/dist/SeedlessOnboardingController.mjs.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
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 {
|
|
825
|
-
return
|
|
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
|
-
|
|
1075
|
-
const {
|
|
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 =
|
|
1109
|
-
state.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
|
|
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
|
|
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.
|