@budibase/server 2.7.20 → 2.7.21-alpha.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.
- package/builder/assets/{index.d9b46807.css → index.36462e95.css} +1 -1
- package/builder/assets/{index.1066b334.js → index.77561524.js} +347 -347
- package/builder/index.html +2 -2
- package/dist/automation.js +421 -180
- package/dist/automation.js.map +3 -3
- package/dist/index.js +533 -284
- package/dist/index.js.map +3 -3
- package/dist/query.js +317 -142
- package/dist/query.js.map +3 -3
- package/package.json +11 -11
- package/src/api/controllers/application.ts +1 -1
- package/src/api/controllers/backup.ts +22 -8
- package/src/api/controllers/datasource.ts +41 -24
- package/src/api/controllers/role.ts +5 -5
- package/src/api/controllers/routing.ts +3 -3
- package/src/api/routes/backup.ts +1 -1
- package/src/api/routes/tests/backup.spec.ts +18 -2
- package/src/automations/steps/sendSmtpEmail.ts +55 -4
- package/src/automations/tests/sendSmtpEmail.spec.ts +74 -0
- package/src/events/docUpdates/syncUsers.ts +4 -0
- package/src/integrations/googlesheets.ts +35 -18
- package/src/integrations/mongodb.ts +4 -2
- package/src/integrations/postgres.ts +21 -3
- package/src/middleware/currentapp.ts +1 -1
- package/src/sdk/app/backups/exports.ts +33 -5
- package/src/sdk/app/backups/imports.ts +21 -1
- package/src/sdk/app/datasources/datasources.ts +1 -0
- package/src/utilities/workerRequests.ts +20 -9
- package/src/automations/tests/sendSmtpEmail.spec.js +0 -71
package/dist/query.js
CHANGED
|
@@ -838,6 +838,7 @@ var init_automation2 = __esm({
|
|
|
838
838
|
AutomationIOType2["NUMBER"] = "number";
|
|
839
839
|
AutomationIOType2["ARRAY"] = "array";
|
|
840
840
|
AutomationIOType2["JSON"] = "json";
|
|
841
|
+
AutomationIOType2["DATE"] = "date";
|
|
841
842
|
return AutomationIOType2;
|
|
842
843
|
})(AutomationIOType || {});
|
|
843
844
|
AutomationCustomIOType = /* @__PURE__ */ ((AutomationCustomIOType2) => {
|
|
@@ -10777,7 +10778,7 @@ function lowerBuiltinRoleID(roleId1, roleId2) {
|
|
|
10777
10778
|
}
|
|
10778
10779
|
return builtinRoleToNumber(roleId1) > builtinRoleToNumber(roleId2) ? roleId2 : roleId1;
|
|
10779
10780
|
}
|
|
10780
|
-
async function getRole(roleId) {
|
|
10781
|
+
async function getRole(roleId, opts) {
|
|
10781
10782
|
if (!roleId) {
|
|
10782
10783
|
return void 0;
|
|
10783
10784
|
}
|
|
@@ -10793,6 +10794,9 @@ async function getRole(roleId) {
|
|
|
10793
10794
|
role = Object.assign(role, dbRole);
|
|
10794
10795
|
role._id = getExternalRoleID(role._id);
|
|
10795
10796
|
} catch (err) {
|
|
10797
|
+
if (!isBuiltin(roleId) && (opts == null ? void 0 : opts.defaultPublic)) {
|
|
10798
|
+
return cloneDeep2(BUILTIN_ROLES.PUBLIC);
|
|
10799
|
+
}
|
|
10796
10800
|
if (Object.keys(role).length === 0) {
|
|
10797
10801
|
throw err;
|
|
10798
10802
|
}
|
|
@@ -11481,8 +11485,8 @@ async function preAuth(passport2, ctx, next) {
|
|
|
11481
11485
|
callbackUrl,
|
|
11482
11486
|
ssoSaveUserNoOp
|
|
11483
11487
|
);
|
|
11484
|
-
if (!ctx.query.appId
|
|
11485
|
-
ctx.throw(400, "appId
|
|
11488
|
+
if (!ctx.query.appId) {
|
|
11489
|
+
ctx.throw(400, "appId query param not present.");
|
|
11486
11490
|
}
|
|
11487
11491
|
return passport2.authenticate(strategy, {
|
|
11488
11492
|
scope: ["profile", "email", "https://www.googleapis.com/auth/spreadsheets"],
|
|
@@ -11502,7 +11506,7 @@ async function postAuth(passport2, ctx, next) {
|
|
|
11502
11506
|
clientSecret: config.clientSecret,
|
|
11503
11507
|
callbackURL: callbackUrl
|
|
11504
11508
|
},
|
|
11505
|
-
(accessToken, refreshToken,
|
|
11509
|
+
(accessToken, refreshToken, _profile, done) => {
|
|
11506
11510
|
clearCookie(ctx, "budibase:datasourceauth" /* DatasourceAuth */);
|
|
11507
11511
|
done(null, { accessToken, refreshToken });
|
|
11508
11512
|
}
|
|
@@ -11510,22 +11514,14 @@ async function postAuth(passport2, ctx, next) {
|
|
|
11510
11514
|
{ successRedirect: "/", failureRedirect: "/error" },
|
|
11511
11515
|
async (err, tokens) => {
|
|
11512
11516
|
const baseUrl = `/builder/app/${authStateCookie.appId}/data`;
|
|
11513
|
-
|
|
11514
|
-
|
|
11515
|
-
|
|
11516
|
-
|
|
11517
|
-
|
|
11518
|
-
if (err2.status === 404) {
|
|
11519
|
-
ctx.redirect(baseUrl);
|
|
11520
|
-
}
|
|
11521
|
-
}
|
|
11522
|
-
if (!datasource2.config) {
|
|
11523
|
-
datasource2.config = {};
|
|
11517
|
+
const id = newid();
|
|
11518
|
+
await store(
|
|
11519
|
+
`datasource:creation:${authStateCookie.appId}:google:${id}`,
|
|
11520
|
+
{
|
|
11521
|
+
tokens
|
|
11524
11522
|
}
|
|
11525
|
-
|
|
11526
|
-
|
|
11527
|
-
ctx.redirect(`${baseUrl}/datasource/${authStateCookie.datasourceId}`);
|
|
11528
|
-
});
|
|
11523
|
+
);
|
|
11524
|
+
ctx.redirect(`${baseUrl}/new?continue_google_setup=${id}`);
|
|
11529
11525
|
}
|
|
11530
11526
|
)(ctx, next);
|
|
11531
11527
|
}
|
|
@@ -11575,16 +11571,22 @@ var encryption_exports = {};
|
|
|
11575
11571
|
__export(encryption_exports, {
|
|
11576
11572
|
SecretOption: () => SecretOption,
|
|
11577
11573
|
decrypt: () => decrypt,
|
|
11574
|
+
decryptFile: () => decryptFile,
|
|
11578
11575
|
encrypt: () => encrypt,
|
|
11576
|
+
encryptFile: () => encryptFile,
|
|
11579
11577
|
getSecret: () => getSecret
|
|
11580
11578
|
});
|
|
11581
11579
|
var import_crypto = __toESM(require("crypto"));
|
|
11580
|
+
var import_fs2 = __toESM(require("fs"));
|
|
11581
|
+
var import_zlib = __toESM(require("zlib"));
|
|
11582
11582
|
init_environment2();
|
|
11583
|
+
var import_path2 = require("path");
|
|
11583
11584
|
var ALGO = "aes-256-ctr";
|
|
11584
11585
|
var SEPARATOR3 = "-";
|
|
11585
11586
|
var ITERATIONS = 1e4;
|
|
11586
|
-
var RANDOM_BYTES = 16;
|
|
11587
11587
|
var STRETCH_LENGTH = 32;
|
|
11588
|
+
var SALT_LENGTH = 16;
|
|
11589
|
+
var IV_LENGTH = 16;
|
|
11588
11590
|
var SecretOption = /* @__PURE__ */ ((SecretOption2) => {
|
|
11589
11591
|
SecretOption2["API"] = "api";
|
|
11590
11592
|
SecretOption2["ENCRYPTION"] = "encryption";
|
|
@@ -11608,11 +11610,11 @@ function getSecret(secretOption) {
|
|
|
11608
11610
|
}
|
|
11609
11611
|
return secret;
|
|
11610
11612
|
}
|
|
11611
|
-
function stretchString(
|
|
11612
|
-
return import_crypto.default.pbkdf2Sync(
|
|
11613
|
+
function stretchString(secret, salt) {
|
|
11614
|
+
return import_crypto.default.pbkdf2Sync(secret, salt, ITERATIONS, STRETCH_LENGTH, "sha512");
|
|
11613
11615
|
}
|
|
11614
11616
|
function encrypt(input, secretOption = "api" /* API */) {
|
|
11615
|
-
const salt = import_crypto.default.randomBytes(
|
|
11617
|
+
const salt = import_crypto.default.randomBytes(SALT_LENGTH);
|
|
11616
11618
|
const stretched = stretchString(getSecret(secretOption), salt);
|
|
11617
11619
|
const cipher = import_crypto.default.createCipheriv(ALGO, stretched, salt);
|
|
11618
11620
|
const base = cipher.update(input);
|
|
@@ -11629,6 +11631,87 @@ function decrypt(input, secretOption = "api" /* API */) {
|
|
|
11629
11631
|
const final = decipher.final();
|
|
11630
11632
|
return Buffer.concat([base, final]).toString();
|
|
11631
11633
|
}
|
|
11634
|
+
async function encryptFile({ dir, filename }, secret) {
|
|
11635
|
+
const outputFileName = `${filename}.enc`;
|
|
11636
|
+
const filePath = (0, import_path2.join)(dir, filename);
|
|
11637
|
+
const inputFile = import_fs2.default.createReadStream(filePath);
|
|
11638
|
+
const outputFile = import_fs2.default.createWriteStream((0, import_path2.join)(dir, outputFileName));
|
|
11639
|
+
const salt = import_crypto.default.randomBytes(SALT_LENGTH);
|
|
11640
|
+
const iv = import_crypto.default.randomBytes(IV_LENGTH);
|
|
11641
|
+
const stretched = stretchString(secret, salt);
|
|
11642
|
+
const cipher = import_crypto.default.createCipheriv(ALGO, stretched, iv);
|
|
11643
|
+
outputFile.write(salt);
|
|
11644
|
+
outputFile.write(iv);
|
|
11645
|
+
inputFile.pipe(import_zlib.default.createGzip()).pipe(cipher).pipe(outputFile);
|
|
11646
|
+
return new Promise((r) => {
|
|
11647
|
+
outputFile.on("finish", () => {
|
|
11648
|
+
r({
|
|
11649
|
+
filename: outputFileName,
|
|
11650
|
+
dir
|
|
11651
|
+
});
|
|
11652
|
+
});
|
|
11653
|
+
});
|
|
11654
|
+
}
|
|
11655
|
+
async function getSaltAndIV(path2) {
|
|
11656
|
+
const fileStream = import_fs2.default.createReadStream(path2);
|
|
11657
|
+
const salt = await readBytes(fileStream, SALT_LENGTH);
|
|
11658
|
+
const iv = await readBytes(fileStream, IV_LENGTH);
|
|
11659
|
+
fileStream.close();
|
|
11660
|
+
return { salt, iv };
|
|
11661
|
+
}
|
|
11662
|
+
async function decryptFile(inputPath, outputPath, secret) {
|
|
11663
|
+
const { salt, iv } = await getSaltAndIV(inputPath);
|
|
11664
|
+
const inputFile = import_fs2.default.createReadStream(inputPath, {
|
|
11665
|
+
start: SALT_LENGTH + IV_LENGTH
|
|
11666
|
+
});
|
|
11667
|
+
const outputFile = import_fs2.default.createWriteStream(outputPath);
|
|
11668
|
+
const stretched = stretchString(secret, salt);
|
|
11669
|
+
const decipher = import_crypto.default.createDecipheriv(ALGO, stretched, iv);
|
|
11670
|
+
const unzip = import_zlib.default.createGunzip();
|
|
11671
|
+
inputFile.pipe(decipher).pipe(unzip).pipe(outputFile);
|
|
11672
|
+
return new Promise((res, rej) => {
|
|
11673
|
+
outputFile.on("finish", () => {
|
|
11674
|
+
outputFile.close();
|
|
11675
|
+
res();
|
|
11676
|
+
});
|
|
11677
|
+
inputFile.on("error", (e) => {
|
|
11678
|
+
outputFile.close();
|
|
11679
|
+
rej(e);
|
|
11680
|
+
});
|
|
11681
|
+
decipher.on("error", (e) => {
|
|
11682
|
+
outputFile.close();
|
|
11683
|
+
rej(e);
|
|
11684
|
+
});
|
|
11685
|
+
unzip.on("error", (e) => {
|
|
11686
|
+
outputFile.close();
|
|
11687
|
+
rej(e);
|
|
11688
|
+
});
|
|
11689
|
+
outputFile.on("error", (e) => {
|
|
11690
|
+
outputFile.close();
|
|
11691
|
+
rej(e);
|
|
11692
|
+
});
|
|
11693
|
+
});
|
|
11694
|
+
}
|
|
11695
|
+
function readBytes(stream3, length) {
|
|
11696
|
+
return new Promise((resolve3, reject) => {
|
|
11697
|
+
let bytesRead = 0;
|
|
11698
|
+
const data = [];
|
|
11699
|
+
stream3.on("readable", () => {
|
|
11700
|
+
let chunk;
|
|
11701
|
+
while ((chunk = stream3.read(length - bytesRead)) !== null) {
|
|
11702
|
+
data.push(chunk);
|
|
11703
|
+
bytesRead += chunk.length;
|
|
11704
|
+
}
|
|
11705
|
+
resolve3(Buffer.concat(data));
|
|
11706
|
+
});
|
|
11707
|
+
stream3.on("end", () => {
|
|
11708
|
+
reject(new Error("Insufficient data in the stream."));
|
|
11709
|
+
});
|
|
11710
|
+
stream3.on("error", (error) => {
|
|
11711
|
+
reject(error);
|
|
11712
|
+
});
|
|
11713
|
+
});
|
|
11714
|
+
}
|
|
11632
11715
|
|
|
11633
11716
|
// ../backend-core/src/middleware/authenticated.ts
|
|
11634
11717
|
init_identity();
|
|
@@ -12386,16 +12469,16 @@ var import_aws_sdk = __toESM(require("aws-sdk"));
|
|
|
12386
12469
|
var import_stream = __toESM(require("stream"));
|
|
12387
12470
|
var import_node_fetch6 = __toESM(require("node-fetch"));
|
|
12388
12471
|
var import_tar_fs = __toESM(require("tar-fs"));
|
|
12389
|
-
var
|
|
12472
|
+
var import_zlib2 = __toESM(require("zlib"));
|
|
12390
12473
|
var import_util = require("util");
|
|
12391
|
-
var
|
|
12392
|
-
var
|
|
12474
|
+
var import_path4 = require("path");
|
|
12475
|
+
var import_fs4 = __toESM(require("fs"));
|
|
12393
12476
|
init_environment2();
|
|
12394
12477
|
|
|
12395
12478
|
// ../backend-core/src/objectStore/utils.ts
|
|
12396
|
-
var
|
|
12479
|
+
var import_path3 = require("path");
|
|
12397
12480
|
var import_os = require("os");
|
|
12398
|
-
var
|
|
12481
|
+
var import_fs3 = __toESM(require("fs"));
|
|
12399
12482
|
init_environment2();
|
|
12400
12483
|
var ObjectStoreBuckets = {
|
|
12401
12484
|
BACKUPS: environment_default2.BACKUPS_BUCKET_NAME,
|
|
@@ -12404,9 +12487,9 @@ var ObjectStoreBuckets = {
|
|
|
12404
12487
|
GLOBAL: environment_default2.GLOBAL_BUCKET_NAME,
|
|
12405
12488
|
PLUGINS: environment_default2.PLUGIN_BUCKET_NAME
|
|
12406
12489
|
};
|
|
12407
|
-
var bbTmp = (0,
|
|
12408
|
-
if (!
|
|
12409
|
-
|
|
12490
|
+
var bbTmp = (0, import_path3.join)((0, import_os.tmpdir)(), ".budibase");
|
|
12491
|
+
if (!import_fs3.default.existsSync(bbTmp)) {
|
|
12492
|
+
import_fs3.default.mkdirSync(bbTmp);
|
|
12410
12493
|
}
|
|
12411
12494
|
function budibaseTempDir() {
|
|
12412
12495
|
return bbTmp;
|
|
@@ -12494,7 +12577,7 @@ var upload = async ({
|
|
|
12494
12577
|
metadata: metadata2
|
|
12495
12578
|
}) => {
|
|
12496
12579
|
const extension = filename.split(".").pop();
|
|
12497
|
-
const fileBytes =
|
|
12580
|
+
const fileBytes = import_fs4.default.readFileSync(path2);
|
|
12498
12581
|
const objectStore = ObjectStore(bucketName);
|
|
12499
12582
|
await makeSureBucketExists(objectStore, bucketName);
|
|
12500
12583
|
let contentType = type;
|
|
@@ -12596,13 +12679,13 @@ var retrieveToTmp = async (bucketName, filepath) => {
|
|
|
12596
12679
|
bucketName = sanitizeBucket(bucketName);
|
|
12597
12680
|
filepath = sanitizeKey(filepath);
|
|
12598
12681
|
const data = await retrieve(bucketName, filepath);
|
|
12599
|
-
const outputPath = (0,
|
|
12600
|
-
|
|
12682
|
+
const outputPath = (0, import_path4.join)(budibaseTempDir(), (0, import_uuid3.v4)());
|
|
12683
|
+
import_fs4.default.writeFileSync(outputPath, data);
|
|
12601
12684
|
return outputPath;
|
|
12602
12685
|
};
|
|
12603
12686
|
var retrieveDirectory = async (bucketName, path2) => {
|
|
12604
|
-
let writePath = (0,
|
|
12605
|
-
|
|
12687
|
+
let writePath = (0, import_path4.join)(budibaseTempDir(), (0, import_uuid3.v4)());
|
|
12688
|
+
import_fs4.default.mkdirSync(writePath);
|
|
12606
12689
|
const objects = await listAllObjects(bucketName, path2);
|
|
12607
12690
|
let fullObjects = await Promise.all(
|
|
12608
12691
|
objects.map((obj) => retrieve(bucketName, obj.Key))
|
|
@@ -12614,9 +12697,9 @@ var retrieveDirectory = async (bucketName, path2) => {
|
|
|
12614
12697
|
const possiblePath = filename.split("/");
|
|
12615
12698
|
if (possiblePath.length > 1) {
|
|
12616
12699
|
const dirs = possiblePath.slice(0, possiblePath.length - 1);
|
|
12617
|
-
|
|
12700
|
+
import_fs4.default.mkdirSync((0, import_path4.join)(writePath, ...dirs), { recursive: true });
|
|
12618
12701
|
}
|
|
12619
|
-
|
|
12702
|
+
import_fs4.default.writeFileSync((0, import_path4.join)(writePath, ...possiblePath), data);
|
|
12620
12703
|
}
|
|
12621
12704
|
return writePath;
|
|
12622
12705
|
};
|
|
@@ -12670,14 +12753,14 @@ var deleteFolder = async (bucketName, folder) => {
|
|
|
12670
12753
|
var uploadDirectory = async (bucketName, localPath, bucketPath2) => {
|
|
12671
12754
|
bucketName = sanitizeBucket(bucketName);
|
|
12672
12755
|
let uploads = [];
|
|
12673
|
-
const files2 =
|
|
12756
|
+
const files2 = import_fs4.default.readdirSync(localPath, { withFileTypes: true });
|
|
12674
12757
|
for (let file of files2) {
|
|
12675
|
-
const path2 = sanitizeKey((0,
|
|
12676
|
-
const local = (0,
|
|
12758
|
+
const path2 = sanitizeKey((0, import_path4.join)(bucketPath2, file.name));
|
|
12759
|
+
const local = (0, import_path4.join)(localPath, file.name);
|
|
12677
12760
|
if (file.isDirectory()) {
|
|
12678
12761
|
uploads.push(uploadDirectory(bucketName, local, path2));
|
|
12679
12762
|
} else {
|
|
12680
|
-
uploads.push(streamUpload(bucketName, path2,
|
|
12763
|
+
uploads.push(streamUpload(bucketName, path2, import_fs4.default.createReadStream(local)));
|
|
12681
12764
|
}
|
|
12682
12765
|
}
|
|
12683
12766
|
await Promise.all(uploads);
|
|
@@ -12689,7 +12772,7 @@ var downloadTarballDirect = async (url, path2, headers = {}) => {
|
|
|
12689
12772
|
if (!response.ok) {
|
|
12690
12773
|
throw new Error(`unexpected response ${response.statusText}`);
|
|
12691
12774
|
}
|
|
12692
|
-
await streamPipeline(response.body,
|
|
12775
|
+
await streamPipeline(response.body, import_zlib2.default.createUnzip(), import_tar_fs.default.extract(path2));
|
|
12693
12776
|
};
|
|
12694
12777
|
var downloadTarball = async (url, bucketName, path2) => {
|
|
12695
12778
|
bucketName = sanitizeBucket(bucketName);
|
|
@@ -12698,8 +12781,8 @@ var downloadTarball = async (url, bucketName, path2) => {
|
|
|
12698
12781
|
if (!response.ok) {
|
|
12699
12782
|
throw new Error(`unexpected response ${response.statusText}`);
|
|
12700
12783
|
}
|
|
12701
|
-
const tmpPath = (0,
|
|
12702
|
-
await streamPipeline(response.body,
|
|
12784
|
+
const tmpPath = (0, import_path4.join)(budibaseTempDir(), path2);
|
|
12785
|
+
await streamPipeline(response.body, import_zlib2.default.createUnzip(), import_tar_fs.default.extract(tmpPath));
|
|
12703
12786
|
if (!environment_default2.isTest() && environment_default2.SELF_HOSTED) {
|
|
12704
12787
|
await uploadDirectory(bucketName, tmpPath, path2);
|
|
12705
12788
|
}
|
|
@@ -14171,6 +14254,19 @@ var SCHEMA = {
|
|
|
14171
14254
|
required: false
|
|
14172
14255
|
},
|
|
14173
14256
|
ca: {
|
|
14257
|
+
display: "Server CA",
|
|
14258
|
+
type: "longForm" /* LONGFORM */,
|
|
14259
|
+
default: false,
|
|
14260
|
+
required: false
|
|
14261
|
+
},
|
|
14262
|
+
clientKey: {
|
|
14263
|
+
display: "Client key",
|
|
14264
|
+
type: "longForm" /* LONGFORM */,
|
|
14265
|
+
default: false,
|
|
14266
|
+
required: false
|
|
14267
|
+
},
|
|
14268
|
+
clientCert: {
|
|
14269
|
+
display: "Client cert",
|
|
14174
14270
|
type: "longForm" /* LONGFORM */,
|
|
14175
14271
|
default: false,
|
|
14176
14272
|
required: false
|
|
@@ -14212,7 +14308,9 @@ var PostgresIntegration = class extends sql_default {
|
|
|
14212
14308
|
...this.config,
|
|
14213
14309
|
ssl: this.config.ssl ? {
|
|
14214
14310
|
rejectUnauthorized: this.config.rejectUnauthorized,
|
|
14215
|
-
ca: this.config.ca
|
|
14311
|
+
ca: this.config.ca,
|
|
14312
|
+
key: this.config.clientKey,
|
|
14313
|
+
cert: this.config.clientCert
|
|
14216
14314
|
} : void 0
|
|
14217
14315
|
};
|
|
14218
14316
|
this.client = new import_pg.Client(newConfig);
|
|
@@ -14355,7 +14453,8 @@ var PostgresIntegration = class extends sql_default {
|
|
|
14355
14453
|
try {
|
|
14356
14454
|
await this.openConnection();
|
|
14357
14455
|
const columnsResponse = await this.client.query(this.COLUMNS_SQL);
|
|
14358
|
-
|
|
14456
|
+
const names = columnsResponse.rows.map((row) => row.table_name);
|
|
14457
|
+
return [...new Set(names)];
|
|
14359
14458
|
} finally {
|
|
14360
14459
|
await this.closeConnection();
|
|
14361
14460
|
}
|
|
@@ -14968,6 +15067,8 @@ var MongoIntegration = class {
|
|
|
14968
15067
|
response.connected = true;
|
|
14969
15068
|
} catch (e) {
|
|
14970
15069
|
response.error = e.message;
|
|
15070
|
+
} finally {
|
|
15071
|
+
await this.client.close();
|
|
14971
15072
|
}
|
|
14972
15073
|
return response;
|
|
14973
15074
|
}
|
|
@@ -17235,11 +17336,39 @@ var hasFilters = (query) => {
|
|
|
17235
17336
|
// ../shared-core/src/utils.ts
|
|
17236
17337
|
var utils_exports3 = {};
|
|
17237
17338
|
__export(utils_exports3, {
|
|
17339
|
+
parallelForeach: () => parallelForeach,
|
|
17238
17340
|
unreachable: () => unreachable
|
|
17239
17341
|
});
|
|
17240
17342
|
function unreachable(value, message = `No such case in exhaustive switch: ${value}`) {
|
|
17241
17343
|
throw new Error(message);
|
|
17242
17344
|
}
|
|
17345
|
+
async function parallelForeach(items, task, maxConcurrency) {
|
|
17346
|
+
const promises = [];
|
|
17347
|
+
let index2 = 0;
|
|
17348
|
+
const processItem = async (item) => {
|
|
17349
|
+
try {
|
|
17350
|
+
await task(item);
|
|
17351
|
+
} finally {
|
|
17352
|
+
processNext();
|
|
17353
|
+
}
|
|
17354
|
+
};
|
|
17355
|
+
const processNext = () => {
|
|
17356
|
+
if (index2 >= items.length) {
|
|
17357
|
+
return;
|
|
17358
|
+
}
|
|
17359
|
+
const item = items[index2];
|
|
17360
|
+
index2++;
|
|
17361
|
+
const promise = processItem(item);
|
|
17362
|
+
promises.push(promise);
|
|
17363
|
+
if (promises.length >= maxConcurrency) {
|
|
17364
|
+
Promise.race(promises).then(processNext);
|
|
17365
|
+
} else {
|
|
17366
|
+
processNext();
|
|
17367
|
+
}
|
|
17368
|
+
};
|
|
17369
|
+
processNext();
|
|
17370
|
+
await Promise.all(promises);
|
|
17371
|
+
}
|
|
17243
17372
|
|
|
17244
17373
|
// src/integrations/googlesheets.ts
|
|
17245
17374
|
var ALLOWED_TYPES = [
|
|
@@ -17268,7 +17397,7 @@ var SCHEMA12 = {
|
|
|
17268
17397
|
},
|
|
17269
17398
|
datasource: {
|
|
17270
17399
|
spreadsheetId: {
|
|
17271
|
-
display: "
|
|
17400
|
+
display: "Spreadsheet URL",
|
|
17272
17401
|
type: "string" /* STRING */,
|
|
17273
17402
|
required: true
|
|
17274
17403
|
}
|
|
@@ -17389,6 +17518,7 @@ var GoogleSheetsIntegration = class {
|
|
|
17389
17518
|
async connect() {
|
|
17390
17519
|
var _a;
|
|
17391
17520
|
try {
|
|
17521
|
+
await setupCreationAuth(this.config);
|
|
17392
17522
|
let googleConfig = await configs_exports.getGoogleDatasourceConfig();
|
|
17393
17523
|
if (!googleConfig) {
|
|
17394
17524
|
throw new HTTPError("Google config not found", 400);
|
|
@@ -17439,21 +17569,22 @@ var GoogleSheetsIntegration = class {
|
|
|
17439
17569
|
return table;
|
|
17440
17570
|
}
|
|
17441
17571
|
async buildSchema(datasourceId, entities) {
|
|
17442
|
-
if (!this.config.auth) {
|
|
17443
|
-
return;
|
|
17444
|
-
}
|
|
17445
17572
|
await this.connect();
|
|
17446
17573
|
const sheets = this.client.sheetsByIndex;
|
|
17447
17574
|
const tables = {};
|
|
17448
|
-
|
|
17449
|
-
|
|
17450
|
-
|
|
17451
|
-
|
|
17452
|
-
sheet.title
|
|
17453
|
-
sheet.
|
|
17454
|
-
|
|
17455
|
-
|
|
17456
|
-
|
|
17575
|
+
await utils_exports3.parallelForeach(
|
|
17576
|
+
sheets,
|
|
17577
|
+
async (sheet) => {
|
|
17578
|
+
await sheet.getRows({ limit: 0, offset: 0 });
|
|
17579
|
+
const id = buildExternalTableId(datasourceId, sheet.title);
|
|
17580
|
+
tables[sheet.title] = this.getTableSchema(
|
|
17581
|
+
sheet.title,
|
|
17582
|
+
sheet.headerValues,
|
|
17583
|
+
id
|
|
17584
|
+
);
|
|
17585
|
+
},
|
|
17586
|
+
10
|
|
17587
|
+
);
|
|
17457
17588
|
const final = finaliseExternalTables(tables, entities);
|
|
17458
17589
|
this.tables = final.tables;
|
|
17459
17590
|
this.schemaErrors = final.errors;
|
|
@@ -17699,6 +17830,16 @@ var GoogleSheetsIntegration = class {
|
|
|
17699
17830
|
}
|
|
17700
17831
|
}
|
|
17701
17832
|
};
|
|
17833
|
+
async function setupCreationAuth(datasouce) {
|
|
17834
|
+
if (datasouce.continueSetupId) {
|
|
17835
|
+
const appId = context_exports.getAppId();
|
|
17836
|
+
const tokens = await cache_exports.get(
|
|
17837
|
+
`datasource:creation:${appId}:google:${datasouce.continueSetupId}`
|
|
17838
|
+
);
|
|
17839
|
+
datasouce.auth = tokens.tokens;
|
|
17840
|
+
delete datasouce.continueSetupId;
|
|
17841
|
+
}
|
|
17842
|
+
}
|
|
17702
17843
|
var googlesheets_default = {
|
|
17703
17844
|
schema: SCHEMA12,
|
|
17704
17845
|
integration: GoogleSheetsIntegration
|
|
@@ -18477,24 +18618,24 @@ init_src();
|
|
|
18477
18618
|
var budibaseTempDir2 = objectStore_exports2.budibaseTempDir;
|
|
18478
18619
|
|
|
18479
18620
|
// src/utilities/fileSystem/app.ts
|
|
18480
|
-
var
|
|
18621
|
+
var import_path6 = require("path");
|
|
18481
18622
|
|
|
18482
18623
|
// src/utilities/fileSystem/filesystem.ts
|
|
18483
|
-
var
|
|
18484
|
-
var
|
|
18624
|
+
var import_fs5 = __toESM(require("fs"));
|
|
18625
|
+
var import_path5 = require("path");
|
|
18485
18626
|
var import_tar = __toESM(require("tar"));
|
|
18486
18627
|
var uuid2 = require("uuid/v4");
|
|
18487
|
-
var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0,
|
|
18628
|
+
var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0, import_path5.resolve)((0, import_path5.join)(__dirname, "..", "..", ".."));
|
|
18488
18629
|
var streamFile = (path2) => {
|
|
18489
|
-
return
|
|
18630
|
+
return import_fs5.default.createReadStream(path2);
|
|
18490
18631
|
};
|
|
18491
18632
|
var createTempFolder = (item) => {
|
|
18492
|
-
const path2 = (0,
|
|
18633
|
+
const path2 = (0, import_path5.join)(budibaseTempDir2(), item);
|
|
18493
18634
|
try {
|
|
18494
|
-
if (
|
|
18495
|
-
|
|
18635
|
+
if (import_fs5.default.existsSync(path2)) {
|
|
18636
|
+
import_fs5.default.rmSync(path2, { recursive: true, force: true });
|
|
18496
18637
|
}
|
|
18497
|
-
|
|
18638
|
+
import_fs5.default.mkdirSync(path2);
|
|
18498
18639
|
} catch (err) {
|
|
18499
18640
|
throw new Error(`Path cannot be created: ${err.message}`);
|
|
18500
18641
|
}
|
|
@@ -18508,18 +18649,18 @@ var extractTarball = async (fromFilePath, toPath) => {
|
|
|
18508
18649
|
};
|
|
18509
18650
|
|
|
18510
18651
|
// src/utilities/fileSystem/app.ts
|
|
18511
|
-
var NODE_MODULES_PATH = (0,
|
|
18652
|
+
var NODE_MODULES_PATH = (0, import_path6.join)(TOP_LEVEL_PATH, "node_modules");
|
|
18512
18653
|
|
|
18513
18654
|
// src/utilities/fileSystem/plugin.ts
|
|
18514
|
-
var
|
|
18515
|
-
var
|
|
18516
|
-
var DATASOURCE_PATH = (0,
|
|
18517
|
-
var AUTOMATION_PATH = (0,
|
|
18655
|
+
var import_fs6 = __toESM(require("fs"));
|
|
18656
|
+
var import_path7 = require("path");
|
|
18657
|
+
var DATASOURCE_PATH = (0, import_path7.join)(budibaseTempDir2(), "datasource");
|
|
18658
|
+
var AUTOMATION_PATH = (0, import_path7.join)(budibaseTempDir2(), "automation");
|
|
18518
18659
|
var getPluginMetadata = async (path2) => {
|
|
18519
18660
|
let metadata2 = {};
|
|
18520
18661
|
try {
|
|
18521
|
-
const pkg2 =
|
|
18522
|
-
const schema =
|
|
18662
|
+
const pkg2 = import_fs6.default.readFileSync((0, import_path7.join)(path2, "package.json"), "utf8");
|
|
18663
|
+
const schema = import_fs6.default.readFileSync((0, import_path7.join)(path2, "schema.json"), "utf8");
|
|
18523
18664
|
metadata2.schema = JSON.parse(schema);
|
|
18524
18665
|
metadata2.package = JSON.parse(pkg2);
|
|
18525
18666
|
if (!metadata2.package.name || !metadata2.package.version || !metadata2.package.description) {
|
|
@@ -18537,19 +18678,19 @@ var getPluginMetadata = async (path2) => {
|
|
|
18537
18678
|
async function getPluginImpl(path2, plugin) {
|
|
18538
18679
|
var _a;
|
|
18539
18680
|
const hash3 = (_a = plugin.schema) == null ? void 0 : _a.hash;
|
|
18540
|
-
if (!
|
|
18541
|
-
|
|
18681
|
+
if (!import_fs6.default.existsSync(path2)) {
|
|
18682
|
+
import_fs6.default.mkdirSync(path2);
|
|
18542
18683
|
}
|
|
18543
|
-
const filename = (0,
|
|
18684
|
+
const filename = (0, import_path7.join)(path2, plugin.name);
|
|
18544
18685
|
const metadataName = `${filename}.bbmetadata`;
|
|
18545
|
-
if (
|
|
18546
|
-
const currentHash =
|
|
18686
|
+
if (import_fs6.default.existsSync(filename)) {
|
|
18687
|
+
const currentHash = import_fs6.default.readFileSync(metadataName, "utf8");
|
|
18547
18688
|
if (currentHash === hash3) {
|
|
18548
18689
|
return require(filename);
|
|
18549
18690
|
} else {
|
|
18550
18691
|
console.log(`Updating plugin: ${plugin.name}`);
|
|
18551
18692
|
delete require.cache[require.resolve(filename)];
|
|
18552
|
-
|
|
18693
|
+
import_fs6.default.unlinkSync(filename);
|
|
18553
18694
|
}
|
|
18554
18695
|
}
|
|
18555
18696
|
const pluginKey = objectStore_exports2.getPluginJSKey(plugin);
|
|
@@ -18557,8 +18698,8 @@ async function getPluginImpl(path2, plugin) {
|
|
|
18557
18698
|
objectStore_exports2.ObjectStoreBuckets.PLUGINS,
|
|
18558
18699
|
pluginKey
|
|
18559
18700
|
);
|
|
18560
|
-
|
|
18561
|
-
|
|
18701
|
+
import_fs6.default.writeFileSync(filename, pluginJs);
|
|
18702
|
+
import_fs6.default.writeFileSync(metadataName, hash3);
|
|
18562
18703
|
return require(filename);
|
|
18563
18704
|
}
|
|
18564
18705
|
var getDatasourcePlugin = async (plugin) => {
|
|
@@ -18593,19 +18734,20 @@ var GLOBAL_DB_EXPORT_FILE = "global.txt";
|
|
|
18593
18734
|
var STATIC_APP_FILES = ["manifest.json", "budibase-client.js"];
|
|
18594
18735
|
|
|
18595
18736
|
// src/sdk/app/backups/exports.ts
|
|
18596
|
-
var
|
|
18597
|
-
var
|
|
18737
|
+
var import_fs7 = __toESM(require("fs"));
|
|
18738
|
+
var import_path8 = require("path");
|
|
18739
|
+
var import_tar2 = __toESM(require("tar"));
|
|
18598
18740
|
var uuid3 = require("uuid/v4");
|
|
18599
|
-
var tar3 = require("tar");
|
|
18600
18741
|
var MemoryStream = require("memorystream");
|
|
18601
18742
|
function tarFilesToTmp(tmpDir, files2) {
|
|
18602
|
-
const
|
|
18603
|
-
|
|
18743
|
+
const fileName = `${uuid3()}.tar.gz`;
|
|
18744
|
+
const exportFile = (0, import_path8.join)(budibaseTempDir2(), fileName);
|
|
18745
|
+
import_tar2.default.create(
|
|
18604
18746
|
{
|
|
18605
18747
|
sync: true,
|
|
18606
18748
|
gzip: true,
|
|
18607
18749
|
file: exportFile,
|
|
18608
|
-
|
|
18750
|
+
noDirRecurse: false,
|
|
18609
18751
|
cwd: tmpDir
|
|
18610
18752
|
},
|
|
18611
18753
|
files2
|
|
@@ -18622,7 +18764,7 @@ async function exportDB(dbName, opts = {}) {
|
|
|
18622
18764
|
return db_exports.doWithDB(dbName, async (db2) => {
|
|
18623
18765
|
if (opts == null ? void 0 : opts.exportPath) {
|
|
18624
18766
|
const path2 = opts == null ? void 0 : opts.exportPath;
|
|
18625
|
-
const writeStream =
|
|
18767
|
+
const writeStream = import_fs7.default.createWriteStream(path2);
|
|
18626
18768
|
await db2.dump(writeStream, exportOpts);
|
|
18627
18769
|
return path2;
|
|
18628
18770
|
} else {
|
|
@@ -18655,9 +18797,9 @@ async function exportApp(appId, config) {
|
|
|
18655
18797
|
for (let path2 of STATIC_APP_FILES) {
|
|
18656
18798
|
const contents = await objectStore_exports2.retrieve(
|
|
18657
18799
|
ObjectStoreBuckets2.APPS,
|
|
18658
|
-
(0,
|
|
18800
|
+
(0, import_path8.join)(appPath, path2)
|
|
18659
18801
|
);
|
|
18660
|
-
|
|
18802
|
+
import_fs7.default.writeFileSync((0, import_path8.join)(tmpPath, path2), contents);
|
|
18661
18803
|
}
|
|
18662
18804
|
} else {
|
|
18663
18805
|
tmpPath = await objectStore_exports2.retrieveDirectory(
|
|
@@ -18666,33 +18808,48 @@ async function exportApp(appId, config) {
|
|
|
18666
18808
|
);
|
|
18667
18809
|
}
|
|
18668
18810
|
}
|
|
18669
|
-
const downloadedPath = (0,
|
|
18670
|
-
if (
|
|
18671
|
-
const allFiles =
|
|
18811
|
+
const downloadedPath = (0, import_path8.join)(tmpPath, appPath);
|
|
18812
|
+
if (import_fs7.default.existsSync(downloadedPath)) {
|
|
18813
|
+
const allFiles = import_fs7.default.readdirSync(downloadedPath);
|
|
18672
18814
|
for (let file of allFiles) {
|
|
18673
|
-
const path2 = (0,
|
|
18674
|
-
|
|
18815
|
+
const path2 = (0, import_path8.join)(downloadedPath, file);
|
|
18816
|
+
import_fs7.default.renameSync(path2, (0, import_path8.join)(downloadedPath, "..", file));
|
|
18675
18817
|
}
|
|
18676
|
-
|
|
18818
|
+
import_fs7.default.rmdirSync(downloadedPath);
|
|
18677
18819
|
}
|
|
18678
|
-
const dbPath = (0,
|
|
18820
|
+
const dbPath = (0, import_path8.join)(tmpPath, DB_EXPORT_FILE);
|
|
18679
18821
|
await exportDB(appId, {
|
|
18680
18822
|
filter: defineFilter(config == null ? void 0 : config.excludeRows, config == null ? void 0 : config.excludeLogs),
|
|
18681
18823
|
exportPath: dbPath
|
|
18682
18824
|
});
|
|
18825
|
+
if (config == null ? void 0 : config.encryptPassword) {
|
|
18826
|
+
for (let file of import_fs7.default.readdirSync(tmpPath)) {
|
|
18827
|
+
const path2 = (0, import_path8.join)(tmpPath, file);
|
|
18828
|
+
await encryption_exports.encryptFile(
|
|
18829
|
+
{ dir: tmpPath, filename: file },
|
|
18830
|
+
config.encryptPassword
|
|
18831
|
+
);
|
|
18832
|
+
import_fs7.default.rmSync(path2);
|
|
18833
|
+
}
|
|
18834
|
+
}
|
|
18683
18835
|
if (config == null ? void 0 : config.tar) {
|
|
18684
|
-
const tarPath = tarFilesToTmp(tmpPath,
|
|
18685
|
-
|
|
18836
|
+
const tarPath = tarFilesToTmp(tmpPath, import_fs7.default.readdirSync(tmpPath));
|
|
18837
|
+
import_fs7.default.rmSync(tmpPath, { recursive: true, force: true });
|
|
18686
18838
|
return tarPath;
|
|
18687
18839
|
} else {
|
|
18688
18840
|
return tmpPath;
|
|
18689
18841
|
}
|
|
18690
18842
|
}
|
|
18691
|
-
async function streamExportApp(
|
|
18843
|
+
async function streamExportApp({
|
|
18844
|
+
appId,
|
|
18845
|
+
excludeRows,
|
|
18846
|
+
encryptPassword
|
|
18847
|
+
}) {
|
|
18692
18848
|
const tmpPath = await exportApp(appId, {
|
|
18693
18849
|
excludeRows,
|
|
18694
18850
|
excludeLogs: true,
|
|
18695
|
-
tar: true
|
|
18851
|
+
tar: true,
|
|
18852
|
+
encryptPassword
|
|
18696
18853
|
});
|
|
18697
18854
|
return streamFile(tmpPath);
|
|
18698
18855
|
}
|
|
@@ -18706,8 +18863,8 @@ __export(imports_exports, {
|
|
|
18706
18863
|
untarFile: () => untarFile,
|
|
18707
18864
|
updateAttachmentColumns: () => updateAttachmentColumns
|
|
18708
18865
|
});
|
|
18709
|
-
var
|
|
18710
|
-
var
|
|
18866
|
+
var import_path9 = require("path");
|
|
18867
|
+
var import_fs8 = __toESM(require("fs"));
|
|
18711
18868
|
init_src();
|
|
18712
18869
|
var uuid4 = require("uuid/v4");
|
|
18713
18870
|
var tar4 = require("tar");
|
|
@@ -18774,16 +18931,16 @@ async function getTemplateStream(template) {
|
|
|
18774
18931
|
throw new Error("Cannot import a non-text based file.");
|
|
18775
18932
|
}
|
|
18776
18933
|
if (template.file) {
|
|
18777
|
-
return
|
|
18934
|
+
return import_fs8.default.createReadStream(template.file.path);
|
|
18778
18935
|
} else if (template.key) {
|
|
18779
18936
|
const [type, name2] = template.key.split("/");
|
|
18780
18937
|
const tmpPath = await downloadTemplate(type, name2);
|
|
18781
|
-
return
|
|
18938
|
+
return import_fs8.default.createReadStream((0, import_path9.join)(tmpPath, name2, "db", "dump.txt"));
|
|
18782
18939
|
}
|
|
18783
18940
|
}
|
|
18784
18941
|
function untarFile(file) {
|
|
18785
|
-
const tmpPath = (0,
|
|
18786
|
-
|
|
18942
|
+
const tmpPath = (0, import_path9.join)(budibaseTempDir2(), uuid4());
|
|
18943
|
+
import_fs8.default.mkdirSync(tmpPath);
|
|
18787
18944
|
tar4.extract({
|
|
18788
18945
|
sync: true,
|
|
18789
18946
|
cwd: tmpPath,
|
|
@@ -18791,31 +18948,49 @@ function untarFile(file) {
|
|
|
18791
18948
|
});
|
|
18792
18949
|
return tmpPath;
|
|
18793
18950
|
}
|
|
18951
|
+
async function decryptFiles(path2, password) {
|
|
18952
|
+
try {
|
|
18953
|
+
for (let file of import_fs8.default.readdirSync(path2)) {
|
|
18954
|
+
const inputPath = (0, import_path9.join)(path2, file);
|
|
18955
|
+
const outputPath = inputPath.replace(/\.enc$/, "");
|
|
18956
|
+
await encryption_exports.decryptFile(inputPath, outputPath, password);
|
|
18957
|
+
import_fs8.default.rmSync(inputPath);
|
|
18958
|
+
}
|
|
18959
|
+
} catch (err) {
|
|
18960
|
+
if (err.message === "incorrect header check") {
|
|
18961
|
+
throw new Error("File cannot be imported");
|
|
18962
|
+
}
|
|
18963
|
+
throw err;
|
|
18964
|
+
}
|
|
18965
|
+
}
|
|
18794
18966
|
function getGlobalDBFile(tmpPath) {
|
|
18795
|
-
return
|
|
18967
|
+
return import_fs8.default.readFileSync((0, import_path9.join)(tmpPath, GLOBAL_DB_EXPORT_FILE), "utf8");
|
|
18796
18968
|
}
|
|
18797
18969
|
function getListOfAppsInMulti(tmpPath) {
|
|
18798
|
-
return
|
|
18970
|
+
return import_fs8.default.readdirSync(tmpPath).filter((dir) => dir !== GLOBAL_DB_EXPORT_FILE);
|
|
18799
18971
|
}
|
|
18800
18972
|
async function importApp(appId, db2, template) {
|
|
18801
18973
|
var _a, _b;
|
|
18802
18974
|
let prodAppId = db_exports.getProdAppID(appId);
|
|
18803
18975
|
let dbStream;
|
|
18804
18976
|
const isTar = template.file && ((_b = (_a = template == null ? void 0 : template.file) == null ? void 0 : _a.type) == null ? void 0 : _b.endsWith("gzip"));
|
|
18805
|
-
const isDirectory = template.file &&
|
|
18977
|
+
const isDirectory = template.file && import_fs8.default.lstatSync(template.file.path).isDirectory();
|
|
18806
18978
|
if (template.file && (isTar || isDirectory)) {
|
|
18807
18979
|
const tmpPath = isTar ? untarFile(template.file) : template.file.path;
|
|
18808
|
-
|
|
18980
|
+
if (isTar && template.file.password) {
|
|
18981
|
+
await decryptFiles(tmpPath, template.file.password);
|
|
18982
|
+
}
|
|
18983
|
+
const contents = import_fs8.default.readdirSync(tmpPath);
|
|
18809
18984
|
if (contents.length) {
|
|
18810
18985
|
let promises = [];
|
|
18811
18986
|
let excludedFiles = [GLOBAL_DB_EXPORT_FILE, DB_EXPORT_FILE];
|
|
18812
18987
|
for (let filename of contents) {
|
|
18813
|
-
const path2 = (0,
|
|
18988
|
+
const path2 = (0, import_path9.join)(tmpPath, filename);
|
|
18814
18989
|
if (excludedFiles.includes(filename)) {
|
|
18815
18990
|
continue;
|
|
18816
18991
|
}
|
|
18817
|
-
filename = (0,
|
|
18818
|
-
if (
|
|
18992
|
+
filename = (0, import_path9.join)(prodAppId, filename);
|
|
18993
|
+
if (import_fs8.default.lstatSync(path2).isDirectory()) {
|
|
18819
18994
|
promises.push(
|
|
18820
18995
|
objectStore_exports2.uploadDirectory(ObjectStoreBuckets2.APPS, path2, filename)
|
|
18821
18996
|
);
|
|
@@ -18831,7 +19006,7 @@ async function importApp(appId, db2, template) {
|
|
|
18831
19006
|
}
|
|
18832
19007
|
await Promise.all(promises);
|
|
18833
19008
|
}
|
|
18834
|
-
dbStream =
|
|
19009
|
+
dbStream = import_fs8.default.createReadStream((0, import_path9.join)(tmpPath, DB_EXPORT_FILE));
|
|
18835
19010
|
} else {
|
|
18836
19011
|
dbStream = await getTemplateStream(template);
|
|
18837
19012
|
}
|
|
@@ -19950,17 +20125,17 @@ __export(version_exports, {
|
|
|
19950
20125
|
getLicenseVersion: () => getLicenseVersion,
|
|
19951
20126
|
getProVersion: () => getProVersion
|
|
19952
20127
|
});
|
|
19953
|
-
var
|
|
19954
|
-
var
|
|
20128
|
+
var import_fs9 = __toESM(require("fs"));
|
|
20129
|
+
var import_path10 = __toESM(require("path"));
|
|
19955
20130
|
var getLicenseVersion = () => {
|
|
19956
20131
|
if (environment_default2.isDev()) {
|
|
19957
20132
|
const DEV_VER_FILENAME = "dev-version.txt";
|
|
19958
|
-
const verFile =
|
|
19959
|
-
if (
|
|
19960
|
-
return
|
|
20133
|
+
const verFile = import_path10.default.join(objectStore_exports2.budibaseTempDir(), DEV_VER_FILENAME);
|
|
20134
|
+
if (import_fs9.default.existsSync(verFile)) {
|
|
20135
|
+
return import_fs9.default.readFileSync(verFile, "utf8");
|
|
19961
20136
|
} else {
|
|
19962
20137
|
const devVer = utils_exports2.newid();
|
|
19963
|
-
|
|
20138
|
+
import_fs9.default.writeFileSync(verFile, devVer);
|
|
19964
20139
|
return devVer;
|
|
19965
20140
|
}
|
|
19966
20141
|
} else {
|
|
@@ -20319,16 +20494,16 @@ __export(offline_exports, {
|
|
|
20319
20494
|
getOfflineLicense: () => getOfflineLicense,
|
|
20320
20495
|
writeOfflineLicenseToDisk: () => writeOfflineLicenseToDisk
|
|
20321
20496
|
});
|
|
20322
|
-
var
|
|
20323
|
-
var
|
|
20497
|
+
var import_fs10 = __toESM(require("fs"));
|
|
20498
|
+
var import_path11 = require("path");
|
|
20324
20499
|
var import_os2 = require("os");
|
|
20325
20500
|
var import_jsonwebtoken = __toESM(require("jsonwebtoken"));
|
|
20326
20501
|
var SUB_DIRECTORY = environment_default2.isTest() ? ".budibase-test" : ".budibase";
|
|
20327
|
-
var DIRECTORY = (0,
|
|
20502
|
+
var DIRECTORY = (0, import_path11.join)((0, import_os2.tmpdir)(), SUB_DIRECTORY);
|
|
20328
20503
|
var OFFLINE_LICENSE_FILE = "offline_license.txt";
|
|
20329
|
-
var LICENSE_FILE_PATH = (0,
|
|
20330
|
-
if (!
|
|
20331
|
-
|
|
20504
|
+
var LICENSE_FILE_PATH = (0, import_path11.join)(DIRECTORY, OFFLINE_LICENSE_FILE);
|
|
20505
|
+
if (!import_fs10.default.existsSync(DIRECTORY)) {
|
|
20506
|
+
import_fs10.default.mkdirSync(DIRECTORY);
|
|
20332
20507
|
}
|
|
20333
20508
|
var PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvz3jePLCFBXZ19c8Dpkv\nXtSgOhKFOcvQdo/LV0KJRUzQWDPWuO4ILtBtnqhjtIzZH4CH0qCYBet5L6Qr4CM1\nl2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C\n8suunQP5bEScqEY2kclqzSf8e6xqMzPUg3mL/pNa1iEv7TuLbU9nJfgR36l0WmZY\n94fWnSaT8OSXSqcxsaByf06gfS3HAoTJNc7eqz1Hf9fUORQGPUAnFK8cT3SfdA36\nd/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR\nmwIDAQAB\n-----END PUBLIC KEY-----\n";
|
|
20334
20509
|
function getOfflineLicense() {
|
|
@@ -20339,16 +20514,16 @@ function getOfflineLicense() {
|
|
|
20339
20514
|
}
|
|
20340
20515
|
}
|
|
20341
20516
|
function getOfflineLicenseFromDisk() {
|
|
20342
|
-
if (
|
|
20343
|
-
const token =
|
|
20517
|
+
if (import_fs10.default.existsSync(LICENSE_FILE_PATH)) {
|
|
20518
|
+
const token = import_fs10.default.readFileSync(LICENSE_FILE_PATH, { encoding: "utf-8" });
|
|
20344
20519
|
return import_jsonwebtoken.default.verify(token, PUBLIC_KEY, { algorithms: ["RS256"] });
|
|
20345
20520
|
}
|
|
20346
20521
|
}
|
|
20347
20522
|
function writeOfflineLicenseToDisk(signedLicense) {
|
|
20348
|
-
|
|
20523
|
+
import_fs10.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
|
|
20349
20524
|
}
|
|
20350
20525
|
function deleteOfflineLicense() {
|
|
20351
|
-
|
|
20526
|
+
import_fs10.default.rmSync(LICENSE_FILE_PATH, { force: true });
|
|
20352
20527
|
}
|
|
20353
20528
|
|
|
20354
20529
|
// ../pro/packages/pro/src/sdk/licensing/licenses/licenses.ts
|
|
@@ -21553,10 +21728,10 @@ __export(plugins_exports, {
|
|
|
21553
21728
|
init_src();
|
|
21554
21729
|
|
|
21555
21730
|
// ../pro/packages/pro/src/utilities/fileSystem.ts
|
|
21556
|
-
var
|
|
21557
|
-
var
|
|
21731
|
+
var import_fs11 = __toESM(require("fs"));
|
|
21732
|
+
var import_path12 = require("path");
|
|
21558
21733
|
function loadJSFile(directory2, name2) {
|
|
21559
|
-
return
|
|
21734
|
+
return import_fs11.default.readFileSync((0, import_path12.join)(directory2, name2), "utf8");
|
|
21560
21735
|
}
|
|
21561
21736
|
|
|
21562
21737
|
// ../pro/packages/pro/src/sdk/plugins/index.ts
|
|
@@ -22193,7 +22368,7 @@ __export(processing_exports, {
|
|
|
22193
22368
|
init: () => init12
|
|
22194
22369
|
});
|
|
22195
22370
|
init_src();
|
|
22196
|
-
var
|
|
22371
|
+
var import_fs12 = __toESM(require("fs"));
|
|
22197
22372
|
async function init12(opts) {
|
|
22198
22373
|
await getBackupQueue().process(async (job) => {
|
|
22199
22374
|
const data = job.data;
|
|
@@ -22261,8 +22436,8 @@ async function runBackup(trigger, tenantId, appId, opts) {
|
|
|
22261
22436
|
}
|
|
22262
22437
|
});
|
|
22263
22438
|
await updateMetadata("complete" /* COMPLETE */, { filename, contents });
|
|
22264
|
-
if (
|
|
22265
|
-
|
|
22439
|
+
if (import_fs12.default.existsSync(tarPath)) {
|
|
22440
|
+
import_fs12.default.rmSync(tarPath);
|
|
22266
22441
|
}
|
|
22267
22442
|
} catch (err) {
|
|
22268
22443
|
logging_exports.logAlert("App backup error", err);
|
|
@@ -22715,7 +22890,7 @@ router3.post(
|
|
|
22715
22890
|
|
|
22716
22891
|
// ../pro/packages/pro/src/api/controllers/apps/backups.ts
|
|
22717
22892
|
init_src();
|
|
22718
|
-
var
|
|
22893
|
+
var import_fs13 = __toESM(require("fs"));
|
|
22719
22894
|
async function checkAppID(ctx, appId) {
|
|
22720
22895
|
if (!await utils_exports5.appExists(appId)) {
|
|
22721
22896
|
ctx.throw(400, `Provided app ID: ${appId} - is invalid.`);
|
|
@@ -22801,7 +22976,7 @@ async function downloadBackup(ctx) {
|
|
|
22801
22976
|
const backupId = ctx.params.backupId;
|
|
22802
22977
|
const { metadata: metadata2, path: path2 } = await backups_default2.downloadAppBackup(backupId);
|
|
22803
22978
|
ctx.attachment(`backup-${metadata2.timestamp}.tar.gz`);
|
|
22804
|
-
ctx.body =
|
|
22979
|
+
ctx.body = import_fs13.default.createReadStream(path2);
|
|
22805
22980
|
}
|
|
22806
22981
|
|
|
22807
22982
|
// ../pro/packages/pro/src/api/routes/apps/backups.ts
|