128 lines
2.9 KiB
JavaScript
128 lines
2.9 KiB
JavaScript
/* jslint node: true */
|
|
'use strict';
|
|
|
|
var miscUtil = require('./misc_util.js');
|
|
|
|
var fs = require('fs');
|
|
var paths = require('path');
|
|
var stripJsonComments = require('strip-json-comments');
|
|
var async = require('async');
|
|
var _ = require('lodash');
|
|
|
|
exports.init = init;
|
|
exports.getDefaultPath = getDefaultPath;
|
|
|
|
function init(configPath, cb) {
|
|
|
|
// Probably many better ways of doing this:
|
|
// :TODO: See http://jsfiddle.net/jlowery2663/z8at6knn/4/
|
|
var recursiveMerge = function(target, source) {
|
|
for(var p in source) {
|
|
try {
|
|
if(_.isObject(source)) {
|
|
target[p] = recursiveMerge(target[p], source[p]);
|
|
} else {
|
|
target[p] = source[p];
|
|
}
|
|
} catch(e) {
|
|
target[p] = source[p];
|
|
}
|
|
}
|
|
return target;
|
|
};
|
|
|
|
async.waterfall(
|
|
[
|
|
function loadUserConfig(callback) {
|
|
|
|
fs.readFile(configPath, { encoding : 'utf8' }, function configData(err, data) {
|
|
if(err) {
|
|
callback(null, { } );
|
|
} else {
|
|
try {
|
|
var configJson = JSON.parse(stripJsonComments(data));
|
|
callback(null, configJson);
|
|
} catch(e) {
|
|
callback(e);
|
|
}
|
|
}
|
|
});
|
|
},
|
|
function mergeWithDefaultConfig(menuConfig, callback) {
|
|
var mergedConfig = recursiveMerge(menuConfig, getDefaultConfig());
|
|
callback(null, mergedConfig);
|
|
}
|
|
],
|
|
function complete(err, mergedConfig) {
|
|
exports.config = mergedConfig;
|
|
cb(err);
|
|
}
|
|
);
|
|
}
|
|
|
|
function getDefaultPath() {
|
|
var base = miscUtil.resolvePath('~/');
|
|
if(base) {
|
|
return paths.join(base, '.enigma-bbs', 'config.json');
|
|
}
|
|
}
|
|
|
|
function getDefaultConfig() {
|
|
return {
|
|
general : {
|
|
boardName : 'Another Fine ENiGMA½ BBS',
|
|
},
|
|
|
|
firstMenu : 'connected',
|
|
|
|
preLoginTheme : '*',
|
|
|
|
users : {
|
|
usernameMin : 2,
|
|
usernameMax : 16, // Note that FidoNet wants 36 max
|
|
usernamePattern : '^[A-Za-z0-9~!@#$%^&*()\\-\\_+]+$',
|
|
passwordMin : 6,
|
|
passwordMax : 128,
|
|
requireActivation : true, // require SysOp activation?
|
|
invalidUsernames : [],
|
|
defaultGroups : [ 'users' ]
|
|
},
|
|
|
|
defaults : {
|
|
theme : 'NU-MAYA', // :TODO: allow "*" here
|
|
passwordChar : '*', // TODO: move to user ?
|
|
},
|
|
|
|
/*
|
|
Concept
|
|
"theme" : {
|
|
"default" : "defaultThemeName", // or "*"
|
|
"passwordChar" : "*",
|
|
...
|
|
}
|
|
*/
|
|
|
|
paths : {
|
|
mods : paths.join(__dirname, './../mods/'),
|
|
servers : paths.join(__dirname, './servers/'),
|
|
art : paths.join(__dirname, './../mods/art/'),
|
|
themes : paths.join(__dirname, './../mods/themes/'),
|
|
logs : paths.join(__dirname, './../logs/'), // :TODO: set up based on system, e.g. /var/logs/enigmabbs or such
|
|
db : paths.join(__dirname, './../db/'),
|
|
},
|
|
|
|
servers : {
|
|
telnet : {
|
|
port : 8888,
|
|
enabled : true,
|
|
},
|
|
ssh : {
|
|
port : 8889,
|
|
enabled : true,
|
|
rsaPrivateKey : paths.join(__dirname, './../misc/default_key.rsa'),
|
|
dsaPrivateKey : paths.join(__dirname, './../misc/default_key.dsa'),
|
|
}
|
|
},
|
|
};
|
|
}
|