@budibase/backend-core 2.13.51 → 2.13.53

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.
Files changed (47) hide show
  1. package/dist/index.js +186 -21
  2. package/dist/index.js.map +4 -4
  3. package/dist/index.js.meta.json +1 -1
  4. package/dist/package.json +4 -4
  5. package/dist/plugins.js.meta.json +1 -1
  6. package/dist/src/cache/generic.d.ts +16 -6
  7. package/dist/src/cache/generic.js +12 -10
  8. package/dist/src/cache/generic.js.map +1 -1
  9. package/dist/src/cache/passwordReset.d.ts +5 -0
  10. package/dist/src/cache/passwordReset.js +13 -2
  11. package/dist/src/cache/passwordReset.js.map +1 -1
  12. package/dist/src/db/couch/DatabaseImpl.d.ts +2 -1
  13. package/dist/src/db/couch/DatabaseImpl.js +3 -1
  14. package/dist/src/db/couch/DatabaseImpl.js.map +1 -1
  15. package/dist/src/db/db.js +2 -1
  16. package/dist/src/db/db.js.map +1 -1
  17. package/dist/src/db/instrumentation.d.ts +27 -0
  18. package/dist/src/db/instrumentation.js +117 -0
  19. package/dist/src/db/instrumentation.js.map +1 -0
  20. package/dist/src/index.d.ts +1 -0
  21. package/dist/src/index.js +2 -1
  22. package/dist/src/index.js.map +1 -1
  23. package/dist/src/logging/pino/logger.js +6 -0
  24. package/dist/src/logging/pino/logger.js.map +1 -1
  25. package/dist/src/security/auth.d.ts +8 -0
  26. package/dist/src/security/auth.js +22 -0
  27. package/dist/src/security/auth.js.map +1 -0
  28. package/dist/src/security/index.d.ts +1 -0
  29. package/dist/src/security/index.js +18 -0
  30. package/dist/src/security/index.js.map +1 -0
  31. package/dist/src/users/db.js +5 -0
  32. package/dist/src/users/db.js.map +1 -1
  33. package/dist/tests/core/utilities/structures/users.js +1 -1
  34. package/dist/tests/core/utilities/structures/users.js.map +1 -1
  35. package/package.json +4 -4
  36. package/src/cache/generic.ts +12 -11
  37. package/src/cache/passwordReset.ts +13 -2
  38. package/src/db/couch/DatabaseImpl.ts +3 -1
  39. package/src/db/db.ts +2 -1
  40. package/src/db/instrumentation.ts +156 -0
  41. package/src/index.ts +1 -0
  42. package/src/logging/pino/logger.ts +6 -0
  43. package/src/security/auth.ts +24 -0
  44. package/src/security/index.ts +1 -0
  45. package/src/security/tests/auth.spec.ts +45 -0
  46. package/src/users/db.ts +8 -1
  47. package/tests/core/utilities/structures/users.ts +1 -1
package/dist/index.js CHANGED
@@ -2905,6 +2905,123 @@ var init_newid = __esm({
2905
2905
  }
2906
2906
  });
2907
2907
 
2908
+ // src/db/instrumentation.ts
2909
+ var import_dd_trace, DDInstrumentedDatabase;
2910
+ var init_instrumentation = __esm({
2911
+ "src/db/instrumentation.ts"() {
2912
+ "use strict";
2913
+ import_dd_trace = __toESM(require("dd-trace"));
2914
+ DDInstrumentedDatabase = class {
2915
+ constructor(db) {
2916
+ this.db = db;
2917
+ }
2918
+ get name() {
2919
+ return this.db.name;
2920
+ }
2921
+ exists() {
2922
+ return import_dd_trace.default.trace("db.exists", (span) => {
2923
+ span?.addTags({ db_name: this.name });
2924
+ return this.db.exists();
2925
+ });
2926
+ }
2927
+ checkSetup() {
2928
+ return import_dd_trace.default.trace("db.checkSetup", (span) => {
2929
+ span?.addTags({ db_name: this.name });
2930
+ return this.db.checkSetup();
2931
+ });
2932
+ }
2933
+ get(id) {
2934
+ return import_dd_trace.default.trace("db.get", (span) => {
2935
+ span?.addTags({ db_name: this.name, doc_id: id });
2936
+ return this.db.get(id);
2937
+ });
2938
+ }
2939
+ getMultiple(ids, opts) {
2940
+ return import_dd_trace.default.trace("db.getMultiple", (span) => {
2941
+ span?.addTags({
2942
+ db_name: this.name,
2943
+ num_docs: ids.length,
2944
+ allow_missing: opts?.allowMissing
2945
+ });
2946
+ return this.db.getMultiple(ids, opts);
2947
+ });
2948
+ }
2949
+ remove(id, rev) {
2950
+ return import_dd_trace.default.trace("db.remove", (span) => {
2951
+ span?.addTags({ db_name: this.name, doc_id: id });
2952
+ return this.db.remove(id, rev);
2953
+ });
2954
+ }
2955
+ put(document, opts) {
2956
+ return import_dd_trace.default.trace("db.put", (span) => {
2957
+ span?.addTags({ db_name: this.name, doc_id: document._id });
2958
+ return this.db.put(document, opts);
2959
+ });
2960
+ }
2961
+ bulkDocs(documents) {
2962
+ return import_dd_trace.default.trace("db.bulkDocs", (span) => {
2963
+ span?.addTags({ db_name: this.name, num_docs: documents.length });
2964
+ return this.db.bulkDocs(documents);
2965
+ });
2966
+ }
2967
+ allDocs(params2) {
2968
+ return import_dd_trace.default.trace("db.allDocs", (span) => {
2969
+ span?.addTags({ db_name: this.name });
2970
+ return this.db.allDocs(params2);
2971
+ });
2972
+ }
2973
+ query(viewName, params2) {
2974
+ return import_dd_trace.default.trace("db.query", (span) => {
2975
+ span?.addTags({ db_name: this.name, view_name: viewName });
2976
+ return this.db.query(viewName, params2);
2977
+ });
2978
+ }
2979
+ destroy() {
2980
+ return import_dd_trace.default.trace("db.destroy", (span) => {
2981
+ span?.addTags({ db_name: this.name });
2982
+ return this.db.destroy();
2983
+ });
2984
+ }
2985
+ compact() {
2986
+ return import_dd_trace.default.trace("db.compact", (span) => {
2987
+ span?.addTags({ db_name: this.name });
2988
+ return this.db.compact();
2989
+ });
2990
+ }
2991
+ dump(stream2, opts) {
2992
+ return import_dd_trace.default.trace("db.dump", (span) => {
2993
+ span?.addTags({ db_name: this.name });
2994
+ return this.db.dump(stream2, opts);
2995
+ });
2996
+ }
2997
+ load(...args) {
2998
+ return import_dd_trace.default.trace("db.load", (span) => {
2999
+ span?.addTags({ db_name: this.name });
3000
+ return this.db.load(...args);
3001
+ });
3002
+ }
3003
+ createIndex(...args) {
3004
+ return import_dd_trace.default.trace("db.createIndex", (span) => {
3005
+ span?.addTags({ db_name: this.name });
3006
+ return this.db.createIndex(...args);
3007
+ });
3008
+ }
3009
+ deleteIndex(...args) {
3010
+ return import_dd_trace.default.trace("db.deleteIndex", (span) => {
3011
+ span?.addTags({ db_name: this.name });
3012
+ return this.db.deleteIndex(...args);
3013
+ });
3014
+ }
3015
+ getIndexes(...args) {
3016
+ return import_dd_trace.default.trace("db.getIndexes", (span) => {
3017
+ span?.addTags({ db_name: this.name });
3018
+ return this.db.getIndexes(...args);
3019
+ });
3020
+ }
3021
+ };
3022
+ }
3023
+ });
3024
+
2908
3025
  // src/db/couch/DatabaseImpl.ts
2909
3026
  function buildNano(couchInfo) {
2910
3027
  return (0, import_nano.default)({
@@ -2918,7 +3035,8 @@ function buildNano(couchInfo) {
2918
3035
  });
2919
3036
  }
2920
3037
  function DatabaseWithConnection(dbName, connection, opts) {
2921
- return new DatabaseImpl(dbName, opts, connection);
3038
+ const db = new DatabaseImpl(dbName, opts, connection);
3039
+ return new DDInstrumentedDatabase(db);
2922
3040
  }
2923
3041
  var import_nano, DatabaseImpl;
2924
3042
  var init_DatabaseImpl = __esm({
@@ -2930,6 +3048,7 @@ var init_DatabaseImpl = __esm({
2930
3048
  init_utils2();
2931
3049
  init_pouchDB();
2932
3050
  init_newid();
3051
+ init_instrumentation();
2933
3052
  DatabaseImpl = class _DatabaseImpl {
2934
3053
  constructor(dbName, opts, connection) {
2935
3054
  this.couchInfo = getCouchInfo();
@@ -3146,7 +3265,7 @@ var init_couch = __esm({
3146
3265
 
3147
3266
  // src/db/db.ts
3148
3267
  function getDB(dbName, opts) {
3149
- return new DatabaseImpl(dbName, opts);
3268
+ return new DDInstrumentedDatabase(new DatabaseImpl(dbName, opts));
3150
3269
  }
3151
3270
  async function doWithDB(dbName, cb, opts) {
3152
3271
  const db = getDB(dbName, opts);
@@ -3167,6 +3286,7 @@ var init_db3 = __esm({
3167
3286
  "src/db/db.ts"() {
3168
3287
  "use strict";
3169
3288
  init_couch();
3289
+ init_instrumentation();
3170
3290
  }
3171
3291
  });
3172
3292
 
@@ -5731,7 +5851,7 @@ var init_system2 = __esm({
5731
5851
  });
5732
5852
 
5733
5853
  // src/logging/pino/logger.ts
5734
- var import_pino, import_pino_pretty, pinoInstance, isPlainObject2, isError2, isMessage2, getLogParams3, logger;
5854
+ var import_pino, import_pino_pretty, import_dd_trace2, import_ext, pinoInstance, isPlainObject2, isError2, isMessage2, getLogParams3, logger;
5735
5855
  var init_logger = __esm({
5736
5856
  "src/logging/pino/logger.ts"() {
5737
5857
  "use strict";
@@ -5740,6 +5860,8 @@ var init_logger = __esm({
5740
5860
  init_environment2();
5741
5861
  init_context2();
5742
5862
  init_correlation2();
5863
+ import_dd_trace2 = __toESM(require("dd-trace"));
5864
+ import_ext = require("dd-trace/ext");
5743
5865
  init_system2();
5744
5866
  if (!environment_default.DISABLE_PINO_LOGGER) {
5745
5867
  let isPlainObject = function(obj) {
@@ -5773,6 +5895,10 @@ var init_logger = __esm({
5773
5895
  identityType: identity?.type,
5774
5896
  correlationId: getId()
5775
5897
  };
5898
+ const span = import_dd_trace2.default.scope().active();
5899
+ if (span) {
5900
+ import_dd_trace2.default.inject(span.context(), import_ext.formats.LOG, contextObject);
5901
+ }
5776
5902
  const mergingObject = {
5777
5903
  err: error,
5778
5904
  pid: process.pid,
@@ -6445,6 +6571,7 @@ __export(src_exports, {
6445
6571
  queue: () => queue_exports,
6446
6572
  redis: () => redis_exports,
6447
6573
  roles: () => roles_exports,
6574
+ security: () => security_exports,
6448
6575
  sessions: () => sessions_exports,
6449
6576
  tenancy: () => tenancy,
6450
6577
  timers: () => timers_exports,
@@ -6598,15 +6725,12 @@ var TTL = /* @__PURE__ */ ((TTL2) => {
6598
6725
  TTL2[TTL2["ONE_DAY"] = 86400] = "ONE_DAY";
6599
6726
  return TTL2;
6600
6727
  })(TTL || {});
6601
- function performExport(funcName) {
6602
- return (...args) => GENERIC[funcName](...args);
6603
- }
6604
- var keys = performExport("keys");
6605
- var get2 = performExport("get");
6606
- var store = performExport("store");
6607
- var destroy = performExport("delete");
6608
- var withCache = performExport("withCache");
6609
- var bustCache = performExport("bustCache");
6728
+ var keys = (...args) => GENERIC.keys(...args);
6729
+ var get2 = (...args) => GENERIC.get(...args);
6730
+ var store = (...args) => GENERIC.store(...args);
6731
+ var destroy = (...args) => GENERIC.delete(...args);
6732
+ var withCache = (...args) => GENERIC.withCache(...args);
6733
+ var bustCache = (...args) => GENERIC.bustCache(...args);
6610
6734
 
6611
6735
  // src/cache/user.ts
6612
6736
  var user_exports = {};
@@ -7065,13 +7189,13 @@ function validEmail(value) {
7065
7189
  }
7066
7190
 
7067
7191
  // src/utils/Duration.ts
7068
- var DurationType = /* @__PURE__ */ ((DurationType4) => {
7069
- DurationType4["MILLISECONDS"] = "milliseconds";
7070
- DurationType4["SECONDS"] = "seconds";
7071
- DurationType4["MINUTES"] = "minutes";
7072
- DurationType4["HOURS"] = "hours";
7073
- DurationType4["DAYS"] = "days";
7074
- return DurationType4;
7192
+ var DurationType = /* @__PURE__ */ ((DurationType3) => {
7193
+ DurationType3["MILLISECONDS"] = "milliseconds";
7194
+ DurationType3["SECONDS"] = "seconds";
7195
+ DurationType3["MINUTES"] = "minutes";
7196
+ DurationType3["HOURS"] = "hours";
7197
+ DurationType3["DAYS"] = "days";
7198
+ return DurationType3;
7075
7199
  })(DurationType || {});
7076
7200
  var conversion = {
7077
7201
  milliseconds: 1,
@@ -10387,6 +10511,35 @@ async function getSession(userId, sessionId) {
10387
10511
 
10388
10512
  // src/users/db.ts
10389
10513
  init_src();
10514
+
10515
+ // src/security/index.ts
10516
+ var security_exports = {};
10517
+ __export(security_exports, {
10518
+ PASSWORD_MAX_LENGTH: () => PASSWORD_MAX_LENGTH,
10519
+ PASSWORD_MIN_LENGTH: () => PASSWORD_MIN_LENGTH,
10520
+ validatePassword: () => validatePassword
10521
+ });
10522
+
10523
+ // src/security/auth.ts
10524
+ var PASSWORD_MIN_LENGTH = +(process.env.PASSWORD_MIN_LENGTH || 8);
10525
+ var PASSWORD_MAX_LENGTH = +(process.env.PASSWORD_MAX_LENGTH || 512);
10526
+ function validatePassword(password) {
10527
+ if (!password || password.length < PASSWORD_MIN_LENGTH) {
10528
+ return {
10529
+ valid: false,
10530
+ error: `Password invalid. Minimum ${PASSWORD_MIN_LENGTH} characters.`
10531
+ };
10532
+ }
10533
+ if (password.length > PASSWORD_MAX_LENGTH) {
10534
+ return {
10535
+ valid: false,
10536
+ error: `Password invalid. Maximum ${PASSWORD_MAX_LENGTH} characters.`
10537
+ };
10538
+ }
10539
+ return { valid: true };
10540
+ }
10541
+
10542
+ // src/users/db.ts
10390
10543
  var bulkDeleteProcessing = async (dbUser) => {
10391
10544
  const userId = dbUser._id;
10392
10545
  await users_exports2.removeUser(dbUser);
@@ -10428,6 +10581,10 @@ var UserDB = class _UserDB {
10428
10581
  if (await _UserDB.isPreventPasswordActions(user, account)) {
10429
10582
  throw new HTTPError("Password change is disabled for this user", 400);
10430
10583
  }
10584
+ const passwordValidation = validatePassword(password);
10585
+ if (!passwordValidation.valid) {
10586
+ throw new HTTPError(passwordValidation.error, 400);
10587
+ }
10431
10588
  hashedPassword = opts.hashPassword ? await hash(password) : password;
10432
10589
  } else if (dbUser) {
10433
10590
  hashedPassword = dbUser.password;
@@ -11210,7 +11367,8 @@ var Writethrough = class {
11210
11367
  var passwordReset_exports = {};
11211
11368
  __export(passwordReset_exports, {
11212
11369
  createCode: () => createCode2,
11213
- getCode: () => getCode2
11370
+ getCode: () => getCode2,
11371
+ invalidateCode: () => invalidateCode
11214
11372
  });
11215
11373
  init_init();
11216
11374
  var TTL_SECONDS2 = Duration.fromHours(1).toSeconds();
@@ -11224,10 +11382,16 @@ async function getCode2(code) {
11224
11382
  const client = await getPasswordResetClient();
11225
11383
  const value = await client.get(code);
11226
11384
  if (!value) {
11227
- throw "Provided information is not valid, cannot reset password - please try again.";
11385
+ throw new Error(
11386
+ "Provided information is not valid, cannot reset password - please try again."
11387
+ );
11228
11388
  }
11229
11389
  return value;
11230
11390
  }
11391
+ async function invalidateCode(code) {
11392
+ const client = await getPasswordResetClient();
11393
+ await client.delete(code);
11394
+ }
11231
11395
 
11232
11396
  // src/configs/configs.ts
11233
11397
  init_context2();
@@ -13657,6 +13821,7 @@ var init8 = (opts = {}) => {
13657
13821
  queue,
13658
13822
  redis,
13659
13823
  roles,
13824
+ security,
13660
13825
  sessions,
13661
13826
  tenancy,
13662
13827
  timers,