@budibase/worker 3.13.27 → 3.13.28
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.13.
|
|
4
|
+
"version": "3.13.28",
|
|
5
5
|
"description": "Budibase background service",
|
|
6
6
|
"main": "src/index.ts",
|
|
7
7
|
"repository": {
|
|
@@ -114,5 +114,5 @@
|
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
},
|
|
117
|
-
"gitHead": "
|
|
117
|
+
"gitHead": "de8a462d540b26a2040f4c8059d0a2395234c628"
|
|
118
118
|
}
|
|
@@ -2,6 +2,8 @@ import * as email from "../../../utilities/email"
|
|
|
2
2
|
import env from "../../../environment"
|
|
3
3
|
import * as auth from "./auth"
|
|
4
4
|
import {
|
|
5
|
+
BadRequestError,
|
|
6
|
+
ForbiddenError,
|
|
5
7
|
cache,
|
|
6
8
|
configs,
|
|
7
9
|
db as dbCore,
|
|
@@ -9,7 +11,6 @@ import {
|
|
|
9
11
|
events,
|
|
10
12
|
objectStore,
|
|
11
13
|
tenancy,
|
|
12
|
-
BadRequestError,
|
|
13
14
|
} from "@budibase/backend-core"
|
|
14
15
|
import { checkAnyUserExists } from "../../../utilities/users"
|
|
15
16
|
import {
|
|
@@ -26,11 +27,13 @@ import {
|
|
|
26
27
|
isAIConfig,
|
|
27
28
|
isGoogleConfig,
|
|
28
29
|
isOIDCConfig,
|
|
30
|
+
isRecaptchaConfig,
|
|
29
31
|
isSettingsConfig,
|
|
30
32
|
isSMTPConfig,
|
|
31
33
|
OIDCConfigs,
|
|
32
34
|
OIDCLogosConfig,
|
|
33
35
|
PASSWORD_REPLACEMENT,
|
|
36
|
+
RecaptchaInnerConfig,
|
|
34
37
|
SaveConfigRequest,
|
|
35
38
|
SaveConfigResponse,
|
|
36
39
|
SettingsBrandingConfig,
|
|
@@ -273,6 +276,21 @@ export async function processAIConfig(
|
|
|
273
276
|
}
|
|
274
277
|
}
|
|
275
278
|
|
|
279
|
+
export async function processRecaptchaConfig(
|
|
280
|
+
config: RecaptchaInnerConfig,
|
|
281
|
+
existingConfig?: RecaptchaInnerConfig
|
|
282
|
+
) {
|
|
283
|
+
if (!(await pro.features.isRecaptchaEnabled())) {
|
|
284
|
+
throw new ForbiddenError("License does not allow use of recaptcha")
|
|
285
|
+
}
|
|
286
|
+
if (config.secretKey === PASSWORD_REPLACEMENT && !existingConfig) {
|
|
287
|
+
throw new BadRequestError("No secret key provided")
|
|
288
|
+
}
|
|
289
|
+
if (config.secretKey === PASSWORD_REPLACEMENT && existingConfig) {
|
|
290
|
+
config.secretKey = existingConfig.secretKey
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
276
294
|
export async function save(
|
|
277
295
|
ctx: UserCtx<SaveConfigRequest, SaveConfigResponse>
|
|
278
296
|
) {
|
|
@@ -306,6 +324,9 @@ export async function save(
|
|
|
306
324
|
await processAIConfig(config, existingConfig.config)
|
|
307
325
|
}
|
|
308
326
|
break
|
|
327
|
+
case ConfigType.RECAPTCHA:
|
|
328
|
+
await processRecaptchaConfig(config, existingConfig?.config)
|
|
329
|
+
break
|
|
309
330
|
}
|
|
310
331
|
} catch (err: any) {
|
|
311
332
|
ctx.throw(400, err)
|
|
@@ -430,6 +451,8 @@ function stripSecrets(config: Config) {
|
|
|
430
451
|
for (const c of config.config.configs) {
|
|
431
452
|
c.clientSecret = PASSWORD_REPLACEMENT
|
|
432
453
|
}
|
|
454
|
+
} else if (isRecaptchaConfig(config)) {
|
|
455
|
+
config.config.secretKey = PASSWORD_REPLACEMENT
|
|
433
456
|
}
|
|
434
457
|
}
|
|
435
458
|
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
ActivateLicenseKeyResponse,
|
|
5
5
|
ActivateOfflineLicenseTokenRequest,
|
|
6
6
|
ActivateOfflineLicenseTokenResponse,
|
|
7
|
+
GetInstallInfo,
|
|
7
8
|
GetLicenseKeyResponse,
|
|
8
9
|
GetOfflineIdentifierResponse,
|
|
9
10
|
GetOfflineLicenseTokenResponse,
|
|
@@ -11,6 +12,7 @@ import {
|
|
|
11
12
|
RefreshOfflineLicenseResponse,
|
|
12
13
|
UserCtx,
|
|
13
14
|
} from "@budibase/types"
|
|
15
|
+
import { installation } from "@budibase/backend-core"
|
|
14
16
|
|
|
15
17
|
// LICENSE KEY
|
|
16
18
|
|
|
@@ -94,3 +96,11 @@ export const getQuotaUsage = async (
|
|
|
94
96
|
) => {
|
|
95
97
|
ctx.body = await quotas.getQuotaUsage()
|
|
96
98
|
}
|
|
99
|
+
|
|
100
|
+
export const getInstallInfo = async (ctx: UserCtx<void, GetInstallInfo>) => {
|
|
101
|
+
const install = await installation.getInstall()
|
|
102
|
+
ctx.body = {
|
|
103
|
+
installId: install.installId,
|
|
104
|
+
version: install.version,
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -79,6 +79,13 @@ function aiValidation() {
|
|
|
79
79
|
)
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
function recaptchaValidation() {
|
|
83
|
+
return Joi.object({
|
|
84
|
+
siteKey: Joi.string().required(),
|
|
85
|
+
secretKey: Joi.string().required(),
|
|
86
|
+
}).required()
|
|
87
|
+
}
|
|
88
|
+
|
|
82
89
|
function buildConfigSaveValidation() {
|
|
83
90
|
// prettier-ignore
|
|
84
91
|
return auth.joiValidator.body(Joi.object({
|
|
@@ -97,7 +104,8 @@ function buildConfigSaveValidation() {
|
|
|
97
104
|
{ is: ConfigType.GOOGLE, then: googleValidation() },
|
|
98
105
|
{ is: ConfigType.OIDC, then: oidcValidation() },
|
|
99
106
|
{ is: ConfigType.SCIM, then: scimValidation() },
|
|
100
|
-
{ is: ConfigType.AI, then: aiValidation() }
|
|
107
|
+
{ is: ConfigType.AI, then: aiValidation() },
|
|
108
|
+
{ is: ConfigType.RECAPTCHA, then: recaptchaValidation() },
|
|
101
109
|
],
|
|
102
110
|
}),
|
|
103
111
|
}).required().unknown(true),
|
|
@@ -18,6 +18,7 @@ const activateOfflineLicenseValidator = middleware.joiValidator.body(
|
|
|
18
18
|
loggedInRoutes
|
|
19
19
|
.post("/api/global/license/refresh", controller.refresh)
|
|
20
20
|
.get("/api/global/license/usage", controller.getQuotaUsage)
|
|
21
|
+
.get("/api/global/install", controller.getInstallInfo)
|
|
21
22
|
// LICENSE KEY
|
|
22
23
|
.post(
|
|
23
24
|
"/api/global/license/key",
|