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