2023-09-27 15:21:25 +02:00
|
|
|
import { PermissionLevel, PermissionType } from "@budibase/types"
|
2023-07-25 12:45:19 +02:00
|
|
|
import flatten from "lodash/flatten"
|
|
|
|
import cloneDeep from "lodash/fp/cloneDeep"
|
2020-11-11 18:34:15 +01:00
|
|
|
|
2023-09-27 15:21:25 +02:00
|
|
|
export { PermissionType, PermissionLevel } from "@budibase/types"
|
|
|
|
|
2022-11-17 15:47:52 +01:00
|
|
|
export type RoleHierarchy = {
|
|
|
|
permissionId: string
|
|
|
|
}[]
|
|
|
|
|
2023-04-14 13:16:01 +02:00
|
|
|
export class Permission {
|
2022-11-17 15:59:18 +01:00
|
|
|
type: PermissionType
|
|
|
|
level: PermissionLevel
|
2022-11-17 15:47:52 +01:00
|
|
|
|
2022-11-17 15:59:18 +01:00
|
|
|
constructor(type: PermissionType, level: PermissionLevel) {
|
2022-11-17 15:47:52 +01:00
|
|
|
this.type = type
|
|
|
|
this.level = level
|
|
|
|
}
|
2020-11-11 18:34:15 +01:00
|
|
|
}
|
|
|
|
|
2023-04-14 11:25:38 +02:00
|
|
|
export function levelToNumber(perm: PermissionLevel) {
|
2021-02-11 14:29:15 +01:00
|
|
|
switch (perm) {
|
|
|
|
// not everything has execute privileges
|
2022-11-17 15:59:18 +01:00
|
|
|
case PermissionLevel.EXECUTE:
|
2021-02-11 14:29:15 +01:00
|
|
|
return 0
|
2022-11-17 15:59:18 +01:00
|
|
|
case PermissionLevel.READ:
|
2021-02-11 14:29:15 +01:00
|
|
|
return 1
|
2022-11-17 15:59:18 +01:00
|
|
|
case PermissionLevel.WRITE:
|
2021-02-11 14:29:15 +01:00
|
|
|
return 2
|
2022-11-17 15:59:18 +01:00
|
|
|
case PermissionLevel.ADMIN:
|
2021-02-11 14:29:15 +01:00
|
|
|
return 3
|
|
|
|
default:
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-11 18:34:15 +01:00
|
|
|
/**
|
|
|
|
* Given the specified permission level for the user return the levels they are allowed to carry out.
|
2023-10-17 17:46:32 +02:00
|
|
|
* @param userPermLevel The permission level of the user.
|
|
|
|
* @return All the permission levels this user is allowed to carry out.
|
2020-11-11 18:34:15 +01:00
|
|
|
*/
|
2023-04-14 12:39:36 +02:00
|
|
|
export function getAllowedLevels(userPermLevel: PermissionLevel): string[] {
|
2020-11-11 18:34:15 +01:00
|
|
|
switch (userPermLevel) {
|
2022-11-17 15:59:18 +01:00
|
|
|
case PermissionLevel.EXECUTE:
|
|
|
|
return [PermissionLevel.EXECUTE]
|
|
|
|
case PermissionLevel.READ:
|
|
|
|
return [PermissionLevel.EXECUTE, PermissionLevel.READ]
|
|
|
|
case PermissionLevel.WRITE:
|
|
|
|
case PermissionLevel.ADMIN:
|
2020-11-11 18:34:15 +01:00
|
|
|
return [
|
2023-04-14 12:39:36 +02:00
|
|
|
PermissionLevel.EXECUTE,
|
2022-11-17 15:59:18 +01:00
|
|
|
PermissionLevel.READ,
|
|
|
|
PermissionLevel.WRITE,
|
2020-11-11 18:34:15 +01:00
|
|
|
]
|
|
|
|
default:
|
|
|
|
return []
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-17 15:59:18 +01:00
|
|
|
export enum BuiltinPermissionID {
|
2022-11-17 15:47:52 +01:00
|
|
|
PUBLIC = "public",
|
|
|
|
READ_ONLY = "read_only",
|
|
|
|
WRITE = "write",
|
|
|
|
ADMIN = "admin",
|
|
|
|
POWER = "power",
|
2020-11-11 18:34:15 +01:00
|
|
|
}
|
|
|
|
|
2023-04-14 13:16:01 +02:00
|
|
|
export const BUILTIN_PERMISSIONS = {
|
2021-02-11 19:13:09 +01:00
|
|
|
PUBLIC: {
|
2022-11-17 15:59:18 +01:00
|
|
|
_id: BuiltinPermissionID.PUBLIC,
|
2021-02-11 19:13:09 +01:00
|
|
|
name: "Public",
|
|
|
|
permissions: [
|
2022-11-17 15:59:18 +01:00
|
|
|
new Permission(PermissionType.WEBHOOK, PermissionLevel.EXECUTE),
|
2021-02-11 19:13:09 +01:00
|
|
|
],
|
|
|
|
},
|
2020-11-11 18:34:15 +01:00
|
|
|
READ_ONLY: {
|
2022-11-17 15:59:18 +01:00
|
|
|
_id: BuiltinPermissionID.READ_ONLY,
|
2020-12-02 18:08:25 +01:00
|
|
|
name: "Read only",
|
2020-11-11 18:34:15 +01:00
|
|
|
permissions: [
|
2022-11-17 15:59:18 +01:00
|
|
|
new Permission(PermissionType.QUERY, PermissionLevel.READ),
|
|
|
|
new Permission(PermissionType.TABLE, PermissionLevel.READ),
|
2023-09-27 15:21:25 +02:00
|
|
|
new Permission(PermissionType.APP, PermissionLevel.READ),
|
2020-11-11 18:34:15 +01:00
|
|
|
],
|
|
|
|
},
|
|
|
|
WRITE: {
|
2022-11-17 15:59:18 +01:00
|
|
|
_id: BuiltinPermissionID.WRITE,
|
2020-12-02 18:08:25 +01:00
|
|
|
name: "Read/Write",
|
2020-11-11 18:34:15 +01:00
|
|
|
permissions: [
|
2022-11-17 15:59:18 +01:00
|
|
|
new Permission(PermissionType.QUERY, PermissionLevel.WRITE),
|
|
|
|
new Permission(PermissionType.TABLE, PermissionLevel.WRITE),
|
|
|
|
new Permission(PermissionType.AUTOMATION, PermissionLevel.EXECUTE),
|
2023-09-04 12:00:58 +02:00
|
|
|
new Permission(PermissionType.LEGACY_VIEW, PermissionLevel.READ),
|
2023-09-27 15:21:25 +02:00
|
|
|
new Permission(PermissionType.APP, PermissionLevel.READ),
|
2020-11-11 18:34:15 +01:00
|
|
|
],
|
|
|
|
},
|
2020-11-12 18:06:55 +01:00
|
|
|
POWER: {
|
2022-11-17 15:59:18 +01:00
|
|
|
_id: BuiltinPermissionID.POWER,
|
2020-12-02 18:08:25 +01:00
|
|
|
name: "Power",
|
2020-11-12 18:06:55 +01:00
|
|
|
permissions: [
|
2022-11-17 15:59:18 +01:00
|
|
|
new Permission(PermissionType.TABLE, PermissionLevel.WRITE),
|
|
|
|
new Permission(PermissionType.USER, PermissionLevel.READ),
|
|
|
|
new Permission(PermissionType.AUTOMATION, PermissionLevel.EXECUTE),
|
|
|
|
new Permission(PermissionType.WEBHOOK, PermissionLevel.READ),
|
2023-09-04 12:00:58 +02:00
|
|
|
new Permission(PermissionType.LEGACY_VIEW, PermissionLevel.READ),
|
2023-09-27 15:21:25 +02:00
|
|
|
new Permission(PermissionType.APP, PermissionLevel.READ),
|
2020-11-12 18:06:55 +01:00
|
|
|
],
|
|
|
|
},
|
|
|
|
ADMIN: {
|
2022-11-17 15:59:18 +01:00
|
|
|
_id: BuiltinPermissionID.ADMIN,
|
2020-12-02 18:08:25 +01:00
|
|
|
name: "Admin",
|
2020-11-12 18:06:55 +01:00
|
|
|
permissions: [
|
2022-11-17 15:59:18 +01:00
|
|
|
new Permission(PermissionType.TABLE, PermissionLevel.ADMIN),
|
|
|
|
new Permission(PermissionType.USER, PermissionLevel.ADMIN),
|
|
|
|
new Permission(PermissionType.AUTOMATION, PermissionLevel.ADMIN),
|
|
|
|
new Permission(PermissionType.WEBHOOK, PermissionLevel.READ),
|
|
|
|
new Permission(PermissionType.QUERY, PermissionLevel.ADMIN),
|
2023-09-04 12:00:58 +02:00
|
|
|
new Permission(PermissionType.LEGACY_VIEW, PermissionLevel.READ),
|
2023-09-27 15:21:25 +02:00
|
|
|
new Permission(PermissionType.APP, PermissionLevel.READ),
|
2020-11-12 18:06:55 +01:00
|
|
|
],
|
|
|
|
},
|
2020-11-11 18:34:15 +01:00
|
|
|
}
|
|
|
|
|
2022-11-17 15:47:52 +01:00
|
|
|
export function getBuiltinPermissions() {
|
2021-02-12 21:34:54 +01:00
|
|
|
return cloneDeep(BUILTIN_PERMISSIONS)
|
|
|
|
}
|
|
|
|
|
2022-11-17 15:47:52 +01:00
|
|
|
export function getBuiltinPermissionByID(id: string) {
|
2021-02-12 21:34:54 +01:00
|
|
|
const perms = Object.values(BUILTIN_PERMISSIONS)
|
2021-05-04 12:32:22 +02:00
|
|
|
return perms.find(perm => perm._id === id)
|
2021-02-11 11:24:37 +01:00
|
|
|
}
|
|
|
|
|
2022-11-17 15:47:52 +01:00
|
|
|
export function doesHaveBasePermission(
|
2022-11-17 15:59:18 +01:00
|
|
|
permType: PermissionType,
|
|
|
|
permLevel: PermissionLevel,
|
2022-11-17 15:47:52 +01:00
|
|
|
rolesHierarchy: RoleHierarchy
|
|
|
|
) {
|
2021-11-15 14:48:26 +01:00
|
|
|
const basePermissions = [
|
|
|
|
...new Set(rolesHierarchy.map(role => role.permissionId)),
|
|
|
|
]
|
2021-02-12 21:34:54 +01:00
|
|
|
const builtins = Object.values(BUILTIN_PERMISSIONS)
|
2020-11-11 18:34:15 +01:00
|
|
|
let permissions = flatten(
|
|
|
|
builtins
|
2021-11-15 14:48:26 +01:00
|
|
|
.filter(builtin => basePermissions.indexOf(builtin._id) !== -1)
|
2021-05-04 12:32:22 +02:00
|
|
|
.map(builtin => builtin.permissions)
|
2020-11-11 18:34:15 +01:00
|
|
|
)
|
|
|
|
for (let permission of permissions) {
|
|
|
|
if (
|
|
|
|
permission.type === permType &&
|
|
|
|
getAllowedLevels(permission.level).indexOf(permLevel) !== -1
|
|
|
|
) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2022-11-17 15:59:18 +01:00
|
|
|
export function isPermissionLevelHigherThanRead(level: PermissionLevel) {
|
2021-02-11 14:29:15 +01:00
|
|
|
return levelToNumber(level) > 1
|
2021-02-08 18:22:07 +01:00
|
|
|
}
|
|
|
|
|
2020-11-11 18:34:15 +01:00
|
|
|
// utility as a lot of things need simply the builder permission
|
2022-11-17 15:59:18 +01:00
|
|
|
export const BUILDER = PermissionType.BUILDER
|
2023-11-23 17:22:16 +01:00
|
|
|
export const CREATOR = PermissionType.CREATOR
|
2023-07-26 18:32:21 +02:00
|
|
|
export const GLOBAL_BUILDER = PermissionType.GLOBAL_BUILDER
|