From b3700e0202916787e7044b965042a8382f7f2819 Mon Sep 17 00:00:00 2001 From: Zachary Boyd Date: Wed, 9 May 2018 22:42:30 -0700 Subject: [PATCH] Bundles the Tor executable --- Dockerfile | 17 +--- README.md | 3 +- bin/tor-router | 7 +- package-lock.json | 224 ++++++++++++++++++++++++++++++++++++++++-- package.json | 3 +- src/TorPool.js | 2 +- src/TorProcess.js | 4 +- src/default_config.js | 22 +++++ 8 files changed, 252 insertions(+), 30 deletions(-) diff --git a/Dockerfile b/Dockerfile index 84ea609..d3a0ed8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:18.04 +FROM node:8 WORKDIR /app @@ -12,21 +12,6 @@ ENV PARENT_DATA_DIRECTORTY /var/lib/tor-router ENV PATH $PATH:/app/bin -ADD https://deb.nodesource.com/setup_8.x /tmp/nodejs_install - -RUN apt-get update && apt-get -y install dirmngr - -RUN gpg --keyserver keys.gnupg.net --recv A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 && gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add - - -RUN echo 'deb http://deb.torproject.org/torproject.org artful main\n\ -\n\ -deb-src http://deb.torproject.org/torproject.org artful main'\ ->> /etc/apt/sources.list.d/tor.list - -RUN bash /tmp/nodejs_install - -RUN apt-get install -y nodejs tor git - ADD package.json /app/package.json RUN npm install diff --git a/README.md b/README.md index 4dfc31a..0581597 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Tor Router also includes a DNS forward proxy and a HTTP forward proxy as well, w ## Building and Running -Installation requirements are node.js and tor. Make sure "tor" is in your PATH. +The only installation requirement is node.js. Tor will be downloaded when the node modules are installed. To install run: `npm install` To start run: `bin/tor-router` @@ -33,6 +33,7 @@ The following command line switches and their environment variable equivalents a |-l, --logLevel |LOG_LEVEL |Log level (defaults to "info") set to "null" to disable logging. To see a log of all network traffic set logLevel to "verbose"| |-p, --parentDataDirectory|PARENT_DATA_DIRECTORY |Parent directory that will contain the data directories for the instances| |-b, --loadBalanceMethod|LOAD_BALANCE_METHOD |Method that will be used to sort the instances between each request. Currently supports "round_robin" and "weighted".| +|-t, --torPath|TOR_PATH|Provide the path for the Tor executable that will be used| For example: `tor-router -j 3 -s 9050` would start the proxy with 3 tor instances and listen for SOCKS connections on 9050. diff --git a/bin/tor-router b/bin/tor-router index 1335e65..b29613a 100755 --- a/bin/tor-router +++ b/bin/tor-router @@ -67,10 +67,15 @@ let argv_config = require('yargs') alias: "loadBalanceMethod", describe: 'Method that will be used to sort the instances between each request. Currently supports "round_robin" and "weighted". [default: round_robin]', demand: false + }, + t: { + alias: "torPath", + describe: "Provide the path for the Tor executable that will be used", + demand: false } }); -let env_whitelist = [ "CONTROL_PORT", "INSTANCES", "SOCKS_PORT", "DNS_PORT", "HTTP_PORT", "LOG_LEVEL", 'PARENT_DATA_DIRECTORIES', 'LOAD_BALANCE_METHOD', "controlPort", "instances", "socksPort", "dnsPort", "httpPort", "logLevel", 'parentDataDirectories', 'loadBalanceMethod']; +let env_whitelist = [ "CONTROL_PORT", "TOR_PATH", "INSTANCES", "SOCKS_PORT", "DNS_PORT", "HTTP_PORT", "LOG_LEVEL", 'PARENT_DATA_DIRECTORIES', 'LOAD_BALANCE_METHOD', "controlPort", "torPath", "instances", "socksPort", "dnsPort", "httpPort", "logLevel", 'parentDataDirectories', 'loadBalanceMethod']; nconf .env({ diff --git a/package-lock.json b/package-lock.json index 9c86602..c27b057 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,20 @@ { "name": "tor-router", - "version": "3.3.0", + "version": "3.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "7zip": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/7zip/-/7zip-0.0.6.tgz", + "integrity": "sha1-nK+xca+CMpSQNTtIFvAzR6oVCjA=", + "optional": true + }, + "@types/node": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.6.tgz", + "integrity": "sha512-2whhQUfDHRBiZ3L54Ulyl1X+fZWbWabxPYRDAsibgOAtE6adwusD15Xv0Bw/D7cPah35Z/wKTdW3iAKsevw1uw==" + }, "agent-base": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", @@ -94,6 +105,11 @@ "tweetnacl": "0.14.5" } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, "boom": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", @@ -137,6 +153,19 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "requires": { + "css-select": "1.2.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "parse5": "3.0.3" + } + }, "cli": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz", @@ -299,6 +328,22 @@ } } }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" + }, "cycle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", @@ -362,6 +407,44 @@ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", "dev": true }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -380,6 +463,11 @@ "env-variable": "0.0.4" } }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, "env-variable": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.4.tgz", @@ -464,6 +552,24 @@ "locate-path": "2.0.0" } }, + "follow-redirects": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", + "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -551,6 +657,19 @@ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true }, + "granax": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/granax/-/granax-3.1.3.tgz", + "integrity": "sha512-oo2E7D7IwZORxan9duXjdMhm3fcjzZYWMq7CWPQsYvscoJy/4J6aNA2J94yljXlDz+HhomhC71Ge/QgUNRtsFw==", + "requires": { + "7zip": "0.0.6", + "async": "2.6.0", + "latest-torbrowser-version": "2.0.1", + "merge": "1.2.0", + "mkdirp": "0.5.1", + "ncp": "2.0.0" + } + }, "growl": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", @@ -608,6 +727,19 @@ "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", "dev": true }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -713,6 +845,11 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -803,6 +940,17 @@ "colornames": "0.0.2" } }, + "latest-torbrowser-version": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/latest-torbrowser-version/-/latest-torbrowser-version-2.0.1.tgz", + "integrity": "sha512-HtbbcKs6cl7Tz4RG+l1uulWd+tOJujn8wqyXd2zZjPRk9rO/mslg7Ajg72beEFCXwHPWZzwVR+w8mPO5yDiOWg==", + "requires": { + "async": "2.6.0", + "cheerio": "1.0.0-rc.2", + "follow-redirects": "1.4.1", + "semver": "5.5.0" + } + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -963,6 +1111,11 @@ "mimic-fn": "1.2.0" } }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" + }, "mime-db": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", @@ -994,14 +1147,12 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -1054,8 +1205,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "nanoid": { "version": "1.0.2", @@ -1172,6 +1322,12 @@ } } }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true + }, "npm": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/npm/-/npm-5.8.0.tgz", @@ -5558,6 +5714,14 @@ "path-key": "2.0.1" } }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "requires": { + "boolbase": "1.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -5633,6 +5797,14 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "requires": { + "@types/node": "10.0.6" + } + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -5682,6 +5854,11 @@ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -5699,6 +5876,20 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, "request": { "version": "2.85.0", "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", @@ -5747,14 +5938,18 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "secure-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=" }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -5888,6 +6083,14 @@ "strip-ansi": "4.0.0" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, "stringstream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", @@ -5960,6 +6163,11 @@ "dev": true, "optional": true }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "uuid": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", diff --git a/package.json b/package.json index 7aec42a..177cfd1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tor-router", - "version": "3.3.0", + "version": "3.4.0", "main": "src/index.js", "repository": "git@github.com:znetstar/tor-router.git", "author": "Zachary Boyd ", @@ -24,6 +24,7 @@ "del": "^3.0.0", "eventemitter2": "^3.0.0", "get-port": "^2.1.0", + "granax": "^3.1.3", "jrpc2": "^1.0.5", "js-weighted-list": "^0.1.1", "lodash": "^4.17.4", diff --git a/src/TorPool.js b/src/TorPool.js index ffe3286..ec340f5 100644 --- a/src/TorPool.js +++ b/src/TorPool.js @@ -51,7 +51,7 @@ class TorPool extends EventEmitter { this.data_directory = data_directory || nconf.get('parentDataDirectory'); this.load_balance_method = load_balance_method || nconf.get('loadBalanceMethod'); !fs.existsSync(this.data_directory) && fs.mkdirSync(this.data_directory); - this.tor_path = tor_path || 'tor'; + this.tor_path = tor_path || nconf.get('torPath'); this.logger = logger; this.nconf = nconf; } diff --git a/src/TorProcess.js b/src/TorProcess.js index f31bf36..aeba9e5 100644 --- a/src/TorProcess.js +++ b/src/TorProcess.js @@ -11,8 +11,8 @@ temp.track(); class TorProcess extends EventEmitter { constructor(tor_path, config, logger, nconf) { super(); - - this.tor_path = tor_path || 'tor'; + + this.tor_path = tor_path || nconf.get('torPath'); this.nconf = nconf; this.logger = logger; diff --git a/src/default_config.js b/src/default_config.js index b612515..69a5250 100644 --- a/src/default_config.js +++ b/src/default_config.js @@ -1,5 +1,6 @@ // Default configuration for Tor Router const temp = require('temp'); +const path = require('path'); temp.track(); module.exports = { "controlPort": 9077, @@ -13,6 +14,27 @@ module.exports = { "Log": "notice stdout", "NewCircuitPeriod": "10" }, + "torPath": (() => { + let platform = require('os').platform(); + let BIN_PATH = path.join(__dirname, '..', 'node_modules', 'granax', 'bin'); + /* Taken from https://github.com/bookchin/granax/blob/master/index.js */ + switch (platform) { + case 'win32': + torpath = path.join(BIN_PATH, 'Browser', 'TorBrowser', 'Tor', 'tor.exe'); + break; + case 'darwin': + torpath = path.join(BIN_PATH, '.tbb.app', 'Contents', 'Resources', + 'TorBrowser', 'Tor', 'tor'); + break; + case 'android': + case 'linux': + torpath = path.join(BIN_PATH, 'tor-browser_en-US', 'Browser', 'TorBrowser', 'Tor', 'tor'); + break; + default: + throw new Error(`Unsupported platform "${platform}"`); + } + return torpath; + })(), "instances": null, "dns": { "options": {},