X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=server%2Fidentd.js;h=5c588e273d0b86390397e3db1681f295c20fcca0;hb=4b6d898bbdc15e34b44e15ca95f37c46d0c5b8b1;hp=2a8bfa556566b1385a47b23ea004c62646da5d9e;hpb=d1552556bfd232542aa6e5ea8f335ad27423e433;p=KiwiIRC.git diff --git a/server/identd.js b/server/identd.js index 2a8bfa5..5c588e2 100644 --- a/server/identd.js +++ b/server/identd.js @@ -1,31 +1,46 @@ var net = require('net'); -function IdentdServer(opts) { +var IdentdServer = module.exports = function(opts) { + + var that = this; + + var default_user_id = 'kiwi', + default_system_id = 'UNIX-KiwiIRC'; // Option defaults opts = opts || {}; opts.bind_addr = opts.bind_addr || '0.0.0.0'; opts.bind_port = opts.bind_port || 113; - opts.system_id = opts.system_id || 'UNIX-KiwiIRC'; - opts.user_id = opts.user_id || 'kiwi'; + opts.system_id = opts.system_id || default_system_id; + opts.user_id = opts.user_id || default_user_id; var server = net.createServer(function(socket) { - var user, system; + var buffer = ''; - if (typeof opts.user_id === 'function') { - user = opts.user_id(socket).toString(); - } else { - user = opts.user_id.toString(); - } + socket.on('data', function(data){ + var data_line, response; - if (typeof opts.system_id === 'function') { - system = opts.system_id(socket).toString(); - } else { - system = opts.system_id.toString(); - } + buffer += data.toString(); + + // If we exceeed 512 bytes, presume a flood and disconnect + if (buffer.length < 512) { + + // Wait until we have a full line of data before processing it + if (buffer.indexOf('\n') === -1) + return; + + // Get the first line of data and process it for a rsponse + data_line = buffer.split('\n')[0]; + response = that.processLine(data_line); + + } + + // Close down the socket while sending the response + socket.removeAllListeners(); + socket.end(response); + }); - socket.end('25,25 : USERID : ' + system + ' : ' + user); }); server.on('listening', function() { @@ -40,7 +55,42 @@ function IdentdServer(opts) { this.stop = function(callback) { server.close(callback); }; -} -module.exports = IdentdServer; \ No newline at end of file + /** + * Process a line of data for an Identd response + * + * @param {String} The line of data to process + * @return {String} Data to send back to the Identd client + */ + this.processLine = function(line) { + var ports = line.split(','), + port_here = 0, + port_there = 0; + + // We need 2 port number to make this work + if (ports.length < 2) + return; + + port_here = parseInt(ports[0], 10); + port_there = parseInt(ports[1], 10); + + // Make sure we have both ports to work with + if (!port_here || !port_there) + return; + + if (typeof opts.user_id === 'function') { + user = (opts.user_id(port_here, port_there) || '').toString() || default_user_id; + } else { + user = opts.user_id.toString(); + } + + if (typeof opts.system_id === 'function') { + system = (opts.system_id(port_here, port_there) || '').toString() || default_system_id; + } else { + system = opts.system_id.toString(); + } + + return port_here.toString() + ' , ' + port_there.toString() + ' : USERID : ' + system + ' : ' + user; + }; +};