123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- 'use strict'
- /* global db */
- const _ = require('lodash')
- /**
- * Rights
- */
- module.exports = {
- guest: {
- provider: 'local',
- email: 'guest',
- name: 'Guest',
- password: '',
- rights: [
- {
- role: 'read',
- path: '/',
- deny: false,
- exact: false
- }
- ]
- },
- /**
- * Initialize Rights module
- *
- * @return {void} Void
- */
- init () {
- let self = this
- db.onReady.then(() => {
- db.User.findOne({ provider: 'local', email: 'guest' }).then((u) => {
- if (u) {
- self.guest = u
- }
- })
- })
- },
- /**
- * Check user permissions for this request
- *
- * @param {object} req The request object
- * @return {object} List of permissions for this request
- */
- check (req) {
- let self = this
- let perm = {
- read: false,
- write: false,
- manage: false
- }
- let rt = []
- let p = _.chain(req.originalUrl).toLower().trim().value()
- // Load user rights
- if (_.isArray(req.user.rights)) {
- rt = req.user.rights
- }
- // Check rights
- if (self.checkRole(p, rt, 'admin')) {
- perm.read = true
- perm.write = true
- perm.manage = true
- } else if (self.checkRole(p, rt, 'write')) {
- perm.read = true
- perm.write = true
- } else if (self.checkRole(p, rt, 'read')) {
- perm.read = true
- }
- return perm
- },
- /**
- * Check for a specific role based on list of user rights
- *
- * @param {String} p Base path
- * @param {array<object>} rt The user rights
- * @param {string} role The minimum role required
- * @return {boolean} True if authorized
- */
- checkRole (p, rt, role) {
- if (_.find(rt, { role: 'admin' })) { return true }
- // Check specific role on path
- let filteredRights = _.filter(rt, (r) => {
- if (r.role === role || (r.role === 'write' && role === 'read')) {
- if ((!r.exact && _.startsWith(p, r.path)) || (r.exact && p === r.path)) {
- return true
- }
- }
- return false
- })
- // Check for deny scenario
- let isValid = false
- if (filteredRights.length > 1) {
- isValid = !_.chain(filteredRights).sortBy((r) => {
- return r.path.length + ((r.deny) ? 0.5 : 0)
- }).last().get('deny').value()
- } else if (filteredRights.length === 1 && filteredRights[0].deny === false) {
- isValid = true
- }
- // Deny by default
- return isValid
- }
- }
|