diff options
Diffstat (limited to 'x11vnc/misc/enhanced_tightvnc_viewer/Windows/util/connect_br.tcl')
| -rwxr-xr-x | x11vnc/misc/enhanced_tightvnc_viewer/Windows/util/connect_br.tcl | 239 | 
1 files changed, 239 insertions, 0 deletions
diff --git a/x11vnc/misc/enhanced_tightvnc_viewer/Windows/util/connect_br.tcl b/x11vnc/misc/enhanced_tightvnc_viewer/Windows/util/connect_br.tcl new file mode 100755 index 0000000..e8654a3 --- /dev/null +++ b/x11vnc/misc/enhanced_tightvnc_viewer/Windows/util/connect_br.tcl @@ -0,0 +1,239 @@ +#!/usr/bin/wish + +global env + +set proxy1 "" +set proxy2 "" +set client_fh "" +set server_fh "" + +set debug 0 +if {$debug} { +	if {! [info exists env(SSL_VNC_DEST)]} { +		set env(SSL_VNC_DEST) "haystack:2037" +	} +	if {! [info exists env(SSL_VNC_PROXY)]} { +		set env(SSL_VNC_PROXY) "haystack:2037" +	} +	if {! [info exists env(SSL_VNC_LISTEN)]} { +		set env(SSL_VNC_LISTEN) "6789" +	} +} + +set dest $env(SSL_VNC_DEST) + +if [regexp {,} $env(SSL_VNC_PROXY)] { +	set s [split $env(SSL_VNC_PROXY) ","] +	set proxy1 [lindex $s 0] +	set proxy2 [lindex $s 1] +} else { +	set proxy1 $env(SSL_VNC_PROXY) +} + +set s [split $proxy1 ":"] +set proxy1_host [lindex $s 0] +set proxy1_port [lindex $s 1] + +if {$proxy2 != ""} { +	set s [split $proxy2 ":"] +	set proxy2_host [lindex $s 0] +	set proxy2_port [lindex $s 1] +} + +set lport $env(SSL_VNC_LISTEN) + +set got_connection 0 +set lsock [socket -myaddr 127.0.0.1 -server handle_connection $lport] + +if {1} { +	wm withdraw . +} +button .b -text "CONNECT_BR" -command {destroy .} +pack .b +after 1000 check_callback  + +proc check_callback {} { +	global debug +	if {$debug} { +		puts stderr "." +	} +	check_closed +	after 1000 check_callback  +} + +proc check_closed {} { +	global client_fh server_fh debug +	global got_connection + +	if {! $got_connection} { +		return +	} +	set delay 100 +	if {$client_fh != "" && [eof $client_fh]} { +		if {$debug} { +			puts stderr "client_fh EOF" +		} +		catch {flush $client_fh} +		after $delay +		catch {close $client_fh} +		after $delay +		catch {flush $server_fh} +		after $delay +		catch {close $server_fh} +		destroy . +		exit +	} +	if {$server_fh != "" && [eof $server_fh]} { +		if {$debug} { +			puts stderr "server_fh EOF" +		} +		catch {flush $server_fh} +		after $delay +		catch {close $server_fh} +		after $delay +		catch {flush $client_fh} +		after $delay +		catch {close $client_fh} +		destroy . +		exit +	} +} + +proc xfer_in_to_out {} { +	global client_fh server_fh debug +	if {$client_fh != "" && ![eof $client_fh]} { +		set str [read $client_fh 4096] +		if {$debug} { +			puts stderr "xfer_in_to_out: $str" +		} +		if {$server_fh != ""} { +			puts -nonewline $server_fh $str +			flush $server_fh +		} +	} +	check_closed +} + +proc xfer_out_to_in {} { +	global client_fh server_fh debug +	if {$server_fh != "" && ![eof $server_fh]} { +		set str [read $server_fh 4096] +		if {$debug} { +			puts stderr "xfer_out_to_in: $str" +		} +		if {$client_fh != ""} { +			puts -nonewline $client_fh $str +			flush $client_fh +		} +	} +	check_closed +} + +proc handle_connection {fh host port} { +	global proxy1_host proxy1_port +	global proxy2_host proxy2_port +	global proxy1 proxy2 +	global dest +	global debug +	global got_connection + +	if {$got_connection} { +		catch {close $fh} +		return +	} +	set got_connection 1 + +	if {$debug} { +		puts stderr "connection from: $host $port"	 +		puts stderr "socket $proxy1_host $proxy1_port" +	} + +	set sock [socket $proxy1_host $proxy1_port] + +	global client_fh server_fh +	set client_fh $fh +	set server_fh $sock + +	fconfigure $fh   -translation binary -blocking 0 +	fconfigure $sock -translation binary -blocking 0 + +	set con "" +	if {$proxy2 != ""} { +		append con "CONNECT $proxy2 HTTP/1.1\r\n" +		append con "Host: $proxy2\r\n\r\n" +	} else { +		append con "CONNECT $dest HTTP/1.1\r\n" +		append con "Host: $dest\r\n\r\n" +	} + +	puts -nonewline $sock $con +	flush $sock + +	set r "" +	set cnt 0 +	while {1} { +		set c [read $sock 1] +		if {$c == ""} { +			check_closed +			after 20 +		} +		incr cnt +		if {$debug} { +			.b configure -text "A $cnt -- $c" +			update +		} +		append r $c +		if {[regexp "\r\n\r\n" $r] || [regexp "a--no--\n\n" $r]} { +			break +		} +		if {$cnt > 3000} { +			break +		} +	} +	if {! [regexp {HTTP/.* 200} $r]} { +		puts stderr "did not find HTTP 200 #1" +		if {1} { +			destroy . +			exit 1 +		} +	} + +	if {$proxy2 != ""} { +		set con "" +		append con "CONNECT $dest HTTP/1.1\r\n" +		append con "Host: $dest\r\n\r\n" + +		puts -nonewline $sock $con +		flush $sock + +		set r "" +		set cnt 0 +		while {1} { +			set c [read $sock 1] +			if {$c == ""} { +				check_closed +				after 20 +			} +			incr cnt +			if {$debug} { +				.b configure -text "B $cnt -- $c" +				update +			} +			append r $c +			if {[regexp "\r\n\r\n" $r] || [regexp "a--no--\n\n" $r]} { +				break +			} +			if {$cnt > 3000} { +				break +			} +		} +		if {! [regexp {HTTP/.* 200} $r]} { +			puts stderr "did not find HTTP 200 #2" +			destroy . +			exit 1 +		} +	} + +	fileevent $fh   readable xfer_in_to_out +	fileevent $sock readable xfer_out_to_in +}  | 
