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.
- package/.env.sample +14 -0
- package/dist/bin/index_audit.d.ts +3 -0
- package/dist/bin/index_audit.d.ts.map +1 -0
- package/dist/bin/index_audit.js +66 -0
- package/dist/bin/index_audit.js.map +1 -0
- package/dist/bin/server.d.ts.map +1 -1
- package/dist/bin/server.js +6 -1
- package/dist/bin/server.js.map +1 -1
- package/dist/libs/builtin_models.d.ts +21 -0
- package/dist/libs/builtin_models.d.ts.map +1 -0
- package/dist/libs/builtin_models.js +125 -0
- package/dist/libs/builtin_models.js.map +1 -0
- package/dist/libs/bulkwrite_guard.d.ts +1 -0
- package/dist/libs/bulkwrite_guard.d.ts.map +1 -1
- package/dist/libs/bulkwrite_guard.js +43 -0
- package/dist/libs/bulkwrite_guard.js.map +1 -1
- package/dist/libs/docs-auth.d.ts.map +1 -1
- package/dist/libs/docs-auth.js +3 -1
- package/dist/libs/docs-auth.js.map +1 -1
- package/dist/libs/docs.js +32 -2
- package/dist/libs/docs.js.map +1 -1
- package/dist/libs/groups.js +3 -4
- package/dist/libs/groups.js.map +1 -1
- package/dist/libs/index_diagnostics.d.ts +144 -0
- package/dist/libs/index_diagnostics.d.ts.map +1 -0
- package/dist/libs/index_diagnostics.js +671 -0
- package/dist/libs/index_diagnostics.js.map +1 -0
- package/dist/libs/jxp.d.ts.map +1 -1
- package/dist/libs/jxp.js +185 -70
- package/dist/libs/jxp.js.map +1 -1
- package/dist/libs/load-config.d.ts +2 -0
- package/dist/libs/load-config.d.ts.map +1 -1
- package/dist/libs/load-config.js +10 -0
- package/dist/libs/load-config.js.map +1 -1
- package/dist/libs/login.js +3 -8
- package/dist/libs/login.js.map +1 -1
- package/dist/libs/parse_byte_size.d.ts +10 -0
- package/dist/libs/parse_byte_size.d.ts.map +1 -0
- package/dist/libs/parse_byte_size.js +80 -0
- package/dist/libs/parse_byte_size.js.map +1 -0
- package/dist/libs/query_limits.js +104 -12
- package/dist/libs/query_limits.js.map +1 -1
- package/dist/libs/request_log.d.ts +44 -0
- package/dist/libs/request_log.d.ts.map +1 -0
- package/dist/libs/request_log.js +229 -0
- package/dist/libs/request_log.js.map +1 -0
- package/dist/libs/schema.js +2 -2
- package/dist/libs/schema.js.map +1 -1
- package/dist/libs/security.js +25 -20
- package/dist/libs/security.js.map +1 -1
- package/dist/libs/setup.js +3 -4
- package/dist/libs/setup.js.map +1 -1
- package/dist/libs/startup.d.ts +4 -0
- package/dist/libs/startup.d.ts.map +1 -1
- package/dist/libs/startup.js +17 -0
- package/dist/libs/startup.js.map +1 -1
- package/dist/models/indexquerylog_model.d.ts +19 -0
- package/dist/models/indexquerylog_model.d.ts.map +1 -0
- package/dist/models/indexquerylog_model.js +32 -0
- package/dist/models/indexquerylog_model.js.map +1 -0
- package/dist/models/test_model.js +1 -1
- package/dist/models/test_model.js.map +1 -1
- package/dist/types/jxp-config.d.ts +22 -0
- package/dist/types/jxp-config.d.ts.map +1 -1
- package/dist/types/schema-fields.d.ts +4 -0
- package/dist/types/schema-fields.d.ts.map +1 -1
- package/docs/api.md +16 -2
- package/docs/bulk_writes.md +9 -2
- package/docs/changelog.md +120 -1
- package/docs/configuration.md +39 -0
- package/docs/index.md +1 -0
- package/docs/index_diagnostics.md +127 -0
- package/docs/schemas.md +3 -1
- package/mkdocs.yml +1 -0
- package/package.json +18 -7
- package/templates/assets/diagnostics.js +352 -0
- package/templates/diagnostics.pug +94 -0
- package/templates/index.pug +1 -0
- 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
|
|
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
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
|
|
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 (
|
|
48
|
-
|
|
100
|
+
else if (limits.require_limit_always !== false && limits.default) {
|
|
101
|
+
effectiveLimit = limits.default;
|
|
49
102
|
}
|
|
50
|
-
|
|
51
|
-
|
|
103
|
+
else {
|
|
104
|
+
effectiveLimit = null;
|
|
52
105
|
}
|
|
53
|
-
return
|
|
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":";;AAAA,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;
|
|
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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"}
|
package/dist/libs/schema.js
CHANGED
|
@@ -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
|
-
|
|
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, {
|
package/dist/libs/schema.js.map
CHANGED
|
@@ -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":"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"}
|
package/dist/libs/security.js
CHANGED
|
@@ -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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
};
|