Commit | Line | Data |
---|---|---|
94b00b2d JA |
1 | var net = require('net'), |
2 | winston = require('winston'); | |
adefb6bd | 3 | |
4ebee99c D |
4 | var 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 | }; |