Adding setting for disabling Eth Phishing Detection (#8125)

feature/default_network_editable
ryanml 5 years ago committed by GitHub
parent f5f6f7b2d5
commit 64aef5033d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      app/_locales/en/messages.json
  2. 11
      app/scripts/controllers/preferences.js
  3. 20
      app/scripts/metamask-controller.js
  4. 3
      test/e2e/fixtures/imported-account/state.json
  5. 14
      test/unit/app/controllers/preferences-controller-test.js
  6. 37
      ui/app/pages/settings/security-tab/security-tab.component.js
  7. 4
      ui/app/pages/settings/security-tab/security-tab.container.js
  8. 10
      ui/app/pages/settings/security-tab/tests/security-tab.test.js
  9. 4
      ui/app/selectors/selectors.js
  10. 13
      ui/app/store/actions.js

@ -1553,6 +1553,12 @@
"usedByClients": {
"message": "Used by a variety of different clients"
},
"usePhishingDetection": {
"message": "Use Phishing Detection"
},
"usePhishingDetectionDescription": {
"message": "Display a warning for phishing domains targeting Ethereum users"
},
"userName": {
"message": "Username"
},

@ -36,6 +36,7 @@ class PreferencesController {
suggestedTokens: {},
useBlockie: false,
useNonceField: false,
usePhishDetect: true,
// WARNING: Do not use feature flags for security-sensitive things.
// Feature flag toggling is available in the global namespace
@ -103,6 +104,16 @@ class PreferencesController {
this.store.updateState({ useNonceField: val })
}
/**
* Setter for the `usePhishDetect` property
*
* @param {boolean} val - Whether or not the user prefers phishing domain protection
*
*/
setUsePhishDetect (val) {
this.store.updateState({ usePhishDetect: val })
}
/**
* Setter for the `participateInMetaMetrics` property
*

@ -446,6 +446,7 @@ export default class MetamaskController extends EventEmitter {
setCurrentCurrency: this.setCurrentCurrency.bind(this),
setUseBlockie: this.setUseBlockie.bind(this),
setUseNonceField: this.setUseNonceField.bind(this),
setUsePhishDetect: this.setUsePhishDetect.bind(this),
setIpfsGateway: this.setIpfsGateway.bind(this),
setParticipateInMetaMetrics: this.setParticipateInMetaMetrics.bind(this),
setMetaMetricsSendCount: this.setMetaMetricsSendCount.bind(this),
@ -1470,9 +1471,10 @@ export default class MetamaskController extends EventEmitter {
* @param {MessageSender} sender - The sender of the messages on this stream
*/
setupUntrustedCommunication (connectionStream, sender) {
const { usePhishDetect } = this.preferencesController.store.getState()
const hostname = (new URL(sender.url)).hostname
// Check if new connection is blacklisted
if (this.phishingController.test(hostname)) {
// Check if new connection is blacklisted if phishing detection is on
if (usePhishDetect && this.phishingController.test(hostname)) {
log.debug('MetaMask - sending phishing warning for', hostname)
this.sendPhishingWarning(connectionStream, hostname)
return
@ -1988,6 +1990,20 @@ export default class MetamaskController extends EventEmitter {
}
}
/**
* Sets whether or not to use phishing detection.
* @param {boolean} val
* @param {Function} cb
*/
setUsePhishDetect (val, cb) {
try {
this.preferencesController.setUsePhishDetect(val)
cb(null)
} catch (err) {
cb(err)
}
}
/**
* Sets the IPFS gateway to use for ENS content resolution.
* @param {string} val - the host of the gateway to set

@ -110,7 +110,8 @@
"suggestedTokens": {},
"tokens": [],
"useBlockie": false,
"useNonceField": false
"useNonceField": false,
"usePhishDetect": true
},
"config": {},
"firstTimeInfo": {

@ -543,5 +543,17 @@ describe('preferences controller', function () {
assert.deepEqual(preferencesController.store.getState().frequentRpcListDetail, [])
})
})
})
describe('setUsePhishDetect', function () {
it('should default to true', function () {
const state = preferencesController.store.getState()
assert.equal(state.usePhishDetect, true)
})
it('should set the usePhishDetect property in state', function () {
assert.equal(preferencesController.store.getState().usePhishDetect, true)
preferencesController.setUsePhishDetect(false)
assert.equal(preferencesController.store.getState().usePhishDetect, false)
})
})
})

@ -13,10 +13,12 @@ export default class SecurityTab extends PureComponent {
static propTypes = {
warning: PropTypes.string,
history: PropTypes.object,
participateInMetaMetrics: PropTypes.bool,
setParticipateInMetaMetrics: PropTypes.func,
showIncomingTransactions: PropTypes.bool,
setShowIncomingTransactionsFeatureFlag: PropTypes.func,
participateInMetaMetrics: PropTypes.bool.isRequired,
setParticipateInMetaMetrics: PropTypes.func.isRequired,
showIncomingTransactions: PropTypes.bool.isRequired,
setShowIncomingTransactionsFeatureFlag: PropTypes.func.isRequired,
setUsePhishDetect: PropTypes.func.isRequired,
usePhishDetect: PropTypes.bool.isRequired,
}
renderSeedWords () {
@ -105,6 +107,32 @@ export default class SecurityTab extends PureComponent {
)
}
renderPhishingDetectionToggle () {
const { t } = this.context
const { usePhishDetect, setUsePhishDetect } = this.props
return (
<div className="settings-page__content-row">
<div className="settings-page__content-item">
<span>{ t('usePhishingDetection') }</span>
<div className="settings-page__content-description">
{ t('usePhishingDetectionDescription') }
</div>
</div>
<div className="settings-page__content-item">
<div className="settings-page__content-item-col">
<ToggleButton
value={usePhishDetect}
onToggle={(value) => setUsePhishDetect(!value)}
offLabel={t('off')}
onLabel={t('on')}
/>
</div>
</div>
</div>
)
}
renderContent () {
const { warning } = this.props
@ -113,6 +141,7 @@ export default class SecurityTab extends PureComponent {
{ warning && <div className="settings-tab__error">{ warning }</div> }
{ this.renderSeedWords() }
{ this.renderIncomingTransactionsOptIn() }
{ this.renderPhishingDetectionToggle() }
{ this.renderMetaMetricsOptIn() }
</div>
)

@ -5,6 +5,7 @@ import { withRouter } from 'react-router-dom'
import {
setFeatureFlag,
setParticipateInMetaMetrics,
setUsePhishDetect,
} from '../../../store/actions'
const mapStateToProps = (state) => {
@ -14,12 +15,14 @@ const mapStateToProps = (state) => {
showIncomingTransactions,
} = {},
participateInMetaMetrics,
usePhishDetect,
} = metamask
return {
warning,
showIncomingTransactions,
participateInMetaMetrics,
usePhishDetect,
}
}
@ -27,6 +30,7 @@ const mapDispatchToProps = (dispatch) => {
return {
setParticipateInMetaMetrics: (val) => dispatch(setParticipateInMetaMetrics(val)),
setShowIncomingTransactionsFeatureFlag: (shouldShow) => dispatch(setFeatureFlag('showIncomingTransactions', shouldShow)),
setUsePhishDetect: (val) => dispatch(setUsePhishDetect(val)),
}
}

@ -19,6 +19,8 @@ describe('Security Tab', function () {
privacyMode: true,
warning: '',
participateInMetaMetrics: false,
setUsePhishDetect: sinon.spy(),
usePhishDetect: true,
}
beforeEach(function () {
@ -46,8 +48,14 @@ describe('Security Tab', function () {
assert(props.setShowIncomingTransactionsFeatureFlag.calledOnce)
})
it('toggles phishing detection', function () {
const phishDetect = wrapper.find({ type: 'checkbox' }).at(1)
phishDetect.simulate('click')
assert(props.setUsePhishDetect.calledOnce)
})
it('toggles metaMetrics', function () {
const metaMetrics = wrapper.find({ type: 'checkbox' }).at(1)
const metaMetrics = wrapper.find({ type: 'checkbox' }).at(2)
metaMetrics.simulate('click')
assert(props.setParticipateInMetaMetrics.calledOnce)

@ -349,6 +349,10 @@ export function getUseNonceField (state) {
return Boolean(state.metamask.useNonceField)
}
export function getUsePhishDetect (state) {
return Boolean(state.metamask.usePhishDetect)
}
export function getCustomNonceValue (state) {
return String(state.metamask.customNonceValue)
}

@ -2125,6 +2125,19 @@ export function setUseNonceField (val) {
}
}
export function setUsePhishDetect (val) {
return (dispatch) => {
dispatch(showLoadingIndication())
log.debug(`background.setUsePhishDetect`)
background.setUsePhishDetect(val, (err) => {
dispatch(hideLoadingIndication())
if (err) {
return dispatch(displayWarning(err.message))
}
})
}
}
export function setIpfsGateway (val) {
return (dispatch) => {
dispatch(showLoadingIndication())

Loading…
Cancel
Save