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