@budibase/server 1.0.212-alpha.14 → 1.0.212-alpha.15

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 (166) hide show
  1. package/builder/assets/{index.1f366fcc.js → index.83448a6c.js} +1 -1
  2. package/builder/index.html +1 -1
  3. package/coverage/clover.xml +115 -97
  4. package/coverage/coverage-final.json +1 -1
  5. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  6. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/index.html +1 -1
  14. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  20. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/table/external.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/templates.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  43. package/coverage/lcov-report/api/index.html +1 -1
  44. package/coverage/lcov-report/api/index.js.html +1 -1
  45. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  46. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/index.html +1 -1
  56. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  70. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  73. package/coverage/lcov-report/automations/actions.js.html +1 -1
  74. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  75. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  76. package/coverage/lcov-report/automations/index.html +1 -1
  77. package/coverage/lcov-report/automations/index.js.html +1 -1
  78. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  79. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/index.html +1 -1
  85. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  95. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  96. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  104. package/coverage/lcov-report/constants/index.html +1 -1
  105. package/coverage/lcov-report/constants/index.js.html +1 -1
  106. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  107. package/coverage/lcov-report/constants/screens.js.html +1 -1
  108. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  109. package/coverage/lcov-report/db/index.html +1 -1
  110. package/coverage/lcov-report/db/index.js.html +1 -1
  111. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  112. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  115. package/coverage/lcov-report/db/newid.js.html +1 -1
  116. package/coverage/lcov-report/db/utils.js.html +1 -1
  117. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  118. package/coverage/lcov-report/events/index.html +1 -1
  119. package/coverage/lcov-report/events/index.js.html +1 -1
  120. package/coverage/lcov-report/events/utils.js.html +1 -1
  121. package/coverage/lcov-report/index.html +19 -19
  122. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  123. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  124. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  125. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  126. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  127. package/coverage/lcov-report/middleware/index.html +1 -1
  128. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  129. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  130. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  131. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  132. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  133. package/coverage/lcov-report/threads/automation.js.html +1 -1
  134. package/coverage/lcov-report/threads/index.html +19 -19
  135. package/coverage/lcov-report/threads/query.js.html +147 -18
  136. package/coverage/lcov-report/threads/utils.js.html +1 -1
  137. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  138. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  139. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  140. package/coverage/lcov-report/utilities/global.js.html +1 -1
  141. package/coverage/lcov-report/utilities/index.html +1 -1
  142. package/coverage/lcov-report/utilities/index.js.html +1 -1
  143. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  144. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  145. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  146. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  148. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  149. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  150. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  151. package/coverage/lcov-report/utilities/security.js.html +1 -1
  152. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  153. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  154. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  155. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  156. package/coverage/lcov-report/utilities/users.js.html +1 -1
  157. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  158. package/coverage/lcov.info +188 -154
  159. package/dist/api/controllers/query/index.js +19 -0
  160. package/dist/package.json +6 -6
  161. package/dist/threads/query.js +35 -5
  162. package/dist/tsconfig.build.tsbuildinfo +1 -1
  163. package/package.json +7 -7
  164. package/src/api/controllers/query/index.ts +23 -1
  165. package/src/module.d.ts +1 -0
  166. package/src/threads/query.js +50 -7
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.0.212-alpha.14",
4
+ "version": "1.0.212-alpha.15",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -77,11 +77,11 @@
77
77
  "license": "GPL-3.0",
78
78
  "dependencies": {
79
79
  "@apidevtools/swagger-parser": "10.0.3",
80
- "@budibase/backend-core": "^1.0.212-alpha.14",
81
- "@budibase/client": "^1.0.212-alpha.14",
82
- "@budibase/pro": "1.0.212-alpha.13",
83
- "@budibase/string-templates": "^1.0.212-alpha.14",
84
- "@budibase/types": "^1.0.212-alpha.14",
80
+ "@budibase/backend-core": "^1.0.212-alpha.15",
81
+ "@budibase/client": "^1.0.212-alpha.15",
82
+ "@budibase/pro": "1.0.212-alpha.14",
83
+ "@budibase/string-templates": "^1.0.212-alpha.15",
84
+ "@budibase/types": "^1.0.212-alpha.15",
85
85
  "@bull-board/api": "3.7.0",
86
86
  "@bull-board/koa": "3.9.4",
87
87
  "@elastic/elasticsearch": "7.10.0",
@@ -195,5 +195,5 @@
195
195
  "optionalDependencies": {
196
196
  "oracledb": "5.3.0"
197
197
  },
198
- "gitHead": "5147929cb55fe0ad5fa21adf64774458b7176c7e"
198
+ "gitHead": "95300e2d7101504da960c7a4f2c9cdf06e3058a5"
199
199
  }
@@ -8,6 +8,8 @@ import { QUERY_THREAD_TIMEOUT } from "../../../environment"
8
8
  import { getAppDB } from "@budibase/backend-core/context"
9
9
  import { quotas } from "@budibase/pro"
10
10
  import { events } from "@budibase/backend-core"
11
+ import { getCookie } from "@budibase/backend-core/utils"
12
+ import { Cookies, Configs } from "@budibase/backend-core/constants"
11
13
 
12
14
  const Runner = new Thread(ThreadType.QUERY, {
13
15
  timeoutMs: QUERY_THREAD_TIMEOUT || 10000,
@@ -110,6 +112,21 @@ export async function find(ctx: any) {
110
112
  ctx.body = query
111
113
  }
112
114
 
115
+ //Required to discern between OIDC OAuth config entries
116
+ function getOAuthConfigCookieId(ctx: any) {
117
+ if (ctx.user.providerType === Configs.OIDC) {
118
+ return getCookie(ctx, Cookies.OIDC_CONFIG)
119
+ }
120
+ }
121
+
122
+ function getAuthConfig(ctx: any) {
123
+ const authCookie = getCookie(ctx, Cookies.Auth)
124
+ let authConfigCtx: any = {}
125
+ authConfigCtx["configId"] = getOAuthConfigCookieId(ctx)
126
+ authConfigCtx["sessionId"] = authCookie ? authCookie.sessionId : null
127
+ return authConfigCtx
128
+ }
129
+
113
130
  export async function preview(ctx: any) {
114
131
  const db = getAppDB()
115
132
 
@@ -119,6 +136,8 @@ export async function preview(ctx: any) {
119
136
  // this stops dynamic variables from calling the same query
120
137
  const { fields, parameters, queryVerb, transformer, queryId } = query
121
138
 
139
+ const authConfigCtx: any = getAuthConfig(ctx)
140
+
122
141
  try {
123
142
  const runFn = () =>
124
143
  Runner.run({
@@ -131,9 +150,9 @@ export async function preview(ctx: any) {
131
150
  queryId,
132
151
  ctx: {
133
152
  user: ctx.user,
153
+ auth: { ...authConfigCtx },
134
154
  },
135
155
  })
136
-
137
156
  const { rows, keys, info, extra } = await quotas.addQuery(runFn)
138
157
  await events.query.previewed(datasource, query)
139
158
  ctx.body = {
@@ -153,6 +172,8 @@ async function execute(ctx: any, opts = { rowsOnly: false }) {
153
172
  const query = await db.get(ctx.params.queryId)
154
173
  const datasource = await db.get(query.datasourceId)
155
174
 
175
+ const authConfigCtx: any = getAuthConfig(ctx)
176
+
156
177
  const enrichedParameters = ctx.request.body.parameters || {}
157
178
  // make sure parameters are fully enriched with defaults
158
179
  if (query && query.parameters) {
@@ -177,6 +198,7 @@ async function execute(ctx: any, opts = { rowsOnly: false }) {
177
198
  queryId: ctx.params.queryId,
178
199
  ctx: {
179
200
  user: ctx.user,
201
+ auth: { ...authConfigCtx },
180
202
  },
181
203
  })
182
204
 
package/src/module.d.ts CHANGED
@@ -8,4 +8,5 @@ declare module "@budibase/backend-core/constants"
8
8
  declare module "@budibase/backend-core/auth"
9
9
  declare module "@budibase/backend-core/sessions"
10
10
  declare module "@budibase/backend-core/encryption"
11
+ declare module "@budibase/backend-core/utils"
11
12
  declare module "@budibase/backend-core/redis"
@@ -4,6 +4,12 @@ const ScriptRunner = require("../utilities/scriptRunner")
4
4
  const { integrations } = require("../integrations")
5
5
  const { processStringSync } = require("@budibase/string-templates")
6
6
  const { doInAppContext, getAppDB } = require("@budibase/backend-core/context")
7
+ const {
8
+ refreshOAuthToken,
9
+ updateUserOAuth,
10
+ } = require("@budibase/backend-core/auth")
11
+ const { getGlobalIDFromUserMetadataID } = require("../db/utils")
12
+
7
13
  const { isSQL } = require("../integrations/utils")
8
14
  const {
9
15
  enrichQueryFields,
@@ -28,10 +34,12 @@ class QueryRunner {
28
34
  // it can be
29
35
  this.queryResponse = {}
30
36
  this.hasRerun = false
37
+ this.hasRefreshedOAuth = false
31
38
  }
32
39
 
33
40
  async execute() {
34
41
  let { datasource, fields, queryVerb, transformer } = this
42
+
35
43
  const Integration = integrations[datasource.source]
36
44
  if (!Integration) {
37
45
  throw "Integration type does not exist."
@@ -98,14 +106,24 @@ class QueryRunner {
98
106
  }
99
107
 
100
108
  // if the request fails we retry once, invalidating the cached value
101
- if (
102
- info &&
103
- info.code >= 400 &&
104
- this.cachedVariables.length > 0 &&
105
- !this.hasRerun
106
- ) {
109
+ if (info && info.code >= 400 && !this.hasRerun) {
110
+ if (
111
+ this.ctx.user?.provider &&
112
+ info.code === 401 &&
113
+ !this.hasRefreshedOAuth
114
+ ) {
115
+ // Attempt to refresh the access token from the provider
116
+ this.hasRefreshedOAuth = true
117
+ const authResponse = await this.refreshOAuth2(this.ctx)
118
+
119
+ if (!authResponse || authResponse.err) {
120
+ // In this event the user may have oAuth issues that
121
+ // could require re-authenticating with their provider.
122
+ throw new Error("OAuth2 access token could not be refreshed")
123
+ }
124
+ }
125
+
107
126
  this.hasRerun = true
108
- // invalidate the cache value
109
127
  await threadUtils.invalidateDynamicVariables(this.cachedVariables)
110
128
  return this.execute()
111
129
  }
@@ -151,6 +169,31 @@ class QueryRunner {
151
169
  ).execute()
152
170
  }
153
171
 
172
+ async refreshOAuth2(ctx) {
173
+ const { oauth2, providerType, _id } = ctx.user
174
+ const { configId } = ctx.auth
175
+
176
+ if (!providerType || !oauth2?.refreshToken) {
177
+ console.error("No refresh token found for authenticated user")
178
+ return
179
+ }
180
+
181
+ const resp = await refreshOAuthToken(
182
+ oauth2.refreshToken,
183
+ providerType,
184
+ configId
185
+ )
186
+
187
+ // Refresh session flow. Should be in same location as refreshOAuthToken
188
+ // There are several other properties available in 'resp'
189
+ if (!resp.error) {
190
+ const globalUserId = getGlobalIDFromUserMetadataID(_id)
191
+ await updateUserOAuth(globalUserId, resp)
192
+ }
193
+
194
+ return resp
195
+ }
196
+
154
197
  async getDynamicVariable(variable) {
155
198
  let { parameters } = this
156
199
  const queryId = variable.queryId,