diff --git a/config.js b/config.js index cc79475a..26d9c095 100644 --- a/config.js +++ b/config.js @@ -198,31 +198,26 @@ module.exports = { }, // - // Allows shout to run as an identd + // Run Shout with identd support. // // @type object // @default {} + // identd: { // - // Enable Identd daemon + // Run the identd daemon on server start. // // @type boolean - // @default true - enable: true, + // @default false + // + enable: false, // - // Port to listen for ident requests + // Port to listen for ident requests. // // @type int - // @default 30113 - port: 30113, - + // @default 113 // - // Default user to return on unknown request - // if false, will return NOUSER - // - // @type string - // @default shout - default: "shout" + port: 113 } }; diff --git a/src/client.js b/src/client.js index cd47f275..0067ed32 100644 --- a/src/client.js +++ b/src/client.js @@ -1,6 +1,7 @@ var _ = require("lodash"); var Chan = require("./models/chan"); var crypto = require("crypto"); +var identd = require("./identd"); var log = require("./log"); var net = require("net"); var Msg = require("./models/msg"); @@ -8,7 +9,6 @@ var Network = require("./models/network"); var slate = require("slate-irc"); var tls = require("tls"); var Helper = require("./helper"); -var identd = require("./identd"); module.exports = Client; @@ -126,9 +126,8 @@ Client.prototype.connect = function(args) { rejectUnauthorized: false }; - if(config.bind) { + if (config.bind) { server.localAddress = config.bind; - if(args.tls) { var socket = net.connect(server); server.socket = socket; @@ -136,27 +135,8 @@ Client.prototype.connect = function(args) { } var stream = args.tls ? tls.connect(server) : net.connect(server); - var identdItem = null; - var cb = function() { - identdItem = { - "remoteIp": stream.remoteAddress, - "remotePort": stream.remotePort, - "localPort": stream.localPort, - "username": username - }; - - identd.addConnection(identdItem); - }; - - var stream; - if (args.tls) { - stream = tls.connect(server); - stream.socket.on('connect', cb); - } else { - stream = net.connect(server, cb); - } - - stream.on("error", function(e) { + + (stream.socket || stream).on("error", function(e) { console.log("Client#connect():\n" + e); stream.end(); var msg = new Msg({ @@ -168,15 +148,12 @@ Client.prototype.connect = function(args) { }); }); - stream.on("close", function() { - identd.removeConnection(identdItem); - }); - var nick = args.nick || "shout-user"; var username = args.username || nick; var realname = args.realname || "Shout User"; var irc = slate(stream); + identd.hook(stream, username); if (args.password) { irc.pass(args.password); diff --git a/src/identd.js b/src/identd.js index 5b35e868..7e32c422 100644 --- a/src/identd.js +++ b/src/identd.js @@ -1,90 +1,47 @@ var _ = require("lodash"); var net = require("net"); -var Helper = require("./helper"); -function Identd() { - // used to store who is connecting... - this.connections = []; - this.server = null; - this.config = { - enable: false, - port: 30113, - default: "shout" - }; +var users = {}; + +module.exports.start = function(port) { + var server = net.createServer(init).listen(port || 113); }; -Identd.prototype.respond = function(remoteIp, localPort, remotePort) { - // Build the first part (always the same) - var response = localPort + ", " + remotePort + " : "; - var params = {"remoteIp": remoteIp, "remotePort": remotePort, "localPort": localPort}; - var connection = _.where(this.connections, params); - if (connection.length == 0) { - params["localPort"] = undefined; - connection = _.where(this.connections, params); - } +module.exports.hook = function(stream, user) { + var id = ""; + var socket = stream.socket || stream; + socket.on("connect", function() { + var ports = _.pick(socket, "localPort", "remotePort"); + id = _.values(ports).join(", "); + users[id] = user; + }); + socket.on("close", function() { + delete users[id]; + }); +}; - if (connection.length > 0) { - // We have some connections, but we only want the first - connection = _.first(connection); - response += " USERID : UNIX : " + connection.username; - // We're done with that connection. Remove it - this.removeConnection(connection); +function init(socket) { + socket.on("data", function(data) { + respond(socket, data); + }); +} + +function respond(socket, data) { + var id = parse(data); + var response = id + " : "; + if (users[id]) { + response += "USERID : UNIX : " + users[id]; } else { - if (this.config.default == null) { - response += " ERROR : NOUSER"; - } else { - var ident = this.config.default.replace(/\?/g, function(a) { - return Math.floor(Math.random() * 10); - }); - response += " USERID : UNIX : " + ident; - } + response += "ERROR : NO-USER"; } - // responses must end with CR+LF - return response + "\r\n"; -}; + response += "\r\n"; + socket.write(response); + socket.end(); +} -Identd.prototype.parse = function(request) { - // myPort, theirPort\r\n - request = request.toString().split(/,\s*/); - if (request.length == 2) { - var localPort = parseInt(request[0]), - remotePort = parseInt(request[1]); - } - return [localPort, remotePort]; -}; +function parse(data) { + data = data.toString(); + data = data.split(","); + return parseInt(data[0]) + ", " + parseInt(data[1]); +} -Identd.prototype.start = function(config) { - _.merge(this.config, config.identd); - - if (this.config.enable) { - var self = this; - - // create the server - this.server = net.createServer(function(socket) { - socket.on('data', function(data) { - var parsed = self.parse(data); - // parse and generate a response - var response = self.respond(socket.remoteAddress, parsed[0], parsed[1]); - socket.write(response); - socket.end(); - }); - }); - this.server.listen(this.config.port); - } - - return self; -}; - -Identd.prototype.addConnection = function(connection) { - if (this.config.enable) { - this.connections.push(connection); - } -}; - -Identd.prototype.removeConnection = function(connection) { - if (this.config.enable) { - this.connections = _.without(this.connections, connection); - } -}; - -module.exports = new Identd(); diff --git a/src/server.js b/src/server.js index c9755ebf..a5be9838 100644 --- a/src/server.js +++ b/src/server.js @@ -36,8 +36,8 @@ module.exports = function(options) { }, app).listen(port, host) } - if (config.identd && config.identd.enable) { - require("./identd").start(config); + if ((config.identd || {}).enable) { + require("./identd").start(config.identd.port); } sockets = io(server);