socks: misc fixes.

This commit is contained in:
Christopher Jeffrey 2017-01-24 05:15:56 -08:00
parent 0de1302ca9
commit a87484f2e8
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD

View File

@ -31,7 +31,9 @@ function SOCKS() {
this.target = SOCKS.states.INIT; this.target = SOCKS.states.INIT;
this.destHost = '0.0.0.0'; this.destHost = '0.0.0.0';
this.destPort = 0; this.destPort = 0;
this.domain = 'localhost'; this.username = '';
this.password = '';
this.name = 'localhost';
this.destroyed = false; this.destroyed = false;
this.timeout = null; this.timeout = null;
} }
@ -145,17 +147,17 @@ SOCKS.prototype.proxy = function proxy(options) {
this.destHost = options.destHost; this.destHost = options.destHost;
this.destPort = options.destPort; this.destPort = options.destPort;
this.target = SOCKS.state.PROXY_DONE; this.target = SOCKS.states.PROXY_DONE;
this.open(options); this.open(options);
}; };
SOCKS.prototype.resolve = function resolve(options) { SOCKS.prototype.resolve = function resolve(options) {
assert(options); assert(options);
assert(typeof options.domain === 'string'); assert(typeof options.name === 'string');
this.domain = options.domain; this.name = options.name;
this.target = SOCKS.state.RESOLVE_DONE; this.target = SOCKS.states.RESOLVE_DONE;
this.open(options); this.open(options);
}; };
@ -401,9 +403,9 @@ SOCKS.prototype.handleProxy = function handleProxy(data) {
} }
br = new BufferReader(data); br = new BufferReader(data);
br.seek(2); br.seek(3);
switch (data.readU8()) { switch (br.readU8()) {
case 0x01: case 0x01:
if (br.left() < 6) { if (br.left() < 6) {
this.error('Bad packet length.'); this.error('Bad packet length.');
@ -442,16 +444,16 @@ SOCKS.prototype.handleProxy = function handleProxy(data) {
}; };
SOCKS.prototype.sendResolve = function sendResolve() { SOCKS.prototype.sendResolve = function sendResolve() {
var domain = this.domain; var name = this.name;
var len = Buffer.byteLength(domain, 'utf8'); var len = Buffer.byteLength(name, 'utf8');
var packet = new StaticWriter(7 + len); var packet = new StaticWriter(7 + len);
packet.writeU8(0x05); packet.writeU8(0x05);
packet.writeU8(0xf0); packet.writeU8(0xf0);
packet.wruteU8(0x00); packet.writeU8(0x00);
packet.writeU8(0x03); packet.writeU8(0x03);
packet.writeU8(len); packet.writeU8(len);
packet.writeString(domain, 'utf8'); packet.writeString(name, 'utf8');
packet.writeU16BE(0); packet.writeU16BE(0);
packet = packet.render(); packet = packet.render();
@ -462,7 +464,7 @@ SOCKS.prototype.sendResolve = function sendResolve() {
SOCKS.prototype.handleResolve = function handleResolve(data) { SOCKS.prototype.handleResolve = function handleResolve(data) {
var ip; var ip;
if (data.length !== 8) { if (data.length !== 10) {
this.error('Resolve failed.'); this.error('Resolve failed.');
return; return;
} }
@ -477,6 +479,11 @@ SOCKS.prototype.handleResolve = function handleResolve(data) {
return; return;
} }
if (data[2] !== 0x00) {
this.error('Tor error: ' + data[2]);
return;
}
if (data[3] !== 0x01) { if (data[3] !== 0x01) {
this.error('Tor error.'); this.error('Tor error.');
return; return;
@ -493,7 +500,7 @@ SOCKS.prototype.handleResolve = function handleResolve(data) {
this.destroy(); this.destroy();
this.emit('resolve', ip); this.emit('resolve', [ip]);
}; };
SOCKS.resolve = function resolve(options) { SOCKS.resolve = function resolve(options) {
@ -617,13 +624,13 @@ exports.connect = function connect(proxy, port, host, user, pass) {
return socket; return socket;
}; };
exports.resolve = function resolve(proxy, domain, user, pass) { exports.resolve = function resolve(proxy, name, user, pass) {
var addr = IP.fromHostname(proxy); var addr = IP.fromHostname(proxy);
return SOCKS.resolve({ return SOCKS.resolve({
host: addr.host, host: addr.host,
port: addr.port, port: addr.port,
username: user, username: user,
password: pass, password: pass,
domain: domain name: name
}); });
}; };