@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/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(string, salt) {
11602
- return import_crypto.default.pbkdf2Sync(string, salt, ITERATIONS, STRETCH_LENGTH, "sha512");
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(RANDOM_BYTES);
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 import_zlib = __toESM(require("zlib"));
12469
+ var import_zlib2 = __toESM(require("zlib"));
12380
12470
  var import_util = require("util");
12381
- var import_path3 = require("path");
12382
- var import_fs3 = __toESM(require("fs"));
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 import_path2 = require("path");
12476
+ var import_path3 = require("path");
12387
12477
  var import_os = require("os");
12388
- var import_fs2 = __toESM(require("fs"));
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, import_path2.join)((0, import_os.tmpdir)(), ".budibase");
12398
- if (!import_fs2.default.existsSync(bbTmp)) {
12399
- import_fs2.default.mkdirSync(bbTmp);
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 = import_fs3.default.readFileSync(path2);
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, import_path3.join)(budibaseTempDir(), (0, import_uuid3.v4)());
12590
- import_fs3.default.writeFileSync(outputPath, data);
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, import_path3.join)(budibaseTempDir(), (0, import_uuid3.v4)());
12595
- import_fs3.default.mkdirSync(writePath);
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
- import_fs3.default.mkdirSync((0, import_path3.join)(writePath, ...dirs), { recursive: true });
12697
+ import_fs4.default.mkdirSync((0, import_path4.join)(writePath, ...dirs), { recursive: true });
12608
12698
  }
12609
- import_fs3.default.writeFileSync((0, import_path3.join)(writePath, ...possiblePath), data);
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 = import_fs3.default.readdirSync(localPath, { withFileTypes: true });
12753
+ const files = import_fs4.default.readdirSync(localPath, { withFileTypes: true });
12664
12754
  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);
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, import_fs3.default.createReadStream(local)));
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, import_zlib.default.createUnzip(), import_tar_fs.default.extract(path2));
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, import_path3.join)(budibaseTempDir(), path2);
12692
- await streamPipeline(response.body, import_zlib.default.createUnzip(), import_tar_fs.default.extract(tmpPath));
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 import_path5 = require("path");
18598
+ var import_path6 = require("path");
18509
18599
 
18510
18600
  // src/utilities/fileSystem/filesystem.ts
18511
- var import_fs4 = __toESM(require("fs"));
18512
- var import_path4 = require("path");
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, import_path4.resolve)((0, import_path4.join)(__dirname, "..", "..", ".."));
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 import_fs4.default.createReadStream(path2);
18607
+ return import_fs5.default.createReadStream(path2);
18518
18608
  };
18519
18609
  var createTempFolder = (item) => {
18520
- const path2 = (0, import_path4.join)(budibaseTempDir2(), item);
18610
+ const path2 = (0, import_path5.join)(budibaseTempDir2(), item);
18521
18611
  try {
18522
- if (import_fs4.default.existsSync(path2)) {
18523
- import_fs4.default.rmSync(path2, { recursive: true, force: true });
18612
+ if (import_fs5.default.existsSync(path2)) {
18613
+ import_fs5.default.rmSync(path2, { recursive: true, force: true });
18524
18614
  }
18525
- import_fs4.default.mkdirSync(path2);
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, import_path5.join)(TOP_LEVEL_PATH, "node_modules");
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 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");
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 = 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");
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 (!import_fs5.default.existsSync(path2)) {
18569
- import_fs5.default.mkdirSync(path2);
18658
+ if (!import_fs6.default.existsSync(path2)) {
18659
+ import_fs6.default.mkdirSync(path2);
18570
18660
  }
18571
- const filename = (0, import_path6.join)(path2, plugin.name);
18661
+ const filename = (0, import_path7.join)(path2, plugin.name);
18572
18662
  const metadataName = `${filename}.bbmetadata`;
18573
- if (import_fs5.default.existsSync(filename)) {
18574
- const currentHash = import_fs5.default.readFileSync(metadataName, "utf8");
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
- import_fs5.default.unlinkSync(filename);
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
- import_fs5.default.writeFileSync(filename, pluginJs);
18589
- import_fs5.default.writeFileSync(metadataName, hash2);
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 import_fs6 = __toESM(require("fs"));
18625
- var import_path7 = require("path");
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 exportFile = (0, import_path7.join)(budibaseTempDir2(), `${uuid3()}.tar.gz`);
18631
- tar3.create(
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
- recursive: true,
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 = import_fs6.default.createWriteStream(path2);
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, import_path7.join)(appPath, path2)
18777
+ (0, import_path8.join)(appPath, path2)
18687
18778
  );
18688
- import_fs6.default.writeFileSync((0, import_path7.join)(tmpPath, path2), contents);
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, import_path7.join)(tmpPath, appPath);
18698
- if (import_fs6.default.existsSync(downloadedPath)) {
18699
- const allFiles = import_fs6.default.readdirSync(downloadedPath);
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, import_path7.join)(downloadedPath, file);
18702
- import_fs6.default.renameSync(path2, (0, import_path7.join)(downloadedPath, "..", file));
18792
+ const path2 = (0, import_path8.join)(downloadedPath, file);
18793
+ import_fs7.default.renameSync(path2, (0, import_path8.join)(downloadedPath, "..", file));
18703
18794
  }
18704
- import_fs6.default.rmdirSync(downloadedPath);
18795
+ import_fs7.default.rmdirSync(downloadedPath);
18705
18796
  }
18706
- const dbPath = (0, import_path7.join)(tmpPath, DB_EXPORT_FILE);
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, import_fs6.default.readdirSync(tmpPath));
18713
- import_fs6.default.rmSync(tmpPath, { recursive: true, force: true });
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(appId, excludeRows) {
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 import_path8 = require("path");
18738
- var import_fs7 = __toESM(require("fs"));
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 import_fs7.default.createReadStream(template.file.path);
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 import_fs7.default.createReadStream((0, import_path8.join)(tmpPath, name, "db", "dump.txt"));
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, import_path8.join)(budibaseTempDir2(), uuid4());
18814
- import_fs7.default.mkdirSync(tmpPath);
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 import_fs7.default.readFileSync((0, import_path8.join)(tmpPath, GLOBAL_DB_EXPORT_FILE), "utf8");
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 import_fs7.default.readdirSync(tmpPath).filter((dir) => dir !== GLOBAL_DB_EXPORT_FILE);
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 && import_fs7.default.lstatSync(template.file.path).isDirectory();
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
- const contents = import_fs7.default.readdirSync(tmpPath);
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, import_path8.join)(tmpPath, filename);
18965
+ const path2 = (0, import_path9.join)(tmpPath, filename);
18842
18966
  if (excludedFiles.includes(filename)) {
18843
18967
  continue;
18844
18968
  }
18845
- filename = (0, import_path8.join)(prodAppId, filename);
18846
- if (import_fs7.default.lstatSync(path2).isDirectory()) {
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 = import_fs7.default.createReadStream((0, import_path8.join)(tmpPath, DB_EXPORT_FILE));
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 import_fs8 = __toESM(require("fs"));
19982
- var import_path9 = __toESM(require("path"));
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 = 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");
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
- import_fs8.default.writeFileSync(verFile, devVer);
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 import_fs9 = __toESM(require("fs"));
20351
- var import_path10 = require("path");
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, import_path10.join)((0, import_os2.tmpdir)(), SUB_DIRECTORY);
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, import_path10.join)(DIRECTORY, OFFLINE_LICENSE_FILE);
20358
- if (!import_fs9.default.existsSync(DIRECTORY)) {
20359
- import_fs9.default.mkdirSync(DIRECTORY);
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 (import_fs9.default.existsSync(LICENSE_FILE_PATH)) {
20371
- const token = import_fs9.default.readFileSync(LICENSE_FILE_PATH, { encoding: "utf-8" });
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
- import_fs9.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
20500
+ import_fs10.default.writeFileSync(LICENSE_FILE_PATH, signedLicense, { encoding: "utf-8" });
20377
20501
  }
20378
20502
  function deleteOfflineLicense() {
20379
- import_fs9.default.rmSync(LICENSE_FILE_PATH, { force: true });
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 import_fs10 = __toESM(require("fs"));
21585
- var import_path11 = require("path");
21708
+ var import_fs11 = __toESM(require("fs"));
21709
+ var import_path12 = require("path");
21586
21710
  function loadJSFile(directory, name) {
21587
- return import_fs10.default.readFileSync((0, import_path11.join)(directory, name), "utf8");
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 import_fs11 = __toESM(require("fs"));
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 (import_fs11.default.existsSync(tarPath)) {
22294
- import_fs11.default.rmSync(tarPath);
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 import_fs12 = __toESM(require("fs"));
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 = import_fs12.default.createReadStream(path2);
22957
+ ctx.body = import_fs13.default.createReadStream(path2);
22834
22958
  }
22835
22959
 
22836
22960
  // ../pro/packages/pro/src/api/routes/apps/backups.ts