From d610aad2fd3300dfb1bdb07c061cfef4cf444eb0 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Wed, 16 Aug 2023 14:40:44 -0230 Subject: [PATCH] Split Sentry mask into UI and background masks (#20426) The state mask used to anonymize the Sentry state snapshots has been split into UI and background masks. This was done to simplify later refactors. There should be no functional changes. --- app/scripts/background.js | 11 ++-- app/scripts/lib/setupSentry.js | 101 +++++++++++++++++---------------- ui/index.js | 8 +-- 3 files changed, 64 insertions(+), 56 deletions(-) diff --git a/app/scripts/background.js b/app/scripts/background.js index 4ce5419c5..0c07adf4a 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -41,7 +41,7 @@ import Migrator from './lib/migrator'; import ExtensionPlatform from './platforms/extension'; import LocalStore from './lib/local-store'; import ReadOnlyNetworkStore from './lib/network-store'; -import { SENTRY_STATE } from './lib/setupSentry'; +import { SENTRY_BACKGROUND_STATE } from './lib/setupSentry'; import createStreamSink from './lib/createStreamSink'; import NotificationManager, { @@ -876,11 +876,14 @@ browser.runtime.onInstalled.addListener(({ reason }) => { function setupSentryGetStateGlobal(store) { global.stateHooks.getSentryState = function () { - const fullState = store.getState(); - const debugState = maskObject({ metamask: fullState }, SENTRY_STATE); + const backgroundState = store.getState(); + const maskedBackgroundState = maskObject( + backgroundState, + SENTRY_BACKGROUND_STATE, + ); return { browser: window.navigator.userAgent, - store: debugState, + store: { metamask: maskedBackgroundState }, version: platform.getVersion(), }; }; diff --git a/app/scripts/lib/setupSentry.js b/app/scripts/lib/setupSentry.js index 967361315..881f3c49e 100644 --- a/app/scripts/lib/setupSentry.js +++ b/app/scripts/lib/setupSentry.js @@ -23,59 +23,64 @@ export const ERROR_URL_ALLOWLIST = { SEGMENT: 'segment.io', }; +// This describes the subset of background controller state attached to errors +// sent to Sentry These properties have some potential to be useful for +// debugging, and they do not contain any identifiable information. +export const SENTRY_BACKGROUND_STATE = { + alertEnabledness: true, + completedOnboarding: true, + connectedStatusPopoverHasBeenShown: true, + conversionDate: true, + conversionRate: true, + currentAppVersion: true, + currentBlockGasLimit: true, + currentCurrency: true, + currentLocale: true, + currentMigrationVersion: true, + customNonceValue: true, + defaultHomeActiveTabName: true, + desktopEnabled: true, + featureFlags: true, + firstTimeFlowType: true, + forgottenPassword: true, + incomingTxLastFetchedBlockByChainId: true, + ipfsGateway: true, + isAccountMenuOpen: true, + isInitialized: true, + isUnlocked: true, + metaMetricsId: true, + nativeCurrency: true, + networkId: true, + networkStatus: true, + nextNonce: true, + participateInMetaMetrics: true, + preferences: true, + previousAppVersion: true, + previousMigrationVersion: true, + providerConfig: { + nickname: true, + ticker: true, + type: true, + }, + seedPhraseBackedUp: true, + unapprovedDecryptMsgCount: true, + unapprovedEncryptionPublicKeyMsgCount: true, + unapprovedMsgCount: true, + unapprovedPersonalMsgCount: true, + unapprovedTypedMessagesCount: true, + useBlockie: true, + useNonceField: true, + usePhishDetect: true, + welcomeScreenSeen: true, +}; + // This describes the subset of Redux state attached to errors sent to Sentry // These properties have some potential to be useful for debugging, and they do // not contain any identifiable information. -export const SENTRY_STATE = { +export const SENTRY_UI_STATE = { gas: true, history: true, - metamask: { - alertEnabledness: true, - completedOnboarding: true, - connectedStatusPopoverHasBeenShown: true, - conversionDate: true, - conversionRate: true, - currentAppVersion: true, - currentBlockGasLimit: true, - currentCurrency: true, - currentLocale: true, - currentMigrationVersion: true, - customNonceValue: true, - defaultHomeActiveTabName: true, - desktopEnabled: true, - featureFlags: true, - firstTimeFlowType: true, - forgottenPassword: true, - incomingTxLastFetchedBlockByChainId: true, - ipfsGateway: true, - isAccountMenuOpen: true, - isInitialized: true, - isUnlocked: true, - metaMetricsId: true, - nativeCurrency: true, - networkId: true, - networkStatus: true, - nextNonce: true, - participateInMetaMetrics: true, - preferences: true, - previousAppVersion: true, - previousMigrationVersion: true, - providerConfig: { - nickname: true, - ticker: true, - type: true, - }, - seedPhraseBackedUp: true, - unapprovedDecryptMsgCount: true, - unapprovedEncryptionPublicKeyMsgCount: true, - unapprovedMsgCount: true, - unapprovedPersonalMsgCount: true, - unapprovedTypedMessagesCount: true, - useBlockie: true, - useNonceField: true, - usePhishDetect: true, - welcomeScreenSeen: true, - }, + metamask: SENTRY_BACKGROUND_STATE, unconnectedAccount: true, }; diff --git a/ui/index.js b/ui/index.js index e9ac462bd..6f9a148ed 100644 --- a/ui/index.js +++ b/ui/index.js @@ -8,7 +8,7 @@ import browser from 'webextension-polyfill'; import { getEnvironmentType } from '../app/scripts/lib/util'; import { AlertTypes } from '../shared/constants/alerts'; import { maskObject } from '../shared/modules/object.utils'; -import { SENTRY_STATE } from '../app/scripts/lib/setupSentry'; +import { SENTRY_UI_STATE } from '../app/scripts/lib/setupSentry'; import { ENVIRONMENT_TYPE_POPUP } from '../shared/constants/app'; import switchDirection from '../shared/lib/switch-direction'; import { setupLocale } from '../shared/lib/error-utils'; @@ -234,11 +234,11 @@ function setupStateHooks(store) { return state; }; window.stateHooks.getSentryState = function () { - const fullState = store.getState(); - const debugState = maskObject(fullState, SENTRY_STATE); + const reduxState = store.getState(); + const maskedReduxState = maskObject(reduxState, SENTRY_UI_STATE); return { browser: window.navigator.userAgent, - store: debugState, + store: maskedReduxState, version: global.platform.getVersion(), }; };