// session.js // Copyright (C) 2021 Digital Telepresence, LLC // License: Apache-2.0 'use strict'; const util = require('util'); const passport = require('passport'); const { SiteError, SiteLog } = require('../../lib/site-lib'); class SessionService { constructor (dtp) { this.dtp = dtp; this.log = new SiteLog(dtp, `svc:${module.exports.slug}`); } async start ( ) { this.log.info(`starting ${module.exports.name} service`); passport.serializeUser(this.serializeUser.bind(this)); passport.deserializeUser(this.deserializeUser.bind(this)); } async stop ( ) { this.log.info(`stopping ${module.exports.name} service`); } middleware ( ) { return async (req, res, next) => { res.locals.user = req.user; res.locals.query = req.query; if (req.user) { if (req.user.flags.isAdmin) { res.locals.config = this.dtp.config; res.locals.session = req.session; res.locals.util = util; } } return next(); }; } authCheckMiddleware (options) { options = Object.assign({ requireLogin: true, requireAdmin: false, }, options); return async (req, res, next) => { if (options.requireLogin && !req.user) { return next(new SiteError(403, 'Must sign in to proceed')); } if (options.requireAdmin && (!req.user || !req.user.flags.isAdmin)) { return next(new SiteError(403, 'Administrator privileges are required')); } return next(); }; } async serializeUser (user, done) { return done(null, user._id); } async deserializeUser (userId, done) { const { user: userService } = this.dtp.services; try { const user = await userService.getUserAccount(userId); return done(null, user); } catch (error) { this.log.error('failed to deserialize user from session', { error }); return done(null, null); } } } module.exports = { slug: 'session', name: 'session', create: (dtp) => { return new SessionService(dtp); }, };