@budibase/server 0.9.185 → 0.9.189

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 (174) hide show
  1. package/LICENSE +1 -1
  2. package/builder/assets/{index.b48e3580.js → index.5cc4c0d0.js} +1 -1
  3. package/builder/index.html +1 -1
  4. package/coverage/clover.xml +141 -121
  5. package/coverage/coverage-final.json +6 -6
  6. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/application.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/hosting.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +1 -1
  18. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +11 -8
  26. package/coverage/lcov-report/api/controllers/row/index.html +13 -13
  27. package/coverage/lcov-report/api/controllers/row/index.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/utils.js.html +4 -4
  36. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/exporters.js.html +19 -4
  39. package/coverage/lcov-report/api/controllers/view/index.html +17 -17
  40. package/coverage/lcov-report/api/controllers/view/index.js.html +49 -10
  41. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  44. package/coverage/lcov-report/api/index.html +1 -1
  45. package/coverage/lcov-report/api/index.js.html +1 -1
  46. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/index.html +1 -1
  59. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/static.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  76. package/coverage/lcov-report/automations/actions.js.html +1 -1
  77. package/coverage/lcov-report/automations/automationUtils.js.html +35 -8
  78. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  79. package/coverage/lcov-report/automations/index.html +15 -15
  80. package/coverage/lcov-report/automations/index.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/index.html +1 -1
  90. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  99. package/coverage/lcov-report/automations/thread.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  109. package/coverage/lcov-report/automations/utils.js.html +1 -1
  110. package/coverage/lcov-report/constants/index.html +1 -1
  111. package/coverage/lcov-report/constants/index.js.html +1 -1
  112. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  113. package/coverage/lcov-report/constants/screens.js.html +1 -1
  114. package/coverage/lcov-report/db/client.js.html +1 -1
  115. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  116. package/coverage/lcov-report/db/index.html +1 -1
  117. package/coverage/lcov-report/db/index.js.html +1 -1
  118. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  119. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  120. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  121. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  122. package/coverage/lcov-report/db/newid.js.html +1 -1
  123. package/coverage/lcov-report/db/utils.js.html +1 -1
  124. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  125. package/coverage/lcov-report/events/index.html +1 -1
  126. package/coverage/lcov-report/events/index.js.html +1 -1
  127. package/coverage/lcov-report/events/utils.js.html +1 -1
  128. package/coverage/lcov-report/index.html +40 -40
  129. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  130. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  131. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  132. package/coverage/lcov-report/middleware/authorized.js.html +52 -31
  133. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  134. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  135. package/coverage/lcov-report/middleware/index.html +13 -13
  136. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  137. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  138. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  139. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  140. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  141. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  142. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  143. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  144. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  145. package/coverage/lcov-report/utilities/global.js.html +1 -1
  146. package/coverage/lcov-report/utilities/index.html +1 -1
  147. package/coverage/lcov-report/utilities/index.js.html +1 -1
  148. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  149. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  150. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  151. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  152. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  153. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  154. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  155. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  156. package/coverage/lcov-report/utilities/security.js.html +1 -1
  157. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  158. package/coverage/lcov-report/utilities/users.js.html +1 -1
  159. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  160. package/coverage/lcov.info +234 -193
  161. package/dist/api/controllers/row/external.js +2 -1
  162. package/dist/api/controllers/view/exporters.js +4 -0
  163. package/dist/api/controllers/view/index.js +14 -2
  164. package/dist/automations/automationUtils.js +7 -0
  165. package/dist/middleware/authorized.js +20 -10
  166. package/dist/package.json +6 -6
  167. package/dist/tsconfig.tsbuildinfo +1 -1
  168. package/package.json +7 -7
  169. package/src/api/controllers/row/external.js +2 -1
  170. package/src/api/controllers/view/exporters.js +5 -0
  171. package/src/api/controllers/view/index.js +15 -2
  172. package/src/automations/automationUtils.js +9 -0
  173. package/src/middleware/authorized.js +24 -17
  174. package/src/middleware/tests/authorized.spec.js +2 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "0.9.185",
4
+ "version": "0.9.189",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.js",
7
7
  "repository": {
@@ -14,7 +14,7 @@
14
14
  "test": "jest --coverage --maxWorkers=2",
15
15
  "test:watch": "jest --watch",
16
16
  "predocker": "copyfiles -f ../client/dist/budibase-client.js ../client/manifest.json client",
17
- "build:docker": "yarn run predocker && docker build . -t app-service",
17
+ "build:docker": "yarn run predocker && docker build . -t app-service --label version=$BUDIBASE_RELEASE_VERSION",
18
18
  "run:docker": "node dist/index.js",
19
19
  "dev:stack:up": "node scripts/dev/manage.js up",
20
20
  "dev:stack:down": "node scripts/dev/manage.js down",
@@ -66,11 +66,11 @@
66
66
  "budibase"
67
67
  ],
68
68
  "author": "Budibase",
69
- "license": "AGPL-3.0-or-later",
69
+ "license": "GPL-3.0",
70
70
  "dependencies": {
71
- "@budibase/auth": "^0.9.185",
72
- "@budibase/client": "^0.9.185",
73
- "@budibase/string-templates": "^0.9.185",
71
+ "@budibase/auth": "^0.9.189",
72
+ "@budibase/client": "^0.9.189",
73
+ "@budibase/string-templates": "^0.9.189",
74
74
  "@elastic/elasticsearch": "7.10.0",
75
75
  "@koa/router": "8.0.0",
76
76
  "@sendgrid/mail": "7.1.1",
@@ -149,5 +149,5 @@
149
149
  "typescript": "^4.3.5",
150
150
  "update-dotenv": "^1.1.1"
151
151
  },
152
- "gitHead": "d1714b7f9a70d509453c203774b61d26b079ced5"
152
+ "gitHead": "c71eab23f0e7c098da073a5765980b4b96f7fa13"
153
153
  }
@@ -55,7 +55,8 @@ exports.save = async ctx => {
55
55
  exports.fetchView = async ctx => {
56
56
  // there are no views in external data sources, shouldn't ever be called
57
57
  // for now just fetch
58
- ctx.params.tableId = ctx.params.viewName.split("all_")[1]
58
+ const split = ctx.params.viewName.split("all_")
59
+ ctx.params.tableId = split[1] ? split[1] : split[0]
59
60
  return exports.fetch(ctx)
60
61
  }
61
62
 
@@ -16,3 +16,8 @@ exports.csv = function (headers, rows) {
16
16
  exports.json = function (headers, rows) {
17
17
  return JSON.stringify(rows, undefined, 2)
18
18
  }
19
+
20
+ exports.ExportFormats = {
21
+ CSV: "csv",
22
+ JSON: "json",
23
+ }
@@ -4,6 +4,7 @@ const { apiFileReturn } = require("../../../utilities/fileSystem")
4
4
  const exporters = require("./exporters")
5
5
  const { saveView, getView, getViews, deleteView } = require("./utils")
6
6
  const { fetchView } = require("../row")
7
+ const { getTable } = require("../table/utils")
7
8
 
8
9
  exports.fetch = async ctx => {
9
10
  const db = new CouchDB(ctx.appId)
@@ -56,7 +57,7 @@ exports.exportView = async ctx => {
56
57
  const view = await getView(db, viewName)
57
58
 
58
59
  const format = ctx.query.format
59
- if (!format) {
60
+ if (!format || !Object.values(exporters.ExportFormats).includes(format)) {
60
61
  ctx.throw(400, "Format must be specified, either csv or json")
61
62
  }
62
63
 
@@ -80,10 +81,22 @@ exports.exportView = async ctx => {
80
81
  let schema = view && view.meta && view.meta.schema
81
82
  if (!schema) {
82
83
  const tableId = ctx.params.tableId || view.meta.tableId
83
- const table = await db.get(tableId)
84
+ const table = await getTable(ctx.appId, tableId)
84
85
  schema = table.schema
85
86
  }
86
87
 
88
+ // make sure no "undefined" entries appear in the CSV
89
+ if (format === exporters.ExportFormats.CSV) {
90
+ const schemaKeys = Object.keys(schema)
91
+ for (let key of schemaKeys) {
92
+ for (let row of ctx.body) {
93
+ if (row[key] == null) {
94
+ row[key] = ""
95
+ }
96
+ }
97
+ }
98
+ }
99
+
87
100
  // Export part
88
101
  let headers = Object.keys(schema)
89
102
  const exporter = exporters[format]
@@ -64,5 +64,14 @@ exports.cleanUpRow = async (appId, tableId, row) => {
64
64
  }
65
65
 
66
66
  exports.getError = err => {
67
+ if (err == null) {
68
+ return "No error provided."
69
+ }
70
+ if (
71
+ typeof err === "object" &&
72
+ (err.toString == null || err.toString() === "[object Object]")
73
+ ) {
74
+ return JSON.stringify(err)
75
+ }
67
76
  return typeof err !== "string" ? err.toString() : err
68
77
  }
@@ -1,7 +1,10 @@
1
- const { getUserPermissions } = require("@budibase/auth/roles")
1
+ const {
2
+ getUserRoleHierarchy,
3
+ getRequiredResourceRole,
4
+ BUILTIN_ROLE_IDS,
5
+ } = require("@budibase/auth/roles")
2
6
  const {
3
7
  PermissionTypes,
4
- doesHaveResourcePermission,
5
8
  doesHaveBasePermission,
6
9
  } = require("@budibase/auth/permissions")
7
10
  const builderMiddleware = require("./builder")
@@ -28,13 +31,7 @@ module.exports =
28
31
  await builderMiddleware(ctx, permType)
29
32
 
30
33
  const isAuthed = ctx.isAuthenticated
31
- const { basePermissions, permissions } = await getUserPermissions(
32
- ctx.appId,
33
- ctx.roleId
34
- )
35
-
36
34
  // builders for now have permission to do anything
37
- // TODO: in future should consider separating permissions with an require("@budibase/auth").isClient check
38
35
  let isBuilder = ctx.user && ctx.user.builder && ctx.user.builder.global
39
36
  const isBuilderApi = permType === PermissionTypes.BUILDER
40
37
  if (isBuilder) {
@@ -43,20 +40,30 @@ module.exports =
43
40
  return ctx.throw(403, "Not Authorized")
44
41
  }
45
42
 
46
- if (
47
- hasResource(ctx) &&
48
- doesHaveResourcePermission(permissions, permLevel, ctx)
49
- ) {
50
- return next()
43
+ // need to check this first, in-case public access, don't check authed until last
44
+ const roleId = ctx.roleId || BUILTIN_ROLE_IDS.PUBLIC
45
+ const hierarchy = await getUserRoleHierarchy(ctx.appId, roleId, {
46
+ idOnly: false,
47
+ })
48
+ const permError = "User does not have permission"
49
+ let possibleRoleIds = []
50
+ if (hasResource(ctx)) {
51
+ possibleRoleIds = await getRequiredResourceRole(ctx.appId, permLevel, ctx)
52
+ }
53
+ // check if we found a role, if not fallback to base permissions
54
+ if (possibleRoleIds.length > 0) {
55
+ const found = hierarchy.find(
56
+ role => possibleRoleIds.indexOf(role._id) !== -1
57
+ )
58
+ return found ? next() : ctx.throw(403, permError)
59
+ } else if (!doesHaveBasePermission(permType, permLevel, hierarchy)) {
60
+ ctx.throw(403, permError)
51
61
  }
52
62
 
63
+ // if they are not authed, then anything using the authorized middleware will fail
53
64
  if (!isAuthed) {
54
65
  ctx.throw(403, "Session not authenticated")
55
66
  }
56
67
 
57
- if (!doesHaveBasePermission(permType, permLevel, basePermissions)) {
58
- ctx.throw(403, "User does not have permission")
59
- }
60
-
61
68
  return next()
62
69
  }
@@ -10,6 +10,7 @@ jest.mock("../../environment", () => ({
10
10
  const authorizedMiddleware = require("../authorized")
11
11
  const env = require("../../environment")
12
12
  const { PermissionTypes, PermissionLevels } = require("@budibase/auth/permissions")
13
+ require("@budibase/auth").init(require("../../db"))
13
14
 
14
15
  class TestConfiguration {
15
16
  constructor(role) {
@@ -21,6 +22,7 @@ class TestConfiguration {
21
22
  request: {
22
23
  url: ""
23
24
  },
25
+ appId: "",
24
26
  auth: {},
25
27
  next: this.next,
26
28
  throw: this.throw