Compare commits

...

4 Commits

4 changed files with 28 additions and 4 deletions

View File

@ -1,5 +1,16 @@
# Changelog
## 2025-03-01 - 3.20.2 - fix(PortProxy)
Enhance connection cleanup handling in PortProxy
- Add checks to ensure timers are reset only if outgoing socket is active
- Prevent setting outgoingActive if the connection is already closed
## 2025-03-01 - 3.20.1 - fix(PortProxy)
Improve IP allowance check for forced domains
- Enhanced IP allowance check logic by incorporating blocked IPs and default allowed IPs for forced domains within port proxy configurations.
## 2025-03-01 - 3.20.0 - feat(PortProxy)
Enhance PortProxy with advanced connection cleanup and logging

View File

@ -1,6 +1,6 @@
{
"name": "@push.rocks/smartproxy",
"version": "3.20.0",
"version": "3.20.2",
"private": false,
"description": "A powerful proxy package that effectively handles high traffic, with features such as SSL/TLS support, port proxying, WebSocket handling, and dynamic routing with authentication options.",
"main": "dist_ts/index.js",

View File

@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@push.rocks/smartproxy',
version: '3.20.0',
version: '3.20.2',
description: 'A powerful proxy package that effectively handles high traffic, with features such as SSL/TLS support, port proxying, WebSocket handling, and dynamic routing with authentication options.'
}

View File

@ -354,6 +354,7 @@ export class PortProxy {
// Initialize a cleanup timer for max connection lifetime.
if (this.settings.maxConnectionLifetime) {
// Flags to track if data was seen from each side.
let incomingActive = false;
let outgoingActive = false;
const resetCleanupTimer = () => {
@ -370,15 +371,19 @@ export class PortProxy {
resetCleanupTimer();
// Only reset the timer if outgoing socket is still active.
socket.on('data', () => {
incomingActive = true;
if (incomingActive && outgoingActive) {
// Check if outgoing has not been closed before resetting timer.
if (!connectionRecord.outgoingClosedTime && incomingActive && outgoingActive) {
resetCleanupTimer();
incomingActive = false;
outgoingActive = false;
}
});
targetSocket.on('data', () => {
// If outgoing is closed, do not set outgoingActive.
if (connectionRecord.outgoingClosedTime) return;
outgoingActive = true;
if (incomingActive && outgoingActive) {
resetCleanupTimer();
@ -413,7 +418,15 @@ export class PortProxy {
domain => domain.portRanges && domain.portRanges.length > 0 && isPortInRanges(localPort, domain.portRanges)
);
if (forcedDomain) {
if (!isAllowed(remoteIP, forcedDomain.allowedIPs)) {
const effectiveAllowedIPs: string[] = [
...forcedDomain.allowedIPs,
...(this.settings.defaultAllowedIPs || [])
];
const effectiveBlockedIPs: string[] = [
...(forcedDomain.blockedIPs || []),
...(this.settings.defaultBlockedIPs || [])
];
if (!isGlobIPAllowed(remoteIP, effectiveAllowedIPs, effectiveBlockedIPs)) {
console.log(`Connection from ${remoteIP} rejected: IP not allowed for domain ${forcedDomain.domains.join(', ')} on port ${localPort}.`);
socket.end();
return;