From 5683d708ddb68eec6b579ccb9539d41e51871f88 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Fri, 16 Dec 2016 17:56:00 -0800 Subject: [PATCH] browser: add dns resolution. --- browser/index.js | 4 ++-- browser/wsproxy.js | 40 +++++++++++++++++++++++++++++++++++++++- lib/net/dns-browser.js | 24 ++++++++++++++++++++++-- lib/net/index.js | 1 - lib/net/pool.js | 3 ++- lib/net/proxysocket.js | 19 +++++++++++++++++-- lib/protocol/index.js | 1 + lib/utils/index.js | 1 + 8 files changed, 84 insertions(+), 9 deletions(-) diff --git a/browser/index.js b/browser/index.js index ff04163f..61a15bae 100644 --- a/browser/index.js +++ b/browser/index.js @@ -178,7 +178,7 @@ function formatWallet(wallet) { html += 'Current Address: ' + wallet.getAddress() + '
'; } - html += 'Extended Private Key: ' + key.toBase58() + '
'; + html += 'Extended Private Key: ' + key.xprivkey + '
'; html += 'Mnemonic: ' + key.mnemonic.phrase + '
'; wallet.getBalance().then(function(balance) { @@ -215,7 +215,7 @@ options = bcoin.config({ network: 'segnet4', db: 'leveldb', useWorkers: true, - coinCache: true, + coinCache: 30000000, logger: logger }); diff --git a/browser/wsproxy.js b/browser/wsproxy.js index 14d58978..1f3f4af6 100644 --- a/browser/wsproxy.js +++ b/browser/wsproxy.js @@ -1,12 +1,15 @@ 'use strict'; var net = require('net'); +var dns = require('dns'); var IOServer = require('socket.io'); var util = require('../lib/utils/util'); var IP = require('../lib/utils/ip'); var BufferWriter = require('../lib/utils/writer'); var EventEmitter = require('events').EventEmitter; +var NAME_REGEX = /^[a-z0-9\-\.]+?\.(?:be|me|org|com|net|ch|de)$/i; + var TARGET = new Buffer( '0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 'hex'); @@ -61,6 +64,41 @@ WSProxy.prototype._handleSocket = function _handleSocket(ws) { ws.on('tcp connect', function(port, host, nonce) { self._handleConnect(ws, port, host, nonce); }); + + ws.on('dns resolve', function(name, record, callback) { + self._handleResolve(ws, name, record, callback); + }); +}; + +WSProxy.prototype._handleResolve = function _handleResolve(ws, name, record, callback) { + if (typeof name !== 'string') { + ws.disconnect(); + return; + } + + if (typeof record !== 'string') { + ws.disconnect(); + return; + } + + if (typeof callback !== 'function') { + ws.disconnect(); + return; + } + + if (!NAME_REGEX.test(name) || name.length > 200) { + this.log('Client sent a bad domain: %s.', name); + ws.disconnect(); + return; + } + + dns.resolve(name, record, function(err, result) { + if (err) { + callback({ message: err.message, code: err.code }); + return; + } + callback(null, result); + }); }; WSProxy.prototype._handleConnect = function _handleConnect(ws, port, host, nonce) { @@ -84,7 +122,7 @@ WSProxy.prototype._handleConnect = function _handleConnect(ws, port, host, nonce if (this.pow) { if (!util.isNumber(nonce)) { - this.log('Client did not solve proof of work.', state.host); + this.log('Client did not solve proof of work (%s).', state.host); ws.emit('tcp close'); ws.disconnect(); return; diff --git a/lib/net/dns-browser.js b/lib/net/dns-browser.js index c4873193..1c9c095c 100644 --- a/lib/net/dns-browser.js +++ b/lib/net/dns-browser.js @@ -6,6 +6,26 @@ 'use strict'; -exports.resolve = function resolve(host) { - return Promise.reject(new Error('No DNS results.')); +var ProxySocket = require('./proxysocket'); +var socket; + +exports.resolve = function resolve(host, proxy) { + return new Promise(function(resolve, reject) { + if (!socket) + socket = new ProxySocket(proxy); + + socket.resolve(host, 'A', function(err, result) { + if (err) { + reject(err); + return; + } + + if (result.length === 0) { + reject(new Error('No DNS results.')); + return; + } + + resolve(result); + }); + }); }; diff --git a/lib/net/index.js b/lib/net/index.js index 2bba2566..dbede865 100644 --- a/lib/net/index.js +++ b/lib/net/index.js @@ -10,4 +10,3 @@ exports.Peer = require('./peer'); exports.Pool = require('./pool'); exports.tcp = require('./tcp'); exports.dns = require('./dns'); -exports.time = require('./time'); diff --git a/lib/net/pool.js b/lib/net/pool.js index 4c88d22e..0d6e3df6 100644 --- a/lib/net/pool.js +++ b/lib/net/pool.js @@ -2166,6 +2166,7 @@ function HostList(pool) { this.network = pool.network; this.logger = pool.logger; this.maxOutbound = pool.maxOutbound; + this.proxyServer = pool.proxyServer; this.list = new List(); this.seeds = []; this.map = {}; @@ -2381,7 +2382,7 @@ HostList.prototype.populate = co(function* populate(seed) { this.logger.info('Resolving hosts from seed: %s.', seed.host); try { - hosts = yield dns.resolve(seed.host); + hosts = yield dns.resolve(seed.host, this.proxyServer); } catch (e) { this.logger.error(e); return; diff --git a/lib/net/proxysocket.js b/lib/net/proxysocket.js index 9330e9cb..6d9d5949 100644 --- a/lib/net/proxysocket.js +++ b/lib/net/proxysocket.js @@ -92,6 +92,19 @@ ProxySocket.prototype._init = function _init() { }); }; +ProxySocket.prototype.resolve = function resolve(name, record, callback) { + var e; + this.socket.emit('dns resolve', name, record, function(err, results) { + if (err) { + e = new Error(err.message); + e.code = err.code || null; + callback(e); + return; + } + callback(null, results); + }); +}; + ProxySocket.prototype.connect = function connect(port, host) { var nonce = 0; var i, pow; @@ -104,8 +117,10 @@ ProxySocket.prototype.connect = function connect(port, host) { return; } - if (!this.info) - return this.once('info', connect.bind(this, port, host)); + if (!this.info) { + this.once('info', connect.bind(this, port, host)); + return; + } if (this.info.pow) { util.log( diff --git a/lib/protocol/index.js b/lib/protocol/index.js index 7cca81e7..a4bbd2c7 100644 --- a/lib/protocol/index.js +++ b/lib/protocol/index.js @@ -3,3 +3,4 @@ exports.constants = require('./constants'); exports.networks = require('./networks'); exports.Network = require('./network'); +exports.timedata = require('./timedata'); diff --git a/lib/utils/index.js b/lib/utils/index.js index 6e69900a..6f2c7143 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -12,6 +12,7 @@ exports.lazy = require('./lazy'); exports.Locker = require('./locker'); exports.MappedLocker = exports.Locker.Mapped; exports.LRU = require('./lru'); +exports.List = require('./list'); exports.murmur3 = require('./murmur3'); exports.nextTick = require('./nexttick'); exports.nfkd = require('./nfkd');