const jwt = require("jsonwebtoken"); const User = require("./models/User"); const { res500 } = require("./plugins/controllersHelperFunctions"); const Category = require("./models/Category"); const Election = require("./models/Election"); const authentication = { // secret for generating jwt token secretKey: "kyQa8pFI5BJnj7LCVPlSfoATTSZuS5DMSjgBPxQo2zkcdKnxKCPzWs1DEBgMfnXFsjgT0YWgqn8HgLLcmdIgSR6fSQpy6vchmY3kUSD564J", // check if just logged in (admin-or-user) (middleware) isLoggedIn: async function (req, res, next) { try { const token = req.headers.authorization?.replace(/^Bearer\s/, ""); if (token) { // check if token is not destroyed var user = await User.findOne({ token: token }); if (!user) { return res.status(401).json({ message: "unauthorized" }); } if (!user.registration_done) { return res500(res, "user is disable please contact to support"); } //verifies secret and checks if the token is expired try { var checkToken = await jwt.verify( user.token.replace(/^Bearer\s/, ""), authentication.secretKey ); if (!checkToken) { return res.status(401).json({ message: "unauthorized" }); } } catch (error) { return res.status(401).json({ message: "unauthorized" }); } req.user = { _id: user._id, scope: user.scope, portals: user.portals, permissions: user.permissions, specialPermissions: user.specialPermissions, private: user.private, }; return next(); } else { return res.status(401).json({ message: "unauthorized" }); } } catch (error) { return res500(res, error.message); } }, // check if admin logged in (middleware) isAdmin: async function (req, res, next) { /** if req.user exist find user and check scope */ /** req.user send from isLoggedIn */ try { if (req.user) { const scope = req.user.scope; if (!scope.includes("admin")) { return res.status(401).json({ message: "unauthorized" }); } return next(); } else { return res.status(401).json({ message: "unauthorized" }); } } catch (error) { return res.status(401).json({ message: "unauthorized" }); } }, // check if user has permission (middleware) hasPermission: (permission) => { return (req, res, next) => { if (req.user && req.user.permissions) { const permissions = req.user.permissions; if (permissions.includes("superAdmin")) { return next(); } if (!permissions.includes(permission)) { return res.status(401).json({ message: "unauthorized" }); } else { return next(); } } else { return res.status(401).json({ message: "unauthorized" }); } }; }, // hasSpecPermission: () => { // return async (req, res, next) => { // if (req.user && req.user.specialPermissions.length) { // const specialPermissions = req.user.specialPermissions; // if (req.user.permissions.includes('superAdmin')) { // return next(); // } // let tempSpec = []; // for (const spec of specialPermissions) { // const check = await Category.findById(spec); // // if (check){ // tempSpec.push(check._id); // } // } // // if (tempSpec.length){ // req.user.allSpecialPermissions = tempSpec; // next(); // }else { // return res.status(401).json({message: 'unauthorized'}); // } // } else { // return next(); // } // } // }, hasSubPermission: () => { return (req, res, next, value) => { if (req.user && req.user.permissions) { var permissions = req.user.permissions; if (permissions.includes("superAdmin")) { return next(); } if (!permissions.some((item) => new RegExp(value, "i").test(item))) { return res.status(401).json({ message: "unauthorized" }); } else { return next(); } } else { return res.status(401).json({ message: "unauthorized" }); } }; }, isVoter: async function (req, res, next) { try { const token = req.headers.authorization?.replace(/^Bearer\s/, ""); if (token) { // check if token is not destroyed const user = await Election.findOne({ voters: { $elemMatch: { _id: token } }, }); if (!user) { return res.status(401).json({ message: "unauthorized" }); } const voter = user.voters.id(token); req.voter = { _id: voter._id, username: voter.username, password: voter.password, voted: voter.voted, }; return next(); } else { return res.status(401).json({ message: "unauthorized" }); } } catch (error) { return res500(res, error.message); } }, }; module.exports = authentication;