From 10d816e95d1ba5554a0c62323754b20b933eefcc Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Sun, 24 Jul 2016 09:30:32 +0200 Subject: [PATCH 01/16] Allow proxying tracker calls and peer connexions in node (TCP/UDP) depends on feross/bittorrent-tracker#157 --- index.js | 21 +++++++++++++++ lib/torrent.js | 69 ++++++++++++++++++++++++++++++++------------------ lib/webconn.js | 16 +++++++++--- package.json | 2 ++ 4 files changed, 79 insertions(+), 29 deletions(-) diff --git a/index.js b/index.js index c0662887..567978bd 100644 --- a/index.js +++ b/index.js @@ -16,6 +16,7 @@ var parseTorrent = require('parse-torrent') var path = require('path') var Peer = require('simple-peer') var randombytes = require('randombytes') +var Socks = require('socks') var speedometer = require('speedometer') var zeroFill = require('zero-fill') @@ -106,6 +107,26 @@ function WebTorrent (opts) { if (global.WRTC && !self.tracker.wrtc) self.tracker.wrtc = global.WRTC } + // Proxy + self.proxyOpts = opts.proxyOpts + if (self.proxyOpts) { + self.proxyOpts.proxyTrackerConnections = self.proxyOpts.proxyTrackerConnections !== false + self.proxyOpts.proxyPeerConnections = self.proxyOpts.proxyPeerConnections !== false + + if (self.proxyOpts.socksProxy) { + if (!self.proxyOpts.socksProxy.proxy) self.proxyOpts.socksProxy.proxy = {} + if (!self.proxyOpts.socksProxy.proxy.type) self.proxyOpts.socksProxy.proxy.type = 5 + + // Create HTTP agents from socks proxy if needed + if (!self.proxyOpts.httpAgent) { + self.proxyOpts.httpAgent = new Socks.Agent(self.proxyOpts.socksProxy, false) + } + if (!self.proxyOpts.httpsAgent) { + self.proxyOpts.httpsAgent = new Socks.Agent(self.proxyOpts.socksProxy, true) + } + } + } + if (typeof TCPPool === 'function') { self._tcpPool = new TCPPool(self) } else { diff --git a/lib/torrent.js b/lib/torrent.js index 78c63754..312648dd 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -26,6 +26,7 @@ var Piece = require('torrent-piece') var pump = require('pump') var randomIterate = require('random-iterate') var sha1 = require('simple-sha1') +var Socks = require('socks') var speedometer = require('speedometer') var uniq = require('uniq') var utMetadata = require('ut_metadata') @@ -1658,38 +1659,56 @@ Torrent.prototype._drain = function () { port: parts[1] } - var conn = peer.conn = net.connect(opts) + if (self.client.proxyOpts && self.client.proxyOpts.socksProxy && self.client.proxyOpts.proxyPeerConnections) { + var proxyOpts = extend(self.client.proxyOpts.socksProxy, { + command: 'connect', + target: opts + }) - conn.once('connect', function () { peer.onConnect() }) - conn.once('error', function (err) { peer.destroy(err) }) - peer.startConnectTimeout() + Socks.createConnection(proxyOpts, onGotSocket) + } else { + onGotSocket(null, net.connect(opts)) + } - // When connection closes, attempt reconnect after timeout (with exponential backoff) - conn.on('close', function () { - if (self.destroyed) return + function onGotSocket (err, socket) { + if (err) return peer.destroy(err) - // TODO: If torrent is done, do not try to reconnect after a timeout + var conn = peer.conn = socket - if (peer.retries >= RECONNECT_WAIT.length) { - self._debug( - 'conn %s closed: will not re-add (max %s attempts)', - peer.addr, RECONNECT_WAIT.length - ) - return + if (self.client.proxyOpts && self.client.proxyOpts.proxyPeerConnections) { + peer.onConnect() } + conn.once('connect', function () { peer.onConnect() }) + conn.once('error', function (err) { peer.destroy(err) }) + peer.startConnectTimeout() - var ms = RECONNECT_WAIT[peer.retries] - self._debug( - 'conn %s closed: will re-add to queue in %sms (attempt %s)', - peer.addr, ms, peer.retries + 1 - ) + // When connection closes, attempt reconnect after timeout (with exponential backoff) + conn.on('close', function () { + if (self.destroyed) return - var reconnectTimeout = setTimeout(function reconnectTimeout () { - var newPeer = self._addPeer(peer.addr) - if (newPeer) newPeer.retries = peer.retries + 1 - }, ms) - if (reconnectTimeout.unref) reconnectTimeout.unref() - }) + // TODO: If torrent is done, do not try to reconnect after a timeout + + if (peer.retries >= RECONNECT_WAIT.length) { + self._debug( + 'conn %s closed: will not re-add (max %s attempts)', + peer.addr, RECONNECT_WAIT.length + ) + return + } + + var ms = RECONNECT_WAIT[peer.retries] + self._debug( + 'conn %s closed: will re-add to queue in %sms (attempt %s)', + peer.addr, ms, peer.retries + 1 + ) + + var reconnectTimeout = setTimeout(function reconnectTimeout () { + var newPeer = self._addPeer(peer.addr) + if (newPeer) newPeer.retries = peer.retries + 1 + }, ms) + if (reconnectTimeout.unref) reconnectTimeout.unref() + }) + } } /** diff --git a/lib/webconn.js b/lib/webconn.js index c52dad6d..e223002c 100644 --- a/lib/webconn.js +++ b/lib/webconn.js @@ -6,6 +6,7 @@ var debug = require('debug')('webtorrent:webconn') var get = require('simple-get') var inherits = require('inherits') var sha1 = require('simple-sha1') +var url = require('url') var Wire = require('bittorrent-protocol') var VERSION = require('../package.json').version @@ -109,20 +110,27 @@ WebConn.prototype.httpRequest = function (pieceIndex, offset, length, cb) { } requests.forEach(function (request) { - var url = request.url + var parsedUrl = url.parse(request.url) var start = request.start var end = request.end debug( 'Requesting url=%s pieceIndex=%d offset=%d length=%d start=%d end=%d', - url, pieceIndex, offset, length, start, end + request.url, pieceIndex, offset, length, start, end ) + + var agent + if (self._torrent.client.proxyOpts && self._torrent.client.proxyOpts.proxyPeerConnections) { + agent = parsedUrl.protocol === 'https:' + ? self._torrent.client.proxyOpts.httpsAgent : self._torrent.client.proxyOpts.httpAgent + } var opts = { - url: url, + url: parsedUrl, method: 'GET', headers: { 'user-agent': 'WebTorrent/' + VERSION + ' (https://webtorrent.io)', range: 'bytes=' + start + '-' + end - } + }, + agent: agent } get.concat(opts, function (err, res, data) { if (hasError) return diff --git a/package.json b/package.json index 320014be..3a6a9b0e 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "load-ip-set": false, "net": false, "os": false, + "socks": false, "ut_pex": false }, "browserify": { @@ -56,6 +57,7 @@ "simple-get": "^2.2.1", "simple-peer": "^6.0.4", "simple-sha1": "^2.0.8", + "socks": "^1.1.9", "speedometer": "^1.0.0", "stream-to-blob": "^1.0.0", "stream-to-blob-url": "^2.1.0", From 40fb20c11ed13ad71bcd01789d9765236e1819dc Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Tue, 9 Aug 2016 11:10:21 +0200 Subject: [PATCH 02/16] Add WebRTC proxy with electron-webrtc --- index.js | 104 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 38 deletions(-) diff --git a/index.js b/index.js index 567978bd..9f6f6734 100644 --- a/index.js +++ b/index.js @@ -124,54 +124,82 @@ function WebTorrent (opts) { if (!self.proxyOpts.httpsAgent) { self.proxyOpts.httpsAgent = new Socks.Agent(self.proxyOpts.socksProxy, true) } - } - } - if (typeof TCPPool === 'function') { - self._tcpPool = new TCPPool(self) + // Convert proxy opts to electron API in webtorrent-hybrid + if (self.tracker.wrtc && self.tracker.wrtc.electronDaemon && + self.proxyOpts && self.proxyOpts.socksProxy && self.proxyOpts.proxyPeerConnections) { + if (!self.proxyOpts.socksProxy.proxy.authentication && !self.proxyOpts.socksProxy.proxy.userid) { + var electronConfig = { + proxyRules: 'socks' + self.proxyOpts.socksProxy.proxy.type + '://' + self.proxyOpts.socksProxy.proxy.ipAddress + ':' + self.proxyOpts.socksProxy.proxy.port + } + self.tracker.wrtc.electronDaemon.eval('window.webContents.session.setProxy(' + + JSON.stringify(electronConfig) + ', function(){})', networkSettingsReady) + } else { + self.emit('error', 'SOCKS Proxy authentication is not available in electron-wrtc') + } + } else { + networkSettingsReady(null) + } + } else { + networkSettingsReady(null) + } } else { - process.nextTick(function () { - self._onListening() - }) + networkSettingsReady(null) } - // stats - self._downloadSpeed = speedometer() - self._uploadSpeed = speedometer() + function networkSettingsReady (err) { + if (err) { + self._destroy(err) + } - if (opts.dht !== false && typeof DHT === 'function' /* browser exclude */) { - // use a single DHT instance for all torrents, so the routing table can be reused - self.dht = new DHT(extend({ nodeId: self.nodeId }, opts.dht)) + if (typeof TCPPool === 'function') { + self._tcpPool = new TCPPool(self) + } else { + process.nextTick(function () { + self._onListening() + }) + } - self.dht.once('error', function (err) { - self._destroy(err) - }) + // stats + self._downloadSpeed = speedometer() + self._uploadSpeed = speedometer() - self.dht.once('listening', function () { - var address = self.dht.address() - if (address) self.dhtPort = address.port - }) + if (opts.dht !== false && typeof DHT === 'function' /* browser exclude */) { + // use a single DHT instance for all torrents, so the routing table can be reused + self.dht = new DHT(extend({nodeId: self.nodeId}, opts.dht)) - // Ignore warning when there are > 10 torrents in the client - self.dht.setMaxListeners(0) + self.dht.once('error', function (err) { + self._destroy(err) + }) - self.dht.listen(self.dhtPort) - } else { - self.dht = false - } + self.dht.once('listening', function () { + var address = self.dht.address() + if (address) self.dhtPort = address.port + }) - if (typeof loadIPSet === 'function' && opts.blocklist != null) { - loadIPSet(opts.blocklist, { - headers: { - 'user-agent': 'WebTorrent/' + VERSION + ' (https://webtorrent.io)' - } - }, function (err, ipSet) { - if (err) return self.error('Failed to load blocklist: ' + err.message) - self.blocked = ipSet - ready() - }) - } else { - process.nextTick(ready) + // Ignore warning when there are > 10 torrents in the client + self.dht.setMaxListeners(0) + + self.dht.listen(self.dhtPort) + } else { + self.dht = false + } + + debug('new webtorrent (peerId %s, nodeId %s)', self.peerId, self.nodeId) + + if (typeof loadIPSet === 'function' && opts.blocklist != null) { + loadIPSet(opts.blocklist, { + headers: { + 'user-agent': 'WebTorrent/' + VERSION + ' (https://webtorrent.io)' + } + }, function (err, ipSet) { + if (err) return self.error('Failed to load blocklist: ' + err.message) + self.blocked = ipSet + ready() + }) + } else { + process.nextTick(ready) + } } function ready () { From 02b9b287c00b2d018e0d67e8e024d551fe7b6a32 Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Wed, 24 Aug 2016 23:19:31 +0200 Subject: [PATCH 03/16] Forward proxyOpts to the tracker when proxyTrackerConnections is true --- index.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/index.js b/index.js index 9f6f6734..3d7da060 100644 --- a/index.js +++ b/index.js @@ -113,6 +113,13 @@ function WebTorrent (opts) { self.proxyOpts.proxyTrackerConnections = self.proxyOpts.proxyTrackerConnections !== false self.proxyOpts.proxyPeerConnections = self.proxyOpts.proxyPeerConnections !== false + if (self.proxyOpts.proxyTrackerConnections && !self.tracker.proxyOpts) { + if (!self.tracker) { + self.tracker = {} + } + self.tracker.proxyOpts = self.proxyOpts + } + if (self.proxyOpts.socksProxy) { if (!self.proxyOpts.socksProxy.proxy) self.proxyOpts.socksProxy.proxy = {} if (!self.proxyOpts.socksProxy.proxy.type) self.proxyOpts.socksProxy.proxy.type = 5 From abda22645eb697de857948a82f90b2f704456e2a Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Wed, 24 Aug 2016 23:48:20 +0200 Subject: [PATCH 04/16] Dont forward proxyOpts to the tracker if set to false --- index.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/index.js b/index.js index 3d7da060..4dad94f0 100644 --- a/index.js +++ b/index.js @@ -113,10 +113,7 @@ function WebTorrent (opts) { self.proxyOpts.proxyTrackerConnections = self.proxyOpts.proxyTrackerConnections !== false self.proxyOpts.proxyPeerConnections = self.proxyOpts.proxyPeerConnections !== false - if (self.proxyOpts.proxyTrackerConnections && !self.tracker.proxyOpts) { - if (!self.tracker) { - self.tracker = {} - } + if (self.tracker && self.proxyOpts.proxyTrackerConnections && !self.tracker.proxyOpts) { self.tracker.proxyOpts = self.proxyOpts } From 072aad6026ba2aad8a8a247321345535627bc1e2 Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Thu, 25 Aug 2016 21:43:53 +0200 Subject: [PATCH 05/16] Clone options before using it in socks --- index.js | 8 ++++++-- lib/torrent.js | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 4dad94f0..9b6470e9 100644 --- a/index.js +++ b/index.js @@ -123,10 +123,14 @@ function WebTorrent (opts) { // Create HTTP agents from socks proxy if needed if (!self.proxyOpts.httpAgent) { - self.proxyOpts.httpAgent = new Socks.Agent(self.proxyOpts.socksProxy, false) + var httpOpts = extend(self.proxyOpts.socksProxy) + httpOpts.proxy = extend(opts.proxy) + self.proxyOpts.httpAgent = new Socks.Agent(httpOpts, false) } if (!self.proxyOpts.httpsAgent) { - self.proxyOpts.httpsAgent = new Socks.Agent(self.proxyOpts.socksProxy, true) + var httpsOpts = extend(self.proxyOpts.socksProxy) + httpsOpts.proxy = extend(opts.proxy) + self.proxyOpts.httpsAgent = new Socks.Agent(httpsOpts, true) } // Convert proxy opts to electron API in webtorrent-hybrid diff --git a/lib/torrent.js b/lib/torrent.js index 312648dd..79c87340 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -1664,6 +1664,7 @@ Torrent.prototype._drain = function () { command: 'connect', target: opts }) + proxyOpts.proxy = extend(proxyOpts.proxy) Socks.createConnection(proxyOpts, onGotSocket) } else { From 6d313db54b0dbde92a9c70c60fa3f471c1d3c349 Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Fri, 26 Aug 2016 10:02:51 +0200 Subject: [PATCH 06/16] Remove socks agent generation since it cannot be reused between requests --- index.js | 13 ------------- lib/torrent.js | 1 - 2 files changed, 14 deletions(-) diff --git a/index.js b/index.js index 9b6470e9..af30e05b 100644 --- a/index.js +++ b/index.js @@ -16,7 +16,6 @@ var parseTorrent = require('parse-torrent') var path = require('path') var Peer = require('simple-peer') var randombytes = require('randombytes') -var Socks = require('socks') var speedometer = require('speedometer') var zeroFill = require('zero-fill') @@ -121,18 +120,6 @@ function WebTorrent (opts) { if (!self.proxyOpts.socksProxy.proxy) self.proxyOpts.socksProxy.proxy = {} if (!self.proxyOpts.socksProxy.proxy.type) self.proxyOpts.socksProxy.proxy.type = 5 - // Create HTTP agents from socks proxy if needed - if (!self.proxyOpts.httpAgent) { - var httpOpts = extend(self.proxyOpts.socksProxy) - httpOpts.proxy = extend(opts.proxy) - self.proxyOpts.httpAgent = new Socks.Agent(httpOpts, false) - } - if (!self.proxyOpts.httpsAgent) { - var httpsOpts = extend(self.proxyOpts.socksProxy) - httpsOpts.proxy = extend(opts.proxy) - self.proxyOpts.httpsAgent = new Socks.Agent(httpsOpts, true) - } - // Convert proxy opts to electron API in webtorrent-hybrid if (self.tracker.wrtc && self.tracker.wrtc.electronDaemon && self.proxyOpts && self.proxyOpts.socksProxy && self.proxyOpts.proxyPeerConnections) { diff --git a/lib/torrent.js b/lib/torrent.js index 79c87340..312648dd 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -1664,7 +1664,6 @@ Torrent.prototype._drain = function () { command: 'connect', target: opts }) - proxyOpts.proxy = extend(proxyOpts.proxy) Socks.createConnection(proxyOpts, onGotSocket) } else { From 124bfc930944ff827cbc370f3a386f5f5fd7bb74 Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Fri, 26 Aug 2016 12:23:02 +0200 Subject: [PATCH 07/16] Use clone to deepcopy socks opts and add socks agent generation to webconns --- lib/torrent.js | 3 ++- lib/webconn.js | 10 ++++++++-- package.json | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/torrent.js b/lib/torrent.js index 312648dd..27c82d9e 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -5,6 +5,7 @@ module.exports = Torrent var addrToIPPort = require('addr-to-ip-port') var BitField = require('bitfield') var ChunkStoreWriteStream = require('chunk-store-stream/write') +var clone = require('clone') var debug = require('debug')('webtorrent:torrent') var Discovery = require('torrent-discovery') var EventEmitter = require('events').EventEmitter @@ -1660,7 +1661,7 @@ Torrent.prototype._drain = function () { } if (self.client.proxyOpts && self.client.proxyOpts.socksProxy && self.client.proxyOpts.proxyPeerConnections) { - var proxyOpts = extend(self.client.proxyOpts.socksProxy, { + var proxyOpts = clone(self.client.proxyOpts.socksProxy, { command: 'connect', target: opts }) diff --git a/lib/webconn.js b/lib/webconn.js index e223002c..3311e32a 100644 --- a/lib/webconn.js +++ b/lib/webconn.js @@ -2,11 +2,13 @@ module.exports = WebConn var BitField = require('bitfield') var Buffer = require('safe-buffer').Buffer +var clone = require('clone') var debug = require('debug')('webtorrent:webconn') var get = require('simple-get') var inherits = require('inherits') var sha1 = require('simple-sha1') var url = require('url') +var Socks = require('socks') var Wire = require('bittorrent-protocol') var VERSION = require('../package.json').version @@ -119,9 +121,13 @@ WebConn.prototype.httpRequest = function (pieceIndex, offset, length, cb) { ) var agent - if (self._torrent.client.proxyOpts && self._torrent.client.proxyOpts.proxyPeerConnections) { + var proxyOpts = self._torrent.client.proxyOpts + if (proxyOpts && proxyOpts.proxyPeerConnections) { agent = parsedUrl.protocol === 'https:' - ? self._torrent.client.proxyOpts.httpsAgent : self._torrent.client.proxyOpts.httpAgent + ? proxyOpts.httpsAgent : proxyOpts.httpAgent + if (!agent && proxyOpts.socksProxy) { + agent = new Socks.Agent(clone(proxyOpts.socksProxy), (parsedUrl.protocol === 'https:')) + } } var opts = { url: parsedUrl, diff --git a/package.json b/package.json index 3a6a9b0e..20d4121a 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "bittorrent-dht": "^7.2.2", "bittorrent-protocol": "^2.1.5", "chunk-store-stream": "^2.0.2", + "clone": "^1.0.2", "create-torrent": "^3.24.5", "debug": "^2.2.0", "end-of-stream": "^1.1.0", From f1271995313f5d055755c2ffc2a36681b9f48b71 Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Fri, 26 Aug 2016 14:31:29 +0200 Subject: [PATCH 08/16] Fix a bug in cloning / extending --- lib/torrent.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/torrent.js b/lib/torrent.js index 27c82d9e..5379a4e0 100644 --- a/lib/torrent.js +++ b/lib/torrent.js @@ -1661,12 +1661,12 @@ Torrent.prototype._drain = function () { } if (self.client.proxyOpts && self.client.proxyOpts.socksProxy && self.client.proxyOpts.proxyPeerConnections) { - var proxyOpts = clone(self.client.proxyOpts.socksProxy, { + var proxyOpts = extend(self.client.proxyOpts.socksProxy, { command: 'connect', target: opts }) - Socks.createConnection(proxyOpts, onGotSocket) + Socks.createConnection(clone(proxyOpts), onGotSocket) } else { onGotSocket(null, net.connect(opts)) } From 158330896a76d30b787d9e71f48a31e89ee3e29f Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Fri, 26 Aug 2016 15:33:40 +0200 Subject: [PATCH 09/16] Check for proxy requirements in electron --- index.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index af30e05b..2b47f7d7 100644 --- a/index.js +++ b/index.js @@ -120,17 +120,24 @@ function WebTorrent (opts) { if (!self.proxyOpts.socksProxy.proxy) self.proxyOpts.socksProxy.proxy = {} if (!self.proxyOpts.socksProxy.proxy.type) self.proxyOpts.socksProxy.proxy.type = 5 + // Ensure electron-wrtc is used in electron with socks proxy + if (self.proxyOpts.socksProxy && self.proxyOpts.proxyPeerConnections && + process && process.versions['electron'] && + self.tracker.wrtc && !self.tracker.wrtc.electronDaemon) { + return self.emit('error', 'You need to provide an electron-wrtc instance in opts.wrtc to use socks in electron') + } + // Convert proxy opts to electron API in webtorrent-hybrid if (self.tracker.wrtc && self.tracker.wrtc.electronDaemon && - self.proxyOpts && self.proxyOpts.socksProxy && self.proxyOpts.proxyPeerConnections) { - if (!self.proxyOpts.socksProxy.proxy.authentication && !self.proxyOpts.socksProxy.proxy.userid) { + self.proxyOpts.socksProxy && self.proxyOpts.proxyPeerConnections) { + if (!self.proxyOpts.socksProxy.proxy.authentication && !self.proxyOpts.socksProxy.proxy.userid && self.proxyOpts.socksProxy.proxy.type === 5) { var electronConfig = { proxyRules: 'socks' + self.proxyOpts.socksProxy.proxy.type + '://' + self.proxyOpts.socksProxy.proxy.ipAddress + ':' + self.proxyOpts.socksProxy.proxy.port } self.tracker.wrtc.electronDaemon.eval('window.webContents.session.setProxy(' + JSON.stringify(electronConfig) + ', function(){})', networkSettingsReady) } else { - self.emit('error', 'SOCKS Proxy authentication is not available in electron-wrtc') + self.emit('error', 'SOCKS Proxy must be version 5 with no authentication to work in electron-wrtc') } } else { networkSettingsReady(null) From ac34a891396aecd52e116f6bd1f2c12916fe06cc Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Fri, 26 Aug 2016 17:43:41 +0200 Subject: [PATCH 10/16] Disable WebRTC when proxy not compatible but continue with other transports --- index.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 2b47f7d7..799a2396 100644 --- a/index.js +++ b/index.js @@ -124,7 +124,8 @@ function WebTorrent (opts) { if (self.proxyOpts.socksProxy && self.proxyOpts.proxyPeerConnections && process && process.versions['electron'] && self.tracker.wrtc && !self.tracker.wrtc.electronDaemon) { - return self.emit('error', 'You need to provide an electron-wrtc instance in opts.wrtc to use socks in electron') + self.emit('error', 'You need to provide an electron-wrtc instance in opts.wrtc to use Socks proxy in electron -> WebRTC is disabled') + self.tracker.wrtc = false } // Convert proxy opts to electron API in webtorrent-hybrid @@ -137,7 +138,9 @@ function WebTorrent (opts) { self.tracker.wrtc.electronDaemon.eval('window.webContents.session.setProxy(' + JSON.stringify(electronConfig) + ', function(){})', networkSettingsReady) } else { - self.emit('error', 'SOCKS Proxy must be version 5 with no authentication to work in electron-wrtc') + self.emit('error', 'SOCKS Proxy must be version 5 with no authentication to work in electron-wrtc -> WebRTC is disabled') + self.tracker.wrtc = false + networkSettingsReady(null) } } else { networkSettingsReady(null) From 3fe91eff62e314b8dd51da5fcd4aa0e5687bc39d Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Fri, 26 Aug 2016 17:58:13 +0200 Subject: [PATCH 11/16] Cleanup and error checking --- index.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/index.js b/index.js index 799a2396..c6e45486 100644 --- a/index.js +++ b/index.js @@ -116,12 +116,13 @@ function WebTorrent (opts) { self.tracker.proxyOpts = self.proxyOpts } - if (self.proxyOpts.socksProxy) { - if (!self.proxyOpts.socksProxy.proxy) self.proxyOpts.socksProxy.proxy = {} - if (!self.proxyOpts.socksProxy.proxy.type) self.proxyOpts.socksProxy.proxy.type = 5 + var socksProxy = self.proxyOpts.socksProxy; + if (socksProxy) { + if (!socksProxy.proxy) socksProxy.proxy = {} + if (!socksProxy.proxy.type) socksProxy.proxy.type = 5 // Ensure electron-wrtc is used in electron with socks proxy - if (self.proxyOpts.socksProxy && self.proxyOpts.proxyPeerConnections && + if (self.tracker && socksProxy && self.proxyOpts.proxyPeerConnections && process && process.versions['electron'] && self.tracker.wrtc && !self.tracker.wrtc.electronDaemon) { self.emit('error', 'You need to provide an electron-wrtc instance in opts.wrtc to use Socks proxy in electron -> WebRTC is disabled') @@ -129,11 +130,11 @@ function WebTorrent (opts) { } // Convert proxy opts to electron API in webtorrent-hybrid - if (self.tracker.wrtc && self.tracker.wrtc.electronDaemon && - self.proxyOpts.socksProxy && self.proxyOpts.proxyPeerConnections) { - if (!self.proxyOpts.socksProxy.proxy.authentication && !self.proxyOpts.socksProxy.proxy.userid && self.proxyOpts.socksProxy.proxy.type === 5) { + if (self.tracker && self.tracker.wrtc && self.tracker.wrtc.electronDaemon && + socksProxy && self.proxyOpts.proxyPeerConnections) { + if (!socksProxy.proxy.authentication && !socksProxy.proxy.userid && socksProxy.proxy.type === 5) { var electronConfig = { - proxyRules: 'socks' + self.proxyOpts.socksProxy.proxy.type + '://' + self.proxyOpts.socksProxy.proxy.ipAddress + ':' + self.proxyOpts.socksProxy.proxy.port + proxyRules: 'socks' + socksProxy.proxy.type + '://' + socksProxy.proxy.ipAddress + ':' + socksProxy.proxy.port } self.tracker.wrtc.electronDaemon.eval('window.webContents.session.setProxy(' + JSON.stringify(electronConfig) + ', function(){})', networkSettingsReady) From 69a66a80b3dea2d04c8236c984f5ef9c36ae975e Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Fri, 26 Aug 2016 17:59:21 +0200 Subject: [PATCH 12/16] Fix IDE adding semi... --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index c6e45486..eff216df 100644 --- a/index.js +++ b/index.js @@ -116,7 +116,7 @@ function WebTorrent (opts) { self.tracker.proxyOpts = self.proxyOpts } - var socksProxy = self.proxyOpts.socksProxy; + var socksProxy = self.proxyOpts.socksProxy if (socksProxy) { if (!socksProxy.proxy) socksProxy.proxy = {} if (!socksProxy.proxy.type) socksProxy.proxy.type = 5 From bf564ba4ef2f7198f5db94628944a6c20af11eb5 Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Fri, 26 Aug 2016 18:28:47 +0200 Subject: [PATCH 13/16] Handle missing wrtc prop --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index eff216df..4016ca4f 100644 --- a/index.js +++ b/index.js @@ -124,7 +124,7 @@ function WebTorrent (opts) { // Ensure electron-wrtc is used in electron with socks proxy if (self.tracker && socksProxy && self.proxyOpts.proxyPeerConnections && process && process.versions['electron'] && - self.tracker.wrtc && !self.tracker.wrtc.electronDaemon) { + (!self.tracker.wrtc || (self.tracker.wrtc && !self.tracker.wrtc.electronDaemon))) { self.emit('error', 'You need to provide an electron-wrtc instance in opts.wrtc to use Socks proxy in electron -> WebRTC is disabled') self.tracker.wrtc = false } From 2a410fdd0f06bbe97269a192ceaaad2cc4214f44 Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Fri, 26 Aug 2016 18:52:53 +0200 Subject: [PATCH 14/16] Prevent destroying client on proxy config problem --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 4016ca4f..eaf0fe18 100644 --- a/index.js +++ b/index.js @@ -125,7 +125,7 @@ function WebTorrent (opts) { if (self.tracker && socksProxy && self.proxyOpts.proxyPeerConnections && process && process.versions['electron'] && (!self.tracker.wrtc || (self.tracker.wrtc && !self.tracker.wrtc.electronDaemon))) { - self.emit('error', 'You need to provide an electron-wrtc instance in opts.wrtc to use Socks proxy in electron -> WebRTC is disabled') + console.warn('You need to provide an electron-wrtc instance in opts.wrtc to use Socks proxy in electron -> WebRTC is disabled') self.tracker.wrtc = false } @@ -139,7 +139,7 @@ function WebTorrent (opts) { self.tracker.wrtc.electronDaemon.eval('window.webContents.session.setProxy(' + JSON.stringify(electronConfig) + ', function(){})', networkSettingsReady) } else { - self.emit('error', 'SOCKS Proxy must be version 5 with no authentication to work in electron-wrtc -> WebRTC is disabled') + console.warn('SOCKS Proxy must be version 5 with no authentication to work in electron-wrtc -> WebRTC is disabled') self.tracker.wrtc = false networkSettingsReady(null) } From ba6269b783d4a6e113ecf669ad40ad9c6b0981f1 Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Sat, 27 Aug 2016 08:44:17 +0200 Subject: [PATCH 15/16] Run the proxy settings in the electron-wrtc main process --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index eaf0fe18..6b5b509a 100644 --- a/index.js +++ b/index.js @@ -137,7 +137,7 @@ function WebTorrent (opts) { proxyRules: 'socks' + socksProxy.proxy.type + '://' + socksProxy.proxy.ipAddress + ':' + socksProxy.proxy.port } self.tracker.wrtc.electronDaemon.eval('window.webContents.session.setProxy(' + - JSON.stringify(electronConfig) + ', function(){})', networkSettingsReady) + JSON.stringify(electronConfig) + ', function(){})', {mainProcess: true}, networkSettingsReady) } else { console.warn('SOCKS Proxy must be version 5 with no authentication to work in electron-wrtc -> WebRTC is disabled') self.tracker.wrtc = false From 04399a6759aae830b893c670a649ebdfa17e59da Mon Sep 17 00:00:00 2001 From: Yoann Ciabaud Date: Tue, 6 Sep 2016 07:52:57 +0200 Subject: [PATCH 16/16] Remove useless conditions conditions --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 6b5b509a..1afff0b6 100644 --- a/index.js +++ b/index.js @@ -122,9 +122,9 @@ function WebTorrent (opts) { if (!socksProxy.proxy.type) socksProxy.proxy.type = 5 // Ensure electron-wrtc is used in electron with socks proxy - if (self.tracker && socksProxy && self.proxyOpts.proxyPeerConnections && + if (self.tracker && self.proxyOpts.proxyPeerConnections && process && process.versions['electron'] && - (!self.tracker.wrtc || (self.tracker.wrtc && !self.tracker.wrtc.electronDaemon))) { + self.tracker.wrtc && !self.tracker.wrtc.electronDaemon) { console.warn('You need to provide an electron-wrtc instance in opts.wrtc to use Socks proxy in electron -> WebRTC is disabled') self.tracker.wrtc = false }