Improve Identd server to actually process data it receives
[KiwiIRC.git] / server / identd.js
1 var net = require('net');
2
3 var IdentdServer = module.exports = function(opts) {
4
5 var that = this;
6
7 // Option defaults
8 opts = opts || {};
9 opts.bind_addr = opts.bind_addr || '0.0.0.0';
10 opts.bind_port = opts.bind_port || 113;
11 opts.system_id = opts.system_id || 'UNIX-KiwiIRC';
12 opts.user_id = opts.user_id || 'kiwi';
13
14
15 var server = net.createServer(function(socket) {
16 var buffer = '';
17
18 socket.on('data', function(data){
19 var data_line, response;
20
21 buffer += data.toString();
22
23 // Wait until we have a full line of data before processing it
24 if (buffer.indexOf('\n') === -1)
25 return;
26
27 // Get the first line of data and process it for a rsponse
28 data_line = buffer.split('\n')[0];
29 response = that.processLine(data_line);
30
31 // Close down the socket while sending the response
32 socket.removeAllListeners();
33 socket.end(response);
34 });
35
36 });
37
38 server.on('listening', function() {
39 console.log('Ident Server listening on ' + server.address().address + ':' + server.address().port);
40 });
41
42
43 this.start = function() {
44 server.listen(opts.bind_port, opts.bind_addr);
45 };
46
47 this.stop = function(callback) {
48 server.close(callback);
49 };
50
51
52 /**
53 * Process a line of data for an Identd response
54 *
55 * @param {String} The line of data to process
56 * @return {String} Data to send back to the Identd client
57 */
58 this.processLine = function(line) {
59 var ports = line.split(','),
60 port_here = 0,
61 port_there = 0;
62
63 // We need 2 port number to make this work
64 if (ports.length < 2)
65 return;
66
67 port_here = parseInt(ports[0], 10);
68 port_there = parseInt(ports[1], 10);
69
70 // Make sure we have both ports to work with
71 if (!port_here || !port_there)
72 return;
73
74 if (typeof opts.user_id === 'function') {
75 user = opts.user_id(port_here, port_there).toString();
76 } else {
77 user = opts.user_id.toString();
78 }
79
80 if (typeof opts.system_id === 'function') {
81 system = opts.system_id(port_here, port_there).toString();
82 } else {
83 system = opts.system_id.toString();
84 }
85
86 return port_here.toString() + ' , ' + port_there.toString() + ' : USERID : ' + system + ' : ' + user;
87 };
88 };