xypriss 2.3.7 → 3.1.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 (36) hide show
  1. package/README.md +21 -19
  2. package/dist/cjs/mods/security/src/index.js +1 -1
  3. package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js +2 -2
  4. package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
  5. package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js +123 -14
  6. package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js.map +1 -1
  7. package/dist/cjs/src/middleware/built-in/security/BrowserOnlyProtector.js +552 -0
  8. package/dist/cjs/src/middleware/built-in/security/BrowserOnlyProtector.js.map +1 -0
  9. package/dist/cjs/src/middleware/built-in/security/RequestSignatureProtector.js +465 -0
  10. package/dist/cjs/src/middleware/built-in/security/RequestSignatureProtector.js.map +1 -0
  11. package/dist/cjs/src/middleware/built-in/security/TerminalOnlyProtector.js +477 -0
  12. package/dist/cjs/src/middleware/built-in/security/TerminalOnlyProtector.js.map +1 -0
  13. package/dist/cjs/src/middleware/security-middleware.js +257 -91
  14. package/dist/cjs/src/middleware/security-middleware.js.map +1 -1
  15. package/dist/cjs/src/server/components/fastapi/templates/redirectTemp.js +1 -1
  16. package/dist/cjs/src/server/const/default.js +1 -1
  17. package/dist/cjs/src/server/const/default.js.map +1 -1
  18. package/dist/esm/mods/security/src/index.js +1 -1
  19. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js +2 -2
  20. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
  21. package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js +123 -14
  22. package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js.map +1 -1
  23. package/dist/esm/src/middleware/built-in/security/BrowserOnlyProtector.js +550 -0
  24. package/dist/esm/src/middleware/built-in/security/BrowserOnlyProtector.js.map +1 -0
  25. package/dist/esm/src/middleware/built-in/security/RequestSignatureProtector.js +444 -0
  26. package/dist/esm/src/middleware/built-in/security/RequestSignatureProtector.js.map +1 -0
  27. package/dist/esm/src/middleware/built-in/security/TerminalOnlyProtector.js +475 -0
  28. package/dist/esm/src/middleware/built-in/security/TerminalOnlyProtector.js.map +1 -0
  29. package/dist/esm/src/middleware/security-middleware.js +257 -91
  30. package/dist/esm/src/middleware/security-middleware.js.map +1 -1
  31. package/dist/esm/src/server/components/fastapi/templates/redirectTemp.js +1 -1
  32. package/dist/esm/src/server/const/default.js +1 -1
  33. package/dist/esm/src/server/const/default.js.map +1 -1
  34. package/dist/index.d.ts +268 -10
  35. package/package.json +6 -5
  36. package/scripts/install-memory-cli.js +1 -1
@@ -0,0 +1,465 @@
1
+ 'use strict';
2
+
3
+ var Logger = require('../../../../shared/logger/Logger.js');
4
+ var crypto = require('crypto');
5
+
6
+ function _interopNamespaceDefault(e) {
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var crypto__namespace = /*#__PURE__*/_interopNamespaceDefault(crypto);
24
+
25
+ /**
26
+ * XyRS - XyPriss Request Signature Protector
27
+ * Validates request signatures for API authentication
28
+ * Uses a predefined header name with developer-configured secret value
29
+ * Enhanced with robust validation and security measures
30
+ */
31
+ class RequestSignatureProtector {
32
+ constructor(options, logger) {
33
+ this.HEADER_NAME = "XP-Request-Sig";
34
+ this.failedAttempts = new Map();
35
+ this.CLEANUP_INTERVAL = 60000; // 1 minute
36
+ // Strict validation of required secret
37
+ this.validateSecret(options.secret, options.minSecretLength);
38
+ this.config = {
39
+ errorMessage: "Invalid or missing request signature",
40
+ statusCode: 401,
41
+ debug: false,
42
+ caseSensitive: true,
43
+ trimValue: true,
44
+ maxHeaderLength: 512,
45
+ maxFailedAttempts: 5,
46
+ blockDuration: 15 * 60 * 1000, // 15 minutes
47
+ minSecretLength: 32,
48
+ timingSafeComparison: true,
49
+ rejectSuspiciousPatterns: true,
50
+ ...options,
51
+ };
52
+ // Store hashed version of secret for additional security
53
+ this.SECRET_HASH = this.hashSecret(this.config.secret);
54
+ // Initialize logger
55
+ this.logger =
56
+ logger ||
57
+ new Logger.Logger({
58
+ enabled: true,
59
+ level: "debug",
60
+ components: { security: true },
61
+ types: { debug: true },
62
+ });
63
+ // Start cleanup timer for failed attempts tracking
64
+ this.startCleanupTimer();
65
+ this.logSecurityEvent("info", "XyRS initialized with strict validation");
66
+ }
67
+ /**
68
+ * Get the request signature middleware function
69
+ */
70
+ getMiddleware() {
71
+ return (req, res, next) => {
72
+ this.handleRequest(req, res, next);
73
+ };
74
+ }
75
+ /**
76
+ * Handle incoming request and validate signature
77
+ */
78
+ handleRequest(req, res, next) {
79
+ const clientId = this.extractClientIdentifier(req);
80
+ // Check if client is currently blocked
81
+ if (this.isClientBlocked(clientId)) {
82
+ return this.blockRequest(res, "RATE_LIMITED", "Too many failed authentication attempts. Temporarily blocked.", clientId);
83
+ }
84
+ if (this.config.debug) {
85
+ this.logger.debug("security", "XyRS validating request signature");
86
+ }
87
+ // Strict header extraction
88
+ const signature = this.extractSignatureHeader(req);
89
+ if (signature === null) {
90
+ this.recordFailedAttempt(clientId);
91
+ return this.blockRequest(res, "MISSING_SIGNATURE", `Required header '${this.HEADER_NAME}' is missing or malformed`, clientId);
92
+ }
93
+ // Length validation to prevent DoS
94
+ if (!this.validateHeaderLength(signature)) {
95
+ this.recordFailedAttempt(clientId);
96
+ return this.blockRequest(res, "INVALID_HEADER_LENGTH", `Header value exceeds maximum allowed length`, clientId);
97
+ }
98
+ // Suspicious pattern detection
99
+ if (this.config.rejectSuspiciousPatterns &&
100
+ this.containsSuspiciousPatterns(signature)) {
101
+ this.recordFailedAttempt(clientId);
102
+ return this.blockRequest(res, "SUSPICIOUS_PATTERN", `Header contains suspicious or malicious patterns`, clientId);
103
+ }
104
+ // Process signature value
105
+ const processedSignature = this.processSignatureValue(signature);
106
+ const expectedSignature = this.processSignatureValue(this.config.secret);
107
+ // Validate signature with timing-safe comparison
108
+ const isValid = this.compareSignatures(processedSignature, expectedSignature);
109
+ if (!isValid) {
110
+ this.recordFailedAttempt(clientId);
111
+ this.logSecurityEvent("warning", "Invalid signature attempt", {
112
+ clientId,
113
+ signatureLength: signature.length,
114
+ });
115
+ return this.blockRequest(res, "INVALID_SIGNATURE", `Header '${this.HEADER_NAME}' value does not match expected signature`, clientId);
116
+ }
117
+ // Signature is valid - clear any failed attempts
118
+ this.clearFailedAttempts(clientId);
119
+ if (this.config.debug) {
120
+ this.logger.debug("security", "XyRS signature validation passed");
121
+ }
122
+ next();
123
+ }
124
+ /**
125
+ * Extract client identifier for rate limiting (IP-based)
126
+ */
127
+ extractClientIdentifier(req) {
128
+ // Try multiple methods to get real IP
129
+ const ip = req.ip ||
130
+ req.headers["x-forwarded-for"]?.split(",")[0]?.trim() ||
131
+ req.headers["x-real-ip"] ||
132
+ req.connection?.remoteAddress ||
133
+ req.socket?.remoteAddress ||
134
+ "unknown";
135
+ return this.sanitizeClientId(ip);
136
+ }
137
+ /**
138
+ * Sanitize client identifier
139
+ */
140
+ sanitizeClientId(clientId) {
141
+ // Remove IPv6 prefix if present
142
+ let sanitized = clientId.replace(/^::ffff:/, "");
143
+ // Keep only alphanumeric, dots, colons, and hyphens
144
+ sanitized = sanitized.replace(/[^a-zA-Z0-9.:_-]/g, "");
145
+ return sanitized || "unknown";
146
+ }
147
+ /**
148
+ * Strictly extract signature header with no fallbacks
149
+ */
150
+ extractSignatureHeader(req) {
151
+ if (!req.headers || typeof req.headers !== "object") {
152
+ return null;
153
+ }
154
+ // Only check lowercase version (standard HTTP header convention)
155
+ const headerKey = this.HEADER_NAME.toLowerCase();
156
+ const signature = req.headers[headerKey];
157
+ // Strict type checking
158
+ if (typeof signature !== "string") {
159
+ return null;
160
+ }
161
+ // Reject empty or whitespace-only headers
162
+ if (signature.length === 0 || /^\s*$/.test(signature)) {
163
+ return null;
164
+ }
165
+ return signature;
166
+ }
167
+ /**
168
+ * Validate header length to prevent DoS attacks
169
+ */
170
+ validateHeaderLength(signature) {
171
+ return (signature.length > 0 &&
172
+ signature.length <= (this.config.maxHeaderLength || 512));
173
+ }
174
+ /**
175
+ * Detect suspicious patterns in header value
176
+ */
177
+ containsSuspiciousPatterns(signature) {
178
+ // Check for common attack patterns
179
+ const suspiciousPatterns = [
180
+ /[<>\"'`]/g, // HTML/Script injection characters
181
+ /\.\./g, // Path traversal
182
+ /[\x00-\x08\x0B\x0C\x0E-\x1F]/g, // Control characters
183
+ /\${.*}/g, // Template injection
184
+ /\|\||&&/g, // Command injection
185
+ /(\r\n|\n|\r)/g, // CRLF injection
186
+ ];
187
+ return suspiciousPatterns.some((pattern) => pattern.test(signature));
188
+ }
189
+ /**
190
+ * Process signature value based on configuration
191
+ */
192
+ processSignatureValue(value) {
193
+ return this.config.trimValue ? value.trim() : value;
194
+ }
195
+ /**
196
+ * Compare signatures with optional timing-safe comparison
197
+ */
198
+ compareSignatures(received, expected) {
199
+ // Always check lengths first (fast rejection)
200
+ if (received.length !== expected.length) {
201
+ return false;
202
+ }
203
+ if (this.config.timingSafeComparison) {
204
+ return this.timingSafeEqual(received, expected);
205
+ }
206
+ // Standard comparison
207
+ return this.config.caseSensitive
208
+ ? received === expected
209
+ : received.toLowerCase() === expected.toLowerCase();
210
+ }
211
+ /**
212
+ * Timing-safe string comparison to prevent timing attacks
213
+ */
214
+ timingSafeEqual(a, b) {
215
+ // Convert to buffers for timing-safe comparison
216
+ const bufA = Buffer.from(this.config.caseSensitive ? a : a.toLowerCase());
217
+ const bufB = Buffer.from(this.config.caseSensitive ? b : b.toLowerCase());
218
+ if (bufA.length !== bufB.length) {
219
+ return false;
220
+ }
221
+ try {
222
+ return crypto__namespace.timingSafeEqual(bufA, bufB);
223
+ }
224
+ catch {
225
+ return false;
226
+ }
227
+ }
228
+ /**
229
+ * Check if client is currently blocked due to failed attempts
230
+ */
231
+ isClientBlocked(clientId) {
232
+ const attempt = this.failedAttempts.get(clientId);
233
+ if (!attempt || !attempt.blockedUntil) {
234
+ return false;
235
+ }
236
+ const now = Date.now();
237
+ if (now >= attempt.blockedUntil) {
238
+ // Block period expired
239
+ this.failedAttempts.delete(clientId);
240
+ return false;
241
+ }
242
+ return true;
243
+ }
244
+ /**
245
+ * Record failed authentication attempt
246
+ */
247
+ recordFailedAttempt(clientId) {
248
+ const now = Date.now();
249
+ const attempt = this.failedAttempts.get(clientId) || {
250
+ count: 0,
251
+ blockedUntil: null,
252
+ lastAttempt: now,
253
+ };
254
+ attempt.count += 1;
255
+ attempt.lastAttempt = now;
256
+ // Block if threshold exceeded
257
+ if (attempt.count >= (this.config.maxFailedAttempts || 5)) {
258
+ attempt.blockedUntil = now + (this.config.blockDuration || 900000);
259
+ this.logSecurityEvent("warning", "Client blocked due to failed attempts", {
260
+ clientId,
261
+ attempts: attempt.count,
262
+ blockedUntil: new Date(attempt.blockedUntil).toISOString(),
263
+ });
264
+ }
265
+ this.failedAttempts.set(clientId, attempt);
266
+ }
267
+ /**
268
+ * Clear failed attempts for a client
269
+ */
270
+ clearFailedAttempts(clientId) {
271
+ this.failedAttempts.delete(clientId);
272
+ }
273
+ /**
274
+ * Validate secret meets security requirements
275
+ */
276
+ validateSecret(secret, minLength) {
277
+ const minLen = minLength || 32;
278
+ if (!secret || typeof secret !== "string") {
279
+ throw new Error("RequestSignatureProtector: secret is required and must be a string");
280
+ }
281
+ const trimmedSecret = secret.trim();
282
+ if (trimmedSecret.length === 0) {
283
+ throw new Error("RequestSignatureProtector: secret cannot be empty or whitespace-only");
284
+ }
285
+ if (trimmedSecret.length < minLen) {
286
+ throw new Error(`RequestSignatureProtector: secret must be at least ${minLen} characters long (current: ${trimmedSecret.length})`);
287
+ }
288
+ // Check for weak secrets
289
+ if (this.isWeakSecret(trimmedSecret)) {
290
+ throw new Error("RequestSignatureProtector: secret appears to be weak. Use a cryptographically strong random value.");
291
+ }
292
+ }
293
+ /**
294
+ * Detect weak/predictable secrets
295
+ */
296
+ isWeakSecret(secret) {
297
+ const weakPatterns = [
298
+ /^[0-9]+$/, // Only numbers
299
+ /^[a-zA-Z]+$/, // Only letters
300
+ /^(.)\1+$/, // Repeated character
301
+ /^(123|abc|password|secret|key|test|demo|admin)/i, // Common words
302
+ /^[a-f0-9]{32}$/i, // Looks like MD5 (weak)
303
+ ];
304
+ return weakPatterns.some((pattern) => pattern.test(secret));
305
+ }
306
+ /**
307
+ * Hash secret for internal verification
308
+ */
309
+ hashSecret(secret) {
310
+ return crypto__namespace.createHash("sha256").update(secret).digest("hex");
311
+ }
312
+ /**
313
+ * Start cleanup timer for failed attempts
314
+ */
315
+ startCleanupTimer() {
316
+ this.cleanupTimer = setInterval(() => {
317
+ this.cleanupExpiredAttempts();
318
+ }, this.CLEANUP_INTERVAL);
319
+ // Don't keep process alive for cleanup
320
+ if (this.cleanupTimer.unref) {
321
+ this.cleanupTimer.unref();
322
+ }
323
+ }
324
+ /**
325
+ * Clean up expired failed attempt records
326
+ */
327
+ cleanupExpiredAttempts() {
328
+ const now = Date.now();
329
+ const expiredClients = [];
330
+ for (const [clientId, attempt] of this.failedAttempts.entries()) {
331
+ // Remove if block expired and no recent attempts
332
+ if (attempt.blockedUntil &&
333
+ now >= attempt.blockedUntil &&
334
+ now - attempt.lastAttempt > this.CLEANUP_INTERVAL) {
335
+ expiredClients.push(clientId);
336
+ }
337
+ }
338
+ expiredClients.forEach((clientId) => this.failedAttempts.delete(clientId));
339
+ }
340
+ /**
341
+ * Block the request with appropriate error response
342
+ */
343
+ blockRequest(res, code, details, clientId) {
344
+ const isDevelopment = this.config.debug;
345
+ const response = {
346
+ error: isDevelopment
347
+ ? this.config.errorMessage
348
+ : "Authentication required",
349
+ timestamp: new Date().toISOString(),
350
+ code: "NEHONIX_XYRS_001",
351
+ };
352
+ // Add detailed info only in debug mode
353
+ if (isDevelopment) {
354
+ response.xyrs = {
355
+ module: "RequestSignature",
356
+ code,
357
+ details,
358
+ requiredHeader: this.HEADER_NAME,
359
+ hint: "Include the X-XyRS header with your configured secret value",
360
+ };
361
+ }
362
+ if (this.config.debug && clientId) {
363
+ this.logger.debug("security", "XyRS blocking request", {
364
+ code,
365
+ details,
366
+ clientId,
367
+ requiredHeader: this.HEADER_NAME,
368
+ });
369
+ }
370
+ res.status(this.config.statusCode).json(response);
371
+ }
372
+ /**
373
+ * Log security events
374
+ */
375
+ logSecurityEvent(level, message, metadata) {
376
+ if (this.config.debug) {
377
+ const logMethod = level === "error"
378
+ ? "error"
379
+ : level === "warning"
380
+ ? "warn"
381
+ : "debug";
382
+ this.logger[logMethod]("security", message, metadata);
383
+ }
384
+ }
385
+ /**
386
+ * Update configuration with strict validation
387
+ */
388
+ updateConfig(newConfig) {
389
+ if (newConfig.secret !== undefined) {
390
+ this.validateSecret(newConfig.secret, newConfig.minSecretLength);
391
+ }
392
+ this.config = { ...this.config, ...newConfig };
393
+ }
394
+ /**
395
+ * Get current configuration (without exposing the secret)
396
+ */
397
+ getConfig() {
398
+ return {
399
+ errorMessage: this.config.errorMessage,
400
+ statusCode: this.config.statusCode,
401
+ debug: this.config.debug,
402
+ caseSensitive: this.config.caseSensitive,
403
+ trimValue: this.config.trimValue,
404
+ hasSecret: !!this.config.secret,
405
+ maxHeaderLength: this.config.maxHeaderLength,
406
+ maxFailedAttempts: this.config.maxFailedAttempts,
407
+ blockDuration: this.config.blockDuration,
408
+ minSecretLength: this.config.minSecretLength,
409
+ timingSafeComparison: this.config.timingSafeComparison,
410
+ rejectSuspiciousPatterns: this.config.rejectSuspiciousPatterns,
411
+ };
412
+ }
413
+ /**
414
+ * Get the header name used for signatures
415
+ */
416
+ getHeaderName() {
417
+ return this.HEADER_NAME;
418
+ }
419
+ /**
420
+ * Validate if a signature would be accepted (for testing)
421
+ */
422
+ validateSignature(signature) {
423
+ if (!signature || typeof signature !== "string") {
424
+ return false;
425
+ }
426
+ if (!this.validateHeaderLength(signature)) {
427
+ return false;
428
+ }
429
+ if (this.config.rejectSuspiciousPatterns &&
430
+ this.containsSuspiciousPatterns(signature)) {
431
+ return false;
432
+ }
433
+ const processedSignature = this.processSignatureValue(signature);
434
+ const expectedSignature = this.processSignatureValue(this.config.secret);
435
+ return this.compareSignatures(processedSignature, expectedSignature);
436
+ }
437
+ /**
438
+ * Get statistics about failed attempts (for monitoring)
439
+ */
440
+ getSecurityStats() {
441
+ const now = Date.now();
442
+ let blockedCount = 0;
443
+ for (const attempt of this.failedAttempts.values()) {
444
+ if (attempt.blockedUntil && now < attempt.blockedUntil) {
445
+ blockedCount++;
446
+ }
447
+ }
448
+ return {
449
+ trackedClients: this.failedAttempts.size,
450
+ blockedClients: blockedCount,
451
+ };
452
+ }
453
+ /**
454
+ * Cleanup resources
455
+ */
456
+ destroy() {
457
+ if (this.cleanupTimer) {
458
+ clearInterval(this.cleanupTimer);
459
+ }
460
+ this.failedAttempts.clear();
461
+ }
462
+ }
463
+
464
+ exports.RequestSignatureProtector = RequestSignatureProtector;
465
+ //# sourceMappingURL=RequestSignatureProtector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestSignatureProtector.js","sources":["../../../../../../src/middleware/built-in/security/RequestSignatureProtector.ts"],"sourcesContent":[null],"names":["Logger","crypto"],"mappings":"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"}