Skip to content

Commit 4859c4b

Browse files
committed
Refactor to existing code style
* 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`. Post OpenUserJS#1446 ... related to OpenUserJS#604
1 parent f062cd7 commit 4859c4b

File tree

4 files changed

+130
-107
lines changed

4 files changed

+130
-107
lines changed

controllers/admin.js

+16-94
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ var exec = require('child_process').exec;
1313
var async = require('async');
1414
var _ = require('underscore');
1515
var moment = require('moment');
16-
var momentDurationFormatSetup = require("moment-duration-format");
1716
var git = require('git-rev');
1817
var useragent = require('useragent');
1918

@@ -40,6 +39,7 @@ var loadPassport = require('../libs/passportLoader').loadPassport;
4039
var strategyInstances = require('../libs/passportLoader').strategyInstances;
4140
var statusCodePage = require('../libs/templateHelpers').statusCodePage;
4241
var updateSessions = require('../libs/modifySessions').update;
42+
var listDataSessions = require('../libs/modifySessions').listData;
4343
var pageMetadata = require('../libs/templateHelpers').pageMetadata;
4444

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

5050

51-
// Initializations
52-
momentDurationFormatSetup(moment);
53-
5451
//---
5552

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

401398
tasks.push(function (aCallback) {
402399

403-
sessionColl.find({
404-
}, function (aErr, aUserSessions) {
400+
listDataSessions(store, options, function (aErr) {
405401
if (aErr) {
406402
statusCodePage(aReq, aRes, aNext, {
407-
statusCode: 520,
408-
statusMessage: 'Unknown error with `sessionColl.find`.'
409-
});
410-
return;
411-
}
412-
413-
if (!aUserSessions) {
414-
statusCodePage(aReq, aRes, aNext, {
415-
statusCode: 200,
416-
statusMessage: 'No sessions'
403+
statusCode: 500,
404+
statusMessage: aErr
417405
});
418406
return;
419407
}
420408

421-
aUserSessions.toArray(function (aErr, aSessionsData) {
422-
options.sessionList = [];
423-
424-
if (aErr) {
425-
// We want to know what the error value is in logging review
426-
console.error('Unknown error with `toArray`.\n' + aErr);
409+
options.sessionList = _.map(options.sessionList, function (aSession) {
410+
var session = modelParser.parseSession(aSession);
427411

428-
statusCodePage(aReq, aRes, aNext, {
429-
statusCode: 520,
430-
statusMessage: 'Unknown error with `toArray`.'
431-
});
432-
return;
433-
}
434-
435-
aSessionsData.forEach(function (aElement, aIndex) {
436-
var data = JSON.parse(aElement.session);
437-
438-
var user = null;
439-
var username = null;
440-
var cookie = null;
441-
var oujsOptions = {};
442-
443-
var obj = null;
444-
445-
if (data) {
446-
user = data.user || {};
447-
username = user.name || data.username;
448-
cookie = data.cookie || {};
449-
450-
if (data.passport && data.passport.oujsOptions) {
451-
oujsOptions = data.passport.oujsOptions;
452-
}
453-
454-
obj = {
455-
_id: aElement._id,
456-
name: username,
457-
role: userRoles[user.role],
458-
strategy: oujsOptions.strategy,
459-
canDestroyOne: true, // TODO: Perhaps do some further conditionals
460-
remoteAddress: (
461-
username === authedUser.name && !oujsOptions.authFrom
462-
? oujsOptions.remoteAddress
463-
: oujsOptions.authFrom
464-
? oujsOptions.authFrom
465-
: null
466-
),
467-
ua: {
468-
raw: oujsOptions.userAgent,
469-
class: 'fa-lg ua-' + useragent.parse(oujsOptions.userAgent)
470-
.family.toLowerCase().replace(/\s+/g, '-')
471-
},
472-
userPageUrl: user.userPageUrl,
473-
cookie: {
474-
since: oujsOptions.since ? new Date(oujsOptions.since) : oujsOptions.since,
475-
expires: (cookie.expires ? new Date(cookie.expires) : false),
476-
originalMaxAge: (cookie.originalMaxAge
477-
? moment.duration(cookie.originalMaxAge, "milliseconds")
478-
.format('YYYY[y]DDD[d]H[h]m[m]', { trim: 'both' })
479-
: false),
480-
secure: cookie.secure,
481-
httpOnly: cookie.httpOnly,
482-
sameSite: cookie.sameSite,
483-
sameSiteStrict: cookie.sameSite === 'strict',
484-
sameSiteLax: cookie.sameSite === 'lax' ,
485-
}
486-
};
487-
488-
modelParser.parseDateProperty(obj.cookie, 'expires');
489-
modelParser.parseDateProperty(obj.cookie, 'since');
490-
491-
options.sessionList.push(obj);
492-
}
493-
});
412+
var oujsOptions = session.passport.oujsOptions;
494413

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

500-
aCallback();
416+
oujsOptions.remoteAddressMask = session.name === authedUser.name && !oujsOptions.authFrom
417+
? oujsOptions.remoteAddressMask
418+
: oujsOptions.authFrom
419+
? oujsOptions.authFrom
420+
: null;
421+
return session;
501422
});
502-
});
503423

424+
aCallback();
425+
});
504426
});
505427

506428
//---

libs/modelParser.js

+52
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ var isDbg = require('../libs/debug').isDbg;
99

1010
//--- Dependency inclusions
1111
var moment = require('moment');
12+
var momentDurationFormatSetup = require("moment-duration-format");
1213
var _ = require('underscore');
1314
var util = require('util');
1415
var useragent = require('useragent');
@@ -30,6 +31,9 @@ var isFQUrl = require('../libs/helpers').isFQUrl;
3031
//--- Configuration inclusions
3132
var userRoles = require('../models/userRoles.json');
3233

34+
// --- Initializations
35+
momentDurationFormatSetup(moment);
36+
3337
//---
3438

3539
var parseModelFnMap = {};
@@ -94,13 +98,23 @@ var parseDateProperty = function (aObj, aKey) {
9498
if (aObj[aKey]) {
9599
date = new Date(aObj[aKey]);
96100
if (date) {
101+
aObj[aKey] = date;
97102
aObj[aKey + 'ISOFormat'] = date.toISOString();
98103
aObj[aKey + 'Humanized'] = moment(date).locale('en-tiny').calendar();
99104
}
100105
}
101106
};
102107
exports.parseDateProperty = parseDateProperty;
103108

109+
var parseDurationProperty = function (aObj, aKey, aUnits) {
110+
if (aObj[aKey]) {
111+
aObj[aKey + 'Humanized'] = moment.duration(aObj[aKey], aUnits || 'milliseconds')
112+
.format('YYYY[y]DDD[d]H[h]m[m]', { trim: 'both' });
113+
}
114+
};
115+
exports.parseDurationProperty = parseDurationProperty;
116+
117+
104118
// Parse persisted model data and return a new object
105119
// with additional generated fields used in view templates.
106120

@@ -880,3 +894,41 @@ var parseRemovedItem = function (aRemovedItem) {
880894
};
881895
parseModelFnMap.Remove = parseRemovedItem;
882896
exports.parseRemovedItem = parseRemovedItem;
897+
898+
899+
/**
900+
* Session
901+
*/
902+
var parseSession = function (aSession) {
903+
var session = null;
904+
905+
var cookie = null;
906+
var oujsOptions = null;
907+
908+
if (!aSession) {
909+
return;
910+
}
911+
912+
session = aSession.toObject ? aSession.toObject() : aSession;
913+
914+
//
915+
cookie = session.cookie;
916+
oujsOptions = session.passport.oujsOptions;
917+
918+
919+
session.name = session.user ? session.user.name : oujsOptions.username;
920+
921+
oujsOptions.remoteAddressMask = oujsOptions.remoteAddress;
922+
oujsOptions.userAgentFamily = useragent
923+
.parse(oujsOptions.userAgent).family.toLowerCase().replace(/\s+/g, '-');
924+
parseDateProperty(oujsOptions, 'since');
925+
926+
cookie.sameSiteStrict = cookie.sameSite === 'strict';
927+
cookie.sameSiteLax = cookie.sameSite === 'lax';
928+
parseDateProperty(cookie, 'expires');
929+
parseDurationProperty(cookie, 'originalMaxAge');
930+
931+
return session;
932+
};
933+
parseModelFnMap.Session = parseSession;
934+
exports.parseSession = parseSession;

libs/modifySessions.js

+49
Original file line numberDiff line numberDiff line change
@@ -199,3 +199,52 @@ exports.destroy = function (aReq, aUser, aCallback) {
199199
store.destroy(aId, aInnerCallback);
200200
}, aCallback);
201201
};
202+
203+
exports.listData = function (aStore, aOptions, aCallback) {
204+
var sessionColl = aStore.db.collection('sessions');
205+
206+
sessionColl.find({
207+
}, function (aErr, aUserSessions) {
208+
if (aErr) {
209+
aCallback(aErr);
210+
return;
211+
}
212+
213+
if (!aUserSessions) {
214+
aCallback('No sessions');
215+
return;
216+
}
217+
218+
aUserSessions.toArray(function (aErr, aSessionsData) {
219+
aOptions.sessionList = [];
220+
221+
if (aErr) {
222+
aCallback(aErr);
223+
return;
224+
}
225+
226+
aSessionsData.forEach(function (aElement, aIndex) {
227+
var data = JSON.parse(aElement.session);
228+
229+
if (data) {
230+
231+
if (!data.passport) {
232+
data.passport = {};
233+
}
234+
235+
if (!data.passport.oujsOptions) {
236+
data.passport.oujsOptions = {};
237+
}
238+
239+
data.passport.oujsOptions.username = data.username;
240+
data.passport.oujsOptions.sid = aElement._id;
241+
}
242+
243+
aOptions.sessionList.push(data);
244+
});
245+
246+
aCallback();
247+
});
248+
});
249+
}
250+

views/includes/session.html

+13-13
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22
<article>
33
<div class="row">
44
<div class="session-avatar col-sm-2">
5-
{{#userPageUrl}}<a href="{{{userPageUrl}}}" class="username"><i class="fa fa-user"></i></a>{{/userPageUrl}}
6-
{{^userPageUrl}}<span class="username"><i class="fa fa-user"></i></span>{{/userPageUrl}}
5+
{{#user.userPageUrl}}<a href="{{{user.userPageUrl}}}" class="username"><i class="fa fa-user"></i></a>{{/user.userPageUrl}}
6+
{{^user.userPageUrl}}<span class="username"><i class="fa fa-user"></i></span>{{/user.userPageUrl}}
77
</div>
88
<div class="session-body col-sm-10 container-fluid">
99
<div class="session-meta-data row">
1010
<div class="names pull-left">
1111
<span>
12-
{{#userPageUrl}}<a href="{{{userPageUrl}}}" class="username">{{name}}</a>{{/userPageUrl}}
13-
{{^userPageUrl}}<span class="username">{{#name}}{{name}}{{/name}}{{^name}}<em>&hellip;</em>{{/name}}</span>{{/userPageUrl}}
14-
<span class="label label-default">{{#role}}{{role}}{{/role}}{{^role}}<em>&hellip;</em>{{/role}}</span>
12+
{{#user.userPageUrl}}<a href="{{{user.userPageUrl}}}" class="username">{{name}}</a>{{/user.userPageUrl}}
13+
{{^user.userPageUrl}}<span class="username">{{#name}}{{name}}{{/name}}{{^name}}<em>&hellip;</em>{{/name}}</span>{{/user.userPageUrl}}
14+
<span class="label label-default">{{#user.roleName}}{{user.roleName}}{{/user.roleName}}{{^user.roleName}}<em>&hellip;</em>{{/user.roleName}}</span>
1515
<span class="label label-{{#cookie.secure}}success{{/cookie.secure}}{{^cookie.secure}}warning{{/cookie.secure}}" title="secure">
1616
<i class="fa fa-{{^cookie.secure}}un{{/cookie.secure}}lock"></i>
1717
</span>
@@ -24,17 +24,17 @@
2424
{{^cookie.sameSite}}<i class="fa fa-circle-o"></i>{{/cookie.sameSite}}
2525
</span>
2626
<span class="label label-{{#cookie.originalMaxAge}}success{{/cookie.originalMaxAge}}{{^cookie.originalMaxAge}}warning{{/cookie.originalMaxAge}}" title="originalMaxAge">
27-
{{#cookie.originalMaxAge}}{{cookie.originalMaxAge}}{{/cookie.originalMaxAge}}{{^cookie.originalMaxAge}}&and;{{/cookie.originalMaxAge}}
27+
{{#cookie.originalMaxAge}}{{cookie.originalMaxAgeHumanized}}{{/cookie.originalMaxAge}}{{^cookie.originalMaxAge}}&and;{{/cookie.originalMaxAge}}
2828
</span>
29-
{{#remoteAddress}}
30-
<span class="label label-info" title="remoteAddress">{{remoteAddress}}</span>
31-
{{/remoteAddress}}
29+
{{#passport.oujsOptions.remoteAddress}}
30+
<span class="label label-info" title="remoteAddress">{{passport.oujsOptions.remoteAddressMask}}</span>
31+
{{/passport.oujsOptions.remoteAddress}}
3232
</span>
3333
</div>
3434
<div class="session-info pull-right">
35-
<img src="/images/strat/{{strategy}}16.png" title="{{#strategy}}{{strategy}}{{/strategy}}{{^strategy}}passport{{/strategy}}" alt="{{#strategy}}{{strategy}}{{/strategy}}{{^strategy}}passport{{/strategy}}">
36-
<i class="fa fa-fw fa-globe ua {{ua.class}} " title="{{#ua.raw}}{{ua.raw}}{{/ua.raw}}{{^ua.raw}}{{/ua.raw}}"></i>
37-
{{#cookie.since}}<time datetime="{{cookie.sinceISOFormat}}" title="{{cookie.since}}">{{cookie.sinceHumanized}}</time>{{/cookie.since}}{{^cookie.since}}<em>&hellip;</em>{{/cookie.since}}
35+
<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}}">
36+
<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>
37+
{{#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}}
3838
</div>
3939
</div>
4040
<div class="session-post-contents row">
@@ -45,7 +45,7 @@
4545
<form class="form-inline" action="/api/user/session/destroyOne" method="post">
4646
<div class="input-group">
4747
<input type="hidden" name="username" value="{{name}}">
48-
<input type="hidden" name="id" value="{{_id}}">
48+
<input type="hidden" name="id" value="{{passport.oujsOptions.sid}}">
4949
<button type="submit" class="btn btn-danger{{^canDestroyOne}} disabled{{/canDestroyOne}}"{{^canDestroyOne}} disabled="disabled"{{/canDestroyOne}}>
5050
<span class="fa fa-trash"> Delete</span>
5151
</button>

0 commit comments

Comments
 (0)