mirror of https://github.com/Budibase/budibase.git
4 changed files with 115 additions and 58 deletions
@ -0,0 +1,70 @@ |
|||||
|
const { |
||||
|
PermissionLevels, |
||||
|
PermissionTypes, |
||||
|
getBuiltinPermissionByID, |
||||
|
isPermissionLevelHigherThanRead, |
||||
|
} = require("../../utilities/security/permissions") |
||||
|
const { |
||||
|
lowerBuiltinRoleID, |
||||
|
BUILTIN_ROLES, |
||||
|
} = require("../../utilities/security/roles") |
||||
|
const { DocumentTypes } = require("../../db/utils") |
||||
|
|
||||
|
const CURRENTLY_SUPPORTED_LEVELS = [ |
||||
|
PermissionLevels.WRITE, |
||||
|
PermissionLevels.READ, |
||||
|
] |
||||
|
|
||||
|
exports.getPermissionType = resourceId => { |
||||
|
const docType = Object.values(DocumentTypes).filter(docType => |
||||
|
resourceId.startsWith(docType) |
||||
|
)[0] |
||||
|
switch (docType) { |
||||
|
case DocumentTypes.TABLE: |
||||
|
case DocumentTypes.ROW: |
||||
|
return PermissionTypes.TABLE |
||||
|
case DocumentTypes.AUTOMATION: |
||||
|
return PermissionTypes.AUTOMATION |
||||
|
case DocumentTypes.WEBHOOK: |
||||
|
return PermissionTypes.WEBHOOK |
||||
|
case DocumentTypes.QUERY: |
||||
|
case DocumentTypes.DATASOURCE: |
||||
|
return PermissionTypes.QUERY |
||||
|
default: |
||||
|
// views don't have an ID, will end up here
|
||||
|
return PermissionTypes.VIEW |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* works out the basic permissions based on builtin roles for a resource, using its ID |
||||
|
* @param resourceId |
||||
|
* @returns {{}} |
||||
|
*/ |
||||
|
exports.getBasePermissions = resourceId => { |
||||
|
const type = exports.getPermissionType(resourceId) |
||||
|
const permissions = {} |
||||
|
for (let [roleId, role] of Object.entries(BUILTIN_ROLES)) { |
||||
|
if (!role.permissionId) { |
||||
|
continue |
||||
|
} |
||||
|
const perms = getBuiltinPermissionByID(role.permissionId) |
||||
|
const typedPermission = perms.permissions.find(perm => perm.type === type) |
||||
|
if ( |
||||
|
typedPermission && |
||||
|
CURRENTLY_SUPPORTED_LEVELS.indexOf(typedPermission.level) !== -1 |
||||
|
) { |
||||
|
const level = typedPermission.level |
||||
|
permissions[level] = lowerBuiltinRoleID(permissions[level], roleId) |
||||
|
if (isPermissionLevelHigherThanRead(level)) { |
||||
|
permissions[PermissionLevels.READ] = lowerBuiltinRoleID( |
||||
|
permissions[PermissionLevels.READ], |
||||
|
roleId |
||||
|
) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return permissions |
||||
|
} |
||||
|
|
||||
|
exports.CURRENTLY_SUPPORTED_LEVELS = CURRENTLY_SUPPORTED_LEVELS |
||||
Loading…
Reference in new issue