Skip to content

Commit

Permalink
Add session specific here (#1489)
Browse files Browse the repository at this point in the history
* Scoot a bunch of code around for reuse

Post #1446 ... related to #604

Auto-merge
  • Loading branch information
Martii authored Jul 7, 2018
1 parent 50b8ff4 commit 22a6d61
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 74 deletions.
51 changes: 5 additions & 46 deletions controllers/admin.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ var loadPassport = require('../libs/passportLoader').loadPassport;
var strategyInstances = require('../libs/passportLoader').strategyInstances;
var statusCodePage = require('../libs/templateHelpers').statusCodePage;
var updateSessions = require('../libs/modifySessions').update;
var findSessionData = require('../libs/modifySessions').findSessionData;
var getSessionDataList = require('../libs/modifySessions').getSessionDataList;
var pageMetadata = require('../libs/templateHelpers').pageMetadata;

//--- Configuration inclusions
Expand Down Expand Up @@ -382,6 +382,8 @@ exports.adminSessionActiveView = function (aReq, aRes, aNext) {
options.isFounder = authedUser && authedUser.isFounder;
options.isRoot = authedUser && authedUser.isRoot;

options.isAdminSessionActiveView = true;

if (!options.isAdmin) {
statusCodePage(aReq, aRes, aNext, {
statusCode: 403,
Expand All @@ -401,54 +403,11 @@ exports.adminSessionActiveView = function (aReq, aRes, aNext) {
//--- Tasks

tasks.push(function (aCallback) {
findSessionData({ username: username }, store, options, function (aErr) {
if (aErr) {
statusCodePage(aReq, aRes, aNext, {
statusCode: 500,
statusMessage: aErr
});
return;
}

aCallback();
});
});

// Post processing that can't be handled in modelParser
tasks.push(function (aCallback) {
options.sessionList = _.map(options.sessionList, function (aSession) {
var session = modelParser.parseSession(aSession);

var oujsOptions = session.passport.oujsOptions;

session.canDestroyOne = true; // TODO: Perhaps do some further conditionals

oujsOptions.remoteAddressMask = session.name === authedUser.name && !oujsOptions.authFrom
? oujsOptions.remoteAddressMask
: oujsOptions.authFrom
? oujsOptions.authFrom
: null;

session.showExtend = aReq.sessionID === oujsOptions.sid;
session.canExtend = !oujsOptions.extended;

return session;
});

aCallback();
});

// Sort newest to oldest
tasks.push(function (aCallback) {
options.sessionList = _.sortBy(options.sessionList, function (aSession) {
return -aSession.passport.oujsOptions.since || 0;
});

aCallback();
getSessionDataList(aReq, options, aCallback);
});

//---
async.series(tasks, asyncComplete);
async.parallel(tasks, asyncComplete);
};

// View everything about current deployed `./package.json`
Expand Down
16 changes: 2 additions & 14 deletions controllers/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ var countTask = require('../libs/tasks').countTask;
var pageMetadata = require('../libs/templateHelpers').pageMetadata;
var orderDir = require('../libs/templateHelpers').orderDir;

var getSessionDataList = require('../libs/modifySessions').getSessionDataList;
var extendSession = require('../libs/modifySessions').extend;
var destroyOneSession = require('../libs/modifySessions').destroyOne;

Expand Down Expand Up @@ -1031,22 +1032,9 @@ exports.userEditPreferencesPage = function (aReq, aRes, aNext) {

// User session control
tasks.push(function (aCallback) {
if (!aReq.session.passport) {
aReq.session.passport = {};
}

if (!aReq.session.passport.oujsOptions) {
aReq.session.passport.oujsOptions = {};
}

if (!aReq.session.passport.oujsOptions.extended) {
options.sessionControl = true;
}

aCallback();
getSessionDataList(aReq, options, aCallback);
});


// UserPage tasks
tasks = tasks.concat(getUserPageTasks(options));

Expand Down
70 changes: 66 additions & 4 deletions libs/modifySessions.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,20 @@ var isPro = require('../libs/debug').isPro;
var isDev = require('../libs/debug').isDev;
var isDbg = require('../libs/debug').isDbg;

//--- Library inclusions
//--- Dependency inclusions
var _ = require('underscore');
var async = require('async');
var moment = require('moment');

var settings = require('../models/settings.json');
//--- Library inclusions
var modelParser = require('../libs/modelParser');
var findMeta = require('../controllers/scriptStorage').findMeta;

//--- Configuration inclusions
var settings = require('../models/settings.json');

//
// This library allows for the modifications of user sessions
var async = require('async');

exports.init = function (aStore) {
return function (aReq, aRes, aNext) {
Expand Down Expand Up @@ -213,6 +218,62 @@ exports.destroy = function (aReq, aUser, aCallback) {
}, aCallback);
};

exports.getSessionDataList = function (aReq, aOptions, aCallback) {
var store = aReq.sessionStore;
var authedUser = aReq.session.user;

var username = aReq.query.q;
var query = {};

if (aOptions.isAdmin && aOptions.isAdminSessionActiveView) {
query = { username: username };
} else {
query = { username: authedUser.name };
}

async.series([
function (aInnerCallback) {
exports.findSessionData(query, store, aOptions, function (aErr) {
if (aErr) {
aCallback(aErr, null);
return;
}

aInnerCallback();
});
},
function (aInnerCallback) {
aOptions.sessionList = _.map(aOptions.sessionList, function (aSession) {
var session = modelParser.parseSession(aSession);
var oujsOptions = session.passport.oujsOptions;

session.showExtend = aReq.sessionID === oujsOptions.sid;
session.canExtend = !oujsOptions.extended;
session.canDestroyOne = true; // TODO: Perhaps do some further conditionals

oujsOptions.remoteAddressMask = session.name === authedUser.name && !oujsOptions.authFrom
? oujsOptions.remoteAddressMask
: oujsOptions.authFrom
? oujsOptions.authFrom
: null;

return session;
});

aInnerCallback();
},
function (aInnerCallback) {
aOptions.sessionList = _.sortBy(aOptions.sessionList, function (aSession) {
return -aSession.passport.oujsOptions.since || 0;
});

aInnerCallback();
}], function (aErr) {
aCallback(null);
}
);
};

exports.findSessionData = function (aQuery, aStore, aOptions, aCallback) {
var sessionColl = aStore.db.collection('sessions');

Expand Down Expand Up @@ -264,7 +325,8 @@ exports.findSessionData = function (aQuery, aStore, aOptions, aCallback) {
// Very simple query filter search check to start.
// Currently only looking in `data.passport.oujsOptions.username`.
if (aQuery && aQuery.username) {
rQuery = new RegExp('^' + aQuery.username, 'i');
rQuery = new RegExp('^' + aQuery.username +
(aOptions.isAdminSessionActiveView ? '' : '$'), 'i');

if (rQuery.test(data.passport.oujsOptions.username)) {
aOptions.sessionList.push(data);
Expand Down
2 changes: 1 addition & 1 deletion views/includes/session.html
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
{{#showExtend}}
<form class="form-inline" action="/api/user/session/extend" method="post">
<div class="input-group">
<button class="btn btn-success" type="submit"{{^canExtend}}disabled="disabled"{{/canExtend}}><i class="fa fa-fw fa-history"></i> Extend</button>
<button class="btn btn-success" type="submit"{{^canExtend}}disabled="disabled"{{/canExtend}}{{#canExtend}} title="Usually the default session timeout is enough but if you need some more time it is available here. Please use responsibly."{{/canExtend}}><i class="fa fa-fw fa-history"></i> Extend</button>
</div>
</form>
{{/showExtend}}
Expand Down
20 changes: 11 additions & 9 deletions views/pages/userEditPreferencesPage.html
Original file line number Diff line number Diff line change
Expand Up @@ -37,19 +37,21 @@ <h2 class="edit-authentication">Authentication</h2>
</div>
</form>
</div>
{{#sessionControl}}
<div class="edit-session-box">
<h2 class="edit-session">Session</h2>
<form method="post" action="/api/user/session/extend">
<div class="input-group col-xs-12">
<div class="alert alert-warning small" role="alert">
<button class="btn btn-success" type="submit"><i class="fa fa-fw fa-history"></i> Extend this session</button>
<i class="fa fa-exclamation-triangle"></i> <strong>NOTICE</strong>: Usually the default session timeout is enough but if you need some more time it is available here. Please use responsibly.
<h2 class="edit-session">Sessions</h2>
<div class="session-area list-group">
{{#sessionList}}
{{> includes/session.html }}
{{/sessionList}}
{{^sessionList}}
<div class="panel">
<div class="panel-body">
<em>This user hasn't added any sessions yet.</em>
</div>
</div>
</form>
{{/sessionList}}
</div>
</div>
{{/sessionControl}}
</div>
</div>
</div>
Expand Down

0 comments on commit 22a6d61

Please sign in to comment.