From 527f56fa5fd30958ac24ec191b45f97f65735c9a Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Tue, 13 Sep 2022 22:29:04 -0230 Subject: [PATCH] Properly handle JSON errors when restoring data in advanced settings (#15815) --- app/_locales/en/messages.json | 3 ++ .../advanced-tab/advanced-tab.component.js | 48 +++++++++++++++---- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index fe8f9fdeb..8e51e30f3 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -893,6 +893,9 @@ "dataBackupFoundInfo": { "message": "Some of your account data was backed up during a previous installation of MetaMask. This could include your settings, contacts, and tokens. Would you like to restore this data now?" }, + "dataBackupSeemsCorrupt": { + "message": "Can not restore your data. The file appears to be corrupt." + }, "dataHex": { "message": "Hex" }, diff --git a/ui/pages/settings/advanced-tab/advanced-tab.component.js b/ui/pages/settings/advanced-tab/advanced-tab.component.js index 926a15448..d251822e8 100644 --- a/ui/pages/settings/advanced-tab/advanced-tab.component.js +++ b/ui/pages/settings/advanced-tab/advanced-tab.component.js @@ -25,6 +25,8 @@ import { exportAsFile } from '../../../../shared/modules/export-utils'; import ActionableMessage from '../../../components/ui/actionable-message'; import ZENDESK_URLS from '../../../helpers/constants/zendesk-url'; +const CORRUPT_JSON_FILE = 'CORRUPT_JSON_FILE'; + export default class AdvancedTab extends PureComponent { static contextTypes = { t: PropTypes.func, @@ -72,6 +74,7 @@ export default class AdvancedTab extends PureComponent { showLedgerTransportWarning: false, showResultMessage: false, restoreSuccessful: true, + restoreMessage: null, }; settingsRefs = Array( @@ -155,16 +158,35 @@ export default class AdvancedTab extends PureComponent { * */ event.target.value = ''; - const result = await this.props.restoreUserData(jsonString); - this.setState({ - showResultMessage: true, - restoreSuccessful: result, - }); + try { + const result = await this.props.restoreUserData(jsonString); + this.setState({ + showResultMessage: true, + restoreSuccessful: result, + restoreMessage: null, + }); + } catch (e) { + if (e.message.match(/Unexpected.+JSON/u)) { + this.setState({ + showResultMessage: true, + restoreSuccessful: false, + restoreMessage: CORRUPT_JSON_FILE, + }); + } + } } renderRestoreUserData() { const { t } = this.context; - const { showResultMessage, restoreSuccessful } = this.state; + const { showResultMessage, restoreSuccessful, restoreMessage } = this.state; + + const defaultRestoreMessage = restoreSuccessful + ? t('restoreSuccessful') + : t('restoreFailed'); + const restoreMessageToRender = + restoreMessage === CORRUPT_JSON_FILE + ? t('dataBackupSeemsCorrupt') + : defaultRestoreMessage; return (
{ + this.setState({ + showResultMessage: false, + restoreSuccessful: true, + restoreMessage: null, + }); + }, + }} /> )}