mirror of
https://github.com/Eugeny/tabby.git
synced 2024-09-21 18:07:54 +03:00
fixed dynamic port forward listener not getting cleaned up - fixes #4200
This commit is contained in:
parent
6d7f25870e
commit
5053743b1b
@ -21,7 +21,7 @@ function isStructuralMember (v) {
|
||||
}
|
||||
|
||||
function isNonStructuralObjectMember (v): boolean {
|
||||
return v instanceof Object && !(v instanceof Array) && v.__nonStructural
|
||||
return v instanceof Object && (v instanceof Array || v.__nonStructural)
|
||||
}
|
||||
|
||||
/** @hidden */
|
||||
@ -62,18 +62,18 @@ export class ConfigProxy {
|
||||
if (real[key] !== undefined) {
|
||||
return real[key]
|
||||
} else {
|
||||
if (isNonStructuralObjectMember(defaults[key])) {
|
||||
// The object might be modified outside
|
||||
real[key] = this.__getDefault(key)
|
||||
delete real[key].__nonStructural
|
||||
return real[key]
|
||||
}
|
||||
return this.__getDefault(key)
|
||||
}
|
||||
}
|
||||
|
||||
this.__getDefault = (key: string) => { // eslint-disable-line @typescript-eslint/unbound-method
|
||||
if (isNonStructuralObjectMember(defaults[key])) {
|
||||
real[key] = { ...defaults[key] }
|
||||
delete real[key].__nonStructural
|
||||
return real[key]
|
||||
} else {
|
||||
return deepClone(defaults[key])
|
||||
}
|
||||
return deepClone(defaults[key])
|
||||
}
|
||||
|
||||
this.__setValue = (key: string, value: any) => { // eslint-disable-line @typescript-eslint/unbound-method
|
||||
|
@ -74,11 +74,11 @@ export class ForwardedPort implements ForwardedPortConfig {
|
||||
targetAddress: string
|
||||
targetPort: number
|
||||
|
||||
private listener: Server
|
||||
private listener: Server|null = null
|
||||
|
||||
async startLocalListener (callback: (accept: () => Socket, reject: () => void, sourceAddress: string|null, sourcePort: number|null, targetAddress: string, targetPort: number) => void): Promise<void> {
|
||||
if (this.type === PortForwardType.Local) {
|
||||
this.listener = createServer(s => callback(
|
||||
const listener = this.listener = createServer(s => callback(
|
||||
() => s,
|
||||
() => s.destroy(),
|
||||
s.remoteAddress ?? null,
|
||||
@ -87,9 +87,9 @@ export class ForwardedPort implements ForwardedPortConfig {
|
||||
this.targetPort,
|
||||
))
|
||||
return new Promise((resolve, reject) => {
|
||||
this.listener.listen(this.port, this.host)
|
||||
this.listener.on('error', reject)
|
||||
this.listener.on('listening', resolve)
|
||||
listener.listen(this.port, this.host)
|
||||
listener.on('error', reject)
|
||||
listener.on('listening', resolve)
|
||||
})
|
||||
} else if (this.type === PortForwardType.Dynamic) {
|
||||
return new Promise((resolve, reject) => {
|
||||
@ -102,10 +102,10 @@ export class ForwardedPort implements ForwardedPortConfig {
|
||||
info.dstAddr,
|
||||
info.dstPort,
|
||||
)
|
||||
})
|
||||
}) as Server
|
||||
this.listener.on('error', reject)
|
||||
this.listener.listen(this.port, this.host, resolve)
|
||||
;(this.listener as any).useAuth(socksv5.auth.None())
|
||||
this.listener['useAuth'](socksv5.auth.None())
|
||||
})
|
||||
} else {
|
||||
throw new Error('Invalid forward type for a local listener')
|
||||
@ -113,7 +113,7 @@ export class ForwardedPort implements ForwardedPortConfig {
|
||||
}
|
||||
|
||||
stopLocalListener (): void {
|
||||
this.listener.close()
|
||||
this.listener?.close()
|
||||
}
|
||||
|
||||
toString (): string {
|
||||
@ -290,9 +290,7 @@ export class SSHSession extends BaseSession {
|
||||
|
||||
this.destroyed$.subscribe(() => {
|
||||
for (const port of this.forwardedPorts) {
|
||||
if (port.type === PortForwardType.Local) {
|
||||
port.stopLocalListener()
|
||||
}
|
||||
port.stopLocalListener()
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
.list-group-light.mb-3
|
||||
.list-group.mb-3
|
||||
.list-group-item.d-flex.align-items-center(*ngFor='let fw of model')
|
||||
strong(*ngIf='fw.type === PortForwardType.Local') Local
|
||||
strong(*ngIf='fw.type === PortForwardType.Remote') Remote
|
||||
@ -7,15 +7,17 @@
|
||||
.ml-2 →
|
||||
.ml-2(*ngIf='fw.type !== PortForwardType.Dynamic') {{fw.targetAddress}}:{{fw.targetPort}}
|
||||
.ml-2(*ngIf='fw.type === PortForwardType.Dynamic') SOCKS proxy
|
||||
button.btn.btn-link.ml-auto((click)='remove(fw)')
|
||||
i.fas.fa-trash-alt.mr-2
|
||||
span Remove
|
||||
button.btn.btn-link.hover-reveal.ml-auto((click)='remove(fw)')
|
||||
i.fas.fa-trash-alt
|
||||
|
||||
.input-group.mb-2(*ngIf='newForward.type === PortForwardType.Dynamic')
|
||||
input.form-control(type='text', [(ngModel)]='newForward.host')
|
||||
.input-group-append
|
||||
.input-group-text :
|
||||
input.form-control(type='number', [(ngModel)]='newForward.port')
|
||||
.input-group-append
|
||||
.input-group-text →
|
||||
.input-group-append.input-group-text(style='flex: 3 1 0') SOCKS proxy
|
||||
|
||||
.input-group.mb-2(*ngIf='newForward.type !== PortForwardType.Dynamic')
|
||||
input.form-control(type='text', [(ngModel)]='newForward.host')
|
||||
|
Loading…
Reference in New Issue
Block a user