Uses JSON-RPC 2 for the control server. Removes socket.io

This commit is contained in:
Zachary Boyd 2017-12-07 18:53:16 -08:00
parent e4f081304e
commit f8698b1541
4 changed files with 87 additions and 42 deletions

View file

@ -36,18 +36,31 @@ For example: `tor-router -j 3 -s 9050` would start the proxy with 3 tor instance
## Control Server
A socket.io server included will listen on port 9077 by default. Using the socket.io server the client can add/remove Tor instances and get a new identity (which includes a new ip address) while Tor Router is running.
A JSON-RPC 2 TCP Server will listen on port 9077 by default. Using the rpc server the client can add/remove Tor instances and get a new identity (which includes a new ip address) while Tor Router is running.
Example (in node):
```
var client = require('socket.io-client').connect('ws://localhost:9077');
client.emit('createInstances', 3, (error) => {
if (error) return;
console.log('three instances created!');
client.emit('newIps');
console.log('clients have new ips!')
var net = require('net');
const client = net.createConnection({ port: 9077 }, () => {
var rpcRequest = {
"method": "createInstances",
"params": [3],
"jsonrpc":"2.0",
"id": 1
};
client.write(JSON.stringify(rpcRequest));
});
client.on('data', (chunk) => {
var rawResponse = chunk.toString('utf8');
var rpcResponse = JSON.parse(rawResponse);
console.log(rpcResponse)
if (rpcResponse.id === 1) {
console.log('Three instances have been created!')
}
})
```
## Test

View file

@ -61,6 +61,6 @@ if (instances) {
});
}
control.server.listen(control_port, () => {
control.listen(control_port, () => {
logger && logger.info(`[control]: Control Server listening on ${control_port}`);
})

View file

@ -1,6 +1,6 @@
{
"name": "tor-router",
"version": "3.1.0",
"version": "3.2.0",
"main": "src/index.js",
"repository": "git@github.com:znetstar/tor-router.git",
"author": "Zachary Boyd <zachary@zacharyboyd.nyc>",
@ -24,9 +24,9 @@
"commander": "^2.9.0",
"eventemitter2": "^3.0.0",
"get-port": "^2.1.0",
"jrpc2": "^1.0.5",
"lodash": "^4.17.4",
"native-dns": "git+https://github.com/znetstar/node-dns.git",
"socket.io": "^1.7.3",
"socks-proxy-agent": "^3.0.1",
"socksv5": "git+https://github.com/lee-elenbaas/socksv5.git",
"temp": "^0.8.3",

View file

@ -1,70 +1,102 @@
const HTTPServer = require('http').Server;
const TorPool = require('./TorPool');
const SOCKSServer = require('./SOCKSServer');
const DNSServer = require('./DNSServer');
const HTTPProxyServer = require('./HTTPServer');
const HTTPServer = require('./HTTPServer');
const rpc = require('jrpc2');
class ControlServer {
constructor(logger) {
this.server = new HTTPServer();
this.io = require('socket.io')(this.server);
this.torPool = new TorPool(null, null, logger);
var torPool = this.torPool = new TorPool(null, null, logger);
this.logger = logger;
this.io.use(this.handleConnection.bind(this));
}
let server = this.server = new rpc.Server();
server.expose('createTorPool', this.createTorPool.bind(this));
server.expose('createSOCKSServer', this.createSOCKSServer.bind(this));
server.expose('createDNSServer', this.createDNSServer.bind(this));
server.expose('createHTTPServer', this.createHTTPServer.bind(this));
listen() { this.server.listen.apply(this.server, arguments); }
close() { this.server.close.apply(this.server, arguments); }
server.expose('queryInstances', function () {
return new Promise((resolve, reject) => {
if (!torPool)
return reject({ message: 'No pool created' });
handleConnection(socket, next) {
socket.on('createTorPool', this.createTorPool.bind(this));
socket.on('createSOCKSServer', this.createSOCKSServer.bind(this));
socket.on('createDNSServer', this.createDNSServer.bind(this));
socket.on('createHTTPServer', this.createHTTPServer.bind(this));
socket.on('queryInstances', (callback) => {
if (!this.torPool)
return callback({ message: 'No pool created' });
callback(null, this.torPool.instances.map((i) => ( { dns_port: i.dns_port, socks_port: i.socks_port, process_id: i.process.pid } )) );
resolve(torPool.instances.map((i) => ( { dns_port: i.dns_port, socks_port: i.socks_port, process_id: i.process.pid } )) );
});
});
socket.on('createInstances', (instances, callback) => { this.torPool.create(instances, (error, instances) => {
callback && callback(error)
}); });
socket.on('removeInstances', (instances, callback) => { this.torPool.remove(instances, callback); });
socket.on('newIps', () => { this.torPool.new_ips(); });
socket.on('nextInstance', () => { this.torPool.next(); });
socket.on('closeInstances', () => { this.torPool.exit(); });
server.expose('createInstances', function (instances) {
return new Promise((resolve, reject) => {
torPool.create(instances, (error, instances) => {
if (error) reject(error);
else resolve();
});
});
});
next();
server.expose('removeInstances', function (instances) {
return new Promise((resolve, reject) => {
torPool.remove(instances, (error) => {
if (error) reject(error);
else resolve();
});
});
});
server.expose('newIps', function () {
torPool.new_ips();
return Promise.resolve();
});
server.expose('nextInstance', function () {
torPool.next();
return Promise.resolve();
});
server.expose('closeInstances', function () {
torPool.exit();
return Promise.resolve();
});
}
listen(port, callback) {
this.tcpTransport = new rpc.tcpTransport({ port });
this.tcpTransport.listen(this.server);
callback();
}
close() {
return this.tcpTransport.tcpServer.close();
}
createTorPool(options) {
this.torPool = new TorPool(null, options, this.logger);
return this.torPool;
this.torPool;
return Promise.resolve();
}
createSOCKSServer(port) {
this.socksServer = new SOCKSServer(this.torPool, this.logger);
this.socksServer.listen(port || 9050);
this.logger && this.logger.info(`[socks]: Listening on ${port}`);
return this.socksServer;
this.socksServer;
return Promise.resolve();
}
createHTTPServer(port) {
this.httpServer = new HTTPProxyServer(this.torPool, this.logger);
this.httpServer.listen(port || 9080);
this.logger && this.logger.info(`[http]: Listening on ${port}`);
return this.httpServer;
this.httpServer;
return Promise.resolve();
}
createDNSServer(port) {
this.dnsServer = new DNSServer(this.torPool, this.logger);
this.dnsServer.serve(port || 9053);
this.logger && this.logger.info(`[dns]: Listening on ${port}`);
return this.dnsServer;
this.dnsServer;
return Promise.resolve();
}
};