diff options
Diffstat (limited to 'x11vnc/misc/enhanced_tightvnc_viewer/bin/util')
-rwxr-xr-x | x11vnc/misc/enhanced_tightvnc_viewer/bin/util/ss_vncviewer | 96 | ||||
-rwxr-xr-x | x11vnc/misc/enhanced_tightvnc_viewer/bin/util/ssvnc.tcl | 1105 |
2 files changed, 974 insertions, 227 deletions
diff --git a/x11vnc/misc/enhanced_tightvnc_viewer/bin/util/ss_vncviewer b/x11vnc/misc/enhanced_tightvnc_viewer/bin/util/ss_vncviewer index 9b456b2..75020df 100755 --- a/x11vnc/misc/enhanced_tightvnc_viewer/bin/util/ss_vncviewer +++ b/x11vnc/misc/enhanced_tightvnc_viewer/bin/util/ss_vncviewer @@ -229,6 +229,22 @@ do ;; "-grab") VNCVIEWER_GRAB_SERVER=1; export VNCVIEWER_GRAB_SERVER ;; + "-x11cursor") VNCVIEWER_X11CURSOR=1; export VNCVIEWER_X11CURSOR + ;; + "-rawlocal") VNCVIEWER_RAWLOCAL=1; export VNCVIEWER_RAWLOCAL + ;; + "-scale") shift; SSVNC_SCALE="$1"; export SSVNC_SCALE + ;; + "-ssvnc_encodings") shift; VNCVIEWER_ENCODINGS="$1"; export VNCVIEWER_ENCODINGS + ;; + "-rfbversion") shift; VNCVIEWER_RFBVERSION="$1"; export VNCVIEWER_RFBVERSION + ;; + "-nobell") VNCVIEWER_NOBELL=1; export VNCVIEWER_NOBELL + ;; + "-popupfix") VNCVIEWER_POPUP_FIX=1; export VNCVIEWER_POPUP_FIX + ;; + "-realvnc4") VNCVIEWER_IS_REALVNC4=1; export VNCVIEWER_IS_REALVNC4 + ;; "-h"*) help; exit 0 ;; "--h"*) help; exit 0 @@ -273,6 +289,7 @@ if [ "X$reverse" != "X" ]; then echo "*Warning*: -listen and a single proxy/gateway does not make sense." sleep 3 fi + SSVNC_LISTEN_ONCE=1; export SSVNC_LISTEN_ONCE fi fi if [ "X$ssh_cmd" = "X" ]; then @@ -342,6 +359,9 @@ if [ "X$SSVNC_ULTRA_DSM" != "X" ]; then use_ssh="" use_sshssl="" direct_connect=1 + if echo "$SSVNC_ULTRA_DSM" | grep 'noultra:' > /dev/null; then + SSVNC_NO_ULTRA_DSM=1; export SSVNC_NO_ULTRA_DSM + fi fi # (possibly) tell the vncviewer to only listen on lo: @@ -1448,9 +1468,16 @@ Kecho proxy=$proxy echo "" echo "NOTE: Press Ctrl-C to terminate viewer LISTEN mode." echo "" - echo "$VNCVIEWERCMD" "$@" -listen $N + N2=$N + if [ "X$VNCVIEWER_IS_REALVNC4" = "X1" ]; then + N2=`echo "$N2" | sed -e 's/://g'` + if [ $N2 -le 200 ]; then + N2=`expr $N2 + 5500` + fi + fi + echo "$VNCVIEWERCMD" "$@" -listen $N2 echo "" - $VNCVIEWERCMD "$@" -listen $N + $VNCVIEWERCMD "$@" -listen $N2 fi exit $? @@ -1536,14 +1563,19 @@ if [ "X$direct_connect" != "X" ]; then echo "" echo "Using UltraVNC DSM Plugin key for encryption:" echo "" - echo " $SSVNC_ULTRA_DSM PORT HOST:PORT" + ustr=`echo "$SSVNC_ULTRA_DSM" | sed -e 's/pw=[^ ]*/pw=******/g'` + echo " $ustr PORT HOST:PORT" echo "" elif [ "X$getport" = "X" ]; then echo "" echo "Running viewer for direct connection:" - echo "" - echo "** NOTE: THERE WILL BE NO SSL OR SSH ENCRYPTION **" - echo "" + if echo X"$@" | grep chatonly > /dev/null; then + : + else + echo "" + echo "** NOTE: THERE WILL BE NO SSL OR SSH ENCRYPTION **" + echo "" + fi fi x="" if [ "X$SSVNC_NO_ENC_WARN" != "X" ]; then @@ -1594,9 +1626,25 @@ if [ "X$direct_connect" != "X" ]; then if [ "X$reverse" = "X" ]; then hostdisp="$host:$disp" if [ "X$SSVNC_ULTRA_DSM" != "X" ]; then - hostdisp="exec=$SSVNC_ULTRA_DSM 0 $host:$port" + if [ "X$SSVNC_USE_OURS" = "X1" ]; then + hostdisp="exec=$SSVNC_ULTRA_DSM 0 $host:$port" + else + pf=`findfree 5970` + cmd="$SSVNC_ULTRA_DSM -$pf $host:$port" + pf=`expr $pf - 5900` + hostdisp="localhost:$pf" + ustr=`echo "$cmd" | sed -e 's/pw=[^ ]*/pw=******/g'` + echo "Running:" + echo + echo "$ustr &" + echo + $cmd & + dsm_pid=$! + sleep 2 + fi fi - echo "$VNCVIEWERCMD" "$@" "$hostdisp" + hostdisp2=`echo "$hostdisp" | sed -e 's/pw=[^ ]*/pw=******/g'` + echo "$VNCVIEWERCMD" "$@" "$hostdisp2" trap "final" 0 2 15 echo "" $VNCVIEWERCMD "$@" "$hostdisp" @@ -1614,13 +1662,17 @@ if [ "X$direct_connect" != "X" ]; then trap "final" 0 2 15 if [ "X$SSVNC_ULTRA_DSM" != "X" ]; then echo "NOTE: The ultravnc_dsm_helper only runs once. So after the first LISTEN" - echo " ends, you will have to Press Ctrl-C and restart for a new connection." + echo " ends, you may have to Press Ctrl-C and restart for another connection." echo "" + SSVNC_LISTEN_ONCE=1; export SSVNC_LISTEN_ONCE + VNCVIEWER_LISTEN_LOCALHOST=1 + export VNCVIEWER_LISTEN_LOCALHOST dport=`expr 5500 + $disp` cmd="$SSVNC_ULTRA_DSM $dport localhost:$use" + ustr=`echo "$cmd" | sed -e 's/pw=[^ ]*/pw=******/g'` echo "Running:" echo - echo "$cmd &" + echo "$ustr &" echo $cmd & dsm_pid=$! @@ -1630,9 +1682,16 @@ if [ "X$direct_connect" != "X" ]; then disp=`expr $disp - 5500` fi fi - echo "$VNCVIEWERCMD" "$@" -listen $disp + disp2=$disp + if [ "X$VNCVIEWER_IS_REALVNC4" = "X1" ]; then + disp2=`echo "$disp2" | sed -e 's/://g'` + if [ $disp2 -le 200 ]; then + disp2=`expr $disp2 + 5500` + fi + fi + echo "$VNCVIEWERCMD" "$@" -listen $disp2 echo "" - $VNCVIEWERCMD "$@" -listen $disp + $VNCVIEWERCMD "$@" -listen $disp2 fi exit $? fi @@ -1793,7 +1852,7 @@ if [ "X$stunnel_exec" = "X" ]; then if [ "X$mycert" != "X" ]; then sleep 1 echo "" - echo "(pausing for possible certificate passphrase dialog)" + echo "(** pausing for possible certificate passphrase dialog **)" echo "" sleep 4 fi @@ -1829,7 +1888,14 @@ else echo "" echo "NOTE: Press Ctrl-C to terminate viewer LISTEN mode." echo "" - echo "$VNCVIEWERCMD" "$@" -listen $N + N2=$N + if [ "X$VNCVIEWER_IS_REALVNC4" = "X1" ]; then + N2=`echo "$N2" | sed -e 's/://g'` + if [ $N2 -le 200 ]; then + N2=`expr $N2 + 5500` + fi + fi + echo "$VNCVIEWERCMD" "$@" -listen $N2 trap "final" 0 2 15 echo "" if [ "X$proxy" != "X" ]; then @@ -1838,7 +1904,7 @@ else PPROXY_KILLPID=+1; export PPROXY_KILLPID; $ptmp & fi - $VNCVIEWERCMD "$@" -listen $N + $VNCVIEWERCMD "$@" -listen $N2 fi sleep 1 diff --git a/x11vnc/misc/enhanced_tightvnc_viewer/bin/util/ssvnc.tcl b/x11vnc/misc/enhanced_tightvnc_viewer/bin/util/ssvnc.tcl index 4ba5a86..9848362 100755 --- a/x11vnc/misc/enhanced_tightvnc_viewer/bin/util/ssvnc.tcl +++ b/x11vnc/misc/enhanced_tightvnc_viewer/bin/util/ssvnc.tcl @@ -8,7 +8,7 @@ exec wish "$0" "$@" # ssvnc.tcl: gui wrapper to the programs in this # package. Also sets up service port forwarding. # -set version 1.0.20 +set version 1.0.21 set buck_zero $argv0 @@ -362,9 +362,8 @@ proc help {} { and any VNC server can be made to do this by using, e.g., STUNNEL or socat on the remote side. - Automatic SSH tunnels are described below. - - See Tip 5) below for how to disable encryption. + * Automatic SSH Tunnels are described below. + * See Tip 5) below for how to Disable Encryption. Port numbers: @@ -380,6 +379,10 @@ proc help {} { If you must use a TCP port less than 200, specify a negative value, e.g.: 24.67.132.27:-80 + For Reverse VNC connections (listening viewer, See Tip 6 below and + Options -> Help), the port mapping is similar, except "listening + display :0" corresponds to port 5500, :1 to 5501, etc. + SSL Certificate Verification: @@ -828,14 +831,20 @@ proc help {} { For mode II when tunnelling via SSL, you probably should also disable "Verify All Certs" unless you have taken the steps beforehand to - import the VNC server's certificate, or have previously accepted it - using another method. With the mode II proxying scheme, there is - no way to "Fetch Cert" and check if it has been previously accepted. + import the VNC server's certificate, or have previously accepted + it using another method. With the mode II proxying scheme, there + is no way to do the initial "Fetch Cert" and check if it has been + previously accepted. + + Even when you disable "Verify All Certs", you are free to set a + ServerCert or CertsDir under "Certs ..." to authenticate the VNC + Server against. Also, after the connection you MUST terminate the listening VNC Viewer (Ctrl-C) and connect again (the proxy only runs once.) In Windows, go to the System Tray and terminate the Listening VNC Viewer. - Subsequent connection attempts after the first one will fail. + Subsequent connection attempts after the first one will fail unless + you return to the GUI and restart listening. BTW, the x11vnc VNC server command for the mode II case would be something like: @@ -910,10 +919,6 @@ proc help {} { port 5500). Then click on the "Listen" button and finally have the user run your Single Click III EXE. - For SC III, you will also need to enable the setting in the Options - menu "UltraVNC Single Click III Bug", otherwise the STUNNEL connection - may drop after 2-15 minutes. - Note that in Listening SSL mode you MUST supply a MyCert or use the "listen.pem" one you are prompted to create. @@ -996,21 +1001,52 @@ proc help {} { 4) Pressing the "Load" button or pressing Ctrl-L or Clicking the Right mouse button on the main GUI will invoke the Load dialog. - 5) If you want to do a Direct VNC connection, WITH **NO** SSL OR SSH - ENCRYPTION, use the "vnc://" prefix, e.g. vnc://far-away.east:0 - This also works for reverse connections (see below). + Pressing Ctrl-A on the main GUI will bring up the Advanced + Options Panel. + + 5) If you want to make a Direct VNC connection, WITH **NO** SSL OR + SSH ENCRYPTION, use the "vnc://" prefix in the VNC Host:Display + entry box, e.g. "vnc://far-away.east:0" This also works for + reverse connections (e.g. vnc://0 more info below). Use Vnc:// + to avoid being prompted if you are sure you want no encryption. + + Apologies that we do not make this easy to figure out how to do + (e.g. a button on the main panel), but the goal of SSVNC is + secure and encrypted connections! + + Often SSVNC is used to connect to x11vnc where the Unix username + and password is sent over the channel. It would be a very bad + idea to let that data be sent over an unencrypted connection. + In general, it is not wise to have a plaintext VNC connection. + + So we force you to learn about and supply the "vnc://" or "Vnc://" + prefix to the host:port to disable encryption rather than simply + click on an option and not think too much about the consequences. + + Note that even the VNC Password challenge-response method (the + password is not sent in plaintext) leaves your VNC password + susceptible a dictionary attack unless encryption is used. + + The prefix will be stored in any profile that you save so you + do not have to enter it every time. + + Set the env var SSVNC_NO_ENC_WARN=1 to skip the warning prompts. - Sorry we do not make this easy to figure out how to do (e.g. a - button on the main panel), but the goal of SSVNC is secure - connections! Set the env var SSVNC_NO_ENC_WARN=1 to skip the - warning prompts. Using capitalized: Vnc:// will also skip the - prompts. + Using capitalized: Vnc:// will also skip the prompts, for example, + "Vnc://far-away.east:0" in the VNC Host:Display entry box. - 6) Reverse VNC connections are possible as well. Go to Options and - select "Reverse VNC connection". In the 'VNC Host:Display' entry - box put in the number (e.g. "0" or ":0") that corresponds to the - Listening display (0 -> port 5500). See the Options Help for more - info. + 6) Reverse VNC connections (Listening) are possible as well. + In this case the VNC Server initiates the connection to your + waiting (i.e. listening) SSVNC viewer. + + Go to Options and select "Reverse VNC connection". In the 'VNC + Host:Display' entry box put in the number (e.g. "0" or ":0", or + ":1", etc) that corresponds to the Listening display (0 -> port + 5500, 1 -> port 5501, etc.) you want to use. Then clicking on + 'Listen' puts your SSVNC viewer in a "listening" state on that + port number, waiting for a connection from the VNC Server. + + See the Options Help for more info. 7) On Unix to have SSVNC act as a general STUNNEL redirector (i.e. no VNC), put the desired host:port in VNC Host:Display (use a @@ -1526,6 +1562,11 @@ set msg { Clicking on this button will return you to the full SSVNC Mode. + Unix ssvncviewer: + + Clicking on this button will popup a menu for setting options + of the Unix (and Mac OS X) provided SSVNC vncviewer. + ~/.ssvncrc file: @@ -1781,18 +1822,28 @@ set msg { Reverse VNC Connection: - Reverse (listening) VNC connections are possible. + Reverse (listening) VNC connections are possible as well. + + In this case the VNC Server initiates the connection to your + waiting (i.e. listening) SSVNC viewer. For SSL connections in the 'VNC Host:Display' entry box put in - the number (e.g. "0" or ":0") that corresponds to the Listening - display (0 -> port 5500). For example x11vnc can then be used: - "x11vnc ... -ssl SAVE -connect hostname:port". + the number (e.g. "0" or ":0" or ":1", etc.) that corresponds to + the Listening display (0 -> port 5500, 1 -> port 5501, etc.) you + want to use. For example x11vnc can then be used via: + "x11vnc ... -ssl SAVE -connect hostname:port" using the "port" + with the one you chose. + + Clicking on the 'Listen' button puts your SSVNC viewer + in a "listening" state on that port number, waiting for a + connection from the VNC Server. Then a VNC server should establish a reverse connection to - that port on this machine (e.g. -connect this-machine:5500) + that port on this machine (e.g. -connect this-machine:5500 + or -connect this-machine:5503, etc.) Server SSL certificates will be verified, however you WILL - NOTE be prompted about unrecognized ones; rather, you MUST + NOT be prompted about unrecognized ones; rather, you MUST set up the correct Server certificate (e.g. by importing). prior to any connections. @@ -1844,32 +1895,6 @@ set msg { unless it is a double proxy where the 2nd host is the machine with the VNC server. - UltraVNC Single Click III Bug: - - The UltraVNC Single Click III (SSL) server works with SSVNC; - it makes a reverse connection to it via an SSL tunnel: - - http://www.uvnc.com/pchelpware/SCIII/index.html - - Unfortunately the SSL implementation used by UltraVNC SC III - is incompatible with OpenSSL in that the connection will be - dropped after 2-15 minutes due to an unexpected packet. - - However this can be worked around in STUNNEL by setting - configution item 'options = ALL'. Enabling 'UltraVNC Single - Click III Bug' passes this setting to STUNNEL. - - On Windows 'options = ALL' is used by default for stunnel. - On Unix and MacOSX you will need to select this option. - - Setting this option may provide a workaround for other SSL - VNC servers. - - BTW, you can set the environment variable STUNNEL_EXTRA_OPTS_USER - to add any lines to the STUNNEL global config that you want to. - See the stunnel(8) man page for more details. - - View Only: Have VNC Viewer ignore mouse and keyboard input. @@ -2322,19 +2347,20 @@ proc set_defaults {} { global ts_mode ts_desktop_size ts_desktop_depth choose_desktop_geom global additional_port_redirs additional_port_redirs_list global stunnel_local_protection stunnel_local_protection_type ssh_local_protection multiple_listen - global ultra_dsm ultra_dsm_type ultra_dsm_file + global ultra_dsm ultra_dsm_type ultra_dsm_file ultra_dsm_noultra ultra_dsm_salt global sound_daemon_remote_cmd sound_daemon_remote_port sound_daemon_kill sound_daemon_restart global sound_daemon_local_cmd sound_daemon_local_port sound_daemon_local_kill sound_daemon_x11vnc sound_daemon_local_start global smb_su_mode smb_mount_list global use_port_knocking port_knocking_list - global ycrop_string extra_sleep use_listen use_unixpw use_x11vnc_find unixpw_username - global use_uvnc_ssl_bug + global ycrop_string ssvnc_scale sbwid_string rfbversion ssvnc_encodings use_x11cursor use_nobell use_rawlocal use_popupfix extra_sleep use_listen use_unixpw use_x11vnc_find unixpw_username + global disable_ssl_workarounds disable_ssl_workarounds_type global include_list set defs(use_viewonly) 0 set defs(use_listen) 0 - set defs(use_uvnc_ssl_bug) 0 + set defs(disable_ssl_workarounds) 0 + set defs(disable_ssl_workarounds_type) "none" set defs(use_unixpw) 0 set defs(unixpw_username) "" set defs(use_x11vnc_find) 0 @@ -2392,13 +2418,15 @@ proc set_defaults {} { set defs(additional_port_redirs_list) "" set defs(stunnel_local_protection) 0 - set defs(stunnel_local_protection_type) "none" + set defs(stunnel_local_protection_type) "exec" set defs(ssh_local_protection) 0 set defs(multiple_listen) 0 set defs(ultra_dsm) 0 set defs(ultra_dsm_file) "" set defs(ultra_dsm_type) "guess" + set defs(ultra_dsm_noultra) 0 + set defs(ultra_dsm_salt) "" set defs(cups_local_server) "" set defs(cups_remote_port) "" @@ -2420,6 +2448,14 @@ proc set_defaults {} { set defs(sound_daemon_x11vnc) 0 set defs(ycrop_string) "" + set defs(ssvnc_scale) "" + set defs(sbwid_string) "" + set defs(rfbversion) "" + set defs(ssvnc_encodings) "" + set defs(use_x11cursor) 0 + set defs(use_nobell) 0 + set defs(use_rawlocal) 0 + set defs(use_popupfix) 0 set defs(extra_sleep) "" set defs(use_port_knocking) 0 set defs(port_knocking_list) "" @@ -2458,10 +2494,10 @@ proc set_defaults {} { } proc do_viewer_windows {n} { - global use_alpha use_grab use_ssh use_sshssl use_viewonly use_fullscreen use_bgr233 + global use_alpha use_grab use_x11cursor use_nobell use_ssh use_sshssl use_viewonly use_fullscreen use_bgr233 global use_nojpeg use_raise_on_beep use_compresslevel use_quality global change_vncviewer change_vncviewer_path vncviewer_realvnc4 - global use_listen use_uvnc_ssl_bug env + global use_listen disable_ssl_workarounds disable_ssl_workarounds_type env set cmd "vncviewer" if {$change_vncviewer && $change_vncviewer_path != ""} { @@ -2897,7 +2933,8 @@ proc launch_windows_ssh {hp file n} { global is_win9x env global use_sshssl use_ssh putty_pw global port_knocking_list - global use_listen use_uvnc_ssl_bug listening_name + global use_listen listening_name + global disable_ssl_workarounds disable_ssl_workarounds_type global ts_only global debug_netstat @@ -3363,6 +3400,7 @@ proc launch_windows_ssh {hp file n} { catch {destroy .o} catch {destroy .oa} + catch {destroy .os} if { ![do_port_knock $ssh_host start]} { catch {file delete $file} @@ -3766,6 +3804,7 @@ proc darwin_terminal_cmd {{title ""} {cmd ""} {bg 0}} { set fh "" catch {set fh [open $tmp w 0755]} + catch {[exec chmod 755 $tmp]} if {$fh == ""} { raise . tk_messageBox -type ok -icon error -message "Cannot open temporary file: $tmp" -title "Cannot open file" @@ -4707,9 +4746,11 @@ proc repeater_proxy_check {proxy} { set force 1 } } - global use_listen + global use_listen ultra_dsm if {! $use_listen} { - if {$force} { + if {$ultra_dsm != ""} { + return 1; + } elseif {$force} { mesg "WARNING: repeater:// ID:nnn proxy must use Listen Mode" after 1000 } else { @@ -4880,7 +4921,8 @@ proc reset_stunnel_extra_opts {} { proc launch_unix {hp} { global smb_redir_0 smb_mounts env global vncauth_passwd use_unixpw unixpw_username unixpw_passwd - global ssh_only ts_only + global ssh_only ts_only use_x11cursor use_nobell use_rawlocal use_popupfix ssvnc_scale + global ssvnc_encodings globalize @@ -4933,17 +4975,31 @@ proc launch_unix {hp} { set ssvnc_multiple_listen0 "" if {[regexp -nocase {sslrepeater://} $hp]} { - if {! $use_uvnc_ssl_bug} { - set use_uvnc_ssl_bug 1 - mesg "Enabling 'UltraVNC Single Click III Bug'" + if {$disable_ssl_workarounds} { + set disable_ssl_workarounds 0 + mesg "Disabling SSL workarounds for 'UVNC Single Click III Bug'" after 400 } } - if {$use_uvnc_ssl_bug && ! $use_ssh} { - if [info exists env(STUNNEL_EXTRA_OPTS)] { - set stunnel_extra_opts0 $env(STUNNEL_EXTRA_OPTS) + if [info exists env(STUNNEL_EXTRA_OPTS)] { + set stunnel_extra_opts0 $env(STUNNEL_EXTRA_OPTS) + if {$disable_ssl_workarounds} { + if {$disable_ssl_workarounds_type == "none"} { + ; + } elseif {$disable_ssl_workarounds_type == "noempty"} { + set env(STUNNEL_EXTRA_OPTS) "$env(STUNNEL_EXTRA_OPTS)\noptions = DONT_INSERT_EMPTY_FRAGMENTS" + } + } else { set env(STUNNEL_EXTRA_OPTS) "$env(STUNNEL_EXTRA_OPTS)\noptions = ALL" + } + } else { + if {$disable_ssl_workarounds} { + if {$disable_ssl_workarounds_type == "none"} { + ; + } elseif {$disable_ssl_workarounds_type == "noempty"} { + set env(STUNNEL_EXTRA_OPTS) "options = DONT_INSERT_EMPTY_FRAGMENTS" + } } else { set env(STUNNEL_EXTRA_OPTS) "options = ALL" } @@ -4974,13 +5030,25 @@ proc launch_unix {hp} { } } if {$ultra_dsm} { - if {![file exists $ultra_dsm_file]} { + if {![file exists $ultra_dsm_file] && ![regexp {pw=} $ultra_dsm_file]} { mesg "DSM key file does exist: $ultra_dsm_file" bell after 1000 return } + global vncauth_passwd + if {$ultra_dsm_file == "pw=VNCPASSWORD" || $ultra_dsm_file == "pw=VNCPASSWD"} { + if {![info exists vncauth_passwd] || $vncauth_passwd == ""} { + mesg "For DSM pw=VNCPASSWD you must supply the VNC Password" + bell + after 1000 + return + } + } set dsm "ultravnc_dsm_helper " + if {$ultra_dsm_noultra} { + append dsm "noultra:" + } if {$use_listen} { append dsm "rev:" } @@ -4989,7 +5057,16 @@ proc launch_unix {hp} { } else { append dsm $ultra_dsm_type } - append dsm " $ultra_dsm_file" + if {$ultra_dsm_noultra} { + if {$ultra_dsm_salt != ""} { + append dsm "@$ultra_dsm_salt" + } + } + if {$ultra_dsm_file == "pw=VNCPASSWORD" || $ultra_dsm_file == "pw=VNCPASSWD"} { + append dsm " pw=$vncauth_passwd" + } else { + append dsm " $ultra_dsm_file" + } set env(SSVNC_ULTRA_DSM) $dsm } if {$ssh_local_protection} { @@ -5255,6 +5332,30 @@ proc launch_unix {hp} { if {$use_grab} { set cmd "$cmd -grab" } + if {$use_x11cursor} { + set cmd "$cmd -x11cursor" + } + if {$use_nobell} { + set cmd "$cmd -nobell" + } + if {$use_rawlocal} { + set cmd "$cmd -rawlocal" + } + if {$use_popupfix} { + set cmd "$cmd -popupfix" + } + if {$ssvnc_scale != ""} { + set cmd "$cmd -scale '$ssvnc_scale'" + } + if {$ssvnc_encodings != ""} { + set cmd "$cmd -ssvnc_encodings '$ssvnc_encodings'" + } + if {$rfbversion != ""} { + set cmd "$cmd -rfbversion '$rfbversion'" + } + if {$vncviewer_realvnc4} { + set cmd "$cmd -realvnc4" + } if {$use_listen} { set cmd "$cmd -listen" } @@ -5274,8 +5375,6 @@ proc launch_unix {hp} { } } - set cmd "$cmd $hp" - set do_vncspacewrapper 0 if {$change_vncviewer && $change_vncviewer_path != ""} { set path [string trim $change_vncviewer_path] @@ -5346,11 +5445,23 @@ proc launch_unix {hp} { set realvnc4 0 set realvnc3 1 } + if {$realvnc4} { + set cmd "$cmd -realvnc4" + } + + set cmd "$cmd $hp" set passwdfile "" if {$vncauth_passwd != ""} { global use_listen - set passwdfile "$env(SSVNC_HOME)/.vncauth_tmp.[tpid]" + set footest [mytmp /tmp/.check.[tpid]] + catch {file delete $footest} + global mktemp + set passwdfile "/tmp/.vncauth_tmp.[tpid]" + if {$mktemp == ""} { + set passwdfile "$env(SSVNC_HOME)/.vncauth_tmp.[tpid]" + } + set passwdfile [mytmp $passwdfile] catch {exec vncstorepw $vncauth_passwd $passwdfile} catch {exec chmod 600 $passwdfile} @@ -5446,6 +5557,7 @@ proc launch_unix {hp} { } global ycrop_string + global sbwid_string catch {unset env(VNCVIEWER_SBWIDTH)} catch {unset env(VNCVIEWER_YCROP)} if {[info exists ycrop_string] && $ycrop_string != ""} { @@ -5457,12 +5569,18 @@ proc launch_unix {hp} { if {$t != ""} { set env(VNCVIEWER_YCROP) $t } - #catch {puts "VNCVIEWER_SBWIDTH $env(VNCVIEWER_SBWIDTH)"} - #catch {puts "VNCVIEWER_YCROP $env(VNCVIEWER_YCROP)"} + } + if {[info exists sbwid_string] && $sbwid_string != ""} { + set t $sbwid_string + set env(VNCVIEWER_SBWIDTH) $sbwid_string + if {$t != ""} { + set env(VNCVIEWER_SBWIDTH) $t + } } catch {destroy .o} catch {destroy .oa} + catch {destroy .os} update if {$use_sound && $sound_daemon_local_start && $sound_daemon_local_cmd != ""} { @@ -5471,7 +5589,6 @@ proc launch_unix {hp} { set sound_daemon_local_pid "" #exec sh -c "$sound_daemon_local_cmd " >& /dev/null </dev/null & set sound_daemon_local_pid [exec sh -c "echo \$\$; exec $sound_daemon_local_cmd </dev/null 1>/dev/null 2>/dev/null &"] -#puts "A $sound_daemon_local_pid" update after 500 } @@ -5522,8 +5639,15 @@ proc launch_unix {hp} { set env(SSVNC_EXTRA_SLEEP) $extra_sleep } - unix_terminal_cmd $geometry "SSL/SSH VNC Viewer $hp" \ - "$te$cmd; set +xv; ulimit -c 0; trap 'printf \"Paused. Press Enter to exit:\"; read x' QUIT; echo; echo $m; echo; echo sleep 5; echo; sleep 6" 0 $xrm1 $xrm2 $xrm3 + set sstx "SSL/SSH VNC Viewer" + set hptx $hp + global use_listen + if {$use_listen} { + set sstx "SSVNC" + set hptx "$hp (Press Ctrl-C to Stop Listening)" + } + unix_terminal_cmd $geometry "$sstx $hptx" \ + "$te$cmd; set +xv; ulimit -c 0; trap 'printf \"Paused. Press Enter to exit:\"; read x' QUIT; echo; echo $m; echo; echo sleep 5; echo; sleep 5" 0 $xrm1 $xrm2 $xrm3 set env(SS_VNCVIEWER_SSH_CMD) "" set env(SS_VNCVIEWER_USE_C) "" @@ -5786,7 +5910,7 @@ proc launch {{hp ""}} { global mycert svcert crtdir global pids_before pids_after pids_new global env - global use_ssl use_ssh use_sshssl use_listen use_uvnc_ssl_bug + global use_ssl use_ssh use_sshssl use_listen disable_ssl_workarounds global vncdisplay set debug 0 @@ -6151,10 +6275,14 @@ proc launch {{hp ""}} { } else { puts $fh "client = yes" } - # WRT, UltraVNC Single Click III Bug: - # Wow, on Windows we've been using 'options = ALL' - # all along! Duh. OK keep it... - puts $fh "options = ALL" + global disable_ssl_workarounds disable_ssl_workarounds_type + if {$disable_ssl_workarounds} { + if {$disable_ssl_workarounds_type == "noempty"} { + puts $fh "options = DONT_INSERT_EMPTY_FRAGMENTS" + } + } else { + puts $fh "options = ALL" + } puts $fh "taskbar = yes" puts $fh "RNDbytes = 2048" @@ -6287,6 +6415,7 @@ proc launch {{hp ""}} { } else { catch {destroy .o} catch {destroy .oa} + catch {destroy .os} wm withdraw . } @@ -6418,6 +6547,7 @@ proc direct_connect_windows {{hp ""}} { catch {destroy .o} catch {destroy .oa} + catch {destroy .os} wm withdraw . if {$use_listen} { @@ -10728,79 +10858,89 @@ proc help_advanced_opts {} { Brief descriptions: - CUPS Print tunnelling: redirect localhost:6631 (say) on the VNC - server to your local CUPS server. + CUPS Print tunnelling: - ESD/ARTSD Audio tunnelling: redirect localhost:16001 (say) on - the VNC server to your local ESD, etc. sound server. + Redirect localhost:6631 (say) on the VNC server to your local + CUPS server. - SMB mount tunnelling: redirect localhost:1139 (say) on the VNC - server and through that mount SMB file shares from your local - server. The remote machine must be Linux with smbmount installed. + ESD/ARTSD Audio tunnelling: - Additional Port Redirs: specify additional -L port:host:port and - -R port:host:port cmdline options for SSH to enable additional - services. + Redirect localhost:16001 (say) on the VNC server to your local + ESD, etc. sound server. - SSH Local Port Protections: and LD_PRELOAD hack to limit the - number of SSH port redirections to 1 and within the first - 15 seconds. So there is a smaller window when the user can try - to use your tunnel compared to the duration of your session. + SMB mount tunnelling: - STUNNEL Local Port Protections: Try to prevent Untrusted Local - Users (see the main Help panel) from using your STUNNEL tunnel - to connect to the remote VNC Server. + Redirect localhost:1139 (say) on the VNC server and through + that mount SMB file shares from your local server. The remote + machine must be Linux with smbmount installed. - UltraVNC DSM Encryption Plugin: on Unix, by using the supplied - tool, ultravnc_dsm_helper, encrypted connections to UltraVNC - servers using their plugins is enabled. + Additional Port Redirs: - Multiple LISTEN Connections: allow multiple VNC servers to - reverse connect at the same time and so display each of their - desktops on your screen at the same time. + Specify additional -L port:host:port and -R port:host:port + cmdline options for SSH to enable additional services. - Change VNC Viewer: specify a non-bundled VNC Viewer (e.g. - UltraVNC or RealVNC) to run instead of the bundled TightVNC Viewer. + SSH Local Port Protections: - Port Knocking: for "closed port" services, first "knock" on the - firewall ports in a certain way to open the door for SSH or SSL. - The port can also be closed when the encrypted VNC connection - finishes. + An LD_PRELOAD hack to limit the number of SSH port redirections + to 1 and within the first 15 seconds. So there is a smaller + window when the user can try to use your tunnel compared to + the duration of your session. - Use XGrabServer: On Unix only, use the XGrabServer workaround - for old window managers. + STUNNEL Local Port Protections: - Cursor Alphablending: Use the x11vnc alpha hack for translucent - cursors (requires Unix, 32bpp and same endianness) + Try to prevent Untrusted Local Users (see the main Help panel) + from using your STUNNEL tunnel to connect to the remote VNC + Server. - Y Crop: this is for x11vnc's -ncache client side caching scheme - with our Unix TightVNC viewer. Sets the Y value to "crop" the - viewer size at (below the cut is the pixel cache region you do - not want to see). If the screen is tall (H > 2*W) ycropping - will be autodetected, or you can set to -1 to force autodection. - Otherwise, set it to the desired Y value. You can also set - the scrollbar width (very thin by default) by appending ",sb=N" - (or use ",sb=N" by itself to just set the scrollbar width). + UltraVNC DSM Encryption Plugin: - Include: Profile template(s) to load before loading a profile - (Load button). For example if you Save a profile called "globals" + On Unix only, by using the supplied tool, ultravnc_dsm_helper, + encrypted connections to UltraVNC servers using their plugins + is enabled. Support for secret key encryption to Non-UltraVNC + DSM servers is also supported, e.g. x11vnc -enc blowfish:my.key + + Change VNC Viewer: + + Specify a non-bundled VNC Viewer (e.g. UltraVNC or RealVNC) + to run instead of the bundled TightVNC Viewer. + + Port Knocking: + + For "closed port" services, first "knock" on the firewall ports + in a certain way to open the door for SSH or SSL. The port + can also be closed when the encrypted VNC connection finishes. + + Include: + + Profile template(s) to load before loading a profile (Load + button). For example if you Save a profile called "globals" that has some settings you use often, then just supply "Include: globals" to have them applied. You may supply a comma or space - separated list of templates to include. They can be full path - names or basenames relative to the profiles directory. You do - not need to supply the .vnc suffix. The non-default settings - in them will be applied first, and then any values in the loaded - Profile will override them. + separated list of templates to include. They can be full + path names or basenames relative to the profiles directory. + You do not need to supply the .vnc suffix. The non-default + settings in them will be applied first, and then any values in + the loaded Profile will override them. + + Sleep: - Sleep: Enter a number to indicate how many extra seconds to sleep + Enter a number to indicate how many extra seconds to sleep while waiting for the VNC viewer to start up. On Windows this can give extra time to enter the Putty/Plink password, etc. - ssh-agent: On Unix only: restart the GUI in the presence of - ssh-agent(1) (e.g. in case you forgot to start your agent before - starting this GUI). An xterm will be used to enter passphrases, - etc. This can avoid repeatedly entering passphrases for the SSH - logins (note this requires setting up and distributing SSH keys). + Unix ssvncviewer: + + Display a popup menu with options that apply to the special + Unix SSVNC VNC Viewer (perhaps called 'ssvncviewer') provided by + this SSVNC package. This only applies to Unix or Mac OS X. + + Use ssh-agent: + + On Unix only: restart the GUI in the presence of ssh-agent(1) + (e.g. in case you forgot to start your agent before starting + this GUI). An xterm will be used to enter passphrases, etc. + This can avoid repeatedly entering passphrases for the SSH logins + (note this requires setting up and distributing SSH keys). About the CheckButtons: @@ -10814,6 +10954,111 @@ proc help_advanced_opts {} { jiggle_text .ah.f.t } +proc help_ssvncviewer_opts {} { + toplev .av + + scroll_text_dismiss .av.f + + center_win .av + + wm title .av "Unix SSVNC viewer Options Help" + + set msg { + These Unix SSVNC VNC Viewer Options apply only on Unix or Mac OS X + when using the viewer (ssvncviewer) supplied by this SSVNC package. + + Brief descriptions: + + Multiple LISTEN Connections: + + Allow multiple VNC servers to reverse connect at the same time + and so display each of their desktops on your screen at the + same time. + + Use X11 Cursor: + + When drawing the mouse cursor shape locally, use an X11 cursor + instead of drawing it directly into the framebuffer. This + can sometimes give better response, and avoid problems under + 'Scaling'. + + Disable Bell: + + Disable beeps coming from remote side. + + Use Raw Local: + + Use the VNC Raw encoding for 'localhost' connections (instead + of assuming there is a local tunnel, SSL or SSH, going to the + remote machine. + + Use Popup Fix: + + Enable a fix that warps the popup (F8) to the mouse pointer. + + Use XGrabServer (for fullscreen): + + On Unix only, use the XGrabServer workaround for older window + managers. Sometimes also needed on recent (2008) GNOME. This + workaround can make going into/out-of Fullscreen work better. + + Cursor Alphablending: + + Use the x11vnc alpha hack for translucent cursors (requires Unix, + 32bpp and same endianness) + + Scaling: + + Use viewer-side (i.e. local) scaling of the VNC screen. Supply + a fraction, e.g. 0.75 or 3/4, or a WxH geometry, e.g. 1280x1024, + or the string 'fit' to fill the current screen. Use 'auto' + to scale the desktop to match the viewer window size. + + Y Crop: + + This is for x11vnc's -ncache client side caching scheme with our + Unix TightVNC viewer. Sets the Y value to "crop" the viewer + size at (below the cut is the pixel cache region you do not + want to see). If the screen is tall (H > 2*W) ycropping will + be autodetected, or you can set to -1 to force autodection. + Otherwise, set it to the desired Y value. You can also set + the scrollbar width (very thin by default) by appending ",sb=N" + (or use ",sb=N" by itself to just set the scrollbar width). + + ScrollBar Width: + + This is for x11vnc's -ncache client side caching scheme with our + Unix TightVNC viewer. For Y-Crop mode, set the size of the + scrollbars (often one want it to be very narrow, e.g. 2 pixels + to be less distracting. + + + These are environment variables one may set to affect the options + of the SSVNC vncviewer: + + VNCVIEWER_ALPHABLEND (-alpha, see Cursor Alphablending above) + VNCVIEWER_POPUP_FIX (-popupfix, warp popup to mouse location) + VNCVIEWER_GRAB_SERVER (-graball, see Use XGrabServer above) + VNCVIEWER_YCROP (-ycrop, see Y Crop above) + VNCVIEWER_SBWIDTH (-sbwidth, see ScrollBar Width above) + VNCVIEWER_RFBVERSION (-rfbversion, e.g. 3.6) + VNCVIEWER_ENCODINGS (-encodings, e.g. "copyrect zrle hextile") + VNCVIEWER_BELL (-bell) + VNCVIEWER_X11CURSOR (-x11cursor, see Use X11 Cursor above) + VNCVIEWER_RAWLOCAL (-rawlocal, see Use Raw Local above) + SSVNC_SCALE (-scale, see Scaling above) + SSVNC_MULTIPLE_LISTEN (-multilisten, see Mulitple LISTEN above) + SSVNC_UNIXPW (-unixpw) + SSVNC_UNIXPW_NOESC (do not send escape in -unixpw mode) + SSVNC_NOSOLID (do not do solid region speedup in + scaling mode.) + +} + + .av.f.t insert end $msg + jiggle_text .av.f.t +} + proc set_viewer_path {} { global change_vncviewer_path unix_dialog_resize .chviewer @@ -10993,7 +11238,7 @@ proc stunnel_sec_dialog {} { On Unix, for STUNNEL SSL tunnels we provide two options as extra safeguards against untrusted local users. Both only apply to Unix/MacOSX. - Note that Both options are *ignored* in reverse connection (Listen) mode. + Note that Both options are *IGNORED* in reverse connection (Listen) mode. 1) The first one 'Use stunnel EXEC mode' (it is mutually exclusive with option 2). For this case the modified SSVNC Unix viewer must be @@ -11038,6 +11283,95 @@ proc stunnel_sec_dialog {} { wm resizable .stlsec 1 0 } +proc disable_ssl_workarounds_dialog {} { + global disable_ssl_workarounds disable_ssl_workarounds_type + + toplev .sslwrk + wm title .sslwrk "Disable SSL Workarounds" + + global help_font uname + scroll_text .sslwrk.f 86 36 + + apply_bg .sslwrk.f + + set msg { + Some SSL implementations are incomplete or buggy or do not work properly + with other implementations. SSVNC uses STUNNEL for its SSL encryption, + and STUNNEL uses the OpenSSL SSL implementation. + + This causes some problems with non-OpenSSL implementations on the VNC server + side. The most noticable one is the UltraVNC Single Click III (SSL) server: + + http://www.uvnc.com/pchelpware/SCIII/index.html + + It can make a reverse connection to SSVNC via an encrypted SSL tunnel. + + Unfortunately, in the default operation with STUNNEL the connection will be + dropped after 2-15 minutes due to an unexpected packet. + + Because of this, by default SSVNC will enable some SSL workarounds to make + connections like these work. This is the STUNNEL 'options = ALL' setting: + it enables a basic set of SSL workarounds. + + You can read all about these workarounds in the stunnel(8) manpage and the + OpenSSL SSL_CTX_set_options(3) manpage. + + Why are we mentioning this? STUNNELS's 'options = ALL' lowers the SSL + security a little bit. If you know you do not have an incompatible SSL + implementation on the server side (e.g. any one using OpenSSL is compatible, + x11vnc in particular), then you can regain that little bit of security by + selecting the "Disable SSL Workarounds" option. + + "Disable All SSL Workarounds" selected below will do that. On the other hand, + choose "Keep the DONT_INSERT_EMPTY_FRAGMENTS Workaround" to retain that one, + commonly needed workaround. + + BTW, you can set the environment variable STUNNEL_EXTRA_OPTS_USER to add + any lines to the STUNNEL global config that you want to. See the stunnel(8) + man page for more details. +} + .sslwrk.f.t insert end $msg + + radiobutton .sslwrk.none -relief ridge -anchor w -variable disable_ssl_workarounds_type -value "none" -text "Disable All Workarounds" + radiobutton .sslwrk.noempty -relief ridge -anchor w -variable disable_ssl_workarounds_type -value "noempty" -text "Keep the DONT_INSERT_EMPTY_FRAGMENTS Workaround" + + button .sslwrk.cancel -text "Cancel" -command {set disable_ssl_workarounds 0; destroy .sslwrk} + bind .sslwrk <Escape> {set disable_ssl_workarounds 0; destroy .sslwrk} + wm protocol .sslwrk WM_DELETE_WINDOW {set disable_ssl_workarounds 0; destroy .sslwrk} + button .sslwrk.done -text "Done" -command {destroy .sslwrk} + + pack .sslwrk.f .sslwrk.none .sslwrk.noempty .sslwrk.cancel .sslwrk.done -side top -fill x + + center_win .sslwrk + wm resizable .sslwrk 1 0 +} + +proc update_no_ultra_dsm {} { + global ultra_dsm_noultra + global ultra_dsm_type + + foreach b {bf des3 aes aes256 l e} { + if {! $ultra_dsm_noultra} { + .ultradsm.nou.$b configure -state disabled + } else { + .ultradsm.nou.$b configure -state normal + } + } + if {! $ultra_dsm_noultra} { + if {$ultra_dsm_type == "arc4"} { + ; + } elseif {$ultra_dsm_type == "aesv2"} { + ; + } elseif {$ultra_dsm_type == "msrc4"} { + ; + } elseif {$ultra_dsm_type == "msrc4_sc"} { + ; + } else { + set ultra_dsm_type guess + } + } +} + proc ultra_dsm_dialog {} { global ultra_dsm ultra_dsm_file ultra_dsm_type @@ -11045,20 +11379,28 @@ proc ultra_dsm_dialog {} { wm title .ultradsm "UltraVNC DSM Encryption Plugin" global help_font - eval text .ultradsm.t -width 80 -height 24 $help_font - apply_bg .ultradsm.t + scroll_text .ultradsm.f 85 35 set msg { On Unix with the provided SSVNC vncviewer, you can connect to an UltraVNC - server that is using one of its encryption plugins: MSRC4 (not yet - supported), ARC4, or AESV2. + server that is using one of its encryption plugins: MSRC4, ARC4, or AESV2. + + See the end of this text for how to use symmetric encryption with NON-UltraVNC + servers (for example, x11vnc 0.9.5 or later). + + You will need to specify the corresponding UltraVNC encryption key (created + by you using an UltraVNC server or viewer). It is usually called 'rc4.key' + (for MSRC4), 'arc4.key' (for ARC4), and 'aesv2.key' (for AESV2). Specify + the path to it or Browse for it. Also, specify which type of plugin it is + (or use 'guess' to have it guess via the before mentioned filenames). + + The choice "UVNC SC" enables a special workaround for use with UltraVNC + Single Click and the MSRC4 plugin. It may not be needed on recent SC. + + You can also specify pw=my-password instead of a keyfile. - You will need to specify the corresponding UltraVNC encryption key - (created by you using an UltraVNC server or viewer). It is usually - called 'rc4.key' (for MSRC4), 'arc4.key' (for ARC4), and 'aesv2.key' - (for AESV2). Specify the path to it or browse for it. Also, specify - which type of plugin it is (or use 'guess' to have it guess via the - before mentioned filenames). + Use the literal string 'pw=VNCPASSWD' to have the VNC password that you + entered into the 'VNC Password:' be used for the pw=... SSL and SSH tunnels do not apply in this mode (any settings are ignored.) @@ -11069,11 +11411,18 @@ proc ultra_dsm_dialog {} { vncviewer had to be modified to support it. The tight and zlib encodings currently do not work in this mode and are disabled. - Note that this program also requires the utility tool named - 'ultravnc_dsm_helper' that should be included in your SSVNC kit. + Note that this mode also requires the utility tool named 'ultravnc_dsm_helper' + that should be included in your SSVNC kit. + + Select Non-Ultra DSM to use symmetric encryption to a Non-UltraVNC server + via a supported symmetric key cipher. x11vnc supports symmetric + encryption via, e.g., "x11vnc -enc aesv2:./my.key". Extra ciphers are + enabled for this mode (e.g. blowfish and 3des). You can also set the random + salt size and initialization vector size in Salt,IV for example "8,16". + See the x11vnc and 'ultravnc_dsm_helper -help' documentation for more info. } - .ultradsm.t insert end $msg + .ultradsm.f.t insert end $msg frame .ultradsm.path label .ultradsm.path.l -text "Ultra DSM Keyfile:" @@ -11085,7 +11434,7 @@ proc ultra_dsm_dialog {} { pack .ultradsm.path.b -side left frame .ultradsm.key - label .ultradsm.key.l -text "Type of Key: " + label .ultradsm.key.l -text "Type of Key: " radiobutton .ultradsm.key.guess -pady 1 -anchor w -variable ultra_dsm_type -value guess \ -text "Guess" radiobutton .ultradsm.key.arc4 -pady 1 -anchor w -variable ultra_dsm_type -value arc4 \ @@ -11096,13 +11445,43 @@ proc ultra_dsm_dialog {} { radiobutton .ultradsm.key.msrc4 -pady 1 -anchor w -variable ultra_dsm_type -value msrc4 \ -text "MSRC4" - .ultradsm.key.msrc4 configure -state disabled + + radiobutton .ultradsm.key.msrc4_sc -pady 1 -anchor w -variable ultra_dsm_type -value msrc4_sc \ + -text "UVNC SC" pack .ultradsm.key.l -side left pack .ultradsm.key.guess -side left pack .ultradsm.key.arc4 -side left pack .ultradsm.key.aesv2 -side left pack .ultradsm.key.msrc4 -side left + pack .ultradsm.key.msrc4_sc -side left + + frame .ultradsm.nou + checkbutton .ultradsm.nou.cb -text "Non-Ultra DSM" -variable ultra_dsm_noultra -command update_no_ultra_dsm + radiobutton .ultradsm.nou.bf -pady 1 -anchor w -variable ultra_dsm_type -value blowfish \ + -text "Blowfish" + + radiobutton .ultradsm.nou.des3 -pady 1 -anchor w -variable ultra_dsm_type -value 3des \ + -text "3DES" + + radiobutton .ultradsm.nou.aes -pady 1 -anchor w -variable ultra_dsm_type -value "aes-cfb" \ + -text "AES-CFB" + + radiobutton .ultradsm.nou.aes256 -pady 1 -anchor w -variable ultra_dsm_type -value "aes256" \ + -text "AES-256" + + label .ultradsm.nou.l -text " Salt,IV" + entry .ultradsm.nou.e -width 6 -textvariable ultra_dsm_salt + + pack .ultradsm.nou.cb -side left + pack .ultradsm.nou.bf -side left + pack .ultradsm.nou.des3 -side left + pack .ultradsm.nou.aes -side left + pack .ultradsm.nou.aes256 -side left + pack .ultradsm.nou.l -side left + pack .ultradsm.nou.e -side left -expand 0 + + update_no_ultra_dsm button .ultradsm.cancel -text "Cancel" -command {destroy .ultradsm; set ultra_dsm 0} bind .ultradsm <Escape> {destroy .ultradsm; set ultra_dsm 0} @@ -11110,7 +11489,7 @@ proc ultra_dsm_dialog {} { button .ultradsm.done -text "Done" -command {destroy .ultradsm; catch {raise .oa}} bind .ultradsm.path.e <Return> {destroy .ultradsm; catch {raise .oa}} - pack .ultradsm.t .ultradsm.path .ultradsm.key .ultradsm.cancel .ultradsm.done -side top -fill x + pack .ultradsm.f .ultradsm.path .ultradsm.key .ultradsm.nou .ultradsm.cancel .ultradsm.done -side top -fill x center_win .ultradsm wm resizable .ultradsm 1 0 @@ -11229,6 +11608,59 @@ proc multilisten_dialog {} { wm resizable .multil 1 0 } +proc use_grab_dialog {} { + global usg_grab + + toplev .usegrb + wm title .usegrb "Use XGrabServer (for fullscreen)" + + global help_font + eval text .usegrb.t -width 85 -height 29 $help_font + + apply_bg .usegrb.t + + set msg { + On Unix, some Window managers and some Desktops make it difficult for the + SSVNC Unix VNC viewer to go into full screen mode (F9) and/or return. + + Sometimes one can go into full screen mode, but then your keystrokes or + Mouse actions do not get through. This can leave you trapped because you + cannot inject input (F9 again) to get out of full screen mode. (Tip: + press Ctrl-Alt-F2 for a console login shell; then kill your vncviewer + process, e.g. pkill vncviewer; then Alt-F7 to get back to your desktop) + + We have seen this in some very old Window managers (e.g. fvwm2 circa + 1998) and some very new Desktops (e.g. GNOME circa 2008). We try + to work around the problem on recent desktops by using the NEW_WM + interface, but if you use Fullscreen, you may need to use this option. + + The default for the SSVNC Unix VNC viewer is '-grabkbd' mode where it will + try to exclusively grab the keyboard. This often works correctly. + + However if Fullscreen is not working properly, try setting this + 'Use XGrabServer' option to enable '-graball' mode where it tries to grab + the entire X server. This usually works, but can be a bit flakey. + + Sometimes toggling F9 a few times gets lets the vncviewer fill the whole + screen. Sometimes tapping F9 very quickly gets it to snap in. If GNOME + (or whatever desktop) is still showing its taskbars, it is recommended + you toggle F9 until it isn't. Otherwise, it is not clear who gets the input. + + Best of luck. +} + .usegrb.t insert end $msg + + button .usegrb.cancel -text "Cancel" -command {set use_grab 0; destroy .usegrb} + bind .usegrb <Escape> {set use_grab 0; destroy .usegrb} + wm protocol .usegrb WM_DELETE_WINDOW {set use_grab 0; destroy .usegrb} + button .usegrb.done -text "Done" -command {destroy .usegrb} + + pack .usegrb.t .usegrb.cancel .usegrb.done -side top -fill x + + center_win .usegrb + wm resizable .usegrb 1 0 +} + proc find_netcat {} { global is_windows @@ -12013,12 +12445,12 @@ proc set_ts_options {} { checkbutton .ot.b$i -anchor w -variable change_vncviewer -text \ "Change VNC Viewer" \ - -command {if {$change_vncviewer} {change_vncviewer_dialog}} + -command change_vncviewer_dialog_wrap incr i checkbutton .ot.b$i -anchor w -variable use_x11_macosx -text \ "X11 viewer MacOSX" \ - -command {if {$use_x11_macosx} {set darwin_cotvnc 0} else {set darwin_cotvnc 1}; catch {destroy .ot}; set_ts_options} + -command {if {$use_x11_macosx} {set darwin_cotvnc 0} else {set darwin_cotvnc 1}; set_darwin_cotvnc_buttons} if {$uname != "Darwin"} {.ot.b$i configure -state disabled} incr i @@ -12091,6 +12523,8 @@ proc set_ts_adv_options {} { checkbutton .ot2.b$i -anchor w -variable use_bgr233 -text \ "Client 8bit Color" if {$darwin_cotvnc} {.ot2.b$i configure -state disabled} + global darwin_cotvnc_blist + set darwin_cotvnc_blist(.ot2.b$i) 1 incr i checkbutton .ot2.b$i -anchor w -variable choose_ncache -text \ @@ -12120,6 +12554,18 @@ proc set_ts_adv_options {} { -command {destroy .ot2; to_ssvnc} incr i } + button .ot2.b$i -anchor w -text " Unix ssvncviewer ..." \ + -command {set_ssvncviewer_options} + if {$is_windows} { + .ot2.b$i configure -state disabled + } + global change_vncviewer + if {$change_vncviewer} { + .ot2.b$i configure -state disabled + } + global ts_uss_button + set ts_uss_button .ot2.b$i + incr i for {set j 1} {$j < $i} {incr j} { pack .ot2.b$j -side top -fill x @@ -12140,6 +12586,25 @@ proc set_ts_adv_options {} { focus .ot2 } +proc change_vncviewer_dialog_wrap {} { + global change_vncviewer ts_uss_button + if {$change_vncviewer} { + change_vncviewer_dialog + catch {tkwait window .chviewer} + } + if {$change_vncviewer} { + catch {.oa.ss configure -state disabled} + } else { + catch {.oa.ss configure -state normal} + } + if [info exists ts_uss_button] { + if {$change_vncviewer} { + catch {$ts_uss_button configure -state disabled} + } else { + catch {$ts_uss_button configure -state normal} + } + } +} proc set_advanced_options {} { global use_cups use_sound use_smbmnt @@ -12204,6 +12669,14 @@ proc set_advanced_options {} { if {$is_windows} {.oa.b$i configure -state disabled} incr i + checkbutton .oa.b$i -anchor w -variable disable_ssl_workarounds -text \ + "Disable SSL Workarounds" \ + -command {if {$disable_ssl_workarounds} {disable_ssl_workarounds_dialog}} + global disable_ssl_workarounds_button + set disable_ssl_workarounds_button .oa.b$i + if {$use_ssh} {.oa.b$i configure -state disabled} + incr i + checkbutton .oa.b$i -anchor w -variable ultra_dsm -text \ "UltraVNC DSM Encryption Plugin" \ -command {if {$ultra_dsm} {ultra_dsm_dialog}} @@ -12212,18 +12685,9 @@ proc set_advanced_options {} { if {$is_windows} {.oa.b$i configure -state disabled} incr i - checkbutton .oa.b$i -anchor w -variable multiple_listen -text \ - "Multiple LISTEN Connections" \ - -command {if {$multiple_listen} {multilisten_dialog}} - global multiple_listen_button use_listen - set multiple_listen_button .oa.b$i - if {$is_windows} {.oa.b$i configure -state disabled} - if {!$use_listen} {.oa.b$i configure -state disabled} - incr i - checkbutton .oa.b$i -anchor w -variable change_vncviewer -text \ "Change VNC Viewer" \ - -command {if {$change_vncviewer} {change_vncviewer_dialog}} + -command change_vncviewer_dialog_wrap incr i checkbutton .oa.b$i -anchor w -variable use_port_knocking -text \ @@ -12231,29 +12695,6 @@ proc set_advanced_options {} { -command {if {$use_port_knocking} {port_knocking_dialog}} incr i - checkbutton .oa.b$i -anchor w -variable use_grab -text \ - "Use XGrabServer" - if {$darwin_cotvnc} {.oa.b$i configure -state disabled} - set ix $i - incr i - - checkbutton .oa.b$i -anchor w -variable use_alpha -text \ - "Cursor alphablending (32bpp required)" - if {$darwin_cotvnc} {.oa.b$i configure -state disabled} - set ia $i - incr i - - - - global ycrop_string - frame .oa.b$i - label .oa.b$i.l -text "Y Crop: " - entry .oa.b$i.e -width 10 -textvariable ycrop_string - pack .oa.b$i.l -side left - pack .oa.b$i.e -side right -expand 1 -fill x - - incr i - global include_list frame .oa.b$i label .oa.b$i.l -text "Include:" @@ -12272,16 +12713,27 @@ proc set_advanced_options {} { incr i - if {$is_windows} { - .oa.b$ix configure -state disabled - .oa.b$ia configure -state disabled - } - for {set j 1} {$j < $i} {incr j} { pack .oa.b$j -side top -fill x } - button .oa.sa -text "Use ssh-agent" -command ssh_agent_restart + global uname + set t1 " Unix ssvncviewer ..." + if {$uname == "Darwin" } { regsub {^ *} $t1 "" t1 } + button .oa.ss -anchor w -text $t1 -command set_ssvncviewer_options + pack .oa.ss -side top -fill x + if {$is_windows} { + .oa.ss configure -state disabled + } + global change_vncviewer + if {$change_vncviewer} { + .oa.ss configure -state disabled + } + + set t2 " Use ssh-agent" + if {$uname == "Darwin" } { regsub {^ *} $t2 "" t2 } + + button .oa.sa -anchor w -text $t2 -command ssh_agent_restart pack .oa.sa -side top -fill x if {$is_windows} { .oa.sa configure -state disabled @@ -12309,6 +12761,198 @@ proc set_advanced_options {} { focus .oa } +proc set_ssvncviewer_options {} { + global is_windows darwin_cotvnc + global use_ssh use_sshssl use_x11cursor use_rawlocal use_popupfix use_alpha use_grab use_nobell + global ssvnc_scale + + if {$is_windows} { + return + } + + catch {destroy .oa} + toplev .os + wm title .os "Unix ssvncviewer Options" + + set darwinlist [list] + + set i 1 + + checkbutton .os.b$i -anchor w -variable multiple_listen -text \ + "Multiple LISTEN Connections" \ + -command {if {$multiple_listen} {multilisten_dialog}} + global multiple_listen_button use_listen + set multiple_listen_button .os.b$i + if {$is_windows} {.os.b$i configure -state disabled} + if {!$use_listen} {.os.b$i configure -state disabled} + lappend darwinlist .os.b$i; if {$darwin_cotvnc} {.os.b$i configure -state disabled} + incr i + + + checkbutton .os.b$i -anchor w -variable use_x11cursor -text \ + "Use X11 Cursor" + lappend darwinlist .os.b$i; if {$darwin_cotvnc} {.os.b$i configure -state disabled} + incr i + + checkbutton .os.b$i -anchor w -variable use_nobell -text \ + "Disable Bell" + lappend darwinlist .os.b$i; if {$darwin_cotvnc} {.os.b$i configure -state disabled} + incr i + + checkbutton .os.b$i -anchor w -variable use_rawlocal -text \ + "Use Raw Local" + lappend darwinlist .os.b$i; if {$darwin_cotvnc} {.os.b$i configure -state disabled} + incr i + + checkbutton .os.b$i -anchor w -variable use_popupfix -text \ + "Use Popup Fix" + lappend darwinlist .os.b$i; if {$darwin_cotvnc} {.os.b$i configure -state disabled} + incr i + + checkbutton .os.b$i -anchor w -variable use_grab -text \ + "Use XGrabServer (for fullscreen)" \ + -command {if {$use_grab} {use_grab_dialog}} + lappend darwinlist .os.b$i; if {$darwin_cotvnc} {.os.b$i configure -state disabled} + incr i + + checkbutton .os.b$i -anchor w -variable use_alpha -text \ + "Cursor alphablending (32bpp required)" + lappend darwinlist .os.b$i; if {$darwin_cotvnc} {.os.b$i configure -state disabled} + incr i + + frame .os.b$i -height 2; incr i + + set relief ridge + frame .os.b$i -relief $relief -borderwidth 2 + + label .os.b$i.l -font fixed -anchor w -text "Examples: '0.75', '1024x768', 'fit' (fill screen), or 'auto'"; + + global ssvnc_scale + frame .os.b$i.f + label .os.b$i.f.l -text "Scaling: " + lappend darwinlist .os.b$i.f.l; if {$darwin_cotvnc} {.os.b$i.f.l configure -state disabled} + entry .os.b$i.f.e -width 10 -textvariable ssvnc_scale + lappend darwinlist .os.b$i.f.e; if {$darwin_cotvnc} {.os.b$i.f.e configure -state disabled} + pack .os.b$i.f.l -side left + pack .os.b$i.f.e -side right -expand 1 -fill x + + pack .os.b$i.f .os.b$i.l -side top -fill x + + incr i + + frame .os.b$i -height 2; incr i + + frame .os.b$i -relief $relief -borderwidth 2 + + label .os.b$i.l -font fixed -anchor w -text "Enter the max height in pixels, e.g. '900'"; + + global ycrop_string + frame .os.b$i.f + label .os.b$i.f.l -text "Y Crop: " + lappend darwinlist .os.b$i.f.l; if {$darwin_cotvnc} {.os.b$i.f.l configure -state disabled} + entry .os.b$i.f.e -width 10 -textvariable ycrop_string + lappend darwinlist .os.b$i.f.e; if {$darwin_cotvnc} {.os.b$i.f.e configure -state disabled} + pack .os.b$i.f.l -side left + pack .os.b$i.f.e -side right -expand 1 -fill x + + pack .os.b$i.f .os.b$i.l -side top -fill x + + incr i + + frame .os.b$i -height 2; incr i + + frame .os.b$i -relief $relief -borderwidth 2 + + label .os.b$i.l -font fixed -anchor w -text "Enter the scrollbar width in pixels, e.g. '4'"; + + global sbwid_string + frame .os.b$i.f + label .os.b$i.f.l -text "ScrollBar Width: " + lappend darwinlist .os.b$i.f.l; if {$darwin_cotvnc} {.os.b$i.f.l configure -state disabled} + entry .os.b$i.f.e -width 10 -textvariable sbwid_string + lappend darwinlist .os.b$i.f.e; if {$darwin_cotvnc} {.os.b$i.f.e configure -state disabled} + pack .os.b$i.f.l -side left + pack .os.b$i.f.e -side right -expand 1 -fill x + + pack .os.b$i.f .os.b$i.l -side top -fill x + + incr i + + frame .os.b$i -height 2; incr i + + frame .os.b$i -relief $relief -borderwidth 2 + + label .os.b$i.l -font fixed -anchor w -text "Enter the RFB version to pretend to be using, e.g. '3.4'"; + label .os.b$i.l2 -font fixed -anchor w -text "Sometimes needed for UltraVNC: 3.4, 3.6, 3.14, 3.16"; + + global rfbversion + frame .os.b$i.f + label .os.b$i.f.l -text "RFB Version: " + lappend darwinlist .os.b$i.f.l; if {$darwin_cotvnc} {.os.b$i.f.l configure -state disabled} + entry .os.b$i.f.e -width 10 -textvariable rfbversion + lappend darwinlist .os.b$i.f.e; if {$darwin_cotvnc} {.os.b$i.f.e configure -state disabled} + pack .os.b$i.f.l -side left + pack .os.b$i.f.e -side right -expand 1 -fill x + + pack .os.b$i.f .os.b$i.l .os.b$i.l2 -side top -fill x + + incr i + + frame .os.b$i -height 2; incr i + + frame .os.b$i -relief $relief -borderwidth 2 + + label .os.b$i.l1 -font fixed -anchor w -text "List encodings in preferred order, for example"; + label .os.b$i.l2 -font fixed -anchor w -text "'copyrect zrle tight' The list of encodings is:"; + label .os.b$i.l3 -font fixed -anchor w -text "copyrect tight zrle zywrle hextile zlib corre rre raw"; + + global ssvnc_encodings + frame .os.b$i.f + label .os.b$i.f.l -text "Encodings: " + lappend darwinlist .os.b$i.f.l; if {$darwin_cotvnc} {.os.b$i.f.l configure -state disabled} + entry .os.b$i.f.e -width 10 -textvariable ssvnc_encodings + lappend darwinlist .os.b$i.f.e; if {$darwin_cotvnc} {.os.b$i.f.e configure -state disabled} + pack .os.b$i.f.l -side left + pack .os.b$i.f.e -side right -expand 1 -fill x + + pack .os.b$i.f .os.b$i.l1 .os.b$i.l2 .os.b$i.l3 -side top -fill x + + incr i + + frame .os.b$i -height 2; incr i + + for {set j 1} {$j < $i} {incr j} { + pack .os.b$j -side top -fill x + } + + frame .os.b + button .os.b.done -text "Done" -command {destroy .os} + bind .os <Escape> {destroy .os} + wm protocol .os WM_DELETE_WINDOW {destroy .os} + button .os.b.help -text "Help" -command help_ssvncviewer_opts + + global use_listen + if {$use_listen} { + button .os.b.connect -text "Listen" -command launch + } else { + button .os.b.connect -text "Connect" -command launch + } + + pack .os.b.help .os.b.connect .os.b.done -fill x -expand 1 -side left + + pack .os.b -side top -fill x + + global darwin_cotvnc_blist + foreach b $darwinlist { + set darwin_cotvnc_blist($b) 1 + } + + center_win .os + wm resizable .os 1 0 + focus .os +} + + proc in_path {cmd} { global env set p $env(PATH) @@ -12431,6 +13075,7 @@ proc adv_ssh_tog {on} { proc adv_listen_ssl_tog {on} { global stunnel_local_protection_button is_windows + global disable_ssl_workarounds_button if [info exists stunnel_local_protection_button] { if {$on} { catch {$stunnel_local_protection_button configure -state normal} @@ -12438,6 +13083,13 @@ proc adv_listen_ssl_tog {on} { catch {$stunnel_local_protection_button configure -state disabled} } } + if [info exists disable_ssl_workarounds_button] { + if {$on} { + catch {$disable_ssl_workarounds_button configure -state normal} + } else { + catch {$disable_ssl_workarounds_button configure -state disabled} + } + } if {$is_windows} { catch {$stunnel_local_protection_button configure -state disabled} } @@ -12558,10 +13210,12 @@ proc listen_adjust {} { catch {.b.conn configure -text "Listen"} catch {.o.b.connect configure -text "Listen"} catch {$multiple_listen_button configure -state normal} + catch {mesg "Listen :N -> Port 5500+N, i.e. :0 -> 5500, :1 -> 5501, :2 -> 5502 ..."} } else { catch {.b.conn configure -text "Connect"} catch {.o.b.connect configure -text "Connect"} catch {$multiple_listen_button configure -state disabled} + catch {mesg "Switched to Forward Connection mode."} } if {$is_windows} { catch {$multiple_listen_button configure -state disabled} @@ -12618,6 +13272,20 @@ proc x11vnc_find_adjust {which} { regsub -all {[ ][ ]*} $remote_ssh_cmd " " remote_ssh_cmd } +proc set_darwin_cotvnc_buttons {} { + global darwin_cotvnc uname darwin_cotvnc_blist + + if {$uname == "Darwin" && [info exists darwin_cotvnc_blist]} { + foreach b [array names darwin_cotvnc_blist] { + if {$darwin_cotvnc} { + catch {$b configure -state disabled} + } else { + catch {$b configure -state normal} + } + } + } +} + proc set_options {} { global use_alpha use_grab use_ssh use_sshssl use_viewonly use_fullscreen use_bgr233 global use_nojpeg use_raise_on_beep use_compresslevel use_quality use_x11_macosx @@ -12627,6 +13295,7 @@ proc set_options {} { global use_x11vnc_find x11vnc_find_widget global use_x11vnc_xlogin x11vnc_xlogin_widget uvnc_bug_widget global ts_only + global darwin_cotvnc_blist if {$ts_only} { set_ts_options return @@ -12666,19 +13335,14 @@ proc set_options {} { "Unix Username & Password" -command {unixpw_adjust} if {$is_windows} {.o.b$i configure -state disabled} if {$darwin_cotvnc} {.o.b$i configure -state disabled} + set darwin_cotvnc_blist(.o.b$i) 1 incr i checkbutton .o.b$i -anchor w -variable use_listen -text \ - "Reverse VNC Connection (-LISTEN)" -command {listen_adjust; if {$vncdisplay == ""} {set vncdisplay ":0"}; if {$use_listen} {destroy .o}} + "Reverse VNC Connection (-LISTEN)" -command {listen_adjust; if {$vncdisplay == ""} {set vncdisplay ":0"} else {set vncdisplay ""}; if {$use_listen} {destroy .o}} #if {$is_windows} {.o.b$i configure -state disabled} - if {$darwin_cotvnc} {.o.b$i configure -state disabled} - incr i - - checkbutton .o.b$i -anchor w -variable use_uvnc_ssl_bug -text \ - "UltraVNC Single Click III Bug" - if {$is_windows} {.o.b$i configure -state disabled} - if {$use_ssh && !$use_sshssl} {.o.b$i configure -state disabled} - set uvnc_bug_widget ".o.b$i" + #if {$darwin_cotvnc} {.o.b$i configure -state disabled} + #set darwin_cotvnc_blist(.o.b$i) 1 incr i checkbutton .o.b$i -anchor w -variable use_viewonly -text \ @@ -12692,27 +13356,31 @@ proc set_options {} { checkbutton .o.b$i -anchor w -variable use_raise_on_beep -text \ "Raise On Beep" if {$darwin_cotvnc} {.o.b$i configure -state disabled} + set darwin_cotvnc_blist(.o.b$i) 1 incr i checkbutton .o.b$i -anchor w -variable use_bgr233 -text \ "Use 8bit color (-bgr233)" if {$darwin_cotvnc} {.o.b$i configure -state disabled} + set darwin_cotvnc_blist(.o.b$i) 1 incr i checkbutton .o.b$i -anchor w -variable use_nojpeg -text \ "Do not use JPEG (-nojpeg)" if {$darwin_cotvnc} {.o.b$i configure -state disabled} + set darwin_cotvnc_blist(.o.b$i) 1 incr i checkbutton .o.b$i -anchor w -variable use_x11_macosx -text \ "Use X11 vncviewer on MacOSX" \ - -command {if {$use_x11_macosx} {set darwin_cotvnc 0} else {set darwin_cotvnc 1}; catch {destroy .o}; set_options} + -command {if {$use_x11_macosx} {set darwin_cotvnc 0} else {set darwin_cotvnc 1}; set_darwin_cotvnc_buttons} if {$uname != "Darwin"} {.o.b$i configure -state disabled} incr i menubutton .o.b$i -anchor w -menu .o.b$i.m -textvariable compresslevel_text -relief groove set compresslevel_text "Compress Level: $use_compresslevel" if {$darwin_cotvnc} {.o.b$i configure -state disabled} + set darwin_cotvnc_blist(.o.b$i) 1 menu .o.b$i.m -tearoff 0 for {set j -1} {$j < 10} {incr j} { @@ -12731,6 +13399,7 @@ proc set_options {} { menubutton .o.b$i -anchor w -menu .o.b$i.m -textvariable quality_text -relief groove set quality_text "Quality: $use_quality" if {$darwin_cotvnc} {.o.b$i configure -state disabled} + set darwin_cotvnc_blist(.o.b$i) 1 menu .o.b$i.m -tearoff 0 for {set j -1} {$j < 10} {incr j} { @@ -12808,6 +13477,7 @@ proc set_options {} { regsub {^ *} $t2 "" t2 regsub {^ *} $t3 "" t3 } + button .o.advanced -anchor w -text $t1 -command set_advanced_options button .o.clear -anchor w -text $t2 -command set_defaults button .o.delete -anchor w -text $t3 -command {destroy .o; delete_profile} @@ -12890,7 +13560,12 @@ proc print_help {} { help_advanced_opts set str [.ah.f.t get 1.0 end] puts "${b}Advanced Options Help:\n$str" - destroy .oh + destroy .ah + + help_ssvncviewer_opts + set str [.av.f.t get 1.0 end] + puts "${b}ssvncviewer Options Help:\n$str" + destroy .av help_certs set str [.ch.f.t get 1.0 end] @@ -13144,6 +13819,7 @@ if {! $is_windows} { catch {set uname [exec uname]} } + set darwin_cotvnc 0 if {$uname == "Darwin"} { if {! [info exists env(DISPLAY)]} { @@ -13163,6 +13839,9 @@ if {$uname == "Darwin"} { catch {option add *Button.font {System 10} widgetDefault} } +##for testing macosx +##set uname Darwin; set darwin_cotvnc 1 + set putty_pw "" global scroll_text_focus @@ -13357,6 +14036,8 @@ bind . <Shift-B2-ButtonRelease> {toggle_tsonly} bind .l <Shift-ButtonRelease> {toggle_tsonly} bind . <Control-h> {toggle_sshonly} bind . <Control-T> {to_ssvnc} +bind . <Control-a> {set_advanced_options} +bind . <Control-u> {set_ssvncviewer_options} global entered_gui_top button_gui_top set entered_gui_top 0 |