Add initial support for identd

This commit is contained in:
David White 2014-10-09 16:46:12 +01:00
parent 06517e7dac
commit 898fed76c6
3 changed files with 123 additions and 0 deletions

View File

@ -176,5 +176,34 @@ module.exports = {
// @default "" // @default ""
// //
certificate: "" certificate: ""
},
//
// Allows shout to run as an identd
//
// @type object
// @default {}
identd: {
//
// Enable Identd daemon
//
// @type boolean
// @default true
enable: true,
//
// Port to listen for ident requests
//
// @type int
// @default 30113
port: 30113,
//
// Default user to return on unknown request
// if false, will return NOUSER
//
// @type string
// @default shout
default: "shout"
} }
}; };

View File

@ -8,6 +8,7 @@ var Network = require("./models/network");
var slate = require("slate-irc"); var slate = require("slate-irc");
var tls = require("tls"); var tls = require("tls");
var Helper = require("./helper"); var Helper = require("./helper");
var identd = require("./identd");
module.exports = Client; module.exports = Client;
@ -137,9 +138,25 @@ Client.prototype.connect = function(args) {
}); });
}); });
var nick = args.nick || "shout-user"; var nick = args.nick || "shout-user";
var username = args.username || nick; var username = args.username || nick;
var realname = args.realname || "Shout User"; var realname = args.realname || "Shout User";
var identdItem = null;
stream.on("connect", function() {
identdItem = {
"remoteIp": stream.remoteAddress,
"remotePort": stream.remotePort,
"localPort": stream.localPort,
"username": username
};
identd.addConnection(identdItem);
});
stream.on("close", function() {
identd.addConnection(identdItem);
});
var irc = slate(stream); var irc = slate(stream);

77
src/identd.js Normal file
View File

@ -0,0 +1,77 @@
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 = {
enabled: false,
port: 30113,
default: "shout"
};
};
Identd.prototype.respond = function(remoteIp, localPort, remotePort) {
// Build the first part (always the same)
var response = localPort + ", " + remotePort + " : ";
var connection = _.where(this.connections, {"remoteIp": remoteIp, "remotePort": remotePort, "localPort": localPort});
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);
} else {
response += " ERROR : NOUSER";
}
// responses must end with CR+LF
return response + "\r\n";
};
Identd.prototype.parse = function(request) {
// myPort, theirPort\r\n
request = request.split(/,\s*/);
if (request.length == 2) {
var localPort = parseInt(request[0]),
remotePort = parseInt(request[1]);
}
return [localPort, remotePort];
};
Identd.prototype.start = function(config) {
_.merge(this.config, config.identd);
if (this.config.enabled) {
var self = this;
// create the server
this.server = net.createServer(function(socket) {
socket.on('data', function(data) {
var parsed = this.parse(data);
// parse and generate a response
var response = this.respond(socket.remoteAddress, parsed[0], parsed[1]);
socket.write(response);
socket.end();
});
});
console.log("Starting identd on " + this.config.port);
this.server.listen(this.config.port);
}
return self;
};
Identd.prototype.addConnection = function(connection) {
if (this.config.enabled)
this.connections.push(connection);
};
Identd.prototype.removeConnection = function(connection) {
if (this.config.enabled)
this.connections = _.without(this.connections, connection);
};
module.exports = new Identd().start(Helper.getConfig());