@metamask-previews/seedless-onboarding-controller 2.4.0-preview-889b5df9 → 2.4.0-preview-c2e921a9
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 +134 -57
- package/dist/SeedlessOnboardingController.cjs.map +1 -1
- package/dist/SeedlessOnboardingController.d.cts +14 -1
- package/dist/SeedlessOnboardingController.d.cts.map +1 -1
- package/dist/SeedlessOnboardingController.d.mts +14 -1
- package/dist/SeedlessOnboardingController.d.mts.map +1 -1
- package/dist/SeedlessOnboardingController.mjs +135 -58
- package/dist/SeedlessOnboardingController.mjs.map +1 -1
- package/dist/assertions.cjs +16 -1
- package/dist/assertions.cjs.map +1 -1
- package/dist/assertions.d.cts +7 -0
- package/dist/assertions.d.cts.map +1 -1
- package/dist/assertions.d.mts +7 -0
- package/dist/assertions.d.mts.map +1 -1
- package/dist/assertions.mjs +14 -0
- package/dist/assertions.mjs.map +1 -1
- package/dist/constants.cjs +3 -1
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +4 -2
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.mts +4 -2
- package/dist/constants.d.mts.map +1 -1
- package/dist/constants.mjs +3 -1
- package/dist/constants.mjs.map +1 -1
- package/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +6 -0
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +6 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,10 @@ 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
|
+
|
|
10
14
|
## [2.4.0]
|
|
11
15
|
|
|
12
16
|
### 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,
|
|
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;
|
|
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,
|
|
@@ -391,7 +398,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
|
|
|
391
398
|
await this.verifyVaultPassword(oldPassword, {
|
|
392
399
|
skipLock: true, // skip lock since we already have the lock
|
|
393
400
|
});
|
|
394
|
-
await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertPasswordInSync).call(this, {
|
|
401
|
+
const { latestKeyIndex } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertPasswordInSync).call(this, {
|
|
395
402
|
skipCache: true,
|
|
396
403
|
skipLock: true, // skip lock since we already have the lock
|
|
397
404
|
});
|
|
@@ -405,6 +412,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
|
|
|
405
412
|
const { encKey: newEncKey, pwEncKey: newPwEncKey, authKeyPair: newAuthKeyPair, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_changeEncryptionKey).call(this, {
|
|
406
413
|
oldPassword,
|
|
407
414
|
newPassword,
|
|
415
|
+
latestKeyIndex,
|
|
408
416
|
});
|
|
409
417
|
// update and encrypt the vault with new password
|
|
410
418
|
await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
|
|
@@ -485,18 +493,14 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
|
|
|
485
493
|
*/
|
|
486
494
|
async submitPassword(password) {
|
|
487
495
|
return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withControllerLock).call(this, async () => {
|
|
488
|
-
const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair
|
|
496
|
+
const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, password);
|
|
489
497
|
__classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
rawToprfPwEncryptionKey: toprfPwEncryptionKey,
|
|
497
|
-
rawToprfAuthKeyPair: toprfAuthKeyPair,
|
|
498
|
-
});
|
|
499
|
-
}
|
|
498
|
+
await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
|
|
499
|
+
password,
|
|
500
|
+
rawToprfEncryptionKey: toprfEncryptionKey,
|
|
501
|
+
rawToprfPwEncryptionKey: toprfPwEncryptionKey,
|
|
502
|
+
rawToprfAuthKeyPair: toprfAuthKeyPair,
|
|
503
|
+
});
|
|
500
504
|
});
|
|
501
505
|
}
|
|
502
506
|
/**
|
|
@@ -564,6 +568,8 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
|
|
|
564
568
|
* @description Check if the current password is outdated compare to the global password.
|
|
565
569
|
*
|
|
566
570
|
* @param options - Optional options object.
|
|
571
|
+
* @param options.globalAuthPubKey - The global auth public key to compare with the current auth public key.
|
|
572
|
+
* If not provided, the global auth public key will be fetched from the backend.
|
|
567
573
|
* @param options.skipCache - If true, bypass the cache and force a fresh check.
|
|
568
574
|
* @param options.skipLock - Whether to skip the lock acquisition. (to prevent deadlock in case the caller already acquired the lock)
|
|
569
575
|
* @returns A promise that resolves to true if the password is outdated, false otherwise.
|
|
@@ -578,19 +584,28 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
|
|
|
578
584
|
const now = Date.now();
|
|
579
585
|
const isCacheValid = passwordOutdatedCache &&
|
|
580
586
|
now - passwordOutdatedCache.timestamp <
|
|
581
|
-
|
|
587
|
+
__classPrivateFieldGet(this, _SeedlessOnboardingController_passwordOutdatedCacheTTL, "f");
|
|
582
588
|
if (isCacheValid) {
|
|
583
589
|
return passwordOutdatedCache.isExpiredPwd;
|
|
584
590
|
}
|
|
585
591
|
}
|
|
586
592
|
const { nodeAuthTokens, authConnectionId, groupedAuthConnectionId, userId, } = this.state;
|
|
587
593
|
const currentDeviceAuthPubKey = __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_recoverAuthPubKey).call(this);
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
+
let globalAuthPubKey = options?.globalAuthPubKey;
|
|
595
|
+
if (!globalAuthPubKey) {
|
|
596
|
+
const { authPubKey } = await this.toprfClient
|
|
597
|
+
.fetchAuthPubKey({
|
|
598
|
+
nodeAuthTokens,
|
|
599
|
+
authConnectionId,
|
|
600
|
+
groupedAuthConnectionId,
|
|
601
|
+
userId,
|
|
602
|
+
})
|
|
603
|
+
.catch((error) => {
|
|
604
|
+
log('Error fetching auth pub key', error);
|
|
605
|
+
throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.FailedToFetchAuthPubKey);
|
|
606
|
+
});
|
|
607
|
+
globalAuthPubKey = authPubKey;
|
|
608
|
+
}
|
|
594
609
|
// use noble lib to deserialize and compare curve point
|
|
595
610
|
const isExpiredPwd = !secp256k1_1.secp256k1.ProjectivePoint.fromHex(currentDeviceAuthPubKey).equals(secp256k1_1.secp256k1.ProjectivePoint.fromHex(globalAuthPubKey));
|
|
596
611
|
// Cache the result in state
|
|
@@ -666,6 +681,53 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
|
|
|
666
681
|
throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.AuthenticationError);
|
|
667
682
|
}
|
|
668
683
|
}
|
|
684
|
+
/**
|
|
685
|
+
* Revoke the refresh token and get new refresh token and new revoke token.
|
|
686
|
+
* This method is to be called after user is authenticated.
|
|
687
|
+
*
|
|
688
|
+
* @param password - The password to encrypt the vault.
|
|
689
|
+
* @returns A Promise that resolves to void.
|
|
690
|
+
*/
|
|
691
|
+
async revokeRefreshTokenAndUpdateVault(password) {
|
|
692
|
+
return await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_withControllerLock).call(this, async () => {
|
|
693
|
+
__classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsAuthenticatedUser).call(this, this.state);
|
|
694
|
+
const { vaultEncryptionKey } = this.state;
|
|
695
|
+
const { toprfEncryptionKey: rawToprfEncryptionKey, toprfPwEncryptionKey: rawToprfPwEncryptionKey, toprfAuthKeyPair: rawToprfAuthKeyPair, revokeToken, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, password, vaultEncryptionKey);
|
|
696
|
+
__classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
|
|
697
|
+
if (!revokeToken) {
|
|
698
|
+
throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.InvalidRevokeToken);
|
|
699
|
+
}
|
|
700
|
+
const { newRevokeToken, newRefreshToken } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_revokeRefreshToken, "f").call(this, {
|
|
701
|
+
connection: this.state.authConnection,
|
|
702
|
+
revokeToken,
|
|
703
|
+
});
|
|
704
|
+
const accessToken = __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_getAccessToken).call(this, password);
|
|
705
|
+
const { toprfEncryptionKey, toprfPwEncryptionKey, toprfAuthKeyPair } = __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_serializeKeyData).call(this, rawToprfEncryptionKey, rawToprfPwEncryptionKey, rawToprfAuthKeyPair);
|
|
706
|
+
const serializedVaultData = JSON.stringify({
|
|
707
|
+
toprfEncryptionKey,
|
|
708
|
+
toprfPwEncryptionKey,
|
|
709
|
+
toprfAuthKeyPair,
|
|
710
|
+
revokeToken: newRevokeToken,
|
|
711
|
+
accessToken,
|
|
712
|
+
});
|
|
713
|
+
// this function acquires the vault lock
|
|
714
|
+
await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_updateVault).call(this, {
|
|
715
|
+
password,
|
|
716
|
+
serializedVaultData,
|
|
717
|
+
pwEncKey: rawToprfPwEncryptionKey,
|
|
718
|
+
});
|
|
719
|
+
// update the authPubKey in the state
|
|
720
|
+
__classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_persistAuthPubKey).call(this, {
|
|
721
|
+
authPubKey: rawToprfAuthKeyPair.pk,
|
|
722
|
+
});
|
|
723
|
+
this.update((state) => {
|
|
724
|
+
// set new revoke token in state temporarily for persisting in vault
|
|
725
|
+
state.revokeToken = newRevokeToken;
|
|
726
|
+
// set new refresh token to persist in state
|
|
727
|
+
state.refreshToken = newRefreshToken;
|
|
728
|
+
});
|
|
729
|
+
});
|
|
730
|
+
}
|
|
669
731
|
/**
|
|
670
732
|
* Check if the current node auth token is expired.
|
|
671
733
|
*
|
|
@@ -720,7 +782,7 @@ class SeedlessOnboardingController extends base_controller_1.BaseController {
|
|
|
720
782
|
}
|
|
721
783
|
}
|
|
722
784
|
exports.SeedlessOnboardingController = SeedlessOnboardingController;
|
|
723
|
-
_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 =
|
|
785
|
+
_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 =
|
|
724
786
|
/**
|
|
725
787
|
* @description Submit the global password to the controller, verify the
|
|
726
788
|
* password validity and unlock the controller.
|
|
@@ -746,19 +808,14 @@ async function _SeedlessOnboardingController_submitGlobalPassword({ targetAuthPu
|
|
|
746
808
|
const { pwEncKey } = res;
|
|
747
809
|
const vaultKey = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_loadSeedlessEncryptionKey).call(this, pwEncKey);
|
|
748
810
|
// Unlock the controller
|
|
749
|
-
const {
|
|
811
|
+
const { toprfEncryptionKey: latestEncKey, toprfPwEncryptionKey: latestPwEncKey, toprfAuthKeyPair: latestAuthKeyPair, } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, undefined, vaultKey);
|
|
750
812
|
__classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_setUnlocked).call(this);
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
rawToprfEncryptionKey: toprfEncryptionKey,
|
|
758
|
-
rawToprfPwEncryptionKey: toprfPwEncryptionKey,
|
|
759
|
-
rawToprfAuthKeyPair: toprfAuthKeyPair,
|
|
760
|
-
});
|
|
761
|
-
}
|
|
813
|
+
await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_createNewVaultWithAuthData).call(this, {
|
|
814
|
+
password: globalPassword,
|
|
815
|
+
rawToprfEncryptionKey: latestEncKey,
|
|
816
|
+
rawToprfPwEncryptionKey: latestPwEncKey,
|
|
817
|
+
rawToprfAuthKeyPair: latestAuthKeyPair,
|
|
818
|
+
});
|
|
762
819
|
}
|
|
763
820
|
catch (error) {
|
|
764
821
|
if (__classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_isTokenExpiredError).call(this, error)) {
|
|
@@ -932,12 +989,31 @@ async function _SeedlessOnboardingController_recoverEncKey(password) {
|
|
|
932
989
|
* @param params - The function parameters.
|
|
933
990
|
* @param params.oldPassword - The old password to verify.
|
|
934
991
|
* @param params.newPassword - The new password to update.
|
|
992
|
+
* @param params.latestKeyIndex - The key index of the latest key.
|
|
935
993
|
* @returns A promise that resolves to new encryption key and authentication key pair.
|
|
936
994
|
*/
|
|
937
|
-
async function _SeedlessOnboardingController_changeEncryptionKey({ oldPassword, newPassword, }) {
|
|
995
|
+
async function _SeedlessOnboardingController_changeEncryptionKey({ oldPassword, newPassword, latestKeyIndex, }) {
|
|
938
996
|
__classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsAuthenticatedUser).call(this, this.state);
|
|
939
997
|
const { authConnectionId, groupedAuthConnectionId, userId } = this.state;
|
|
940
|
-
|
|
998
|
+
let encKey;
|
|
999
|
+
let pwEncKey;
|
|
1000
|
+
let authKeyPair;
|
|
1001
|
+
let globalKeyIndex = latestKeyIndex;
|
|
1002
|
+
if (!globalKeyIndex) {
|
|
1003
|
+
({
|
|
1004
|
+
encKey,
|
|
1005
|
+
pwEncKey,
|
|
1006
|
+
authKeyPair,
|
|
1007
|
+
keyShareIndex: globalKeyIndex,
|
|
1008
|
+
} = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_recoverEncKey).call(this, oldPassword));
|
|
1009
|
+
}
|
|
1010
|
+
else {
|
|
1011
|
+
({
|
|
1012
|
+
toprfEncryptionKey: encKey,
|
|
1013
|
+
toprfPwEncryptionKey: pwEncKey,
|
|
1014
|
+
toprfAuthKeyPair: authKeyPair,
|
|
1015
|
+
} = await __classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_unlockVaultAndGetVaultData).call(this, oldPassword));
|
|
1016
|
+
}
|
|
941
1017
|
const result = await this.toprfClient.changeEncKey({
|
|
942
1018
|
nodeAuthTokens: this.state.nodeAuthTokens,
|
|
943
1019
|
authConnectionId,
|
|
@@ -946,7 +1022,7 @@ async function _SeedlessOnboardingController_changeEncryptionKey({ oldPassword,
|
|
|
946
1022
|
oldEncKey: encKey,
|
|
947
1023
|
oldPwEncKey: pwEncKey,
|
|
948
1024
|
oldAuthKeyPair: authKeyPair,
|
|
949
|
-
newKeyShareIndex,
|
|
1025
|
+
newKeyShareIndex: globalKeyIndex,
|
|
950
1026
|
newPassword,
|
|
951
1027
|
});
|
|
952
1028
|
return result;
|
|
@@ -1288,36 +1364,37 @@ async function _SeedlessOnboardingController_withVaultLock(callback) {
|
|
|
1288
1364
|
* @param options - The options for asserting the password is in sync.
|
|
1289
1365
|
* @param options.skipCache - Whether to skip the cache check.
|
|
1290
1366
|
* @param options.skipLock - Whether to skip the lock acquisition. (to prevent deadlock in case the caller already acquired the lock)
|
|
1367
|
+
* @returns The global auth public key and the latest key index.
|
|
1291
1368
|
* @throws If the password is outdated.
|
|
1292
1369
|
*/
|
|
1293
1370
|
async function _SeedlessOnboardingController_assertPasswordInSync(options) {
|
|
1294
|
-
const
|
|
1371
|
+
const { nodeAuthTokens, authConnectionId, groupedAuthConnectionId, userId, } = this.state;
|
|
1372
|
+
if (!nodeAuthTokens || !authConnectionId || !userId) {
|
|
1373
|
+
throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.MissingAuthUserInfo);
|
|
1374
|
+
}
|
|
1375
|
+
const { authPubKey, keyIndex: latestKeyIndex } = await this.toprfClient
|
|
1376
|
+
.fetchAuthPubKey({
|
|
1377
|
+
nodeAuthTokens,
|
|
1378
|
+
authConnectionId,
|
|
1379
|
+
groupedAuthConnectionId,
|
|
1380
|
+
userId,
|
|
1381
|
+
})
|
|
1382
|
+
.catch((error) => {
|
|
1383
|
+
log('Error fetching auth pub key', error);
|
|
1384
|
+
throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.FailedToFetchAuthPubKey);
|
|
1385
|
+
});
|
|
1386
|
+
const isPasswordOutdated = await this.checkIsPasswordOutdated({
|
|
1387
|
+
...options,
|
|
1388
|
+
globalAuthPubKey: authPubKey,
|
|
1389
|
+
});
|
|
1295
1390
|
if (isPasswordOutdated) {
|
|
1296
1391
|
throw new Error(constants_1.SeedlessOnboardingControllerErrorMessage.OutdatedPassword);
|
|
1297
1392
|
}
|
|
1393
|
+
return { authPubKey, latestKeyIndex };
|
|
1298
1394
|
}, _SeedlessOnboardingController_resetPasswordOutdatedCache = function _SeedlessOnboardingController_resetPasswordOutdatedCache() {
|
|
1299
1395
|
this.update((state) => {
|
|
1300
1396
|
delete state.passwordOutdatedCache;
|
|
1301
1397
|
});
|
|
1302
|
-
}, _SeedlessOnboardingController_revokeRefreshTokenAndUpdateState =
|
|
1303
|
-
/**
|
|
1304
|
-
* Revoke the refresh token and get new refresh token and new revoke token.
|
|
1305
|
-
* This method is to be called after user is authenticated.
|
|
1306
|
-
*
|
|
1307
|
-
* @param revokeToken - The revoke token to use for revoking the refresh token.
|
|
1308
|
-
*/
|
|
1309
|
-
async function _SeedlessOnboardingController_revokeRefreshTokenAndUpdateState(revokeToken) {
|
|
1310
|
-
__classPrivateFieldGet(this, _SeedlessOnboardingController_instances, "m", _SeedlessOnboardingController_assertIsAuthenticatedUser).call(this, this.state);
|
|
1311
|
-
const { newRevokeToken, newRefreshToken } = await __classPrivateFieldGet(this, _SeedlessOnboardingController_revokeRefreshToken, "f").call(this, {
|
|
1312
|
-
connection: this.state.authConnection,
|
|
1313
|
-
revokeToken,
|
|
1314
|
-
});
|
|
1315
|
-
this.update((state) => {
|
|
1316
|
-
// set new revoke token in state temporarily for persisting in vault
|
|
1317
|
-
state.revokeToken = newRevokeToken;
|
|
1318
|
-
// set new refresh token to persist in state
|
|
1319
|
-
state.refreshToken = newRefreshToken;
|
|
1320
|
-
});
|
|
1321
1398
|
}, _SeedlessOnboardingController_isTokenExpiredError = function _SeedlessOnboardingController_isTokenExpiredError(error) {
|
|
1322
1399
|
if (error instanceof toprf_secure_backup_1.TOPRFError) {
|
|
1323
1400
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison
|