aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkumavis <kumavis@users.noreply.github.com>2017-08-04 12:02:01 +0800
committerGitHub <noreply@github.com>2017-08-04 12:02:01 +0800
commit5a9257208c858d11b94659518ef2375384aeac46 (patch)
tree6341d6693513ae731aa7092e4816d891e36cbc45
parent17c9fd450f4c05ae39457abc8459d0353c07973b (diff)
parentc4cb371ce8ddad10d575b4ddb6cb85fe4689ca59 (diff)
downloadtangerine-wallet-browser-5a9257208c858d11b94659518ef2375384aeac46.tar
tangerine-wallet-browser-5a9257208c858d11b94659518ef2375384aeac46.tar.gz
tangerine-wallet-browser-5a9257208c858d11b94659518ef2375384aeac46.tar.bz2
tangerine-wallet-browser-5a9257208c858d11b94659518ef2375384aeac46.tar.lz
tangerine-wallet-browser-5a9257208c858d11b94659518ef2375384aeac46.tar.xz
tangerine-wallet-browser-5a9257208c858d11b94659518ef2375384aeac46.tar.zst
tangerine-wallet-browser-5a9257208c858d11b94659518ef2375384aeac46.zip
Merge branch 'master' into NewUI
-rw-r--r--CHANGELOG.md4
-rw-r--r--app/manifest.json2
-rw-r--r--app/scripts/controllers/blacklist.js28
-rw-r--r--app/scripts/lib/is-phish.js23
-rw-r--r--app/scripts/lib/nodeify.js3
-rw-r--r--package.json4
-rw-r--r--test/unit/actions/tx_test.js10
-rw-r--r--test/unit/nodeify-test.js11
-rw-r--r--ui/app/actions.js9
9 files changed, 50 insertions, 44 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 600df2955..7aa01e61f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,10 @@
- Replace account scren with an account drop-down menu.
- Replace confusing buttons with an new account-specific drop-down menu.
+
+## 3.9.3 2017-8-03
+
+- Add support for EGO uport token
- Continuously update blacklist for known phishing sites in background.
- Automatically detect suspicious URLs too similar to common phishing targets, and blacklist them.
diff --git a/app/manifest.json b/app/manifest.json
index 1eaf6f26a..6c02120c1 100644
--- a/app/manifest.json
+++ b/app/manifest.json
@@ -1,7 +1,7 @@
{
"name": "MetaMask",
"short_name": "Metamask",
- "version": "3.9.2",
+ "version": "3.9.3",
"manifest_version": 2,
"author": "https://metamask.io",
"description": "Ethereum Browser Extension",
diff --git a/app/scripts/controllers/blacklist.js b/app/scripts/controllers/blacklist.js
index 11e26d5b2..7e01fa386 100644
--- a/app/scripts/controllers/blacklist.js
+++ b/app/scripts/controllers/blacklist.js
@@ -1,13 +1,9 @@
const ObservableStore = require('obs-store')
const extend = require('xtend')
-const communityBlacklistedDomains = require('etheraddresslookup/blacklists/domains.json')
-const communityWhitelistedDomains = require('etheraddresslookup/whitelists/domains.json')
-const checkForPhishing = require('../lib/is-phish')
+const PhishingDetector = require('eth-phishing-detect/src/detector')
// compute phishing lists
-const PHISHING_BLACKLIST = communityBlacklistedDomains.concat(['metamask.com'])
-const PHISHING_WHITELIST = communityWhitelistedDomains.concat(['metamask.io', 'www.metamask.io'])
-const PHISHING_FUZZYLIST = ['myetherwallet', 'myetheroll', 'ledgerwallet', 'metamask']
+const PHISHING_DETECTION_CONFIG = require('eth-phishing-detect/src/config.json')
// every ten minutes
const POLLING_INTERVAL = 10 * 60 * 1000
@@ -15,9 +11,12 @@ class BlacklistController {
constructor (opts = {}) {
const initState = extend({
- phishing: PHISHING_BLACKLIST,
+ phishing: PHISHING_DETECTION_CONFIG,
}, opts.initState)
this.store = new ObservableStore(initState)
+ // phishing detector
+ this._phishingDetector = null
+ this._setupPhishingDetector(initState.phishing)
// polling references
this._phishingUpdateIntervalRef = null
}
@@ -28,14 +27,15 @@ class BlacklistController {
checkForPhishing (hostname) {
if (!hostname) return false
- const { blacklist } = this.store.getState()
- return checkForPhishing({ hostname, blacklist, whitelist: PHISHING_WHITELIST, fuzzylist: PHISHING_FUZZYLIST })
+ const { result } = this._phishingDetector.check(hostname)
+ return result
}
async updatePhishingList () {
- const response = await fetch('https://api.infura.io/v1/blacklist')
+ const response = await fetch('https://api.infura.io/v2/blacklist')
const phishing = await response.json()
this.store.updateState({ phishing })
+ this._setupPhishingDetector(phishing)
return phishing
}
@@ -45,6 +45,14 @@ class BlacklistController {
this.updatePhishingList()
}, POLLING_INTERVAL)
}
+
+ //
+ // PRIVATE METHODS
+ //
+
+ _setupPhishingDetector (config) {
+ this._phishingDetector = new PhishingDetector(config)
+ }
}
module.exports = BlacklistController
diff --git a/app/scripts/lib/is-phish.js b/app/scripts/lib/is-phish.js
deleted file mode 100644
index ce51c353d..000000000
--- a/app/scripts/lib/is-phish.js
+++ /dev/null
@@ -1,23 +0,0 @@
-const levenshtein = require('fast-levenshtein')
-const LEVENSHTEIN_TOLERANCE = 4
-
-// credit to @sogoiii and @409H for their help!
-// Return a boolean on whether or not a phish is detected.
-function isPhish({ hostname, blacklist, whitelist, fuzzylist }) {
-
- // check if the domain is part of the whitelist.
- if (whitelist && whitelist.includes(hostname)) return false
-
- // check if the domain is part of the blacklist.
- if (blacklist && blacklist.includes(hostname)) return true
-
- // check for similar values.
- const levenshteinForm = hostname.replace(/\./g, '')
- const levenshteinMatched = fuzzylist.some((element) => {
- return levenshtein.get(element, levenshteinForm) <= LEVENSHTEIN_TOLERANCE
- })
-
- return levenshteinMatched
-}
-
-module.exports = isPhish
diff --git a/app/scripts/lib/nodeify.js b/app/scripts/lib/nodeify.js
index 299bfe624..832d6c6d3 100644
--- a/app/scripts/lib/nodeify.js
+++ b/app/scripts/lib/nodeify.js
@@ -1,9 +1,10 @@
const promiseToCallback = require('promise-to-callback')
-module.exports = function(fn, context) {
+module.exports = function nodeify (fn, context) {
return function(){
const args = [].slice.call(arguments)
const callback = args.pop()
+ if (typeof callback !== 'function') throw new Error('callback is not a function')
promiseToCallback(fn.apply(context, args))(callback)
}
}
diff --git a/package.json b/package.json
index 7cd6c074a..98066a172 100644
--- a/package.json
+++ b/package.json
@@ -7,7 +7,7 @@
"start": "npm run dev",
"dev": "gulp dev --debug",
"disc": "gulp disc --debug",
- "clear": "rm -rf node_modules/eth-contract-metadata && rm -rf node_modules/etheraddresslookup",
+ "clear": "rm -rf node_modules/eth-contract-metadata && rm -rf node_modules/eth-phishing-detect",
"dist": "npm run clear && npm install && gulp dist",
"test": "npm run lint && npm run test-unit && npm run test-integration",
"test-unit": "METAMASK_ENV=test mocha --require test/helper.js --recursive \"test/unit/**/*.js\"",
@@ -68,11 +68,11 @@
"eth-bin-to-ops": "^1.0.1",
"eth-contract-metadata": "^1.1.4",
"eth-hd-keyring": "^1.1.1",
+ "eth-phishing-detect": "^1.1.0",
"eth-query": "^2.1.2",
"eth-sig-util": "^1.2.2",
"eth-simple-keyring": "^1.1.1",
"eth-token-tracker": "^1.1.2",
- "etheraddresslookup": "github:409H/EtherAddressLookup",
"ethereumjs-tx": "^1.3.0",
"ethereumjs-util": "ethereumjs/ethereumjs-util#ac5d0908536b447083ea422b435da27f26615de9",
"ethereumjs-wallet": "^0.6.0",
diff --git a/test/unit/actions/tx_test.js b/test/unit/actions/tx_test.js
index 0ea1bfdc7..67c72e9a5 100644
--- a/test/unit/actions/tx_test.js
+++ b/test/unit/actions/tx_test.js
@@ -45,13 +45,15 @@ describe('tx confirmation screen', function () {
before(function (done) {
actions._setBackgroundConnection({
approveTransaction (txId, cb) { cb('An error!') },
- cancelTransaction (txId) { /* noop */ },
+ cancelTransaction (txId, cb) { cb() },
clearSeedWordCache (cb) { cb() },
})
- const action = actions.cancelTx({value: firstTxId})
- result = reducers(initialState, action)
- done()
+ actions.cancelTx({value: firstTxId})((action) => {
+ result = reducers(initialState, action)
+ done()
+ })
+
})
it('should transition to the account detail view', function () {
diff --git a/test/unit/nodeify-test.js b/test/unit/nodeify-test.js
index 06241334d..537dae605 100644
--- a/test/unit/nodeify-test.js
+++ b/test/unit/nodeify-test.js
@@ -17,4 +17,15 @@ describe('nodeify', function () {
done()
})
})
+
+ it('should throw if the last argument is not a function', function (done) {
+ const nodified = nodeify(obj.promiseFunc, obj)
+ try {
+ nodified('baz')
+ done(new Error('should have thrown if the last argument is not a function'))
+ } catch (err) {
+ assert.equal(err.message, 'callback is not a function')
+ done()
+ }
+ })
})
diff --git a/ui/app/actions.js b/ui/app/actions.js
index 0a9d347aa..eafd04b4c 100644
--- a/ui/app/actions.js
+++ b/ui/app/actions.js
@@ -462,9 +462,12 @@ function cancelPersonalMsg (msgData) {
}
function cancelTx (txData) {
- log.debug(`background.cancelTransaction`)
- background.cancelTransaction(txData.id)
- return actions.completedTx(txData.id)
+ return (dispatch) => {
+ log.debug(`background.cancelTransaction`)
+ background.cancelTransaction(txData.id, () => {
+ dispatch(actions.completedTx(txData.id))
+ })
+ }
}
//