xypriss 2.3.6 → 3.0.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 (32) 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 +51 -2
  6. package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js.map +1 -1
  7. package/dist/cjs/src/middleware/built-in/security/BrowserOnlyProtector.js +550 -0
  8. package/dist/cjs/src/middleware/built-in/security/BrowserOnlyProtector.js.map +1 -0
  9. package/dist/cjs/src/middleware/built-in/security/TerminalOnlyProtector.js +477 -0
  10. package/dist/cjs/src/middleware/built-in/security/TerminalOnlyProtector.js.map +1 -0
  11. package/dist/cjs/src/middleware/security-middleware.js +238 -81
  12. package/dist/cjs/src/middleware/security-middleware.js.map +1 -1
  13. package/dist/cjs/src/server/components/fastapi/templates/redirectTemp.js +1 -1
  14. package/dist/cjs/src/server/const/default.js +1 -1
  15. package/dist/cjs/src/server/const/default.js.map +1 -1
  16. package/dist/esm/mods/security/src/index.js +1 -1
  17. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js +2 -2
  18. package/dist/esm/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
  19. package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js +51 -2
  20. package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js.map +1 -1
  21. package/dist/esm/src/middleware/built-in/security/BrowserOnlyProtector.js +548 -0
  22. package/dist/esm/src/middleware/built-in/security/BrowserOnlyProtector.js.map +1 -0
  23. package/dist/esm/src/middleware/built-in/security/TerminalOnlyProtector.js +475 -0
  24. package/dist/esm/src/middleware/built-in/security/TerminalOnlyProtector.js.map +1 -0
  25. package/dist/esm/src/middleware/security-middleware.js +238 -81
  26. package/dist/esm/src/middleware/security-middleware.js.map +1 -1
  27. package/dist/esm/src/server/components/fastapi/templates/redirectTemp.js +1 -1
  28. package/dist/esm/src/server/const/default.js +1 -1
  29. package/dist/esm/src/server/const/default.js.map +1 -1
  30. package/dist/index.d.ts +187 -6
  31. package/package.json +6 -5
  32. package/scripts/install-memory-cli.js +1 -1
@@ -0,0 +1,477 @@
1
+ 'use strict';
2
+
3
+ var Logger = require('../../../../shared/logger/Logger.js');
4
+
5
+ /**
6
+ * Terminal-Only Protector - Enhanced Version
7
+ * Aggressively blocks browser requests while allowing terminal/API tools
8
+ * Perfect for API-only endpoints or development tools
9
+ */
10
+ class TerminalOnlyProtector {
11
+ constructor(options = {}, logger) {
12
+ // Known legitimate API tools and their patterns
13
+ this.KNOWN_API_TOOLS = [
14
+ "curl",
15
+ "wget",
16
+ "httpie",
17
+ "postman",
18
+ "insomnia",
19
+ "axios",
20
+ "fetch",
21
+ "node-fetch",
22
+ "got",
23
+ "superagent",
24
+ "python-requests",
25
+ "python-urllib",
26
+ "java/",
27
+ "okhttp",
28
+ "rest-client",
29
+ "paw",
30
+ "thunder client",
31
+ "advanced rest client",
32
+ "go-http-client",
33
+ "ruby",
34
+ "perl",
35
+ "php",
36
+ "dart",
37
+ "kotlin",
38
+ "swift",
39
+ "apache-httpclient",
40
+ "jetty",
41
+ "k6/",
42
+ "jmeter",
43
+ "gatling",
44
+ "artillery",
45
+ ];
46
+ // Browser engine signatures (highly specific to avoid false positives)
47
+ this.BROWSER_ENGINES = [
48
+ "gecko/",
49
+ "applewebkit/",
50
+ "webkit/",
51
+ "blink/",
52
+ "trident/",
53
+ "edgehtml/",
54
+ ];
55
+ // Known browser names (specific versions to avoid false positives)
56
+ this.BROWSER_NAMES = [
57
+ "firefox/",
58
+ "chrome/",
59
+ "safari/",
60
+ "edge/",
61
+ "opera/",
62
+ "chromium/",
63
+ "brave/",
64
+ "vivaldi/",
65
+ "seamonkey/",
66
+ "palemoon/",
67
+ ];
68
+ this.config = {
69
+ blockSecFetch: true,
70
+ allowedTools: [],
71
+ blockBrowserIndicators: true,
72
+ requireSimpleAccept: false,
73
+ errorMessage: "Terminal/API access required. Browser access blocked.",
74
+ statusCode: 403,
75
+ debug: false,
76
+ strictness: "normal",
77
+ enableFingerprinting: true,
78
+ minConfidenceScore: 70,
79
+ ...options,
80
+ };
81
+ if (options.customValidator !== undefined) {
82
+ this.config.customValidator = options.customValidator;
83
+ }
84
+ this.logger =
85
+ logger ||
86
+ new Logger.Logger({
87
+ enabled: true,
88
+ level: "debug",
89
+ components: { security: true },
90
+ types: { debug: true },
91
+ });
92
+ }
93
+ /**
94
+ * Get the terminal-only middleware function
95
+ */
96
+ getMiddleware() {
97
+ return (req, res, next) => {
98
+ this.handleRequest(req, res, next);
99
+ };
100
+ }
101
+ /**
102
+ * Handle incoming request and determine if it's from a terminal/API tool
103
+ */
104
+ handleRequest(req, res, next) {
105
+ this.logger.debug("security", "TermOn middleware called for request");
106
+ if (this.config.debug) {
107
+ this.logRequestDetails(req);
108
+ }
109
+ // Custom validator takes precedence
110
+ if (this.config.customValidator &&
111
+ typeof this.config.customValidator === "function") {
112
+ if (!this.config.customValidator(req)) {
113
+ return this.blockRequest(res, "TERMINAL_ONLY", "Custom validator failed");
114
+ }
115
+ return next();
116
+ }
117
+ // Check whitelist first if configured
118
+ if (this.config.allowedTools && this.config.allowedTools.length > 0) {
119
+ if (!this.isAllowedTool(req)) {
120
+ return this.blockRequest(res, "TOOL_NOT_ALLOWED", `Tool not in allowed list. Allowed tools: ${this.config.allowedTools.join(", ")}`);
121
+ }
122
+ }
123
+ // Run comprehensive detection
124
+ const detection = this.detectRequestType(req);
125
+ if (this.config.debug) {
126
+ this.logger.debug("security", "Detection result", {
127
+ isBrowser: detection.isBrowser,
128
+ confidence: detection.confidence,
129
+ reasons: detection.reasons,
130
+ indicators: detection.indicators,
131
+ });
132
+ }
133
+ // Block if detected as browser with sufficient confidence
134
+ if (detection.isBrowser &&
135
+ detection.confidence >= this.config.minConfidenceScore) {
136
+ return this.blockRequest(res, "BROWSER_DETECTED", `Browser detected with ${detection.confidence}% confidence: ${detection.reasons.join(", ")}`);
137
+ }
138
+ // If we get here, it's likely a terminal/API request - allow it
139
+ next();
140
+ }
141
+ /**
142
+ * Comprehensive browser detection with confidence scoring
143
+ */
144
+ detectRequestType(req) {
145
+ const result = {
146
+ isBrowser: false,
147
+ confidence: 0,
148
+ reasons: [],
149
+ indicators: [],
150
+ };
151
+ let score = 0;
152
+ const maxScore = this.calculateMaxScore();
153
+ // 1. Sec-Fetch headers (browsers only, very reliable - 30 points)
154
+ if (this.config.blockSecFetch && this.hasSecFetchHeaders(req)) {
155
+ score += 30;
156
+ result.reasons.push("Sec-Fetch headers present");
157
+ result.indicators.push("sec-fetch");
158
+ }
159
+ // 2. Browser engine detection (very reliable - 25 points)
160
+ const engineDetection = this.detectBrowserEngine(req);
161
+ if (engineDetection.detected) {
162
+ score += 25;
163
+ result.reasons.push(`Browser engine: ${engineDetection.engine}`);
164
+ result.indicators.push("browser-engine");
165
+ }
166
+ // 3. Browser name detection (reliable - 20 points)
167
+ const browserDetection = this.detectBrowserName(req);
168
+ if (browserDetection.detected) {
169
+ score += 20;
170
+ result.reasons.push(`Browser: ${browserDetection.name}`);
171
+ result.indicators.push("browser-name");
172
+ }
173
+ // 4. Complex Accept header (moderately reliable - 15 points)
174
+ if (this.hasComplexAcceptHeader(req)) {
175
+ score += 15;
176
+ result.reasons.push("Complex Accept header");
177
+ result.indicators.push("complex-accept");
178
+ }
179
+ // 5. Origin/Referer headers (reliable - 20 points)
180
+ if (this.hasNavigationHeaders(req)) {
181
+ score += 20;
182
+ result.reasons.push("Navigation headers present");
183
+ result.indicators.push("navigation-headers");
184
+ }
185
+ // 6. Accept-Language patterns (moderately reliable - 15 points)
186
+ if (this.hasBrowserLanguagePattern(req)) {
187
+ score += 15;
188
+ result.reasons.push("Browser-style language preferences");
189
+ result.indicators.push("accept-language");
190
+ }
191
+ // 7. Cache control patterns (moderately reliable - 10 points)
192
+ if (this.hasBrowserCachePattern(req)) {
193
+ score += 10;
194
+ result.reasons.push("Browser cache patterns");
195
+ result.indicators.push("cache-control");
196
+ }
197
+ // 8. Connection header patterns (less reliable - 10 points)
198
+ if (this.hasBrowserConnectionPattern(req)) {
199
+ score += 10;
200
+ result.reasons.push("Browser connection patterns");
201
+ result.indicators.push("connection");
202
+ }
203
+ // 9. DNT (Do Not Track) header (browsers only - 10 points)
204
+ if (this.hasDNTHeader(req)) {
205
+ score += 10;
206
+ result.reasons.push("DNT header present");
207
+ result.indicators.push("dnt");
208
+ }
209
+ // 10. Upgrade-Insecure-Requests (browsers only - 10 points)
210
+ if (this.hasUpgradeInsecureRequests(req)) {
211
+ score += 10;
212
+ result.reasons.push("Upgrade-Insecure-Requests header");
213
+ result.indicators.push("upgrade-insecure");
214
+ }
215
+ // 11. Accept-Encoding patterns (less reliable - 5 points)
216
+ if (this.hasBrowserEncodingPattern(req)) {
217
+ score += 5;
218
+ result.reasons.push("Browser encoding patterns");
219
+ result.indicators.push("accept-encoding");
220
+ }
221
+ // 12. Check for known API tools (negative scoring - reduces confidence)
222
+ if (this.isKnownAPITool(req)) {
223
+ score = Math.max(0, score - 40); // Reduce score significantly
224
+ result.reasons.push("Known API tool detected");
225
+ result.indicators.push("api-tool");
226
+ }
227
+ // 13. Allowed tools whitelist check
228
+ if (this.config.allowedTools && this.config.allowedTools.length > 0) {
229
+ if (!this.isAllowedTool(req)) {
230
+ score += 10;
231
+ result.reasons.push("Tool not in whitelist");
232
+ result.indicators.push("not-whitelisted");
233
+ }
234
+ else {
235
+ score = Math.max(0, score - 30);
236
+ result.reasons.push("Tool in whitelist");
237
+ result.indicators.push("whitelisted");
238
+ }
239
+ }
240
+ // Calculate confidence percentage
241
+ result.confidence = Math.round((score / maxScore) * 100);
242
+ result.isBrowser = result.confidence >= this.config.minConfidenceScore;
243
+ // Apply strictness modifiers
244
+ if (this.config.strictness === "high" && result.confidence >= 50) {
245
+ result.isBrowser = true;
246
+ }
247
+ else if (this.config.strictness === "paranoid" &&
248
+ result.confidence >= 30) {
249
+ result.isBrowser = true;
250
+ }
251
+ return result;
252
+ }
253
+ /**
254
+ * Calculate maximum possible score based on configuration
255
+ */
256
+ calculateMaxScore() {
257
+ return 180; // Sum of all positive scoring checks
258
+ }
259
+ /**
260
+ * Check for Sec-Fetch headers (browsers only)
261
+ */
262
+ hasSecFetchHeaders(req) {
263
+ return !!(req.headers["sec-fetch-dest"] ||
264
+ req.headers["sec-fetch-mode"] ||
265
+ req.headers["sec-fetch-site"] ||
266
+ req.headers["sec-fetch-user"]);
267
+ }
268
+ /**
269
+ * Detect browser engine with high specificity
270
+ */
271
+ detectBrowserEngine(req) {
272
+ const userAgent = (req.headers["user-agent"] || "").toLowerCase();
273
+ for (const engine of this.BROWSER_ENGINES) {
274
+ if (userAgent.includes(engine)) {
275
+ return { detected: true, engine };
276
+ }
277
+ }
278
+ return { detected: false, engine: "" };
279
+ }
280
+ /**
281
+ * Detect browser name with version specificity
282
+ */
283
+ detectBrowserName(req) {
284
+ const userAgent = (req.headers["user-agent"] || "").toLowerCase();
285
+ for (const browser of this.BROWSER_NAMES) {
286
+ if (userAgent.includes(browser)) {
287
+ return { detected: true, name: browser };
288
+ }
289
+ }
290
+ return { detected: false, name: "" };
291
+ }
292
+ /**
293
+ * Check for complex Accept header (browsers send detailed MIME types)
294
+ */
295
+ hasComplexAcceptHeader(req) {
296
+ const accept = req.headers["accept"] || "";
297
+ // Browsers typically send text/html with high priority
298
+ if (accept.includes("text/html") && accept.includes("q=")) {
299
+ return true;
300
+ }
301
+ // Multiple MIME types with quality values
302
+ const parts = accept.split(",");
303
+ if (parts.length >= 4) {
304
+ return true;
305
+ }
306
+ // Check for browser-specific MIME type combinations
307
+ if (accept.includes("application/xhtml+xml") ||
308
+ accept.includes("application/xml;q=") ||
309
+ accept.includes("image/webp") ||
310
+ accept.includes("image/apng")) {
311
+ return true;
312
+ }
313
+ return false;
314
+ }
315
+ /**
316
+ * Check for navigation headers (Origin/Referer)
317
+ */
318
+ hasNavigationHeaders(req) {
319
+ return !!(req.headers["origin"] || req.headers["referer"]);
320
+ }
321
+ /**
322
+ * Check for browser-style language patterns
323
+ */
324
+ hasBrowserLanguagePattern(req) {
325
+ const acceptLanguage = req.headers["accept-language"];
326
+ if (!acceptLanguage) {
327
+ return false;
328
+ }
329
+ // Browsers send multiple languages with quality values
330
+ if (acceptLanguage.includes("q=") &&
331
+ acceptLanguage.split(",").length >= 2) {
332
+ return true;
333
+ }
334
+ // Check for region-specific language codes (e.g., en-US, fr-FR)
335
+ if (/[a-z]{2}-[A-Z]{2}/.test(acceptLanguage)) {
336
+ return true;
337
+ }
338
+ return false;
339
+ }
340
+ /**
341
+ * Check for browser cache control patterns
342
+ */
343
+ hasBrowserCachePattern(req) {
344
+ const cacheControl = req.headers["cache-control"];
345
+ const pragma = req.headers["pragma"];
346
+ // Browsers often send max-age=0 or no-cache
347
+ if (cacheControl &&
348
+ (cacheControl.includes("max-age=0") || cacheControl === "no-cache")) {
349
+ return true;
350
+ }
351
+ // Pragma: no-cache is browser behavior
352
+ if (pragma === "no-cache") {
353
+ return true;
354
+ }
355
+ return false;
356
+ }
357
+ /**
358
+ * Check for browser connection patterns
359
+ */
360
+ hasBrowserConnectionPattern(req) {
361
+ const connection = (req.headers["connection"] || "").toLowerCase();
362
+ // Browsers typically use keep-alive
363
+ return connection === "keep-alive";
364
+ }
365
+ /**
366
+ * Check for DNT (Do Not Track) header
367
+ */
368
+ hasDNTHeader(req) {
369
+ return !!req.headers["dnt"];
370
+ }
371
+ /**
372
+ * Check for Upgrade-Insecure-Requests header
373
+ */
374
+ hasUpgradeInsecureRequests(req) {
375
+ return req.headers["upgrade-insecure-requests"] === "1";
376
+ }
377
+ /**
378
+ * Check for browser encoding patterns
379
+ */
380
+ hasBrowserEncodingPattern(req) {
381
+ const encoding = req.headers["accept-encoding"] || "";
382
+ // Browsers typically support multiple encodings including br (Brotli)
383
+ if (encoding.includes("br") || encoding.split(",").length >= 3) {
384
+ return true;
385
+ }
386
+ return false;
387
+ }
388
+ /**
389
+ * Check if request is from a known API tool
390
+ */
391
+ isKnownAPITool(req) {
392
+ const userAgent = (req.headers["user-agent"] || "").toLowerCase();
393
+ return this.KNOWN_API_TOOLS.some((tool) => userAgent.includes(tool));
394
+ }
395
+ /**
396
+ * Check if request has browser indicators (legacy method, now uses comprehensive detection)
397
+ */
398
+ hasBrowserIndicators(req) {
399
+ const detection = this.detectRequestType(req);
400
+ return detection.isBrowser;
401
+ }
402
+ /**
403
+ * Check if the tool is in the allowed list
404
+ */
405
+ isAllowedTool(req) {
406
+ const userAgent = (req.headers["user-agent"] || "").toLowerCase();
407
+ return this.config.allowedTools.some((allowedTool) => {
408
+ const pattern = new RegExp(allowedTool.toLowerCase().replace(/\*/g, ".*"), "i");
409
+ return pattern.test(userAgent);
410
+ });
411
+ }
412
+ /**
413
+ * Check if Accept header is simple (typical of API tools)
414
+ */
415
+ hasSimpleAccept(req) {
416
+ const accept = req.headers["accept"] || "";
417
+ return (accept === "*/*" ||
418
+ accept === "application/json" ||
419
+ accept === "text/plain" ||
420
+ accept.split(",").length <= 2);
421
+ }
422
+ /**
423
+ * Log detailed request information for debugging
424
+ */
425
+ logRequestDetails(req) {
426
+ this.logger.debug("security", "TermOn analyzing request", {
427
+ secFetchDest: req.headers["sec-fetch-dest"],
428
+ secFetchMode: req.headers["sec-fetch-mode"],
429
+ accept: req.headers["accept"]?.substring(0, 150),
430
+ acceptLanguage: req.headers["accept-language"],
431
+ acceptEncoding: req.headers["accept-encoding"],
432
+ origin: req.headers["origin"],
433
+ });
434
+ }
435
+ /**
436
+ * Block the request with appropriate error response
437
+ */
438
+ blockRequest(res, code, details) {
439
+ const isDevelopment = this.config.debug;
440
+ const response = {
441
+ error: isDevelopment ? this.config.errorMessage : "Access denied",
442
+ timestamp: new Date().toISOString(),
443
+ code: "NEHONIXYPTERM01",
444
+ };
445
+ if (isDevelopment) {
446
+ response.xypriss = {
447
+ module: "TerminalOnly",
448
+ code,
449
+ details,
450
+ userAgent: res.req?.headers["user-agent"]?.substring(0, 100),
451
+ };
452
+ }
453
+ if (this.config.debug) {
454
+ this.logger.debug("security", "TerminalOnly blocking request", {
455
+ code,
456
+ details,
457
+ userAgent: res.req?.headers["user-agent"]?.substring(0, 100),
458
+ });
459
+ }
460
+ res.status(this.config.statusCode).json(response);
461
+ }
462
+ /**
463
+ * Update configuration
464
+ */
465
+ updateConfig(newConfig) {
466
+ this.config = { ...this.config, ...newConfig };
467
+ }
468
+ /**
469
+ * Get current configuration
470
+ */
471
+ getConfig() {
472
+ return { ...this.config };
473
+ }
474
+ }
475
+
476
+ exports.TerminalOnlyProtector = TerminalOnlyProtector;
477
+ //# sourceMappingURL=TerminalOnlyProtector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalOnlyProtector.js","sources":["../../../../../../src/middleware/built-in/security/TerminalOnlyProtector.ts"],"sourcesContent":[null],"names":["Logger"],"mappings":"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"}