@metamask-previews/seedless-onboarding-controller 2.3.0-preview-74230359 → 2.4.0-preview-04ab3e60
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 +8 -1
- package/dist/SeedlessOnboardingController.cjs +37 -16
- 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 +37 -16
- package/dist/SeedlessOnboardingController.mjs.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.4.0]
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- Retrieve `accessToken` from the encrypted vault if it's not available as an in-memory state. ([#6155](https://github.com/MetaMask/core/pull/6155))
|
|
15
|
+
|
|
10
16
|
## [2.3.0]
|
|
11
17
|
|
|
12
18
|
### Uncategorized
|
|
@@ -108,7 +114,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
108
114
|
- `checkIsPasswordOutdated`: Check if the password is current device is outdated, i.e. user changed password in another device.
|
|
109
115
|
- `clearState`: Reset the state of the controller to the defaults.
|
|
110
116
|
|
|
111
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/seedless-onboarding-controller@2.
|
|
117
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/seedless-onboarding-controller@2.4.0...HEAD
|
|
118
|
+
[2.4.0]: https://github.com/MetaMask/core/compare/@metamask/seedless-onboarding-controller@2.3.0...@metamask/seedless-onboarding-controller@2.4.0
|
|
112
119
|
[2.3.0]: https://github.com/MetaMask/core/compare/@metamask/seedless-onboarding-controller@2.2.0...@metamask/seedless-onboarding-controller@2.3.0
|
|
113
120
|
[2.2.0]: https://github.com/MetaMask/core/compare/@metamask/seedless-onboarding-controller@2.1.0...@metamask/seedless-onboarding-controller@2.2.0
|
|
114
121
|
[2.1.0]: https://github.com/MetaMask/core/compare/@metamask/seedless-onboarding-controller@2.0.1...@metamask/seedless-onboarding-controller@2.1.0
|
|
@@ -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,
|
|
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;
|
|
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",
|
|
320
|
+
const { toprfEncryptionKey, toprfAuthKeyPair } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).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",
|
|
357
|
+
const keysFromVault = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).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",
|
|
488
|
+
const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, revokeToken, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).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);
|
|
@@ -619,7 +619,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
|
|
|
619
619
|
* @param keyringEncryptionKey - The keyring encryption key.
|
|
620
620
|
*/
|
|
621
621
|
async storeKeyringEncryptionKey(keyringEncryptionKey) {
|
|
622
|
-
const { toprfPwEncryptionKey: encKey } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m",
|
|
622
|
+
const { toprfPwEncryptionKey: encKey } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this);
|
|
623
623
|
await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_storeKeyringEncryptionKey).call(this, encKey, keyringEncryptionKey);
|
|
624
624
|
}
|
|
625
625
|
/**
|
|
@@ -629,7 +629,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
|
|
|
629
629
|
* @returns The keyring encryption key.
|
|
630
630
|
*/
|
|
631
631
|
async loadKeyringEncryptionKey() {
|
|
632
|
-
const { toprfPwEncryptionKey: encKey } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m",
|
|
632
|
+
const { toprfPwEncryptionKey: encKey } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this);
|
|
633
633
|
return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_loadKeyringEncryptionKey).call(this, encKey);
|
|
634
634
|
}
|
|
635
635
|
/**
|
|
@@ -746,7 +746,7 @@ async function _SeedlessOnboardingController_submitGlobalPassword({ targetAuthPu
|
|
|
746
746
|
const { pwEncKey } = res;
|
|
747
747
|
const vaultKey = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_loadSeedlessEncryptionKey).call(this, pwEncKey);
|
|
748
748
|
// Unlock the controller
|
|
749
|
-
const { revokeToken, toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m",
|
|
749
|
+
const { revokeToken, toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, undefined, vaultKey);
|
|
750
750
|
__classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
|
|
751
751
|
if (revokeToken) {
|
|
752
752
|
// revoke and recyle refresh token after unlock to keep refresh token fresh, avoid malicious use of leaked refresh token
|
|
@@ -769,6 +769,28 @@ async function _SeedlessOnboardingController_submitGlobalPassword({ targetAuthPu
|
|
|
769
769
|
}
|
|
770
770
|
throw errors_1.PasswordSyncError.getInstance(error);
|
|
771
771
|
}
|
|
772
|
+
}, _SeedlessOnboardingController_getAccessToken =
|
|
773
|
+
/**
|
|
774
|
+
* Get the access token from the state or the vault.
|
|
775
|
+
* If the access token is not in the state, it will be retrieved from the vault by decrypting it with the password.
|
|
776
|
+
*
|
|
777
|
+
* If both the access token and the vault are not available, an error will be thrown.
|
|
778
|
+
*
|
|
779
|
+
* @param password - The optional password to unlock the vault. If not provided, the access token will be retrieved from the vault.
|
|
780
|
+
* @returns The access token.
|
|
781
|
+
*/
|
|
782
|
+
async function _SeedlessOnboardingController_getAccessToken(password) {
|
|
783
|
+
const { accessToken, vault } = this.state;
|
|
784
|
+
if (accessToken) {
|
|
785
|
+
// if the access token is in the state, return it
|
|
786
|
+
return accessToken;
|
|
787
|
+
}
|
|
788
|
+
// otherwise, check the vault availability and decrypt the access token from the vault
|
|
789
|
+
if (!vault) {
|
|
790
|
+
throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.InvalidAccessToken);
|
|
791
|
+
}
|
|
792
|
+
const { accessToken: accessTokenFromVault } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, password);
|
|
793
|
+
return accessTokenFromVault;
|
|
772
794
|
}, _SeedlessOnboardingController_setUnlocked = function _SeedlessOnboardingController_setUnlocked() {
|
|
773
795
|
__classPrivateFieldSet(this, _SeedlessOnboardingController_isUnlocked, true, "f");
|
|
774
796
|
}, _SeedlessOnboardingController_persistOprfKey =
|
|
@@ -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
|
-
},
|
|
1003
|
+
}, _SeedlessOnboardingController_unlockVaultAndGetVaultData =
|
|
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
|
|
1021
|
+
async function _SeedlessOnboardingController_unlockVaultAndGetVaultData(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
|
-
|
|
1117
|
-
throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.InvalidAccessToken);
|
|
1118
|
-
}
|
|
1140
|
+
const accessToken = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_getAccessToken).call(this, 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
|
|
1148
|
+
accessToken,
|
|
1127
1149
|
});
|
|
1128
1150
|
await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_updateVault).call(this, {
|
|
1129
1151
|
password,
|
|
@@ -1304,9 +1326,8 @@ async function _SeedlessOnboardingController_revokeRefreshTokenAndUpdateState(re
|
|
|
1304
1326
|
return false;
|
|
1305
1327
|
}, _SeedlessOnboardingController_isMaxKeyChainLengthError = function _SeedlessOnboardingController_isMaxKeyChainLengthError(error) {
|
|
1306
1328
|
if (error instanceof toprf_secure_backup_1.TOPRFError) {
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
'Could not fetch password. Exceeded maximum password chain length');
|
|
1329
|
+
return (error.code ===
|
|
1330
|
+
toprf_secure_backup_1.TOPRFErrorCode.MaxKeyChainLengthExceeded);
|
|
1310
1331
|
}
|
|
1311
1332
|
return false;
|
|
1312
1333
|
}, _SeedlessOnboardingController_executeWithTokenRefresh =
|