xypriss 3.1.0 → 3.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.
@@ -0,0 +1,502 @@
1
+ import { Logger } from '../../../../shared/logger/Logger.js';
2
+
3
+ /**
4
+ * Mobile-Only Access Protector
5
+ * Blocks browser requests and allows only mobile app access.
6
+ * Multi-layered detection with strict validation to avoid false positives.
7
+ *
8
+ * @example Enable with defaults:
9
+ * ```typescript
10
+ * mobileOnly: true
11
+ * ```
12
+ *
13
+ * @example Custom configuration:
14
+ * ```typescript
15
+ * mobileOnly: {
16
+ * blockBrowserIndicators: true,
17
+ * allowedPlatforms: ['ios', 'android'],
18
+ * requireMobileHeaders: true,
19
+ * customUserAgentPatterns: [/MyApp/i],
20
+ * errorMessage: "Mobile app access required"
21
+ * }
22
+ * ```
23
+ */
24
+ class MobileOnlyProtector {
25
+ constructor(config = {}, logger) {
26
+ // Mobile platform indicators
27
+ this.mobilePatterns = [
28
+ /\bAndroid\b/i,
29
+ /\biPhone\b/i,
30
+ /\biPad\b/i,
31
+ /\biPod\b/i,
32
+ /\bBlackBerry\b/i,
33
+ /\bWindows Phone\b/i,
34
+ /\bReactNative\b/i,
35
+ /\bExpo\b/i,
36
+ /\bDalvik\b/i, // Android runtime
37
+ ];
38
+ // Android HTTP clients
39
+ this.androidHttpClients = [
40
+ /\bokhttp\b/i, // OkHttp
41
+ /\bretrofit\b/i, // Retrofit
42
+ /\bktor-client\b/i, // Ktor Client
43
+ /\bktor\b/i, // Ktor (short form)
44
+ /\bvolley\b/i, // Volley
45
+ /\bHttpUrlConnection\b/i, // HttpUrlConnection
46
+ /\bAndroidHttpClient\b/i, // Generic Android HTTP
47
+ ];
48
+ // iOS HTTP clients
49
+ this.iosHttpClients = [
50
+ /\bAlamofire\b/i, // Alamofire
51
+ /\bAFNetworking\b/i, // AFNetworking
52
+ /\bCFNetwork\b/i, // CFNetwork (iOS networking framework)
53
+ /\bURLSession\b/i, // URLSession
54
+ /\bNSURLSession\b/i, // NSURLSession (Objective-C)
55
+ /\bMoya\b/i, // Moya
56
+ /\bSiesta\b/i, // Siesta
57
+ ];
58
+ // Cross-platform mobile frameworks
59
+ this.mobileFameworks = [
60
+ /\bFlutter\b/i,
61
+ /\bDart\b/i, // Dart (Flutter's language)
62
+ /\bReact Native\b/i,
63
+ /\bReactNative\b/i,
64
+ /\bExpo\b/i,
65
+ /\bCapacitor\b/i, // Ionic Capacitor
66
+ /\bCordova\b/i, // Apache Cordova
67
+ /\bIonic\b/i, // Ionic Framework
68
+ /\bXamarin\b/i, // Xamarin
69
+ ];
70
+ // Comprehensive browser indicators (aggressive detection)
71
+ this.browserIndicators = [
72
+ /\bMozilla\b/i,
73
+ /\bChrome\b/i,
74
+ /\bChromium\b/i,
75
+ /\bSafari\b/i,
76
+ /\bFirefox\b/i,
77
+ /\bEdge\b/i,
78
+ /\bEdg\b/i,
79
+ /\bOpera\b/i,
80
+ /\bOPR\b/i,
81
+ /\bBrave\b/i,
82
+ /\bVivaldi\b/i,
83
+ /\bSeaMonkey\b/i,
84
+ /\bIceweasel\b/i,
85
+ /\bEpiphany\b/i,
86
+ /\bMidori\b/i,
87
+ /\bKonqueror\b/i,
88
+ /\bWebKit\b/i,
89
+ /\bGecko\b/i,
90
+ /\bTrident\b/i,
91
+ /\bPresto\b/i,
92
+ /\bEdgeHTML\b/i,
93
+ /\bNetscape\b/i,
94
+ /\bIE\b/i,
95
+ /\bMSIE\b/i,
96
+ /\brv:11/i, // IE11
97
+ /\bElectron\b/i, // Desktop apps
98
+ /\bPhantomJS\b/i, // Headless browser
99
+ /\bHeadlessChrome\b/i,
100
+ ];
101
+ // Known desktop OS indicators
102
+ this.desktopIndicators = [
103
+ /\bWindows NT\b/i,
104
+ /\bMac OS X\b/i,
105
+ /\bMacintosh\b/i,
106
+ /\bLinux x86_64\b/i,
107
+ /\bLinux i686\b/i,
108
+ /\bX11\b/i,
109
+ /\bWin64\b/i,
110
+ /\bWOW64\b/i,
111
+ /\bUbuntu\b/i,
112
+ /\bFedora\b/i,
113
+ /\bDebian\b/i,
114
+ ];
115
+ // Suspicious patterns often used in spoofing (excluding legitimate mobile clients)
116
+ this.suspiciousPatterns = [
117
+ /\bcurl\b/i,
118
+ /\bwget\b/i,
119
+ /\bPython\b/i,
120
+ /\bJava(?!Script)\b/i, // Java but not JavaScript
121
+ /\bperl\b/i,
122
+ /\bruby\b/i,
123
+ /\bPostman\b/i,
124
+ /\bInsomnia\b/i,
125
+ /\bHTTPie\b/i,
126
+ /\baxios\b/i,
127
+ /\bnode-fetch\b/i,
128
+ /\bgot\b/i,
129
+ /\bsuperagent\b/i,
130
+ /\brequest\b/i,
131
+ /\bbot\b/i,
132
+ /\bcrawler\b/i,
133
+ /\bspider\b/i,
134
+ /\bscraper\b/i,
135
+ ];
136
+ // Mobile-specific headers that indicate app requests
137
+ this.mobileHeaders = [
138
+ "x-requested-with",
139
+ "x-mobile-app",
140
+ "x-app-platform",
141
+ "x-app-version",
142
+ "expo-version",
143
+ "react-native-version",
144
+ "x-flutter-version",
145
+ "x-ios-bundle-identifier",
146
+ "x-android-package",
147
+ ];
148
+ this.config = {
149
+ enable: config.enable ?? true,
150
+ blockBrowserIndicators: config.blockBrowserIndicators ?? true,
151
+ allowedPlatforms: config.allowedPlatforms ?? [
152
+ "ios",
153
+ "android",
154
+ "react-native",
155
+ "expo",
156
+ ],
157
+ requireMobileHeaders: config.requireMobileHeaders ?? false,
158
+ customUserAgentPatterns: config.customUserAgentPatterns ?? [],
159
+ debug: config.debug ?? false,
160
+ errorMessage: config.errorMessage ??
161
+ "Mobile app access required. Browser requests are not allowed.",
162
+ statusCode: config.statusCode ?? 403,
163
+ caseSensitive: config.caseSensitive ?? false,
164
+ trimUserAgent: config.trimUserAgent ?? true,
165
+ };
166
+ this.logger =
167
+ logger ||
168
+ new Logger({
169
+ components: { security: true },
170
+ types: { debug: true },
171
+ });
172
+ }
173
+ /**
174
+ * Normalize User-Agent string
175
+ */
176
+ normalizeUserAgent(userAgent) {
177
+ if (!userAgent)
178
+ return "";
179
+ let normalized = userAgent;
180
+ if (this.config.trimUserAgent) {
181
+ normalized = normalized.trim();
182
+ }
183
+ // Remove excessive whitespace
184
+ normalized = normalized.replace(/\s+/g, " ");
185
+ return normalized;
186
+ }
187
+ /**
188
+ * Check for Android HTTP client indicators
189
+ */
190
+ hasAndroidHttpClient(userAgent) {
191
+ const flags = this.config.caseSensitive ? "g" : "gi";
192
+ return this.androidHttpClients.some((pattern) => {
193
+ const regex = new RegExp(pattern.source, flags);
194
+ return regex.test(userAgent);
195
+ });
196
+ }
197
+ /**
198
+ * Check for iOS HTTP client indicators
199
+ */
200
+ hasIosHttpClient(userAgent) {
201
+ const flags = this.config.caseSensitive ? "g" : "gi";
202
+ return this.iosHttpClients.some((pattern) => {
203
+ const regex = new RegExp(pattern.source, flags);
204
+ return regex.test(userAgent);
205
+ });
206
+ }
207
+ /**
208
+ * Check for mobile framework indicators
209
+ */
210
+ hasMobileFramework(userAgent) {
211
+ const flags = this.config.caseSensitive ? "g" : "gi";
212
+ return this.mobileFameworks.some((pattern) => {
213
+ const regex = new RegExp(pattern.source, flags);
214
+ return regex.test(userAgent);
215
+ });
216
+ }
217
+ /**
218
+ * Check for browser indicators in User-Agent
219
+ */
220
+ hasBrowserIndicators(userAgent) {
221
+ if (!this.config.blockBrowserIndicators) {
222
+ return false;
223
+ }
224
+ const flags = this.config.caseSensitive ? "g" : "gi";
225
+ return this.browserIndicators.some((pattern) => {
226
+ const regex = new RegExp(pattern.source, flags);
227
+ return regex.test(userAgent);
228
+ });
229
+ }
230
+ /**
231
+ * Check for desktop OS indicators
232
+ */
233
+ hasDesktopIndicators(userAgent) {
234
+ const flags = this.config.caseSensitive ? "g" : "gi";
235
+ return this.desktopIndicators.some((pattern) => {
236
+ const regex = new RegExp(pattern.source, flags);
237
+ return regex.test(userAgent);
238
+ });
239
+ }
240
+ /**
241
+ * Check for suspicious patterns (bots, tools, spoofing attempts)
242
+ */
243
+ hasSuspiciousPatterns(userAgent) {
244
+ const flags = this.config.caseSensitive ? "g" : "gi";
245
+ return this.suspiciousPatterns.some((pattern) => {
246
+ const regex = new RegExp(pattern.source, flags);
247
+ return regex.test(userAgent);
248
+ });
249
+ }
250
+ /**
251
+ * Check if User-Agent matches custom patterns
252
+ */
253
+ matchesCustomPatterns(userAgent) {
254
+ if (this.config.customUserAgentPatterns.length === 0) {
255
+ return false;
256
+ }
257
+ const flags = this.config.caseSensitive ? "g" : "gi";
258
+ for (const pattern of this.config.customUserAgentPatterns) {
259
+ try {
260
+ const regex = new RegExp(pattern.source, flags);
261
+ if (regex.test(userAgent)) {
262
+ if (this.config.debug) {
263
+ this.logger.debug("security", `Custom pattern matched: ${pattern}`);
264
+ }
265
+ return true;
266
+ }
267
+ }
268
+ catch (error) {
269
+ this.logger.warn("security", `Invalid custom pattern: ${pattern}`);
270
+ }
271
+ }
272
+ return false;
273
+ }
274
+ /**
275
+ * Check if User-Agent indicates allowed mobile platform
276
+ */
277
+ hasAllowedPlatform(userAgent) {
278
+ return this.config.allowedPlatforms.some((platform) => {
279
+ switch (platform) {
280
+ case "ios":
281
+ // iOS detection: iOS devices OR iOS HTTP clients (without desktop indicators)
282
+ return ((/\b(iPhone|iPad|iPod)\b/i.test(userAgent) ||
283
+ this.hasIosHttpClient(userAgent)) &&
284
+ !/\b(Macintosh|Mac OS X)\b/i.test(userAgent));
285
+ case "android":
286
+ // Android detection: Android OS OR Android HTTP clients (without desktop emulator)
287
+ return ((/\bAndroid\b/i.test(userAgent) ||
288
+ /\bDalvik\b/i.test(userAgent) ||
289
+ this.hasAndroidHttpClient(userAgent)) &&
290
+ !/\b(X11|Linux x86_64)\b/i.test(userAgent));
291
+ case "react-native":
292
+ return /\b(ReactNative|React Native)\b/i.test(userAgent);
293
+ case "expo":
294
+ return /\bExpo\b/i.test(userAgent);
295
+ case "flutter":
296
+ return /\b(Flutter|Dart)\b/i.test(userAgent);
297
+ default:
298
+ return false;
299
+ }
300
+ });
301
+ }
302
+ /**
303
+ * Check for mobile-specific patterns
304
+ */
305
+ hasMobilePatterns(userAgent) {
306
+ const flags = this.config.caseSensitive ? "g" : "gi";
307
+ return this.mobilePatterns.some((pattern) => {
308
+ const regex = new RegExp(pattern.source, flags);
309
+ return regex.test(userAgent);
310
+ });
311
+ }
312
+ /**
313
+ * Check for mobile-specific headers
314
+ */
315
+ hasMobileHeaders(req) {
316
+ if (!req.headers) {
317
+ return false;
318
+ }
319
+ return this.mobileHeaders.some((header) => {
320
+ const lowerHeader = header.toLowerCase();
321
+ // Check both original case and lowercase
322
+ return req.headers[header] || req.headers[lowerHeader];
323
+ });
324
+ }
325
+ /**
326
+ * Validate User-Agent is not empty or suspicious
327
+ */
328
+ isValidUserAgent(userAgent) {
329
+ if (!userAgent || userAgent.length === 0) {
330
+ if (this.config.debug) {
331
+ this.logger.debug("security", "Empty User-Agent detected");
332
+ }
333
+ return false;
334
+ }
335
+ // Allow shorter User-Agents for mobile HTTP clients (like okhttp/4.12.0)
336
+ if (userAgent.length < 5) {
337
+ if (this.config.debug) {
338
+ this.logger.debug("security", `Suspicious short User-Agent: ${userAgent}`);
339
+ }
340
+ return false;
341
+ }
342
+ // User-Agent with only generic "Mobile" is suspicious
343
+ if (userAgent === "Mobile" || userAgent.toLowerCase() === "mobile") {
344
+ if (this.config.debug) {
345
+ this.logger.debug("security", "Generic 'Mobile' User-Agent detected");
346
+ }
347
+ return false;
348
+ }
349
+ return true;
350
+ }
351
+ /**
352
+ * Perform comprehensive mobile request validation
353
+ */
354
+ validateMobileRequest(req, userAgent) {
355
+ let score = 0;
356
+ let reason = "";
357
+ const reasons = [];
358
+ // Phase 1: Validation checks (disqualifiers)
359
+ if (!this.isValidUserAgent(userAgent)) {
360
+ return { isValid: false, reason: "Invalid User-Agent", score: 0 };
361
+ }
362
+ if (this.hasSuspiciousPatterns(userAgent)) {
363
+ return {
364
+ isValid: false,
365
+ reason: "Suspicious patterns detected",
366
+ score: 0,
367
+ };
368
+ }
369
+ if (this.hasDesktopIndicators(userAgent)) {
370
+ return {
371
+ isValid: false,
372
+ reason: "Desktop OS indicators detected",
373
+ score: 0,
374
+ };
375
+ }
376
+ // Check browser indicators AFTER mobile patterns to avoid false positives
377
+ const hasBrowser = this.hasBrowserIndicators(userAgent);
378
+ const hasMobilePattern = this.hasMobilePatterns(userAgent);
379
+ const hasAndroidClient = this.hasAndroidHttpClient(userAgent);
380
+ const hasIosClient = this.hasIosHttpClient(userAgent);
381
+ const hasMobileFramework = this.hasMobileFramework(userAgent);
382
+ // If blockBrowserIndicators is disabled, browsers are allowed
383
+ if (!this.config.blockBrowserIndicators && hasBrowser) {
384
+ score += 50; // Give browsers a decent score when allowed
385
+ reasons.push("Browser allowed (blockBrowserIndicators disabled)");
386
+ }
387
+ // If it has browser indicators but NO mobile indicators, block it (only when blocking browsers)
388
+ else if (hasBrowser &&
389
+ !hasMobilePattern &&
390
+ !hasAndroidClient &&
391
+ !hasIosClient &&
392
+ !hasMobileFramework) {
393
+ return {
394
+ isValid: false,
395
+ reason: "Browser indicators without mobile patterns",
396
+ score: 0,
397
+ };
398
+ }
399
+ // Phase 2: Positive indicators (qualifiers)
400
+ // Custom patterns have highest priority
401
+ if (this.matchesCustomPatterns(userAgent)) {
402
+ score = 100;
403
+ reason = "Custom pattern match";
404
+ return { isValid: true, reason, score };
405
+ }
406
+ // Mobile HTTP clients (high confidence for legitimate mobile apps)
407
+ if (hasAndroidClient) {
408
+ score += 80;
409
+ reasons.push("Android HTTP client");
410
+ }
411
+ if (hasIosClient) {
412
+ score += 80;
413
+ reasons.push("iOS HTTP client");
414
+ }
415
+ // Mobile frameworks (high confidence)
416
+ if (hasMobileFramework) {
417
+ score += 70;
418
+ reasons.push("Mobile framework");
419
+ }
420
+ // Platform-specific detection (medium-high confidence)
421
+ if (this.hasAllowedPlatform(userAgent)) {
422
+ score += 60;
423
+ reasons.push("Allowed platform");
424
+ }
425
+ // General mobile patterns (medium confidence)
426
+ if (hasMobilePattern) {
427
+ score += 40;
428
+ reasons.push("Mobile patterns");
429
+ }
430
+ // Mobile headers boost confidence
431
+ if (this.hasMobileHeaders(req)) {
432
+ score += 30;
433
+ reasons.push("Mobile headers");
434
+ }
435
+ // Require minimum score threshold
436
+ const threshold = this.config.requireMobileHeaders ? 80 : 50;
437
+ reason =
438
+ reasons.length > 0 ? reasons.join(" + ") : "No mobile indicators";
439
+ return {
440
+ isValid: score >= threshold,
441
+ reason: score >= threshold
442
+ ? reason
443
+ : `Insufficient mobile indicators (score: ${score}/${threshold})`,
444
+ score,
445
+ };
446
+ }
447
+ /**
448
+ * Check if request is from a mobile app
449
+ */
450
+ isMobileRequest(req) {
451
+ const rawUserAgent = req.headers["user-agent"] || req.headers["User-Agent"] || "";
452
+ const userAgent = this.normalizeUserAgent(rawUserAgent);
453
+ const validation = this.validateMobileRequest(req, userAgent);
454
+ if (this.config.debug) {
455
+ this.logger.debug("security", `Validation result: ${validation.isValid ? "PASS" : "FAIL"} ` +
456
+ `(Score: ${validation.score}) - ${validation.reason} - UA: ${userAgent.substring(0, 100)}`);
457
+ }
458
+ return validation.isValid;
459
+ }
460
+ /**
461
+ * Middleware function
462
+ */
463
+ middleware() {
464
+ return (req, res, next) => {
465
+ const userAgent = req.headers["user-agent"] ||
466
+ req.headers["User-Agent"] ||
467
+ "none";
468
+ if (this.config.debug) {
469
+ this.logger.debug("security", `MobileOnly check for ${req.ip} - UA: ${userAgent.substring(0, 100)}`);
470
+ }
471
+ if (this.isMobileRequest(req)) {
472
+ if (this.config.debug) {
473
+ this.logger.debug("security", `✅ ALLOWED mobile request from: ${req.ip}`);
474
+ }
475
+ return next();
476
+ }
477
+ this.logger.warn("security", `❌ BLOCKED non-mobile request from ${req.ip}. User-Agent: ${userAgent.substring(0, 150)}`);
478
+ // Check if headers already sent to prevent error
479
+ if (res.headersSent) {
480
+ this.logger.error("security", `Cannot send response for blocked request from ${req.ip} - headers already sent`);
481
+ return;
482
+ }
483
+ return res.status(this.config.statusCode).json({
484
+ error: "Access Denied",
485
+ message: this.config.errorMessage,
486
+ code: "MOBILE_ONLY",
487
+ timestamp: new Date().toISOString(),
488
+ userAgent: userAgent,
489
+ ip: req.ip,
490
+ });
491
+ };
492
+ }
493
+ /**
494
+ * Get current configuration
495
+ */
496
+ getConfig() {
497
+ return { ...this.config };
498
+ }
499
+ }
500
+
501
+ export { MobileOnlyProtector };
502
+ //# sourceMappingURL=MobileOnlyProtector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MobileOnlyProtector.js","sources":["../../../../../../src/middleware/built-in/security/MobileOnlyProtector.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}