@budibase/server 2.7.20-alpha.0 → 2.7.20
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.6b48215f.js → index.1066b334.js} +371 -371
- package/builder/assets/{index.2e9069f3.css → index.d9b46807.css} +1 -1
- package/builder/index.html +2 -2
- package/dist/automation.js +179 -405
- package/dist/automation.js.map +3 -3
- package/dist/index.js +284 -517
- package/dist/index.js.map +3 -3
- package/dist/query.js +141 -301
- package/dist/query.js.map +3 -3
- package/package.json +11 -11
- package/src/api/controllers/application.ts +24 -21
- package/src/api/controllers/backup.ts +8 -22
- package/src/api/controllers/datasource.ts +24 -41
- 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 +2 -18
- package/src/automations/steps/sendSmtpEmail.ts +4 -55
- package/src/automations/tests/sendSmtpEmail.spec.js +71 -0
- package/src/events/docUpdates/syncUsers.ts +0 -4
- package/src/integrations/googlesheets.ts +18 -35
- package/src/integrations/mongodb.ts +2 -4
- package/src/integrations/postgres.ts +1 -2
- package/src/middleware/currentapp.ts +1 -1
- package/src/sdk/app/backups/exports.ts +5 -33
- package/src/sdk/app/backups/imports.ts +1 -21
- package/src/sdk/app/datasources/datasources.ts +0 -1
- package/src/utilities/workerRequests.ts +9 -20
- package/src/automations/tests/sendSmtpEmail.spec.ts +0 -74
package/dist/query.js
CHANGED
|
@@ -838,7 +838,6 @@ var init_automation2 = __esm({
|
|
|
838
838
|
AutomationIOType2["NUMBER"] = "number";
|
|
839
839
|
AutomationIOType2["ARRAY"] = "array";
|
|
840
840
|
AutomationIOType2["JSON"] = "json";
|
|
841
|
-
AutomationIOType2["DATE"] = "date";
|
|
842
841
|
return AutomationIOType2;
|
|
843
842
|
})(AutomationIOType || {});
|
|
844
843
|
AutomationCustomIOType = /* @__PURE__ */ ((AutomationCustomIOType2) => {
|
|
@@ -10778,7 +10777,7 @@ function lowerBuiltinRoleID(roleId1, roleId2) {
|
|
|
10778
10777
|
}
|
|
10779
10778
|
return builtinRoleToNumber(roleId1) > builtinRoleToNumber(roleId2) ? roleId2 : roleId1;
|
|
10780
10779
|
}
|
|
10781
|
-
async function getRole(roleId
|
|
10780
|
+
async function getRole(roleId) {
|
|
10782
10781
|
if (!roleId) {
|
|
10783
10782
|
return void 0;
|
|
10784
10783
|
}
|
|
@@ -10794,9 +10793,6 @@ async function getRole(roleId, opts) {
|
|
|
10794
10793
|
role = Object.assign(role, dbRole);
|
|
10795
10794
|
role._id = getExternalRoleID(role._id);
|
|
10796
10795
|
} catch (err) {
|
|
10797
|
-
if (!isBuiltin(roleId) && (opts == null ? void 0 : opts.defaultPublic)) {
|
|
10798
|
-
return cloneDeep2(BUILTIN_ROLES.PUBLIC);
|
|
10799
|
-
}
|
|
10800
10796
|
if (Object.keys(role).length === 0) {
|
|
10801
10797
|
throw err;
|
|
10802
10798
|
}
|
|
@@ -11485,8 +11481,8 @@ async function preAuth(passport2, ctx, next) {
|
|
|
11485
11481
|
callbackUrl,
|
|
11486
11482
|
ssoSaveUserNoOp
|
|
11487
11483
|
);
|
|
11488
|
-
if (!ctx.query.appId) {
|
|
11489
|
-
ctx.throw(400, "appId query
|
|
11484
|
+
if (!ctx.query.appId || !ctx.query.datasourceId) {
|
|
11485
|
+
ctx.throw(400, "appId and datasourceId query params not present.");
|
|
11490
11486
|
}
|
|
11491
11487
|
return passport2.authenticate(strategy, {
|
|
11492
11488
|
scope: ["profile", "email", "https://www.googleapis.com/auth/spreadsheets"],
|
|
@@ -11506,7 +11502,7 @@ async function postAuth(passport2, ctx, next) {
|
|
|
11506
11502
|
clientSecret: config.clientSecret,
|
|
11507
11503
|
callbackURL: callbackUrl
|
|
11508
11504
|
},
|
|
11509
|
-
(accessToken, refreshToken,
|
|
11505
|
+
(accessToken, refreshToken, profile, done) => {
|
|
11510
11506
|
clearCookie(ctx, "budibase:datasourceauth" /* DatasourceAuth */);
|
|
11511
11507
|
done(null, { accessToken, refreshToken });
|
|
11512
11508
|
}
|
|
@@ -11514,14 +11510,22 @@ async function postAuth(passport2, ctx, next) {
|
|
|
11514
11510
|
{ successRedirect: "/", failureRedirect: "/error" },
|
|
11515
11511
|
async (err, tokens) => {
|
|
11516
11512
|
const baseUrl = `/builder/app/${authStateCookie.appId}/data`;
|
|
11517
|
-
|
|
11518
|
-
|
|
11519
|
-
|
|
11520
|
-
|
|
11521
|
-
|
|
11513
|
+
await doWithDB(authStateCookie.appId, async (db2) => {
|
|
11514
|
+
let datasource2;
|
|
11515
|
+
try {
|
|
11516
|
+
datasource2 = await db2.get(authStateCookie.datasourceId);
|
|
11517
|
+
} catch (err2) {
|
|
11518
|
+
if (err2.status === 404) {
|
|
11519
|
+
ctx.redirect(baseUrl);
|
|
11520
|
+
}
|
|
11522
11521
|
}
|
|
11523
|
-
|
|
11524
|
-
|
|
11522
|
+
if (!datasource2.config) {
|
|
11523
|
+
datasource2.config = {};
|
|
11524
|
+
}
|
|
11525
|
+
datasource2.config.auth = { type: "google", ...tokens };
|
|
11526
|
+
await db2.put(datasource2);
|
|
11527
|
+
ctx.redirect(`${baseUrl}/datasource/${authStateCookie.datasourceId}`);
|
|
11528
|
+
});
|
|
11525
11529
|
}
|
|
11526
11530
|
)(ctx, next);
|
|
11527
11531
|
}
|
|
@@ -11571,22 +11575,16 @@ var encryption_exports = {};
|
|
|
11571
11575
|
__export(encryption_exports, {
|
|
11572
11576
|
SecretOption: () => SecretOption,
|
|
11573
11577
|
decrypt: () => decrypt,
|
|
11574
|
-
decryptFile: () => decryptFile,
|
|
11575
11578
|
encrypt: () => encrypt,
|
|
11576
|
-
encryptFile: () => encryptFile,
|
|
11577
11579
|
getSecret: () => getSecret
|
|
11578
11580
|
});
|
|
11579
11581
|
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");
|
|
11584
11583
|
var ALGO = "aes-256-ctr";
|
|
11585
11584
|
var SEPARATOR3 = "-";
|
|
11586
11585
|
var ITERATIONS = 1e4;
|
|
11586
|
+
var RANDOM_BYTES = 16;
|
|
11587
11587
|
var STRETCH_LENGTH = 32;
|
|
11588
|
-
var SALT_LENGTH = 16;
|
|
11589
|
-
var IV_LENGTH = 16;
|
|
11590
11588
|
var SecretOption = /* @__PURE__ */ ((SecretOption2) => {
|
|
11591
11589
|
SecretOption2["API"] = "api";
|
|
11592
11590
|
SecretOption2["ENCRYPTION"] = "encryption";
|
|
@@ -11610,11 +11608,11 @@ function getSecret(secretOption) {
|
|
|
11610
11608
|
}
|
|
11611
11609
|
return secret;
|
|
11612
11610
|
}
|
|
11613
|
-
function stretchString(
|
|
11614
|
-
return import_crypto.default.pbkdf2Sync(
|
|
11611
|
+
function stretchString(string, salt) {
|
|
11612
|
+
return import_crypto.default.pbkdf2Sync(string, salt, ITERATIONS, STRETCH_LENGTH, "sha512");
|
|
11615
11613
|
}
|
|
11616
11614
|
function encrypt(input, secretOption = "api" /* API */) {
|
|
11617
|
-
const salt = import_crypto.default.randomBytes(
|
|
11615
|
+
const salt = import_crypto.default.randomBytes(RANDOM_BYTES);
|
|
11618
11616
|
const stretched = stretchString(getSecret(secretOption), salt);
|
|
11619
11617
|
const cipher = import_crypto.default.createCipheriv(ALGO, stretched, salt);
|
|
11620
11618
|
const base = cipher.update(input);
|
|
@@ -11631,87 +11629,6 @@ function decrypt(input, secretOption = "api" /* API */) {
|
|
|
11631
11629
|
const final = decipher.final();
|
|
11632
11630
|
return Buffer.concat([base, final]).toString();
|
|
11633
11631
|
}
|
|
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
|
-
}
|
|
11715
11632
|
|
|
11716
11633
|
// ../backend-core/src/middleware/authenticated.ts
|
|
11717
11634
|
init_identity();
|
|
@@ -12469,16 +12386,16 @@ var import_aws_sdk = __toESM(require("aws-sdk"));
|
|
|
12469
12386
|
var import_stream = __toESM(require("stream"));
|
|
12470
12387
|
var import_node_fetch6 = __toESM(require("node-fetch"));
|
|
12471
12388
|
var import_tar_fs = __toESM(require("tar-fs"));
|
|
12472
|
-
var
|
|
12389
|
+
var import_zlib = __toESM(require("zlib"));
|
|
12473
12390
|
var import_util = require("util");
|
|
12474
|
-
var
|
|
12475
|
-
var
|
|
12391
|
+
var import_path3 = require("path");
|
|
12392
|
+
var import_fs3 = __toESM(require("fs"));
|
|
12476
12393
|
init_environment2();
|
|
12477
12394
|
|
|
12478
12395
|
// ../backend-core/src/objectStore/utils.ts
|
|
12479
|
-
var
|
|
12396
|
+
var import_path2 = require("path");
|
|
12480
12397
|
var import_os = require("os");
|
|
12481
|
-
var
|
|
12398
|
+
var import_fs2 = __toESM(require("fs"));
|
|
12482
12399
|
init_environment2();
|
|
12483
12400
|
var ObjectStoreBuckets = {
|
|
12484
12401
|
BACKUPS: environment_default2.BACKUPS_BUCKET_NAME,
|
|
@@ -12487,9 +12404,9 @@ var ObjectStoreBuckets = {
|
|
|
12487
12404
|
GLOBAL: environment_default2.GLOBAL_BUCKET_NAME,
|
|
12488
12405
|
PLUGINS: environment_default2.PLUGIN_BUCKET_NAME
|
|
12489
12406
|
};
|
|
12490
|
-
var bbTmp = (0,
|
|
12491
|
-
if (!
|
|
12492
|
-
|
|
12407
|
+
var bbTmp = (0, import_path2.join)((0, import_os.tmpdir)(), ".budibase");
|
|
12408
|
+
if (!import_fs2.default.existsSync(bbTmp)) {
|
|
12409
|
+
import_fs2.default.mkdirSync(bbTmp);
|
|
12493
12410
|
}
|
|
12494
12411
|
function budibaseTempDir() {
|
|
12495
12412
|
return bbTmp;
|
|
@@ -12577,7 +12494,7 @@ var upload = async ({
|
|
|
12577
12494
|
metadata: metadata2
|
|
12578
12495
|
}) => {
|
|
12579
12496
|
const extension = filename.split(".").pop();
|
|
12580
|
-
const fileBytes =
|
|
12497
|
+
const fileBytes = import_fs3.default.readFileSync(path2);
|
|
12581
12498
|
const objectStore = ObjectStore(bucketName);
|
|
12582
12499
|
await makeSureBucketExists(objectStore, bucketName);
|
|
12583
12500
|
let contentType = type;
|
|
@@ -12679,13 +12596,13 @@ var retrieveToTmp = async (bucketName, filepath) => {
|
|
|
12679
12596
|
bucketName = sanitizeBucket(bucketName);
|
|
12680
12597
|
filepath = sanitizeKey(filepath);
|
|
12681
12598
|
const data = await retrieve(bucketName, filepath);
|
|
12682
|
-
const outputPath = (0,
|
|
12683
|
-
|
|
12599
|
+
const outputPath = (0, import_path3.join)(budibaseTempDir(), (0, import_uuid3.v4)());
|
|
12600
|
+
import_fs3.default.writeFileSync(outputPath, data);
|
|
12684
12601
|
return outputPath;
|
|
12685
12602
|
};
|
|
12686
12603
|
var retrieveDirectory = async (bucketName, path2) => {
|
|
12687
|
-
let writePath = (0,
|
|
12688
|
-
|
|
12604
|
+
let writePath = (0, import_path3.join)(budibaseTempDir(), (0, import_uuid3.v4)());
|
|
12605
|
+
import_fs3.default.mkdirSync(writePath);
|
|
12689
12606
|
const objects = await listAllObjects(bucketName, path2);
|
|
12690
12607
|
let fullObjects = await Promise.all(
|
|
12691
12608
|
objects.map((obj) => retrieve(bucketName, obj.Key))
|
|
@@ -12697,9 +12614,9 @@ var retrieveDirectory = async (bucketName, path2) => {
|
|
|
12697
12614
|
const possiblePath = filename.split("/");
|
|
12698
12615
|
if (possiblePath.length > 1) {
|
|
12699
12616
|
const dirs = possiblePath.slice(0, possiblePath.length - 1);
|
|
12700
|
-
|
|
12617
|
+
import_fs3.default.mkdirSync((0, import_path3.join)(writePath, ...dirs), { recursive: true });
|
|
12701
12618
|
}
|
|
12702
|
-
|
|
12619
|
+
import_fs3.default.writeFileSync((0, import_path3.join)(writePath, ...possiblePath), data);
|
|
12703
12620
|
}
|
|
12704
12621
|
return writePath;
|
|
12705
12622
|
};
|
|
@@ -12753,14 +12670,14 @@ var deleteFolder = async (bucketName, folder) => {
|
|
|
12753
12670
|
var uploadDirectory = async (bucketName, localPath, bucketPath2) => {
|
|
12754
12671
|
bucketName = sanitizeBucket(bucketName);
|
|
12755
12672
|
let uploads = [];
|
|
12756
|
-
const files2 =
|
|
12673
|
+
const files2 = import_fs3.default.readdirSync(localPath, { withFileTypes: true });
|
|
12757
12674
|
for (let file of files2) {
|
|
12758
|
-
const path2 = sanitizeKey((0,
|
|
12759
|
-
const local = (0,
|
|
12675
|
+
const path2 = sanitizeKey((0, import_path3.join)(bucketPath2, file.name));
|
|
12676
|
+
const local = (0, import_path3.join)(localPath, file.name);
|
|
12760
12677
|
if (file.isDirectory()) {
|
|
12761
12678
|
uploads.push(uploadDirectory(bucketName, local, path2));
|
|
12762
12679
|
} else {
|
|
12763
|
-
uploads.push(streamUpload(bucketName, path2,
|
|
12680
|
+
uploads.push(streamUpload(bucketName, path2, import_fs3.default.createReadStream(local)));
|
|
12764
12681
|
}
|
|
12765
12682
|
}
|
|
12766
12683
|
await Promise.all(uploads);
|
|
@@ -12772,7 +12689,7 @@ var downloadTarballDirect = async (url, path2, headers = {}) => {
|
|
|
12772
12689
|
if (!response.ok) {
|
|
12773
12690
|
throw new Error(`unexpected response ${response.statusText}`);
|
|
12774
12691
|
}
|
|
12775
|
-
await streamPipeline(response.body,
|
|
12692
|
+
await streamPipeline(response.body, import_zlib.default.createUnzip(), import_tar_fs.default.extract(path2));
|
|
12776
12693
|
};
|
|
12777
12694
|
var downloadTarball = async (url, bucketName, path2) => {
|
|
12778
12695
|
bucketName = sanitizeBucket(bucketName);
|
|
@@ -12781,8 +12698,8 @@ var downloadTarball = async (url, bucketName, path2) => {
|
|
|
12781
12698
|
if (!response.ok) {
|
|
12782
12699
|
throw new Error(`unexpected response ${response.statusText}`);
|
|
12783
12700
|
}
|
|
12784
|
-
const tmpPath = (0,
|
|
12785
|
-
await streamPipeline(response.body,
|
|
12701
|
+
const tmpPath = (0, import_path3.join)(budibaseTempDir(), path2);
|
|
12702
|
+
await streamPipeline(response.body, import_zlib.default.createUnzip(), import_tar_fs.default.extract(tmpPath));
|
|
12786
12703
|
if (!environment_default2.isTest() && environment_default2.SELF_HOSTED) {
|
|
12787
12704
|
await uploadDirectory(bucketName, tmpPath, path2);
|
|
12788
12705
|
}
|
|
@@ -14438,8 +14355,7 @@ var PostgresIntegration = class extends sql_default {
|
|
|
14438
14355
|
try {
|
|
14439
14356
|
await this.openConnection();
|
|
14440
14357
|
const columnsResponse = await this.client.query(this.COLUMNS_SQL);
|
|
14441
|
-
|
|
14442
|
-
return [...new Set(names)];
|
|
14358
|
+
return columnsResponse.rows.map((row) => row.table_name);
|
|
14443
14359
|
} finally {
|
|
14444
14360
|
await this.closeConnection();
|
|
14445
14361
|
}
|
|
@@ -15052,8 +14968,6 @@ var MongoIntegration = class {
|
|
|
15052
14968
|
response.connected = true;
|
|
15053
14969
|
} catch (e) {
|
|
15054
14970
|
response.error = e.message;
|
|
15055
|
-
} finally {
|
|
15056
|
-
await this.client.close();
|
|
15057
14971
|
}
|
|
15058
14972
|
return response;
|
|
15059
14973
|
}
|
|
@@ -17321,39 +17235,11 @@ var hasFilters = (query) => {
|
|
|
17321
17235
|
// ../shared-core/src/utils.ts
|
|
17322
17236
|
var utils_exports3 = {};
|
|
17323
17237
|
__export(utils_exports3, {
|
|
17324
|
-
parallelForeach: () => parallelForeach,
|
|
17325
17238
|
unreachable: () => unreachable
|
|
17326
17239
|
});
|
|
17327
17240
|
function unreachable(value, message = `No such case in exhaustive switch: ${value}`) {
|
|
17328
17241
|
throw new Error(message);
|
|
17329
17242
|
}
|
|
17330
|
-
async function parallelForeach(items, task, maxConcurrency) {
|
|
17331
|
-
const promises = [];
|
|
17332
|
-
let index2 = 0;
|
|
17333
|
-
const processItem = async (item) => {
|
|
17334
|
-
try {
|
|
17335
|
-
await task(item);
|
|
17336
|
-
} finally {
|
|
17337
|
-
processNext();
|
|
17338
|
-
}
|
|
17339
|
-
};
|
|
17340
|
-
const processNext = () => {
|
|
17341
|
-
if (index2 >= items.length) {
|
|
17342
|
-
return;
|
|
17343
|
-
}
|
|
17344
|
-
const item = items[index2];
|
|
17345
|
-
index2++;
|
|
17346
|
-
const promise = processItem(item);
|
|
17347
|
-
promises.push(promise);
|
|
17348
|
-
if (promises.length >= maxConcurrency) {
|
|
17349
|
-
Promise.race(promises).then(processNext);
|
|
17350
|
-
} else {
|
|
17351
|
-
processNext();
|
|
17352
|
-
}
|
|
17353
|
-
};
|
|
17354
|
-
processNext();
|
|
17355
|
-
await Promise.all(promises);
|
|
17356
|
-
}
|
|
17357
17243
|
|
|
17358
17244
|
// src/integrations/googlesheets.ts
|
|
17359
17245
|
var ALLOWED_TYPES = [
|
|
@@ -17382,7 +17268,7 @@ var SCHEMA12 = {
|
|
|
17382
17268
|
},
|
|
17383
17269
|
datasource: {
|
|
17384
17270
|
spreadsheetId: {
|
|
17385
|
-
display: "
|
|
17271
|
+
display: "Google Sheet URL",
|
|
17386
17272
|
type: "string" /* STRING */,
|
|
17387
17273
|
required: true
|
|
17388
17274
|
}
|
|
@@ -17503,7 +17389,6 @@ var GoogleSheetsIntegration = class {
|
|
|
17503
17389
|
async connect() {
|
|
17504
17390
|
var _a;
|
|
17505
17391
|
try {
|
|
17506
|
-
await setupCreationAuth(this.config);
|
|
17507
17392
|
let googleConfig = await configs_exports.getGoogleDatasourceConfig();
|
|
17508
17393
|
if (!googleConfig) {
|
|
17509
17394
|
throw new HTTPError("Google config not found", 400);
|
|
@@ -17554,22 +17439,21 @@ var GoogleSheetsIntegration = class {
|
|
|
17554
17439
|
return table;
|
|
17555
17440
|
}
|
|
17556
17441
|
async buildSchema(datasourceId, entities) {
|
|
17442
|
+
if (!this.config.auth) {
|
|
17443
|
+
return;
|
|
17444
|
+
}
|
|
17557
17445
|
await this.connect();
|
|
17558
17446
|
const sheets = this.client.sheetsByIndex;
|
|
17559
17447
|
const tables = {};
|
|
17560
|
-
|
|
17561
|
-
|
|
17562
|
-
|
|
17563
|
-
|
|
17564
|
-
|
|
17565
|
-
|
|
17566
|
-
|
|
17567
|
-
|
|
17568
|
-
|
|
17569
|
-
);
|
|
17570
|
-
},
|
|
17571
|
-
10
|
|
17572
|
-
);
|
|
17448
|
+
for (let sheet of sheets) {
|
|
17449
|
+
await sheet.getRows();
|
|
17450
|
+
const id = buildExternalTableId(datasourceId, sheet.title);
|
|
17451
|
+
tables[sheet.title] = this.getTableSchema(
|
|
17452
|
+
sheet.title,
|
|
17453
|
+
sheet.headerValues,
|
|
17454
|
+
id
|
|
17455
|
+
);
|
|
17456
|
+
}
|
|
17573
17457
|
const final = finaliseExternalTables(tables, entities);
|
|
17574
17458
|
this.tables = final.tables;
|
|
17575
17459
|
this.schemaErrors = final.errors;
|
|
@@ -17815,16 +17699,6 @@ var GoogleSheetsIntegration = class {
|
|
|
17815
17699
|
}
|
|
17816
17700
|
}
|
|
17817
17701
|
};
|
|
17818
|
-
async function setupCreationAuth(datasouce) {
|
|
17819
|
-
if (datasouce.continueSetupId) {
|
|
17820
|
-
const appId = context_exports.getAppId();
|
|
17821
|
-
const tokens = await cache_exports.get(
|
|
17822
|
-
`datasource:creation:${appId}:google:${datasouce.continueSetupId}`
|
|
17823
|
-
);
|
|
17824
|
-
datasouce.auth = tokens.tokens;
|
|
17825
|
-
delete datasouce.continueSetupId;
|
|
17826
|
-
}
|
|
17827
|
-
}
|
|
17828
17702
|
var googlesheets_default = {
|
|
17829
17703
|
schema: SCHEMA12,
|
|
17830
17704
|
integration: GoogleSheetsIntegration
|
|
@@ -18603,24 +18477,24 @@ init_src();
|
|
|
18603
18477
|
var budibaseTempDir2 = objectStore_exports2.budibaseTempDir;
|
|
18604
18478
|
|
|
18605
18479
|
// src/utilities/fileSystem/app.ts
|
|
18606
|
-
var
|
|
18480
|
+
var import_path5 = require("path");
|
|
18607
18481
|
|
|
18608
18482
|
// src/utilities/fileSystem/filesystem.ts
|
|
18609
|
-
var
|
|
18610
|
-
var
|
|
18483
|
+
var import_fs4 = __toESM(require("fs"));
|
|
18484
|
+
var import_path4 = require("path");
|
|
18611
18485
|
var import_tar = __toESM(require("tar"));
|
|
18612
18486
|
var uuid2 = require("uuid/v4");
|
|
18613
|
-
var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0,
|
|
18487
|
+
var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0, import_path4.resolve)((0, import_path4.join)(__dirname, "..", "..", ".."));
|
|
18614
18488
|
var streamFile = (path2) => {
|
|
18615
|
-
return
|
|
18489
|
+
return import_fs4.default.createReadStream(path2);
|
|
18616
18490
|
};
|
|
18617
18491
|
var createTempFolder = (item) => {
|
|
18618
|
-
const path2 = (0,
|
|
18492
|
+
const path2 = (0, import_path4.join)(budibaseTempDir2(), item);
|
|
18619
18493
|
try {
|
|
18620
|
-
if (
|
|
18621
|
-
|
|
18494
|
+
if (import_fs4.default.existsSync(path2)) {
|
|
18495
|
+
import_fs4.default.rmSync(path2, { recursive: true, force: true });
|
|
18622
18496
|
}
|
|
18623
|
-
|
|
18497
|
+
import_fs4.default.mkdirSync(path2);
|
|
18624
18498
|
} catch (err) {
|
|
18625
18499
|
throw new Error(`Path cannot be created: ${err.message}`);
|
|
18626
18500
|
}
|
|
@@ -18634,18 +18508,18 @@ var extractTarball = async (fromFilePath, toPath) => {
|
|
|
18634
18508
|
};
|
|
18635
18509
|
|
|
18636
18510
|
// src/utilities/fileSystem/app.ts
|
|
18637
|
-
var NODE_MODULES_PATH = (0,
|
|
18511
|
+
var NODE_MODULES_PATH = (0, import_path5.join)(TOP_LEVEL_PATH, "node_modules");
|
|
18638
18512
|
|
|
18639
18513
|
// src/utilities/fileSystem/plugin.ts
|
|
18640
|
-
var
|
|
18641
|
-
var
|
|
18642
|
-
var DATASOURCE_PATH = (0,
|
|
18643
|
-
var AUTOMATION_PATH = (0,
|
|
18514
|
+
var import_fs5 = __toESM(require("fs"));
|
|
18515
|
+
var import_path6 = require("path");
|
|
18516
|
+
var DATASOURCE_PATH = (0, import_path6.join)(budibaseTempDir2(), "datasource");
|
|
18517
|
+
var AUTOMATION_PATH = (0, import_path6.join)(budibaseTempDir2(), "automation");
|
|
18644
18518
|
var getPluginMetadata = async (path2) => {
|
|
18645
18519
|
let metadata2 = {};
|
|
18646
18520
|
try {
|
|
18647
|
-
const pkg2 =
|
|
18648
|
-
const schema =
|
|
18521
|
+
const pkg2 = import_fs5.default.readFileSync((0, import_path6.join)(path2, "package.json"), "utf8");
|
|
18522
|
+
const schema = import_fs5.default.readFileSync((0, import_path6.join)(path2, "schema.json"), "utf8");
|
|
18649
18523
|
metadata2.schema = JSON.parse(schema);
|
|
18650
18524
|
metadata2.package = JSON.parse(pkg2);
|
|
18651
18525
|
if (!metadata2.package.name || !metadata2.package.version || !metadata2.package.description) {
|
|
@@ -18663,19 +18537,19 @@ var getPluginMetadata = async (path2) => {
|
|
|
18663
18537
|
async function getPluginImpl(path2, plugin) {
|
|
18664
18538
|
var _a;
|
|
18665
18539
|
const hash3 = (_a = plugin.schema) == null ? void 0 : _a.hash;
|
|
18666
|
-
if (!
|
|
18667
|
-
|
|
18540
|
+
if (!import_fs5.default.existsSync(path2)) {
|
|
18541
|
+
import_fs5.default.mkdirSync(path2);
|
|
18668
18542
|
}
|
|
18669
|
-
const filename = (0,
|
|
18543
|
+
const filename = (0, import_path6.join)(path2, plugin.name);
|
|
18670
18544
|
const metadataName = `${filename}.bbmetadata`;
|
|
18671
|
-
if (
|
|
18672
|
-
const currentHash =
|
|
18545
|
+
if (import_fs5.default.existsSync(filename)) {
|
|
18546
|
+
const currentHash = import_fs5.default.readFileSync(metadataName, "utf8");
|
|
18673
18547
|
if (currentHash === hash3) {
|
|
18674
18548
|
return require(filename);
|
|
18675
18549
|
} else {
|
|
18676
18550
|
console.log(`Updating plugin: ${plugin.name}`);
|
|
18677
18551
|
delete require.cache[require.resolve(filename)];
|
|
18678
|
-
|
|
18552
|
+
import_fs5.default.unlinkSync(filename);
|
|
18679
18553
|
}
|
|
18680
18554
|
}
|
|
18681
18555
|
const pluginKey = objectStore_exports2.getPluginJSKey(plugin);
|
|
@@ -18683,8 +18557,8 @@ async function getPluginImpl(path2, plugin) {
|
|
|
18683
18557
|
objectStore_exports2.ObjectStoreBuckets.PLUGINS,
|
|
18684
18558
|
pluginKey
|
|
18685
18559
|
);
|
|
18686
|
-
|
|
18687
|
-
|
|
18560
|
+
import_fs5.default.writeFileSync(filename, pluginJs);
|
|
18561
|
+
import_fs5.default.writeFileSync(metadataName, hash3);
|
|
18688
18562
|
return require(filename);
|
|
18689
18563
|
}
|
|
18690
18564
|
var getDatasourcePlugin = async (plugin) => {
|
|
@@ -18719,20 +18593,19 @@ var GLOBAL_DB_EXPORT_FILE = "global.txt";
|
|
|
18719
18593
|
var STATIC_APP_FILES = ["manifest.json", "budibase-client.js"];
|
|
18720
18594
|
|
|
18721
18595
|
// src/sdk/app/backups/exports.ts
|
|
18722
|
-
var
|
|
18723
|
-
var
|
|
18724
|
-
var import_tar2 = __toESM(require("tar"));
|
|
18596
|
+
var import_fs6 = __toESM(require("fs"));
|
|
18597
|
+
var import_path7 = require("path");
|
|
18725
18598
|
var uuid3 = require("uuid/v4");
|
|
18599
|
+
var tar3 = require("tar");
|
|
18726
18600
|
var MemoryStream = require("memorystream");
|
|
18727
18601
|
function tarFilesToTmp(tmpDir, files2) {
|
|
18728
|
-
const
|
|
18729
|
-
|
|
18730
|
-
import_tar2.default.create(
|
|
18602
|
+
const exportFile = (0, import_path7.join)(budibaseTempDir2(), `${uuid3()}.tar.gz`);
|
|
18603
|
+
tar3.create(
|
|
18731
18604
|
{
|
|
18732
18605
|
sync: true,
|
|
18733
18606
|
gzip: true,
|
|
18734
18607
|
file: exportFile,
|
|
18735
|
-
|
|
18608
|
+
recursive: true,
|
|
18736
18609
|
cwd: tmpDir
|
|
18737
18610
|
},
|
|
18738
18611
|
files2
|
|
@@ -18749,7 +18622,7 @@ async function exportDB(dbName, opts = {}) {
|
|
|
18749
18622
|
return db_exports.doWithDB(dbName, async (db2) => {
|
|
18750
18623
|
if (opts == null ? void 0 : opts.exportPath) {
|
|
18751
18624
|
const path2 = opts == null ? void 0 : opts.exportPath;
|
|
18752
|
-
const writeStream =
|
|
18625
|
+
const writeStream = import_fs6.default.createWriteStream(path2);
|
|
18753
18626
|
await db2.dump(writeStream, exportOpts);
|
|
18754
18627
|
return path2;
|
|
18755
18628
|
} else {
|
|
@@ -18782,9 +18655,9 @@ async function exportApp(appId, config) {
|
|
|
18782
18655
|
for (let path2 of STATIC_APP_FILES) {
|
|
18783
18656
|
const contents = await objectStore_exports2.retrieve(
|
|
18784
18657
|
ObjectStoreBuckets2.APPS,
|
|
18785
|
-
(0,
|
|
18658
|
+
(0, import_path7.join)(appPath, path2)
|
|
18786
18659
|
);
|
|
18787
|
-
|
|
18660
|
+
import_fs6.default.writeFileSync((0, import_path7.join)(tmpPath, path2), contents);
|
|
18788
18661
|
}
|
|
18789
18662
|
} else {
|
|
18790
18663
|
tmpPath = await objectStore_exports2.retrieveDirectory(
|
|
@@ -18793,48 +18666,33 @@ async function exportApp(appId, config) {
|
|
|
18793
18666
|
);
|
|
18794
18667
|
}
|
|
18795
18668
|
}
|
|
18796
|
-
const downloadedPath = (0,
|
|
18797
|
-
if (
|
|
18798
|
-
const allFiles =
|
|
18669
|
+
const downloadedPath = (0, import_path7.join)(tmpPath, appPath);
|
|
18670
|
+
if (import_fs6.default.existsSync(downloadedPath)) {
|
|
18671
|
+
const allFiles = import_fs6.default.readdirSync(downloadedPath);
|
|
18799
18672
|
for (let file of allFiles) {
|
|
18800
|
-
const path2 = (0,
|
|
18801
|
-
|
|
18673
|
+
const path2 = (0, import_path7.join)(downloadedPath, file);
|
|
18674
|
+
import_fs6.default.renameSync(path2, (0, import_path7.join)(downloadedPath, "..", file));
|
|
18802
18675
|
}
|
|
18803
|
-
|
|
18676
|
+
import_fs6.default.rmdirSync(downloadedPath);
|
|
18804
18677
|
}
|
|
18805
|
-
const dbPath = (0,
|
|
18678
|
+
const dbPath = (0, import_path7.join)(tmpPath, DB_EXPORT_FILE);
|
|
18806
18679
|
await exportDB(appId, {
|
|
18807
18680
|
filter: defineFilter(config == null ? void 0 : config.excludeRows, config == null ? void 0 : config.excludeLogs),
|
|
18808
18681
|
exportPath: dbPath
|
|
18809
18682
|
});
|
|
18810
|
-
if (config == null ? void 0 : config.encryptPassword) {
|
|
18811
|
-
for (let file of import_fs7.default.readdirSync(tmpPath)) {
|
|
18812
|
-
const path2 = (0, import_path8.join)(tmpPath, file);
|
|
18813
|
-
await encryption_exports.encryptFile(
|
|
18814
|
-
{ dir: tmpPath, filename: file },
|
|
18815
|
-
config.encryptPassword
|
|
18816
|
-
);
|
|
18817
|
-
import_fs7.default.rmSync(path2);
|
|
18818
|
-
}
|
|
18819
|
-
}
|
|
18820
18683
|
if (config == null ? void 0 : config.tar) {
|
|
18821
|
-
const tarPath = tarFilesToTmp(tmpPath,
|
|
18822
|
-
|
|
18684
|
+
const tarPath = tarFilesToTmp(tmpPath, import_fs6.default.readdirSync(tmpPath));
|
|
18685
|
+
import_fs6.default.rmSync(tmpPath, { recursive: true, force: true });
|
|
18823
18686
|
return tarPath;
|
|
18824
18687
|
} else {
|
|
18825
18688
|
return tmpPath;
|
|
18826
18689
|
}
|
|
18827
18690
|
}
|
|
18828
|
-
async function streamExportApp({
|
|
18829
|
-
appId,
|
|
18830
|
-
excludeRows,
|
|
18831
|
-
encryptPassword
|
|
18832
|
-
}) {
|
|
18691
|
+
async function streamExportApp(appId, excludeRows) {
|
|
18833
18692
|
const tmpPath = await exportApp(appId, {
|
|
18834
18693
|
excludeRows,
|
|
18835
18694
|
excludeLogs: true,
|
|
18836
|
-
tar: true
|
|
18837
|
-
encryptPassword
|
|
18695
|
+
tar: true
|
|
18838
18696
|
});
|
|
18839
18697
|
return streamFile(tmpPath);
|
|
18840
18698
|
}
|
|
@@ -18848,8 +18706,8 @@ __export(imports_exports, {
|
|
|
18848
18706
|
untarFile: () => untarFile,
|
|
18849
18707
|
updateAttachmentColumns: () => updateAttachmentColumns
|
|
18850
18708
|
});
|
|
18851
|
-
var
|
|
18852
|
-
var
|
|
18709
|
+
var import_path8 = require("path");
|
|
18710
|
+
var import_fs7 = __toESM(require("fs"));
|
|
18853
18711
|
init_src();
|
|
18854
18712
|
var uuid4 = require("uuid/v4");
|
|
18855
18713
|
var tar4 = require("tar");
|
|
@@ -18916,16 +18774,16 @@ async function getTemplateStream(template) {
|
|
|
18916
18774
|
throw new Error("Cannot import a non-text based file.");
|
|
18917
18775
|
}
|
|
18918
18776
|
if (template.file) {
|
|
18919
|
-
return
|
|
18777
|
+
return import_fs7.default.createReadStream(template.file.path);
|
|
18920
18778
|
} else if (template.key) {
|
|
18921
18779
|
const [type, name2] = template.key.split("/");
|
|
18922
18780
|
const tmpPath = await downloadTemplate(type, name2);
|
|
18923
|
-
return
|
|
18781
|
+
return import_fs7.default.createReadStream((0, import_path8.join)(tmpPath, name2, "db", "dump.txt"));
|
|
18924
18782
|
}
|
|
18925
18783
|
}
|
|
18926
18784
|
function untarFile(file) {
|
|
18927
|
-
const tmpPath = (0,
|
|
18928
|
-
|
|
18785
|
+
const tmpPath = (0, import_path8.join)(budibaseTempDir2(), uuid4());
|
|
18786
|
+
import_fs7.default.mkdirSync(tmpPath);
|
|
18929
18787
|
tar4.extract({
|
|
18930
18788
|
sync: true,
|
|
18931
18789
|
cwd: tmpPath,
|
|
@@ -18933,49 +18791,31 @@ function untarFile(file) {
|
|
|
18933
18791
|
});
|
|
18934
18792
|
return tmpPath;
|
|
18935
18793
|
}
|
|
18936
|
-
async function decryptFiles(path2, password) {
|
|
18937
|
-
try {
|
|
18938
|
-
for (let file of import_fs8.default.readdirSync(path2)) {
|
|
18939
|
-
const inputPath = (0, import_path9.join)(path2, file);
|
|
18940
|
-
const outputPath = inputPath.replace(/\.enc$/, "");
|
|
18941
|
-
await encryption_exports.decryptFile(inputPath, outputPath, password);
|
|
18942
|
-
import_fs8.default.rmSync(inputPath);
|
|
18943
|
-
}
|
|
18944
|
-
} catch (err) {
|
|
18945
|
-
if (err.message === "incorrect header check") {
|
|
18946
|
-
throw new Error("File cannot be imported");
|
|
18947
|
-
}
|
|
18948
|
-
throw err;
|
|
18949
|
-
}
|
|
18950
|
-
}
|
|
18951
18794
|
function getGlobalDBFile(tmpPath) {
|
|
18952
|
-
return
|
|
18795
|
+
return import_fs7.default.readFileSync((0, import_path8.join)(tmpPath, GLOBAL_DB_EXPORT_FILE), "utf8");
|
|
18953
18796
|
}
|
|
18954
18797
|
function getListOfAppsInMulti(tmpPath) {
|
|
18955
|
-
return
|
|
18798
|
+
return import_fs7.default.readdirSync(tmpPath).filter((dir) => dir !== GLOBAL_DB_EXPORT_FILE);
|
|
18956
18799
|
}
|
|
18957
18800
|
async function importApp(appId, db2, template) {
|
|
18958
18801
|
var _a, _b;
|
|
18959
18802
|
let prodAppId = db_exports.getProdAppID(appId);
|
|
18960
18803
|
let dbStream;
|
|
18961
18804
|
const isTar = template.file && ((_b = (_a = template == null ? void 0 : template.file) == null ? void 0 : _a.type) == null ? void 0 : _b.endsWith("gzip"));
|
|
18962
|
-
const isDirectory = template.file &&
|
|
18805
|
+
const isDirectory = template.file && import_fs7.default.lstatSync(template.file.path).isDirectory();
|
|
18963
18806
|
if (template.file && (isTar || isDirectory)) {
|
|
18964
18807
|
const tmpPath = isTar ? untarFile(template.file) : template.file.path;
|
|
18965
|
-
|
|
18966
|
-
await decryptFiles(tmpPath, template.file.password);
|
|
18967
|
-
}
|
|
18968
|
-
const contents = import_fs8.default.readdirSync(tmpPath);
|
|
18808
|
+
const contents = import_fs7.default.readdirSync(tmpPath);
|
|
18969
18809
|
if (contents.length) {
|
|
18970
18810
|
let promises = [];
|
|
18971
18811
|
let excludedFiles = [GLOBAL_DB_EXPORT_FILE, DB_EXPORT_FILE];
|
|
18972
18812
|
for (let filename of contents) {
|
|
18973
|
-
const path2 = (0,
|
|
18813
|
+
const path2 = (0, import_path8.join)(tmpPath, filename);
|
|
18974
18814
|
if (excludedFiles.includes(filename)) {
|
|
18975
18815
|
continue;
|
|
18976
18816
|
}
|
|
18977
|
-
filename = (0,
|
|
18978
|
-
if (
|
|
18817
|
+
filename = (0, import_path8.join)(prodAppId, filename);
|
|
18818
|
+
if (import_fs7.default.lstatSync(path2).isDirectory()) {
|
|
18979
18819
|
promises.push(
|
|
18980
18820
|
objectStore_exports2.uploadDirectory(ObjectStoreBuckets2.APPS, path2, filename)
|
|
18981
18821
|
);
|
|
@@ -18991,7 +18831,7 @@ async function importApp(appId, db2, template) {
|
|
|
18991
18831
|
}
|
|
18992
18832
|
await Promise.all(promises);
|
|
18993
18833
|
}
|
|
18994
|
-
dbStream =
|
|
18834
|
+
dbStream = import_fs7.default.createReadStream((0, import_path8.join)(tmpPath, DB_EXPORT_FILE));
|
|
18995
18835
|
} else {
|
|
18996
18836
|
dbStream = await getTemplateStream(template);
|
|
18997
18837
|
}
|
|
@@ -20110,17 +19950,17 @@ __export(version_exports, {
|
|
|
20110
19950
|
getLicenseVersion: () => getLicenseVersion,
|
|
20111
19951
|
getProVersion: () => getProVersion
|
|
20112
19952
|
});
|
|
20113
|
-
var
|
|
20114
|
-
var
|
|
19953
|
+
var import_fs8 = __toESM(require("fs"));
|
|
19954
|
+
var import_path9 = __toESM(require("path"));
|
|
20115
19955
|
var getLicenseVersion = () => {
|
|
20116
19956
|
if (environment_default2.isDev()) {
|
|
20117
19957
|
const DEV_VER_FILENAME = "dev-version.txt";
|
|
20118
|
-
const verFile =
|
|
20119
|
-
if (
|
|
20120
|
-
return
|
|
19958
|
+
const verFile = import_path9.default.join(objectStore_exports2.budibaseTempDir(), DEV_VER_FILENAME);
|
|
19959
|
+
if (import_fs8.default.existsSync(verFile)) {
|
|
19960
|
+
return import_fs8.default.readFileSync(verFile, "utf8");
|
|
20121
19961
|
} else {
|
|
20122
19962
|
const devVer = utils_exports2.newid();
|
|
20123
|
-
|
|
19963
|
+
import_fs8.default.writeFileSync(verFile, devVer);
|
|
20124
19964
|
return devVer;
|
|
20125
19965
|
}
|
|
20126
19966
|
} else {
|
|
@@ -20479,16 +20319,16 @@ __export(offline_exports, {
|
|
|
20479
20319
|
getOfflineLicense: () => getOfflineLicense,
|
|
20480
20320
|
writeOfflineLicenseToDisk: () => writeOfflineLicenseToDisk
|
|
20481
20321
|
});
|
|
20482
|
-
var
|
|
20483
|
-
var
|
|
20322
|
+
var import_fs9 = __toESM(require("fs"));
|
|
20323
|
+
var import_path10 = require("path");
|
|
20484
20324
|
var import_os2 = require("os");
|
|
20485
20325
|
var import_jsonwebtoken = __toESM(require("jsonwebtoken"));
|
|
20486
20326
|
var SUB_DIRECTORY = environment_default2.isTest() ? ".budibase-test" : ".budibase";
|
|
20487
|
-
var DIRECTORY = (0,
|
|
20327
|
+
var DIRECTORY = (0, import_path10.join)((0, import_os2.tmpdir)(), SUB_DIRECTORY);
|
|
20488
20328
|
var OFFLINE_LICENSE_FILE = "offline_license.txt";
|
|
20489
|
-
var LICENSE_FILE_PATH = (0,
|
|
20490
|
-
if (!
|
|
20491
|
-
|
|
20329
|
+
var LICENSE_FILE_PATH = (0, import_path10.join)(DIRECTORY, OFFLINE_LICENSE_FILE);
|
|
20330
|
+
if (!import_fs9.default.existsSync(DIRECTORY)) {
|
|
20331
|
+
import_fs9.default.mkdirSync(DIRECTORY);
|
|
20492
20332
|
}
|
|
20493
20333
|
var PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvz3jePLCFBXZ19c8Dpkv\nXtSgOhKFOcvQdo/LV0KJRUzQWDPWuO4ILtBtnqhjtIzZH4CH0qCYBet5L6Qr4CM1\nl2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C\n8suunQP5bEScqEY2kclqzSf8e6xqMzPUg3mL/pNa1iEv7TuLbU9nJfgR36l0WmZY\n94fWnSaT8OSXSqcxsaByf06gfS3HAoTJNc7eqz1Hf9fUORQGPUAnFK8cT3SfdA36\nd/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR\nmwIDAQAB\n-----END PUBLIC KEY-----\n";
|
|
20494
20334
|
function getOfflineLicense() {
|
|
@@ -20499,16 +20339,16 @@ function getOfflineLicense() {
|
|
|
20499
20339
|
}
|
|
20500
20340
|
}
|
|
20501
20341
|
function getOfflineLicenseFromDisk() {
|
|
20502
|
-
if (
|
|
20503
|
-
const token =
|
|
20342
|
+
if (import_fs9.default.existsSync(LICENSE_FILE_PATH)) {
|
|
20343
|
+
const token = import_fs9.default.readFileSync(LICENSE_FILE_PATH, { encoding: "utf-8" });
|
|
20504
20344
|
return import_jsonwebtoken.default.verify(token, PUBLIC_KEY, { algorithms: ["RS256"] });
|
|
20505
20345
|
}
|
|
20506
20346
|
}
|
|
20507
20347
|
function writeOfflineLicenseToDisk(signedLicense) {
|
|
20508
|
-
|
|
20348
|
+
import_fs9.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
|
|
20509
20349
|
}
|
|
20510
20350
|
function deleteOfflineLicense() {
|
|
20511
|
-
|
|
20351
|
+
import_fs9.default.rmSync(LICENSE_FILE_PATH, { force: true });
|
|
20512
20352
|
}
|
|
20513
20353
|
|
|
20514
20354
|
// ../pro/packages/pro/src/sdk/licensing/licenses/licenses.ts
|
|
@@ -21713,10 +21553,10 @@ __export(plugins_exports, {
|
|
|
21713
21553
|
init_src();
|
|
21714
21554
|
|
|
21715
21555
|
// ../pro/packages/pro/src/utilities/fileSystem.ts
|
|
21716
|
-
var
|
|
21717
|
-
var
|
|
21556
|
+
var import_fs10 = __toESM(require("fs"));
|
|
21557
|
+
var import_path11 = require("path");
|
|
21718
21558
|
function loadJSFile(directory2, name2) {
|
|
21719
|
-
return
|
|
21559
|
+
return import_fs10.default.readFileSync((0, import_path11.join)(directory2, name2), "utf8");
|
|
21720
21560
|
}
|
|
21721
21561
|
|
|
21722
21562
|
// ../pro/packages/pro/src/sdk/plugins/index.ts
|
|
@@ -22353,7 +22193,7 @@ __export(processing_exports, {
|
|
|
22353
22193
|
init: () => init12
|
|
22354
22194
|
});
|
|
22355
22195
|
init_src();
|
|
22356
|
-
var
|
|
22196
|
+
var import_fs11 = __toESM(require("fs"));
|
|
22357
22197
|
async function init12(opts) {
|
|
22358
22198
|
await getBackupQueue().process(async (job) => {
|
|
22359
22199
|
const data = job.data;
|
|
@@ -22421,8 +22261,8 @@ async function runBackup(trigger, tenantId, appId, opts) {
|
|
|
22421
22261
|
}
|
|
22422
22262
|
});
|
|
22423
22263
|
await updateMetadata("complete" /* COMPLETE */, { filename, contents });
|
|
22424
|
-
if (
|
|
22425
|
-
|
|
22264
|
+
if (import_fs11.default.existsSync(tarPath)) {
|
|
22265
|
+
import_fs11.default.rmSync(tarPath);
|
|
22426
22266
|
}
|
|
22427
22267
|
} catch (err) {
|
|
22428
22268
|
logging_exports.logAlert("App backup error", err);
|
|
@@ -22875,7 +22715,7 @@ router3.post(
|
|
|
22875
22715
|
|
|
22876
22716
|
// ../pro/packages/pro/src/api/controllers/apps/backups.ts
|
|
22877
22717
|
init_src();
|
|
22878
|
-
var
|
|
22718
|
+
var import_fs12 = __toESM(require("fs"));
|
|
22879
22719
|
async function checkAppID(ctx, appId) {
|
|
22880
22720
|
if (!await utils_exports5.appExists(appId)) {
|
|
22881
22721
|
ctx.throw(400, `Provided app ID: ${appId} - is invalid.`);
|
|
@@ -22961,7 +22801,7 @@ async function downloadBackup(ctx) {
|
|
|
22961
22801
|
const backupId = ctx.params.backupId;
|
|
22962
22802
|
const { metadata: metadata2, path: path2 } = await backups_default2.downloadAppBackup(backupId);
|
|
22963
22803
|
ctx.attachment(`backup-${metadata2.timestamp}.tar.gz`);
|
|
22964
|
-
ctx.body =
|
|
22804
|
+
ctx.body = import_fs12.default.createReadStream(path2);
|
|
22965
22805
|
}
|
|
22966
22806
|
|
|
22967
22807
|
// ../pro/packages/pro/src/api/routes/apps/backups.ts
|