const ObservableStore = require('obs-store') const extend = require('xtend') const PhishingDetector = require('eth-phishing-detect/src/detector') const log = require('loglevel') // compute phishing lists const PHISHING_DETECTION_CONFIG = require('eth-phishing-detect/src/config.json') // every four minutes const POLLING_INTERVAL = 4 * 60 * 1000 class BlacklistController { /** * Responsible for polling for and storing an up to date 'eth-phishing-detect' config.json file, while * exposing a method that can check whether a given url is a phishing attempt. The 'eth-phishing-detect' * config.json file contains a fuzzylist, whitelist and blacklist. * * * @typedef {Object} BlacklistController * @param {object} opts Overrides the defaults for the initial state of this.store * @property {object} store The the store of the current phishing config * @property {object} store.phishing Contains fuzzylist, whitelist and blacklist arrays. @see * {@link https://github.com/MetaMask/eth-phishing-detect/blob/master/src/config.json} * @property {object} _phishingDetector The PhishingDetector instantiated by passing store.phishing to * PhishingDetector. * @property {object} _phishingUpdateIntervalRef Id of the interval created to periodically update the blacklist * */ constructor (opts = {}) { const initState = extend({ 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 } /** * Given a url, returns the result of checking if that url is in the store.phishing blacklist * * @param {string} hostname The hostname portion of a url; the one that will be checked against the white and * blacklists of store.phishing * @returns {boolean} Whether or not the passed hostname is on our phishing blacklist * */ checkForPhishing (hostname) { if (!hostname) return false const { result } = this._phishingDetector.check(hostname) return result } /** * Queries `https://api.infura.io/v2/blacklist` for an updated blacklist config. This is passed to this._phishingDetector * to update our phishing detector instance, and is updated in the store. The new phishing config is returned * * * @returns {Promise<object>} Promises the updated blacklist config for the phishingDetector * */ async updatePhishingList () { const response = await fetch('https://api.infura.io/v2/blacklist') const phishing = await response.json() this.store.updateState({ phishing }) this._setupPhishingDetector(phishing) return phishing } /** * Initiates the updating of the local blacklist at a set interval. The update is done via this.updatePhishingList(). * Also, this method store a reference to that interval at this._phishingUpdateIntervalRef * */ scheduleUpdates () { if (this._phishingUpdateIntervalRef) return this.updatePhishingList().catch(log.warn) this._phishingUpdateIntervalRef = setInterval(() => { this.updatePhishingList().catch(log.warn) }, POLLING_INTERVAL) } /** * Sets this._phishingDetector to a new PhishingDetector instance. * @see {@link https://github.com/MetaMask/eth-phishing-detect} * * @private * @param {object} config A config object like that found at {@link https://github.com/MetaMask/eth-phishing-detect/blob/master/src/config.json} * */ _setupPhishingDetector (config) { this._phishingDetector = new PhishingDetector(config) } } module.exports = BlacklistController ranches/2016Q4'>branches/2016Q4</option> <option value='branches/2017Q1'>branches/2017Q1</option> <option value='branches/2017Q2'>branches/2017Q2</option> <option value='branches/2017Q3'>branches/2017Q3</option> <option value='branches/2017Q4'>branches/2017Q4</option> <option value='branches/2018Q1'>branches/2018Q1</option> <option value='branches/2018Q2'>branches/2018Q2</option> <option value='branches/2018Q3'>branches/2018Q3</option> <option value='branches/2018Q4'>branches/2018Q4</option> <option value='branches/2019Q1'>branches/2019Q1</option> <option value='branches/2019Q2'>branches/2019Q2</option> <option value='branches/2019Q3'>branches/2019Q3</option> <option value='branches/2019Q4'>branches/2019Q4</option> <option value='branches/2020Q1'>branches/2020Q1</option> <option value='branches/2020Q2'>branches/2020Q2</option> <option value='branches/2020Q3'>branches/2020Q3</option> <option value='branches/2020Q4'>branches/2020Q4</option> <option value='branches/2021Q1'>branches/2021Q1</option> <option value='branches/RELEASE_8_4_0'>branches/RELEASE_8_4_0</option> <option value='branches/RELENG_2_1_0'>branches/RELENG_2_1_0</option> <option value='branches/RELENG_2_2'>branches/RELENG_2_2</option> <option value='branches/RELENG_9_1_0'>branches/RELENG_9_1_0</option> <option value='branches/RELENG_9_2_0'>branches/RELENG_9_2_0</option> <option value='dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3'>dependabot/npm_and_yarn/devel/electron4/files/eslint-utils-1.4.3</option> <option value='dependabot/npm_and_yarn/devel/electron4/files/lodash-4.17.15'>dependabot/npm_and_yarn/devel/electron4/files/lodash-4.17.15</option> <option value='dependabot/npm_and_yarn/devel/electron4/files/lodash.merge-4.6.2'>dependabot/npm_and_yarn/devel/electron4/files/lodash.merge-4.6.2</option> <option value='dependabot/npm_and_yarn/devel/electron4/files/lodash.template-4.5.0'>dependabot/npm_and_yarn/devel/electron4/files/lodash.template-4.5.0</option> <option value='dependabot/npm_and_yarn/devel/electron4/files/minimist-1.2.2'>dependabot/npm_and_yarn/devel/electron4/files/minimist-1.2.2</option> <option value='dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'>dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2</option> <option value='main' selected='selected'>main</option> <option value='master'>master</option> <option value='svn_head'>svn_head</option> </select> <input type='submit' value='switch'/></form></td></tr> <tr><td class='sub'>FreeBSD Ports (https://github.com/freebsd/freebsd-ports)</td><td class='sub right'></td></tr></table> <table class='tabs'><tr><td> <a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/about/'>about</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/'>summary</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/refs/?id=1e1181ab180470952c0eacda07094da95c6404f9'>refs</a><a class='active' href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/astro/weather'>log</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/tree/astro/weather?id=1e1181ab180470952c0eacda07094da95c6404f9'>tree</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/astro/weather?id=1e1181ab180470952c0eacda07094da95c6404f9'>commit</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/diff/astro/weather?id=1e1181ab180470952c0eacda07094da95c6404f9'>diff</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/stats/astro/weather'>stats</a></td><td class='form'><form class='right' method='get' action='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/astro/weather'> <input type='hidden' name='id' value='1e1181ab180470952c0eacda07094da95c6404f9'/><select name='qt'> <option value='grep'>log msg</option> <option value='author'>author</option> <option value='committer'>committer</option> <option value='range'>range</option> </select> <input class='txt' type='search' size='10' name='q' value=''/> <input type='submit' value='search'/> </form> </td></tr></table> <div class='path'>path: <a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/?id=1e1181ab180470952c0eacda07094da95c6404f9'>root</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/astro?id=1e1181ab180470952c0eacda07094da95c6404f9'>astro</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/astro/weather?id=1e1181ab180470952c0eacda07094da95c6404f9'>weather</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th></th><th class='left'>Commit message (<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/astro/weather?id=1e1181ab180470952c0eacda07094da95c6404f9&showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Age</th><th class='left'>Files</th><th class='left'>Lines</th></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/astro/weather?id=967018c1f048b2668dd4fbc1a6dc39f9e1dc556e'>astro/weather: Cosmetic change</a></td><td>Po-Chuan Hsieh</td><td><span title='2021-04-18 13:41:51 +0800'>2021-04-18</span></td><td>2</td><td><span class='deletions'>-16</span>/<span class='insertions'>+16</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/astro/weather?id=305f148f482daf30dcf728039d03d019f88344eb'>Remove # $FreeBSD$ from Makefiles.</a></td><td>Mathieu Arnold</td><td><span title='2021-04-06 22:31:07 +0800'>2021-04-06</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+0</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/astro/weather?id=1b233e41d4fabe88b9c5a01e6244f5f545f59233'>Clean up PYTHON_PYOEXTENSION (followup of r500018 and 569588)</a></td><td>Sunpoet Po-Chuan Hsieh</td><td><span title='2021-03-31 03:20:21 +0800'>2021-03-31</span></td><td>1</td><td><span class='deletions'>-2</span>/<span class='insertions'>+2</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/astro/weather?id=99e3b67c3d6643d3d828cdc8de19d13a7a3bbd8c'>Remove PYTHON_REL check after r564032 (USES=python means USES=python:3.6+)</a></td><td>Sunpoet Po-Chuan Hsieh</td><td><span title='2021-03-08 06:10:14 +0800'>2021-03-08</span></td><td>1</td><td><span class='deletions'>-16</span>/<span class='insertions'>+6</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/astro/weather?id=034e450d1d5cc424cdf0405f961c439cd198202a'>Update to 2.4.1</a></td><td>Sunpoet Po-Chuan Hsieh</td><td><span title='2020-09-05 18:08:24 +0800'>2020-09-05</span></td><td>2</td><td><span class='deletions'>-4</span>/<span class='insertions'>+4</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/astro/weather?id=47af5e32faaf7b15372cf08e978b8afd1cc53777'>Update to 2.4</a></td><td>Sunpoet Po-Chuan Hsieh</td><td><span title='2020-06-23 03:34:45 +0800'>2020-06-23</span>