diff --git a/src/database/mongo.js b/src/database/mongo.js index 2e09047da1..3a3331e900 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -47,7 +47,7 @@ module.helpers.mongo = require('./mongo/helpers'); module.init = function (callback) { - callback = callback || function () {}; + callback = callback || function () { }; var mongoClient; try { mongoClient = require('mongodb').MongoClient; @@ -111,38 +111,46 @@ if (err) { return callback(err); } - createSessionStore(); + callback(); }); } else { winston.warn('You have no mongo password setup!'); - createSessionStore(); - } - - function createSessionStore() { - var sessionStore; - if (nconf.get('redis')) { - sessionStore = require('connect-redis')(session); - var rdb = require('./redis'); - rdb.client = rdb.connect(); - - module.sessionStore = new sessionStore({ - client: rdb.client, - ttl: 60 * 60 * 24 * 14 - }); - } else if (nconf.get('mongo')) { - sessionStore = require('connect-mongo')(session); - module.sessionStore = new sessionStore({ - db: db - }); - } callback(); - } + } }); }; + module.initSessionStore = function (callback) { + var meta = require('../meta'); + var sessionStore; + + var ttlDays = 1000 * 60 * 60 * 24 * (parseInt(meta.config.loginDays, 10) || 0); + var ttlSeconds = 1000 * (parseInt(meta.config.loginSeconds, 10) || 0); + var ttl = ttlSeconds || ttlDays || 1209600000; // Default to 14 days + + if (nconf.get('redis')) { + sessionStore = require('connect-redis')(session); + var rdb = require('./redis'); + rdb.client = rdb.connect(); + + module.sessionStore = new sessionStore({ + client: rdb.client, + ttl: ttl + }); + } else if (nconf.get('mongo')) { + sessionStore = require('connect-mongo')(session); + module.sessionStore = new sessionStore({ + db: db, + ttl: ttl + }); + } + + callback(); + }; + module.createIndices = function (callback) { function createIndex(collection, index, options, callback) { - module.client.collection(collection).createIndex(index, options, callback); + module.client.collection(collection).createIndex(index, options, callback); } if (!module.client) { @@ -152,9 +160,9 @@ winston.info('[database] Checking database indices.'); async.series([ - async.apply(createIndex, 'objects', {_key: 1, score: -1}, {background: true}), - async.apply(createIndex, 'objects', {_key: 1, value: -1}, {background: true, unique: true, sparse: true}), - async.apply(createIndex, 'objects', {expireAt: 1}, {expireAfterSeconds: 0, background: true}) + async.apply(createIndex, 'objects', { _key: 1, score: -1 }, { background: true }), + async.apply(createIndex, 'objects', { _key: 1, value: -1 }, { background: true, unique: true, sparse: true }), + async.apply(createIndex, 'objects', { expireAt: 1 }, { expireAfterSeconds: 0, background: true }) ], function (err) { if (err) { winston.error('Error creating index ' + err.message); @@ -162,16 +170,16 @@ } winston.info('[database] Checking database indices done!'); callback(); - }); + }); }; module.checkCompatibility = function (callback) { var mongoPkg = require.main.require('./node_modules/mongodb/package.json'); - + if (semver.lt(mongoPkg.version, '2.0.0')) { return callback(new Error('The `mongodb` package is out-of-date, please run `./nodebb setup` again.')); } - + callback(); }; @@ -181,10 +189,10 @@ } async.parallel({ serverStatus: function (next) { - db.command({'serverStatus': 1}, next); + db.command({ 'serverStatus': 1 }, next); }, stats: function (next) { - db.command({'dbStats': 1}, next); + db.command({ 'dbStats': 1 }, next); }, listCollections: function (next) { db.listCollections().toArray(function (err, items) { @@ -239,4 +247,4 @@ db.close(); }; -}(exports)); +} (exports)); diff --git a/src/database/redis.js b/src/database/redis.js index f1c00a2316..8519b57bae 100644 --- a/src/database/redis.js +++ b/src/database/redis.js @@ -38,7 +38,6 @@ module.init = function (callback) { try { redis = require('redis'); - connectRedis = require('connect-redis')(session); } catch (err) { winston.error('Unable to initialize Redis! Is Redis installed? Error :' + err.message); process.exit(); @@ -48,11 +47,6 @@ module.client = redisClient; - module.sessionStore = new connectRedis({ - client: redisClient, - ttl: 60 * 60 * 24 * 14 - }); - require('./redis/main')(redisClient, module); require('./redis/hash')(redisClient, module); require('./redis/sets')(redisClient, module); @@ -64,6 +58,24 @@ } }; + module.initSessionStore = function (callback) { + var meta = require('../meta'); + var sessionStore = require('connect-redis')(session); + + var ttlDays = 1000 * 60 * 60 * 24 * (parseInt(meta.config.loginDays, 10) || 0); + var ttlSeconds = 1000 * (parseInt(meta.config.loginSeconds, 10) || 0); + var ttl = ttlSeconds || ttlDays || 1209600000; // Default to 14 days + + module.sessionStore = new sessionStore({ + client: module.client, + ttl: ttl + }); + + if (typeof callback === 'function') { + callback(); + } + }; + module.connect = function (options) { var redis_socket_or_host = nconf.get('redis:host'); var cxn; @@ -97,7 +109,7 @@ var dbIdx = parseInt(nconf.get('redis:database'), 10); if (dbIdx) { cxn.select(dbIdx, function (error) { - if(error) { + if (error) { winston.error("NodeBB could not connect to your Redis database. Redis returned the following error: " + error.message); process.exit(); } @@ -156,5 +168,5 @@ module.helpers = module.helpers || {}; module.helpers.redis = require('./redis/helpers'); -}(exports)); +} (exports)); diff --git a/src/start.js b/src/start.js index f44b90643d..d314596036 100644 --- a/src/start.js +++ b/src/start.js @@ -40,6 +40,9 @@ start.start = function () { next(err); }); }, + function (next) { + db.initSessionStore(next); + }, function (next) { var webserver = require('./webserver'); require('./socket.io').init(webserver.server); diff --git a/src/views/admin/settings/user.tpl b/src/views/admin/settings/user.tpl index b10ed37da9..c7373fbeb7 100644 --- a/src/views/admin/settings/user.tpl +++ b/src/views/admin/settings/user.tpl @@ -20,7 +20,8 @@
- +
@@ -103,10 +104,6 @@ -
- - -
@@ -115,6 +112,24 @@
+
+
+ Session time +
+
+
+
+ + + + +

Note that only one of these values will be used. If there is no seconds value we fall back to days. If + there is no days value we default to 14 days.

+
+
+
+
+
[[admin/settings/user:registration]]
@@ -259,4 +274,4 @@
- + \ No newline at end of file diff --git a/src/webserver.js b/src/webserver.js index fec42974c6..4e103d4a11 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -52,7 +52,7 @@ server.on('error', function (err) { }); module.exports.listen = function (callback) { - callback = callback || function () {}; + callback = callback || function () { }; emailer.registerApp(app); setupExpressApp(app); @@ -139,7 +139,7 @@ function setupExpressApp(app) { app.use(relativePath + '/apple-touch-icon', middleware.routeTouchIcon); - app.use(bodyParser.urlencoded({extended: true})); + app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(cookieParser()); app.use(useragent.express()); @@ -170,8 +170,12 @@ function setupFavicon(app) { } function setupCookie() { + var ttlDays = 1000 * 60 * 60 * 24 * (parseInt(meta.config.loginDays, 10) || 0); + var ttlSeconds = 1000 * (parseInt(meta.config.loginSeconds, 10) || 0); + var ttl = ttlSeconds || ttlDays || 1209600000; // Default to 14 days + var cookie = { - maxAge: 1000 * 60 * 60 * 24 * (parseInt(meta.config.loginDays, 10) || 14) + maxAge: ttl }; if (nconf.get('cookieDomain') || meta.config.cookieDomain) { @@ -191,7 +195,7 @@ function setupCookie() { } function listen(callback) { - callback = callback || function () {}; + callback = callback || function () { }; var port = parseInt(nconf.get('port'), 10); var isSocket = isNaN(port); var socketPath = isSocket ? nconf.get('port') : ''; diff --git a/test/mocks/databasemock.js b/test/mocks/databasemock.js index 44de8c7122..67d896b255 100644 --- a/test/mocks/databasemock.js +++ b/test/mocks/databasemock.js @@ -100,6 +100,9 @@ function (next) { meta.configs.init(next); }, + function (next) { + db.initSessionStore(next); + }, function (next) { meta.dependencies.check(next); },