SOCKS proxy conf and integration
authorJack Allnutt <m2ys4u@gmail.com>
Sat, 23 Mar 2013 12:30:22 +0000 (12:30 +0000)
committerJack Allnutt <m2ys4u@gmail.com>
Sat, 23 Mar 2013 12:30:22 +0000 (12:30 +0000)
* Configuration details in conf.example.js
  - Can be configured to use SOCKS for all outgoing connections or
    just for specific hosts

* Integrated in to IrcConnection object

* Minor tweak to IrcConnection: use call instead of apply to avoid
  accessing the arguments object, which isn't used by
  socketConnectHandler

config.example.js
server/irc/connection.js

index 286ee214d79bacd3ed3b17c6b61c5bf2d0430c60..06d077d899d0165e397d0d3c657862f8a69986e8 100644 (file)
@@ -104,6 +104,31 @@ conf.http_proxy_ip_header = "x-forwarded-for";
 conf.http_base_path = "/kiwi";
 
 
+/*
+ * SOCKS proxy settings
+ */
+conf.socks_proxy = {};
+
+// Enable proxying outbound connections through a SOCKS proxy
+conf.socks_proxy.enabled = false;
+
+// Proxy *all* outbound connections through a SOCKS proxy
+conf.socks_proxy.all = false;
+
+// Use SOCKS proxy for these hosts only (if conf.sock_proxy.all === false)
+conf.socks_proxy.proxy_hosts = [
+    "irc.example.com"
+];
+
+// Host and port for the SOCKS proxy
+conf.socks_proxy.address = '127.0.0.1';
+conf.socks_proxy.port = 1080;
+
+// Username and password for the SOCKS proxy
+// Set user to null to disable password authentication
+conf.socks_proxy.user = null;
+conf.socks_proxy.pass = null;
+
 
 // Enabled transports for the browser to use
 conf.transports = [
index 62f3e3a35bc18d12df03f9826cbf6d54941b7e57..c48346b7b4e4ca658a3713e0040c0890c8377ba6 100644 (file)
@@ -7,7 +7,7 @@ var net             = require('net'),
     IrcServer       = require('./server.js'),
     IrcChannel      = require('./channel.js'),
     IrcUser         = require('./user.js'),
-    SocksConnection = require('./socks.js');
+    SocksConnection = require('../socks.js');
 
 
 var IrcConnection = function (hostname, port, ssl, nick, user, pass, state) {
@@ -51,8 +51,17 @@ var IrcConnection = function (hostname, port, ssl, nick, user, pass, state) {
     this.ssl = !(!ssl);
     
     // SOCKS proxy details
-    // TODO: read proxy details from configuration
-    this.socks = false;
+    // TODO: Wildcard matching of hostnames and/or CIDR ranges of IP addresses
+    if ((global.config.socks_proxy && global.config.socks_proxy.enabled) && ((global.config.socks_proxy.all) || (_.contains(global.config.socks_proxy.proxy_hosts, this.irc_host.hostname)))) {
+        this.socks = {
+            host: global.config.socks_proxy.address,
+            port: global.config.socks_proxy.port,
+            user: global.config.socks_proxy.user,
+            pass: global.config.socks_proxy.pass
+        };
+    } else {
+        this.socks = false;
+    }
 
     // Options sent by the IRCd
     this.options = Object.create(null);
@@ -123,9 +132,11 @@ IrcConnection.prototype.connect = function () {
             pass: this.socks.pass
         });
         
-        socks.on('connect', function (socket){
+        socks.on('connect', function (socket) {
             that.socket = socket;
             setupSocket.call(that);
+            that.connected = true;
+            socketConnectHandler.call(that);
         });
     } else {
         // Open either a secure or plain text socket
@@ -147,7 +158,7 @@ IrcConnection.prototype.connect = function () {
 
         this.socket.on(socket_connect_event_name, function () {
             that.connected = true;
-            socketConnectHandler.apply(that, arguments);
+            socketConnectHandler.call(that);
         });
         
         setupSocket.call(this);