@budibase/server 2.7.15 → 2.7.16-alpha.0
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.2e9069f3.css} +1 -1
- package/builder/assets/{index.717d69a6.js → index.55a50076.js} +351 -351
- package/builder/index.html +2 -2
- package/dist/automation.js +405 -179
- package/dist/automation.js.map +3 -3
- package/dist/index.js +516 -282
- package/dist/index.js.map +3 -3
- package/dist/query.js +301 -141
- package/dist/query.js.map +3 -3
- package/package.json +11 -11
- 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 +2 -1
- 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
|
|
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, bucketPath) => {
|
|
12671
12754
|
bucketName = sanitizeBucket(bucketName);
|
|
12672
12755
|
let uploads = [];
|
|
12673
|
-
const files =
|
|
12756
|
+
const files = import_fs4.default.readdirSync(localPath, { withFileTypes: true });
|
|
12674
12757
|
for (let file of files) {
|
|
12675
|
-
const path2 = sanitizeKey((0,
|
|
12676
|
-
const local = (0,
|
|
12758
|
+
const path2 = sanitizeKey((0, import_path4.join)(bucketPath, 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
|
}
|
|
@@ -14355,7 +14438,8 @@ var PostgresIntegration = class extends sql_default {
|
|
|
14355
14438
|
try {
|
|
14356
14439
|
await this.openConnection();
|
|
14357
14440
|
const columnsResponse = await this.client.query(this.COLUMNS_SQL);
|
|
14358
|
-
|
|
14441
|
+
const names = columnsResponse.rows.map((row) => row.table_name);
|
|
14442
|
+
return [...new Set(names)];
|
|
14359
14443
|
} finally {
|
|
14360
14444
|
await this.closeConnection();
|
|
14361
14445
|
}
|
|
@@ -14968,6 +15052,8 @@ var MongoIntegration = class {
|
|
|
14968
15052
|
response.connected = true;
|
|
14969
15053
|
} catch (e) {
|
|
14970
15054
|
response.error = e.message;
|
|
15055
|
+
} finally {
|
|
15056
|
+
await this.client.close();
|
|
14971
15057
|
}
|
|
14972
15058
|
return response;
|
|
14973
15059
|
}
|
|
@@ -17230,11 +17316,39 @@ var hasFilters = (query) => {
|
|
|
17230
17316
|
// ../shared-core/src/utils.ts
|
|
17231
17317
|
var utils_exports3 = {};
|
|
17232
17318
|
__export(utils_exports3, {
|
|
17319
|
+
parallelForeach: () => parallelForeach,
|
|
17233
17320
|
unreachable: () => unreachable
|
|
17234
17321
|
});
|
|
17235
17322
|
function unreachable(value, message = `No such case in exhaustive switch: ${value}`) {
|
|
17236
17323
|
throw new Error(message);
|
|
17237
17324
|
}
|
|
17325
|
+
async function parallelForeach(items, task, maxConcurrency) {
|
|
17326
|
+
const promises = [];
|
|
17327
|
+
let index2 = 0;
|
|
17328
|
+
const processItem = async (item) => {
|
|
17329
|
+
try {
|
|
17330
|
+
await task(item);
|
|
17331
|
+
} finally {
|
|
17332
|
+
processNext();
|
|
17333
|
+
}
|
|
17334
|
+
};
|
|
17335
|
+
const processNext = () => {
|
|
17336
|
+
if (index2 >= items.length) {
|
|
17337
|
+
return;
|
|
17338
|
+
}
|
|
17339
|
+
const item = items[index2];
|
|
17340
|
+
index2++;
|
|
17341
|
+
const promise = processItem(item);
|
|
17342
|
+
promises.push(promise);
|
|
17343
|
+
if (promises.length >= maxConcurrency) {
|
|
17344
|
+
Promise.race(promises).then(processNext);
|
|
17345
|
+
} else {
|
|
17346
|
+
processNext();
|
|
17347
|
+
}
|
|
17348
|
+
};
|
|
17349
|
+
processNext();
|
|
17350
|
+
await Promise.all(promises);
|
|
17351
|
+
}
|
|
17238
17352
|
|
|
17239
17353
|
// src/integrations/googlesheets.ts
|
|
17240
17354
|
var ALLOWED_TYPES = [
|
|
@@ -17263,7 +17377,7 @@ var SCHEMA12 = {
|
|
|
17263
17377
|
},
|
|
17264
17378
|
datasource: {
|
|
17265
17379
|
spreadsheetId: {
|
|
17266
|
-
display: "
|
|
17380
|
+
display: "Spreadsheet URL",
|
|
17267
17381
|
type: "string" /* STRING */,
|
|
17268
17382
|
required: true
|
|
17269
17383
|
}
|
|
@@ -17384,6 +17498,7 @@ var GoogleSheetsIntegration = class {
|
|
|
17384
17498
|
async connect() {
|
|
17385
17499
|
var _a;
|
|
17386
17500
|
try {
|
|
17501
|
+
await setupCreationAuth(this.config);
|
|
17387
17502
|
let googleConfig = await configs_exports.getGoogleDatasourceConfig();
|
|
17388
17503
|
if (!googleConfig) {
|
|
17389
17504
|
throw new HTTPError("Google config not found", 400);
|
|
@@ -17434,21 +17549,22 @@ var GoogleSheetsIntegration = class {
|
|
|
17434
17549
|
return table;
|
|
17435
17550
|
}
|
|
17436
17551
|
async buildSchema(datasourceId, entities) {
|
|
17437
|
-
if (!this.config.auth) {
|
|
17438
|
-
return;
|
|
17439
|
-
}
|
|
17440
17552
|
await this.connect();
|
|
17441
17553
|
const sheets = this.client.sheetsByIndex;
|
|
17442
17554
|
const tables = {};
|
|
17443
|
-
|
|
17444
|
-
|
|
17445
|
-
|
|
17446
|
-
|
|
17447
|
-
sheet.title
|
|
17448
|
-
sheet.
|
|
17449
|
-
|
|
17450
|
-
|
|
17451
|
-
|
|
17555
|
+
await utils_exports3.parallelForeach(
|
|
17556
|
+
sheets,
|
|
17557
|
+
async (sheet) => {
|
|
17558
|
+
await sheet.getRows({ limit: 0, offset: 0 });
|
|
17559
|
+
const id = buildExternalTableId(datasourceId, sheet.title);
|
|
17560
|
+
tables[sheet.title] = this.getTableSchema(
|
|
17561
|
+
sheet.title,
|
|
17562
|
+
sheet.headerValues,
|
|
17563
|
+
id
|
|
17564
|
+
);
|
|
17565
|
+
},
|
|
17566
|
+
10
|
|
17567
|
+
);
|
|
17452
17568
|
const final = finaliseExternalTables(tables, entities);
|
|
17453
17569
|
this.tables = final.tables;
|
|
17454
17570
|
this.schemaErrors = final.errors;
|
|
@@ -17694,6 +17810,16 @@ var GoogleSheetsIntegration = class {
|
|
|
17694
17810
|
}
|
|
17695
17811
|
}
|
|
17696
17812
|
};
|
|
17813
|
+
async function setupCreationAuth(datasouce) {
|
|
17814
|
+
if (datasouce.continueSetupId) {
|
|
17815
|
+
const appId = context_exports.getAppId();
|
|
17816
|
+
const tokens = await cache_exports.get(
|
|
17817
|
+
`datasource:creation:${appId}:google:${datasouce.continueSetupId}`
|
|
17818
|
+
);
|
|
17819
|
+
datasouce.auth = tokens.tokens;
|
|
17820
|
+
delete datasouce.continueSetupId;
|
|
17821
|
+
}
|
|
17822
|
+
}
|
|
17697
17823
|
var googlesheets_default = {
|
|
17698
17824
|
schema: SCHEMA12,
|
|
17699
17825
|
integration: GoogleSheetsIntegration
|
|
@@ -18472,24 +18598,24 @@ init_src();
|
|
|
18472
18598
|
var budibaseTempDir2 = objectStore_exports2.budibaseTempDir;
|
|
18473
18599
|
|
|
18474
18600
|
// src/utilities/fileSystem/app.ts
|
|
18475
|
-
var
|
|
18601
|
+
var import_path6 = require("path");
|
|
18476
18602
|
|
|
18477
18603
|
// src/utilities/fileSystem/filesystem.ts
|
|
18478
|
-
var
|
|
18479
|
-
var
|
|
18604
|
+
var import_fs5 = __toESM(require("fs"));
|
|
18605
|
+
var import_path5 = require("path");
|
|
18480
18606
|
var import_tar = __toESM(require("tar"));
|
|
18481
18607
|
var uuid2 = require("uuid/v4");
|
|
18482
|
-
var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0,
|
|
18608
|
+
var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0, import_path5.resolve)((0, import_path5.join)(__dirname, "..", "..", ".."));
|
|
18483
18609
|
var streamFile = (path2) => {
|
|
18484
|
-
return
|
|
18610
|
+
return import_fs5.default.createReadStream(path2);
|
|
18485
18611
|
};
|
|
18486
18612
|
var createTempFolder = (item) => {
|
|
18487
|
-
const path2 = (0,
|
|
18613
|
+
const path2 = (0, import_path5.join)(budibaseTempDir2(), item);
|
|
18488
18614
|
try {
|
|
18489
|
-
if (
|
|
18490
|
-
|
|
18615
|
+
if (import_fs5.default.existsSync(path2)) {
|
|
18616
|
+
import_fs5.default.rmSync(path2, { recursive: true, force: true });
|
|
18491
18617
|
}
|
|
18492
|
-
|
|
18618
|
+
import_fs5.default.mkdirSync(path2);
|
|
18493
18619
|
} catch (err) {
|
|
18494
18620
|
throw new Error(`Path cannot be created: ${err.message}`);
|
|
18495
18621
|
}
|
|
@@ -18503,18 +18629,18 @@ var extractTarball = async (fromFilePath, toPath) => {
|
|
|
18503
18629
|
};
|
|
18504
18630
|
|
|
18505
18631
|
// src/utilities/fileSystem/app.ts
|
|
18506
|
-
var NODE_MODULES_PATH = (0,
|
|
18632
|
+
var NODE_MODULES_PATH = (0, import_path6.join)(TOP_LEVEL_PATH, "node_modules");
|
|
18507
18633
|
|
|
18508
18634
|
// src/utilities/fileSystem/plugin.ts
|
|
18509
|
-
var
|
|
18510
|
-
var
|
|
18511
|
-
var DATASOURCE_PATH = (0,
|
|
18512
|
-
var AUTOMATION_PATH = (0,
|
|
18635
|
+
var import_fs6 = __toESM(require("fs"));
|
|
18636
|
+
var import_path7 = require("path");
|
|
18637
|
+
var DATASOURCE_PATH = (0, import_path7.join)(budibaseTempDir2(), "datasource");
|
|
18638
|
+
var AUTOMATION_PATH = (0, import_path7.join)(budibaseTempDir2(), "automation");
|
|
18513
18639
|
var getPluginMetadata = async (path2) => {
|
|
18514
18640
|
let metadata = {};
|
|
18515
18641
|
try {
|
|
18516
|
-
const pkg2 =
|
|
18517
|
-
const schema =
|
|
18642
|
+
const pkg2 = import_fs6.default.readFileSync((0, import_path7.join)(path2, "package.json"), "utf8");
|
|
18643
|
+
const schema = import_fs6.default.readFileSync((0, import_path7.join)(path2, "schema.json"), "utf8");
|
|
18518
18644
|
metadata.schema = JSON.parse(schema);
|
|
18519
18645
|
metadata.package = JSON.parse(pkg2);
|
|
18520
18646
|
if (!metadata.package.name || !metadata.package.version || !metadata.package.description) {
|
|
@@ -18532,19 +18658,19 @@ var getPluginMetadata = async (path2) => {
|
|
|
18532
18658
|
async function getPluginImpl(path2, plugin) {
|
|
18533
18659
|
var _a;
|
|
18534
18660
|
const hash2 = (_a = plugin.schema) == null ? void 0 : _a.hash;
|
|
18535
|
-
if (!
|
|
18536
|
-
|
|
18661
|
+
if (!import_fs6.default.existsSync(path2)) {
|
|
18662
|
+
import_fs6.default.mkdirSync(path2);
|
|
18537
18663
|
}
|
|
18538
|
-
const filename = (0,
|
|
18664
|
+
const filename = (0, import_path7.join)(path2, plugin.name);
|
|
18539
18665
|
const metadataName = `${filename}.bbmetadata`;
|
|
18540
|
-
if (
|
|
18541
|
-
const currentHash =
|
|
18666
|
+
if (import_fs6.default.existsSync(filename)) {
|
|
18667
|
+
const currentHash = import_fs6.default.readFileSync(metadataName, "utf8");
|
|
18542
18668
|
if (currentHash === hash2) {
|
|
18543
18669
|
return require(filename);
|
|
18544
18670
|
} else {
|
|
18545
18671
|
console.log(`Updating plugin: ${plugin.name}`);
|
|
18546
18672
|
delete require.cache[require.resolve(filename)];
|
|
18547
|
-
|
|
18673
|
+
import_fs6.default.unlinkSync(filename);
|
|
18548
18674
|
}
|
|
18549
18675
|
}
|
|
18550
18676
|
const pluginKey = objectStore_exports2.getPluginJSKey(plugin);
|
|
@@ -18552,8 +18678,8 @@ async function getPluginImpl(path2, plugin) {
|
|
|
18552
18678
|
objectStore_exports2.ObjectStoreBuckets.PLUGINS,
|
|
18553
18679
|
pluginKey
|
|
18554
18680
|
);
|
|
18555
|
-
|
|
18556
|
-
|
|
18681
|
+
import_fs6.default.writeFileSync(filename, pluginJs);
|
|
18682
|
+
import_fs6.default.writeFileSync(metadataName, hash2);
|
|
18557
18683
|
return require(filename);
|
|
18558
18684
|
}
|
|
18559
18685
|
var getDatasourcePlugin = async (plugin) => {
|
|
@@ -18588,19 +18714,20 @@ var GLOBAL_DB_EXPORT_FILE = "global.txt";
|
|
|
18588
18714
|
var STATIC_APP_FILES = ["manifest.json", "budibase-client.js"];
|
|
18589
18715
|
|
|
18590
18716
|
// src/sdk/app/backups/exports.ts
|
|
18591
|
-
var
|
|
18592
|
-
var
|
|
18717
|
+
var import_fs7 = __toESM(require("fs"));
|
|
18718
|
+
var import_path8 = require("path");
|
|
18719
|
+
var import_tar2 = __toESM(require("tar"));
|
|
18593
18720
|
var uuid3 = require("uuid/v4");
|
|
18594
|
-
var tar3 = require("tar");
|
|
18595
18721
|
var MemoryStream = require("memorystream");
|
|
18596
18722
|
function tarFilesToTmp(tmpDir, files) {
|
|
18597
|
-
const
|
|
18598
|
-
|
|
18723
|
+
const fileName = `${uuid3()}.tar.gz`;
|
|
18724
|
+
const exportFile = (0, import_path8.join)(budibaseTempDir2(), fileName);
|
|
18725
|
+
import_tar2.default.create(
|
|
18599
18726
|
{
|
|
18600
18727
|
sync: true,
|
|
18601
18728
|
gzip: true,
|
|
18602
18729
|
file: exportFile,
|
|
18603
|
-
|
|
18730
|
+
noDirRecurse: false,
|
|
18604
18731
|
cwd: tmpDir
|
|
18605
18732
|
},
|
|
18606
18733
|
files
|
|
@@ -18617,7 +18744,7 @@ async function exportDB(dbName, opts = {}) {
|
|
|
18617
18744
|
return db_exports.doWithDB(dbName, async (db) => {
|
|
18618
18745
|
if (opts == null ? void 0 : opts.exportPath) {
|
|
18619
18746
|
const path2 = opts == null ? void 0 : opts.exportPath;
|
|
18620
|
-
const writeStream =
|
|
18747
|
+
const writeStream = import_fs7.default.createWriteStream(path2);
|
|
18621
18748
|
await db.dump(writeStream, exportOpts);
|
|
18622
18749
|
return path2;
|
|
18623
18750
|
} else {
|
|
@@ -18650,9 +18777,9 @@ async function exportApp(appId, config) {
|
|
|
18650
18777
|
for (let path2 of STATIC_APP_FILES) {
|
|
18651
18778
|
const contents = await objectStore_exports2.retrieve(
|
|
18652
18779
|
ObjectStoreBuckets2.APPS,
|
|
18653
|
-
(0,
|
|
18780
|
+
(0, import_path8.join)(appPath, path2)
|
|
18654
18781
|
);
|
|
18655
|
-
|
|
18782
|
+
import_fs7.default.writeFileSync((0, import_path8.join)(tmpPath, path2), contents);
|
|
18656
18783
|
}
|
|
18657
18784
|
} else {
|
|
18658
18785
|
tmpPath = await objectStore_exports2.retrieveDirectory(
|
|
@@ -18661,33 +18788,48 @@ async function exportApp(appId, config) {
|
|
|
18661
18788
|
);
|
|
18662
18789
|
}
|
|
18663
18790
|
}
|
|
18664
|
-
const downloadedPath = (0,
|
|
18665
|
-
if (
|
|
18666
|
-
const allFiles =
|
|
18791
|
+
const downloadedPath = (0, import_path8.join)(tmpPath, appPath);
|
|
18792
|
+
if (import_fs7.default.existsSync(downloadedPath)) {
|
|
18793
|
+
const allFiles = import_fs7.default.readdirSync(downloadedPath);
|
|
18667
18794
|
for (let file of allFiles) {
|
|
18668
|
-
const path2 = (0,
|
|
18669
|
-
|
|
18795
|
+
const path2 = (0, import_path8.join)(downloadedPath, file);
|
|
18796
|
+
import_fs7.default.renameSync(path2, (0, import_path8.join)(downloadedPath, "..", file));
|
|
18670
18797
|
}
|
|
18671
|
-
|
|
18798
|
+
import_fs7.default.rmdirSync(downloadedPath);
|
|
18672
18799
|
}
|
|
18673
|
-
const dbPath = (0,
|
|
18800
|
+
const dbPath = (0, import_path8.join)(tmpPath, DB_EXPORT_FILE);
|
|
18674
18801
|
await exportDB(appId, {
|
|
18675
18802
|
filter: defineFilter(config == null ? void 0 : config.excludeRows, config == null ? void 0 : config.excludeLogs),
|
|
18676
18803
|
exportPath: dbPath
|
|
18677
18804
|
});
|
|
18805
|
+
if (config == null ? void 0 : config.encryptPassword) {
|
|
18806
|
+
for (let file of import_fs7.default.readdirSync(tmpPath)) {
|
|
18807
|
+
const path2 = (0, import_path8.join)(tmpPath, file);
|
|
18808
|
+
await encryption_exports.encryptFile(
|
|
18809
|
+
{ dir: tmpPath, filename: file },
|
|
18810
|
+
config.encryptPassword
|
|
18811
|
+
);
|
|
18812
|
+
import_fs7.default.rmSync(path2);
|
|
18813
|
+
}
|
|
18814
|
+
}
|
|
18678
18815
|
if (config == null ? void 0 : config.tar) {
|
|
18679
|
-
const tarPath = tarFilesToTmp(tmpPath,
|
|
18680
|
-
|
|
18816
|
+
const tarPath = tarFilesToTmp(tmpPath, import_fs7.default.readdirSync(tmpPath));
|
|
18817
|
+
import_fs7.default.rmSync(tmpPath, { recursive: true, force: true });
|
|
18681
18818
|
return tarPath;
|
|
18682
18819
|
} else {
|
|
18683
18820
|
return tmpPath;
|
|
18684
18821
|
}
|
|
18685
18822
|
}
|
|
18686
|
-
async function streamExportApp(
|
|
18823
|
+
async function streamExportApp({
|
|
18824
|
+
appId,
|
|
18825
|
+
excludeRows,
|
|
18826
|
+
encryptPassword
|
|
18827
|
+
}) {
|
|
18687
18828
|
const tmpPath = await exportApp(appId, {
|
|
18688
18829
|
excludeRows,
|
|
18689
18830
|
excludeLogs: true,
|
|
18690
|
-
tar: true
|
|
18831
|
+
tar: true,
|
|
18832
|
+
encryptPassword
|
|
18691
18833
|
});
|
|
18692
18834
|
return streamFile(tmpPath);
|
|
18693
18835
|
}
|
|
@@ -18701,8 +18843,8 @@ __export(imports_exports, {
|
|
|
18701
18843
|
untarFile: () => untarFile,
|
|
18702
18844
|
updateAttachmentColumns: () => updateAttachmentColumns
|
|
18703
18845
|
});
|
|
18704
|
-
var
|
|
18705
|
-
var
|
|
18846
|
+
var import_path9 = require("path");
|
|
18847
|
+
var import_fs8 = __toESM(require("fs"));
|
|
18706
18848
|
init_src();
|
|
18707
18849
|
var uuid4 = require("uuid/v4");
|
|
18708
18850
|
var tar4 = require("tar");
|
|
@@ -18769,16 +18911,16 @@ async function getTemplateStream(template) {
|
|
|
18769
18911
|
throw new Error("Cannot import a non-text based file.");
|
|
18770
18912
|
}
|
|
18771
18913
|
if (template.file) {
|
|
18772
|
-
return
|
|
18914
|
+
return import_fs8.default.createReadStream(template.file.path);
|
|
18773
18915
|
} else if (template.key) {
|
|
18774
18916
|
const [type, name] = template.key.split("/");
|
|
18775
18917
|
const tmpPath = await downloadTemplate(type, name);
|
|
18776
|
-
return
|
|
18918
|
+
return import_fs8.default.createReadStream((0, import_path9.join)(tmpPath, name, "db", "dump.txt"));
|
|
18777
18919
|
}
|
|
18778
18920
|
}
|
|
18779
18921
|
function untarFile(file) {
|
|
18780
|
-
const tmpPath = (0,
|
|
18781
|
-
|
|
18922
|
+
const tmpPath = (0, import_path9.join)(budibaseTempDir2(), uuid4());
|
|
18923
|
+
import_fs8.default.mkdirSync(tmpPath);
|
|
18782
18924
|
tar4.extract({
|
|
18783
18925
|
sync: true,
|
|
18784
18926
|
cwd: tmpPath,
|
|
@@ -18786,31 +18928,49 @@ function untarFile(file) {
|
|
|
18786
18928
|
});
|
|
18787
18929
|
return tmpPath;
|
|
18788
18930
|
}
|
|
18931
|
+
async function decryptFiles(path2, password) {
|
|
18932
|
+
try {
|
|
18933
|
+
for (let file of import_fs8.default.readdirSync(path2)) {
|
|
18934
|
+
const inputPath = (0, import_path9.join)(path2, file);
|
|
18935
|
+
const outputPath = inputPath.replace(/\.enc$/, "");
|
|
18936
|
+
await encryption_exports.decryptFile(inputPath, outputPath, password);
|
|
18937
|
+
import_fs8.default.rmSync(inputPath);
|
|
18938
|
+
}
|
|
18939
|
+
} catch (err) {
|
|
18940
|
+
if (err.message === "incorrect header check") {
|
|
18941
|
+
throw new Error("File cannot be imported");
|
|
18942
|
+
}
|
|
18943
|
+
throw err;
|
|
18944
|
+
}
|
|
18945
|
+
}
|
|
18789
18946
|
function getGlobalDBFile(tmpPath) {
|
|
18790
|
-
return
|
|
18947
|
+
return import_fs8.default.readFileSync((0, import_path9.join)(tmpPath, GLOBAL_DB_EXPORT_FILE), "utf8");
|
|
18791
18948
|
}
|
|
18792
18949
|
function getListOfAppsInMulti(tmpPath) {
|
|
18793
|
-
return
|
|
18950
|
+
return import_fs8.default.readdirSync(tmpPath).filter((dir) => dir !== GLOBAL_DB_EXPORT_FILE);
|
|
18794
18951
|
}
|
|
18795
18952
|
async function importApp(appId, db, template) {
|
|
18796
18953
|
var _a, _b;
|
|
18797
18954
|
let prodAppId = db_exports.getProdAppID(appId);
|
|
18798
18955
|
let dbStream;
|
|
18799
18956
|
const isTar = template.file && ((_b = (_a = template == null ? void 0 : template.file) == null ? void 0 : _a.type) == null ? void 0 : _b.endsWith("gzip"));
|
|
18800
|
-
const isDirectory = template.file &&
|
|
18957
|
+
const isDirectory = template.file && import_fs8.default.lstatSync(template.file.path).isDirectory();
|
|
18801
18958
|
if (template.file && (isTar || isDirectory)) {
|
|
18802
18959
|
const tmpPath = isTar ? untarFile(template.file) : template.file.path;
|
|
18803
|
-
|
|
18960
|
+
if (isTar && template.file.password) {
|
|
18961
|
+
await decryptFiles(tmpPath, template.file.password);
|
|
18962
|
+
}
|
|
18963
|
+
const contents = import_fs8.default.readdirSync(tmpPath);
|
|
18804
18964
|
if (contents.length) {
|
|
18805
18965
|
let promises = [];
|
|
18806
18966
|
let excludedFiles = [GLOBAL_DB_EXPORT_FILE, DB_EXPORT_FILE];
|
|
18807
18967
|
for (let filename of contents) {
|
|
18808
|
-
const path2 = (0,
|
|
18968
|
+
const path2 = (0, import_path9.join)(tmpPath, filename);
|
|
18809
18969
|
if (excludedFiles.includes(filename)) {
|
|
18810
18970
|
continue;
|
|
18811
18971
|
}
|
|
18812
|
-
filename = (0,
|
|
18813
|
-
if (
|
|
18972
|
+
filename = (0, import_path9.join)(prodAppId, filename);
|
|
18973
|
+
if (import_fs8.default.lstatSync(path2).isDirectory()) {
|
|
18814
18974
|
promises.push(
|
|
18815
18975
|
objectStore_exports2.uploadDirectory(ObjectStoreBuckets2.APPS, path2, filename)
|
|
18816
18976
|
);
|
|
@@ -18826,7 +18986,7 @@ async function importApp(appId, db, template) {
|
|
|
18826
18986
|
}
|
|
18827
18987
|
await Promise.all(promises);
|
|
18828
18988
|
}
|
|
18829
|
-
dbStream =
|
|
18989
|
+
dbStream = import_fs8.default.createReadStream((0, import_path9.join)(tmpPath, DB_EXPORT_FILE));
|
|
18830
18990
|
} else {
|
|
18831
18991
|
dbStream = await getTemplateStream(template);
|
|
18832
18992
|
}
|
|
@@ -19945,17 +20105,17 @@ __export(version_exports, {
|
|
|
19945
20105
|
getLicenseVersion: () => getLicenseVersion,
|
|
19946
20106
|
getProVersion: () => getProVersion
|
|
19947
20107
|
});
|
|
19948
|
-
var
|
|
19949
|
-
var
|
|
20108
|
+
var import_fs9 = __toESM(require("fs"));
|
|
20109
|
+
var import_path10 = __toESM(require("path"));
|
|
19950
20110
|
var getLicenseVersion = () => {
|
|
19951
20111
|
if (environment_default2.isDev()) {
|
|
19952
20112
|
const DEV_VER_FILENAME = "dev-version.txt";
|
|
19953
|
-
const verFile =
|
|
19954
|
-
if (
|
|
19955
|
-
return
|
|
20113
|
+
const verFile = import_path10.default.join(objectStore_exports2.budibaseTempDir(), DEV_VER_FILENAME);
|
|
20114
|
+
if (import_fs9.default.existsSync(verFile)) {
|
|
20115
|
+
return import_fs9.default.readFileSync(verFile, "utf8");
|
|
19956
20116
|
} else {
|
|
19957
20117
|
const devVer = utils_exports2.newid();
|
|
19958
|
-
|
|
20118
|
+
import_fs9.default.writeFileSync(verFile, devVer);
|
|
19959
20119
|
return devVer;
|
|
19960
20120
|
}
|
|
19961
20121
|
} else {
|
|
@@ -20314,16 +20474,16 @@ __export(offline_exports, {
|
|
|
20314
20474
|
getOfflineLicense: () => getOfflineLicense,
|
|
20315
20475
|
writeOfflineLicenseToDisk: () => writeOfflineLicenseToDisk
|
|
20316
20476
|
});
|
|
20317
|
-
var
|
|
20318
|
-
var
|
|
20477
|
+
var import_fs10 = __toESM(require("fs"));
|
|
20478
|
+
var import_path11 = require("path");
|
|
20319
20479
|
var import_os2 = require("os");
|
|
20320
20480
|
var import_jsonwebtoken = __toESM(require("jsonwebtoken"));
|
|
20321
20481
|
var SUB_DIRECTORY = environment_default2.isTest() ? ".budibase-test" : ".budibase";
|
|
20322
|
-
var DIRECTORY = (0,
|
|
20482
|
+
var DIRECTORY = (0, import_path11.join)((0, import_os2.tmpdir)(), SUB_DIRECTORY);
|
|
20323
20483
|
var OFFLINE_LICENSE_FILE = "offline_license.txt";
|
|
20324
|
-
var LICENSE_FILE_PATH = (0,
|
|
20325
|
-
if (!
|
|
20326
|
-
|
|
20484
|
+
var LICENSE_FILE_PATH = (0, import_path11.join)(DIRECTORY, OFFLINE_LICENSE_FILE);
|
|
20485
|
+
if (!import_fs10.default.existsSync(DIRECTORY)) {
|
|
20486
|
+
import_fs10.default.mkdirSync(DIRECTORY);
|
|
20327
20487
|
}
|
|
20328
20488
|
var PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvz3jePLCFBXZ19c8Dpkv\nXtSgOhKFOcvQdo/LV0KJRUzQWDPWuO4ILtBtnqhjtIzZH4CH0qCYBet5L6Qr4CM1\nl2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C\n8suunQP5bEScqEY2kclqzSf8e6xqMzPUg3mL/pNa1iEv7TuLbU9nJfgR36l0WmZY\n94fWnSaT8OSXSqcxsaByf06gfS3HAoTJNc7eqz1Hf9fUORQGPUAnFK8cT3SfdA36\nd/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR\nmwIDAQAB\n-----END PUBLIC KEY-----\n";
|
|
20329
20489
|
function getOfflineLicense() {
|
|
@@ -20334,16 +20494,16 @@ function getOfflineLicense() {
|
|
|
20334
20494
|
}
|
|
20335
20495
|
}
|
|
20336
20496
|
function getOfflineLicenseFromDisk() {
|
|
20337
|
-
if (
|
|
20338
|
-
const token =
|
|
20497
|
+
if (import_fs10.default.existsSync(LICENSE_FILE_PATH)) {
|
|
20498
|
+
const token = import_fs10.default.readFileSync(LICENSE_FILE_PATH, { encoding: "utf-8" });
|
|
20339
20499
|
return import_jsonwebtoken.default.verify(token, PUBLIC_KEY, { algorithms: ["RS256"] });
|
|
20340
20500
|
}
|
|
20341
20501
|
}
|
|
20342
20502
|
function writeOfflineLicenseToDisk(signedLicense) {
|
|
20343
|
-
|
|
20503
|
+
import_fs10.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
|
|
20344
20504
|
}
|
|
20345
20505
|
function deleteOfflineLicense() {
|
|
20346
|
-
|
|
20506
|
+
import_fs10.default.rmSync(LICENSE_FILE_PATH, { force: true });
|
|
20347
20507
|
}
|
|
20348
20508
|
|
|
20349
20509
|
// ../pro/packages/pro/src/sdk/licensing/licenses/licenses.ts
|
|
@@ -21548,10 +21708,10 @@ __export(plugins_exports, {
|
|
|
21548
21708
|
init_src();
|
|
21549
21709
|
|
|
21550
21710
|
// ../pro/packages/pro/src/utilities/fileSystem.ts
|
|
21551
|
-
var
|
|
21552
|
-
var
|
|
21711
|
+
var import_fs11 = __toESM(require("fs"));
|
|
21712
|
+
var import_path12 = require("path");
|
|
21553
21713
|
function loadJSFile(directory, name) {
|
|
21554
|
-
return
|
|
21714
|
+
return import_fs11.default.readFileSync((0, import_path12.join)(directory, name), "utf8");
|
|
21555
21715
|
}
|
|
21556
21716
|
|
|
21557
21717
|
// ../pro/packages/pro/src/sdk/plugins/index.ts
|
|
@@ -22189,7 +22349,7 @@ __export(processing_exports, {
|
|
|
22189
22349
|
init: () => init12
|
|
22190
22350
|
});
|
|
22191
22351
|
init_src();
|
|
22192
|
-
var
|
|
22352
|
+
var import_fs12 = __toESM(require("fs"));
|
|
22193
22353
|
async function init12(opts) {
|
|
22194
22354
|
await getBackupQueue().process(async (job) => {
|
|
22195
22355
|
const data = job.data;
|
|
@@ -22257,8 +22417,8 @@ async function runBackup(trigger, tenantId, appId, opts) {
|
|
|
22257
22417
|
}
|
|
22258
22418
|
});
|
|
22259
22419
|
await updateMetadata("complete" /* COMPLETE */, { filename, contents });
|
|
22260
|
-
if (
|
|
22261
|
-
|
|
22420
|
+
if (import_fs12.default.existsSync(tarPath)) {
|
|
22421
|
+
import_fs12.default.rmSync(tarPath);
|
|
22262
22422
|
}
|
|
22263
22423
|
} catch (err) {
|
|
22264
22424
|
logging_exports.logAlert("App backup error", err);
|
|
@@ -22711,7 +22871,7 @@ router3.post(
|
|
|
22711
22871
|
|
|
22712
22872
|
// ../pro/packages/pro/src/api/controllers/apps/backups.ts
|
|
22713
22873
|
init_src();
|
|
22714
|
-
var
|
|
22874
|
+
var import_fs13 = __toESM(require("fs"));
|
|
22715
22875
|
async function checkAppID(ctx, appId) {
|
|
22716
22876
|
if (!await utils_exports5.appExists(appId)) {
|
|
22717
22877
|
ctx.throw(400, `Provided app ID: ${appId} - is invalid.`);
|
|
@@ -22797,7 +22957,7 @@ async function downloadBackup(ctx) {
|
|
|
22797
22957
|
const backupId = ctx.params.backupId;
|
|
22798
22958
|
const { metadata, path: path2 } = await backups_default2.downloadAppBackup(backupId);
|
|
22799
22959
|
ctx.attachment(`backup-${metadata.timestamp}.tar.gz`);
|
|
22800
|
-
ctx.body =
|
|
22960
|
+
ctx.body = import_fs13.default.createReadStream(path2);
|
|
22801
22961
|
}
|
|
22802
22962
|
|
|
22803
22963
|
// ../pro/packages/pro/src/api/routes/apps/backups.ts
|