@budibase/server 2.7.7-alpha.7 → 2.7.7-alpha.9
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/dist/automation.js +249 -125
- package/dist/automation.js.map +3 -3
- package/dist/index.js +323 -194
- package/dist/index.js.map +3 -3
- package/dist/query.js +233 -109
- package/dist/query.js.map +3 -3
- package/package.json +10 -10
- package/src/api/controllers/backup.ts +9 -3
- package/src/api/controllers/role.ts +5 -5
- package/src/api/controllers/routing.ts +3 -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/dist/query.js
CHANGED
|
@@ -10775,7 +10775,7 @@ function lowerBuiltinRoleID(roleId1, roleId2) {
|
|
|
10775
10775
|
}
|
|
10776
10776
|
return builtinRoleToNumber(roleId1) > builtinRoleToNumber(roleId2) ? roleId2 : roleId1;
|
|
10777
10777
|
}
|
|
10778
|
-
async function getRole(roleId) {
|
|
10778
|
+
async function getRole(roleId, opts) {
|
|
10779
10779
|
if (!roleId) {
|
|
10780
10780
|
return void 0;
|
|
10781
10781
|
}
|
|
@@ -10791,6 +10791,9 @@ async function getRole(roleId) {
|
|
|
10791
10791
|
role = Object.assign(role, dbRole);
|
|
10792
10792
|
role._id = getExternalRoleID(role._id);
|
|
10793
10793
|
} catch (err) {
|
|
10794
|
+
if (!isBuiltin(roleId) && (opts == null ? void 0 : opts.defaultPublic)) {
|
|
10795
|
+
return cloneDeep2(BUILTIN_ROLES.PUBLIC);
|
|
10796
|
+
}
|
|
10794
10797
|
if (Object.keys(role).length === 0) {
|
|
10795
10798
|
throw err;
|
|
10796
10799
|
}
|
|
@@ -11565,16 +11568,22 @@ var encryption_exports = {};
|
|
|
11565
11568
|
__export(encryption_exports, {
|
|
11566
11569
|
SecretOption: () => SecretOption,
|
|
11567
11570
|
decrypt: () => decrypt,
|
|
11571
|
+
decryptFile: () => decryptFile,
|
|
11568
11572
|
encrypt: () => encrypt,
|
|
11573
|
+
encryptFile: () => encryptFile,
|
|
11569
11574
|
getSecret: () => getSecret
|
|
11570
11575
|
});
|
|
11571
11576
|
var import_crypto = __toESM(require("crypto"));
|
|
11577
|
+
var import_fs2 = __toESM(require("fs"));
|
|
11578
|
+
var import_zlib = __toESM(require("zlib"));
|
|
11572
11579
|
init_environment2();
|
|
11580
|
+
var import_path2 = require("path");
|
|
11573
11581
|
var ALGO = "aes-256-ctr";
|
|
11574
11582
|
var SEPARATOR3 = "-";
|
|
11575
11583
|
var ITERATIONS = 1e4;
|
|
11576
|
-
var RANDOM_BYTES = 16;
|
|
11577
11584
|
var STRETCH_LENGTH = 32;
|
|
11585
|
+
var SALT_LENGTH = 16;
|
|
11586
|
+
var IV_LENGTH = 16;
|
|
11578
11587
|
var SecretOption = /* @__PURE__ */ ((SecretOption2) => {
|
|
11579
11588
|
SecretOption2["API"] = "api";
|
|
11580
11589
|
SecretOption2["ENCRYPTION"] = "encryption";
|
|
@@ -11598,11 +11607,11 @@ function getSecret(secretOption) {
|
|
|
11598
11607
|
}
|
|
11599
11608
|
return secret;
|
|
11600
11609
|
}
|
|
11601
|
-
function stretchString(
|
|
11602
|
-
return import_crypto.default.pbkdf2Sync(
|
|
11610
|
+
function stretchString(secret, salt) {
|
|
11611
|
+
return import_crypto.default.pbkdf2Sync(secret, salt, ITERATIONS, STRETCH_LENGTH, "sha512");
|
|
11603
11612
|
}
|
|
11604
11613
|
function encrypt(input, secretOption = "api" /* API */) {
|
|
11605
|
-
const salt = import_crypto.default.randomBytes(
|
|
11614
|
+
const salt = import_crypto.default.randomBytes(SALT_LENGTH);
|
|
11606
11615
|
const stretched = stretchString(getSecret(secretOption), salt);
|
|
11607
11616
|
const cipher = import_crypto.default.createCipheriv(ALGO, stretched, salt);
|
|
11608
11617
|
const base = cipher.update(input);
|
|
@@ -11619,6 +11628,87 @@ function decrypt(input, secretOption = "api" /* API */) {
|
|
|
11619
11628
|
const final = decipher.final();
|
|
11620
11629
|
return Buffer.concat([base, final]).toString();
|
|
11621
11630
|
}
|
|
11631
|
+
async function encryptFile({ dir, filename }, secret) {
|
|
11632
|
+
const outputFileName = `${filename}.enc`;
|
|
11633
|
+
const filePath = (0, import_path2.join)(dir, filename);
|
|
11634
|
+
const inputFile = import_fs2.default.createReadStream(filePath);
|
|
11635
|
+
const outputFile = import_fs2.default.createWriteStream((0, import_path2.join)(dir, outputFileName));
|
|
11636
|
+
const salt = import_crypto.default.randomBytes(SALT_LENGTH);
|
|
11637
|
+
const iv = import_crypto.default.randomBytes(IV_LENGTH);
|
|
11638
|
+
const stretched = stretchString(secret, salt);
|
|
11639
|
+
const cipher = import_crypto.default.createCipheriv(ALGO, stretched, iv);
|
|
11640
|
+
outputFile.write(salt);
|
|
11641
|
+
outputFile.write(iv);
|
|
11642
|
+
inputFile.pipe(import_zlib.default.createGzip()).pipe(cipher).pipe(outputFile);
|
|
11643
|
+
return new Promise((r) => {
|
|
11644
|
+
outputFile.on("finish", () => {
|
|
11645
|
+
r({
|
|
11646
|
+
filename: outputFileName,
|
|
11647
|
+
dir
|
|
11648
|
+
});
|
|
11649
|
+
});
|
|
11650
|
+
});
|
|
11651
|
+
}
|
|
11652
|
+
async function getSaltAndIV(path2) {
|
|
11653
|
+
const fileStream = import_fs2.default.createReadStream(path2);
|
|
11654
|
+
const salt = await readBytes(fileStream, SALT_LENGTH);
|
|
11655
|
+
const iv = await readBytes(fileStream, IV_LENGTH);
|
|
11656
|
+
fileStream.close();
|
|
11657
|
+
return { salt, iv };
|
|
11658
|
+
}
|
|
11659
|
+
async function decryptFile(inputPath, outputPath, secret) {
|
|
11660
|
+
const { salt, iv } = await getSaltAndIV(inputPath);
|
|
11661
|
+
const inputFile = import_fs2.default.createReadStream(inputPath, {
|
|
11662
|
+
start: SALT_LENGTH + IV_LENGTH
|
|
11663
|
+
});
|
|
11664
|
+
const outputFile = import_fs2.default.createWriteStream(outputPath);
|
|
11665
|
+
const stretched = stretchString(secret, salt);
|
|
11666
|
+
const decipher = import_crypto.default.createDecipheriv(ALGO, stretched, iv);
|
|
11667
|
+
const unzip = import_zlib.default.createGunzip();
|
|
11668
|
+
inputFile.pipe(decipher).pipe(unzip).pipe(outputFile);
|
|
11669
|
+
return new Promise((res, rej) => {
|
|
11670
|
+
outputFile.on("finish", () => {
|
|
11671
|
+
outputFile.close();
|
|
11672
|
+
res();
|
|
11673
|
+
});
|
|
11674
|
+
inputFile.on("error", (e) => {
|
|
11675
|
+
outputFile.close();
|
|
11676
|
+
rej(e);
|
|
11677
|
+
});
|
|
11678
|
+
decipher.on("error", (e) => {
|
|
11679
|
+
outputFile.close();
|
|
11680
|
+
rej(e);
|
|
11681
|
+
});
|
|
11682
|
+
unzip.on("error", (e) => {
|
|
11683
|
+
outputFile.close();
|
|
11684
|
+
rej(e);
|
|
11685
|
+
});
|
|
11686
|
+
outputFile.on("error", (e) => {
|
|
11687
|
+
outputFile.close();
|
|
11688
|
+
rej(e);
|
|
11689
|
+
});
|
|
11690
|
+
});
|
|
11691
|
+
}
|
|
11692
|
+
function readBytes(stream3, length) {
|
|
11693
|
+
return new Promise((resolve3, reject) => {
|
|
11694
|
+
let bytesRead = 0;
|
|
11695
|
+
const data = [];
|
|
11696
|
+
stream3.on("readable", () => {
|
|
11697
|
+
let chunk;
|
|
11698
|
+
while ((chunk = stream3.read(length - bytesRead)) !== null) {
|
|
11699
|
+
data.push(chunk);
|
|
11700
|
+
bytesRead += chunk.length;
|
|
11701
|
+
}
|
|
11702
|
+
resolve3(Buffer.concat(data));
|
|
11703
|
+
});
|
|
11704
|
+
stream3.on("end", () => {
|
|
11705
|
+
reject(new Error("Insufficient data in the stream."));
|
|
11706
|
+
});
|
|
11707
|
+
stream3.on("error", (error) => {
|
|
11708
|
+
reject(error);
|
|
11709
|
+
});
|
|
11710
|
+
});
|
|
11711
|
+
}
|
|
11622
11712
|
|
|
11623
11713
|
// ../backend-core/src/middleware/authenticated.ts
|
|
11624
11714
|
init_identity();
|
|
@@ -12376,16 +12466,16 @@ var import_aws_sdk = __toESM(require("aws-sdk"));
|
|
|
12376
12466
|
var import_stream = __toESM(require("stream"));
|
|
12377
12467
|
var import_node_fetch6 = __toESM(require("node-fetch"));
|
|
12378
12468
|
var import_tar_fs = __toESM(require("tar-fs"));
|
|
12379
|
-
var
|
|
12469
|
+
var import_zlib2 = __toESM(require("zlib"));
|
|
12380
12470
|
var import_util = require("util");
|
|
12381
|
-
var
|
|
12382
|
-
var
|
|
12471
|
+
var import_path4 = require("path");
|
|
12472
|
+
var import_fs4 = __toESM(require("fs"));
|
|
12383
12473
|
init_environment2();
|
|
12384
12474
|
|
|
12385
12475
|
// ../backend-core/src/objectStore/utils.ts
|
|
12386
|
-
var
|
|
12476
|
+
var import_path3 = require("path");
|
|
12387
12477
|
var import_os = require("os");
|
|
12388
|
-
var
|
|
12478
|
+
var import_fs3 = __toESM(require("fs"));
|
|
12389
12479
|
init_environment2();
|
|
12390
12480
|
var ObjectStoreBuckets = {
|
|
12391
12481
|
BACKUPS: environment_default2.BACKUPS_BUCKET_NAME,
|
|
@@ -12394,9 +12484,9 @@ var ObjectStoreBuckets = {
|
|
|
12394
12484
|
GLOBAL: environment_default2.GLOBAL_BUCKET_NAME,
|
|
12395
12485
|
PLUGINS: environment_default2.PLUGIN_BUCKET_NAME
|
|
12396
12486
|
};
|
|
12397
|
-
var bbTmp = (0,
|
|
12398
|
-
if (!
|
|
12399
|
-
|
|
12487
|
+
var bbTmp = (0, import_path3.join)((0, import_os.tmpdir)(), ".budibase");
|
|
12488
|
+
if (!import_fs3.default.existsSync(bbTmp)) {
|
|
12489
|
+
import_fs3.default.mkdirSync(bbTmp);
|
|
12400
12490
|
}
|
|
12401
12491
|
function budibaseTempDir() {
|
|
12402
12492
|
return bbTmp;
|
|
@@ -12484,7 +12574,7 @@ var upload = async ({
|
|
|
12484
12574
|
metadata
|
|
12485
12575
|
}) => {
|
|
12486
12576
|
const extension = filename.split(".").pop();
|
|
12487
|
-
const fileBytes =
|
|
12577
|
+
const fileBytes = import_fs4.default.readFileSync(path2);
|
|
12488
12578
|
const objectStore = ObjectStore(bucketName);
|
|
12489
12579
|
await makeSureBucketExists(objectStore, bucketName);
|
|
12490
12580
|
let contentType = type;
|
|
@@ -12586,13 +12676,13 @@ var retrieveToTmp = async (bucketName, filepath) => {
|
|
|
12586
12676
|
bucketName = sanitizeBucket(bucketName);
|
|
12587
12677
|
filepath = sanitizeKey(filepath);
|
|
12588
12678
|
const data = await retrieve(bucketName, filepath);
|
|
12589
|
-
const outputPath = (0,
|
|
12590
|
-
|
|
12679
|
+
const outputPath = (0, import_path4.join)(budibaseTempDir(), (0, import_uuid3.v4)());
|
|
12680
|
+
import_fs4.default.writeFileSync(outputPath, data);
|
|
12591
12681
|
return outputPath;
|
|
12592
12682
|
};
|
|
12593
12683
|
var retrieveDirectory = async (bucketName, path2) => {
|
|
12594
|
-
let writePath = (0,
|
|
12595
|
-
|
|
12684
|
+
let writePath = (0, import_path4.join)(budibaseTempDir(), (0, import_uuid3.v4)());
|
|
12685
|
+
import_fs4.default.mkdirSync(writePath);
|
|
12596
12686
|
const objects = await listAllObjects(bucketName, path2);
|
|
12597
12687
|
let fullObjects = await Promise.all(
|
|
12598
12688
|
objects.map((obj) => retrieve(bucketName, obj.Key))
|
|
@@ -12604,9 +12694,9 @@ var retrieveDirectory = async (bucketName, path2) => {
|
|
|
12604
12694
|
const possiblePath = filename.split("/");
|
|
12605
12695
|
if (possiblePath.length > 1) {
|
|
12606
12696
|
const dirs = possiblePath.slice(0, possiblePath.length - 1);
|
|
12607
|
-
|
|
12697
|
+
import_fs4.default.mkdirSync((0, import_path4.join)(writePath, ...dirs), { recursive: true });
|
|
12608
12698
|
}
|
|
12609
|
-
|
|
12699
|
+
import_fs4.default.writeFileSync((0, import_path4.join)(writePath, ...possiblePath), data);
|
|
12610
12700
|
}
|
|
12611
12701
|
return writePath;
|
|
12612
12702
|
};
|
|
@@ -12660,14 +12750,14 @@ var deleteFolder = async (bucketName, folder) => {
|
|
|
12660
12750
|
var uploadDirectory = async (bucketName, localPath, bucketPath) => {
|
|
12661
12751
|
bucketName = sanitizeBucket(bucketName);
|
|
12662
12752
|
let uploads = [];
|
|
12663
|
-
const files =
|
|
12753
|
+
const files = import_fs4.default.readdirSync(localPath, { withFileTypes: true });
|
|
12664
12754
|
for (let file of files) {
|
|
12665
|
-
const path2 = sanitizeKey((0,
|
|
12666
|
-
const local = (0,
|
|
12755
|
+
const path2 = sanitizeKey((0, import_path4.join)(bucketPath, file.name));
|
|
12756
|
+
const local = (0, import_path4.join)(localPath, file.name);
|
|
12667
12757
|
if (file.isDirectory()) {
|
|
12668
12758
|
uploads.push(uploadDirectory(bucketName, local, path2));
|
|
12669
12759
|
} else {
|
|
12670
|
-
uploads.push(streamUpload(bucketName, path2,
|
|
12760
|
+
uploads.push(streamUpload(bucketName, path2, import_fs4.default.createReadStream(local)));
|
|
12671
12761
|
}
|
|
12672
12762
|
}
|
|
12673
12763
|
await Promise.all(uploads);
|
|
@@ -12679,7 +12769,7 @@ var downloadTarballDirect = async (url, path2, headers = {}) => {
|
|
|
12679
12769
|
if (!response.ok) {
|
|
12680
12770
|
throw new Error(`unexpected response ${response.statusText}`);
|
|
12681
12771
|
}
|
|
12682
|
-
await streamPipeline(response.body,
|
|
12772
|
+
await streamPipeline(response.body, import_zlib2.default.createUnzip(), import_tar_fs.default.extract(path2));
|
|
12683
12773
|
};
|
|
12684
12774
|
var downloadTarball = async (url, bucketName, path2) => {
|
|
12685
12775
|
bucketName = sanitizeBucket(bucketName);
|
|
@@ -12688,8 +12778,8 @@ var downloadTarball = async (url, bucketName, path2) => {
|
|
|
12688
12778
|
if (!response.ok) {
|
|
12689
12779
|
throw new Error(`unexpected response ${response.statusText}`);
|
|
12690
12780
|
}
|
|
12691
|
-
const tmpPath = (0,
|
|
12692
|
-
await streamPipeline(response.body,
|
|
12781
|
+
const tmpPath = (0, import_path4.join)(budibaseTempDir(), path2);
|
|
12782
|
+
await streamPipeline(response.body, import_zlib2.default.createUnzip(), import_tar_fs.default.extract(tmpPath));
|
|
12693
12783
|
if (!environment_default2.isTest() && environment_default2.SELF_HOSTED) {
|
|
12694
12784
|
await uploadDirectory(bucketName, tmpPath, path2);
|
|
12695
12785
|
}
|
|
@@ -18505,24 +18595,24 @@ init_src();
|
|
|
18505
18595
|
var budibaseTempDir2 = objectStore_exports2.budibaseTempDir;
|
|
18506
18596
|
|
|
18507
18597
|
// src/utilities/fileSystem/app.ts
|
|
18508
|
-
var
|
|
18598
|
+
var import_path6 = require("path");
|
|
18509
18599
|
|
|
18510
18600
|
// src/utilities/fileSystem/filesystem.ts
|
|
18511
|
-
var
|
|
18512
|
-
var
|
|
18601
|
+
var import_fs5 = __toESM(require("fs"));
|
|
18602
|
+
var import_path5 = require("path");
|
|
18513
18603
|
var import_tar = __toESM(require("tar"));
|
|
18514
18604
|
var uuid2 = require("uuid/v4");
|
|
18515
|
-
var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0,
|
|
18605
|
+
var TOP_LEVEL_PATH = environment_default.TOP_LEVEL_PATH || (0, import_path5.resolve)((0, import_path5.join)(__dirname, "..", "..", ".."));
|
|
18516
18606
|
var streamFile = (path2) => {
|
|
18517
|
-
return
|
|
18607
|
+
return import_fs5.default.createReadStream(path2);
|
|
18518
18608
|
};
|
|
18519
18609
|
var createTempFolder = (item) => {
|
|
18520
|
-
const path2 = (0,
|
|
18610
|
+
const path2 = (0, import_path5.join)(budibaseTempDir2(), item);
|
|
18521
18611
|
try {
|
|
18522
|
-
if (
|
|
18523
|
-
|
|
18612
|
+
if (import_fs5.default.existsSync(path2)) {
|
|
18613
|
+
import_fs5.default.rmSync(path2, { recursive: true, force: true });
|
|
18524
18614
|
}
|
|
18525
|
-
|
|
18615
|
+
import_fs5.default.mkdirSync(path2);
|
|
18526
18616
|
} catch (err) {
|
|
18527
18617
|
throw new Error(`Path cannot be created: ${err.message}`);
|
|
18528
18618
|
}
|
|
@@ -18536,18 +18626,18 @@ var extractTarball = async (fromFilePath, toPath) => {
|
|
|
18536
18626
|
};
|
|
18537
18627
|
|
|
18538
18628
|
// src/utilities/fileSystem/app.ts
|
|
18539
|
-
var NODE_MODULES_PATH = (0,
|
|
18629
|
+
var NODE_MODULES_PATH = (0, import_path6.join)(TOP_LEVEL_PATH, "node_modules");
|
|
18540
18630
|
|
|
18541
18631
|
// src/utilities/fileSystem/plugin.ts
|
|
18542
|
-
var
|
|
18543
|
-
var
|
|
18544
|
-
var DATASOURCE_PATH = (0,
|
|
18545
|
-
var AUTOMATION_PATH = (0,
|
|
18632
|
+
var import_fs6 = __toESM(require("fs"));
|
|
18633
|
+
var import_path7 = require("path");
|
|
18634
|
+
var DATASOURCE_PATH = (0, import_path7.join)(budibaseTempDir2(), "datasource");
|
|
18635
|
+
var AUTOMATION_PATH = (0, import_path7.join)(budibaseTempDir2(), "automation");
|
|
18546
18636
|
var getPluginMetadata = async (path2) => {
|
|
18547
18637
|
let metadata = {};
|
|
18548
18638
|
try {
|
|
18549
|
-
const pkg2 =
|
|
18550
|
-
const schema =
|
|
18639
|
+
const pkg2 = import_fs6.default.readFileSync((0, import_path7.join)(path2, "package.json"), "utf8");
|
|
18640
|
+
const schema = import_fs6.default.readFileSync((0, import_path7.join)(path2, "schema.json"), "utf8");
|
|
18551
18641
|
metadata.schema = JSON.parse(schema);
|
|
18552
18642
|
metadata.package = JSON.parse(pkg2);
|
|
18553
18643
|
if (!metadata.package.name || !metadata.package.version || !metadata.package.description) {
|
|
@@ -18565,19 +18655,19 @@ var getPluginMetadata = async (path2) => {
|
|
|
18565
18655
|
async function getPluginImpl(path2, plugin) {
|
|
18566
18656
|
var _a;
|
|
18567
18657
|
const hash2 = (_a = plugin.schema) == null ? void 0 : _a.hash;
|
|
18568
|
-
if (!
|
|
18569
|
-
|
|
18658
|
+
if (!import_fs6.default.existsSync(path2)) {
|
|
18659
|
+
import_fs6.default.mkdirSync(path2);
|
|
18570
18660
|
}
|
|
18571
|
-
const filename = (0,
|
|
18661
|
+
const filename = (0, import_path7.join)(path2, plugin.name);
|
|
18572
18662
|
const metadataName = `${filename}.bbmetadata`;
|
|
18573
|
-
if (
|
|
18574
|
-
const currentHash =
|
|
18663
|
+
if (import_fs6.default.existsSync(filename)) {
|
|
18664
|
+
const currentHash = import_fs6.default.readFileSync(metadataName, "utf8");
|
|
18575
18665
|
if (currentHash === hash2) {
|
|
18576
18666
|
return require(filename);
|
|
18577
18667
|
} else {
|
|
18578
18668
|
console.log(`Updating plugin: ${plugin.name}`);
|
|
18579
18669
|
delete require.cache[require.resolve(filename)];
|
|
18580
|
-
|
|
18670
|
+
import_fs6.default.unlinkSync(filename);
|
|
18581
18671
|
}
|
|
18582
18672
|
}
|
|
18583
18673
|
const pluginKey = objectStore_exports2.getPluginJSKey(plugin);
|
|
@@ -18585,8 +18675,8 @@ async function getPluginImpl(path2, plugin) {
|
|
|
18585
18675
|
objectStore_exports2.ObjectStoreBuckets.PLUGINS,
|
|
18586
18676
|
pluginKey
|
|
18587
18677
|
);
|
|
18588
|
-
|
|
18589
|
-
|
|
18678
|
+
import_fs6.default.writeFileSync(filename, pluginJs);
|
|
18679
|
+
import_fs6.default.writeFileSync(metadataName, hash2);
|
|
18590
18680
|
return require(filename);
|
|
18591
18681
|
}
|
|
18592
18682
|
var getDatasourcePlugin = async (plugin) => {
|
|
@@ -18621,19 +18711,20 @@ var GLOBAL_DB_EXPORT_FILE = "global.txt";
|
|
|
18621
18711
|
var STATIC_APP_FILES = ["manifest.json", "budibase-client.js"];
|
|
18622
18712
|
|
|
18623
18713
|
// src/sdk/app/backups/exports.ts
|
|
18624
|
-
var
|
|
18625
|
-
var
|
|
18714
|
+
var import_fs7 = __toESM(require("fs"));
|
|
18715
|
+
var import_path8 = require("path");
|
|
18716
|
+
var import_tar2 = __toESM(require("tar"));
|
|
18626
18717
|
var uuid3 = require("uuid/v4");
|
|
18627
|
-
var tar3 = require("tar");
|
|
18628
18718
|
var MemoryStream = require("memorystream");
|
|
18629
18719
|
function tarFilesToTmp(tmpDir, files) {
|
|
18630
|
-
const
|
|
18631
|
-
|
|
18720
|
+
const fileName = `${uuid3()}.tar.gz`;
|
|
18721
|
+
const exportFile = (0, import_path8.join)(budibaseTempDir2(), fileName);
|
|
18722
|
+
import_tar2.default.create(
|
|
18632
18723
|
{
|
|
18633
18724
|
sync: true,
|
|
18634
18725
|
gzip: true,
|
|
18635
18726
|
file: exportFile,
|
|
18636
|
-
|
|
18727
|
+
noDirRecurse: false,
|
|
18637
18728
|
cwd: tmpDir
|
|
18638
18729
|
},
|
|
18639
18730
|
files
|
|
@@ -18650,7 +18741,7 @@ async function exportDB(dbName, opts = {}) {
|
|
|
18650
18741
|
return db_exports.doWithDB(dbName, async (db) => {
|
|
18651
18742
|
if (opts == null ? void 0 : opts.exportPath) {
|
|
18652
18743
|
const path2 = opts == null ? void 0 : opts.exportPath;
|
|
18653
|
-
const writeStream =
|
|
18744
|
+
const writeStream = import_fs7.default.createWriteStream(path2);
|
|
18654
18745
|
await db.dump(writeStream, exportOpts);
|
|
18655
18746
|
return path2;
|
|
18656
18747
|
} else {
|
|
@@ -18683,9 +18774,9 @@ async function exportApp(appId, config) {
|
|
|
18683
18774
|
for (let path2 of STATIC_APP_FILES) {
|
|
18684
18775
|
const contents = await objectStore_exports2.retrieve(
|
|
18685
18776
|
ObjectStoreBuckets2.APPS,
|
|
18686
|
-
(0,
|
|
18777
|
+
(0, import_path8.join)(appPath, path2)
|
|
18687
18778
|
);
|
|
18688
|
-
|
|
18779
|
+
import_fs7.default.writeFileSync((0, import_path8.join)(tmpPath, path2), contents);
|
|
18689
18780
|
}
|
|
18690
18781
|
} else {
|
|
18691
18782
|
tmpPath = await objectStore_exports2.retrieveDirectory(
|
|
@@ -18694,33 +18785,48 @@ async function exportApp(appId, config) {
|
|
|
18694
18785
|
);
|
|
18695
18786
|
}
|
|
18696
18787
|
}
|
|
18697
|
-
const downloadedPath = (0,
|
|
18698
|
-
if (
|
|
18699
|
-
const allFiles =
|
|
18788
|
+
const downloadedPath = (0, import_path8.join)(tmpPath, appPath);
|
|
18789
|
+
if (import_fs7.default.existsSync(downloadedPath)) {
|
|
18790
|
+
const allFiles = import_fs7.default.readdirSync(downloadedPath);
|
|
18700
18791
|
for (let file of allFiles) {
|
|
18701
|
-
const path2 = (0,
|
|
18702
|
-
|
|
18792
|
+
const path2 = (0, import_path8.join)(downloadedPath, file);
|
|
18793
|
+
import_fs7.default.renameSync(path2, (0, import_path8.join)(downloadedPath, "..", file));
|
|
18703
18794
|
}
|
|
18704
|
-
|
|
18795
|
+
import_fs7.default.rmdirSync(downloadedPath);
|
|
18705
18796
|
}
|
|
18706
|
-
const dbPath = (0,
|
|
18797
|
+
const dbPath = (0, import_path8.join)(tmpPath, DB_EXPORT_FILE);
|
|
18707
18798
|
await exportDB(appId, {
|
|
18708
18799
|
filter: defineFilter(config == null ? void 0 : config.excludeRows, config == null ? void 0 : config.excludeLogs),
|
|
18709
18800
|
exportPath: dbPath
|
|
18710
18801
|
});
|
|
18802
|
+
if (config == null ? void 0 : config.encryptPassword) {
|
|
18803
|
+
for (let file of import_fs7.default.readdirSync(tmpPath)) {
|
|
18804
|
+
const path2 = (0, import_path8.join)(tmpPath, file);
|
|
18805
|
+
await encryption_exports.encryptFile(
|
|
18806
|
+
{ dir: tmpPath, filename: file },
|
|
18807
|
+
config.encryptPassword
|
|
18808
|
+
);
|
|
18809
|
+
import_fs7.default.rmSync(path2);
|
|
18810
|
+
}
|
|
18811
|
+
}
|
|
18711
18812
|
if (config == null ? void 0 : config.tar) {
|
|
18712
|
-
const tarPath = tarFilesToTmp(tmpPath,
|
|
18713
|
-
|
|
18813
|
+
const tarPath = tarFilesToTmp(tmpPath, import_fs7.default.readdirSync(tmpPath));
|
|
18814
|
+
import_fs7.default.rmSync(tmpPath, { recursive: true, force: true });
|
|
18714
18815
|
return tarPath;
|
|
18715
18816
|
} else {
|
|
18716
18817
|
return tmpPath;
|
|
18717
18818
|
}
|
|
18718
18819
|
}
|
|
18719
|
-
async function streamExportApp(
|
|
18820
|
+
async function streamExportApp({
|
|
18821
|
+
appId,
|
|
18822
|
+
excludeRows,
|
|
18823
|
+
encryptPassword
|
|
18824
|
+
}) {
|
|
18720
18825
|
const tmpPath = await exportApp(appId, {
|
|
18721
18826
|
excludeRows,
|
|
18722
18827
|
excludeLogs: true,
|
|
18723
|
-
tar: true
|
|
18828
|
+
tar: true,
|
|
18829
|
+
encryptPassword
|
|
18724
18830
|
});
|
|
18725
18831
|
return streamFile(tmpPath);
|
|
18726
18832
|
}
|
|
@@ -18734,8 +18840,8 @@ __export(imports_exports, {
|
|
|
18734
18840
|
untarFile: () => untarFile,
|
|
18735
18841
|
updateAttachmentColumns: () => updateAttachmentColumns
|
|
18736
18842
|
});
|
|
18737
|
-
var
|
|
18738
|
-
var
|
|
18843
|
+
var import_path9 = require("path");
|
|
18844
|
+
var import_fs8 = __toESM(require("fs"));
|
|
18739
18845
|
init_src();
|
|
18740
18846
|
var uuid4 = require("uuid/v4");
|
|
18741
18847
|
var tar4 = require("tar");
|
|
@@ -18802,16 +18908,16 @@ async function getTemplateStream(template) {
|
|
|
18802
18908
|
throw new Error("Cannot import a non-text based file.");
|
|
18803
18909
|
}
|
|
18804
18910
|
if (template.file) {
|
|
18805
|
-
return
|
|
18911
|
+
return import_fs8.default.createReadStream(template.file.path);
|
|
18806
18912
|
} else if (template.key) {
|
|
18807
18913
|
const [type, name] = template.key.split("/");
|
|
18808
18914
|
const tmpPath = await downloadTemplate(type, name);
|
|
18809
|
-
return
|
|
18915
|
+
return import_fs8.default.createReadStream((0, import_path9.join)(tmpPath, name, "db", "dump.txt"));
|
|
18810
18916
|
}
|
|
18811
18917
|
}
|
|
18812
18918
|
function untarFile(file) {
|
|
18813
|
-
const tmpPath = (0,
|
|
18814
|
-
|
|
18919
|
+
const tmpPath = (0, import_path9.join)(budibaseTempDir2(), uuid4());
|
|
18920
|
+
import_fs8.default.mkdirSync(tmpPath);
|
|
18815
18921
|
tar4.extract({
|
|
18816
18922
|
sync: true,
|
|
18817
18923
|
cwd: tmpPath,
|
|
@@ -18819,31 +18925,49 @@ function untarFile(file) {
|
|
|
18819
18925
|
});
|
|
18820
18926
|
return tmpPath;
|
|
18821
18927
|
}
|
|
18928
|
+
async function decryptFiles(path2, password) {
|
|
18929
|
+
try {
|
|
18930
|
+
for (let file of import_fs8.default.readdirSync(path2)) {
|
|
18931
|
+
const inputPath = (0, import_path9.join)(path2, file);
|
|
18932
|
+
const outputPath = inputPath.replace(/\.enc$/, "");
|
|
18933
|
+
await encryption_exports.decryptFile(inputPath, outputPath, password);
|
|
18934
|
+
import_fs8.default.rmSync(inputPath);
|
|
18935
|
+
}
|
|
18936
|
+
} catch (err) {
|
|
18937
|
+
if (err.message === "incorrect header check") {
|
|
18938
|
+
throw new Error("File cannot be imported");
|
|
18939
|
+
}
|
|
18940
|
+
throw err;
|
|
18941
|
+
}
|
|
18942
|
+
}
|
|
18822
18943
|
function getGlobalDBFile(tmpPath) {
|
|
18823
|
-
return
|
|
18944
|
+
return import_fs8.default.readFileSync((0, import_path9.join)(tmpPath, GLOBAL_DB_EXPORT_FILE), "utf8");
|
|
18824
18945
|
}
|
|
18825
18946
|
function getListOfAppsInMulti(tmpPath) {
|
|
18826
|
-
return
|
|
18947
|
+
return import_fs8.default.readdirSync(tmpPath).filter((dir) => dir !== GLOBAL_DB_EXPORT_FILE);
|
|
18827
18948
|
}
|
|
18828
18949
|
async function importApp(appId, db, template) {
|
|
18829
18950
|
var _a, _b;
|
|
18830
18951
|
let prodAppId = db_exports.getProdAppID(appId);
|
|
18831
18952
|
let dbStream;
|
|
18832
18953
|
const isTar = template.file && ((_b = (_a = template == null ? void 0 : template.file) == null ? void 0 : _a.type) == null ? void 0 : _b.endsWith("gzip"));
|
|
18833
|
-
const isDirectory = template.file &&
|
|
18954
|
+
const isDirectory = template.file && import_fs8.default.lstatSync(template.file.path).isDirectory();
|
|
18834
18955
|
if (template.file && (isTar || isDirectory)) {
|
|
18835
18956
|
const tmpPath = isTar ? untarFile(template.file) : template.file.path;
|
|
18836
|
-
|
|
18957
|
+
if (isTar && template.file.password) {
|
|
18958
|
+
await decryptFiles(tmpPath, template.file.password);
|
|
18959
|
+
}
|
|
18960
|
+
const contents = import_fs8.default.readdirSync(tmpPath);
|
|
18837
18961
|
if (contents.length) {
|
|
18838
18962
|
let promises = [];
|
|
18839
18963
|
let excludedFiles = [GLOBAL_DB_EXPORT_FILE, DB_EXPORT_FILE];
|
|
18840
18964
|
for (let filename of contents) {
|
|
18841
|
-
const path2 = (0,
|
|
18965
|
+
const path2 = (0, import_path9.join)(tmpPath, filename);
|
|
18842
18966
|
if (excludedFiles.includes(filename)) {
|
|
18843
18967
|
continue;
|
|
18844
18968
|
}
|
|
18845
|
-
filename = (0,
|
|
18846
|
-
if (
|
|
18969
|
+
filename = (0, import_path9.join)(prodAppId, filename);
|
|
18970
|
+
if (import_fs8.default.lstatSync(path2).isDirectory()) {
|
|
18847
18971
|
promises.push(
|
|
18848
18972
|
objectStore_exports2.uploadDirectory(ObjectStoreBuckets2.APPS, path2, filename)
|
|
18849
18973
|
);
|
|
@@ -18859,7 +18983,7 @@ async function importApp(appId, db, template) {
|
|
|
18859
18983
|
}
|
|
18860
18984
|
await Promise.all(promises);
|
|
18861
18985
|
}
|
|
18862
|
-
dbStream =
|
|
18986
|
+
dbStream = import_fs8.default.createReadStream((0, import_path9.join)(tmpPath, DB_EXPORT_FILE));
|
|
18863
18987
|
} else {
|
|
18864
18988
|
dbStream = await getTemplateStream(template);
|
|
18865
18989
|
}
|
|
@@ -19978,17 +20102,17 @@ __export(version_exports, {
|
|
|
19978
20102
|
getLicenseVersion: () => getLicenseVersion,
|
|
19979
20103
|
getProVersion: () => getProVersion
|
|
19980
20104
|
});
|
|
19981
|
-
var
|
|
19982
|
-
var
|
|
20105
|
+
var import_fs9 = __toESM(require("fs"));
|
|
20106
|
+
var import_path10 = __toESM(require("path"));
|
|
19983
20107
|
var getLicenseVersion = () => {
|
|
19984
20108
|
if (environment_default2.isDev()) {
|
|
19985
20109
|
const DEV_VER_FILENAME = "dev-version.txt";
|
|
19986
|
-
const verFile =
|
|
19987
|
-
if (
|
|
19988
|
-
return
|
|
20110
|
+
const verFile = import_path10.default.join(objectStore_exports2.budibaseTempDir(), DEV_VER_FILENAME);
|
|
20111
|
+
if (import_fs9.default.existsSync(verFile)) {
|
|
20112
|
+
return import_fs9.default.readFileSync(verFile, "utf8");
|
|
19989
20113
|
} else {
|
|
19990
20114
|
const devVer = utils_exports2.newid();
|
|
19991
|
-
|
|
20115
|
+
import_fs9.default.writeFileSync(verFile, devVer);
|
|
19992
20116
|
return devVer;
|
|
19993
20117
|
}
|
|
19994
20118
|
} else {
|
|
@@ -20347,16 +20471,16 @@ __export(offline_exports, {
|
|
|
20347
20471
|
getOfflineLicense: () => getOfflineLicense,
|
|
20348
20472
|
writeOfflineLicenseToDisk: () => writeOfflineLicenseToDisk
|
|
20349
20473
|
});
|
|
20350
|
-
var
|
|
20351
|
-
var
|
|
20474
|
+
var import_fs10 = __toESM(require("fs"));
|
|
20475
|
+
var import_path11 = require("path");
|
|
20352
20476
|
var import_os2 = require("os");
|
|
20353
20477
|
var import_jsonwebtoken = __toESM(require("jsonwebtoken"));
|
|
20354
20478
|
var SUB_DIRECTORY = environment_default2.isTest() ? ".budibase-test" : ".budibase";
|
|
20355
|
-
var DIRECTORY = (0,
|
|
20479
|
+
var DIRECTORY = (0, import_path11.join)((0, import_os2.tmpdir)(), SUB_DIRECTORY);
|
|
20356
20480
|
var OFFLINE_LICENSE_FILE = "offline_license.txt";
|
|
20357
|
-
var LICENSE_FILE_PATH = (0,
|
|
20358
|
-
if (!
|
|
20359
|
-
|
|
20481
|
+
var LICENSE_FILE_PATH = (0, import_path11.join)(DIRECTORY, OFFLINE_LICENSE_FILE);
|
|
20482
|
+
if (!import_fs10.default.existsSync(DIRECTORY)) {
|
|
20483
|
+
import_fs10.default.mkdirSync(DIRECTORY);
|
|
20360
20484
|
}
|
|
20361
20485
|
var PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvz3jePLCFBXZ19c8Dpkv\nXtSgOhKFOcvQdo/LV0KJRUzQWDPWuO4ILtBtnqhjtIzZH4CH0qCYBet5L6Qr4CM1\nl2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C\n8suunQP5bEScqEY2kclqzSf8e6xqMzPUg3mL/pNa1iEv7TuLbU9nJfgR36l0WmZY\n94fWnSaT8OSXSqcxsaByf06gfS3HAoTJNc7eqz1Hf9fUORQGPUAnFK8cT3SfdA36\nd/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR\nmwIDAQAB\n-----END PUBLIC KEY-----\n";
|
|
20362
20486
|
function getOfflineLicense() {
|
|
@@ -20367,16 +20491,16 @@ function getOfflineLicense() {
|
|
|
20367
20491
|
}
|
|
20368
20492
|
}
|
|
20369
20493
|
function getOfflineLicenseFromDisk() {
|
|
20370
|
-
if (
|
|
20371
|
-
const token =
|
|
20494
|
+
if (import_fs10.default.existsSync(LICENSE_FILE_PATH)) {
|
|
20495
|
+
const token = import_fs10.default.readFileSync(LICENSE_FILE_PATH, { encoding: "utf-8" });
|
|
20372
20496
|
return import_jsonwebtoken.default.verify(token, PUBLIC_KEY, { algorithms: ["RS256"] });
|
|
20373
20497
|
}
|
|
20374
20498
|
}
|
|
20375
20499
|
function writeOfflineLicenseToDisk(signedLicense) {
|
|
20376
|
-
|
|
20500
|
+
import_fs10.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
|
|
20377
20501
|
}
|
|
20378
20502
|
function deleteOfflineLicense() {
|
|
20379
|
-
|
|
20503
|
+
import_fs10.default.rmSync(LICENSE_FILE_PATH, { force: true });
|
|
20380
20504
|
}
|
|
20381
20505
|
|
|
20382
20506
|
// ../pro/packages/pro/src/sdk/licensing/licenses/licenses.ts
|
|
@@ -21581,10 +21705,10 @@ __export(plugins_exports, {
|
|
|
21581
21705
|
init_src();
|
|
21582
21706
|
|
|
21583
21707
|
// ../pro/packages/pro/src/utilities/fileSystem.ts
|
|
21584
|
-
var
|
|
21585
|
-
var
|
|
21708
|
+
var import_fs11 = __toESM(require("fs"));
|
|
21709
|
+
var import_path12 = require("path");
|
|
21586
21710
|
function loadJSFile(directory, name) {
|
|
21587
|
-
return
|
|
21711
|
+
return import_fs11.default.readFileSync((0, import_path12.join)(directory, name), "utf8");
|
|
21588
21712
|
}
|
|
21589
21713
|
|
|
21590
21714
|
// ../pro/packages/pro/src/sdk/plugins/index.ts
|
|
@@ -22222,7 +22346,7 @@ __export(processing_exports, {
|
|
|
22222
22346
|
init: () => init12
|
|
22223
22347
|
});
|
|
22224
22348
|
init_src();
|
|
22225
|
-
var
|
|
22349
|
+
var import_fs12 = __toESM(require("fs"));
|
|
22226
22350
|
async function init12(opts) {
|
|
22227
22351
|
await getBackupQueue().process(async (job) => {
|
|
22228
22352
|
const data = job.data;
|
|
@@ -22290,8 +22414,8 @@ async function runBackup(trigger, tenantId, appId, opts) {
|
|
|
22290
22414
|
}
|
|
22291
22415
|
});
|
|
22292
22416
|
await updateMetadata("complete" /* COMPLETE */, { filename, contents });
|
|
22293
|
-
if (
|
|
22294
|
-
|
|
22417
|
+
if (import_fs12.default.existsSync(tarPath)) {
|
|
22418
|
+
import_fs12.default.rmSync(tarPath);
|
|
22295
22419
|
}
|
|
22296
22420
|
} catch (err) {
|
|
22297
22421
|
logging_exports.logAlert("App backup error", err);
|
|
@@ -22744,7 +22868,7 @@ router3.post(
|
|
|
22744
22868
|
|
|
22745
22869
|
// ../pro/packages/pro/src/api/controllers/apps/backups.ts
|
|
22746
22870
|
init_src();
|
|
22747
|
-
var
|
|
22871
|
+
var import_fs13 = __toESM(require("fs"));
|
|
22748
22872
|
async function checkAppID(ctx, appId) {
|
|
22749
22873
|
if (!await utils_exports5.appExists(appId)) {
|
|
22750
22874
|
ctx.throw(400, `Provided app ID: ${appId} - is invalid.`);
|
|
@@ -22830,7 +22954,7 @@ async function downloadBackup(ctx) {
|
|
|
22830
22954
|
const backupId = ctx.params.backupId;
|
|
22831
22955
|
const { metadata, path: path2 } = await backups_default2.downloadAppBackup(backupId);
|
|
22832
22956
|
ctx.attachment(`backup-${metadata.timestamp}.tar.gz`);
|
|
22833
|
-
ctx.body =
|
|
22957
|
+
ctx.body = import_fs13.default.createReadStream(path2);
|
|
22834
22958
|
}
|
|
22835
22959
|
|
|
22836
22960
|
// ../pro/packages/pro/src/api/routes/apps/backups.ts
|