jxp 4.1.0 → 4.2.0

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 (79) hide show
  1. package/.env.sample +14 -0
  2. package/dist/bin/index_audit.d.ts +3 -0
  3. package/dist/bin/index_audit.d.ts.map +1 -0
  4. package/dist/bin/index_audit.js +66 -0
  5. package/dist/bin/index_audit.js.map +1 -0
  6. package/dist/bin/server.d.ts.map +1 -1
  7. package/dist/bin/server.js +6 -1
  8. package/dist/bin/server.js.map +1 -1
  9. package/dist/libs/builtin_models.d.ts +21 -0
  10. package/dist/libs/builtin_models.d.ts.map +1 -0
  11. package/dist/libs/builtin_models.js +125 -0
  12. package/dist/libs/builtin_models.js.map +1 -0
  13. package/dist/libs/bulkwrite_guard.d.ts +1 -0
  14. package/dist/libs/bulkwrite_guard.d.ts.map +1 -1
  15. package/dist/libs/bulkwrite_guard.js +43 -0
  16. package/dist/libs/bulkwrite_guard.js.map +1 -1
  17. package/dist/libs/docs-auth.d.ts.map +1 -1
  18. package/dist/libs/docs-auth.js +3 -1
  19. package/dist/libs/docs-auth.js.map +1 -1
  20. package/dist/libs/docs.js +32 -2
  21. package/dist/libs/docs.js.map +1 -1
  22. package/dist/libs/groups.js +3 -4
  23. package/dist/libs/groups.js.map +1 -1
  24. package/dist/libs/index_diagnostics.d.ts +144 -0
  25. package/dist/libs/index_diagnostics.d.ts.map +1 -0
  26. package/dist/libs/index_diagnostics.js +671 -0
  27. package/dist/libs/index_diagnostics.js.map +1 -0
  28. package/dist/libs/jxp.d.ts.map +1 -1
  29. package/dist/libs/jxp.js +185 -70
  30. package/dist/libs/jxp.js.map +1 -1
  31. package/dist/libs/load-config.d.ts +2 -0
  32. package/dist/libs/load-config.d.ts.map +1 -1
  33. package/dist/libs/load-config.js +10 -0
  34. package/dist/libs/load-config.js.map +1 -1
  35. package/dist/libs/login.js +3 -8
  36. package/dist/libs/login.js.map +1 -1
  37. package/dist/libs/parse_byte_size.d.ts +10 -0
  38. package/dist/libs/parse_byte_size.d.ts.map +1 -0
  39. package/dist/libs/parse_byte_size.js +80 -0
  40. package/dist/libs/parse_byte_size.js.map +1 -0
  41. package/dist/libs/query_limits.js +104 -12
  42. package/dist/libs/query_limits.js.map +1 -1
  43. package/dist/libs/request_log.d.ts +44 -0
  44. package/dist/libs/request_log.d.ts.map +1 -0
  45. package/dist/libs/request_log.js +229 -0
  46. package/dist/libs/request_log.js.map +1 -0
  47. package/dist/libs/schema.js +2 -2
  48. package/dist/libs/schema.js.map +1 -1
  49. package/dist/libs/security.js +25 -20
  50. package/dist/libs/security.js.map +1 -1
  51. package/dist/libs/setup.js +3 -4
  52. package/dist/libs/setup.js.map +1 -1
  53. package/dist/libs/startup.d.ts +4 -0
  54. package/dist/libs/startup.d.ts.map +1 -1
  55. package/dist/libs/startup.js +17 -0
  56. package/dist/libs/startup.js.map +1 -1
  57. package/dist/models/indexquerylog_model.d.ts +19 -0
  58. package/dist/models/indexquerylog_model.d.ts.map +1 -0
  59. package/dist/models/indexquerylog_model.js +32 -0
  60. package/dist/models/indexquerylog_model.js.map +1 -0
  61. package/dist/models/test_model.js +1 -1
  62. package/dist/models/test_model.js.map +1 -1
  63. package/dist/types/jxp-config.d.ts +22 -0
  64. package/dist/types/jxp-config.d.ts.map +1 -1
  65. package/dist/types/schema-fields.d.ts +4 -0
  66. package/dist/types/schema-fields.d.ts.map +1 -1
  67. package/docs/api.md +16 -2
  68. package/docs/bulk_writes.md +9 -2
  69. package/docs/changelog.md +120 -1
  70. package/docs/configuration.md +39 -0
  71. package/docs/index.md +1 -0
  72. package/docs/index_diagnostics.md +127 -0
  73. package/docs/schemas.md +3 -1
  74. package/mkdocs.yml +1 -0
  75. package/package.json +18 -7
  76. package/templates/assets/diagnostics.js +352 -0
  77. package/templates/diagnostics.pug +94 -0
  78. package/templates/index.pug +1 -0
  79. package/templates/sidebar.pug +8 -0
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const errors = require("restify-errors");
4
+ const { logRequestError } = require("./request_log");
5
+ const { parseByteSize } = require("./parse_byte_size");
6
+ const DEFAULT_MAX_RESPONSE_SIZE = "10mb";
7
+ const DEFAULT_MAX_RESPONSE_BYTES = parseByteSize(DEFAULT_MAX_RESPONSE_SIZE, "query_limits.max_response_size");
4
8
  const DEFAULTS = {
5
9
  enabled: true,
6
10
  large_collection_threshold: 10000,
@@ -9,48 +13,97 @@ const DEFAULTS = {
9
13
  require_limit_always: true,
10
14
  skip_count_unless_paginated: true,
11
15
  };
16
+ function resolveMaxResponseBytes(limits) {
17
+ const raw = limits.max_response_size ?? limits.max_response_bytes ?? DEFAULT_MAX_RESPONSE_SIZE;
18
+ try {
19
+ return parseByteSize(raw, "query_limits.max_response_size");
20
+ }
21
+ catch (err) {
22
+ const message = err instanceof Error ? err.message : String(err);
23
+ throw new errors.BadRequestError(message);
24
+ }
25
+ }
12
26
  function getLimits(req) {
13
27
  const limits = Object.assign({}, DEFAULTS, req.config?.query_limits);
14
28
  const modelLimits = req.Model?.schema?.opts?.query_limits;
15
29
  if (modelLimits && typeof modelLimits === "object") {
16
30
  Object.assign(limits, modelLimits);
17
31
  }
32
+ limits.max_response_bytes = resolveMaxResponseBytes(limits);
18
33
  return limits;
19
34
  }
20
35
  function parseRequestedLimit(req) {
21
36
  const n = parseInt(String(req.query.limit ?? ""), 10);
22
37
  return Number.isFinite(n) && n > 0 ? n : null;
23
38
  }
24
- function shouldRunCount(req) {
39
+ function hasMeaningfulFilter(filter) {
40
+ if (filter == null || filter === "") {
41
+ return false;
42
+ }
43
+ if (typeof filter === "object" && !Array.isArray(filter)) {
44
+ return Object.keys(filter).length > 0;
45
+ }
46
+ return true;
47
+ }
48
+ /** GET ?filter= or non-empty POST /query body query */
49
+ function hasClientFilter(req, bodyQuery) {
50
+ if (hasMeaningfulFilter(bodyQuery)) {
51
+ return true;
52
+ }
53
+ return hasMeaningfulFilter(req.query?.filter);
54
+ }
55
+ function shouldRunCount(req, opts = {}) {
25
56
  const limits = getLimits(req);
26
57
  if (limits.skip_count_unless_paginated === false)
27
58
  return true;
28
59
  if (req.query.count === "true" || req.query.count === true)
29
60
  return true;
30
61
  const page = parseInt(String(req.query.page ?? ""), 10);
31
- return Number.isFinite(page) && page > 0;
62
+ if (Number.isFinite(page) && page > 0)
63
+ return true;
64
+ if (opts.filterExemption || opts.limitCapped)
65
+ return true;
66
+ return false;
32
67
  }
33
- function enforceListLimit(req, estimatedCount) {
68
+ function enforceListLimit(req, estimatedCount, res, opts = {}) {
34
69
  const limits = getLimits(req);
70
+ const result = opts.result;
71
+ const hasFilter = hasClientFilter(req, opts.bodyQuery);
35
72
  if (limits.enabled === false) {
36
- return parseRequestedLimit(req);
73
+ return { limit: parseRequestedLimit(req), limitCapped: false, filterExemption: false };
37
74
  }
38
75
  const requested = parseRequestedLimit(req);
39
76
  const isLarge = estimatedCount >= limits.large_collection_threshold;
40
- if (isLarge && !requested && limits.require_limit_always !== false) {
41
- throw new errors.BadRequestError(`Collection "${req.modelname}" has ~${estimatedCount} documents. ` +
77
+ const sizeHint = `~${estimatedCount} docs threshold=${limits.large_collection_threshold}`;
78
+ let limitCapped = false;
79
+ let filterExemption = false;
80
+ if (isLarge && !requested && limits.require_limit_always !== false && !hasFilter) {
81
+ const err = new errors.BadRequestError(`Collection "${req.modelname}" has ~${estimatedCount} documents. ` +
42
82
  `Use ?limit=1..${limits.max} (required). For totals use GET /count/${req.modelname}.`);
83
+ logRequestError(req, res, err, "query_limit", sizeHint);
84
+ throw err;
85
+ }
86
+ if (isLarge && !requested && hasFilter) {
87
+ filterExemption = true;
43
88
  }
89
+ let effectiveLimit;
44
90
  if (requested && requested > limits.max) {
45
- throw new errors.BadRequestError(`?limit=${requested} exceeds maximum ${limits.max} for "${req.modelname}".`);
91
+ effectiveLimit = limits.max;
92
+ limitCapped = true;
93
+ if (result) {
94
+ result.limit_capped = true;
95
+ }
96
+ }
97
+ else if (requested) {
98
+ effectiveLimit = requested;
46
99
  }
47
- if (requested) {
48
- return requested;
100
+ else if (limits.require_limit_always !== false && limits.default) {
101
+ effectiveLimit = limits.default;
49
102
  }
50
- if (limits.require_limit_always !== false && limits.default) {
51
- return limits.default;
103
+ else {
104
+ effectiveLimit = null;
52
105
  }
53
- return null;
106
+ return { limit: effectiveLimit, limitCapped, filterExemption };
54
107
  }
55
108
  function applyListPagination(q, result, req, limit, count, changeUrlParams) {
56
109
  if (!limit) {
@@ -73,12 +126,51 @@ function applyListPagination(q, result, req, limit, count, changeUrlParams) {
73
126
  q.skip(limit * (page - 1));
74
127
  }
75
128
  }
129
+ function finalizeListPagination(result, req, dataLength, limit, count, changeUrlParams) {
130
+ if (!limit || dataLength !== limit) {
131
+ return;
132
+ }
133
+ const page = typeof result.page === "number" ? result.page : 1;
134
+ if (count >= 0) {
135
+ const page_count = Math.ceil(count / limit);
136
+ if (page < page_count && !result.next) {
137
+ result.next = changeUrlParams(req, "page", page + 1);
138
+ }
139
+ return;
140
+ }
141
+ result.has_more = true;
142
+ if (!result.next) {
143
+ result.next = changeUrlParams(req, "page", page + 1);
144
+ }
145
+ }
146
+ function responseByteSize(payload) {
147
+ return Buffer.byteLength(JSON.stringify(payload), "utf8");
148
+ }
149
+ function enforceResponseSize(result, req, res) {
150
+ const limits = getLimits(req);
151
+ const maxBytes = limits.max_response_bytes;
152
+ if (!maxBytes || maxBytes <= 0) {
153
+ return;
154
+ }
155
+ const size = responseByteSize(result);
156
+ if (size > maxBytes) {
157
+ const err = new errors.PayloadTooLargeError(`Response size ${size} bytes exceeds maximum ${maxBytes} bytes for "${req.modelname}". ` +
158
+ `Reduce ?limit=, use ?fields=, or paginate.`);
159
+ logRequestError(req, res, err, "response_size", `${size}B max=${maxBytes}B`);
160
+ throw err;
161
+ }
162
+ }
76
163
  module.exports = {
77
164
  getLimits,
78
165
  parseRequestedLimit,
166
+ hasClientFilter,
167
+ hasMeaningfulFilter,
79
168
  shouldRunCount,
80
169
  enforceListLimit,
81
170
  applyListPagination,
171
+ finalizeListPagination,
172
+ enforceResponseSize,
173
+ responseByteSize,
82
174
  DEFAULTS,
83
175
  };
84
176
  //# sourceMappingURL=query_limits.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query_limits.js","sourceRoot":"","sources":["../../src/libs/query_limits.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query_limits.js","sourceRoot":"","sources":["../../src/libs/query_limits.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ type ReqLike = {
2
+ method?: string;
3
+ url?: string;
4
+ path?: string;
5
+ modelname?: string;
6
+ params?: {
7
+ item_id?: string;
8
+ modelname?: string;
9
+ method_name?: string;
10
+ };
11
+ body?: unknown;
12
+ query?: Record<string, unknown>;
13
+ route?: {
14
+ path?: string;
15
+ };
16
+ ip?: string;
17
+ headers?: Record<string, string | string[] | undefined>;
18
+ connection?: {
19
+ remoteAddress?: string;
20
+ };
21
+ socket?: {
22
+ remoteAddress?: string;
23
+ };
24
+ };
25
+ type ResLike = {
26
+ user?: {
27
+ _id?: {
28
+ toString(): string;
29
+ };
30
+ email?: string;
31
+ admin?: boolean;
32
+ };
33
+ };
34
+ /** Client IP; prefers Restify `req.ip`, then first X-Forwarded-For hop, then socket address. */
35
+ export declare function clientIp(req: ReqLike): string | undefined;
36
+ /** How the request authenticated (no secrets logged). */
37
+ export declare function authHint(req: ReqLike): string | undefined;
38
+ export declare function requestClientInfo(req: ReqLike): string | undefined;
39
+ export declare function requestQueryHints(req: ReqLike): string | undefined;
40
+ export declare function requestSummary(req: ReqLike, res?: ResLike): string;
41
+ export declare function logRequestError(req: ReqLike, res: ResLike | undefined, err: unknown, context?: string, extra?: string): void;
42
+ export declare function logAndThrow(req: ReqLike, res: ResLike | undefined, err: Error, context?: string, extra?: string): never;
43
+ export {};
44
+ //# sourceMappingURL=request_log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request_log.d.ts","sourceRoot":"","sources":["../../src/libs/request_log.ts"],"names":[],"mappings":"AAEA,KAAK,OAAO,GAAG;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACxD,UAAU,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,MAAM,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACpC,CAAC;AAEF,KAAK,OAAO,GAAG;IACd,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE;YAAE,QAAQ,IAAI,MAAM,CAAA;SAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACzE,CAAC;AAmBF,gGAAgG;AAChG,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAUzD;AAQD,yDAAyD;AACzD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAYzD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CASlE;AA6CD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAgBlE;AAyBD,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM,CAUlE;AAED,wBAAgB,eAAe,CAC9B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,OAAO,GAAG,SAAS,EACxB,GAAG,EAAE,OAAO,EACZ,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACZ,IAAI,CA4BN;AAED,wBAAgB,WAAW,CAC1B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,OAAO,GAAG,SAAS,EACxB,GAAG,EAAE,KAAK,EACV,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACZ,KAAK,CAGP"}
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clientIp = clientIp;
4
+ exports.authHint = authHint;
5
+ exports.requestClientInfo = requestClientInfo;
6
+ exports.requestQueryHints = requestQueryHints;
7
+ exports.requestSummary = requestSummary;
8
+ exports.logRequestError = logRequestError;
9
+ exports.logAndThrow = logAndThrow;
10
+ const errors = require("restify-errors");
11
+ function filterLogUser(user) {
12
+ if (!user)
13
+ return "anonymous";
14
+ if (user.email)
15
+ return user.email;
16
+ if (user._id)
17
+ return user._id.toString();
18
+ return "unknown";
19
+ }
20
+ function headerValue(headers, name) {
21
+ if (!headers)
22
+ return undefined;
23
+ const v = headers[name] ?? headers[name.toLowerCase()];
24
+ if (v === undefined || v === null)
25
+ return undefined;
26
+ return Array.isArray(v) ? v[0] : String(v);
27
+ }
28
+ /** Client IP; prefers Restify `req.ip`, then first X-Forwarded-For hop, then socket address. */
29
+ function clientIp(req) {
30
+ if (req.ip)
31
+ return String(req.ip);
32
+ const xff = headerValue(req.headers, "x-forwarded-for");
33
+ if (xff) {
34
+ const first = xff.split(",")[0]?.trim();
35
+ if (first)
36
+ return first;
37
+ }
38
+ const xri = headerValue(req.headers, "x-real-ip");
39
+ if (xri)
40
+ return xri.trim();
41
+ return req.socket?.remoteAddress || req.connection?.remoteAddress || undefined;
42
+ }
43
+ function truncate(value, max = 120) {
44
+ const oneLine = value.replace(/[\r\n]+/g, " ").trim();
45
+ if (oneLine.length <= max)
46
+ return oneLine;
47
+ return `${oneLine.slice(0, max - 1)}…`;
48
+ }
49
+ /** How the request authenticated (no secrets logged). */
50
+ function authHint(req) {
51
+ if (req.query?.apikey)
52
+ return "apikey-query";
53
+ const apiHeader = headerValue(req.headers, "x-api-key") || headerValue(req.headers, "X-API-Key");
54
+ if (apiHeader)
55
+ return "apikey-header";
56
+ const auth = headerValue(req.headers, "authorization");
57
+ if (auth) {
58
+ const lower = auth.trim().toLowerCase();
59
+ if (lower.startsWith("bearer "))
60
+ return "bearer";
61
+ if (lower.startsWith("basic "))
62
+ return "basic";
63
+ }
64
+ return undefined;
65
+ }
66
+ function requestClientInfo(req) {
67
+ const parts = [];
68
+ const ip = clientIp(req);
69
+ if (ip)
70
+ parts.push(`ip=${ip}`);
71
+ const ua = headerValue(req.headers, "user-agent");
72
+ if (ua)
73
+ parts.push(`ua=${truncate(ua, 80)}`);
74
+ const auth = authHint(req);
75
+ if (auth)
76
+ parts.push(`auth=${auth}`);
77
+ return parts.length ? parts.join(" ") : undefined;
78
+ }
79
+ function summarizeBulkBody(body) {
80
+ if (!Array.isArray(body))
81
+ return undefined;
82
+ const counts = {};
83
+ for (const op of body) {
84
+ if (!op || typeof op !== "object") {
85
+ counts.invalid = (counts.invalid || 0) + 1;
86
+ continue;
87
+ }
88
+ const keys = Object.keys(op);
89
+ const name = keys.length === 1 ? keys[0] : "?";
90
+ counts[name] = (counts[name] || 0) + 1;
91
+ }
92
+ const parts = Object.entries(counts).map(([k, n]) => `${k}:${n}`);
93
+ return `bulk[${body.length} ${parts.join(" ")}]`;
94
+ }
95
+ function summarizeAggregatePipeline(body) {
96
+ let pipeline = body;
97
+ if (body && typeof body === "object" && !Array.isArray(body)) {
98
+ const q = body.query;
99
+ if (Array.isArray(q))
100
+ pipeline = q;
101
+ }
102
+ if (!Array.isArray(pipeline))
103
+ return undefined;
104
+ const counts = {};
105
+ for (const stage of pipeline) {
106
+ if (!stage || typeof stage !== "object")
107
+ continue;
108
+ for (const key of Object.keys(stage)) {
109
+ if (key.startsWith("$")) {
110
+ counts[key] = (counts[key] || 0) + 1;
111
+ }
112
+ }
113
+ }
114
+ const parts = Object.entries(counts).map(([k, n]) => `${k}:${n}`);
115
+ return `aggregate[${pipeline.length} ${parts.join(" ")}]`;
116
+ }
117
+ function summarizePostQueryBody(body) {
118
+ if (!body || typeof body !== "object")
119
+ return undefined;
120
+ const q = body.query;
121
+ if (!q || typeof q !== "object" || Array.isArray(q))
122
+ return "postQuery=invalid";
123
+ return `postQuery keys=${Object.keys(q).length}`;
124
+ }
125
+ function requestQueryHints(req) {
126
+ const q = req.query;
127
+ if (!q)
128
+ return undefined;
129
+ const parts = [];
130
+ if (q.limit !== undefined && q.limit !== "")
131
+ parts.push(`?limit=${q.limit}`);
132
+ if (q.page !== undefined && q.page !== "")
133
+ parts.push(`?page=${q.page}`);
134
+ if (q.count === true || q.count === "true")
135
+ parts.push("?count=true");
136
+ if (q.search)
137
+ parts.push("?search");
138
+ if (q.filter !== undefined && q.filter !== null && q.filter !== "") {
139
+ if (typeof q.filter === "object" && !Array.isArray(q.filter)) {
140
+ parts.push(`filterKeys=${Object.keys(q.filter).length}`);
141
+ }
142
+ else {
143
+ parts.push("?filter");
144
+ }
145
+ }
146
+ return parts.length ? parts.join(" ") : undefined;
147
+ }
148
+ function summarizeRequestDetail(req) {
149
+ const path = req.url || req.path || "";
150
+ const routePath = req.route?.path || "";
151
+ const route = path || routePath;
152
+ if (route.includes("/bulkwrite"))
153
+ return summarizeBulkBody(req.body);
154
+ if (route.includes("/aggregate"))
155
+ return summarizeAggregatePipeline(req.body);
156
+ if (route.includes("/query"))
157
+ return summarizePostQueryBody(req.body);
158
+ if (route.includes("/call/") && req.params?.method_name) {
159
+ return `call=${req.params.method_name}`;
160
+ }
161
+ if (req.method === "GET" &&
162
+ (route.includes("/api/") || route.includes("/csv/") || route.includes("/count/"))) {
163
+ return requestQueryHints(req);
164
+ }
165
+ if (req.method === "POST" && route.includes("/query")) {
166
+ return summarizePostQueryBody(req.body);
167
+ }
168
+ return requestQueryHints(req);
169
+ }
170
+ function requestSummary(req, res) {
171
+ const method = req.method || "?";
172
+ const path = req.url || req.path || "?";
173
+ const bits = [`${method} ${path}`];
174
+ const model = req.modelname || req.params?.modelname;
175
+ if (model)
176
+ bits.push(`model=${model}`);
177
+ if (req.params?.item_id)
178
+ bits.push(`id=${req.params.item_id}`);
179
+ bits.push(`user=${filterLogUser(res?.user)}`);
180
+ if (res?.user?.admin)
181
+ bits.push("admin");
182
+ return bits.join(" ");
183
+ }
184
+ function logRequestError(req, res, err, context, extra) {
185
+ const detail = extra || summarizeRequestDetail(req);
186
+ const errMsg = err instanceof Error
187
+ ? err.message
188
+ : typeof err === "string"
189
+ ? err
190
+ : String(err);
191
+ const headline = [
192
+ new Date().toISOString(),
193
+ requestClientInfo(req),
194
+ requestSummary(req, res),
195
+ context,
196
+ detail,
197
+ errMsg,
198
+ ]
199
+ .filter(Boolean)
200
+ .join(" | ");
201
+ console.error(headline);
202
+ if (err instanceof Error && err.stack) {
203
+ const skipStack = err instanceof errors.ForbiddenError ||
204
+ err instanceof errors.NotFoundError ||
205
+ err instanceof errors.BadRequestError;
206
+ if (!skipStack) {
207
+ console.error(err.stack);
208
+ }
209
+ }
210
+ }
211
+ function logAndThrow(req, res, err, context, extra) {
212
+ logRequestError(req, res, err, context, extra);
213
+ throw err;
214
+ }
215
+ module.exports = {
216
+ filterLogUser,
217
+ clientIp,
218
+ authHint,
219
+ requestClientInfo,
220
+ requestSummary,
221
+ requestQueryHints,
222
+ summarizeBulkBody,
223
+ summarizeAggregatePipeline,
224
+ summarizePostQueryBody,
225
+ summarizeRequestDetail,
226
+ logRequestError,
227
+ logAndThrow,
228
+ };
229
+ //# sourceMappingURL=request_log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request_log.js","sourceRoot":"","sources":["../../src/libs/request_log.ts"],"names":[],"mappings":"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"}
@@ -77,9 +77,9 @@ class JXPSchema extends mongoose_1.default.Schema {
77
77
  continue;
78
78
  const virtual_name = def.map_to || def.virtual || String(def.link).toLowerCase();
79
79
  if (!loaded_files.includes(def.link)) {
80
+ // Side-effect load only; do not read .default (circular models e.g. User → User).
80
81
  // eslint-disable-next-line @typescript-eslint/no-require-imports
81
- const linked = require(getModelFileFromRef(def.link));
82
- void (linked.default || linked);
82
+ require(getModelFileFromRef(def.link));
83
83
  loaded_files.push(def.link);
84
84
  }
85
85
  this.virtual(virtual_name, {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/libs/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/libs/schema.ts"],"names":[],"mappings":";;;;;AAAA,wDAAuE;AACvE,gDAAwB;AACxB,wCAAyC;AACzC,uCAAwC;AACxC,+CAAmD;AAGnD,6EAA6E;AAC7E,MAAM,CAAC,QAAQ,GAAG,kBAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;AACjD,MAAM,CAAC,KAAK,GAAG,kBAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;AAE3C,SAAS,eAAe,CAAC,GAAW;IACnC,IAAI,cAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACrC,OAAO,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,WAAW;IACnB,MAAM,OAAO,GAAG,IAAA,gCAAkB,GAAE,CAAC;IACrC,IAAI,OAAO;QAAE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,QAAQ,CAAC,YAAY,CAAC,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAU,EAAE;IACnD,OAAO,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AACvE,CAAC,CAAC;AAWF,MAAM,SAAU,SAAQ,kBAAQ,CAAC,MAAM;IAItC,YAAY,UAAyB,EAAE,OAAyB,EAAE;QACjE,IAAI,GAAG,MAAM,CAAC,MAAM,CACnB;YACC,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC1B,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC5B,EACD,IAAI,CACJ,CAAC;QACF,UAAU,GAAG,MAAM,CAAC,MAAM,CACzB;YACC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;YACxD,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;YACjF,cAAc,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE;SAC3F,EACD,UAAU,CACV,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACvB,MAAM,YAAY,GAAyC,EAAE,CAAC;YAC9D,IAAI,MAAM,CAAC,MAAM;gBAAE,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvD,IAAI,MAAM,CAAC,MAAM;gBAAE,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvD,IAAI,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;gBAChD,MAAM,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;YAChD,CAAC;QACF,CAAC;QACD,KAAK,CAAC,UAA8B,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,aAAa,EAAE,CAAC;IACtB,CAAC;IAED,QAAQ;QACP,sEAAsE;QACrE,IAA4D,CAAC,GAAG,CAChE,QAAQ,EACR,MAAM,CAAC,MAAM,CACZ;YACC,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,EAAE;YACR,GAAG,EAAE,EAAE;SACP,EACD,IAAI,CAAC,IAAI,CAAC,KAAK,CACf,CACD,CAAC;IACH,CAAC;IAED,aAAa;QACZ,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAChD,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAA0C,CAAC;YACxE,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBACb,QAAQ,GAAG,IAAI,CAAC;YACjB,CAAC;YACD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI;gBAAE,SAAS;YAC/E,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACjF,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,kFAAkF;gBAClF,iEAAiE;gBACjE,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;gBAC1B,GAAG,EAAE,GAAG,CAAC,IAAI;gBACb,UAAU,EAAE,GAAG;gBACf,YAAY,EAAE,KAAK;gBACnB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC,QAAQ;gBACjC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC;aACvC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,MAAM,CAAC,KAAK,GAAG,kBAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;IACrC,MAAM,CAAC,KAAK,GAAG,kBAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAQ,CAI9B,CAAC;;AAIf,kBAAe,SAAS,CAAC"}
@@ -2,24 +2,22 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const bcrypt = require("bcryptjs");
4
4
  const randToken = require("rand-token");
5
- const path = require("path");
6
5
  const errors = require("restify-errors");
6
+ const { getModelFromRegistry } = require("./builtin_models");
7
7
  var APIKey = null;
8
8
  var Token = null;
9
9
  var Groups = null;
10
10
  var User = null;
11
11
  var RefreshToken = null;
12
12
  var provider = "";
13
- const loadModel = (modelDir, file) => {
14
- const mod = require(path.join(modelDir, file));
15
- return mod.default || mod;
16
- };
17
- const init = function (config) {
18
- APIKey = loadModel(config.model_dir, "apikey_model");
19
- Groups = loadModel(config.model_dir, "usergroups_model.js");
20
- User = loadModel(config.model_dir, "user_model");
21
- Token = loadModel(config.model_dir, "token_model");
22
- RefreshToken = loadModel(config.model_dir, "refreshtoken_model");
13
+ const bulkwrite_guard = require("./bulkwrite_guard");
14
+ const { logRequestError } = require("./request_log");
15
+ const init = function (models, config) {
16
+ APIKey = getModelFromRegistry(models, "apikey");
17
+ Groups = getModelFromRegistry(models, "usergroups");
18
+ User = getModelFromRegistry(models, "user");
19
+ Token = getModelFromRegistry(models, "token");
20
+ RefreshToken = getModelFromRegistry(models, "refreshtoken");
23
21
  if (config.url)
24
22
  provider = config.url;
25
23
  };
@@ -319,22 +317,25 @@ const auth = async (req, res) => {
319
317
  return await check_perms(res.user, res.groups, req.Model, method, req.params.item_id);
320
318
  }
321
319
  catch (err) {
322
- console.error(err);
320
+ logRequestError(req, res, err, "auth");
323
321
  if (err.code)
324
322
  throw err;
325
323
  throw new errors.ForbiddenError(err.toString());
326
324
  }
327
325
  };
328
- // Bulk auth requires all CRUD permissions
326
+ // Bulk auth: admins bypass; others need perms matching each operation (e.g. updateOne → create + update).
329
327
  const bulkAuth = async (req, res) => {
328
+ if (res.user?.admin) {
329
+ return;
330
+ }
330
331
  try {
331
- await check_perms(res.user, res.groups, req.Model, "c");
332
- await check_perms(res.user, res.groups, req.Model, "r");
333
- await check_perms(res.user, res.groups, req.Model, "u");
334
- await check_perms(res.user, res.groups, req.Model, "d");
332
+ const required = bulkwrite_guard.requiredPermsForBulkOps(req.body);
333
+ for (const method of required) {
334
+ await check_perms(res.user, res.groups, req.Model, method);
335
+ }
335
336
  }
336
337
  catch (err) {
337
- console.error(err);
338
+ logRequestError(req, res, err, "bulkAuth");
338
339
  if (err.code)
339
340
  throw err;
340
341
  throw new errors.ForbiddenError(err.toString());
@@ -392,10 +393,14 @@ const check_perms = async (user, groups, model, method, item_id) => {
392
393
  };
393
394
  const admin_only = (req, res, next) => {
394
395
  if (!res.user) {
395
- return next(new errors.ForbiddenError("User not logged in"));
396
+ const err = new errors.ForbiddenError("User not logged in");
397
+ logRequestError(req, res, err, "admin_only");
398
+ return next(err);
396
399
  }
397
400
  if (!res.user.admin) {
398
- return next(new errors.ForbiddenError("User not admin"));
401
+ const err = new errors.ForbiddenError("User not admin");
402
+ logRequestError(req, res, err, "admin_only");
403
+ return next(err);
399
404
  }
400
405
  next();
401
406
  };