@push.rocks/smartproxy 22.6.0 → 23.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.
- package/changelog.md +18 -0
- package/dist_rust/{rustproxy → rustproxy_linux_amd64} +0 -0
- package/dist_rust/rustproxy_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +0 -1
- package/dist_ts/index.js +1 -3
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/proxies/index.d.ts +0 -1
- package/dist_ts/proxies/index.js +1 -3
- package/dist_ts/proxies/smart-proxy/models/route-types.js +1 -1
- package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.d.ts +9 -21
- package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.js +83 -212
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +2 -3
- package/npmextra.json +3 -0
- package/package.json +13 -11
- package/readme.md +35 -31
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +0 -3
- package/ts/plugins.ts +2 -0
- package/ts/proxies/index.ts +0 -3
- package/ts/proxies/smart-proxy/models/route-types.ts +0 -2
- package/ts/proxies/smart-proxy/rust-proxy-bridge.ts +102 -233
- package/ts/proxies/smart-proxy/smart-proxy.ts +1 -2
- package/dist_ts/common/eventUtils.d.ts +0 -14
- package/dist_ts/common/eventUtils.js +0 -20
- package/dist_ts/common/types.d.ts +0 -82
- package/dist_ts/common/types.js +0 -15
- package/dist_ts/core/utils/event-system.d.ts +0 -200
- package/dist_ts/core/utils/event-system.js +0 -224
- package/dist_ts/core/utils/event-utils.d.ts +0 -15
- package/dist_ts/core/utils/event-utils.js +0 -11
- package/dist_ts/core/utils/route-manager.d.ts +0 -88
- package/dist_ts/core/utils/route-manager.js +0 -342
- package/dist_ts/core/utils/route-utils.d.ts +0 -28
- package/dist_ts/core/utils/route-utils.js +0 -67
- package/dist_ts/detection/detectors/http-detector-v2.d.ts +0 -33
- package/dist_ts/detection/detectors/http-detector-v2.js +0 -87
- package/dist_ts/detection/detectors/tls-detector-v2.d.ts +0 -33
- package/dist_ts/detection/detectors/tls-detector-v2.js +0 -80
- package/dist_ts/detection/protocol-detector-v2.d.ts +0 -46
- package/dist_ts/detection/protocol-detector-v2.js +0 -116
- package/dist_ts/forwarding/config/forwarding-types.d.ts +0 -42
- package/dist_ts/forwarding/config/forwarding-types.js +0 -18
- package/dist_ts/forwarding/config/index.d.ts +0 -9
- package/dist_ts/forwarding/config/index.js +0 -10
- package/dist_ts/forwarding/factory/forwarding-factory.d.ts +0 -25
- package/dist_ts/forwarding/factory/forwarding-factory.js +0 -172
- package/dist_ts/forwarding/factory/index.d.ts +0 -4
- package/dist_ts/forwarding/factory/index.js +0 -5
- package/dist_ts/forwarding/handlers/base-handler.d.ts +0 -62
- package/dist_ts/forwarding/handlers/base-handler.js +0 -121
- package/dist_ts/forwarding/handlers/http-handler.d.ts +0 -30
- package/dist_ts/forwarding/handlers/http-handler.js +0 -143
- package/dist_ts/forwarding/handlers/https-passthrough-handler.d.ts +0 -29
- package/dist_ts/forwarding/handlers/https-passthrough-handler.js +0 -156
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.d.ts +0 -36
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.js +0 -276
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.d.ts +0 -35
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.js +0 -261
- package/dist_ts/forwarding/handlers/index.d.ts +0 -8
- package/dist_ts/forwarding/handlers/index.js +0 -9
- package/dist_ts/forwarding/index.d.ts +0 -13
- package/dist_ts/forwarding/index.js +0 -16
- package/dist_ts/http/index.d.ts +0 -5
- package/dist_ts/http/index.js +0 -8
- package/dist_ts/http/models/http-types.d.ts +0 -6
- package/dist_ts/http/models/http-types.js +0 -7
- package/dist_ts/http/router/index.d.ts +0 -8
- package/dist_ts/http/router/index.js +0 -7
- package/dist_ts/http/router/proxy-router.d.ts +0 -115
- package/dist_ts/http/router/proxy-router.js +0 -325
- package/dist_ts/http/router/route-router.d.ts +0 -108
- package/dist_ts/http/router/route-router.js +0 -393
- package/dist_ts/protocols/tls/constants.d.ts +0 -122
- package/dist_ts/protocols/tls/constants.js +0 -135
- package/dist_ts/protocols/tls/parser.d.ts +0 -53
- package/dist_ts/protocols/tls/parser.js +0 -294
- package/dist_ts/protocols/tls/types.d.ts +0 -65
- package/dist_ts/protocols/tls/types.js +0 -5
- package/dist_ts/proxies/http-proxy/certificate-manager.d.ts +0 -95
- package/dist_ts/proxies/http-proxy/certificate-manager.js +0 -214
- package/dist_ts/proxies/http-proxy/connection-pool.d.ts +0 -47
- package/dist_ts/proxies/http-proxy/connection-pool.js +0 -195
- package/dist_ts/proxies/http-proxy/context-creator.d.ts +0 -34
- package/dist_ts/proxies/http-proxy/context-creator.js +0 -108
- package/dist_ts/proxies/http-proxy/default-certificates.d.ts +0 -54
- package/dist_ts/proxies/http-proxy/default-certificates.js +0 -127
- package/dist_ts/proxies/http-proxy/function-cache.d.ts +0 -95
- package/dist_ts/proxies/http-proxy/function-cache.js +0 -215
- package/dist_ts/proxies/http-proxy/handlers/index.d.ts +0 -4
- package/dist_ts/proxies/http-proxy/handlers/index.js +0 -6
- package/dist_ts/proxies/http-proxy/handlers/redirect-handler.d.ts +0 -18
- package/dist_ts/proxies/http-proxy/handlers/redirect-handler.js +0 -78
- package/dist_ts/proxies/http-proxy/handlers/static-handler.d.ts +0 -19
- package/dist_ts/proxies/http-proxy/handlers/static-handler.js +0 -211
- package/dist_ts/proxies/http-proxy/http-proxy.d.ts +0 -117
- package/dist_ts/proxies/http-proxy/http-proxy.js +0 -521
- package/dist_ts/proxies/http-proxy/http-request-handler.d.ts +0 -40
- package/dist_ts/proxies/http-proxy/http-request-handler.js +0 -257
- package/dist_ts/proxies/http-proxy/http2-request-handler.d.ts +0 -24
- package/dist_ts/proxies/http-proxy/http2-request-handler.js +0 -201
- package/dist_ts/proxies/http-proxy/index.d.ts +0 -14
- package/dist_ts/proxies/http-proxy/index.js +0 -16
- package/dist_ts/proxies/http-proxy/models/http-types.d.ts +0 -117
- package/dist_ts/proxies/http-proxy/models/http-types.js +0 -92
- package/dist_ts/proxies/http-proxy/models/index.d.ts +0 -5
- package/dist_ts/proxies/http-proxy/models/index.js +0 -6
- package/dist_ts/proxies/http-proxy/models/types.d.ts +0 -75
- package/dist_ts/proxies/http-proxy/models/types.js +0 -35
- package/dist_ts/proxies/http-proxy/request-handler.d.ts +0 -97
- package/dist_ts/proxies/http-proxy/request-handler.js +0 -737
- package/dist_ts/proxies/http-proxy/security-manager.d.ts +0 -98
- package/dist_ts/proxies/http-proxy/security-manager.js +0 -341
- package/dist_ts/proxies/http-proxy/websocket-handler.d.ts +0 -50
- package/dist_ts/proxies/http-proxy/websocket-handler.js +0 -505
- package/dist_ts/proxies/nftables-proxy/index.d.ts +0 -6
- package/dist_ts/proxies/nftables-proxy/index.js +0 -7
- package/dist_ts/proxies/nftables-proxy/models/errors.d.ts +0 -15
- package/dist_ts/proxies/nftables-proxy/models/errors.js +0 -28
- package/dist_ts/proxies/nftables-proxy/models/index.d.ts +0 -5
- package/dist_ts/proxies/nftables-proxy/models/index.js +0 -6
- package/dist_ts/proxies/nftables-proxy/models/interfaces.d.ts +0 -75
- package/dist_ts/proxies/nftables-proxy/models/interfaces.js +0 -5
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +0 -124
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +0 -1374
- package/dist_ts/proxies/nftables-proxy/utils/index.d.ts +0 -9
- package/dist_ts/proxies/nftables-proxy/utils/index.js +0 -12
- package/dist_ts/proxies/nftables-proxy/utils/nft-command-executor.d.ts +0 -66
- package/dist_ts/proxies/nftables-proxy/utils/nft-command-executor.js +0 -131
- package/dist_ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.d.ts +0 -39
- package/dist_ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.js +0 -112
- package/dist_ts/proxies/nftables-proxy/utils/nft-rule-validator.d.ts +0 -59
- package/dist_ts/proxies/nftables-proxy/utils/nft-rule-validator.js +0 -130
- package/dist_ts/proxies/smart-proxy/acme-state-manager.d.ts +0 -42
- package/dist_ts/proxies/smart-proxy/acme-state-manager.js +0 -101
- package/dist_ts/proxies/smart-proxy/cert-store.d.ts +0 -10
- package/dist_ts/proxies/smart-proxy/cert-store.js +0 -72
- package/dist_ts/proxies/smart-proxy/certificate-manager.d.ts +0 -164
- package/dist_ts/proxies/smart-proxy/certificate-manager.js +0 -745
- package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +0 -128
- package/dist_ts/proxies/smart-proxy/connection-manager.js +0 -689
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.d.ts +0 -43
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.js +0 -180
- package/dist_ts/proxies/smart-proxy/metrics-collector.d.ts +0 -98
- package/dist_ts/proxies/smart-proxy/metrics-collector.js +0 -355
- package/dist_ts/proxies/smart-proxy/nftables-manager.d.ts +0 -82
- package/dist_ts/proxies/smart-proxy/nftables-manager.js +0 -237
- package/dist_ts/proxies/smart-proxy/port-manager.d.ts +0 -117
- package/dist_ts/proxies/smart-proxy/port-manager.js +0 -318
- package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +0 -60
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +0 -1407
- package/dist_ts/proxies/smart-proxy/route-manager.d.ts +0 -112
- package/dist_ts/proxies/smart-proxy/route-manager.js +0 -453
- package/dist_ts/proxies/smart-proxy/route-orchestrator.d.ts +0 -56
- package/dist_ts/proxies/smart-proxy/route-orchestrator.js +0 -204
- package/dist_ts/proxies/smart-proxy/rust-binary-locator.d.ts +0 -23
- package/dist_ts/proxies/smart-proxy/rust-binary-locator.js +0 -104
- package/dist_ts/proxies/smart-proxy/security-manager.d.ts +0 -74
- package/dist_ts/proxies/smart-proxy/security-manager.js +0 -227
- package/dist_ts/proxies/smart-proxy/throughput-tracker.d.ts +0 -36
- package/dist_ts/proxies/smart-proxy/throughput-tracker.js +0 -115
- package/dist_ts/proxies/smart-proxy/timeout-manager.d.ts +0 -48
- package/dist_ts/proxies/smart-proxy/timeout-manager.js +0 -158
- package/dist_ts/proxies/smart-proxy/tls-manager.d.ts +0 -50
- package/dist_ts/proxies/smart-proxy/tls-manager.js +0 -110
- package/dist_ts/proxies/smart-proxy/utils/route-patterns.d.ts +0 -161
- package/dist_ts/proxies/smart-proxy/utils/route-patterns.js +0 -282
- package/dist_ts/proxies/smart-proxy/utils/route-validators.d.ts +0 -73
- package/dist_ts/proxies/smart-proxy/utils/route-validators.js +0 -259
- package/dist_ts/routing/router/proxy-router.d.ts +0 -115
- package/dist_ts/routing/router/proxy-router.js +0 -325
- package/dist_ts/routing/router/route-router.d.ts +0 -108
- package/dist_ts/routing/router/route-router.js +0 -393
- package/dist_ts/tls/alerts/index.d.ts +0 -4
- package/dist_ts/tls/alerts/index.js +0 -5
- package/dist_ts/tls/alerts/tls-alert.d.ts +0 -150
- package/dist_ts/tls/alerts/tls-alert.js +0 -226
- package/dist_ts/tls/sni/client-hello-parser.d.ts +0 -100
- package/dist_ts/tls/sni/client-hello-parser.js +0 -464
- package/dist_ts/tls/sni/sni-extraction.d.ts +0 -58
- package/dist_ts/tls/sni/sni-extraction.js +0 -275
- package/dist_ts/tls/utils/index.d.ts +0 -4
- package/dist_ts/tls/utils/index.js +0 -5
- package/dist_ts/tls/utils/tls-utils.d.ts +0 -49
- package/dist_ts/tls/utils/tls-utils.js +0 -75
- package/ts/proxies/nftables-proxy/index.ts +0 -6
- package/ts/proxies/nftables-proxy/models/errors.ts +0 -30
- package/ts/proxies/nftables-proxy/models/index.ts +0 -5
- package/ts/proxies/nftables-proxy/models/interfaces.ts +0 -94
- package/ts/proxies/nftables-proxy/nftables-proxy.ts +0 -1754
- package/ts/proxies/nftables-proxy/utils/index.ts +0 -38
- package/ts/proxies/nftables-proxy/utils/nft-command-executor.ts +0 -162
- package/ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.ts +0 -125
- package/ts/proxies/nftables-proxy/utils/nft-rule-validator.ts +0 -156
- package/ts/proxies/smart-proxy/rust-binary-locator.ts +0 -112
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import type { ILogger } from './models/types.js';
|
|
2
|
-
import type { IRouteConfig } from '../smart-proxy/models/route-types.js';
|
|
3
|
-
import type { IRouteContext } from '../../core/models/route-context.js';
|
|
4
|
-
/**
|
|
5
|
-
* Manages security features for the HttpProxy
|
|
6
|
-
* Implements IP filtering, rate limiting, and authentication.
|
|
7
|
-
* Uses shared utilities from security-utils.ts.
|
|
8
|
-
*/
|
|
9
|
-
export declare class SecurityManager {
|
|
10
|
-
private logger;
|
|
11
|
-
private routes;
|
|
12
|
-
private maxConnectionsPerIP;
|
|
13
|
-
private connectionRateLimitPerMinute;
|
|
14
|
-
private ipFilterCache;
|
|
15
|
-
private rateLimits;
|
|
16
|
-
private connectionsByIP;
|
|
17
|
-
private connectionRateByIP;
|
|
18
|
-
constructor(logger: ILogger, routes?: IRouteConfig[], maxConnectionsPerIP?: number, connectionRateLimitPerMinute?: number);
|
|
19
|
-
/**
|
|
20
|
-
* Update the routes configuration
|
|
21
|
-
*/
|
|
22
|
-
setRoutes(routes: IRouteConfig[]): void;
|
|
23
|
-
/**
|
|
24
|
-
* Check if a client is allowed to access a specific route
|
|
25
|
-
*
|
|
26
|
-
* @param route The route to check access for
|
|
27
|
-
* @param context The route context with client information
|
|
28
|
-
* @returns True if access is allowed, false otherwise
|
|
29
|
-
*/
|
|
30
|
-
isAllowed(route: IRouteConfig, context: IRouteContext): boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Check if an IP is allowed based on route security settings
|
|
33
|
-
*/
|
|
34
|
-
private isIpAllowed;
|
|
35
|
-
/**
|
|
36
|
-
* Check if request is within rate limit
|
|
37
|
-
*/
|
|
38
|
-
private isWithinRateLimit;
|
|
39
|
-
/**
|
|
40
|
-
* Clean up expired rate limits
|
|
41
|
-
* Should be called periodically to prevent memory leaks
|
|
42
|
-
*/
|
|
43
|
-
cleanupExpiredRateLimits(): void;
|
|
44
|
-
/**
|
|
45
|
-
* Check basic auth credentials
|
|
46
|
-
*
|
|
47
|
-
* @param route The route to check auth for
|
|
48
|
-
* @param username The provided username
|
|
49
|
-
* @param password The provided password
|
|
50
|
-
* @returns True if credentials are valid, false otherwise
|
|
51
|
-
*/
|
|
52
|
-
checkBasicAuth(route: IRouteConfig, username: string, password: string): boolean;
|
|
53
|
-
/**
|
|
54
|
-
* Verify a JWT token
|
|
55
|
-
*
|
|
56
|
-
* @param route The route to verify the token for
|
|
57
|
-
* @param token The JWT token to verify
|
|
58
|
-
* @returns True if the token is valid, false otherwise
|
|
59
|
-
*/
|
|
60
|
-
verifyJwtToken(route: IRouteConfig, token: string): boolean;
|
|
61
|
-
/**
|
|
62
|
-
* Get connections count by IP (checks normalized variants)
|
|
63
|
-
*/
|
|
64
|
-
getConnectionCountByIP(ip: string): number;
|
|
65
|
-
/**
|
|
66
|
-
* Check and update connection rate for an IP
|
|
67
|
-
* @returns true if within rate limit, false if exceeding limit
|
|
68
|
-
*/
|
|
69
|
-
checkConnectionRate(ip: string): boolean;
|
|
70
|
-
/**
|
|
71
|
-
* Track connection by IP
|
|
72
|
-
*/
|
|
73
|
-
trackConnectionByIP(ip: string, connectionId: string): void;
|
|
74
|
-
/**
|
|
75
|
-
* Remove connection tracking for an IP
|
|
76
|
-
*/
|
|
77
|
-
removeConnectionByIP(ip: string, connectionId: string): void;
|
|
78
|
-
/**
|
|
79
|
-
* Check if IP should be allowed considering connection rate and max connections
|
|
80
|
-
* @returns Object with result and reason
|
|
81
|
-
*/
|
|
82
|
-
validateIP(ip: string): {
|
|
83
|
-
allowed: boolean;
|
|
84
|
-
reason?: string;
|
|
85
|
-
};
|
|
86
|
-
/**
|
|
87
|
-
* Clears all IP tracking data (for shutdown)
|
|
88
|
-
*/
|
|
89
|
-
clearIPTracking(): void;
|
|
90
|
-
/**
|
|
91
|
-
* Start periodic cleanup of IP tracking data
|
|
92
|
-
*/
|
|
93
|
-
private startPeriodicIpCleanup;
|
|
94
|
-
/**
|
|
95
|
-
* Perform cleanup of expired IP data
|
|
96
|
-
*/
|
|
97
|
-
private performIpCleanup;
|
|
98
|
-
}
|
|
@@ -1,341 +0,0 @@
|
|
|
1
|
-
import { isIPAuthorized, normalizeIP, parseBasicAuthHeader, cleanupExpiredRateLimits } from '../../core/utils/security-utils.js';
|
|
2
|
-
/**
|
|
3
|
-
* Manages security features for the HttpProxy
|
|
4
|
-
* Implements IP filtering, rate limiting, and authentication.
|
|
5
|
-
* Uses shared utilities from security-utils.ts.
|
|
6
|
-
*/
|
|
7
|
-
export class SecurityManager {
|
|
8
|
-
constructor(logger, routes = [], maxConnectionsPerIP = 100, connectionRateLimitPerMinute = 300) {
|
|
9
|
-
this.logger = logger;
|
|
10
|
-
this.routes = routes;
|
|
11
|
-
this.maxConnectionsPerIP = maxConnectionsPerIP;
|
|
12
|
-
this.connectionRateLimitPerMinute = connectionRateLimitPerMinute;
|
|
13
|
-
// Cache IP filtering results to avoid constant regex matching
|
|
14
|
-
this.ipFilterCache = new Map();
|
|
15
|
-
// Store rate limits per route and key
|
|
16
|
-
this.rateLimits = new Map();
|
|
17
|
-
// Connection tracking by IP
|
|
18
|
-
this.connectionsByIP = new Map();
|
|
19
|
-
this.connectionRateByIP = new Map();
|
|
20
|
-
// Start periodic cleanup for connection tracking
|
|
21
|
-
this.startPeriodicIpCleanup();
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Update the routes configuration
|
|
25
|
-
*/
|
|
26
|
-
setRoutes(routes) {
|
|
27
|
-
this.routes = routes;
|
|
28
|
-
// Reset caches when routes change
|
|
29
|
-
this.ipFilterCache.clear();
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Check if a client is allowed to access a specific route
|
|
33
|
-
*
|
|
34
|
-
* @param route The route to check access for
|
|
35
|
-
* @param context The route context with client information
|
|
36
|
-
* @returns True if access is allowed, false otherwise
|
|
37
|
-
*/
|
|
38
|
-
isAllowed(route, context) {
|
|
39
|
-
if (!route.security) {
|
|
40
|
-
return true; // No security restrictions
|
|
41
|
-
}
|
|
42
|
-
// --- IP filtering ---
|
|
43
|
-
if (!this.isIpAllowed(route, context.clientIp)) {
|
|
44
|
-
this.logger.debug(`IP ${context.clientIp} is blocked for route ${route.name || 'unnamed'}`);
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
// --- Rate limiting ---
|
|
48
|
-
if (route.security.rateLimit?.enabled && !this.isWithinRateLimit(route, context)) {
|
|
49
|
-
this.logger.debug(`Rate limit exceeded for route ${route.name || 'unnamed'}`);
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
// --- Basic Auth (handled at HTTP level) ---
|
|
53
|
-
// Basic auth is not checked here as it requires HTTP headers
|
|
54
|
-
// and is handled in the RequestHandler
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Check if an IP is allowed based on route security settings
|
|
59
|
-
*/
|
|
60
|
-
isIpAllowed(route, clientIp) {
|
|
61
|
-
if (!route.security) {
|
|
62
|
-
return true; // No security restrictions
|
|
63
|
-
}
|
|
64
|
-
const routeId = route.name || 'unnamed';
|
|
65
|
-
// Check cache first
|
|
66
|
-
if (!this.ipFilterCache.has(routeId)) {
|
|
67
|
-
this.ipFilterCache.set(routeId, new Map());
|
|
68
|
-
}
|
|
69
|
-
const routeCache = this.ipFilterCache.get(routeId);
|
|
70
|
-
if (routeCache.has(clientIp)) {
|
|
71
|
-
return routeCache.get(clientIp);
|
|
72
|
-
}
|
|
73
|
-
// Use shared utility for IP authorization
|
|
74
|
-
const allowed = isIPAuthorized(clientIp, route.security.ipAllowList, route.security.ipBlockList);
|
|
75
|
-
// Cache the result
|
|
76
|
-
routeCache.set(clientIp, allowed);
|
|
77
|
-
return allowed;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Check if request is within rate limit
|
|
81
|
-
*/
|
|
82
|
-
isWithinRateLimit(route, context) {
|
|
83
|
-
if (!route.security?.rateLimit?.enabled) {
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
const rateLimit = route.security.rateLimit;
|
|
87
|
-
const routeId = route.name || 'unnamed';
|
|
88
|
-
// Determine rate limit key (by IP, path, or header)
|
|
89
|
-
let key = context.clientIp; // Default to IP
|
|
90
|
-
if (rateLimit.keyBy === 'path' && context.path) {
|
|
91
|
-
key = `${context.clientIp}:${context.path}`;
|
|
92
|
-
}
|
|
93
|
-
else if (rateLimit.keyBy === 'header' && rateLimit.headerName && context.headers) {
|
|
94
|
-
const headerValue = context.headers[rateLimit.headerName.toLowerCase()];
|
|
95
|
-
if (headerValue) {
|
|
96
|
-
key = `${context.clientIp}:${headerValue}`;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
// Get or create rate limit tracking for this route
|
|
100
|
-
if (!this.rateLimits.has(routeId)) {
|
|
101
|
-
this.rateLimits.set(routeId, new Map());
|
|
102
|
-
}
|
|
103
|
-
const routeLimits = this.rateLimits.get(routeId);
|
|
104
|
-
const now = Date.now();
|
|
105
|
-
// Get or create rate limit tracking for this key
|
|
106
|
-
let limit = routeLimits.get(key);
|
|
107
|
-
if (!limit || limit.expiry < now) {
|
|
108
|
-
// Create new rate limit or reset expired one
|
|
109
|
-
limit = {
|
|
110
|
-
count: 1,
|
|
111
|
-
expiry: now + (rateLimit.window * 1000)
|
|
112
|
-
};
|
|
113
|
-
routeLimits.set(key, limit);
|
|
114
|
-
return true;
|
|
115
|
-
}
|
|
116
|
-
// Increment the counter
|
|
117
|
-
limit.count++;
|
|
118
|
-
// Check if rate limit is exceeded
|
|
119
|
-
return limit.count <= rateLimit.maxRequests;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Clean up expired rate limits
|
|
123
|
-
* Should be called periodically to prevent memory leaks
|
|
124
|
-
*/
|
|
125
|
-
cleanupExpiredRateLimits() {
|
|
126
|
-
cleanupExpiredRateLimits(this.rateLimits, {
|
|
127
|
-
info: this.logger.info.bind(this.logger),
|
|
128
|
-
warn: this.logger.warn.bind(this.logger),
|
|
129
|
-
error: this.logger.error.bind(this.logger),
|
|
130
|
-
debug: this.logger.debug?.bind(this.logger)
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Check basic auth credentials
|
|
135
|
-
*
|
|
136
|
-
* @param route The route to check auth for
|
|
137
|
-
* @param username The provided username
|
|
138
|
-
* @param password The provided password
|
|
139
|
-
* @returns True if credentials are valid, false otherwise
|
|
140
|
-
*/
|
|
141
|
-
checkBasicAuth(route, username, password) {
|
|
142
|
-
if (!route.security?.basicAuth?.enabled) {
|
|
143
|
-
return true;
|
|
144
|
-
}
|
|
145
|
-
const basicAuth = route.security.basicAuth;
|
|
146
|
-
// Check credentials against configured users
|
|
147
|
-
for (const user of basicAuth.users) {
|
|
148
|
-
if (user.username === username && user.password === password) {
|
|
149
|
-
return true;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Verify a JWT token
|
|
156
|
-
*
|
|
157
|
-
* @param route The route to verify the token for
|
|
158
|
-
* @param token The JWT token to verify
|
|
159
|
-
* @returns True if the token is valid, false otherwise
|
|
160
|
-
*/
|
|
161
|
-
verifyJwtToken(route, token) {
|
|
162
|
-
if (!route.security?.jwtAuth?.enabled) {
|
|
163
|
-
return true;
|
|
164
|
-
}
|
|
165
|
-
try {
|
|
166
|
-
const jwtAuth = route.security.jwtAuth;
|
|
167
|
-
// Verify structure
|
|
168
|
-
const parts = token.split('.');
|
|
169
|
-
if (parts.length !== 3) {
|
|
170
|
-
return false;
|
|
171
|
-
}
|
|
172
|
-
// Decode payload
|
|
173
|
-
const payload = JSON.parse(Buffer.from(parts[1], 'base64').toString());
|
|
174
|
-
// Check expiration
|
|
175
|
-
if (payload.exp && payload.exp < Math.floor(Date.now() / 1000)) {
|
|
176
|
-
return false;
|
|
177
|
-
}
|
|
178
|
-
// Check issuer
|
|
179
|
-
if (jwtAuth.issuer && payload.iss !== jwtAuth.issuer) {
|
|
180
|
-
return false;
|
|
181
|
-
}
|
|
182
|
-
// Check audience
|
|
183
|
-
if (jwtAuth.audience && payload.aud !== jwtAuth.audience) {
|
|
184
|
-
return false;
|
|
185
|
-
}
|
|
186
|
-
// Note: In a real implementation, you'd also verify the signature
|
|
187
|
-
// using the secret and algorithm specified in jwtAuth
|
|
188
|
-
return true;
|
|
189
|
-
}
|
|
190
|
-
catch (err) {
|
|
191
|
-
this.logger.error(`Error verifying JWT: ${err}`);
|
|
192
|
-
return false;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Get connections count by IP (checks normalized variants)
|
|
197
|
-
*/
|
|
198
|
-
getConnectionCountByIP(ip) {
|
|
199
|
-
// Check all normalized variants of the IP
|
|
200
|
-
const variants = normalizeIP(ip);
|
|
201
|
-
for (const variant of variants) {
|
|
202
|
-
const connections = this.connectionsByIP.get(variant);
|
|
203
|
-
if (connections) {
|
|
204
|
-
return connections.size;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return 0;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Check and update connection rate for an IP
|
|
211
|
-
* @returns true if within rate limit, false if exceeding limit
|
|
212
|
-
*/
|
|
213
|
-
checkConnectionRate(ip) {
|
|
214
|
-
const now = Date.now();
|
|
215
|
-
const minute = 60 * 1000;
|
|
216
|
-
// Find existing rate tracking (check normalized variants)
|
|
217
|
-
const variants = normalizeIP(ip);
|
|
218
|
-
let existingKey = null;
|
|
219
|
-
for (const variant of variants) {
|
|
220
|
-
if (this.connectionRateByIP.has(variant)) {
|
|
221
|
-
existingKey = variant;
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
const key = existingKey || ip;
|
|
226
|
-
if (!this.connectionRateByIP.has(key)) {
|
|
227
|
-
this.connectionRateByIP.set(key, [now]);
|
|
228
|
-
return true;
|
|
229
|
-
}
|
|
230
|
-
// Get timestamps and filter out entries older than 1 minute
|
|
231
|
-
const timestamps = this.connectionRateByIP.get(key).filter((time) => now - time < minute);
|
|
232
|
-
timestamps.push(now);
|
|
233
|
-
this.connectionRateByIP.set(key, timestamps);
|
|
234
|
-
// Check if rate exceeds limit
|
|
235
|
-
return timestamps.length <= this.connectionRateLimitPerMinute;
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Track connection by IP
|
|
239
|
-
*/
|
|
240
|
-
trackConnectionByIP(ip, connectionId) {
|
|
241
|
-
// Check if any variant already exists
|
|
242
|
-
const variants = normalizeIP(ip);
|
|
243
|
-
let existingKey = null;
|
|
244
|
-
for (const variant of variants) {
|
|
245
|
-
if (this.connectionsByIP.has(variant)) {
|
|
246
|
-
existingKey = variant;
|
|
247
|
-
break;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
const key = existingKey || ip;
|
|
251
|
-
if (!this.connectionsByIP.has(key)) {
|
|
252
|
-
this.connectionsByIP.set(key, new Set());
|
|
253
|
-
}
|
|
254
|
-
this.connectionsByIP.get(key).add(connectionId);
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Remove connection tracking for an IP
|
|
258
|
-
*/
|
|
259
|
-
removeConnectionByIP(ip, connectionId) {
|
|
260
|
-
// Check all variants to find where the connection is tracked
|
|
261
|
-
const variants = normalizeIP(ip);
|
|
262
|
-
for (const variant of variants) {
|
|
263
|
-
if (this.connectionsByIP.has(variant)) {
|
|
264
|
-
const connections = this.connectionsByIP.get(variant);
|
|
265
|
-
connections.delete(connectionId);
|
|
266
|
-
if (connections.size === 0) {
|
|
267
|
-
this.connectionsByIP.delete(variant);
|
|
268
|
-
}
|
|
269
|
-
break;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Check if IP should be allowed considering connection rate and max connections
|
|
275
|
-
* @returns Object with result and reason
|
|
276
|
-
*/
|
|
277
|
-
validateIP(ip) {
|
|
278
|
-
// Check connection count limit
|
|
279
|
-
if (this.getConnectionCountByIP(ip) >= this.maxConnectionsPerIP) {
|
|
280
|
-
return {
|
|
281
|
-
allowed: false,
|
|
282
|
-
reason: `Maximum connections per IP (${this.maxConnectionsPerIP}) exceeded`
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
// Check connection rate limit
|
|
286
|
-
if (!this.checkConnectionRate(ip)) {
|
|
287
|
-
return {
|
|
288
|
-
allowed: false,
|
|
289
|
-
reason: `Connection rate limit (${this.connectionRateLimitPerMinute}/min) exceeded`
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
|
-
return { allowed: true };
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Clears all IP tracking data (for shutdown)
|
|
296
|
-
*/
|
|
297
|
-
clearIPTracking() {
|
|
298
|
-
this.connectionsByIP.clear();
|
|
299
|
-
this.connectionRateByIP.clear();
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* Start periodic cleanup of IP tracking data
|
|
303
|
-
*/
|
|
304
|
-
startPeriodicIpCleanup() {
|
|
305
|
-
// Clean up IP tracking data every minute
|
|
306
|
-
setInterval(() => {
|
|
307
|
-
this.performIpCleanup();
|
|
308
|
-
}, 60000).unref();
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Perform cleanup of expired IP data
|
|
312
|
-
*/
|
|
313
|
-
performIpCleanup() {
|
|
314
|
-
const now = Date.now();
|
|
315
|
-
const minute = 60 * 1000;
|
|
316
|
-
let cleanedRateLimits = 0;
|
|
317
|
-
let cleanedIPs = 0;
|
|
318
|
-
// Clean up expired rate limit timestamps
|
|
319
|
-
for (const [ip, timestamps] of this.connectionRateByIP.entries()) {
|
|
320
|
-
const validTimestamps = timestamps.filter((time) => now - time < minute);
|
|
321
|
-
if (validTimestamps.length === 0) {
|
|
322
|
-
this.connectionRateByIP.delete(ip);
|
|
323
|
-
cleanedRateLimits++;
|
|
324
|
-
}
|
|
325
|
-
else if (validTimestamps.length < timestamps.length) {
|
|
326
|
-
this.connectionRateByIP.set(ip, validTimestamps);
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
// Clean up IPs with no active connections
|
|
330
|
-
for (const [ip, connections] of this.connectionsByIP.entries()) {
|
|
331
|
-
if (connections.size === 0) {
|
|
332
|
-
this.connectionsByIP.delete(ip);
|
|
333
|
-
cleanedIPs++;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
if (cleanedRateLimits > 0 || cleanedIPs > 0) {
|
|
337
|
-
this.logger.debug(`IP cleanup: removed ${cleanedIPs} IPs and ${cleanedRateLimits} rate limits`);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3Byb3hpZXMvaHR0cC1wcm94eS9zZWN1cml0eS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFDTCxjQUFjLEVBQ2QsV0FBVyxFQUNYLG9CQUFvQixFQUNwQix3QkFBd0IsRUFFekIsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1Qzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFXMUIsWUFDVSxNQUFlLEVBQ2YsU0FBeUIsRUFBRSxFQUMzQixzQkFBOEIsR0FBRyxFQUNqQywrQkFBdUMsR0FBRztRQUgxQyxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBQ2YsV0FBTSxHQUFOLE1BQU0sQ0FBcUI7UUFDM0Isd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFjO1FBQ2pDLGlDQUE0QixHQUE1Qiw0QkFBNEIsQ0FBYztRQWRwRCw4REFBOEQ7UUFDdEQsa0JBQWEsR0FBc0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVyRSxzQ0FBc0M7UUFDOUIsZUFBVSxHQUE2QyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRXpFLDRCQUE0QjtRQUNwQixvQkFBZSxHQUE2QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RELHVCQUFrQixHQUEwQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBUTVELGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTLENBQUMsTUFBc0I7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFNBQVMsQ0FBQyxLQUFtQixFQUFFLE9BQXNCO1FBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxF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
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../plugins.js';
|
|
2
|
-
import '../../core/models/socket-augmentation.js';
|
|
3
|
-
import { type IHttpProxyOptions } from './models/types.js';
|
|
4
|
-
import { ConnectionPool } from './connection-pool.js';
|
|
5
|
-
import type { IRouteConfig } from '../smart-proxy/models/route-types.js';
|
|
6
|
-
/**
|
|
7
|
-
* Handles WebSocket connections and proxying
|
|
8
|
-
*/
|
|
9
|
-
export declare class WebSocketHandler {
|
|
10
|
-
private options;
|
|
11
|
-
private connectionPool;
|
|
12
|
-
private routes;
|
|
13
|
-
private heartbeatInterval;
|
|
14
|
-
private wsServer;
|
|
15
|
-
private logger;
|
|
16
|
-
private contextCreator;
|
|
17
|
-
private router;
|
|
18
|
-
private securityManager;
|
|
19
|
-
constructor(options: IHttpProxyOptions, connectionPool: ConnectionPool, routes?: IRouteConfig[]);
|
|
20
|
-
/**
|
|
21
|
-
* Set the route configurations
|
|
22
|
-
*/
|
|
23
|
-
setRoutes(routes: IRouteConfig[]): void;
|
|
24
|
-
/**
|
|
25
|
-
* Select the appropriate target from the targets array based on sub-matching criteria
|
|
26
|
-
*/
|
|
27
|
-
private selectTarget;
|
|
28
|
-
/**
|
|
29
|
-
* Initialize WebSocket server on an existing HTTPS server
|
|
30
|
-
*/
|
|
31
|
-
initialize(server: plugins.https.Server): void;
|
|
32
|
-
/**
|
|
33
|
-
* Start the heartbeat interval to check for inactive WebSocket connections
|
|
34
|
-
*/
|
|
35
|
-
private startHeartbeat;
|
|
36
|
-
/**
|
|
37
|
-
* Handle a new WebSocket connection
|
|
38
|
-
*/
|
|
39
|
-
private handleWebSocketConnection;
|
|
40
|
-
/**
|
|
41
|
-
* Get information about active WebSocket connections
|
|
42
|
-
*/
|
|
43
|
-
getConnectionInfo(): {
|
|
44
|
-
activeConnections: number;
|
|
45
|
-
};
|
|
46
|
-
/**
|
|
47
|
-
* Shutdown the WebSocket handler
|
|
48
|
-
*/
|
|
49
|
-
shutdown(): void;
|
|
50
|
-
}
|