Support for SSL connections through SOCKS proxy
authorJack Allnutt <m2ys4u@gmail.com>
Thu, 14 Mar 2013 00:55:54 +0000 (00:55 +0000)
committerJack Allnutt <m2ys4u@gmail.com>
Thu, 14 Mar 2013 00:55:54 +0000 (00:55 +0000)
server/socks.js

index 25ad4bb016d2ca9c8f954f6d5d279d3e8b172347..2a4853ffb90793123bc9285c28189b4dc6a53440 100755 (executable)
@@ -2,6 +2,7 @@ var net             = require('net'),
     tls             = require('tls'),
     util            = require('util'),
     EventEmitter    = require('events').EventEmitter,
+    crypto          = require('crypto'),
     ipaddr          = require('ipaddr.js');
     
 var SocksConnection = function (destination, socks) {
@@ -13,6 +14,7 @@ var SocksConnection = function (destination, socks) {
     
     this.socksSocket = net.connect({host: socks.host, port: socks.port}, socksConnected.bind(this));
     this.socksSocket.once('data', socksAuth.bind(this));
+    this.socksSocket.on('error', socksError);
 };
 
 util.inherits(SocksConnection, EventEmitter);
@@ -143,8 +145,30 @@ var socksReply = function (data) {
     }
 };
 
-var emitSocket = function () {
+var starttls = function () {
     var that = this;
-    this.socksSocket.setEncoding('utf8');
-    this.emit('socksConnect', this.socksSocket);
-};
\ No newline at end of file
+    
+    var pair = tls.createSecurePair(crypto.createCredentials(), false);
+    pair.encrypted.pipe(this.socksSocket);
+    this.socksSocket.pipe(pair.encrypted);
+    
+    pair.cleartext.socket = this.socksSocket;
+    pair.cleartext.encrypted = pair.encrypted;
+    pair.cleartext.authorised = false;
+    
+    pair.on('secure', function () { 
+        that.emit('socksConnect', pair.cleartext, pair.encrypted);
+    });
+}
+
+var socksError = function (err) {
+    console.log(err);
+}
+
+var emitSocket = function () {
+    if (this.destination.ssl) {
+        starttls.call(this);
+    } else {
+        this.emit('socksConnect', this.socksSocket);
+    }
+};