@budibase/backend-core 2.9.40-alpha.6 → 2.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/dist/index.js +5 -4
  2. package/dist/index.js.map +2 -2
  3. package/dist/index.js.meta.json +1 -1
  4. package/dist/package.json +6 -6
  5. package/dist/src/cache/appMetadata.js +1 -1
  6. package/dist/src/cache/appMetadata.js.map +1 -1
  7. package/dist/src/constants/misc.d.ts +0 -2
  8. package/dist/src/constants/misc.js +0 -2
  9. package/dist/src/constants/misc.js.map +1 -1
  10. package/dist/src/environment.js +5 -4
  11. package/dist/src/environment.js.map +1 -1
  12. package/dist/src/logging/system.d.ts +1 -1
  13. package/dist/src/timers/timers.d.ts +1 -1
  14. package/package.json +6 -6
  15. package/src/accounts/accounts.ts +82 -0
  16. package/src/accounts/api.ts +59 -0
  17. package/src/accounts/index.ts +1 -0
  18. package/src/auth/auth.ts +208 -0
  19. package/src/auth/index.ts +1 -0
  20. package/src/auth/tests/auth.spec.ts +14 -0
  21. package/src/blacklist/blacklist.ts +54 -0
  22. package/src/blacklist/index.ts +1 -0
  23. package/src/blacklist/tests/blacklist.spec.ts +46 -0
  24. package/src/cache/appMetadata.ts +88 -0
  25. package/src/cache/base/index.ts +92 -0
  26. package/src/cache/generic.ts +30 -0
  27. package/src/cache/index.ts +5 -0
  28. package/src/cache/tests/writethrough.spec.ts +138 -0
  29. package/src/cache/user.ts +83 -0
  30. package/src/cache/writethrough.ts +133 -0
  31. package/src/configs/configs.ts +257 -0
  32. package/src/configs/index.ts +1 -0
  33. package/src/configs/tests/configs.spec.ts +184 -0
  34. package/src/constants/db.ts +63 -0
  35. package/src/constants/index.ts +2 -0
  36. package/src/constants/misc.ts +50 -0
  37. package/src/context/Context.ts +14 -0
  38. package/src/context/identity.ts +58 -0
  39. package/src/context/index.ts +3 -0
  40. package/src/context/mainContext.ts +310 -0
  41. package/src/context/tests/index.spec.ts +147 -0
  42. package/src/context/types.ts +11 -0
  43. package/src/db/Replication.ts +84 -0
  44. package/src/db/constants.ts +10 -0
  45. package/src/db/couch/DatabaseImpl.ts +238 -0
  46. package/src/db/couch/connections.ts +77 -0
  47. package/src/db/couch/index.ts +5 -0
  48. package/src/db/couch/pouchDB.ts +97 -0
  49. package/src/db/couch/pouchDump.ts +0 -0
  50. package/src/db/couch/utils.ts +50 -0
  51. package/src/db/db.ts +43 -0
  52. package/src/db/errors.ts +14 -0
  53. package/src/db/index.ts +12 -0
  54. package/src/db/lucene.ts +750 -0
  55. package/src/db/searchIndexes/index.ts +1 -0
  56. package/src/db/searchIndexes/searchIndexes.ts +62 -0
  57. package/src/db/tests/index.spec.js +25 -0
  58. package/src/db/tests/lucene.spec.ts +368 -0
  59. package/src/db/tests/pouch.spec.js +62 -0
  60. package/src/db/tests/utils.spec.ts +63 -0
  61. package/src/db/utils.ts +207 -0
  62. package/src/db/views.ts +241 -0
  63. package/src/docIds/conversions.ts +59 -0
  64. package/src/docIds/ids.ts +113 -0
  65. package/src/docIds/index.ts +2 -0
  66. package/src/docIds/newid.ts +5 -0
  67. package/src/docIds/params.ts +174 -0
  68. package/src/docUpdates/index.ts +29 -0
  69. package/src/environment.ts +201 -0
  70. package/src/errors/errors.ts +119 -0
  71. package/src/errors/index.ts +1 -0
  72. package/src/events/analytics.ts +6 -0
  73. package/src/events/asyncEvents/index.ts +2 -0
  74. package/src/events/asyncEvents/publisher.ts +12 -0
  75. package/src/events/asyncEvents/queue.ts +22 -0
  76. package/src/events/backfill.ts +183 -0
  77. package/src/events/documentId.ts +56 -0
  78. package/src/events/events.ts +40 -0
  79. package/src/events/identification.ts +310 -0
  80. package/src/events/index.ts +14 -0
  81. package/src/events/processors/AnalyticsProcessor.ts +64 -0
  82. package/src/events/processors/AuditLogsProcessor.ts +93 -0
  83. package/src/events/processors/LoggingProcessor.ts +37 -0
  84. package/src/events/processors/Processors.ts +52 -0
  85. package/src/events/processors/async/DocumentUpdateProcessor.ts +43 -0
  86. package/src/events/processors/index.ts +19 -0
  87. package/src/events/processors/posthog/PosthogProcessor.ts +118 -0
  88. package/src/events/processors/posthog/index.ts +2 -0
  89. package/src/events/processors/posthog/rateLimiting.ts +106 -0
  90. package/src/events/processors/posthog/tests/PosthogProcessor.spec.ts +168 -0
  91. package/src/events/processors/types.ts +1 -0
  92. package/src/events/publishers/account.ts +35 -0
  93. package/src/events/publishers/app.ts +155 -0
  94. package/src/events/publishers/auditLog.ts +26 -0
  95. package/src/events/publishers/auth.ts +73 -0
  96. package/src/events/publishers/automation.ts +110 -0
  97. package/src/events/publishers/backfill.ts +74 -0
  98. package/src/events/publishers/backup.ts +42 -0
  99. package/src/events/publishers/datasource.ts +48 -0
  100. package/src/events/publishers/email.ts +17 -0
  101. package/src/events/publishers/environmentVariable.ts +38 -0
  102. package/src/events/publishers/group.ts +99 -0
  103. package/src/events/publishers/index.ts +24 -0
  104. package/src/events/publishers/installation.ts +38 -0
  105. package/src/events/publishers/layout.ts +26 -0
  106. package/src/events/publishers/license.ts +84 -0
  107. package/src/events/publishers/org.ts +37 -0
  108. package/src/events/publishers/plugin.ts +47 -0
  109. package/src/events/publishers/query.ts +88 -0
  110. package/src/events/publishers/role.ts +62 -0
  111. package/src/events/publishers/rows.ts +29 -0
  112. package/src/events/publishers/screen.ts +36 -0
  113. package/src/events/publishers/serve.ts +43 -0
  114. package/src/events/publishers/table.ts +70 -0
  115. package/src/events/publishers/user.ts +202 -0
  116. package/src/events/publishers/view.ts +107 -0
  117. package/src/features/index.ts +78 -0
  118. package/src/features/installation.ts +17 -0
  119. package/src/features/tests/featureFlags.spec.ts +85 -0
  120. package/src/helpers.ts +9 -0
  121. package/src/index.ts +54 -0
  122. package/src/installation.ts +107 -0
  123. package/src/logging/alerts.ts +26 -0
  124. package/src/logging/correlation/correlation.ts +13 -0
  125. package/src/logging/correlation/index.ts +1 -0
  126. package/src/logging/correlation/middleware.ts +17 -0
  127. package/src/logging/index.ts +4 -0
  128. package/src/logging/pino/logger.ts +232 -0
  129. package/src/logging/pino/middleware.ts +45 -0
  130. package/src/logging/system.ts +81 -0
  131. package/src/logging/tests/system.spec.ts +61 -0
  132. package/src/middleware/adminOnly.ts +9 -0
  133. package/src/middleware/auditLog.ts +6 -0
  134. package/src/middleware/authenticated.ts +193 -0
  135. package/src/middleware/builderOnly.ts +21 -0
  136. package/src/middleware/builderOrAdmin.ts +21 -0
  137. package/src/middleware/csrf.ts +81 -0
  138. package/src/middleware/errorHandling.ts +29 -0
  139. package/src/middleware/index.ts +21 -0
  140. package/src/middleware/internalApi.ts +23 -0
  141. package/src/middleware/joi-validator.ts +45 -0
  142. package/src/middleware/matchers.ts +47 -0
  143. package/src/middleware/passport/datasource/google.ts +95 -0
  144. package/src/middleware/passport/local.ts +54 -0
  145. package/src/middleware/passport/sso/google.ts +77 -0
  146. package/src/middleware/passport/sso/oidc.ts +154 -0
  147. package/src/middleware/passport/sso/sso.ts +165 -0
  148. package/src/middleware/passport/sso/tests/google.spec.ts +67 -0
  149. package/src/middleware/passport/sso/tests/oidc.spec.ts +152 -0
  150. package/src/middleware/passport/sso/tests/sso.spec.ts +197 -0
  151. package/src/middleware/passport/utils.ts +38 -0
  152. package/src/middleware/querystringToBody.ts +28 -0
  153. package/src/middleware/tenancy.ts +36 -0
  154. package/src/middleware/tests/builder.spec.ts +180 -0
  155. package/src/middleware/tests/matchers.spec.ts +134 -0
  156. package/src/migrations/definitions.ts +40 -0
  157. package/src/migrations/index.ts +2 -0
  158. package/src/migrations/migrations.ts +191 -0
  159. package/src/migrations/tests/__snapshots__/migrations.spec.ts.snap +11 -0
  160. package/src/migrations/tests/migrations.spec.ts +64 -0
  161. package/src/objectStore/buckets/app.ts +40 -0
  162. package/src/objectStore/buckets/global.ts +29 -0
  163. package/src/objectStore/buckets/index.ts +3 -0
  164. package/src/objectStore/buckets/plugins.ts +71 -0
  165. package/src/objectStore/buckets/tests/app.spec.ts +171 -0
  166. package/src/objectStore/buckets/tests/global.spec.ts +74 -0
  167. package/src/objectStore/buckets/tests/plugins.spec.ts +111 -0
  168. package/src/objectStore/cloudfront.ts +41 -0
  169. package/src/objectStore/index.ts +3 -0
  170. package/src/objectStore/objectStore.ts +440 -0
  171. package/src/objectStore/utils.ts +27 -0
  172. package/src/platform/index.ts +3 -0
  173. package/src/platform/platformDb.ts +6 -0
  174. package/src/platform/tenants.ts +101 -0
  175. package/src/platform/tests/tenants.spec.ts +26 -0
  176. package/src/platform/users.ts +90 -0
  177. package/src/plugin/index.ts +1 -0
  178. package/src/plugin/tests/validation.spec.ts +83 -0
  179. package/src/plugin/utils.ts +156 -0
  180. package/src/queue/constants.ts +6 -0
  181. package/src/queue/inMemoryQueue.ts +141 -0
  182. package/src/queue/index.ts +2 -0
  183. package/src/queue/listeners.ts +195 -0
  184. package/src/queue/queue.ts +54 -0
  185. package/src/redis/index.ts +6 -0
  186. package/src/redis/init.ts +86 -0
  187. package/src/redis/redis.ts +308 -0
  188. package/src/redis/redlockImpl.ts +139 -0
  189. package/src/redis/utils.ts +117 -0
  190. package/src/security/encryption.ts +179 -0
  191. package/src/security/permissions.ts +158 -0
  192. package/src/security/roles.ts +389 -0
  193. package/src/security/sessions.ts +120 -0
  194. package/src/security/tests/encryption.spec.ts +31 -0
  195. package/src/security/tests/permissions.spec.ts +145 -0
  196. package/src/security/tests/sessions.spec.ts +12 -0
  197. package/src/tenancy/db.ts +6 -0
  198. package/src/tenancy/index.ts +2 -0
  199. package/src/tenancy/tenancy.ts +140 -0
  200. package/src/tenancy/tests/tenancy.spec.ts +184 -0
  201. package/src/timers/index.ts +1 -0
  202. package/src/timers/timers.ts +22 -0
  203. package/src/users/db.ts +484 -0
  204. package/src/users/events.ts +176 -0
  205. package/src/users/index.ts +4 -0
  206. package/src/users/lookup.ts +102 -0
  207. package/src/users/users.ts +276 -0
  208. package/src/users/utils.ts +55 -0
  209. package/src/utils/hashing.ts +14 -0
  210. package/src/utils/index.ts +3 -0
  211. package/src/utils/stringUtils.ts +8 -0
  212. package/src/utils/tests/utils.spec.ts +191 -0
  213. package/src/utils/utils.ts +239 -0
  214. package/tests/core/logging.ts +34 -0
  215. package/tests/core/utilities/index.ts +6 -0
  216. package/tests/core/utilities/jestUtils.ts +30 -0
  217. package/tests/core/utilities/mocks/alerts.ts +3 -0
  218. package/tests/core/utilities/mocks/date.ts +2 -0
  219. package/tests/core/utilities/mocks/events.ts +131 -0
  220. package/tests/core/utilities/mocks/fetch.ts +17 -0
  221. package/tests/core/utilities/mocks/index.ts +10 -0
  222. package/tests/core/utilities/mocks/licenses.ts +115 -0
  223. package/tests/core/utilities/mocks/posthog.ts +7 -0
  224. package/tests/core/utilities/structures/Chance.ts +20 -0
  225. package/tests/core/utilities/structures/accounts.ts +115 -0
  226. package/tests/core/utilities/structures/apps.ts +21 -0
  227. package/tests/core/utilities/structures/common.ts +7 -0
  228. package/tests/core/utilities/structures/db.ts +12 -0
  229. package/tests/core/utilities/structures/documents/index.ts +1 -0
  230. package/tests/core/utilities/structures/documents/platform/index.ts +1 -0
  231. package/tests/core/utilities/structures/documents/platform/installation.ts +12 -0
  232. package/tests/core/utilities/structures/generator.ts +2 -0
  233. package/tests/core/utilities/structures/index.ts +15 -0
  234. package/tests/core/utilities/structures/koa.ts +16 -0
  235. package/tests/core/utilities/structures/licenses.ts +167 -0
  236. package/tests/core/utilities/structures/plugins.ts +19 -0
  237. package/tests/core/utilities/structures/quotas.ts +67 -0
  238. package/tests/core/utilities/structures/scim.ts +80 -0
  239. package/tests/core/utilities/structures/shared.ts +19 -0
  240. package/tests/core/utilities/structures/sso.ts +119 -0
  241. package/tests/core/utilities/structures/tenants.ts +5 -0
  242. package/tests/core/utilities/structures/userGroups.ts +10 -0
  243. package/tests/core/utilities/structures/users.ts +73 -0
  244. package/tests/core/utilities/testContainerUtils.ts +85 -0
  245. package/tests/core/utilities/utils/index.ts +1 -0
  246. package/tests/core/utilities/utils/time.ts +3 -0
  247. package/tests/extra/DBTestConfiguration.ts +36 -0
  248. package/tests/extra/index.ts +2 -0
  249. package/tests/extra/testEnv.ts +95 -0
  250. package/tests/index.ts +1 -0
  251. package/tests/jestEnv.ts +6 -0
  252. package/tests/jestSetup.ts +28 -0
@@ -0,0 +1,179 @@
1
+ import crypto from "crypto"
2
+ import fs from "fs"
3
+ import zlib from "zlib"
4
+ import env from "../environment"
5
+ import { join } from "path"
6
+
7
+ const ALGO = "aes-256-ctr"
8
+ const SEPARATOR = "-"
9
+ const ITERATIONS = 10000
10
+ const STRETCH_LENGTH = 32
11
+
12
+ const SALT_LENGTH = 16
13
+ const IV_LENGTH = 16
14
+
15
+ export enum SecretOption {
16
+ API = "api",
17
+ ENCRYPTION = "encryption",
18
+ }
19
+
20
+ export function getSecret(secretOption: SecretOption): string {
21
+ let secret, secretName
22
+ switch (secretOption) {
23
+ case SecretOption.ENCRYPTION:
24
+ secret = env.ENCRYPTION_KEY
25
+ secretName = "ENCRYPTION_KEY"
26
+ break
27
+ case SecretOption.API:
28
+ default:
29
+ secret = env.API_ENCRYPTION_KEY
30
+ secretName = "API_ENCRYPTION_KEY"
31
+ break
32
+ }
33
+ if (!secret) {
34
+ throw new Error(`Secret "${secretName}" has not been set in environment.`)
35
+ }
36
+ return secret
37
+ }
38
+
39
+ function stretchString(secret: string, salt: Buffer) {
40
+ return crypto.pbkdf2Sync(secret, salt, ITERATIONS, STRETCH_LENGTH, "sha512")
41
+ }
42
+
43
+ export function encrypt(
44
+ input: string,
45
+ secretOption: SecretOption = SecretOption.API
46
+ ) {
47
+ const salt = crypto.randomBytes(SALT_LENGTH)
48
+ const stretched = stretchString(getSecret(secretOption), salt)
49
+ const cipher = crypto.createCipheriv(ALGO, stretched, salt)
50
+ const base = cipher.update(input)
51
+ const final = cipher.final()
52
+ const encrypted = Buffer.concat([base, final]).toString("hex")
53
+ return `${salt.toString("hex")}${SEPARATOR}${encrypted}`
54
+ }
55
+
56
+ export function decrypt(
57
+ input: string,
58
+ secretOption: SecretOption = SecretOption.API
59
+ ) {
60
+ const [salt, encrypted] = input.split(SEPARATOR)
61
+ const saltBuffer = Buffer.from(salt, "hex")
62
+ const stretched = stretchString(getSecret(secretOption), saltBuffer)
63
+ const decipher = crypto.createDecipheriv(ALGO, stretched, saltBuffer)
64
+ const base = decipher.update(Buffer.from(encrypted, "hex"))
65
+ const final = decipher.final()
66
+ return Buffer.concat([base, final]).toString()
67
+ }
68
+
69
+ export async function encryptFile(
70
+ { dir, filename }: { dir: string; filename: string },
71
+ secret: string
72
+ ) {
73
+ const outputFileName = `${filename}.enc`
74
+
75
+ const filePath = join(dir, filename)
76
+ const inputFile = fs.createReadStream(filePath)
77
+ const outputFile = fs.createWriteStream(join(dir, outputFileName))
78
+
79
+ const salt = crypto.randomBytes(SALT_LENGTH)
80
+ const iv = crypto.randomBytes(IV_LENGTH)
81
+ const stretched = stretchString(secret, salt)
82
+ const cipher = crypto.createCipheriv(ALGO, stretched, iv)
83
+
84
+ outputFile.write(salt)
85
+ outputFile.write(iv)
86
+
87
+ inputFile.pipe(zlib.createGzip()).pipe(cipher).pipe(outputFile)
88
+
89
+ return new Promise<{ filename: string; dir: string }>(r => {
90
+ outputFile.on("finish", () => {
91
+ r({
92
+ filename: outputFileName,
93
+ dir,
94
+ })
95
+ })
96
+ })
97
+ }
98
+
99
+ async function getSaltAndIV(path: string) {
100
+ const fileStream = fs.createReadStream(path)
101
+
102
+ const salt = await readBytes(fileStream, SALT_LENGTH)
103
+ const iv = await readBytes(fileStream, IV_LENGTH)
104
+ fileStream.close()
105
+ return { salt, iv }
106
+ }
107
+
108
+ export async function decryptFile(
109
+ inputPath: string,
110
+ outputPath: string,
111
+ secret: string
112
+ ) {
113
+ const { salt, iv } = await getSaltAndIV(inputPath)
114
+ const inputFile = fs.createReadStream(inputPath, {
115
+ start: SALT_LENGTH + IV_LENGTH,
116
+ })
117
+
118
+ const outputFile = fs.createWriteStream(outputPath)
119
+
120
+ const stretched = stretchString(secret, salt)
121
+ const decipher = crypto.createDecipheriv(ALGO, stretched, iv)
122
+
123
+ const unzip = zlib.createGunzip()
124
+
125
+ inputFile.pipe(decipher).pipe(unzip).pipe(outputFile)
126
+
127
+ return new Promise<void>((res, rej) => {
128
+ outputFile.on("finish", () => {
129
+ outputFile.close()
130
+ res()
131
+ })
132
+
133
+ inputFile.on("error", e => {
134
+ outputFile.close()
135
+ rej(e)
136
+ })
137
+
138
+ decipher.on("error", e => {
139
+ outputFile.close()
140
+ rej(e)
141
+ })
142
+
143
+ unzip.on("error", e => {
144
+ outputFile.close()
145
+ rej(e)
146
+ })
147
+
148
+ outputFile.on("error", e => {
149
+ outputFile.close()
150
+ rej(e)
151
+ })
152
+ })
153
+ }
154
+
155
+ function readBytes(stream: fs.ReadStream, length: number) {
156
+ return new Promise<Buffer>((resolve, reject) => {
157
+ let bytesRead = 0
158
+ const data: Buffer[] = []
159
+
160
+ stream.on("readable", () => {
161
+ let chunk
162
+
163
+ while ((chunk = stream.read(length - bytesRead)) !== null) {
164
+ data.push(chunk)
165
+ bytesRead += chunk.length
166
+ }
167
+
168
+ resolve(Buffer.concat(data))
169
+ })
170
+
171
+ stream.on("end", () => {
172
+ reject(new Error("Insufficient data in the stream."))
173
+ })
174
+
175
+ stream.on("error", error => {
176
+ reject(error)
177
+ })
178
+ })
179
+ }
@@ -0,0 +1,158 @@
1
+ import { PermissionType, PermissionLevel } from "@budibase/types"
2
+ export { PermissionType, PermissionLevel } from "@budibase/types"
3
+ import flatten from "lodash/flatten"
4
+ import cloneDeep from "lodash/fp/cloneDeep"
5
+
6
+ export type RoleHierarchy = {
7
+ permissionId: string
8
+ }[]
9
+
10
+ export class Permission {
11
+ type: PermissionType
12
+ level: PermissionLevel
13
+
14
+ constructor(type: PermissionType, level: PermissionLevel) {
15
+ this.type = type
16
+ this.level = level
17
+ }
18
+ }
19
+
20
+ export function levelToNumber(perm: PermissionLevel) {
21
+ switch (perm) {
22
+ // not everything has execute privileges
23
+ case PermissionLevel.EXECUTE:
24
+ return 0
25
+ case PermissionLevel.READ:
26
+ return 1
27
+ case PermissionLevel.WRITE:
28
+ return 2
29
+ case PermissionLevel.ADMIN:
30
+ return 3
31
+ default:
32
+ return -1
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Given the specified permission level for the user return the levels they are allowed to carry out.
38
+ * @param {string} userPermLevel The permission level of the user.
39
+ * @return {string[]} All the permission levels this user is allowed to carry out.
40
+ */
41
+ export function getAllowedLevels(userPermLevel: PermissionLevel): string[] {
42
+ switch (userPermLevel) {
43
+ case PermissionLevel.EXECUTE:
44
+ return [PermissionLevel.EXECUTE]
45
+ case PermissionLevel.READ:
46
+ return [PermissionLevel.EXECUTE, PermissionLevel.READ]
47
+ case PermissionLevel.WRITE:
48
+ case PermissionLevel.ADMIN:
49
+ return [
50
+ PermissionLevel.EXECUTE,
51
+ PermissionLevel.READ,
52
+ PermissionLevel.WRITE,
53
+ ]
54
+ default:
55
+ return []
56
+ }
57
+ }
58
+
59
+ export enum BuiltinPermissionID {
60
+ PUBLIC = "public",
61
+ READ_ONLY = "read_only",
62
+ WRITE = "write",
63
+ ADMIN = "admin",
64
+ POWER = "power",
65
+ }
66
+
67
+ export const BUILTIN_PERMISSIONS = {
68
+ PUBLIC: {
69
+ _id: BuiltinPermissionID.PUBLIC,
70
+ name: "Public",
71
+ permissions: [
72
+ new Permission(PermissionType.WEBHOOK, PermissionLevel.EXECUTE),
73
+ ],
74
+ },
75
+ READ_ONLY: {
76
+ _id: BuiltinPermissionID.READ_ONLY,
77
+ name: "Read only",
78
+ permissions: [
79
+ new Permission(PermissionType.QUERY, PermissionLevel.READ),
80
+ new Permission(PermissionType.TABLE, PermissionLevel.READ),
81
+ ],
82
+ },
83
+ WRITE: {
84
+ _id: BuiltinPermissionID.WRITE,
85
+ name: "Read/Write",
86
+ permissions: [
87
+ new Permission(PermissionType.QUERY, PermissionLevel.WRITE),
88
+ new Permission(PermissionType.TABLE, PermissionLevel.WRITE),
89
+ new Permission(PermissionType.AUTOMATION, PermissionLevel.EXECUTE),
90
+ new Permission(PermissionType.LEGACY_VIEW, PermissionLevel.READ),
91
+ ],
92
+ },
93
+ POWER: {
94
+ _id: BuiltinPermissionID.POWER,
95
+ name: "Power",
96
+ permissions: [
97
+ new Permission(PermissionType.TABLE, PermissionLevel.WRITE),
98
+ new Permission(PermissionType.USER, PermissionLevel.READ),
99
+ new Permission(PermissionType.AUTOMATION, PermissionLevel.EXECUTE),
100
+ new Permission(PermissionType.WEBHOOK, PermissionLevel.READ),
101
+ new Permission(PermissionType.LEGACY_VIEW, PermissionLevel.READ),
102
+ ],
103
+ },
104
+ ADMIN: {
105
+ _id: BuiltinPermissionID.ADMIN,
106
+ name: "Admin",
107
+ permissions: [
108
+ new Permission(PermissionType.TABLE, PermissionLevel.ADMIN),
109
+ new Permission(PermissionType.USER, PermissionLevel.ADMIN),
110
+ new Permission(PermissionType.AUTOMATION, PermissionLevel.ADMIN),
111
+ new Permission(PermissionType.WEBHOOK, PermissionLevel.READ),
112
+ new Permission(PermissionType.QUERY, PermissionLevel.ADMIN),
113
+ new Permission(PermissionType.LEGACY_VIEW, PermissionLevel.READ),
114
+ ],
115
+ },
116
+ }
117
+
118
+ export function getBuiltinPermissions() {
119
+ return cloneDeep(BUILTIN_PERMISSIONS)
120
+ }
121
+
122
+ export function getBuiltinPermissionByID(id: string) {
123
+ const perms = Object.values(BUILTIN_PERMISSIONS)
124
+ return perms.find(perm => perm._id === id)
125
+ }
126
+
127
+ export function doesHaveBasePermission(
128
+ permType: PermissionType,
129
+ permLevel: PermissionLevel,
130
+ rolesHierarchy: RoleHierarchy
131
+ ) {
132
+ const basePermissions = [
133
+ ...new Set(rolesHierarchy.map(role => role.permissionId)),
134
+ ]
135
+ const builtins = Object.values(BUILTIN_PERMISSIONS)
136
+ let permissions = flatten(
137
+ builtins
138
+ .filter(builtin => basePermissions.indexOf(builtin._id) !== -1)
139
+ .map(builtin => builtin.permissions)
140
+ )
141
+ for (let permission of permissions) {
142
+ if (
143
+ permission.type === permType &&
144
+ getAllowedLevels(permission.level).indexOf(permLevel) !== -1
145
+ ) {
146
+ return true
147
+ }
148
+ }
149
+ return false
150
+ }
151
+
152
+ export function isPermissionLevelHigherThanRead(level: PermissionLevel) {
153
+ return levelToNumber(level) > 1
154
+ }
155
+
156
+ // utility as a lot of things need simply the builder permission
157
+ export const BUILDER = PermissionType.BUILDER
158
+ export const GLOBAL_BUILDER = PermissionType.GLOBAL_BUILDER