2
0

rights.js 997 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. "use strict";
  2. const _ = require('lodash');
  3. /**
  4. * Rights
  5. */
  6. module.exports = {
  7. check(req, role) {
  8. let rt = [];
  9. let p = _.chain(req.originalUrl).toLower().trim().value();
  10. // Load User Rights
  11. if(_.isArray(req.user.rights)) {
  12. rt = req.user.rights;
  13. }
  14. // Is admin?
  15. if(_.find(rt, { role: 'admin' })) {
  16. return true;
  17. }
  18. // Check specific role on path
  19. let filteredRights = _.filter(rt, (r) => {
  20. if(r.role === role || (r.role === 'write' && role === 'read')) {
  21. if((!r.exact && _.startsWith(p, r.path)) || (r.exact && p === r.path)) {
  22. return true;
  23. }
  24. }
  25. return false;
  26. });
  27. // Check for deny scenario
  28. let isValid = false;
  29. if(filteredRights.length > 1) {
  30. isValid = !_.chain(filteredRights).sortBy((r) => {
  31. return r.path.length + ((r.deny) ? 0.5 : 0);
  32. }).last().get('deny').value();
  33. } else if(filteredRights.length == 1 && filteredRights[0].deny === false) {
  34. isValid = true;
  35. }
  36. // Deny by default
  37. return isValid;
  38. }
  39. };