xypriss 2.3.3 → 2.3.5
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/README.md +28 -1
- package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js +1 -1
- package/dist/cjs/mods/security/src/components/attestation.js +1 -1
- package/dist/cjs/mods/security/src/components/cache/UFSIMC.js +1 -1
- package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js +1 -1
- package/dist/cjs/mods/security/src/components/cache/index.js +1 -1
- package/dist/cjs/mods/security/src/components/canary-tokens.js +1 -1
- package/dist/cjs/mods/security/src/components/fortified-function/index.js +1 -1
- package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js +1 -1
- package/dist/cjs/mods/security/src/components/memory-hard.js +1 -1
- package/dist/cjs/mods/security/src/components/post-quantum.js +1 -1
- package/dist/cjs/mods/security/src/components/secure-array/crypto/ArrayCryptoHandler.js +1 -1
- package/dist/cjs/mods/security/src/components/secure-array/index.js +1 -1
- package/dist/cjs/mods/security/src/components/secure-array/types/index.js +1 -1
- package/dist/cjs/mods/security/src/components/secure-object/encryption/crypto-handler.js +1 -1
- package/dist/cjs/mods/security/src/components/secure-object/index.js +1 -1
- package/dist/cjs/mods/security/src/components/secure-serialization.js +1 -1
- package/dist/cjs/mods/security/src/components/secure-string/advanced/quantum-safe.js +1 -1
- package/dist/cjs/mods/security/src/components/tamper-evident-logging.js +1 -1
- package/dist/cjs/mods/security/src/core/crypto.js +1 -1
- package/dist/cjs/mods/security/src/core/hash/hash-core.js +1 -1
- package/dist/cjs/mods/security/src/core/hash/hash-security.js +1 -1
- package/dist/cjs/mods/security/src/core/keys/keys-core.js +1 -1
- package/dist/cjs/mods/security/src/core/password/index.js +1 -1
- package/dist/cjs/mods/security/src/core/password/password-algorithms.js +1 -1
- package/dist/cjs/mods/security/src/core/password/password-core.js +1 -1
- package/dist/cjs/mods/security/src/core/password/password-generator.js +1 -1
- package/dist/cjs/mods/security/src/core/password/password-utils.js +1 -1
- package/dist/cjs/mods/security/src/helpers/Uint8Array.js +2 -2
- package/dist/cjs/mods/security/src/helpers/Uint8Array.js.map +1 -1
- package/dist/cjs/mods/security/src/index.js +1 -1
- package/dist/cjs/mods/security/src/utils/dataConverter.js +2 -2
- package/dist/cjs/mods/security/src/utils/dataConverter.js.map +1 -1
- package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js +11 -9
- package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
- package/dist/cjs/src/encryption/EncryptionService.js +1 -1
- package/dist/cjs/src/index.js +2 -0
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js +16 -0
- package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js.map +1 -1
- package/dist/cjs/src/plugins/modules/index.js +1 -1
- package/dist/cjs/src/server/FastServer.js +18 -1
- package/dist/cjs/src/server/FastServer.js.map +1 -1
- package/dist/cjs/src/server/core/HttpServer.js +16 -8
- package/dist/cjs/src/server/core/HttpServer.js.map +1 -1
- package/dist/cjs/src/server/core/XyprissApp.js +8 -0
- package/dist/cjs/src/server/core/XyprissApp.js.map +1 -1
- package/dist/cjs/src/server/handlers/templates/notFoundTemp.js +1 -1
- package/dist/cjs/src/server/utils/trustProxy.js +446 -0
- package/dist/cjs/src/server/utils/trustProxy.js.map +1 -0
- package/dist/cjs/src/server/utils/wildcardMatcher.js +92 -0
- package/dist/cjs/src/server/utils/wildcardMatcher.js.map +1 -0
- package/dist/esm/mods/security/src/algorithms/hash-algorithms.js +1 -1
- package/dist/esm/mods/security/src/components/attestation.js +1 -1
- package/dist/esm/mods/security/src/components/cache/UFSIMC.js +1 -1
- package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js +1 -1
- package/dist/esm/mods/security/src/components/cache/index.js +1 -1
- package/dist/esm/mods/security/src/components/canary-tokens.js +1 -1
- package/dist/esm/mods/security/src/components/fortified-function/index.js +1 -1
- package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js +1 -1
- package/dist/esm/mods/security/src/components/memory-hard.js +1 -1
- package/dist/esm/mods/security/src/components/post-quantum.js +1 -1
- package/dist/esm/mods/security/src/components/secure-array/crypto/ArrayCryptoHandler.js +1 -1
- package/dist/esm/mods/security/src/components/secure-array/index.js +1 -1
- package/dist/esm/mods/security/src/components/secure-array/types/index.js +1 -1
- package/dist/esm/mods/security/src/components/secure-object/encryption/crypto-handler.js +1 -1
- package/dist/esm/mods/security/src/components/secure-object/index.js +1 -1
- package/dist/esm/mods/security/src/components/secure-serialization.js +1 -1
- package/dist/esm/mods/security/src/components/secure-string/advanced/quantum-safe.js +1 -1
- package/dist/esm/mods/security/src/components/tamper-evident-logging.js +1 -1
- package/dist/esm/mods/security/src/core/crypto.js +1 -1
- package/dist/esm/mods/security/src/core/hash/hash-core.js +1 -1
- package/dist/esm/mods/security/src/core/hash/hash-security.js +1 -1
- package/dist/esm/mods/security/src/core/keys/keys-core.js +1 -1
- package/dist/esm/mods/security/src/core/password/index.js +1 -1
- package/dist/esm/mods/security/src/core/password/password-algorithms.js +1 -1
- package/dist/esm/mods/security/src/core/password/password-core.js +1 -1
- package/dist/esm/mods/security/src/core/password/password-generator.js +1 -1
- package/dist/esm/mods/security/src/core/password/password-utils.js +1 -1
- package/dist/esm/mods/security/src/helpers/Uint8Array.js +2 -2
- package/dist/esm/mods/security/src/helpers/Uint8Array.js.map +1 -1
- package/dist/esm/mods/security/src/index.js +1 -1
- package/dist/esm/mods/security/src/utils/dataConverter.js +2 -2
- package/dist/esm/mods/security/src/utils/dataConverter.js.map +1 -1
- package/dist/esm/src/cluster/modules/CrossPlatformMemory.js +11 -9
- package/dist/esm/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
- package/dist/esm/src/encryption/EncryptionService.js +1 -1
- package/dist/esm/src/index.js +1 -0
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js +16 -0
- package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js.map +1 -1
- package/dist/esm/src/plugins/modules/index.js +1 -1
- package/dist/esm/src/server/FastServer.js +18 -1
- package/dist/esm/src/server/FastServer.js.map +1 -1
- package/dist/esm/src/server/core/HttpServer.js +16 -8
- package/dist/esm/src/server/core/HttpServer.js.map +1 -1
- package/dist/esm/src/server/core/XyprissApp.js +8 -0
- package/dist/esm/src/server/core/XyprissApp.js.map +1 -1
- package/dist/esm/src/server/handlers/templates/notFoundTemp.js +1 -1
- package/dist/esm/src/server/utils/trustProxy.js +444 -0
- package/dist/esm/src/server/utils/trustProxy.js.map +1 -0
- package/dist/esm/src/server/utils/wildcardMatcher.js +88 -0
- package/dist/esm/src/server/utils/wildcardMatcher.js.map +1 -0
- package/dist/index.d.ts +144 -4
- package/package.json +3 -3
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var net = require('net');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Advanced Trust Proxy Implementation for XyPriss
|
|
7
|
+
*
|
|
8
|
+
* Supports Express-like trust proxy configurations including:
|
|
9
|
+
* - Boolean values (true/false)
|
|
10
|
+
* - String values ('loopback', 'linklocal', 'uniquelocal')
|
|
11
|
+
* - CIDR notation ('192.168.0.0/16')
|
|
12
|
+
* - IP addresses ('127.0.0.1')
|
|
13
|
+
* - Arrays of the above
|
|
14
|
+
* - Custom functions
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Predefined network ranges
|
|
18
|
+
*/
|
|
19
|
+
const PREDEFINED_RANGES = {
|
|
20
|
+
loopback: ["127.0.0.0/8", "::1/128"],
|
|
21
|
+
linklocal: ["169.254.0.0/16", "fe80::/10"],
|
|
22
|
+
uniquelocal: ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "fc00::/7"],
|
|
23
|
+
};
|
|
24
|
+
class TrustProxy {
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.trustProxyFn = this.createTrustProxyFunction(config);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate and normalize IP address string
|
|
30
|
+
*/
|
|
31
|
+
normalizeIP(ip) {
|
|
32
|
+
if (!ip || typeof ip !== "string")
|
|
33
|
+
return null;
|
|
34
|
+
const trimmed = ip.trim();
|
|
35
|
+
if (!trimmed)
|
|
36
|
+
return null;
|
|
37
|
+
// Handle IPv4-mapped IPv6 addresses (::ffff:192.168.1.1)
|
|
38
|
+
if (trimmed.startsWith("::ffff:") && trimmed.includes(".")) {
|
|
39
|
+
const ipv4Part = trimmed.substring(7);
|
|
40
|
+
if (net.isIP(ipv4Part) === 4) {
|
|
41
|
+
return ipv4Part;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Validate it's a proper IP
|
|
45
|
+
const ipVersion = net.isIP(trimmed);
|
|
46
|
+
if (ipVersion === 0)
|
|
47
|
+
return null;
|
|
48
|
+
return trimmed;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Convert IPv4 address to number for comparison
|
|
52
|
+
*/
|
|
53
|
+
ipv4ToNumber(ip) {
|
|
54
|
+
try {
|
|
55
|
+
const parts = ip.split(".");
|
|
56
|
+
if (parts.length !== 4)
|
|
57
|
+
return null;
|
|
58
|
+
const nums = parts.map((p) => {
|
|
59
|
+
const num = parseInt(p, 10);
|
|
60
|
+
if (isNaN(num) || num < 0 || num > 255)
|
|
61
|
+
throw new Error("Invalid octet");
|
|
62
|
+
return num;
|
|
63
|
+
});
|
|
64
|
+
return (nums[0] << 24) + (nums[1] << 16) + (nums[2] << 8) + nums[3];
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check if IPv4 address is in CIDR range
|
|
72
|
+
*/
|
|
73
|
+
isIPv4InCIDR(ip, cidr) {
|
|
74
|
+
try {
|
|
75
|
+
const parts = cidr.split("/");
|
|
76
|
+
if (parts.length !== 2)
|
|
77
|
+
return false;
|
|
78
|
+
const [network, prefixLength] = parts;
|
|
79
|
+
const prefixLen = parseInt(prefixLength, 10);
|
|
80
|
+
if (isNaN(prefixLen) || prefixLen < 0 || prefixLen > 32)
|
|
81
|
+
return false;
|
|
82
|
+
const ipNum = this.ipv4ToNumber(ip);
|
|
83
|
+
const networkNum = this.ipv4ToNumber(network);
|
|
84
|
+
if (ipNum === null || networkNum === null)
|
|
85
|
+
return false;
|
|
86
|
+
// Handle edge cases
|
|
87
|
+
if (prefixLen === 0)
|
|
88
|
+
return true; // 0.0.0.0/0 matches everything
|
|
89
|
+
if (prefixLen === 32)
|
|
90
|
+
return ipNum === networkNum; // Exact match
|
|
91
|
+
const mask = (0xffffffff << (32 - prefixLen)) >>> 0;
|
|
92
|
+
return (ipNum & mask) === (networkNum & mask);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Expand IPv6 address to full form
|
|
100
|
+
*/
|
|
101
|
+
expandIPv6(ip) {
|
|
102
|
+
try {
|
|
103
|
+
if (!ip.includes(":"))
|
|
104
|
+
return null;
|
|
105
|
+
// Handle :: compression
|
|
106
|
+
if (ip.includes("::")) {
|
|
107
|
+
const parts = ip.split("::");
|
|
108
|
+
if (parts.length > 2)
|
|
109
|
+
return null; // Invalid: multiple ::
|
|
110
|
+
const left = parts[0] ? parts[0].split(":") : [];
|
|
111
|
+
const right = parts[1] ? parts[1].split(":") : [];
|
|
112
|
+
const missing = 8 - left.length - right.length;
|
|
113
|
+
if (missing < 0)
|
|
114
|
+
return null; // Too many parts
|
|
115
|
+
const middle = Array(missing).fill("0000");
|
|
116
|
+
const allParts = [...left, ...middle, ...right];
|
|
117
|
+
// Pad each part to 4 hex digits
|
|
118
|
+
return allParts.map((p) => p.padStart(4, "0")).join(":");
|
|
119
|
+
}
|
|
120
|
+
// No compression
|
|
121
|
+
const parts = ip.split(":");
|
|
122
|
+
if (parts.length !== 8)
|
|
123
|
+
return null;
|
|
124
|
+
return parts.map((p) => p.padStart(4, "0")).join(":");
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Convert IPv6 address to BigInt for comparison
|
|
132
|
+
*/
|
|
133
|
+
ipv6ToBigInt(ip) {
|
|
134
|
+
try {
|
|
135
|
+
const expanded = this.expandIPv6(ip);
|
|
136
|
+
if (!expanded)
|
|
137
|
+
return null;
|
|
138
|
+
const parts = expanded.split(":");
|
|
139
|
+
if (parts.length !== 8)
|
|
140
|
+
return null;
|
|
141
|
+
let result = 0n;
|
|
142
|
+
for (let i = 0; i < 8; i++) {
|
|
143
|
+
const val = parseInt(parts[i], 16);
|
|
144
|
+
if (isNaN(val) || val < 0 || val > 0xffff)
|
|
145
|
+
return null;
|
|
146
|
+
result = (result << 16n) + BigInt(val);
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Check if IPv6 address is in CIDR range
|
|
156
|
+
*/
|
|
157
|
+
isIPv6InCIDR(ip, cidr) {
|
|
158
|
+
try {
|
|
159
|
+
const parts = cidr.split("/");
|
|
160
|
+
if (parts.length !== 2)
|
|
161
|
+
return false;
|
|
162
|
+
const [network, prefixLength] = parts;
|
|
163
|
+
const prefixLen = parseInt(prefixLength, 10);
|
|
164
|
+
if (isNaN(prefixLen) || prefixLen < 0 || prefixLen > 128)
|
|
165
|
+
return false;
|
|
166
|
+
const ipNum = this.ipv6ToBigInt(ip);
|
|
167
|
+
const networkNum = this.ipv6ToBigInt(network);
|
|
168
|
+
if (ipNum === null || networkNum === null)
|
|
169
|
+
return false;
|
|
170
|
+
// Handle edge cases
|
|
171
|
+
if (prefixLen === 0)
|
|
172
|
+
return true; // ::/0 matches everything
|
|
173
|
+
if (prefixLen === 128)
|
|
174
|
+
return ipNum === networkNum; // Exact match
|
|
175
|
+
const mask = (BigInt(2) ** BigInt(128) - BigInt(1)) <<
|
|
176
|
+
BigInt(128 - prefixLen);
|
|
177
|
+
return (ipNum & mask) === (networkNum & mask);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check if IP address is in CIDR range
|
|
185
|
+
*/
|
|
186
|
+
isIPInCIDR(ip, cidr) {
|
|
187
|
+
if (!ip || !cidr)
|
|
188
|
+
return false;
|
|
189
|
+
const ipVersion = net.isIP(ip);
|
|
190
|
+
if (ipVersion === 0)
|
|
191
|
+
return false;
|
|
192
|
+
// Determine CIDR type
|
|
193
|
+
const isCIDRv4 = cidr.includes(".") && cidr.includes("/");
|
|
194
|
+
const isCIDRv6 = cidr.includes(":") && cidr.includes("/");
|
|
195
|
+
if (ipVersion === 4 && isCIDRv4) {
|
|
196
|
+
return this.isIPv4InCIDR(ip, cidr);
|
|
197
|
+
}
|
|
198
|
+
else if (ipVersion === 6 && isCIDRv6) {
|
|
199
|
+
return this.isIPv6InCIDR(ip, cidr);
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Check if IP matches a single trust proxy rule
|
|
205
|
+
*/
|
|
206
|
+
matchesTrustRule(ip, rule) {
|
|
207
|
+
if (!ip || !rule)
|
|
208
|
+
return false;
|
|
209
|
+
try {
|
|
210
|
+
// Handle predefined ranges
|
|
211
|
+
if (rule in PREDEFINED_RANGES) {
|
|
212
|
+
const ranges = PREDEFINED_RANGES[rule];
|
|
213
|
+
return ranges.some((range) => this.isIPInCIDR(ip, range));
|
|
214
|
+
}
|
|
215
|
+
// Handle CIDR notation
|
|
216
|
+
if (rule.includes("/")) {
|
|
217
|
+
return this.isIPInCIDR(ip, rule);
|
|
218
|
+
}
|
|
219
|
+
// Handle exact IP match (normalize both for comparison)
|
|
220
|
+
const normalizedIP = this.normalizeIP(ip);
|
|
221
|
+
const normalizedRule = this.normalizeIP(rule);
|
|
222
|
+
if (!normalizedIP || !normalizedRule)
|
|
223
|
+
return false;
|
|
224
|
+
return normalizedIP === normalizedRule;
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Create a trust proxy function from configuration
|
|
232
|
+
*/
|
|
233
|
+
createTrustProxyFunction(config) {
|
|
234
|
+
// Handle boolean values
|
|
235
|
+
if (typeof config === "boolean") {
|
|
236
|
+
return () => config;
|
|
237
|
+
}
|
|
238
|
+
// Handle number values (trust first N hops)
|
|
239
|
+
if (typeof config === "number") {
|
|
240
|
+
if (!Number.isInteger(config) || config < 0) {
|
|
241
|
+
throw new Error("Trust proxy number must be a non-negative integer");
|
|
242
|
+
}
|
|
243
|
+
return (_ip, hopIndex) => hopIndex < config;
|
|
244
|
+
}
|
|
245
|
+
// Handle function values
|
|
246
|
+
if (typeof config === "function") {
|
|
247
|
+
return (ip, hopIndex) => {
|
|
248
|
+
try {
|
|
249
|
+
return Boolean(config(ip, hopIndex));
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return false; // Safe default on function error
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
// Handle string values
|
|
257
|
+
if (typeof config === "string") {
|
|
258
|
+
const trimmed = config.trim();
|
|
259
|
+
if (!trimmed)
|
|
260
|
+
return () => false;
|
|
261
|
+
return (ip) => this.matchesTrustRule(ip, trimmed);
|
|
262
|
+
}
|
|
263
|
+
// Handle array values
|
|
264
|
+
if (Array.isArray(config)) {
|
|
265
|
+
const validRules = config.filter((rule) => typeof rule === "string" && rule.trim());
|
|
266
|
+
if (validRules.length === 0)
|
|
267
|
+
return () => false;
|
|
268
|
+
return (ip) => validRules.some((rule) => this.matchesTrustRule(ip, rule));
|
|
269
|
+
}
|
|
270
|
+
// Default: don't trust
|
|
271
|
+
return () => false;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Safely parse X-Forwarded-For header
|
|
275
|
+
*/
|
|
276
|
+
parseForwardedFor(header) {
|
|
277
|
+
if (!header)
|
|
278
|
+
return [];
|
|
279
|
+
// Handle array form (shouldn't happen but be defensive)
|
|
280
|
+
const headerStr = Array.isArray(header) ? header.join(",") : header;
|
|
281
|
+
if (typeof headerStr !== "string")
|
|
282
|
+
return [];
|
|
283
|
+
return headerStr
|
|
284
|
+
.split(",")
|
|
285
|
+
.map((ip) => this.normalizeIP(ip))
|
|
286
|
+
.filter((ip) => ip !== null);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get remote address with fallback
|
|
290
|
+
*/
|
|
291
|
+
getRemoteAddress(req) {
|
|
292
|
+
const remoteAddr = req.socket?.remoteAddress;
|
|
293
|
+
if (!remoteAddr)
|
|
294
|
+
return "127.0.0.1";
|
|
295
|
+
const normalized = this.normalizeIP(remoteAddr);
|
|
296
|
+
return normalized || "127.0.0.1";
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Extract client IP considering trust proxy configuration
|
|
300
|
+
*/
|
|
301
|
+
extractClientIP(req) {
|
|
302
|
+
try {
|
|
303
|
+
const forwardedFor = req.headers["x-forwarded-for"];
|
|
304
|
+
const ips = this.parseForwardedFor(forwardedFor);
|
|
305
|
+
if (ips.length === 0) {
|
|
306
|
+
// No forwarded headers, return direct connection IP
|
|
307
|
+
return this.getRemoteAddress(req);
|
|
308
|
+
}
|
|
309
|
+
// Start from the rightmost IP (closest to server) and work backwards
|
|
310
|
+
const directIP = this.getRemoteAddress(req);
|
|
311
|
+
let trustedIP = directIP;
|
|
312
|
+
// Process IPs from right to left (closest to server first)
|
|
313
|
+
for (let i = ips.length - 1; i >= 0; i--) {
|
|
314
|
+
const hopIndex = ips.length - 1 - i;
|
|
315
|
+
const currentIP = ips[i];
|
|
316
|
+
// Check if we trust this hop
|
|
317
|
+
if (this.trustProxyFn(trustedIP, hopIndex)) {
|
|
318
|
+
trustedIP = currentIP;
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
// Stop at first untrusted hop
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return trustedIP;
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
// On any error, return the direct connection IP as safe default
|
|
329
|
+
return this.getRemoteAddress(req);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Extract all IPs in the proxy chain
|
|
334
|
+
*/
|
|
335
|
+
extractProxyChain(req) {
|
|
336
|
+
try {
|
|
337
|
+
const forwardedFor = req.headers["x-forwarded-for"];
|
|
338
|
+
const ips = this.parseForwardedFor(forwardedFor);
|
|
339
|
+
const directIP = this.getRemoteAddress(req);
|
|
340
|
+
if (ips.length === 0) {
|
|
341
|
+
return [directIP];
|
|
342
|
+
}
|
|
343
|
+
const trustedIPs = [directIP];
|
|
344
|
+
// Process IPs from right to left
|
|
345
|
+
for (let i = ips.length - 1; i >= 0; i--) {
|
|
346
|
+
const hopIndex = ips.length - 1 - i;
|
|
347
|
+
const currentIP = ips[i];
|
|
348
|
+
const previousIP = trustedIPs[trustedIPs.length - 1];
|
|
349
|
+
if (this.trustProxyFn(previousIP, hopIndex)) {
|
|
350
|
+
trustedIPs.push(currentIP);
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return trustedIPs.reverse(); // Return in client -> server order
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
return [this.getRemoteAddress(req)];
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Determine if connection is secure based on trust proxy
|
|
364
|
+
*/
|
|
365
|
+
isSecureConnection(req) {
|
|
366
|
+
try {
|
|
367
|
+
// Check if we have a direct TLS connection
|
|
368
|
+
const socket = req.socket;
|
|
369
|
+
if (socket?.encrypted === true) {
|
|
370
|
+
return true;
|
|
371
|
+
}
|
|
372
|
+
// Check X-Forwarded-Proto header if we trust the proxy
|
|
373
|
+
const forwardedProto = req.headers["x-forwarded-proto"];
|
|
374
|
+
if (!forwardedProto)
|
|
375
|
+
return false;
|
|
376
|
+
const directIP = this.getRemoteAddress(req);
|
|
377
|
+
if (!this.trustProxyFn(directIP, 0))
|
|
378
|
+
return false;
|
|
379
|
+
// Handle both string and array forms
|
|
380
|
+
const protoStr = Array.isArray(forwardedProto)
|
|
381
|
+
? forwardedProto[0]
|
|
382
|
+
: forwardedProto;
|
|
383
|
+
if (typeof protoStr !== "string")
|
|
384
|
+
return false;
|
|
385
|
+
// Take first value if comma-separated
|
|
386
|
+
const proto = protoStr.split(",")[0].trim().toLowerCase();
|
|
387
|
+
return proto === "https";
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
return false;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Get protocol considering trust proxy
|
|
395
|
+
*/
|
|
396
|
+
getProtocol(req) {
|
|
397
|
+
return this.isSecureConnection(req) ? "https" : "http";
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Get hostname considering trust proxy
|
|
401
|
+
*/
|
|
402
|
+
getHostname(req) {
|
|
403
|
+
try {
|
|
404
|
+
const directIP = this.getRemoteAddress(req);
|
|
405
|
+
// Check X-Forwarded-Host if we trust the proxy
|
|
406
|
+
const forwardedHost = req.headers["x-forwarded-host"];
|
|
407
|
+
if (forwardedHost && this.trustProxyFn(directIP, 0)) {
|
|
408
|
+
const hostStr = Array.isArray(forwardedHost)
|
|
409
|
+
? forwardedHost[0]
|
|
410
|
+
: forwardedHost;
|
|
411
|
+
if (typeof hostStr === "string" && hostStr.trim()) {
|
|
412
|
+
// Take first host if comma-separated, remove port
|
|
413
|
+
const hostname = hostStr.split(",")[0].trim().split(":")[0];
|
|
414
|
+
if (hostname)
|
|
415
|
+
return hostname;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// Fallback to Host header
|
|
419
|
+
const host = req.headers.host;
|
|
420
|
+
if (host && typeof host === "string") {
|
|
421
|
+
const hostname = host.split(":")[0];
|
|
422
|
+
if (hostname)
|
|
423
|
+
return hostname;
|
|
424
|
+
}
|
|
425
|
+
return "localhost";
|
|
426
|
+
}
|
|
427
|
+
catch {
|
|
428
|
+
return "localhost";
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Validate trust proxy configuration
|
|
433
|
+
*/
|
|
434
|
+
static validate(config) {
|
|
435
|
+
try {
|
|
436
|
+
new TrustProxy(config);
|
|
437
|
+
return true;
|
|
438
|
+
}
|
|
439
|
+
catch {
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
exports.TrustProxy = TrustProxy;
|
|
446
|
+
//# sourceMappingURL=trustProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trustProxy.js","sources":["../../../../../src/server/utils/trustProxy.ts"],"sourcesContent":[null],"names":["isIP"],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Wildcard pattern matching utility for CORS origins
|
|
5
|
+
*
|
|
6
|
+
* Supports patterns like:
|
|
7
|
+
* - "localhost:*" matches "localhost:3000", "localhost:8080", etc.
|
|
8
|
+
* - "*.example.com" matches "api.example.com", "app.example.com", etc.
|
|
9
|
+
* - "127.0.0.1:*" matches "127.0.0.1:3000", "127.0.0.1:8080", etc.
|
|
10
|
+
* - "::1:*" matches "::1:3000", "::1:8080", etc.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Converts a wildcard pattern to a regular expression
|
|
14
|
+
* @param pattern - The wildcard pattern (e.g., "localhost:*", "*.example.com")
|
|
15
|
+
* @returns RegExp object for matching
|
|
16
|
+
*/
|
|
17
|
+
function patternToRegex(pattern) {
|
|
18
|
+
// Escape special regex characters except for *
|
|
19
|
+
const escaped = pattern
|
|
20
|
+
.replace(/[.+?^${}()|[\]\\]/g, '\\$&') // Escape special chars
|
|
21
|
+
.replace(/\*/g, '.*'); // Replace * with .*
|
|
22
|
+
// Ensure exact match with ^ and $
|
|
23
|
+
return new RegExp(`^${escaped}$`, 'i'); // Case insensitive
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Checks if an origin matches a wildcard pattern
|
|
27
|
+
* @param origin - The origin to check (e.g., "http://localhost:3000")
|
|
28
|
+
* @param pattern - The wildcard pattern (e.g., "localhost:*")
|
|
29
|
+
* @returns true if the origin matches the pattern
|
|
30
|
+
*/
|
|
31
|
+
function matchesWildcardPattern(origin, pattern) {
|
|
32
|
+
// Handle exact matches first (no wildcards)
|
|
33
|
+
if (!pattern.includes('*')) {
|
|
34
|
+
return origin === pattern || origin.includes(pattern);
|
|
35
|
+
}
|
|
36
|
+
// Extract the host:port part from the origin URL
|
|
37
|
+
let originHost;
|
|
38
|
+
try {
|
|
39
|
+
const url = new URL(origin);
|
|
40
|
+
originHost = url.host; // This includes both hostname and port
|
|
41
|
+
// Special handling for default ports
|
|
42
|
+
if (url.protocol === 'https:' && url.port === '' && url.hostname === 'localhost') {
|
|
43
|
+
originHost = 'localhost:443';
|
|
44
|
+
}
|
|
45
|
+
else if (url.protocol === 'http:' && url.port === '' && url.hostname === 'localhost') {
|
|
46
|
+
originHost = 'localhost:80';
|
|
47
|
+
}
|
|
48
|
+
// Handle IPv6 addresses - remove brackets for pattern matching
|
|
49
|
+
if (url.hostname.startsWith('[') && url.hostname.endsWith(']')) {
|
|
50
|
+
const ipv6Host = url.hostname.slice(1, -1); // Remove brackets
|
|
51
|
+
originHost = url.port ? `${ipv6Host}:${url.port}` : ipv6Host;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// If it's not a valid URL, treat it as a host:port string
|
|
56
|
+
originHost = origin;
|
|
57
|
+
}
|
|
58
|
+
const regex = patternToRegex(pattern);
|
|
59
|
+
return regex.test(originHost);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Checks if an origin is allowed based on an array of patterns
|
|
63
|
+
* @param origin - The origin to check
|
|
64
|
+
* @param allowedOrigins - Array of allowed origins (can include wildcards)
|
|
65
|
+
* @returns true if the origin is allowed
|
|
66
|
+
*/
|
|
67
|
+
function isOriginAllowed(origin, allowedOrigins) {
|
|
68
|
+
if (!origin || !allowedOrigins || allowedOrigins.length === 0) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return allowedOrigins.some(pattern => matchesWildcardPattern(origin, pattern));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Creates a CORS origin function that supports wildcard patterns
|
|
75
|
+
* @param allowedOrigins - Array of allowed origins (can include wildcards)
|
|
76
|
+
* @returns Function compatible with cors middleware
|
|
77
|
+
*/
|
|
78
|
+
function createWildcardOriginFunction(allowedOrigins) {
|
|
79
|
+
return (origin, callback) => {
|
|
80
|
+
// Allow requests with no origin (like mobile apps or curl requests)
|
|
81
|
+
if (!origin) {
|
|
82
|
+
return callback(null, true);
|
|
83
|
+
}
|
|
84
|
+
const allowed = isOriginAllowed(origin, allowedOrigins);
|
|
85
|
+
callback(null, allowed);
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
exports.createWildcardOriginFunction = createWildcardOriginFunction;
|
|
90
|
+
exports.isOriginAllowed = isOriginAllowed;
|
|
91
|
+
exports.matchesWildcardPattern = matchesWildcardPattern;
|
|
92
|
+
//# sourceMappingURL=wildcardMatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wildcardMatcher.js","sources":["../../../../../src/server/utils/wildcardMatcher.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;;;;;;;;AAQG;AAEH;;;;AAIG;AACH,SAAS,cAAc,CAAC,OAAe,EAAA;;IAEnC,MAAM,OAAO,GAAG,OAAO;AAClB,SAAA,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC;AACrC,SAAA,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;;IAG1B,OAAO,IAAI,MAAM,CAAC,CAAI,CAAA,EAAA,OAAO,CAAG,CAAA,CAAA,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;AAKG;AACa,SAAA,sBAAsB,CAAC,MAAc,EAAE,OAAe,EAAA;;IAElE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QACxB,OAAO,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;KACzD;;AAGD,IAAA,IAAI,UAAkB,CAAC;AACvB,IAAA,IAAI;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;AAC5B,QAAA,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC;;AAGtB,QAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE;YAC9E,UAAU,GAAG,eAAe,CAAC;SAChC;AAAM,aAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE;YACpF,UAAU,GAAG,cAAc,CAAC;SAC/B;;AAGD,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC5D,YAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3C,YAAA,UAAU,GAAG,GAAG,CAAC,IAAI,GAAG,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,GAAG,CAAC,IAAI,CAAA,CAAE,GAAG,QAAQ,CAAC;SAChE;KACJ;AAAC,IAAA,MAAM;;QAEJ,UAAU,GAAG,MAAM,CAAC;KACvB;AAED,IAAA,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;AACtC,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC;AAED;;;;;AAKG;AACa,SAAA,eAAe,CAAC,MAAc,EAAE,cAAwB,EAAA;AACpE,IAAA,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3D,QAAA,OAAO,KAAK,CAAC;KAChB;AAED,IAAA,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,IAAI,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AACnF,CAAC;AAED;;;;AAIG;AACG,SAAU,4BAA4B,CAAC,cAAwB,EAAA;AACjE,IAAA,OAAO,CAAC,MAA0B,EAAE,QAAsD,KAAI;;QAE1F,IAAI,CAAC,MAAM,EAAE;AACT,YAAA,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SAC/B;QAED,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACxD,QAAA,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,KAAC,CAAC;AACN;;;;;;"}
|
|
@@ -12,7 +12,7 @@ import '../core/keys/algorithms/mods/PBKDF2Algo.js';
|
|
|
12
12
|
import { SecureRandom } from '../core/random/random-core.js';
|
|
13
13
|
import '../core/random/random-types.js';
|
|
14
14
|
import '../core/random/random-sources.js';
|
|
15
|
-
import '
|
|
15
|
+
import 'strulink';
|
|
16
16
|
import '../utils/memory/index.js';
|
|
17
17
|
import '../types.js';
|
|
18
18
|
import '../core/password/index.js';
|
|
@@ -2,7 +2,7 @@ import { SecureRandom } from '../core/random/random-core.js';
|
|
|
2
2
|
import '../core/random/random-types.js';
|
|
3
3
|
import 'crypto';
|
|
4
4
|
import '../core/random/random-sources.js';
|
|
5
|
-
import '
|
|
5
|
+
import 'strulink';
|
|
6
6
|
import { bufferToHex, bufferToBase64, base64ToBuffer, hexToBuffer } from '../utils/encoding.js';
|
|
7
7
|
import '../utils/memory/index.js';
|
|
8
8
|
import '../types.js';
|
|
@@ -5,7 +5,7 @@ import { EventEmitter } from 'events';
|
|
|
5
5
|
import { SecureRandom } from '../../core/random/random-core.js';
|
|
6
6
|
import '../../core/random/random-types.js';
|
|
7
7
|
import '../../core/random/random-sources.js';
|
|
8
|
-
import '
|
|
8
|
+
import 'strulink';
|
|
9
9
|
import '../../utils/memory/index.js';
|
|
10
10
|
import '../../types.js';
|
|
11
11
|
import { CONFIG } from './config/cache.config.js';
|
|
@@ -16,7 +16,7 @@ import '../../core/keys/algorithms/mods/PBKDF2Algo.js';
|
|
|
16
16
|
import { SecureRandom } from '../../core/random/random-core.js';
|
|
17
17
|
import '../../core/random/random-types.js';
|
|
18
18
|
import '../../core/random/random-sources.js';
|
|
19
|
-
import '
|
|
19
|
+
import 'strulink';
|
|
20
20
|
import '../../utils/memory/index.js';
|
|
21
21
|
import '../../types.js';
|
|
22
22
|
import '../../core/password/index.js';
|
|
@@ -12,7 +12,7 @@ import '../../core/keys/keys-utils.js';
|
|
|
12
12
|
import '../../core/keys/algorithms/mods/PBKDF2Algo.js';
|
|
13
13
|
import '../../core/random/random-types.js';
|
|
14
14
|
import '../../core/random/random-sources.js';
|
|
15
|
-
import '
|
|
15
|
+
import 'strulink';
|
|
16
16
|
import '../../utils/memory/index.js';
|
|
17
17
|
import '../../types.js';
|
|
18
18
|
import '../../core/password/index.js';
|
|
@@ -2,7 +2,7 @@ import { SecureRandom } from '../core/random/random-core.js';
|
|
|
2
2
|
import '../core/random/random-types.js';
|
|
3
3
|
import 'crypto';
|
|
4
4
|
import '../core/random/random-sources.js';
|
|
5
|
-
import '
|
|
5
|
+
import 'strulink';
|
|
6
6
|
import { bufferToHex, hexToBuffer } from '../utils/encoding.js';
|
|
7
7
|
import '../utils/memory/index.js';
|
|
8
8
|
import '../types.js';
|
|
@@ -17,7 +17,7 @@ import '../../core/hash/hash-advanced.js';
|
|
|
17
17
|
import '../../algorithms/hash-algorithms.js';
|
|
18
18
|
import '../../core/random/random-types.js';
|
|
19
19
|
import '../../core/random/random-sources.js';
|
|
20
|
-
import '
|
|
20
|
+
import 'strulink';
|
|
21
21
|
import '../../types.js';
|
|
22
22
|
import '../secure-array/utils/id-generator.js';
|
|
23
23
|
import '../../index.js';
|
package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js
CHANGED
|
@@ -2,7 +2,7 @@ import { SecureRandom } from '../../../core/random/random-core.js';
|
|
|
2
2
|
import '../../../core/random/random-types.js';
|
|
3
3
|
import 'crypto';
|
|
4
4
|
import '../../../core/random/random-sources.js';
|
|
5
|
-
import '
|
|
5
|
+
import 'strulink';
|
|
6
6
|
import '../../../utils/memory/index.js';
|
|
7
7
|
import '../../../types.js';
|
|
8
8
|
import { Hash } from '../../../core/hash/hash-core.js';
|
|
@@ -2,7 +2,7 @@ import { SecureRandom } from '../core/random/random-core.js';
|
|
|
2
2
|
import '../core/random/random-types.js';
|
|
3
3
|
import 'crypto';
|
|
4
4
|
import '../core/random/random-sources.js';
|
|
5
|
-
import '
|
|
5
|
+
import 'strulink';
|
|
6
6
|
import { bufferToHex } from '../utils/encoding.js';
|
|
7
7
|
import { StatsTracker } from '../utils/stats.js';
|
|
8
8
|
import '../utils/memory/index.js';
|
|
@@ -2,7 +2,7 @@ import { SecureRandom } from '../core/random/random-core.js';
|
|
|
2
2
|
import '../core/random/random-types.js';
|
|
3
3
|
import 'crypto';
|
|
4
4
|
import '../core/random/random-sources.js';
|
|
5
|
-
import '
|
|
5
|
+
import 'strulink';
|
|
6
6
|
import { hexToBuffer, bufferToHex } from '../utils/encoding.js';
|
|
7
7
|
import '../utils/memory/index.js';
|
|
8
8
|
import '../types.js';
|