1a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#!/usr/bin/wish
2a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
3a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc check_callback {} {
4a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global debug
5a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$debug} {
6a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "."
7a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
8a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	check_closed
9a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	after 1000 check_callback
10a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
11a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
12a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc getout {} {
13a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global client_fh server_fh
14a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
15a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set delay 50
16a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	catch {flush $client_fh}
17a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	after $delay
18a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	catch {close $client_fh}
19a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set client_fh ""
20a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	after $delay
21a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	catch {flush $server_fh}
22a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	after $delay
23a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	catch {close $server_fh}
24a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set server_fh ""
25a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	after $delay
26a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
27a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global bmesg_cnt
28a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [info exists bmesg_cnt] {
29a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		catch {tkwait window .bmesg$bmesg_cnt}
30a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
31a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	destroy .
32a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	exit
33a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
34a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
35a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc check_closed {} {
36a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global got_connection debug
37a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global client_fh server_fh
38a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
39a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {! $got_connection} {
40a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return
41a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
42a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$client_fh != ""} {
43a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set ef ""
44a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		catch {set ef [eof $client_fh]}
45a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$ef == 1} {
46a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if {$debug} {
47a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				puts stderr "client_fh EOF"
48a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
49a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			getout
50a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
51a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
52a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$server_fh != ""} {
53a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set ef ""
54a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		catch {set ef [eof $server_fh]}
55a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$ef == 1} {
56a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if {$debug} {
57a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				puts stderr "server_fh EOF"
58a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
59a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			getout
60a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
61a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
62a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
63a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
64a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc xfer_in_to_out {} {
65a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global client_fh server_fh debug do_bridge
66a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$client_fh != "" && ![eof $client_fh]} {
67a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set ef ""
68a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		catch {set ef [eof $client_fh]}
69a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$ef == 0} {
70a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set str ""
71a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			catch {set str [read $client_fh 4096]}
72a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if {$debug} {
73a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				#puts stderr "xfer_in_to_out: $str"
74a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				puts stderr "xfer_in_to_out: [string length $str]"
75a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
76a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if {$server_fh != "" && $str != ""} {
77a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				catch {puts -nonewline $server_fh $str}
78a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				catch {flush $server_fh}
79a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
80a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
81a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
82a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	check_closed
83a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
84a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
85a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc xfer_out_to_in {} {
86a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global client_fh server_fh debug do_bridge
87a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$server_fh != ""} {
88a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set ef ""
89a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		catch {set ef [eof $server_fh]}
90a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$ef == 0} {
91a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set str ""
92a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			catch {set str [read $server_fh 4096]}
93a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if {$debug} {
94a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				#puts stderr "xfer_out_to_in: $str"
95a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				puts stderr "xfer_out_to_in: [string length $str]"
96a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
97a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if {$client_fh != "" && $str != ""} {
98a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				catch {puts -nonewline $client_fh $str}
99a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				catch {flush $client_fh}
100a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
101a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
102a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
103a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	check_closed
104a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
105a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
106a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc bmesg {msg} {
107a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global env
108a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {! [info exists env(BMESG)]} {
109a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return
110a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
111a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$env(BMESG) == 0} {
112a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return
113a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
114a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
115a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global bmesg_cnt
116a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {! [info exists bmesg_cnt]} {
117a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set bmesg_cnt 0
118a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
119a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	incr bmesg_cnt
120a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set w .bmesg$bmesg_cnt
121a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	catch {destroy $w}
122a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	toplevel $w
123a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	label $w.l -width 70 -text "$msg"
124a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	pack $w.l
125a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	update
126a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$env(BMESG) > 1} {
127a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		for {set i 0} {$i < $env(BMESG)} {incr i} {
128a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			after 1000
129a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			update
130a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
131a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
132a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
133a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
134a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc do_connect_http {sock hostport which} {
135a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global debug cur_proxy
136a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set con ""
137a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	append con "CONNECT $hostport HTTP/1.1\r\n"
138a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	append con "Host: $hostport\r\n"
139a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	append con "Connection: close\r\n\r\n"
140a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
141a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts stderr "pxy=$which CONNECT $hostport HTTP/1.1 via $cur_proxy"
142a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg "H: $which CONNECT $hostport HTTP/1.1 $cur_proxy";
143a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
144a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $sock $con
145a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	flush $sock
146a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
147a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set r ""
148a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set cnt 0
149a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	while {1} {
150a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		incr cnt
151a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set c [read $sock 1]
152a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$c == ""} {
153a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			check_closed
154a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			after 20
155a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
156a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		append r $c
157a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {[regexp "\r\n\r\n" $r] || [regexp "a--no--\n\n" $r]} {
158a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			break
159a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
160a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$cnt > 30000} {
161a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			break
162a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
163a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
164a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {! [regexp {HTTP/.* 200} $r]} {
165a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "did not find HTTP 200 #1"
166a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .
167a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		exit 1
168a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
169a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
170a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
171a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc do_connect_socks4 {sock hostport which} {
172a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global debug cur_proxy
173a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
174a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set host ""
175a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set port ""
176a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [regexp {^(.*):([0-9][0-9]*)$} $hostport mvar host port] {
177a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		;
178a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} else {
179a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "could not parse host:port $hostport"
180a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .
181a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		exit 1
182a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
183a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
184a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set i1 ""
185a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set i2 ""
186a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set i3 ""
187a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set i4 ""
188a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
189a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set socks4a 0
190a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
191a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$host == "localhost" || $host == "127.0.0.1"} {
192a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set i1 127
193a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set i2 0
194a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set i3 0
195a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set i4 1
196a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
197a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [regexp {^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$} $host] {
198a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set n [split $host "."]
199a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set i1 [lindex $n 0]
200a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set i2 [lindex $n 1]
201a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set i3 [lindex $n 2]
202a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set i4 [lindex $n 3]
203a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} else {
204a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set i1 0
205a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set i2 0
206a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set i3 0
207a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set i4 3
208a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
209a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set socks4a 1
210a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
211a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
212a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$socks4a} {
213a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "pxy=$which socks4a connection to $host:$port via $cur_proxy"
214a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} else {
215a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "pxy=$which socks4  connection to $host:$port via $cur_proxy"
216a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
217a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
218a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set p1 [binary format ccScccc 4 1 $port $i1 $i2 $i3 $i4]
219a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set p2 "nobody"
220a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set p3 [binary format c 0]
221a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
222a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $sock $p1
223a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $sock $p2
224a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $sock $p3
225a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$socks4a} {
226a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts -nonewline $sock $host
227a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts -nonewline $sock $p3
228a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
229a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	flush $sock
230a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
231a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set r ""; set s ""; set i 0; set cnt 0
232a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set ok 1
233a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	while {$cnt < 30000 && $i < 8} {
234a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		incr cnt
235a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set c [read $sock 1]
236a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$c == ""} {
237a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			check_closed
238a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			after 20
239a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			continue
240a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
241a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
242a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		binary scan $c c s
243a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$i == 0 && $s != 0} {
244a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "socks4: $i - $s"
245a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set ok 0
246a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
247a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$i == 1 && $s != 90} {
248a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "socks4: $i - $s"
249a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set ok 0
250a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
251a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set r "$r,$s"
252a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		incr i
253a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
254a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {! $ok} {
255a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "socks4 failure: $r"
256a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .
257a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		exit 1
258a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
259a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
260a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
261a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc do_connect_socks5 {sock hostport which} {
262a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global debug cur_proxy
263a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
264a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set host ""
265a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set port ""
266a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [regexp {^(.*):([0-9][0-9]*)$} $hostport mvar host port] {
267a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		;
268a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} else {
269a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "could not parse host:port $hostport"
270a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .
271a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		exit 1
272a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
273a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
274a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set p1 [binary format ccc 5 1 0]
275a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $sock $p1
276a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	flush $sock
277a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
278a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set r ""; set s ""; set i 0; set cnt 0
279a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set ok 1
280a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	while {$cnt < 30000 && $i < 2} {
281a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		incr cnt
282a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set c [read $sock 1]
283a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$c == ""} {
284a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			check_closed
285a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			after 20
286a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			continue
287a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
288a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
289a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		binary scan $c c s
290a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$i == 0 && $s != 5} {
291a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "$i - $s"
292a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set ok 0
293a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
294a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$i == 1 && $s != 0} {
295a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "$i - $s"
296a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set ok 0
297a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
298a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set r "$r,$s"
299a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		incr i
300a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
301a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {! $ok} {
302a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "socks5 failure: $r"
303a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .
304a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		exit 1
305a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
306a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
307a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set len [string length $host]
308a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set p1 [binary format ccccc 5 1 0 3 $len]
309a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set p2 $host
310a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
311a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set n1 [expr int($port/256)]
312a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set n2 [expr "$port - $n1 * 256"]
313a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set p3 [binary format cc $n1 $n2]
314a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
315a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts stderr "pxy=$which socks5  connection to $host:$port via $cur_proxy"
316a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
317a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $sock $p1
318a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $sock $p2
319a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $sock $p3
320a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	flush $sock
321a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
322a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set i1 ""; set i2 ""; set i3 ""; set i4 ""
323a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set r ""; set s ""; set i 0; set cnt 0
324a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set ok 1
325a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	while {$cnt < 30000 && $i < 4} {
326a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		incr cnt
327a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set c [read $sock 1]
328a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$c == ""} {
329a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			check_closed
330a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			after 20
331a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			continue
332a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
333a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
334a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		binary scan $c c s
335a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$i == 0} {
336a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set i1 $s
337a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} elseif {$i == 1} {
338a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set i2 $s
339a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} elseif {$i == 2} {
340a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set i3 $s
341a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} elseif {$i == 3} {
342a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set i4 $s
343a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
344a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		incr i
345a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
346a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set r "i1=$i1,i2=$i2,i3=$i3,i4=$i4"
347a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
348a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$i4 == 1} {
349a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set n 6
350a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif {$i4 == 3} {
351a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set c ""
352a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		for {set i 0} {$i < 1000} {incr i} {
353a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set c [read $sock 1]
354a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if {$c == ""} {
355a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				check_closed
356a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				after 20
357a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				continue
358a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
359a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			break;
360a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
361a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$c == ""} {
362a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "socks5 failure c: $r"
363a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			destroy .
364a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			exit 1
365a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
366a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		binary scan $c c s
367a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set n [expr $s + 2]
368a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif {$i4 == 4} {
369a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set n 18
370a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} else {
371a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "socks5 failure x: $r"
372a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .
373a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		exit 1
374a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
375a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	#puts "n=$n --- $r"
376a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
377a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set i 0; set cnt 0
378a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	while {$cnt < 30000 && $i < $n} {
379a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		incr cnt
380a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set c [read $sock 1]
381a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$c == ""} {
382a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			check_closed
383a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			after 20
384a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			continue
385a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
386a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		incr i
387a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
388a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$i1 != 5 || $i2 != 0 || $i3 != 0} {
389a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "socks failure $r"
390a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .
391a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		exit 1
392a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
393a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
394a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
395a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc do_connect_repeater {sock hostport which repeater} {
396a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global debug cur_proxy
397a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
398a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	# 250 is UltraVNC buffer size.
399a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set con [binary format a250 $repeater]
400a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
401a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts stderr "pxy=$which REPEATER $repeater via $cur_proxy"
402a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg "R: $which CONNECT $hostport | $repeater $cur_proxy";
403a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
404a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $sock $con
405a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	flush $sock
406a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
407a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set r ""
408a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set cnt 0
409a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	while {1} {
410a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		incr cnt
411a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set c [read $sock 1]
412a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$c == ""} {
413a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			check_closed
414a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			after 20
415a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
416a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		append r $c
417a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {[string length $r] >= 12} {
418a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "do_connect_repeater: $r"
419a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			break
420a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
421a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$cnt > 30000} {
422a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			break
423a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
424a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
425a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
426a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
427a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc vread {n sock} {
428a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set str ""
429a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set max 3000
430a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set dt 10
431a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set i 0
432a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set cnt 0
433a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	while {$cnt < $max && $i < $n} {
434a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		incr cnt
435a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set c [read $sock 1]
436a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$c == ""} {
437a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			check_closed
438a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			after $dt
439a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			continue
440a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
441a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		incr i
442a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		append str $c
443a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
444a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$i != $n} {
445a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "vread failure $n  $i"
446a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .; exit 1
447a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
448a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	return $str
449a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
450a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
451a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc append_handshake {str} {
452a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global env
453a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [info exists env(SSVNC_PREDIGESTED_HANDSHAKE)] {
454a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set file $env(SSVNC_PREDIGESTED_HANDSHAKE)
455a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set fh ""
456a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		catch {set fh [open $file a]}
457a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$fh != ""} {
458a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts $fh $str
459a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			catch {close $fh}
460a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
461a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
462a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
463a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
464a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc vencrypt_bridge_connection {fh host port} {
465a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts stderr "vencrypt_bridge_connection: got connection $fh $host $port"
466a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg       "vencrypt_bridge_connection: got connection $fh $host $port"
467a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global viewer_sock
468a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set viewer_sock $fh
469a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
470a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
471a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc center_win {w} {
472a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	update
473a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set W [winfo screenwidth  $w]
474a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set W [expr $W + 1]
475a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	wm geometry $w +$W+0
476a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	update
477a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set x [expr [winfo screenwidth  $w]/2 - [winfo width  $w]/2]
478a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set y [expr [winfo screenheight $w]/2 - [winfo height $w]/2]
479a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
480a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	wm geometry $w +$x+$y
481a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	wm deiconify $w
482a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	update
483a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
484a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
485a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
486a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc get_user_pass {} {
487a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global env
488a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set up ""
489a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [info exists env(SSVNC_UNIXPW)] {
490a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rm 0
491a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set up $env(SSVNC_UNIXPW)
492a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if [regexp {^rm:} $up]  {
493a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set rm 1
494a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			regsub {^rm:} $up "" up
495a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
496a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if [file exists $up] {
497a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set fh ""
498a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set f $up
499a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			catch {set fh [open $up r]}
500a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if {$fh != ""} {
501a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				gets $fh u
502a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				gets $fh p
503a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				catch {close $fh}
504a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				set up "$u@$p"
505a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
506a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if {$rm} {
507a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				catch {file delete $f}
508a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
509a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
510a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [info exists env(SSVNC_VENCRYPT_USERPASS)] {
511a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set up $env(SSVNC_VENCRYPT_USERPASS)
512a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
513a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$up != ""} {
514a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return $up
515a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
516a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
517a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	toplevel .t
518a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	wm title .t {VeNCrypt Viewer Bridge User/Pass}
519a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
520a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global user pass
521a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set user ""
522a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set pass ""
523a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	label .t.l -text {SSVNC VeNCrypt Viewer Bridge}
524a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
525a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	frame .t.f0
526a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	frame .t.f0.fL
527a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	label .t.f0.fL.la -text {Username: }
528a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	label .t.f0.fL.lb -text {Password: }
529a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
530a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	pack .t.f0.fL.la .t.f0.fL.lb -side top
531a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
532a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	frame .t.f0.fR
533a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	entry .t.f0.fR.ea -width 24 -textvariable user
534a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	entry .t.f0.fR.eb -width 24 -textvariable pass -show *
535a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
536a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	pack .t.f0.fR.ea .t.f0.fR.eb -side top -fill x
537a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
538a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	pack .t.f0.fL -side left
539a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	pack .t.f0.fR -side right -expand 1 -fill x
540a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
541a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	button .t.no -text Cancel -command {set user ""; set pass ""; destroy .t}
542a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	button .t.ok -text Done   -command {destroy .t}
543a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
544a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	center_win .t
545a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	pack .t.l .t.f0 .t.no .t.ok -side top -fill x
546a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	update
547a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	wm deiconify .t
548a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
549a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bind .t.f0.fR.ea <Return> {focus .t.f0.fR.eb}
550a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bind .t.f0.fR.eb <Return> {destroy .t}
551a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	focus .t.f0.fR.ea
552a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
553a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	wm resizable .t 1 0
554a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	wm minsize .t [winfo reqwidth .t] [winfo reqheight .t]
555a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
556a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	tkwait window .t
557a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$user == "" || $pass == ""} {
558a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return ""
559a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} else {
560a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return "$user@$pass"
561a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
562a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
563a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
564a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc do_vencrypt_viewer_bridge {listen connect} {
565a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global env
566a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
567a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	#set env(BMESG) 1
568a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
569a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	vencrypt_constants
570a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
571a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set backwards 0
572a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
573a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {! [info exists env(SSVNC_PREDIGESTED_HANDSHAKE)]} {
574a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "no SSVNC_PREDIGESTED_HANDSHAKE filename in environment."
575a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .; exit 1
576a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
577a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set handshake $env(SSVNC_PREDIGESTED_HANDSHAKE)
578a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg $handshake
579a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
580a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$listen < 0} {
581a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set backwards 1
582a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set listen [expr -$listen]
583a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
584a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
585a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	# listen on $listen
586a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global viewer_sock
587a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set viewer_sock ""
588a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set lsock ""
589a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set rc [catch {set lsock [socket -myaddr 127.0.0.1 -server vencrypt_bridge_connection $listen]}]
590a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$rc != 0} {
591a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "error listening on 127.0.0.1:$listen"
592a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .; exit 1
593a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
594a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg "listen on $listen OK"
595a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
596a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	# accept
597a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	vwait viewer_sock
598a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	catch {close $lsock}
599a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	fconfigure $viewer_sock -translation binary -blocking 0
600a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
601a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global got_connection
602a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set got_connection 1
603a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
604a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	# connect to $connect
605a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set server_sock ""
606a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set rc [catch {set server_sock [socket 127.0.0.1 $connect]}]
607a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$rc != 0} {
608a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "error connecting to 127.0.0.1:$connect"
609a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .; exit 1
610a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
611a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg "made connection to $connect"
612a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	fconfigure $server_sock -translation binary -blocking 0
613a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
614a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$backwards} {
615a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "reversing roles of viewer and server"
616a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set t $viewer_sock
617a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set viewer_sock $server_sock
618a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set server_sock $t
619a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
620a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
621a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	# wait for SSVNC_PREDIGESTED_HANDSHAKE "done", put in hash.
622a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set dt 200
623a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set slept 0
624a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set maxwait 20000
625a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set hs(mode) init
626a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	while {$slept < $maxwait} {
627a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		after $dt
628a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set slept [expr $slept + $dt]
629a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set done 0
630a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set fh ""
631a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		catch {set fh [open $handshake r]}
632a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set str ""
633a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$fh != ""} {
634a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			array unset hs
635a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			while {[gets $fh line] > -1} {
636a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				set line [string trim $line]
637a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				set str "$str$line\n";
638a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				if {$line == "done"} {
639a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat					set done 1
640a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				} elseif [regexp {=} $line] {
641a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat					set s [split $line "="]
642a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat					set key [lindex $s 0]
643a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat					set val [lindex $s 1]
644a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat					set hs($key) $val
645a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				}
646a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
647a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			catch {close $fh}
648a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
649a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$done} {
650a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr $str
651a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			bmesg "$str"
652a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			break
653a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
654a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
655a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
656a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	catch [file delete $handshake]
657a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
658a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {! [info exists hs(sectype)]} {
659a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "no hs(sectype) found"
660a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .; exit 1
661a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
662a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
663a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	# read viewer RFB
664a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {! [info exists hs(server)]} {
665a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set hs(server) "RFB 003.008"
666a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
667a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $viewer_sock "$hs(server)\n"
668a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	flush $viewer_sock
669a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts stderr "sent $hs(server) to viewer sock."
670a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
671a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set viewer_rfb [vread 12 $viewer_sock]
672a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts stderr "read viewer_rfb $viewer_rfb"
673a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
674a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set viewer_major 3
675a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set viewer_minor 8
676a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [regexp {^RFB 003\.0*([0-9][0-9]*)} $viewer_rfb m v] {
677a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set viewer_minor $v
678a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
679a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
680a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$hs(sectype) == $rfbSecTypeAnonTls} {
681a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "handling rfbSecTypeAnonTls"
682a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$viewer_major > 3 || $viewer_minor >= 7} {
683a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "viewer >= 3.7, nothing to set up."
684a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} else {
685a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "viewer <= 3.3, faking things up."
686a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set t [vread 1 $server_sock]
687a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			binary scan $t c nsectypes
688a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "nsectypes=$nsectypes"
689a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			for {set i 0} {$i < $nsectypes} {incr i} {
690a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				set t [vread 1 $server_sock]
691a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				binary scan $t c st
692a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				puts stderr "   $i: $st"
693a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				set types($st) $i
694a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
695a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set use 1
696a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if [info exists types(1)] {
697a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				set use 1
698a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			} elseif [info exists types(2)] {
699a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				set use 2
700a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			} else {
701a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				puts stderr "no valid sectypes"
702a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				destroy .; exit 1
703a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
704a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			# this should be MSB:
705a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $viewer_sock 0
706a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $viewer_sock 0
707a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $viewer_sock 0
708a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $viewer_sock $use
709a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
710a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $server_sock $use
711a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if {$use == 1} {
712a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				set t [vread 4 $server_sock]
713a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
714a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
715a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif {$hs(sectype) == $rfbSecTypeVencrypt} {
716a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "handling rfbSecTypeVencrypt"
717a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {! [info exists hs(subtype)]} {
718a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "no subtype"
719a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			destroy .; exit 1
720a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
721a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set fake_type "None"
722a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set plain 0
723a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
724a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set sub_type $hs(subtype)
725a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
726a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
727a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$sub_type == $rfbVencryptTlsNone} {
728a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set fake_type "None"
729a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} elseif {$sub_type == $rfbVencryptTlsVnc} {
730a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set fake_type "VncAuth"
731a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} elseif {$sub_type == $rfbVencryptTlsPlain} {
732a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set fake_type "None"
733a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set plain 1
734a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} elseif {$sub_type == $rfbVencryptX509None} {
735a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set fake_type "None"
736a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} elseif {$sub_type == $rfbVencryptX509Vnc} {
737a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set fake_type "VncAuth"
738a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} elseif {$sub_type == $rfbVencryptX509Plain} {
739a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set fake_type "None"
740a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set plain 1
741a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
742a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
743a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$plain} {
744a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set up [get_user_pass]
745a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if [regexp {@} $up] {
746a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				set user $up
747a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				set pass $up
748a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				regsub {@.*$}  $user "" user
749a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				regsub {^[^@]*@} $pass "" pass
750a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				vsend_uchar $server_sock 0
751a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				vsend_uchar $server_sock 0
752a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				vsend_uchar $server_sock 0
753a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				vsend_uchar $server_sock [string length $user]
754a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				vsend_uchar $server_sock 0
755a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				vsend_uchar $server_sock 0
756a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				vsend_uchar $server_sock 0
757a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				vsend_uchar $server_sock [string length $pass]
758a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				puts stderr "sending VencryptPlain user and pass."
759a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				puts -nonewline $server_sock $user
760a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				puts -nonewline $server_sock $pass
761a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				flush $server_sock
762a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
763a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
764a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set ft 0
765a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$fake_type == "None"} {
766a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set ft 1
767a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} elseif {$fake_type == "VncAuth"} {
768a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set ft 2
769a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} else {
770a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "no valid fake_type"
771a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			destroy .; exit 1
772a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
773a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
774a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$viewer_major > 3 || $viewer_minor >= 7} {
775a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $viewer_sock 1
776a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $viewer_sock $ft
777a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set t [vread 1 $viewer_sock]
778a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			binary scan $t c cr
779a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if {$cr != $ft} {
780a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				puts stderr "client selected wront type $cr $ft"
781a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				destroy .; exit 1
782a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
783a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} else {
784a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "viewer <= 3.3, faking things up."
785a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			# this should be MSB:
786a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $viewer_sock 0
787a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $viewer_sock 0
788a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $viewer_sock 0
789a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $viewer_sock $ft
790a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
791a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			if {$ft == 1} {
792a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				set t [vread 4 $server_sock]
793a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
794a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
795a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
796a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
797a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global client_fh server_fh
798a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set client_fh $viewer_sock
799a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set server_fh $server_sock
800a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
801a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	fileevent $client_fh readable xfer_in_to_out
802a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	fileevent $server_fh readable xfer_out_to_in
803a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
804a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
805a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc vsend_uchar {sock n} {
806a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set s [binary format c $n]
807a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $sock $s
808a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	flush $sock
809a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
810a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
811a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc vencrypt_constants {} {
812a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	uplevel {
813a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rfbSecTypeAnonTls  18
814a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rfbSecTypeVencrypt 19
815a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
816a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rfbVencryptPlain        256
817a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rfbVencryptTlsNone      257
818a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rfbVencryptTlsVnc       258
819a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rfbVencryptTlsPlain     259
820a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rfbVencryptX509None     260
821a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rfbVencryptX509Vnc      261
822a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rfbVencryptX509Plain    262
823a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
824a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
825a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
826a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc do_vencrypt {sock which} {
827a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
828a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	vencrypt_constants
829a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
830a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set t [vread 1 $sock]
831a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	binary scan $t c vs_major
832a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set t [vread 1 $sock]
833a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	binary scan $t c vs_minor
834a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
835a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$vs_minor == "" || $vs_major == "" || $vs_major != 0 || $vs_minor < 2} {
836a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "vencrypt failure bad vs version major=$major minor=$minor"
837a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .; exit 1
838a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
839a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts stderr "server vencrypt version $vs_major.$vs_minor"
840a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg "server vencrypt version $vs_major.$vs_minor"
841a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
842a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	append_handshake "subversion=0.2"
843a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	vsend_uchar $sock 0
844a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	vsend_uchar $sock 2
845a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
846a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set t [vread 1 $sock]
847a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	binary scan $t c result
848a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$result != 0} {
849a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "vencrypt failed result: $result"
850a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		bmesg "vencrypt failed result: $result"
851a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .; exit 1
852a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
853a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
854a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set t [vread 1 $sock]
855a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	binary scan $t c nsubtypes
856a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts stderr "nsubtypes: $nsubtypes"
857a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg "nsubtypes: $nsubtypes"
858a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
859a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	for {set i 0} {$i < $nsubtypes} {incr i} {
860a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set t [vread 4 $sock]
861a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		binary scan $t I stype
862a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "subtypes: $i: $stype"
863a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		append_handshake "sst$i=$stype"
864a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set subtypes($stype) $i
865a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
866a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
867a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set subtype 0
868a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [info exists subtypes($rfbVencryptX509None)] {
869a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set subtype $rfbVencryptX509None
870a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "selected rfbVencryptX509None"
871a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [info exists subtypes($rfbVencryptX509Vnc)] {
872a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set subtype $rfbVencryptX509Vnc
873a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "selected rfbVencryptX509Vnc"
874a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [info exists subtypes($rfbVencryptX509Plain)] {
875a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set subtype $rfbVencryptX509Plain
876a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "selected rfbVencryptX509Plain"
877a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [info exists subtypes($rfbVencryptTlsNone)] {
878a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set subtype $rfbVencryptTlsNone
879a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "selected rfbVencryptTlsNone"
880a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [info exists subtypes($rfbVencryptTlsVnc)] {
881a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set subtype $rfbVencryptTlsVnc
882a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "selected rfbVencryptTlsVnc"
883a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [info exists subtypes($rfbVencryptTlsPlain)] {
884a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set subtype $rfbVencryptTlsPlain
885a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "selected rfbVencryptTlsPlain"
886a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
887a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	append_handshake "subtype=$subtype"
888a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set st [binary format I $subtype]
889a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $sock $st
890a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	flush $sock
891a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
892a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$subtype == 0} {
893a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "vencrypt could not find an acceptable subtype: $subtype"
894a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .; exit 1
895a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
896a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
897a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set t [vread 1 $sock]
898a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	binary scan $t c result
899a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts stderr "result=$result"
900a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
901a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	append_handshake "done"
902a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
903a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$result == 0} {
904a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "vencrypt failure result: $result"
905a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .; exit 1
906a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
907a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
908a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
909a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
910a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc do_connect_vencrypt {sock hostport which} {
911a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global debug cur_proxy
912a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
913a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	vencrypt_constants
914a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
915a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts stderr "pxy=$which vencrypt $hostport via $cur_proxy"
916a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg "V: $which vencrypt $hostport via $cur_proxy"
917a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
918a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	append_handshake "mode=connect"
919a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
920a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set srfb [vread 12 $sock]
921a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts stderr "srfb: $srfb"
922a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg "srfb: $srfb"
923a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set srfb [string trim $srfb]
924a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	append_handshake "server=$srfb"
925a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
926a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set minor ""
927a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [regexp {^RFB 00[456]\.} $srfb] {
928a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set minor 8
929a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [regexp {^RFB 003\.0*([0-9][0-9]*)} $srfb mvar minor] {
930a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		;
931a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
932a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$minor == "" || $minor < 7} {
933a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "vencrypt failure bad minor=$minor"
934a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .; exit 1
935a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
936a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
937a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set vrfb "RFB 003.008\n"
938a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$minor == 7} {
939a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set vrfb "RFB 003.007\n"
940a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
941a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts -nonewline $sock $vrfb
942a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	flush $sock
943a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
944a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set vrfb [string trim $vrfb]
945a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	append_handshake "viewer=$vrfb"
946a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	append_handshake "latency=0.10"
947a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
948a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set str [vread 1 $sock]
949a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	binary scan $str c nsec
950a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	puts stderr "nsec: $nsec"
951a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg "nsec: $nsec"
952a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	for {set i 0} {$i < $nsec} {incr i} {
953a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set str [vread 1 $sock]
954a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		binary scan $str c sec
955a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "sec: $sec"
956a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		bmesg "sec: $sec"
957a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set sectypes($i) $sec
958a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
959a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	for {set i 0} {$i < $nsec} {incr i} {
960a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$sectypes($i) == $rfbSecTypeVencrypt} {
961a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			append_handshake "sectype=$rfbSecTypeVencrypt"
962a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $sock $rfbSecTypeVencrypt
963a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			after 500
964a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			bmesg "do_vencrypt $sock $which"
965a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			do_vencrypt $sock $which
966a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			return
967a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
968a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
969a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	for {set i 0} {$i < $nsec} {incr i} {
970a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$sectypes($i) == $rfbSecTypeAnonTls} {
971a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			append_handshake "sectype=$rfbSecTypeAnonTls"
972a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			vsend_uchar $sock $rfbSecTypeAnonTls
973a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			bmesg "rfbSecTypeAnonTls"
974a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			after 500
975a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			append_handshake "done"
976a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			return
977a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
978a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
979a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
980a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
981a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc do_connect {sock type hostport which} {
982a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$type == "http"} 	{
983a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		do_connect_http $sock $hostport $which
984a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif {$type == "socks"} {
985a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		do_connect_socks4 $sock $hostport $which
986a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif {$type == "socks5"} {
987a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		do_connect_socks5 $sock $hostport $which
988a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [regexp -nocase {^repeater:} $type] {
989a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		regsub -nocase {^repeater:} $type "" repeater
990a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		do_connect_repeater $sock $hostport $which $repeater
991a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif {$type == "vencrypt"} {
992a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		do_connect_vencrypt $sock $hostport $which
993a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
994a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
995a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
996a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc handle_connection {fh host port} {
997a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global proxy1_host proxy1_port proxy1_type
998a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global proxy2_host proxy2_port proxy2_type
999a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global proxy3_host proxy3_port proxy3_type
1000a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global proxy1 proxy2 proxy3 dest
1001a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global debug cur_proxy
1002a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global got_connection
1003a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1004a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$got_connection} {
1005a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		catch {close $fh}
1006a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return
1007a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1008a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set got_connection 1
1009a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1010a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$debug} {
1011a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "connection from: $host $port"
1012a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "socket $proxy1_host $proxy1_port"
1013a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1014a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1015a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set rc [catch {set sock [socket $proxy1_host $proxy1_port]}]
1016a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$rc != 0} {
1017a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "error connecting"
1018a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		catch {close $sock}
1019a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .
1020a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		exit
1021a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1022a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1023a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$debug} {
1024a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "got sock: $sock"
1025a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1026a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1027a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global client_fh server_fh
1028a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set client_fh $fh
1029a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set server_fh $sock
1030a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1031a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	fconfigure $fh   -translation binary -blocking 0
1032a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	fconfigure $sock -translation binary -blocking 0
1033a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1034a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set cur_proxy $proxy1
1035a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$proxy2 != ""} {
1036a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		do_connect $sock $proxy1_type "$proxy2_host:$proxy2_port" 1
1037a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1038a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set cur_proxy $proxy2
1039a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$proxy3 != ""} {
1040a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			do_connect $sock $proxy2_type "$proxy3_host:$proxy3_port" 2
1041a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1042a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set cur_proxy $proxy3
1043a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			do_connect $sock $proxy3_type $dest 3
1044a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1045a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} else {
1046a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			do_connect $sock $proxy2_type $dest 2
1047a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1048a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} else {
1049a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		do_connect $sock $proxy1_type $dest 1
1050a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1051a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1052a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	fileevent $fh   readable xfer_in_to_out
1053a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	fileevent $sock readable xfer_out_to_in
1054a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
1055a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1056a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc proxy_type {proxy} {
1057a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [regexp -nocase {^socks://} $proxy] {
1058a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return "socks"
1059a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [regexp -nocase {^socks4://} $proxy] {
1060a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return "socks"
1061a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [regexp -nocase {^socks4a://} $proxy] {
1062a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return "socks"
1063a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [regexp -nocase {^socks5://} $proxy] {
1064a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return "socks5"
1065a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [regexp -nocase {^http://} $proxy] {
1066a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return "http"
1067a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [regexp -nocase {^https://} $proxy] {
1068a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return "http"
1069a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [regexp -nocase {^repeater://.*\+(.*)$} $proxy mat idstr] {
1070a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return "repeater:$idstr"
1071a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} elseif [regexp -nocase {^vencrypt://} $proxy] {
1072a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return "vencrypt"
1073a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} else {
1074a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		return "http"
1075a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1076a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
1077a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1078a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc proxy_hostport {proxy} {
1079a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	regsub -nocase {^[a-z][a-z0-9]*://} $proxy "" hp
1080a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	regsub {\+.*$} $hp "" hp
1081a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {! [regexp {:[0-9]} $hp] && [regexp {^repeater:} $proxy]} {
1082a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set hp "$hp:5900"
1083a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1084a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	return $hp
1085a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
1086a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1087a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc setb {} {
1088a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	wm withdraw .
1089a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	catch {destroy .b}
1090a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	button .b -text "CONNECT_BR" -command {destroy .}
1091a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	pack .b
1092a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	after 1000 check_callback
1093a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
1094a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1095a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatproc connect_br_sleep {} {
1096a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	global env
1097a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [info exists env(CONNECT_BR_SLEEP)] {
1098a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if [regexp {^[0-9][0-9]*$} $env(CONNECT_BR_SLEEP)] {
1099a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			setb
1100a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			for {set i 0} {$i < $env(CONNECT_BR_SLEEP)} {incr i} {
1101a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				bmesg "$i sleep"
1102a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat				after 1000
1103a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			}
1104a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1105a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1106a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
1107a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1108a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatglobal env
1109a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1110a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatset got_connection 0
1111a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatset proxy1 ""
1112a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatset proxy2 ""
1113a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatset proxy3 ""
1114a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatset client_fh ""
1115a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatset server_fh ""
1116a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatset do_bridge 0
1117a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatset debug 0
1118a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1119a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatif [info exists env(CONNECT_BR_DEBUG)] {
1120a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set debug 1
1121a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
1122a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1123a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatif [info exists env(SSVNC_VENCRYPT_VIEWER_BRIDGE)] {
1124a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set s [split $env(SSVNC_VENCRYPT_VIEWER_BRIDGE) ","]
1125a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set listen  [lindex $s 0]
1126a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set connect [lindex $s 1]
1127a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1128a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	setb
1129a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1130a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	do_vencrypt_viewer_bridge $listen $connect
1131a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set do_bridge 1
1132a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
1133a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1134a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatif {$do_bridge} {
1135a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	;
1136a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} else {
1137a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$debug && 0} {
1138a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {! [info exists env(SSVNC_DEST)]} {
1139a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set env(SSVNC_DEST) "haystack:2037"
1140a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1141a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {! [info exists env(SSVNC_PROXY)]} {
1142a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set env(SSVNC_PROXY) "haystack:2037"
1143a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1144a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {! [info exists env(SSVNC_LISTEN)]} {
1145a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set env(SSVNC_LISTEN) "6789"
1146a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1147a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} else {
1148a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {! [info exists env(SSVNC_DEST)]} {
1149a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			destroy .; exit;
1150a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1151a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {! [info exists env(SSVNC_PROXY)]} {
1152a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			destroy .; exit;
1153a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1154a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {! [info exists env(SSVNC_LISTEN)] && ! [info exists env(SSVNC_REVERSE)]} {
1155a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			destroy .; exit;
1156a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1157a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1158a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1159a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	#set env(BMESG) 1
1160a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1161a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set dest $env(SSVNC_DEST)
1162a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1163a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [regexp {,} $env(SSVNC_PROXY)] {
1164a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set s [split $env(SSVNC_PROXY) ","]
1165a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set proxy1 [lindex $s 0]
1166a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set proxy2 [lindex $s 1]
1167a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set proxy3 [lindex $s 2]
1168a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} else {
1169a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set proxy1 $env(SSVNC_PROXY)
1170a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1171a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1172a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set proxy1_type [proxy_type     $proxy1]
1173a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set proxy1_hp   [proxy_hostport $proxy1]
1174a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1175a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set proxy1_host ""
1176a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set proxy1_port ""
1177a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [regexp {^(.*):([0-9][0-9]*)$} $proxy1_hp mvar proxy1_host proxy1_port] {
1178a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		;
1179a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} else {
1180a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "could not parse hp1 host:port $proxy1_hp"
1181a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		destroy .
1182a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		exit 1
1183a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1184a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1185a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set proxy2_type ""
1186a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set proxy2_host ""
1187a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set proxy2_port ""
1188a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1189a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$proxy2 != ""} {
1190a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set proxy2_type [proxy_type     $proxy2]
1191a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set proxy2_hp   [proxy_hostport $proxy2]
1192a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1193a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set proxy2_host ""
1194a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set proxy2_port ""
1195a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if [regexp {^(.*):([0-9][0-9]*)$} $proxy2_hp mvar proxy2_host proxy2_port] {
1196a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			;
1197a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} else {
1198a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "could not parse hp2 host:port $proxy2_hp"
1199a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			destroy .
1200a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			exit 1
1201a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1202a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1203a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1204a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set proxy3_type ""
1205a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set proxy3_host ""
1206a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	set proxy3_port ""
1207a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1208a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if {$proxy3 != ""} {
1209a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set proxy3_type [proxy_type     $proxy3]
1210a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set proxy3_hp   [proxy_hostport $proxy3]
1211a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1212a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set proxy3_host ""
1213a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set proxy3_port ""
1214a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if [regexp {^(.*):([0-9][0-9]*)$} $proxy3_hp mvar proxy3_host proxy3_port] {
1215a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			;
1216a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} else {
1217a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "could not parse hp3 host:port $proxy3_hp"
1218a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			destroy .
1219a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			exit 1
1220a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1221a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1222a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1223a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg "1: '$proxy1_host' '$proxy1_port' '$proxy1_type'";
1224a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg "2: '$proxy2_host' '$proxy2_port' '$proxy2_type'";
1225a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	bmesg "3: '$proxy3_host' '$proxy3_port' '$proxy3_type'";
1226a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
1227a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if [info exists env(SSVNC_REVERSE)] {
1228a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rhost ""
1229a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rport ""
1230a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if [regexp {^(.*):([0-9][0-9]*)$} $env(SSVNC_REVERSE) mvar rhost rport] {
1231a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			;
1232a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		} else {
1233a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "could not parse SSVNC_REVERSE host:port $env(SSVNC_REVERSE)"
1234a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			destroy .
1235a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			exit 1
1236a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1237a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		setb
1238a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rc [catch {set lsock [socket $rhost $rport]}]
1239a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$rc != 0} {
1240a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "error reversing"
1241a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			bmesg "1 error reversing"
1242a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			after 2000
1243a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set rc [catch {set lsock [socket $rhost $rport]}]
1244a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1245a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$rc != 0} {
1246a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "error reversing"
1247a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			bmesg "2 error reversing"
1248a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			after 2000
1249a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			set rc [catch {set lsock [socket $rhost $rport]}]
1250a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1251a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$rc != 0} {
1252a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "error reversing"
1253a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			bmesg "3 error reversing"
1254a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			destroy .; exit 1
1255a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1256a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "SSVNC_REVERSE to $rhost $rport OK";
1257a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		bmesg "SSVNC_REVERSE to $rhost $rport OK";
1258a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		connect_br_sleep
1259a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		handle_connection $lsock $rhost $rport
1260a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	} else {
1261a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set lport $env(SSVNC_LISTEN)
1262a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		connect_br_sleep
1263a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		set rc [catch {set lsock [socket -myaddr 127.0.0.1 -server handle_connection $lport]}]
1264a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		if {$rc != 0} {
1265a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			puts stderr "error listening"
1266a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			destroy .; exit 1
1267a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		}
1268a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		puts stderr "SSVNC_LISTEN on $lport OK";
1269a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		setb
1270a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	}
1271a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
1272