|
- const ModelPath = '../../models/';
- const Key = require(ModelPath + 'Key.js');
- const User = require(ModelPath + 'User.js');
-
- // Middleware that checks for authentication by either API key or session
- // sets req.username, req.displayname, req.scope, and req.key if authenticated properly, otherwise throws an error.
- // If the user is banned, also throw an error.
- const authenticate = async (req, scope) => {
- const keyprop = req.body.key || req.query.key;
- let key = keyprop ? (await Key.findOne({key: keyprop})) : false;
-
- if (key) {
- if (!scope || key.scope.includes(scope)) {
- if ((await User.countDocuments({username: key.issuer, banned: true})) === 0) {
- req.username = key.issuer;
- req.displayname = key.issuer;
- req.scope = key.scope;
- req.key = key.key;
- return {authenticated: true, permission: true};
- } else return {authenticated: true, permission: false};
- } else return {authenticated: true, permission: false};
- } else if (req.isAuthenticated()) {
- if (!scope || req.session.passport.scope.includes(scope)) {
- if ((await User.countDocuments({username: req.session.passport.user, banned: true})) === 0) {
- req.username = req.session.passport.user;
- req.displayname = req.session.passport.displayname;
- req.scope = req.session.passport.scope;
- req.key = null;
- return {authenticated: true, permission: true};
- } else return {authenticated: true, permission: false};
- } else return {authenticated: true, permission: false};
- } else return {authenticated: false, permission: false};
- };
-
- module.exports = authenticate;
|