2023-11-13 23:51:16 +01:00
|
|
|
const { SystemSettings } = require("../../models/systemSettings");
|
|
|
|
const { userFromSession } = require("../http");
|
2024-01-22 23:14:01 +01:00
|
|
|
const ROLES = {
|
|
|
|
all: "<all>",
|
|
|
|
admin: "admin",
|
|
|
|
manager: "manager",
|
|
|
|
default: "default",
|
|
|
|
};
|
|
|
|
const DEFAULT_ROLES = [ROLES.admin, ROLES.admin];
|
2023-11-13 23:51:16 +01:00
|
|
|
|
|
|
|
// Explicitly check that multi user mode is enabled as well as that the
|
|
|
|
// requesting user has the appropriate role to modify or call the URL.
|
2024-01-22 23:14:01 +01:00
|
|
|
function strictMultiUserRoleValid(allowedRoles = DEFAULT_ROLES) {
|
|
|
|
return async (request, response, next) => {
|
|
|
|
// If the access-control is allowable for all - skip validations and continue;
|
|
|
|
if (allowedRoles.includes(ROLES.all)) {
|
|
|
|
next();
|
|
|
|
return;
|
|
|
|
}
|
2023-11-13 23:51:16 +01:00
|
|
|
|
2024-01-22 23:14:01 +01:00
|
|
|
const multiUserMode =
|
|
|
|
response.locals?.multiUserMode ??
|
|
|
|
(await SystemSettings.isMultiUserMode());
|
|
|
|
if (!multiUserMode) return response.sendStatus(401).end();
|
2023-11-13 23:51:16 +01:00
|
|
|
|
2024-01-22 23:14:01 +01:00
|
|
|
const user =
|
|
|
|
response.locals?.user ?? (await userFromSession(request, response));
|
|
|
|
if (allowedRoles.includes(user?.role)) {
|
|
|
|
next();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
return response.sendStatus(401).end();
|
|
|
|
};
|
2023-11-13 23:51:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Apply role permission checks IF the current system is in multi-user mode.
|
|
|
|
// This is relevant for routes that are shared between MUM and single-user mode.
|
|
|
|
// Checks if the requesting user has the appropriate role to modify or call the URL.
|
2024-01-22 23:14:01 +01:00
|
|
|
function flexUserRoleValid(allowedRoles = DEFAULT_ROLES) {
|
|
|
|
return async (request, response, next) => {
|
|
|
|
// If the access-control is allowable for all - skip validations and continue;
|
|
|
|
// It does not matter if multi-user or not.
|
|
|
|
if (allowedRoles.includes(ROLES.all)) {
|
|
|
|
next();
|
|
|
|
return;
|
|
|
|
}
|
2023-11-13 23:51:16 +01:00
|
|
|
|
2024-01-22 23:14:01 +01:00
|
|
|
// Bypass if not in multi-user mode
|
|
|
|
const multiUserMode =
|
|
|
|
response.locals?.multiUserMode ??
|
|
|
|
(await SystemSettings.isMultiUserMode());
|
|
|
|
if (!multiUserMode) {
|
|
|
|
next();
|
|
|
|
return;
|
|
|
|
}
|
2023-11-13 23:51:16 +01:00
|
|
|
|
2024-01-22 23:14:01 +01:00
|
|
|
const user =
|
|
|
|
response.locals?.user ?? (await userFromSession(request, response));
|
|
|
|
if (allowedRoles.includes(user?.role)) {
|
|
|
|
next();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
return response.sendStatus(401).end();
|
|
|
|
};
|
2023-11-13 23:51:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
2024-01-22 23:14:01 +01:00
|
|
|
ROLES,
|
2023-11-13 23:51:16 +01:00
|
|
|
strictMultiUserRoleValid,
|
|
|
|
flexUserRoleValid,
|
|
|
|
};
|