Added setuid+setgid and alternative config file locations
authorunknown <Darren@.(none)>
Sat, 23 Jul 2011 15:46:48 +0000 (16:46 +0100)
committerunknown <Darren@.(none)>
Sat, 23 Jul 2011 15:46:48 +0000 (16:46 +0100)
node/config.json
node/kiwi.js

index c505a2f9df3a38b85e43b09ed8b92eb665ef6457..e16f948476dc52427f41bf605f724636d2ce08cb 100644 (file)
@@ -1,11 +1,17 @@
 {
     "port":             7777,
     "bind_address":     "0.0.0.0",
+
+    "user":                            "",
+    "group":                   "",
+
     "listen_ssl":       false,
     "ssl_key":          "server.key",
     "ssl_cert":         "cert.pem",
+
     "quit_message":     "KiwiIRC",
     "cap_options":      [],
+
     "handle_http":      true,
     "public_http":         "./../"
 }
index dbfa12ab466e4f919d9eb508e1feed0a27835386..3ed8efe3b43872190166b47278337a54ff0e28a4 100644 (file)
@@ -10,7 +10,64 @@ var tls = require('tls'),
     _ = require('./lib/underscore.min.js'),
     starttls = require('./lib/starttls.js');
 
-var config = JSON.parse(fs.readFileSync(__dirname + '/config.json', 'ascii'));
+
+/*
+ * Find a config file in the following order:
+ * - /etc/kiwi/config.json
+ * - ./config.json
+ */
+var config = null, config_filename = 'config.json';
+var config_dirs = ['/etc/kiwiirc/', __dirname + '/'];
+for(var i in config_dirs){
+    try {
+        if(fs.lstatSync(config_dirs[i] + config_filename).isDirectory() === false){
+            config = JSON.parse(fs.readFileSync(config_dirs[i] + config_filename, 'ascii'));
+            console.log('Using config file ' + config_dirs[i] + config_filename);
+            break;
+        }
+    } catch(e){
+        continue;
+    }
+}
+
+if(config === null){
+    console.log('Couldn\'t find a config file!');
+    process.exit(0);
+}
+
+
+
+
+/*
+ * Some process changes
+ */
+process.title = 'kiwiirc';
+function changeUser(){
+    if(typeof config.group !== 'undefined' && config.group !== ''){
+        try {
+            process.setgid(config.group);
+        }
+        catch (err) {
+            console.log('Failed to set gid: ' + err);
+            process.exit();
+        }
+    }
+
+    if(typeof config.user !== 'undefined' && config.user !== ''){
+        try {
+            process.setuid(config.user);
+        }
+        catch (err) {
+            console.log('Failed to set uid: ' + err);
+            process.exit();
+        }
+    }
+}
+
+
+/*
+ * And now KiwiIRC, the server :)
+ */
 
 var ircNumerics = {
     RPL_WELCOME:        '001',
@@ -368,6 +425,10 @@ if (config.listen_ssl) {
     var io = ws.listen(httpServer, {secure: false});
     httpServer.listen(config.port, config.bind_address);
 }
+
+// Now we're listening on the network, set our UID/GIDs if required
+changeUser();
+
 io.of('/kiwi').on('connection', function (websocket) {
     websocket.on('irc connect', function (nick, host, port, ssl, callback) {
         var ircSocket;