You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.6 KiB

11 months ago
  1. const { SystemSettings } = require("../../models/systemSettings");
  2. const { userFromSession } = require("../http");
  3. const ROLES = {
  4. all: "<all>",
  5. admin: "admin",
  6. manager: "manager",
  7. default: "default",
  8. };
  9. const DEFAULT_ROLES = [ROLES.admin, ROLES.admin];
  10. /**
  11. * Explicitly check that multi user mode is enabled as well as that the
  12. * requesting user has the appropriate role to modify or call the URL.
  13. * @param {string[]} allowedRoles - The roles that are allowed to access the route
  14. * @returns {function}
  15. */
  16. function strictMultiUserRoleValid(allowedRoles = DEFAULT_ROLES) {
  17. return async (request, response, next) => {
  18. // If the access-control is allowable for all - skip validations and continue;
  19. if (allowedRoles.includes(ROLES.all)) {
  20. next();
  21. return;
  22. }
  23. const multiUserMode =
  24. response.locals?.multiUserMode ??
  25. (await SystemSettings.isMultiUserMode());
  26. if (!multiUserMode) return response.sendStatus(401).end();
  27. const user =
  28. response.locals?.user ?? (await userFromSession(request, response));
  29. if (allowedRoles.includes(user?.role)) {
  30. next();
  31. return;
  32. }
  33. return response.sendStatus(401).end();
  34. };
  35. }
  36. /**
  37. * Apply role permission checks IF the current system is in multi-user mode.
  38. * This is relevant for routes that are shared between MUM and single-user mode.
  39. * @param {string[]} allowedRoles - The roles that are allowed to access the route
  40. * @returns {function}
  41. */
  42. function flexUserRoleValid(allowedRoles = DEFAULT_ROLES) {
  43. return async (request, response, next) => {
  44. // If the access-control is allowable for all - skip validations and continue;
  45. // It does not matter if multi-user or not.
  46. if (allowedRoles.includes(ROLES.all)) {
  47. next();
  48. return;
  49. }
  50. // Bypass if not in multi-user mode
  51. const multiUserMode =
  52. response.locals?.multiUserMode ??
  53. (await SystemSettings.isMultiUserMode());
  54. if (!multiUserMode) {
  55. next();
  56. return;
  57. }
  58. const user =
  59. response.locals?.user ?? (await userFromSession(request, response));
  60. if (allowedRoles.includes(user?.role)) {
  61. next();
  62. return;
  63. }
  64. return response.sendStatus(401).end();
  65. };
  66. }
  67. // Middleware check on a public route if the instance is in a valid
  68. // multi-user set up.
  69. async function isMultiUserSetup(_request, response, next) {
  70. const multiUserMode = await SystemSettings.isMultiUserMode();
  71. if (!multiUserMode) {
  72. response.status(403).json({
  73. error: "Invalid request",
  74. });
  75. return;
  76. }
  77. next();
  78. return;
  79. }
  80. module.exports = {
  81. ROLES,
  82. strictMultiUserRoleValid,
  83. flexUserRoleValid,
  84. isMultiUserSetup,
  85. };