diff options
author | Dan Finlay <dan@danfinlay.com> | 2018-06-05 04:43:26 +0800 |
---|---|---|
committer | Dan Finlay <dan@danfinlay.com> | 2018-06-05 04:43:26 +0800 |
commit | 7382bd0847145b58db8414ae015c41778e5ebb75 (patch) | |
tree | b080fc09f8223c89c87c354ee5aeb8d8a3ae7add | |
parent | 797e63b37bc10b2aa3cb78e65024c4a68c099f0b (diff) | |
download | tangerine-wallet-browser-7382bd0847145b58db8414ae015c41778e5ebb75.tar tangerine-wallet-browser-7382bd0847145b58db8414ae015c41778e5ebb75.tar.gz tangerine-wallet-browser-7382bd0847145b58db8414ae015c41778e5ebb75.tar.bz2 tangerine-wallet-browser-7382bd0847145b58db8414ae015c41778e5ebb75.tar.lz tangerine-wallet-browser-7382bd0847145b58db8414ae015c41778e5ebb75.tar.xz tangerine-wallet-browser-7382bd0847145b58db8414ae015c41778e5ebb75.tar.zst tangerine-wallet-browser-7382bd0847145b58db8414ae015c41778e5ebb75.zip |
Add identity synchronizing code
Addresses #4475, where entries in the identities object do not
necessarily have corresponding accounts in the vault.
On password submission, this change passes known accounts to the
preferencesController (responsible for nickname management), and removes
unknown entries.
Includes "TODO" notes for where we could log the issue to sentry or
notify the user.
-rw-r--r-- | app/scripts/controllers/preferences.js | 31 | ||||
-rw-r--r-- | app/scripts/metamask-controller.js | 18 |
2 files changed, 48 insertions, 1 deletions
diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 760868ddf..426ee5a02 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -98,6 +98,37 @@ class PreferencesController { this.store.updateState({ identities }) } + /* + * Synchronizes identity entries with known accounts. + * Removes any unknown identities, and returns the resulting selected address. + * + * @param {Array<string>} addresses known to the vault. + * @returns {Promise<string>} selectedAddress the selected address. + */ + syncAddresses (addresses) { + const identities = this.store.getState().identities + + Object.keys(identities).forEach((identity) => { + if (!addresses.includes(identity)) { + delete identities[identity] + + // TODO: Report the bug to Sentry including the now-lost identity. + // TODO: Inform the user of the lost identity. + } + }) + + this.store.updateState({ identities }) + this.addAddresses(addresses) + + let selected = this.getSelectedAddress() + if (!addresses.includes(selected)) { + selected = addresses[0] + this.setSelectedAddress(selected) + } + + return selected + } + /** * Setter for the `selectedAddress` property * diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 96f976568..85c1fe09c 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -356,7 +356,7 @@ module.exports = class MetamaskController extends EventEmitter { importAccountWithStrategy: nodeify(this.importAccountWithStrategy, this), // vault management - submitPassword: nodeify(keyringController.submitPassword, keyringController), + submitPassword: nodeify(this.submitPassword, this), // network management setProviderType: nodeify(networkController.setProviderType, networkController), @@ -474,6 +474,22 @@ module.exports = class MetamaskController extends EventEmitter { } } + /* + * Submits the user's password and attempts to unlock the vault. + * Also synchronizes the preferencesController, to ensure its schema + * is up to date with known accounts once the vault is decrypted. + * + * @param {string} password - The user's password + * @returns {Promise<object>} - The keyringController update. + */ + async submitPassword (password) { + await this.keyringController.submitPassword(password) + const accounts = await this.keyringController.getAccounts() + + await this.preferencesController.syncAddresses(accounts) + return this.keyringController.fullUpdate() + } + /** * @type Identity * @property {string} name - The account nickname. |