@budibase/worker 3.18.4 → 3.18.6

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/worker",
3
3
  "email": "hi@budibase.com",
4
- "version": "3.18.4",
4
+ "version": "3.18.6",
5
5
  "description": "Budibase background service",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -109,5 +109,5 @@
109
109
  }
110
110
  }
111
111
  },
112
- "gitHead": "b82c05d3d0949d198b49415d20980e72cc61ca5b"
112
+ "gitHead": "0062775fce7e68e01263a9c5a5e94bf978da8746"
113
113
  }
@@ -1,18 +1,15 @@
1
- import * as email from "../../../utilities/email"
2
- import env from "../../../environment"
3
- import * as auth from "./auth"
4
1
  import {
5
2
  BadRequestError,
6
- ForbiddenError,
7
3
  cache,
8
4
  configs,
9
- db as dbCore,
10
5
  env as coreEnv,
6
+ db as dbCore,
11
7
  events,
8
+ ForbiddenError,
12
9
  objectStore,
13
10
  tenancy,
14
11
  } from "@budibase/backend-core"
15
- import { checkAnyUserExists } from "../../../utilities/users"
12
+ import * as pro from "@budibase/pro"
16
13
  import {
17
14
  AIInnerConfig,
18
15
  Config,
@@ -44,7 +41,10 @@ import {
44
41
  UploadConfigFileResponse,
45
42
  UserCtx,
46
43
  } from "@budibase/types"
47
- import * as pro from "@budibase/pro"
44
+ import env from "../../../environment"
45
+ import * as email from "../../../utilities/email"
46
+ import { checkAnyUserExists } from "../../../utilities/users"
47
+ import * as auth from "./auth"
48
48
 
49
49
  const getEventFns = async (config: Config, existing?: Config) => {
50
50
  const fns = []
@@ -241,6 +241,8 @@ async function processOIDCConfig(config: OIDCConfigs, existing?: OIDCConfigs) {
241
241
  throw new Error("License does not allow OIDC PKCE method support")
242
242
  }
243
243
 
244
+ config.configs.filter(c => c.pkce === null).forEach(c => delete c.pkce)
245
+
244
246
  if (existing) {
245
247
  for (const c of config.configs) {
246
248
  const existingConfig = existing.configs.find(e => e.uuid === c.uuid)
@@ -646,10 +648,13 @@ export async function configChecklist(ctx: Ctx<void, ConfigChecklistResponse>) {
646
648
  cache.CacheKey.CHECKLIST,
647
649
  env.CHECKLIST_CACHE_TTL,
648
650
  async (): Promise<ConfigChecklistResponse> => {
649
- let apps = []
651
+ let workspaces = []
650
652
  if (!env.MULTI_TENANCY || tenantId) {
651
653
  // Apps exist
652
- apps = await dbCore.getAllApps({ idsOnly: true, efficient: true })
654
+ workspaces = await dbCore.getAllWorkspaces({
655
+ idsOnly: true,
656
+ efficient: true,
657
+ })
653
658
  }
654
659
 
655
660
  // They have set up SMTP
@@ -671,7 +676,7 @@ export async function configChecklist(ctx: Ctx<void, ConfigChecklistResponse>) {
671
676
 
672
677
  return {
673
678
  apps: {
674
- checked: apps.length > 0,
679
+ checked: workspaces.length > 0,
675
680
  label: "Create your first app",
676
681
  link: "/builder/portal/workspaces",
677
682
  },
@@ -17,22 +17,22 @@ import sdk from "../../../sdk"
17
17
  export async function fetch(ctx: Ctx<void, FetchGlobalRolesResponse>) {
18
18
  const tenantId = ctx.user!.tenantId
19
19
  await context.doInTenant(tenantId, async () => {
20
- // always use the dev apps as they'll be most up to date (true)
21
- const apps = await dbCore.getAllApps({ all: true })
20
+ // always use the dev workspaces as they'll be most up to date (true)
21
+ const workspaces = await dbCore.getAllWorkspaces({ all: true })
22
22
  const promises = []
23
- for (let app of apps) {
24
- // use dev app IDs
25
- promises.push(roles.getAllRoles(app.appId))
23
+ for (let workspace of workspaces) {
24
+ // use dev workspace IDs
25
+ promises.push(roles.getAllRoles(workspace.appId))
26
26
  }
27
27
  const roleList = await Promise.all(promises)
28
28
  const response: any = {}
29
- for (let app of apps) {
30
- const deployedAppId = dbCore.getProdAppID(app.appId)
29
+ for (let workspace of workspaces) {
30
+ const deployedAppId = dbCore.getProdWorkspaceID(workspace.appId)
31
31
  response[deployedAppId] = {
32
32
  roles: roleList.shift(),
33
- name: app.name,
34
- version: app.version,
35
- url: app.url,
33
+ name: workspace.name,
34
+ version: workspace.version,
35
+ url: workspace.url,
36
36
  }
37
37
  }
38
38
  ctx.body = response
@@ -41,16 +41,19 @@ export async function fetch(ctx: Ctx<void, FetchGlobalRolesResponse>) {
41
41
 
42
42
  export async function find(ctx: Ctx<void, FindGlobalRoleResponse>) {
43
43
  const appId = ctx.params.appId
44
- await context.doInAppContext(dbCore.getDevAppID(appId), async () => {
45
- const db = context.getAppDB()
46
- const app = await db.get<Workspace>(dbCore.DocumentType.APP_METADATA)
47
- ctx.body = {
48
- roles: await roles.getAllRoles(),
49
- name: app.name,
50
- version: app.version,
51
- url: app.url,
44
+ await context.doInWorkspaceContext(
45
+ dbCore.getDevWorkspaceID(appId),
46
+ async () => {
47
+ const db = context.getWorkspaceDB()
48
+ const app = await db.get<Workspace>(dbCore.DocumentType.APP_METADATA)
49
+ ctx.body = {
50
+ roles: await roles.getAllRoles(),
51
+ name: app.name,
52
+ version: app.version,
53
+ url: app.url,
54
+ }
52
55
  }
53
- })
56
+ )
54
57
  }
55
58
 
56
59
  export async function removeAppRole(ctx: Ctx<void, RemoveAppRoleResponse>) {
@@ -59,7 +62,7 @@ export async function removeAppRole(ctx: Ctx<void, RemoveAppRoleResponse>) {
59
62
  const users = await sdk.users.db.allUsers()
60
63
  const bulk = []
61
64
  const cacheInvalidations = []
62
- const prodAppId = dbCore.getProdAppID(appId)
65
+ const prodAppId = dbCore.getProdWorkspaceID(appId)
63
66
  for (let user of users) {
64
67
  let updated = false
65
68
  if (user.roles[prodAppId]) {
@@ -1,13 +1,11 @@
1
- import * as userSdk from "../../../sdk/users"
2
1
  import {
2
+ auth as authCore,
3
+ db as dbCore,
4
+ encryption,
3
5
  features,
4
6
  tenancy,
5
- db as dbCore,
6
7
  utils,
7
- encryption,
8
- auth as authCore,
9
8
  } from "@budibase/backend-core"
10
- import env from "../../../environment"
11
9
  import { ai, groups } from "@budibase/pro"
12
10
  import {
13
11
  DevInfo,
@@ -20,6 +18,8 @@ import {
20
18
  User,
21
19
  UserCtx,
22
20
  } from "@budibase/types"
21
+ import env from "../../../environment"
22
+ import * as userSdk from "../../../sdk/users"
23
23
 
24
24
  const { newid } = utils
25
25
 
@@ -139,8 +139,8 @@ export const syncAppFavourites = async (processedAppIds: string[]) => {
139
139
  const tenantId = tenancy.getTenantId()
140
140
  const appPrefix =
141
141
  tenantId === tenancy.DEFAULT_TENANT_ID
142
- ? dbCore.APP_DEV_PREFIX
143
- : `${dbCore.APP_DEV_PREFIX}${tenantId}_`
142
+ ? dbCore.WORKSPACE_DEV_PREFIX
143
+ : `${dbCore.WORKSPACE_DEV_PREFIX}${tenantId}_`
144
144
 
145
145
  const apps = await fetchAppsByIds(processedAppIds, appPrefix)
146
146
  return apps?.reduce((acc: string[], app) => {
@@ -156,7 +156,7 @@ export const fetchAppsByIds = async (
156
156
  processedAppIds: string[],
157
157
  appPrefix: string
158
158
  ) => {
159
- return await dbCore.getAppsByIDs(
159
+ return await dbCore.getWorkspacesByIDs(
160
160
  processedAppIds.map(appId => {
161
161
  return `${appPrefix}${appId}`
162
162
  })
@@ -1,7 +1,7 @@
1
- import * as controller from "../../controllers/global/configs"
2
1
  import { auth } from "@budibase/backend-core"
3
- import Joi from "joi"
4
2
  import { ConfigType, PKCEMethod } from "@budibase/types"
3
+ import Joi from "joi"
4
+ import * as controller from "../../controllers/global/configs"
5
5
  import { adminRoutes, loggedInRoutes } from "../endpointGroups"
6
6
 
7
7
  function smtpValidation() {
@@ -51,7 +51,7 @@ function oidcValidation() {
51
51
  uuid: Joi.string().required(),
52
52
  activated: Joi.boolean().required(),
53
53
  scopes: Joi.array().optional(),
54
- pkce: Joi.string().valid(...Object.values(PKCEMethod)).optional()
54
+ pkce: Joi.string().valid(...Object.values(PKCEMethod)).optional().allow(null)
55
55
  })
56
56
  ).required()
57
57
  }).unknown(true)
@@ -1,5 +1,5 @@
1
- import { mocks, structures } from "@budibase/backend-core/tests"
2
1
  import { context, events } from "@budibase/backend-core"
2
+ import { mocks, structures } from "@budibase/backend-core/tests"
3
3
  import { Event, IdentityType } from "@budibase/types"
4
4
  import { TestConfiguration } from "../../../../tests"
5
5
 
@@ -36,7 +36,7 @@ describe("/api/global/auditlogs (%s)", () => {
36
36
  for (let i = 0; i < USER_AUDIT_LOG_COUNT; i++) {
37
37
  await events.user.created(structures.users.user())
38
38
  }
39
- await context.doInAppContext(APP_ID, async () => {
39
+ await context.doInWorkspaceContext(APP_ID, async () => {
40
40
  await events.app.created(structures.apps.app(APP_ID))
41
41
  })
42
42
  // fetch the user created events
@@ -1,9 +1,14 @@
1
1
  jest.mock("nodemailer")
2
- import { TestConfiguration, structures, mocks } from "../../../../tests"
2
+ import { configs, events } from "@budibase/backend-core"
3
+ import {
4
+ Config,
5
+ ConfigType,
6
+ GetPublicSettingsResponse,
7
+ PKCEMethod,
8
+ } from "@budibase/types"
9
+ import { TestConfiguration, mocks, structures } from "../../../../tests"
3
10
 
4
11
  mocks.email.mock()
5
- import { configs, events } from "@budibase/backend-core"
6
- import { GetPublicSettingsResponse, Config, ConfigType } from "@budibase/types"
7
12
 
8
13
  const { google, smtp, settings, oidc } = structures.configs
9
14
 
@@ -13,6 +18,7 @@ describe("configs", () => {
13
18
  beforeEach(async () => {
14
19
  await config.beforeAll()
15
20
  jest.clearAllMocks()
21
+ mocks.licenses.usePkceOidc()
16
22
  })
17
23
 
18
24
  afterAll(async () => {
@@ -189,6 +195,24 @@ describe("configs", () => {
189
195
  "--secret-value--"
190
196
  )
191
197
  })
198
+
199
+ it("should strip pkce field when null", async () => {
200
+ await saveConfig(oidc({ pkce: null as any }))
201
+
202
+ await config.doInTenant(async () => {
203
+ const rawConf = await configs.getOIDCConfig()
204
+ expect(rawConf!).not.toHaveProperty("pkce")
205
+ })
206
+ })
207
+
208
+ it("should preserve pkce field when set to valid value", async () => {
209
+ await saveConfig(oidc({ pkce: PKCEMethod.S256 }))
210
+
211
+ await config.doInTenant(async () => {
212
+ const rawConf = await configs.getOIDCConfig()
213
+ expect(rawConf!.pkce).toBe(PKCEMethod.S256)
214
+ })
215
+ })
192
216
  })
193
217
  })
194
218
 
@@ -16,19 +16,19 @@ jest.mock("@budibase/backend-core", () => {
16
16
  },
17
17
  context: {
18
18
  ...core.context,
19
- getAppDB: jest.fn(),
19
+ getWorkspaceDB: jest.fn(),
20
20
  },
21
21
  }
22
22
  })
23
23
 
24
- let appId: string
25
- let appDb: Database
24
+ let workspaceId: string
25
+ let workspaceDb: Database
26
26
  const ROLE_NAME = "newRole"
27
27
 
28
28
  async function addAppMetadata() {
29
- await appDb.put({
29
+ await workspaceDb.put({
30
30
  _id: "app_metadata",
31
- appId: appId,
31
+ appId: workspaceId,
32
32
  name: "New App",
33
33
  version: "version",
34
34
  url: "url",
@@ -38,8 +38,8 @@ async function addAppMetadata() {
38
38
  async function updateAppMetadata(
39
39
  update: Partial<WithoutDocMetadata<Workspace>>
40
40
  ) {
41
- const app = await appDb.get("app_metadata")
42
- await appDb.put({
41
+ const app = await workspaceDb.get("app_metadata")
42
+ await workspaceDb.put({
43
43
  ...app,
44
44
  ...update,
45
45
  })
@@ -60,13 +60,13 @@ describe("/api/global/roles", () => {
60
60
  })
61
61
 
62
62
  beforeEach(async () => {
63
- appId = db.generateAppID(config.tenantId)
64
- appDb = db.getDB(appId)
65
- const mockAppDB = context.getAppDB as jest.Mock
66
- mockAppDB.mockReturnValue(appDb)
63
+ workspaceId = db.generateWorkspaceID(config.tenantId)
64
+ workspaceDb = db.getDB(workspaceId)
65
+ const mockWorkspaceDB = context.getWorkspaceDB as jest.Mock
66
+ mockWorkspaceDB.mockReturnValue(workspaceDb)
67
67
 
68
68
  await addAppMetadata()
69
- await appDb.put(role)
69
+ await workspaceDb.put(role)
70
70
  })
71
71
 
72
72
  afterAll(async () => {
@@ -81,8 +81,10 @@ describe("/api/global/roles", () => {
81
81
  it("retrieves roles", async () => {
82
82
  const res = await config.api.roles.get()
83
83
  expect(res.body).toBeDefined()
84
- expect(res.body[appId].roles.length).toEqual(5)
85
- expect(res.body[appId].roles.map((r: any) => r._id)).toContain(ROLE_NAME)
84
+ expect(res.body[workspaceId].roles.length).toEqual(5)
85
+ expect(res.body[workspaceId].roles.map((r: any) => r._id)).toContain(
86
+ ROLE_NAME
87
+ )
86
88
  })
87
89
 
88
90
  it.each(["3.0.0", "3.0.1", "3.1.0", "3.0.0+2146.b125a7c"])(
@@ -91,7 +93,7 @@ describe("/api/global/roles", () => {
91
93
  await updateAppMetadata({ creationVersion })
92
94
  const res = await config.api.roles.get()
93
95
  expect(res.body).toBeDefined()
94
- expect(res.body[appId].roles.map((r: any) => r._id)).toEqual([
96
+ expect(res.body[workspaceId].roles.map((r: any) => r._id)).toEqual([
95
97
  ROLE_NAME,
96
98
  roles.BUILTIN_ROLE_IDS.ADMIN,
97
99
  roles.BUILTIN_ROLE_IDS.BASIC,
@@ -106,7 +108,7 @@ describe("/api/global/roles", () => {
106
108
  await updateAppMetadata({ creationVersion })
107
109
  const res = await config.api.roles.get()
108
110
  expect(res.body).toBeDefined()
109
- expect(res.body[appId].roles.map((r: any) => r._id)).toEqual([
111
+ expect(res.body[workspaceId].roles.map((r: any) => r._id)).toEqual([
110
112
  ROLE_NAME,
111
113
  roles.BUILTIN_ROLE_IDS.ADMIN,
112
114
  roles.BUILTIN_ROLE_IDS.POWER,
@@ -122,7 +124,7 @@ describe("/api/global/roles", () => {
122
124
  await updateAppMetadata({ creationVersion })
123
125
  const res = await config.api.roles.get()
124
126
 
125
- expect(res.body[appId].roles.map((r: any) => r._id)).toEqual([
127
+ expect(res.body[workspaceId].roles.map((r: any) => r._id)).toEqual([
126
128
  ROLE_NAME,
127
129
  roles.BUILTIN_ROLE_IDS.ADMIN,
128
130
  roles.BUILTIN_ROLE_IDS.POWER,
@@ -135,7 +137,7 @@ describe("/api/global/roles", () => {
135
137
 
136
138
  describe("GET api/global/roles/:appId", () => {
137
139
  it("finds a role by appId", async () => {
138
- const res = await config.api.roles.find(appId)
140
+ const res = await config.api.roles.find(workspaceId)
139
141
  expect(res.body).toBeDefined()
140
142
  expect(res.body.name).toEqual("New App")
141
143
  })
@@ -160,9 +162,9 @@ describe("/api/global/roles", () => {
160
162
  app_test: "role1",
161
163
  }
162
164
  const userResponse = await config.createUser(user)
163
- const res = await config.api.roles.remove(appId)
165
+ const res = await config.api.roles.remove(workspaceId)
164
166
  const updatedUser = await config.api.users.getUser(userResponse._id!)
165
- expect(updatedUser.body.roles).not.toHaveProperty(appId)
167
+ expect(updatedUser.body.roles).not.toHaveProperty(workspaceId)
166
168
  expect(res.body.message).toEqual("App role removed from all users")
167
169
  })
168
170
 
@@ -170,7 +172,7 @@ describe("/api/global/roles", () => {
170
172
  const builderUser = await createBuilderUser()
171
173
 
172
174
  const res = await config.withUser(builderUser, () =>
173
- config.api.roles.remove(appId, { status: 403 })
175
+ config.api.roles.remove(workspaceId, { status: 403 })
174
176
  )
175
177
  expect(res.body.message).toBe("Admin user only endpoint.")
176
178
  })
@@ -1,6 +1,5 @@
1
1
  import { db as dbCore, platform, tenancy } from "@budibase/backend-core"
2
2
  import { quotas } from "@budibase/pro"
3
- import { Workspace } from "@budibase/types"
4
3
 
5
4
  export async function deleteTenant(tenantId: string) {
6
5
  await quotas.bustCache()
@@ -21,9 +20,11 @@ async function removeGlobalDB(tenantId: string) {
21
20
 
22
21
  async function removeTenantApps(tenantId: string) {
23
22
  try {
24
- const apps = (await dbCore.getAllApps({ all: true })) as Workspace[]
25
- const destroyPromises = apps.map(app => {
26
- const db = dbCore.getDB(app.appId)
23
+ const workspaces = await dbCore.getAllWorkspaces({
24
+ all: true,
25
+ })
26
+ const destroyPromises = workspaces.map(workspace => {
27
+ const db = dbCore.getDB(workspace.appId)
27
28
  return db.destroy()
28
29
  })
29
30
  await Promise.allSettled(destroyPromises)
@@ -1,6 +1,6 @@
1
- import { generator } from "@budibase/backend-core/tests"
2
1
  import { db } from "@budibase/backend-core"
3
- import { UserGroup as UserGroupType, UserGroupRoles } from "@budibase/types"
2
+ import { generator } from "@budibase/backend-core/tests"
3
+ import { UserGroupRoles, UserGroup as UserGroupType } from "@budibase/types"
4
4
 
5
5
  export function UserGroup(): UserGroupType {
6
6
  const appsCount = generator.integer({ min: 0, max: 3 })
@@ -8,7 +8,11 @@ export function UserGroup(): UserGroupType {
8
8
  (p: UserGroupRoles) => {
9
9
  return {
10
10
  ...p,
11
- [db.generateAppID()]: generator.pickone(["ADMIN", "POWER", "BASIC"]),
11
+ [db.generateWorkspaceID()]: generator.pickone([
12
+ "ADMIN",
13
+ "POWER",
14
+ "BASIC",
15
+ ]),
12
16
  }
13
17
  },
14
18
  {}