@budibase/server 2.7.7-alpha.7 → 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/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(string, salt) {
11602
- return import_crypto.default.pbkdf2Sync(string, salt, ITERATIONS, STRETCH_LENGTH, "sha512");
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(RANDOM_BYTES);
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 import_zlib = __toESM(require("zlib"));
12466
+ var import_zlib2 = __toESM(require("zlib"));
12380
12467
  var import_util = require("util");
12381
- var import_path3 = require("path");
12382
- var import_fs3 = __toESM(require("fs"));
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 import_path2 = require("path");
12473
+ var import_path3 = require("path");
12387
12474
  var import_os = require("os");
12388
- var import_fs2 = __toESM(require("fs"));
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, import_path2.join)((0, import_os.tmpdir)(), ".budibase");
12398
- if (!import_fs2.default.existsSync(bbTmp)) {
12399
- import_fs2.default.mkdirSync(bbTmp);
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 = import_fs3.default.readFileSync(path2);
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, import_path3.join)(budibaseTempDir(), (0, import_uuid3.v4)());
12590
- import_fs3.default.writeFileSync(outputPath, data);
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, import_path3.join)(budibaseTempDir(), (0, import_uuid3.v4)());
12595
- import_fs3.default.mkdirSync(writePath);
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
- import_fs3.default.mkdirSync((0, import_path3.join)(writePath, ...dirs), { recursive: true });
12694
+ import_fs4.default.mkdirSync((0, import_path4.join)(writePath, ...dirs), { recursive: true });
12608
12695
  }
12609
- import_fs3.default.writeFileSync((0, import_path3.join)(writePath, ...possiblePath), data);
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 = import_fs3.default.readdirSync(localPath, { withFileTypes: true });
12750
+ const files = import_fs4.default.readdirSync(localPath, { withFileTypes: true });
12664
12751
  for (let file of files) {
12665
- const path2 = sanitizeKey((0, import_path3.join)(bucketPath, file.name));
12666
- const local = (0, import_path3.join)(localPath, file.name);
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, import_fs3.default.createReadStream(local)));
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, import_zlib.default.createUnzip(), import_tar_fs.default.extract(path2));
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, import_path3.join)(budibaseTempDir(), path2);
12692
- await streamPipeline(response.body, import_zlib.default.createUnzip(), import_tar_fs.default.extract(tmpPath));
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 import_path5 = require("path");
18595
+ var import_path6 = require("path");
18509
18596
 
18510
18597
  // src/utilities/fileSystem/filesystem.ts
18511
- var import_fs4 = __toESM(require("fs"));
18512
- var import_path4 = require("path");
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, import_path4.resolve)((0, import_path4.join)(__dirname, "..", "..", ".."));
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 import_fs4.default.createReadStream(path2);
18604
+ return import_fs5.default.createReadStream(path2);
18518
18605
  };
18519
18606
  var createTempFolder = (item) => {
18520
- const path2 = (0, import_path4.join)(budibaseTempDir2(), item);
18607
+ const path2 = (0, import_path5.join)(budibaseTempDir2(), item);
18521
18608
  try {
18522
- if (import_fs4.default.existsSync(path2)) {
18523
- import_fs4.default.rmSync(path2, { recursive: true, force: true });
18609
+ if (import_fs5.default.existsSync(path2)) {
18610
+ import_fs5.default.rmSync(path2, { recursive: true, force: true });
18524
18611
  }
18525
- import_fs4.default.mkdirSync(path2);
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, import_path5.join)(TOP_LEVEL_PATH, "node_modules");
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 import_fs5 = __toESM(require("fs"));
18543
- var import_path6 = require("path");
18544
- var DATASOURCE_PATH = (0, import_path6.join)(budibaseTempDir2(), "datasource");
18545
- var AUTOMATION_PATH = (0, import_path6.join)(budibaseTempDir2(), "automation");
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 = import_fs5.default.readFileSync((0, import_path6.join)(path2, "package.json"), "utf8");
18550
- const schema = import_fs5.default.readFileSync((0, import_path6.join)(path2, "schema.json"), "utf8");
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 (!import_fs5.default.existsSync(path2)) {
18569
- import_fs5.default.mkdirSync(path2);
18655
+ if (!import_fs6.default.existsSync(path2)) {
18656
+ import_fs6.default.mkdirSync(path2);
18570
18657
  }
18571
- const filename = (0, import_path6.join)(path2, plugin.name);
18658
+ const filename = (0, import_path7.join)(path2, plugin.name);
18572
18659
  const metadataName = `${filename}.bbmetadata`;
18573
- if (import_fs5.default.existsSync(filename)) {
18574
- const currentHash = import_fs5.default.readFileSync(metadataName, "utf8");
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
- import_fs5.default.unlinkSync(filename);
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
- import_fs5.default.writeFileSync(filename, pluginJs);
18589
- import_fs5.default.writeFileSync(metadataName, hash2);
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 import_fs6 = __toESM(require("fs"));
18625
- var import_path7 = require("path");
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 exportFile = (0, import_path7.join)(budibaseTempDir2(), `${uuid3()}.tar.gz`);
18631
- tar3.create(
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
- recursive: true,
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 = import_fs6.default.createWriteStream(path2);
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, import_path7.join)(appPath, path2)
18774
+ (0, import_path8.join)(appPath, path2)
18687
18775
  );
18688
- import_fs6.default.writeFileSync((0, import_path7.join)(tmpPath, path2), contents);
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, import_path7.join)(tmpPath, appPath);
18698
- if (import_fs6.default.existsSync(downloadedPath)) {
18699
- const allFiles = import_fs6.default.readdirSync(downloadedPath);
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, import_path7.join)(downloadedPath, file);
18702
- import_fs6.default.renameSync(path2, (0, import_path7.join)(downloadedPath, "..", file));
18789
+ const path2 = (0, import_path8.join)(downloadedPath, file);
18790
+ import_fs7.default.renameSync(path2, (0, import_path8.join)(downloadedPath, "..", file));
18703
18791
  }
18704
- import_fs6.default.rmdirSync(downloadedPath);
18792
+ import_fs7.default.rmdirSync(downloadedPath);
18705
18793
  }
18706
- const dbPath = (0, import_path7.join)(tmpPath, DB_EXPORT_FILE);
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, import_fs6.default.readdirSync(tmpPath));
18713
- import_fs6.default.rmSync(tmpPath, { recursive: true, force: true });
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(appId, excludeRows) {
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 import_path8 = require("path");
18738
- var import_fs7 = __toESM(require("fs"));
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 import_fs7.default.createReadStream(template.file.path);
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 import_fs7.default.createReadStream((0, import_path8.join)(tmpPath, name, "db", "dump.txt"));
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, import_path8.join)(budibaseTempDir2(), uuid4());
18814
- import_fs7.default.mkdirSync(tmpPath);
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 import_fs7.default.readFileSync((0, import_path8.join)(tmpPath, GLOBAL_DB_EXPORT_FILE), "utf8");
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 import_fs7.default.readdirSync(tmpPath).filter((dir) => dir !== GLOBAL_DB_EXPORT_FILE);
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 && import_fs7.default.lstatSync(template.file.path).isDirectory();
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
- const contents = import_fs7.default.readdirSync(tmpPath);
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, import_path8.join)(tmpPath, filename);
18962
+ const path2 = (0, import_path9.join)(tmpPath, filename);
18842
18963
  if (excludedFiles.includes(filename)) {
18843
18964
  continue;
18844
18965
  }
18845
- filename = (0, import_path8.join)(prodAppId, filename);
18846
- if (import_fs7.default.lstatSync(path2).isDirectory()) {
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 = import_fs7.default.createReadStream((0, import_path8.join)(tmpPath, DB_EXPORT_FILE));
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 import_fs8 = __toESM(require("fs"));
19982
- var import_path9 = __toESM(require("path"));
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 = import_path9.default.join(objectStore_exports2.budibaseTempDir(), DEV_VER_FILENAME);
19987
- if (import_fs8.default.existsSync(verFile)) {
19988
- return import_fs8.default.readFileSync(verFile, "utf8");
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
- import_fs8.default.writeFileSync(verFile, devVer);
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 import_fs9 = __toESM(require("fs"));
20351
- var import_path10 = require("path");
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, import_path10.join)((0, import_os2.tmpdir)(), SUB_DIRECTORY);
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, import_path10.join)(DIRECTORY, OFFLINE_LICENSE_FILE);
20358
- if (!import_fs9.default.existsSync(DIRECTORY)) {
20359
- import_fs9.default.mkdirSync(DIRECTORY);
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 (import_fs9.default.existsSync(LICENSE_FILE_PATH)) {
20371
- const token = import_fs9.default.readFileSync(LICENSE_FILE_PATH, { encoding: "utf-8" });
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
- import_fs9.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
20497
+ import_fs10.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
20377
20498
  }
20378
20499
  function deleteOfflineLicense() {
20379
- import_fs9.default.rmSync(LICENSE_FILE_PATH, { force: true });
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 import_fs10 = __toESM(require("fs"));
21585
- var import_path11 = require("path");
21705
+ var import_fs11 = __toESM(require("fs"));
21706
+ var import_path12 = require("path");
21586
21707
  function loadJSFile(directory, name) {
21587
- return import_fs10.default.readFileSync((0, import_path11.join)(directory, name), "utf8");
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 import_fs11 = __toESM(require("fs"));
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 (import_fs11.default.existsSync(tarPath)) {
22294
- import_fs11.default.rmSync(tarPath);
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 import_fs12 = __toESM(require("fs"));
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 = import_fs12.default.createReadStream(path2);
22954
+ ctx.body = import_fs13.default.createReadStream(path2);
22834
22955
  }
22835
22956
 
22836
22957
  // ../pro/packages/pro/src/api/routes/apps/backups.ts