From 5f8fde9039e4d6a2e4361fcacfd81fd5378bd598 Mon Sep 17 00:00:00 2001 From: Zachary Boyd Date: Thu, 10 May 2018 21:44:30 -0700 Subject: [PATCH] Uses the Control Protocol to request a new identity. Replaces 'new_ip' with 'new_identity' and deprecates 'new_ip' --- README.md | 10 +++++----- src/ControlServer.js | 42 ++++++++++++++++++++++++++++++++++++------ src/TorPool.js | 26 ++++++++++++++++++++++---- src/TorProcess.js | 17 +++++++++++++---- 4 files changed, 76 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 0581597..54b14c9 100644 --- a/README.md +++ b/README.md @@ -93,10 +93,10 @@ A JSON-RPC 2 TCP Server will listen on port 9077 by default. Using the rpc serve Example (in node): ``` - var net = require('net'); + const net = require('net'); - const client = net.createConnection({ port: 9077 }, () => { - var rpcRequest = { + let client = net.createConnection({ port: 9077 }, () => { + let rpcRequest = { "method": "createInstances", "params": [3], "jsonrpc":"2.0", @@ -106,8 +106,8 @@ Example (in node): }); client.on('data', (chunk) => { - var rawResponse = chunk.toString('utf8'); - var rpcResponse = JSON.parse(rawResponse); + let rawResponse = chunk.toString('utf8'); + let rpcResponse = JSON.parse(rawResponse); console.log(rpcResponse) if (rpcResponse.id === 1) { console.log('Three instances have been created!') diff --git a/src/ControlServer.js b/src/ControlServer.js index 960744d..78ea938 100644 --- a/src/ControlServer.js +++ b/src/ControlServer.js @@ -61,15 +61,45 @@ class ControlServer { }); }).bind(this) ); + server.expose('newIdentites', (function() { + return new Promise((resolve, reject) => { + this.torPool.new_identites((error) => { + if (error) reject(error); + else resolve(); + }); + }); + }).bind(this)); + + server.expose('newIdentityAt', (function(index) { + return new Promise((resolve, reject) => { + this.torPool.new_identity_at(index, (error) => { + if (error) reject(error); + else resolve(); + }); + }); + }).bind(this)); + + /* Begin Deprecated */ + server.expose('newIps', (function() { - this.torPool.new_ips(); - return Promise.resolve(); - }).bind(this) ); + return new Promise((resolve, reject) => { + this.torPool.new_ips((error) => { + if (error) reject(error); + else resolve(); + }); + }); + }).bind(this)); server.expose('newIpAt', (function(index) { - this.torPool.new_ip_at(index); - return Promise.resolve(); - }).bind(this) ); + return new Promise((resolve, reject) => { + this.torPool.new_ip_at(index, (error) => { + if (error) reject(error); + else resolve(); + }); + }); + }).bind(this)); + + /* End Deprecated */ server.expose('nextInstance', (function () { this.torPool.next(); diff --git a/src/TorPool.js b/src/TorPool.js index ec340f5..eaa1ebd 100644 --- a/src/TorPool.js +++ b/src/TorPool.js @@ -124,13 +124,31 @@ class TorPool extends EventEmitter { }); } - new_ips() { - this.instances.forEach((tor) => tor.new_ip()); + new_identites(callback) { + async.each(this.instances, (tor, next) => { + tor.new_identity(next); + }, (error) => { + callback && callback(error); + }); } - new_ip_at(index) { - this.instances[index].new_ip(); + new_identity_at(index, callback) { + this.instances[index].new_identity(callback); } + + /* Begin Deprecated */ + + new_ips(callback) { + this.logger && this.logger.warn(`TorPool.new_ips is deprecated, use TorPool.new_identites`); + return this.new_identites(callback); + } + + new_ip_at(index, callback) { + this.logger && this.logger.warn(`TorPool.new_ip_at is deprecated, use TorPool.new_identity_at`); + return this.new_identity_at(inde, callback); + } + + /* End Deprecated */ }; TorPool.LoadBalanceMethods = load_balance_methods; diff --git a/src/TorProcess.js b/src/TorProcess.js index ca27be7..6b88bce 100644 --- a/src/TorProcess.js +++ b/src/TorProcess.js @@ -34,9 +34,18 @@ class TorProcess extends EventEmitter { this.process.kill('SIGINT'); } - new_ip() { - this.logger.info(`[tor-${this.instance_name}]: has requested a new identity`); - this.process.kill('SIGHUP'); + /* Begin Deprecated */ + + new_ip(callback) { + this.logger && this.logger.warn(`TorProcess.new_ip is deprecated, use TorProcess.new_identity`); + return this.new_identity(callback); + } + + /* End Deprecated */ + + new_identity(callback) { + this.logger.info(`[tor-${this.instance_name}]: requested a new identity`); + this.controller.cleanCircuits(callback || (() => {})); } get instance_name() { @@ -56,7 +65,7 @@ class TorProcess extends EventEmitter { } get controller() { - return this._controller; + return this._controller || null; } create(callback) {