const User = require('../../models/User'); const secret = require('../../secret'); const config = require('../../config'); const jwt = require('jsonwebtoken'); const redirect = (res, status=401, url=undefined) => { if (!url) { res.status(status).json({ error: true, message: 'ERROR_ACCESS_DENIED' }); return; } res.redirect(url); } function authenticateEndpoint(callback, url=undefined, minPermissionLevel=config.roleMap.RESTRICTED) { return (req, res) => { const token = req.cookies.token; if (!token) { redirect(res, 403, url); return; } jwt.verify(token, secret.jwtPrivateKey, {}, async (err, data) => { if (err) { redirect(res, 401, url); return; } if (!data) { redirect(res, 401, url); return } if (!data.username) { redirect(res, 401, url); return; } const user = await User.findByUsername(data.username); if (!user) { redirect(res, 401, url); return; } let permissionLevel = config.roleMap[user.role]; if (!permissionLevel) { permissionLevel = 0; } if (permissionLevel < minPermissionLevel) { redirect(res, 401, url); return; } callback(req, res, user); }); }; } module.exports = { authenticateEndpoint };