Skip to content

Commit

Permalink
Refactor to existing code style (#1479)
Browse files Browse the repository at this point in the history
* Should be functionally equivalent to the inline but using current structures e.g. match project code style placements. Needed for next stage.
* Added one override on `parseDateProperty` since `date` sometimes gets written to a flat string object instead of `Date`.

NOTE: These are no longer sorted as that's coming up in the future... although may reinstate if lack of time

Post #1446 ... related to #604
  • Loading branch information
Martii authored Jul 2, 2018
1 parent f062cd7 commit ca8847c
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 107 deletions.
110 changes: 16 additions & 94 deletions controllers/admin.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ var exec = require('child_process').exec;
var async = require('async');
var _ = require('underscore');
var moment = require('moment');
var momentDurationFormatSetup = require("moment-duration-format");
var git = require('git-rev');
var useragent = require('useragent');

Expand All @@ -40,6 +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 listDataSessions = require('../libs/modifySessions').listData;
var pageMetadata = require('../libs/templateHelpers').pageMetadata;

//--- Configuration inclusions
Expand All @@ -48,9 +48,6 @@ var userRoles = require('../models/userRoles.json');
var strategies = require('./strategies.json');


// Initializations
momentDurationFormatSetup(moment);

//---

// This controller is only for use by users with a role of admin or above
Expand Down Expand Up @@ -400,107 +397,32 @@ exports.adminSessionActiveView = function (aReq, aRes, aNext) {

tasks.push(function (aCallback) {

sessionColl.find({
}, function (aErr, aUserSessions) {
listDataSessions(store, options, function (aErr) {
if (aErr) {
statusCodePage(aReq, aRes, aNext, {
statusCode: 520,
statusMessage: 'Unknown error with `sessionColl.find`.'
});
return;
}

if (!aUserSessions) {
statusCodePage(aReq, aRes, aNext, {
statusCode: 200,
statusMessage: 'No sessions'
statusCode: 500,
statusMessage: aErr
});
return;
}

aUserSessions.toArray(function (aErr, aSessionsData) {
options.sessionList = [];

if (aErr) {
// We want to know what the error value is in logging review
console.error('Unknown error with `toArray`.\n' + aErr);
options.sessionList = _.map(options.sessionList, function (aSession) {
var session = modelParser.parseSession(aSession);

statusCodePage(aReq, aRes, aNext, {
statusCode: 520,
statusMessage: 'Unknown error with `toArray`.'
});
return;
}

aSessionsData.forEach(function (aElement, aIndex) {
var data = JSON.parse(aElement.session);

var user = null;
var username = null;
var cookie = null;
var oujsOptions = {};

var obj = null;

if (data) {
user = data.user || {};
username = user.name || data.username;
cookie = data.cookie || {};

if (data.passport && data.passport.oujsOptions) {
oujsOptions = data.passport.oujsOptions;
}

obj = {
_id: aElement._id,
name: username,
role: userRoles[user.role],
strategy: oujsOptions.strategy,
canDestroyOne: true, // TODO: Perhaps do some further conditionals
remoteAddress: (
username === authedUser.name && !oujsOptions.authFrom
? oujsOptions.remoteAddress
: oujsOptions.authFrom
? oujsOptions.authFrom
: null
),
ua: {
raw: oujsOptions.userAgent,
class: 'fa-lg ua-' + useragent.parse(oujsOptions.userAgent)
.family.toLowerCase().replace(/\s+/g, '-')
},
userPageUrl: user.userPageUrl,
cookie: {
since: oujsOptions.since ? new Date(oujsOptions.since) : oujsOptions.since,
expires: (cookie.expires ? new Date(cookie.expires) : false),
originalMaxAge: (cookie.originalMaxAge
? moment.duration(cookie.originalMaxAge, "milliseconds")
.format('YYYY[y]DDD[d]H[h]m[m]', { trim: 'both' })
: false),
secure: cookie.secure,
httpOnly: cookie.httpOnly,
sameSite: cookie.sameSite,
sameSiteStrict: cookie.sameSite === 'strict',
sameSiteLax: cookie.sameSite === 'lax' ,
}
};

modelParser.parseDateProperty(obj.cookie, 'expires');
modelParser.parseDateProperty(obj.cookie, 'since');

options.sessionList.push(obj);
}
});
var oujsOptions = session.passport.oujsOptions;

// Sort the sessions for now
options.sessionList = _.sortBy(options.sessionList, function (aSession) {
return (aSession.name) ? aSession.name.toLowerCase() : aSession.name;
});
session.canDestroyOne = true; // TODO: Perhaps do some further conditionals

aCallback();
oujsOptions.remoteAddressMask = session.name === authedUser.name && !oujsOptions.authFrom
? oujsOptions.remoteAddressMask
: oujsOptions.authFrom
? oujsOptions.authFrom
: null;
return session;
});
});

aCallback();
});
});

//---
Expand Down
52 changes: 52 additions & 0 deletions libs/modelParser.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ var isDbg = require('../libs/debug').isDbg;

//--- Dependency inclusions
var moment = require('moment');
var momentDurationFormatSetup = require("moment-duration-format");
var _ = require('underscore');
var util = require('util');
var useragent = require('useragent');
Expand All @@ -30,6 +31,9 @@ var isFQUrl = require('../libs/helpers').isFQUrl;
//--- Configuration inclusions
var userRoles = require('../models/userRoles.json');

// --- Initializations
momentDurationFormatSetup(moment);

//---

var parseModelFnMap = {};
Expand Down Expand Up @@ -94,13 +98,23 @@ var parseDateProperty = function (aObj, aKey) {
if (aObj[aKey]) {
date = new Date(aObj[aKey]);
if (date) {
aObj[aKey] = date;
aObj[aKey + 'ISOFormat'] = date.toISOString();
aObj[aKey + 'Humanized'] = moment(date).locale('en-tiny').calendar();
}
}
};
exports.parseDateProperty = parseDateProperty;

var parseDurationProperty = function (aObj, aKey, aUnits) {
if (aObj[aKey]) {
aObj[aKey + 'Humanized'] = moment.duration(aObj[aKey], aUnits || 'milliseconds')
.format('YYYY[y]DDD[d]H[h]m[m]', { trim: 'both' });
}
};
exports.parseDurationProperty = parseDurationProperty;


// Parse persisted model data and return a new object
// with additional generated fields used in view templates.

Expand Down Expand Up @@ -880,3 +894,41 @@ var parseRemovedItem = function (aRemovedItem) {
};
parseModelFnMap.Remove = parseRemovedItem;
exports.parseRemovedItem = parseRemovedItem;


/**
* Session
*/
var parseSession = function (aSession) {
var session = null;

var cookie = null;
var oujsOptions = null;

if (!aSession) {
return;
}

session = aSession.toObject ? aSession.toObject() : aSession;

//
cookie = session.cookie;
oujsOptions = session.passport.oujsOptions;


session.name = session.user ? session.user.name : oujsOptions.username;

oujsOptions.remoteAddressMask = oujsOptions.remoteAddress;
oujsOptions.userAgentFamily = useragent
.parse(oujsOptions.userAgent).family.toLowerCase().replace(/\s+/g, '-');
parseDateProperty(oujsOptions, 'since');

cookie.sameSiteStrict = cookie.sameSite === 'strict';
cookie.sameSiteLax = cookie.sameSite === 'lax';
parseDateProperty(cookie, 'expires');
parseDurationProperty(cookie, 'originalMaxAge');

return session;
};
parseModelFnMap.Session = parseSession;
exports.parseSession = parseSession;
49 changes: 49 additions & 0 deletions libs/modifySessions.js
Original file line number Diff line number Diff line change
Expand Up @@ -199,3 +199,52 @@ exports.destroy = function (aReq, aUser, aCallback) {
store.destroy(aId, aInnerCallback);
}, aCallback);
};

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

sessionColl.find({
}, function (aErr, aUserSessions) {
if (aErr) {
aCallback(aErr);
return;
}

if (!aUserSessions) {
aCallback('No sessions');
return;
}

aUserSessions.toArray(function (aErr, aSessionsData) {
aOptions.sessionList = [];

if (aErr) {
aCallback(aErr);
return;
}

aSessionsData.forEach(function (aElement, aIndex) {
var data = JSON.parse(aElement.session);

if (data) {

if (!data.passport) {
data.passport = {};
}

if (!data.passport.oujsOptions) {
data.passport.oujsOptions = {};
}

data.passport.oujsOptions.username = data.username;
data.passport.oujsOptions.sid = aElement._id;
}

aOptions.sessionList.push(data);
});

aCallback();
});
});
}

26 changes: 13 additions & 13 deletions views/includes/session.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@
<article>
<div class="row">
<div class="session-avatar col-sm-2">
{{#userPageUrl}}<a href="{{{userPageUrl}}}" class="username"><i class="fa fa-user"></i></a>{{/userPageUrl}}
{{^userPageUrl}}<span class="username"><i class="fa fa-user"></i></span>{{/userPageUrl}}
{{#user.userPageUrl}}<a href="{{{user.userPageUrl}}}" class="username"><i class="fa fa-user"></i></a>{{/user.userPageUrl}}
{{^user.userPageUrl}}<span class="username"><i class="fa fa-user"></i></span>{{/user.userPageUrl}}
</div>
<div class="session-body col-sm-10 container-fluid">
<div class="session-meta-data row">
<div class="names pull-left">
<span>
{{#userPageUrl}}<a href="{{{userPageUrl}}}" class="username">{{name}}</a>{{/userPageUrl}}
{{^userPageUrl}}<span class="username">{{#name}}{{name}}{{/name}}{{^name}}<em>&hellip;</em>{{/name}}</span>{{/userPageUrl}}
<span class="label label-default">{{#role}}{{role}}{{/role}}{{^role}}<em>&hellip;</em>{{/role}}</span>
{{#user.userPageUrl}}<a href="{{{user.userPageUrl}}}" class="username">{{name}}</a>{{/user.userPageUrl}}
{{^user.userPageUrl}}<span class="username">{{#name}}{{name}}{{/name}}{{^name}}<em>&hellip;</em>{{/name}}</span>{{/user.userPageUrl}}
<span class="label label-default">{{#user.roleName}}{{user.roleName}}{{/user.roleName}}{{^user.roleName}}<em>&hellip;</em>{{/user.roleName}}</span>
<span class="label label-{{#cookie.secure}}success{{/cookie.secure}}{{^cookie.secure}}warning{{/cookie.secure}}" title="secure">
<i class="fa fa-{{^cookie.secure}}un{{/cookie.secure}}lock"></i>
</span>
Expand All @@ -24,17 +24,17 @@
{{^cookie.sameSite}}<i class="fa fa-circle-o"></i>{{/cookie.sameSite}}
</span>
<span class="label label-{{#cookie.originalMaxAge}}success{{/cookie.originalMaxAge}}{{^cookie.originalMaxAge}}warning{{/cookie.originalMaxAge}}" title="originalMaxAge">
{{#cookie.originalMaxAge}}{{cookie.originalMaxAge}}{{/cookie.originalMaxAge}}{{^cookie.originalMaxAge}}&and;{{/cookie.originalMaxAge}}
{{#cookie.originalMaxAge}}{{cookie.originalMaxAgeHumanized}}{{/cookie.originalMaxAge}}{{^cookie.originalMaxAge}}&and;{{/cookie.originalMaxAge}}
</span>
{{#remoteAddress}}
<span class="label label-info" title="remoteAddress">{{remoteAddress}}</span>
{{/remoteAddress}}
{{#passport.oujsOptions.remoteAddress}}
<span class="label label-info" title="remoteAddress">{{passport.oujsOptions.remoteAddressMask}}</span>
{{/passport.oujsOptions.remoteAddress}}
</span>
</div>
<div class="session-info pull-right">
<img src="/images/strat/{{strategy}}16.png" title="{{#strategy}}{{strategy}}{{/strategy}}{{^strategy}}passport{{/strategy}}" alt="{{#strategy}}{{strategy}}{{/strategy}}{{^strategy}}passport{{/strategy}}">
<i class="fa fa-fw fa-globe ua {{ua.class}} " title="{{#ua.raw}}{{ua.raw}}{{/ua.raw}}{{^ua.raw}}{{/ua.raw}}"></i>
{{#cookie.since}}<time datetime="{{cookie.sinceISOFormat}}" title="{{cookie.since}}">{{cookie.sinceHumanized}}</time>{{/cookie.since}}{{^cookie.since}}<em>&hellip;</em>{{/cookie.since}}
<img src="/images/strat/{{passport.oujsOptions.strategy}}16.png" title="{{#passport.oujsOptions.strategy}}{{passport.oujsOptions.strategy}}{{/passport.oujsOptions.strategy}}{{^passport.oujsOptions.strategy}}passport{{/passport.oujsOptions.strategy}}" alt="{{#passport.oujsOptions.strategy}}{{passport.oujsOptions.strategy}}{{/passport.oujsOptions.strategy}}{{^passport.oujsOptions.strategy}}passport{{/passport.oujsOptions.strategy}}">
<i class="fa fa-fw fa-globe ua{{#passport.oujsOptions.userAgentFamily}} fa-lg ua-{{passport.oujsOptions.userAgentFamily}}{{/passport.oujsOptions.userAgentFamily}} "{{#passport.oujsOptions.userAgent}} title="{{passport.oujsOptions.userAgent}}"{{/passport.oujsOptions.userAgent}}></i>
{{#passport.oujsOptions.since}}<time datetime="{{passport.oujsOptions.sinceISOFormat}}" title="{{passport.oujsOptions.since}}">{{passport.oujsOptions.sinceHumanized}}</time>{{/passport.oujsOptions.since}}{{^passport.oujsOptions.since}}<em>&hellip;</em>{{/passport.oujsOptions.since}}
</div>
</div>
<div class="session-post-contents row">
Expand All @@ -45,7 +45,7 @@
<form class="form-inline" action="/api/user/session/destroyOne" method="post">
<div class="input-group">
<input type="hidden" name="username" value="{{name}}">
<input type="hidden" name="id" value="{{_id}}">
<input type="hidden" name="id" value="{{passport.oujsOptions.sid}}">
<button type="submit" class="btn btn-danger{{^canDestroyOne}} disabled{{/canDestroyOne}}"{{^canDestroyOne}} disabled="disabled"{{/canDestroyOne}}>
<span class="fa fa-trash"> Delete</span>
</button>
Expand Down

0 comments on commit ca8847c

Please sign in to comment.