From 3110c0e32f2f1fe823917eebc33bedc44a84160c Mon Sep 17 00:00:00 2001 From: runge Date: Wed, 16 May 2007 21:32:52 +0000 Subject: [PATCH] Add SSL support to UltraVNC Java Viewer (has filetransfer gui). Fix UltraVNC bugs and improve FTP gui a bit. --- classes/ssl/Makefile.am | 2 +- classes/ssl/README | 14 + classes/ssl/SignedUltraViewerSSL.jar | Bin 0 -> 91540 bytes classes/ssl/SignedVncViewer.jar | Bin 79005 -> 79003 bytes classes/ssl/UltraViewerSSL.jar | Bin 0 -> 88970 bytes classes/ssl/VncViewer.jar | Bin 76220 -> 76220 bytes classes/ssl/ss_vncviewer | 259 +- ...ghtvnc-1.3dev7_javasrc-vncviewer-ssl.patch | Bin 44072 -> 42592 bytes classes/ssl/ultra.vnc | 27 + classes/ssl/ultrasigned.vnc | 27 + .../ssl/ultravnc-102-JavaViewer-ssl-etc.patch | 2323 +++++++++++++++++ 11 files changed, 2593 insertions(+), 59 deletions(-) create mode 100644 classes/ssl/SignedUltraViewerSSL.jar create mode 100644 classes/ssl/UltraViewerSSL.jar create mode 100644 classes/ssl/ultra.vnc create mode 100644 classes/ssl/ultrasigned.vnc create mode 100644 classes/ssl/ultravnc-102-JavaViewer-ssl-etc.patch diff --git a/classes/ssl/Makefile.am b/classes/ssl/Makefile.am index b0d3664..29ad54d 100644 --- a/classes/ssl/Makefile.am +++ b/classes/ssl/Makefile.am @@ -1,2 +1,2 @@ -EXTRA_DIST=VncViewer.jar index.vnc SignedVncViewer.jar proxy.vnc README ss_vncviewer onetimekey +EXTRA_DIST=VncViewer.jar index.vnc SignedVncViewer.jar proxy.vnc README ss_vncviewer onetimekey UltraViewerSSL.jar SignedUltraViewerSSL.jar ultra.vnc ultrasigned.vnc diff --git a/classes/ssl/README b/classes/ssl/README index 7c3115f..1b794e4 100644 --- a/classes/ssl/README +++ b/classes/ssl/README @@ -69,4 +69,18 @@ Running Java SSL VncViewer from the command line: java -cp ./VncViewer.jar VncViewer HOST PORT substitute and with the actual values. + You can add any other parameters, e.g.: ignoreProxy yes +--------------------------------------------------------------- +UltraVNC: + +The UltraVNC java viewer has also been patched to support SSL. Various +bugs in the UltraVNC java viewer were also fixed. This viewer can be +useful because is support UltraVNC filetransfer, and so it works on +Unix, etc. + +UltraViewerSSL.jar +SignedUltraViewerSSL.jar +ultra.vnc +ultraproxy.vnc +ultravnc-102-JavaViewer-ssl-etc.patch diff --git a/classes/ssl/SignedUltraViewerSSL.jar b/classes/ssl/SignedUltraViewerSSL.jar new file mode 100644 index 0000000000000000000000000000000000000000..8a60f0d963c8d0557c264db33f79132b99acaf71 GIT binary patch literal 91540 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%0D$A;Ka*A{4*)3X z>HLGcJ?HP0gpirWrv9^9J>3BSZ8uM(6r#sJ;9rQ{B$6VlCJb3%zaN&}XUGDDx%&G3 zQ@-&${U5=Q1!syZj^9tKL>K_@Zw*EV7rTFOpmYq;nJokWbX)%!{818;!PXM#gXjOK znBqch(^aJQ6*02n$bQ)=0HC)I004tEz^+zKHlBK}nl}GYA^S7;y6AH%TS&MWvgm%N z*d6$jLh$eR9_BXNe}<&+`7a8B(LX7K{+{AjbxV@p0#O+MgW~TAeidf>Jq(l+B*EWF zV*Z(lU&X|Jf9{2U{Z&Bhe`WGlm5-m2V}BX><*)d^58&7Nx4+lnI{?am>w^60{I89$ yzdt$G@lpO9nfojF=QHou*U|4_3W|lg2>3tYIz4Xy literal 0 HcmV?d00001 diff --git a/classes/ssl/SignedVncViewer.jar b/classes/ssl/SignedVncViewer.jar index 1d60cb1d81111e18d545e4db17d56f4a4f32749d..1244b2acc6c3eade925146d51da0279c7254dca8 100644 GIT binary patch delta 1237 zcmZWoYix^Q6h3d;t?Q;%wwc+in{6erUe;Deu(dL`E$C!q!$c&4A1-kT8iGtDB1nDg z{9rCaHkTPHkuY;hCeaQX!raX)D&n>wY{vQCucV##`|&;Je9t-Od7t-tEBuOmeudgu zAXmgf1U>#uXU?jd01T5D;7IqI%H+K_EDawh%K^> z)5{vhU){4zlmEsV)|fu5MO9u`oKW0p|8PF%+6vv&`QKhtt+{<={mPSm^o`qY)Ae)j zu$}DeD8CqXziNrO>)G@AbvH_8fU`guF{`!n$7>mYM-CJRiLyb^Qh@@dj4yKNCr_PV z>=86kTKQYjYmRD*8o)UIt zvRn?v>e(1IWo-XU#I1T};os`?ERnV2BRxyfQMs*3Rct>I2~gV~AUeodfV3z8$Ldv! zaGrt1Yenu1Q)KJ)&T5G?!Dx;yI6 zr%2NrB>>e0tr6I2VtP)>sO~?ln-nij0w70&mL3gRER~ZEj_h{Fh68LR-}?nos0^28 z1uSxB(fB&7$qHyrI^umIr|~n%lF-gB{P?#ss}9d~r31{K*xR?uXfy|Wn`S28R#pn` z%J|{V0w#+kqr@989&w@K(WEw-Qc9bQ3z4=LPn%gf*S})bQiNkzL;O8i@ke*tf(CCZD9eX#8%P?!qCd)@=iUPjJA=G1}wf*kEc<&DrDm5LBb(@VV3>|N_ z%hoHI&O666cHP122gPMgMjzuGd*W>AP}*YpY)fBrZCh$_!|?P-b&i)ly(4&c#)GWT zg_g$)H}*!0VybRg=2H#j5|9+{AZoiF^?XbKz(WRLZevReY#uQXf`lz8vGN^>TY0G@ zkdb1)D#>R@3cNhs#0>7lBA30fr;*9> zGGW-}Oo2L?wQAy0<{7HlXpC~AsZ$wA_7uE6_C!j-xm<%)(|N`cOd|yqG64ZR2I#38 zI#@a?7imEfDdTWp<_>GM^S7o^M*q;%RY+a%aecpNm6-lOmSzr)-VZ0>k-HRr3LrW3 zGXlntoguv(Mza`bm*AzgaIsa$ z=v(%C4L;5N4gla9HjfUCs-T?Ob&kaLlqez+2GW8_gdagiBXN6VTP1`yqv}Z99^t)& z=b^7ePsZV*#=Hf|)l2OqU@kaW!IxBcIju5;E|DCnY_R diff --git a/classes/ssl/UltraViewerSSL.jar b/classes/ssl/UltraViewerSSL.jar new file mode 100644 index 0000000000000000000000000000000000000000..7543238432e395350986e0354df83c8ff3e3b717 GIT binary patch literal 88970 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 literal 0 HcmV?d00001 diff --git a/classes/ssl/VncViewer.jar b/classes/ssl/VncViewer.jar index b4ac298f4c9ec510daf001aaf72d41bae57c148c..c2e416c928cee8448c08ce73a5bb03877b2c2583 100644 GIT binary patch delta 528 zcmdmUnPtyq7Ty4FW)=|!4j_Eluwf#v6*GwPYG!`XuwmncCtM(U^LB1wPB7!F$Z0k( zW48252%}wT6BAg(Mpcys%t+C!WCk-H=;T90f((sW!6F@I?gC)OB{yD(nn#{rA>T zmi%BTvDg5J$(hN!dB7s-1r883S;d=Gz#QdjLr}>AO=Y4zA~c?m?5VERh*#0Xa`oaP=(PF%($z<=m=J$ zs0vgAvLaa(XdsBOK$X!6%y_EG=m}P1sK#gu7AaH%nha92K@F9+Ow$_CDt3s2}1pr!rw-NvV diff --git a/classes/ssl/ss_vncviewer b/classes/ssl/ss_vncviewer index a20f164..f7b4831 100755 --- a/classes/ssl/ss_vncviewer +++ b/classes/ssl/ss_vncviewer @@ -260,6 +260,12 @@ if [ "X$use_ssh" = "X1" -a "X$use_sshssl" = "X" ]; then fi fi +if echo "$orig" | grep '^V[Nn][Cc]://' > /dev/null; then + SSVNC_NO_ENC_WARN=1 + export SSVNC_NO_ENC_WARN + orig=`echo "$orig" | sed -e 's/^...:/vnc:/'` +fi + if echo "$orig" | grep '^vnc://' > /dev/null; then orig=`echo "$orig" | sed -e 's,vnc://,,'` verify="" @@ -271,9 +277,14 @@ elif echo "$orig" | grep '^vncs://' > /dev/null; then orig=`echo "$orig" | sed -e 's,vncs://,,'` elif echo "$orig" | grep '^vncssl://' > /dev/null; then orig=`echo "$orig" | sed -e 's,vncssl://,,'` +elif echo "$orig" | grep '^vnc+ssl://' > /dev/null; then + orig=`echo "$orig" | sed -e 's,vnc.ssl://,,'` elif echo "$orig" | grep '^vncssh://' > /dev/null; then orig=`echo "$orig" | sed -e 's,vncssh://,,'` use_ssh=1 +elif echo "$orig" | grep '^vnc+ssh://' > /dev/null; then + orig=`echo "$orig" | sed -e 's,vnc.ssh://,,'` + use_ssh=1 fi if [ "X$reverse" != "X" -a "X$direct_connect" = "X" ]; then VNCVIEWER_LISTEN_LOCALHOST=1 @@ -314,6 +325,8 @@ if uname | grep Linux > /dev/null; then inuse=`netstat -ant | egrep 'LISTEN|WAIT|ESTABLISH|CLOSE' | awk '{print $4}' | sed 's/^.*://'` elif uname | grep SunOS > /dev/null; then inuse=`netstat -an -f inet -P tcp | grep LISTEN | awk '{print $1}' | sed 's/^.*\.//'` +elif uname | grep -i bsd > /dev/null; then + inuse=`netstat -ant -f inet | grep LISTEN | awk '{print $4}' | sed 's/^.*\.//'` # add others... fi @@ -412,6 +425,31 @@ if echo "$0" | grep vncip > /dev/null; then VNCVIEWERCMD="$VNCIPCMD" fi +rchk() { + if [ "X$BASH_VERSION" = "X" ]; then + RANDOM=`date +%S``sh -c 'echo $$'``ps -elf 2>&1 | sum 2>&1 | awk '{print $1}'` + fi +} +rchk + +mytmp() { + tf=$1 + rm -rf "$tf" || exit 1 + if [ -d "$tf" ]; then + echo "tmp file $tf still exists as a directory." + exit 1 + elif [ -L "$tf" ]; then + echo "tmp file $tf still exists as a symlink." + exit 1 + elif [ -f "$tf" ]; then + echo "tmp file $tf still exists." + exit 1 + fi + touch "$tf" || exit 1 + chmod 600 "$tf" || exit 1 + rchk +} + if [ "X$use_ssh" = "X1" ]; then ssh_port="22" ssh_host="$host" @@ -472,28 +510,88 @@ if [ "X$use_ssh" = "X1" ]; then if [ "X$SS_VNCVIEWER_USE_C" != "X" ]; then C="-C" fi - if [ "X$reverse" = "X" ]; then + + getport="" + if echo "$ssh_cmd" | egrep "^(PORT=|P=)" > /dev/null; then + getport=1 + PORT="" + ssh_cmd=`echo "$ssh_cmd" | sed -e 's/^PORT=[ ]*//' -e 's/^P=//'` + SSVNC_NO_ENC_WARN=1 + if [ "X$use_sshssl" = "X" ]; then + direct_connect=1 + fi + fi + if [ "X$getport" != "X" ]; then + ssh_redir="-D ${use}" + elif [ "X$reverse" = "X" ]; then ssh_redir="-L ${use}:${vnc_host}:${port}" else ssh_redir="-R ${port}:${vnc_host}:${use}" fi pmark=`sh -c 'echo $$'` + # the -t option actually speeds up typing response via VNC!! + if [ "X$SS_VNCVIEWER_SSH_ONLY" != "X" ]; then echo "$ssh -x -p $ssh_port $targ $C $ssh_args $ssh_host \"$info\"" echo "" $ssh -x -p $ssh_port $targ $C $ssh_args $ssh_host "$ssh_cmd" exit $? + elif [ "X$SS_VNCVIEWER_NO_F" != "X" ]; then echo "$ssh -x -p $ssh_port $targ $C $ssh_redir $ssh_args $ssh_host \"$info\"" echo "" $ssh -x -p $ssh_port $targ $C $ssh_redir $ssh_args $ssh_host "$ssh_cmd" + rc=$? + + elif [ "X$getport" != "X" ]; then + echo "$ssh -x -f -p $ssh_port $targ $C $ssh_redir $ssh_args $ssh_host \"$info\"" + echo "" + + tport=/tmp/tport${RANDOM}.$$ + mytmp $tport + $ssh -x -f -p $ssh_port $targ $C $ssh_redir $ssh_args $ssh_host "$ssh_cmd" > $tport + rc=$? + + stty sane + i=0 + while [ $i -lt 10 ]; do + sleep 1 + PORT=`grep "^PORT=" $tport | head -1 | sed -e 's/PORT=//' -e 's/\r//g'` + if echo "$PORT" | grep '^[0-9][0-9]*$' > /dev/null; then + break + fi + vnss=`sed -e 's/\r//g' $tport | egrep -i '^(New.* desktop is|A VNC server is already running).*:[0-9[0-9]*$' | head -1 | awk '{print $NF}'` + if [ "X$vnss" != "X" ]; then + PORT=`echo "$vnss" | awk -F: '{print $2}'` + if echo "$PORT" | grep '^[0-9][0-9]*$' > /dev/null; then + if [ $PORT -lt 100 ]; then + PORT=`expr $PORT + 5900` + fi + fi + if echo "$PORT" | grep '^[0-9][0-9]*$' > /dev/null; then + break + fi + fi + i=`expr $i + 1` + done + + echo "PORT=$PORT" 1>&2 + PPROXY_SOCKS=1 + export PPROXY_SOCKS + host="localhost" + port="$PORT" + proxy="localhost:$use" + rm -f $tport + else echo "$ssh -x -f -p $ssh_port $targ $C $ssh_redir $ssh_args $ssh_host \"$info\"" echo "" $ssh -x -f -p $ssh_port $targ $C $ssh_redir $ssh_args $ssh_host "$ssh_cmd" + rc=$? fi - if [ "$?" != "0" ]; then + + if [ "$rc" != "0" ]; then echo "" echo "ssh to $ssh_host failed." exit 1 @@ -511,7 +609,9 @@ if [ "X$use_ssh" = "X1" ]; then fi c=`expr $c + 1` done - if [ "X$ssh_cmd" = "Xsleep $ssh_sleep" ] ; then + if [ "X$getport" != "X" ]; then + : + elif [ "X$ssh_cmd" = "Xsleep $ssh_sleep" ] ; then sleep 1 else # let any command get started a bit. @@ -521,7 +621,7 @@ if [ "X$use_ssh" = "X1" ]; then #reset stty sane #echo "pssh=\"$pssh\"" - if [ "X$use_sshssl" = "X" ]; then + if [ "X$use_sshssl" = "X" -a "X$getport" = "X" ]; then echo "Running viewer:" trap "final" 0 2 15 @@ -547,7 +647,12 @@ if [ "X$use_ssh" = "X1" ]; then port=$use use=$use2 N=`expr $use - 5900` - proxy="" + if [ "X$getport" != "X" ]; then + host="$host0" + port="$port0" + else + proxy="" + fi fi fi @@ -565,53 +670,33 @@ if [ "X$mycert" != "X" ]; then cert="cert = $mycert" fi -mytmp() { - tf=$1 - rm -rf "$tf" || exit 1 - if [ -d "$tf" ]; then - echo "tmp file $tf still exists as a directory." - exit 1 - elif [ -L "$tf" ]; then - echo "tmp file $tf still exists as a symlink." - exit 1 - elif [ -f "$tf" ]; then - echo "tmp file $tf still exists." - exit 1 - fi - touch "$tf" || exit 1 - chmod 600 "$tf" || exit 1 -} - -if echo "$RANDOM" | grep '[^0-9]' > /dev/null; then - RANDOM=`date +%S` -fi - pcode() { tf=$1 - SSVNC_PROXY=$proxy; export SSVNC_PROXY - SSVNC_DEST="$host:$port"; export SSVNC_DEST + PPROXY_PROXY=$proxy; export PPROXY_PROXY + PPROXY_DEST="$host:$port"; export PPROXY_DEST cod='#!/usr/bin/perl -# A hack to glue stunnel to a Web proxy for client connections. +# A hack to glue stunnel to a Web proxy or SOCKS for client connections. use IO::Socket::INET; -my ($first, $second) = split(/,/, $ENV{SSVNC_PROXY}); +my ($first, $second) = split(/,/, $ENV{PPROXY_PROXY}); my ($proxy_host, $proxy_port) = split(/:/, $first); -my $connect = $ENV{SSVNC_DEST}; +my $connect = $ENV{PPROXY_DEST}; -print STDERR "\nperl script for web proxing:\n"; +print STDERR "\nPPROXY v0.0: a tool for Web proxies and SOCKS connections.\n"; print STDERR "proxy_host: $proxy_host\n"; print STDERR "proxy_port: $proxy_port\n"; print STDERR "proxy_connect: $connect\n"; my $listen_handle = ""; -if ($ENV{SSVNC_LISTEN} != "") { +if ($ENV{PPROXY_LISTEN} != "") { my $listen_sock = IO::Socket::INET->new( Listen => 2, LocalAddr => "localhost", - LocalPort => $ENV{SSVNC_LISTEN}, - Proto => "tcp"); + LocalPort => $ENV{PPROXY_LISTEN}, + Proto => "tcp" + ); if (! $listen_sock) { die "perl proxy: $!\n"; } @@ -625,7 +710,8 @@ if ($ENV{SSVNC_LISTEN} != "") { my $sock = IO::Socket::INET->new( PeerAddr => $proxy_host, PeerPort => $proxy_port, - Proto => "tcp"); + Proto => "tcp" +); if (! $sock) { unlink($0); @@ -633,24 +719,77 @@ if (! $sock) { } my $con = ""; -if ($second ne "") { +my $con0 = ""; +if ($ENV{PPROXY_SOCKS} ne "") { + $second = ""; + my ($h, $p) = split(/:/, $connect); + $con .= pack("C", 0x04); + $con .= pack("C", 0x01); + $con .= pack("n", $p); + + my $SOCKS_4a = 0; + if ($h eq "localhost" || $h eq "127.0.0.1") { + $con .= pack("C", 127); + $con .= pack("C", 0); + $con .= pack("C", 0); + $con .= pack("C", 1); + } elsif ($h =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) { + $con .= pack("C", $1); + $con .= pack("C", $2); + $con .= pack("C", $3); + $con .= pack("C", $4); + } else { + $con .= pack("C", 0); + $con .= pack("C", 0); + $con .= pack("C", 0); + $con .= pack("C", 3); + $SOCKS_4a = 1; + } + + $con .= "nobody"; + $con .= pack("C", 0); + + if ($SOCKS_4a) { + $con .= $h; + $con .= pack("C", 0); + } + $con0 = "SOCKS4 via $proxy_host:$proxy_port to $h:$p\n\n"; + +} elsif ($second ne "") { $con = "CONNECT $second HTTP/1.1\r\n"; $con .= "Host: $second\r\n\r\n"; + $con0 = $con; } else { $con = "CONNECT $connect HTTP/1.1\r\n"; $con .= "Host: $connect\r\n\r\n"; + $con0 = $con; } -print STDERR "proxy_request1:\n$con"; +print STDERR "proxy_request1:\n$con0"; print $sock $con; unlink($0); my $rep = ""; -while ($rep !~ /\r\n\r\n/) { - my $c = getc($sock); - print STDERR $c; - $rep .= $c; +if ($ENV{PPROXY_SOCKS} ne "") { + $rep = "HTTP/1.0 200"; + for (my $i = 0; $i < 8; $i++) { + my $c; + sysread($sock, $c, 1); + my $s = unpack("C", $c); + if ($i == 0) { + $rep = "" if $s != 0x0; + } elsif ($i == 1) { + $rep = "" if $s != 0x5a; + } + } +} else { + while ($rep !~ /\r\n\r\n/) { + my $c; + sysread($sock, $c, 1); + print STDERR $c; + $rep .= $c; + } } if ($rep !~ m,HTTP/.* 200,) { die "proxy error: $rep\n"; @@ -665,7 +804,8 @@ if ($second ne "") { $rep = ""; while ($rep !~ /\r\n\r\n/) { - my $c = getc($sock); + my $c; + sysread($sock, $c, 1); print STDERR $c; $rep .= $c; } @@ -743,8 +883,8 @@ if [ "X$proxy" != "X" ]; then if [ "X$showcert" != "X1" -a "X$direct_connect" = "X" ]; then if uname | grep Darwin >/dev/null; then nd=`expr $use + 333` - SSVNC_LISTEN=$nd - export SSVNC_LISTEN + PPROXY_LISTEN=$nd + export PPROXY_LISTEN $ptmp 2>/dev/null & sleep 3 host="localhost" @@ -762,8 +902,8 @@ fi if [ "X$showcert" = "X1" ]; then if [ "X$proxy" != "X" ]; then - SSVNC_LISTEN=$use - export SSVNC_LISTEN + PPROXY_LISTEN=$use + export PPROXY_LISTEN $ptmp 2>/dev/null & sleep 3 host="localhost" @@ -774,24 +914,29 @@ if [ "X$showcert" = "X1" ]; then fi if [ "X$direct_connect" != "X" ]; then - echo "" - echo "Running viewer for direct connection:" - echo "" - echo "** NOTE: THERE WILL BE NO SSL OR SSH ENCRYPTION **" - echo "" - if type printf > /dev/null 2>&1; then + if [ "X$getport" = "X" ]; then + echo "" + echo "Running viewer for direct connection:" + echo "" + echo "** NOTE: THERE WILL BE NO SSL OR SSH ENCRYPTION **" + echo "" + fi + if [ "X$SSVNC_NO_ENC_WARN" != "X" ]; then + sleep 1 + elif type printf > /dev/null 2>&1; then printf "Are you sure you want to continue? [y]/n " + read x else echo -n "Are you sure you want to continue? [y]/n " + read x fi - read x if [ "X$x" = "Xn" ]; then exit 1 fi echo "" if [ "X$ptmp" != "X" ]; then - SSVNC_LISTEN=$use - export SSVNC_LISTEN + PPROXY_LISTEN=$use + export PPROXY_LISTEN $ptmp & if [ "X$reverse" = "X" ]; then sleep 2 @@ -816,8 +961,6 @@ if [ "X$direct_connect" != "X" ]; then exit $? fi -##debug = 7 -## debug = 6 tmp=/tmp/ss_vncviewer${RANDOM}.$$ mytmp "$tmp" diff --git a/classes/ssl/tightvnc-1.3dev7_javasrc-vncviewer-ssl.patch b/classes/ssl/tightvnc-1.3dev7_javasrc-vncviewer-ssl.patch index f4386558071636a5e42271ffdd6bd122830468b5..0ce44740de5932a28bd8f5ae82a9cb8033a5343d 100644 GIT binary patch delta 14 WcmZ2+gXzH;rVUDLn_qF;EdT&C?gozl delta 1410 zcmV-|1%3M9%mS#`0tlJ zEiE8+Zew3+VRm72a$_!Ua%pETP%$+*Gc+z_X>yaF3N;>3F*P|eG%jRmatSgpFgGnQ zG%YeYATlsIGcr0fIg|066_XDO2Y)soKtKvBFoFcW0s#Op4F(A+hDe6@4FLfG1pows z1gJ2A1f&8100M#m0RYINfk`U5c)~S0;k>XObFn$y(SSWk2YwxZD{2ZWlSHS(fvF1- zIT~Lis`Zlj7hG{3YzB`Q;VA=xacX=o_q_@$EsmdBXFT7>|J7?*Up<(^Z+~BgPp5?= z%E4Hs?K+c8%jeO!XHh|RiKKFPdDh|a=#&8_u19y@?V!&T=A${nqgLW;uol-xK)N+r ztL+Lag%dtqJvpqcraaQ9BKo)185nl-sW*DkcbTSctgiHkiqjWa(8Fs_&8x}lpqoD) z!sILwhn((A(o-=*60%VODSt#|pB#ZIu+;acAjAGp=481$YMPcR$rDKnN17h^A`y1A zoT@+sE4%%$n%>NzF3@cP0|5X50)hbmdNn!7#$^Q0PP+-}^WW&2XXES(PstwcJFDqM z(;+tPbrF(O@@=%)g)KQA2kEKaAt=}0h9HPM>-aoUIEEXSn79w5IbHNZ+fLQ%rVW4Ih8Nya!G$_S7@H%RlZIOv89t~ zb(kRT{H?5iK=4&Eo`3B)vx^sy$q;%im0TVYU*4~i^=i1-nhTW;%dlPY!p(LyB#Mo_}U`d@wUs^J?;szJPqlYKkkd7{21& zOT``bI`F=rHGde$UFiECZC zzmNvNrxzj_afFJvsTINT;+vVs->OTwmnFF+kph8$3wVs9t;%Gh*y@v-U~r!VDn@Jw zE*Px^`oXGOtsTMrTrzS_jy|$9sM;usQ@q^X1?9OOaeu`j*{fslorbhL2q(|K^|$SN zW3^x4C5yKQNJOOgab&BpK#&vhth=f1JmkZ5K?`;=wov?wM!ylrhzA#3{Ld)Zd`QRu zRK8&(4FZ9I0Ej~6pw~ogqQAhUOz4962M9pPgCtLalyr)$v2mXLrOz}HkzSkX$b0rT zC#<)~0e{3nxHO2bj7fw{iA|C-I`nRT!>1DGV;Jv@h!q4IU2e&i{+O2@N+ z2y2^T!(Ms%T63AYbbRfDlEyXb6Xn76Of)uw!U5bo+`$5YfdJc9zbwKQJ0H=QOL`}q zUCGd7WdMbNc*4BiDwS3rjVPsm&HE$luPq8I8h;VnT@4rTqbV(Fvxynl|4#3(Cj=5HwkB*S8s#5_6&*VSJFzE8miBn+eoxwfR3f@prMeN zc%Vf;mN1`KWLIq%3S1ygZy;`EcWh~HWgua6AZ2c3Aa7 + + + +$USER's $DESKTOP desktop ($DISPLAY) + + + + + +$PARAMS + +
+UltraVNC site + diff --git a/classes/ssl/ultrasigned.vnc b/classes/ssl/ultrasigned.vnc new file mode 100644 index 0000000..f7c08f8 --- /dev/null +++ b/classes/ssl/ultrasigned.vnc @@ -0,0 +1,27 @@ + + + + +$USER's $DESKTOP desktop ($DISPLAY) + + + + + +$PARAMS + +
+UltraVNC site + diff --git a/classes/ssl/ultravnc-102-JavaViewer-ssl-etc.patch b/classes/ssl/ultravnc-102-JavaViewer-ssl-etc.patch new file mode 100644 index 0000000..ceef727 --- /dev/null +++ b/classes/ssl/ultravnc-102-JavaViewer-ssl-etc.patch @@ -0,0 +1,2323 @@ +diff -Naur JavaViewer.orig/ButtonPanel.java JavaViewer/ButtonPanel.java +--- JavaViewer.orig/ButtonPanel.java 2004-12-12 20:51:02.000000000 -0500 ++++ JavaViewer/ButtonPanel.java 2007-05-16 15:50:54.000000000 -0400 +@@ -163,9 +163,12 @@ + } + else if (evt.getSource() == ftpButton) + { ++// begin runge/x11vnc ++ viewer.ftp.setSavedLocations(); ++// end runge/x11vnc + viewer.ftp.setVisible(!viewer.ftp.isVisible()); + viewer.rfb.readServerDriveList(); +- ++ + } + } + } +diff -Naur JavaViewer.orig/FTPFrame.java JavaViewer/FTPFrame.java +--- JavaViewer.orig/FTPFrame.java 2005-03-15 23:53:14.000000000 -0500 ++++ JavaViewer/FTPFrame.java 2007-05-16 16:05:15.000000000 -0400 +@@ -26,6 +26,10 @@ + import java.util.Vector; + import javax.swing.*; + ++// begin runge/x11vnc ++import java.util.Arrays; ++// end runge/x11vnc ++ + + /* + * Created on Feb 25, 2004 +@@ -80,6 +84,17 @@ + private File localSelection = null; // Holds the currently selected local file + private String remoteSelection = null; // Holds the currently selected remote file + public String selectedTable = null; ++ ++// begin runge/x11vnc ++ private javax.swing.JButton viewButton = null; ++ public File saveLocalDirectory = null; ++ public long saveLocalDirectoryTime = 0; ++ public int saveLocalDirectoryCount = 0; ++ public String saveRemoteDirectory = null; ++ public long saveRemoteDirectoryTime = 0; ++ public int saveRemoteDirectoryCount = 0; ++ private boolean localCurrentIsDir = true; ++// end runge/x11vnc + + // sf@2004 - Separate directories and files for better lisibility + private ArrayList DirsList; +@@ -125,11 +140,59 @@ + + void refreshRemoteLocation() + { ++ + remoteList.clear(); + remoteFileTable.setListData(remoteList); ++System.out.println("refreshRemoteLocation '" + remoteLocation.getText() + "'"); // runge/x11vnc + viewer.rfb.readServerDirectory(remoteLocation.getText()); + } + ++// begin runge/x11vnc ++ public void setSavedLocations() { ++ saveLocalDirectory = currentLocalDirectory; ++ saveLocalDirectoryTime = System.currentTimeMillis(); ++ saveLocalDirectoryCount = 0; ++ ++ if (remoteLocation != null) { ++ saveRemoteDirectory = remoteLocation.getText(); ++System.out.println("RemoteSave '" + saveRemoteDirectory + "'"); ++ } ++ saveRemoteDirectoryTime = System.currentTimeMillis(); ++ saveRemoteDirectoryCount = 0; ++ } ++ ++ private File saveLocalHack(File dir) { ++ saveLocalDirectoryCount++; ++System.out.println("L " + saveLocalDirectoryCount + " dt: " + (System.currentTimeMillis() - saveLocalDirectoryTime) + " - " + saveLocalDirectory); ++ if (System.currentTimeMillis() > saveLocalDirectoryTime + 2000 || saveLocalDirectoryCount > 2) { ++ saveLocalDirectory = null; ++ } ++ if (saveLocalDirectory != null) { ++ currentLocalDirectory = saveLocalDirectory; ++ localLocation.setText(saveLocalDirectory.toString()); ++ return saveLocalDirectory; ++ } else { ++ return dir; ++ } ++ } ++ ++ private String saveRemoteHack(String indrive) { ++ saveRemoteDirectoryCount++; ++System.out.println("R " + saveRemoteDirectoryCount + " - " + saveRemoteDirectory); ++ if (saveRemoteDirectory != null && saveRemoteDirectoryCount > 1) { ++ saveRemoteDirectory = null; ++ } ++ if (saveRemoteDirectory != null) { ++ if (! saveRemoteDirectory.equals("")) { ++System.out.println("saveRemoteHack setText + refreshRemoteLocation '" + saveRemoteDirectory + "'"); ++ return saveRemoteDirectory; ++ } ++ } ++ return indrive; ++ } ++// end runge/x11vnc ++ ++ + /* + * Prints the list of drives on the remote directory and returns a String[]. + * str takes as string like A:fC:lD:lE:lF:lG:cH:c +@@ -185,6 +248,7 @@ + stopButton.setVisible(true); + stopButton.setEnabled(true); + receiveButton.setEnabled(false); ++ viewButton.setEnabled(false); // runge/x11vnc + remoteTopButton.setEnabled(false); + sendButton.setEnabled(false); + remoteFileTable.setEnabled(false); +@@ -207,6 +271,7 @@ + stopButton.setVisible(false); + stopButton.setEnabled(false); + receiveButton.setEnabled(true); ++ viewButton.setEnabled(true); // runge/x11vnc + remoteTopButton.setEnabled(true); + sendButton.setEnabled(true); + remoteFileTable.setEnabled(true); +@@ -405,6 +470,7 @@ + buttonPanel = new javax.swing.JPanel(); + buttonPanel.setLayout(null); + buttonPanel.add(getReceiveButton(), null); ++ buttonPanel.add(getViewButton(), null); // runge/x11vnc + buttonPanel.add(getNewFolderButton(), null); + buttonPanel.add(getCloseButton(), null); + buttonPanel.add(getDeleteButton(), null); +@@ -422,7 +488,7 @@ + private javax.swing.JButton getSendButton() { + if (sendButton == null) { + sendButton = new javax.swing.JButton(); +- sendButton.setBounds(20, 30, 97, 25); ++ sendButton.setBounds(15, 30, 107, 25); // runge/x11vnc + sendButton.setText("Send >>"); + sendButton.setName("sendButton"); + sendButton.addActionListener(this); +@@ -438,7 +504,7 @@ + private javax.swing.JButton getReceiveButton() { + if (receiveButton == null) { + receiveButton = new javax.swing.JButton(); +- receiveButton.setBounds(20, 60, 97, 25); ++ receiveButton.setBounds(15, 60, 107, 25); // runge/x11vnc + receiveButton.setText("<< Receive"); + receiveButton.setName("receiveButton"); + receiveButton.addActionListener(this); +@@ -453,7 +519,7 @@ + private javax.swing.JButton getDeleteButton() { + if (deleteButton == null) { + deleteButton = new javax.swing.JButton(); +- deleteButton.setBounds(20, 110, 97, 25); ++ deleteButton.setBounds(15, 110, 107, 25); // runge/x11vnc + deleteButton.setText("Delete File"); + deleteButton.setName("deleteButton"); + deleteButton.addActionListener(this); +@@ -468,7 +534,7 @@ + private javax.swing.JButton getNewFolderButton() { + if (newFolderButton == null) { + newFolderButton = new javax.swing.JButton(); +- newFolderButton.setBounds(20, 140, 97, 25); ++ newFolderButton.setBounds(15, 140, 107, 25); // runge/x11vnc + newFolderButton.setText("New Folder"); + newFolderButton.setName("newFolderButton"); + newFolderButton.addActionListener(this); +@@ -476,6 +542,24 @@ + return newFolderButton; + } + ++// begin runge/x11vnc ++ /** ++ * This method initializes viewButton ++ * ++ * @return javax.swing.JButton ++ */ ++ private javax.swing.JButton getViewButton() { ++ if (viewButton == null) { ++ viewButton = new javax.swing.JButton(); ++ viewButton.setBounds(15, 170, 107, 25); ++ viewButton.setText("View File"); ++ viewButton.setName("viewButton"); ++ viewButton.addActionListener(this); ++ } ++ return viewButton; ++ } ++// end runge/x11vnc ++ + /** + * This method initializes stopButton + * +@@ -486,7 +570,7 @@ + if (stopButton == null) + { + stopButton = new javax.swing.JButton(); +- stopButton.setBounds(20, 200, 97, 25); ++ stopButton.setBounds(15, 200, 107, 25); // runge/x11vnc + stopButton.setText("Stop"); + stopButton.setName("stopButton"); + stopButton.addActionListener(this); +@@ -503,7 +587,7 @@ + private javax.swing.JButton getCloseButton() { + if (closeButton == null) { + closeButton = new javax.swing.JButton(); +- closeButton.setBounds(20, 325, 97, 25); ++ closeButton.setBounds(15, 325, 107, 25); // runge/x11vnc + closeButton.setText("Close"); + closeButton.setName("closeButton"); + closeButton.addActionListener(this); +@@ -829,12 +913,19 @@ + { + doReceive(); + } ++// begin runge/x11vnc ++ else if (evt.getSource() == viewButton) ++ { ++ doView(); ++ } ++// end runge/x11vnc + else if (evt.getSource() == localDrivesComboBox) + { + changeLocalDrive(); + } + else if (evt.getSource() == remoteDrivesComboBox) + { ++System.out.println("remoteDrivesComboBox"); // runge/x11vnc + changeRemoteDrive(); + remoteList.clear(); + remoteFileTable.setListData(remoteList); +@@ -845,6 +936,7 @@ + } + else if (evt.getSource() == remoteTopButton) + { ++System.out.println("remoteTopButton"); // runge/x11vnc + changeRemoteDrive(); + } + else if(evt.getSource() == deleteButton) +@@ -979,6 +1071,56 @@ + viewer.rfb.requestRemoteFile(remoteFileName,localDestinationPath); + } + ++// begin runge/x11vnc ++ private void doView() ++ { ++ System.out.println("View Button Pressed"); ++ ++ if (selectedTable == null) { ++ return; ++ } ++ if (selectedTable.equals("remote")) { ++ viewRemote(); ++ } else if (selectedTable.equals("local")) { ++ viewLocal(); ++ } ++ } ++ ++ private File doReceiveTmp() ++ { ++ ++ if (remoteFileTable == null) { ++ return null; ++ } ++ String sFileName = ((String) this.remoteFileTable.getSelectedValue()); ++ if (sFileName == null) { ++ return null; ++ } ++ ++ // sf@2004 - Directory can't be transfered ++ if (sFileName.substring(0, 2).equals(" [") && sFileName.substring((sFileName.length() - 1), sFileName.length()).equals("]")) ++ { ++ return null; ++ } ++ ++ File tmp = null; ++ try { ++ tmp = File.createTempFile("ULTRAFTP", ".txt"); ++ } catch (Exception e) { ++ return null; ++ } ++ ++ //updateHistory("Downloaded " + localSelection.toString()); ++ String remoteFileName = this.remoteLocation.getText(); ++ remoteFileName+= ((String) this.remoteFileTable.getSelectedValue()).substring(1); ++ ++ String localDestinationPath = tmp.getAbsolutePath(); ++ viewer.rfb.requestRemoteFile(remoteFileName,localDestinationPath); ++ System.out.println("ReceiveTmp: " + localDestinationPath); ++ return tmp; ++ } ++// end runge/x11vnc ++ + private void doSend() + { + System.out.println("Send Button Pressed"); +@@ -1035,8 +1177,11 @@ + + if (!updateDriveList) { + String drive = remoteDrivesComboBox.getSelectedItem().toString().substring(0,1)+ ":\\"; ++System.out.println("changeRemoteDrive-A " + drive); // runge/x11vnc ++ drive = saveRemoteHack(drive); + viewer.rfb.readServerDirectory(drive); + remoteLocation.setText(drive); ++System.out.println("changeRemoteDrive-B " + drive); // runge/x11vnc + } + remoteList.clear(); + remoteFileTable.setListData(remoteList); +@@ -1048,6 +1193,7 @@ + private void changeLocalDrive() + { + File currentDrive = new File(localDrivesComboBox.getSelectedItem().toString()); ++System.out.println("changeLocalDrive " + currentDrive.toString()); // runge/x11vnc + if(currentDrive.canRead()) + { + localSelection = null; +@@ -1060,6 +1206,7 @@ + localStatus.setText("WARNING: Drive " + localDrivesComboBox.getSelectedItem().toString()); + connectionStatus.setText(" > WARNING - Local Drive unavailable (possibly restricted access or media not present)"); + } ++ + } + /** + * Determines which FileTable was double-clicked and updates the table +@@ -1101,7 +1248,7 @@ + String name = (remoteFileTable.getSelectedValue().toString()).substring(1); + if( !name.substring(0, 2).equals(" [")) + remoteSelection = remoteLocation.getText() + name.substring(0, name.length()); +- ++ + } + + /* +@@ -1115,10 +1262,38 @@ + localFileTable.setBackground(new Color(255, 255, 255)); + File currentSelection = new File(currentLocalDirectory, getTrimmedSelection()); + +- if(currentSelection.isFile()) ++// begin runge/x11vnc ++ // localSelection = currentSelection.getAbsoluteFile(); ++ if(currentSelection.isFile()) { + localSelection = currentSelection.getAbsoluteFile(); ++ localCurrentIsDir = false; ++ } else { ++ localCurrentIsDir = true; ++ } ++// end runge/x11vnc + + } ++ ++// begin runge/x11vnc ++ private void viewRemote() { ++ File tmp = doReceiveTmp(); ++ if (tmp == null) { ++ return; ++ } ++ TextViewer tv = new TextViewer("Remote: " + remoteSelection, tmp, true); ++ } ++ private void viewLocal() { ++ if (localSelection == null) { ++ return; ++ } ++ if (localCurrentIsDir) { ++ return; ++ } ++ File loc = new File(localSelection.toString()); ++ TextViewer tv = new TextViewer("Local: " + localSelection.toString(), loc, false); ++ } ++// end runge/x11vnc ++ + /** + * Updates the Remote File Table based on selection. Called from mouseClicked handler + */ +@@ -1149,6 +1324,7 @@ + remoteSelection = remoteLocation.getText() + name.substring(0, name.length()); + drive = remoteLocation.getText(); + // ?? ++ viewRemote(); // runge/x11vnc + } + else + { +@@ -1163,6 +1339,7 @@ + } + //remoteLocation.setText(drive); + } ++ + /** + * Updates the Local File Table based on selection. Called from MouseClicked handler + */ +@@ -1188,6 +1365,7 @@ + else if (currentSelection.isFile()) + { + localSelection = currentSelection.getAbsoluteFile(); ++ viewLocal(); // runge/x11vnc + } + else if (currentSelection.isDirectory()) + { +@@ -1247,9 +1425,20 @@ + */ + public void changeLocalDirectory(File dir) + { ++ dir = saveLocalHack(dir); // runge/x11vnc ++ + currentLocalDirectory = dir; // Updates Global + File allFiles[] = dir.listFiles(); // Reads files + String[] contents = dir.list(); ++// begin runge/x11vnc ++System.out.println("changeLocalDirectory: " + dir.toString()); ++ if (contents != null) { ++ java.util.Arrays.sort(contents, String.CASE_INSENSITIVE_ORDER); ++ for (int i = 0; i < contents.length; i++) { ++ allFiles[i] = new File(dir, contents[i]); ++ } ++ } ++// end runge/x11vnc + + localList.clear(); + localList.addElement(" [..]"); +@@ -1296,3 +1485,135 @@ + } + + } // @jve:visual-info decl-index=0 visual-constraint="10,10" ++ ++// begin runge/x11vnc ++class TextViewer extends JFrame implements ActionListener { ++ ++ JTextArea textArea = new JTextArea(35, 80); ++ File file = null; ++ JButton refreshButton; ++ JButton dismissButton; ++ Timer tim = null; ++ int rcnt = 0; ++ int tms = 250; ++ boolean delete_it = false; ++ ++ public TextViewer(String s, File f, boolean d) { ++ ++ delete_it = d; ++ file = f; ++ ++ JScrollPane scrollPane = new JScrollPane(textArea, ++ JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, ++ JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); ++ ++ textArea.setEditable(false); ++ textArea.setFont(new Font("Monospaced", Font.PLAIN, 12)); ++ ++ ++ refreshButton = new JButton(); ++ refreshButton.setText("Reload"); ++ refreshButton.setName("refreshButton"); ++ refreshButton.addActionListener(this); ++ ++ dismissButton = new JButton(); ++ dismissButton.setText("Dismiss"); ++ dismissButton.setName("dismissButton"); ++ dismissButton.addActionListener(this); ++ ++ JPanel buttons = new JPanel(); ++ buttons.setLayout(new BorderLayout()); ++ buttons.add(refreshButton, BorderLayout.WEST); ++ buttons.add(dismissButton, BorderLayout.EAST); ++ ++ JPanel content = new JPanel(); ++ content.setLayout(new BorderLayout()); ++ content.add(scrollPane, BorderLayout.CENTER); ++ content.add(buttons, BorderLayout.SOUTH); ++ ++ ActionListener tsk = new ActionListener() { ++ public void actionPerformed(ActionEvent evt) { ++ // System.out.println("tsk"); ++ refresh(); ++ } ++ }; ++ tim = new Timer(tms, tsk); ++ tim.start(); ++ ++ this.setContentPane(content); ++ this.setTitle("TextViewer - " + s); ++ this.pack(); ++ this.setVisible(true); ++ } ++ ++ private void refresh() { ++ ++ rcnt++; ++ if (rcnt * tms > 3000 && tim != null) { ++ tim.stop(); ++ tim = null; ++ } ++ BufferedReader input = null; ++ StringBuffer contents = new StringBuffer(); ++ try { ++ if (input == null) { ++ input = new BufferedReader(new FileReader(file)); ++ } ++ String line = null; ++ int i = 0; ++ while (( line = input.readLine()) != null) { ++ if (i == 0) { ++ // System.out.println("read"); ++ } ++ i++; ++ contents.append(line); ++ contents.append(System.getProperty("line.separator")); ++ } ++ } catch (Exception e) { ++ ; ++ } finally { ++ try { ++ if (input != null) { ++ input.close(); ++ input = null; ++ } ++ } catch (Exception e) { ++ ; ++ } ++ } ++ ++ textArea.setText(contents.toString()); ++ textArea.setCaretPosition(0); ++ } ++ ++ public void actionPerformed(ActionEvent evt) { ++ ++ if (evt.getSource() == refreshButton) { ++ refresh(); ++ } ++ if (evt.getSource() == dismissButton) { ++ cleanse(); ++ this.dispose(); ++ } ++ } ++ ++ private void cleanse() { ++ if (delete_it && file != null) { ++ try { ++ file.delete(); ++ file = null; ++ } catch (Exception e) { ++ ; ++ } ++ } ++ } ++ ++ protected void finalize() throws Throwable { ++ try { ++ cleanse(); ++ } finally { ++ super.finalize(); ++ } ++ } ++} ++// end runge/x11vnc +diff -Naur JavaViewer.orig/OptionsFrame.java JavaViewer/OptionsFrame.java +--- JavaViewer.orig/OptionsFrame.java 2005-11-21 18:50:16.000000000 -0500 ++++ JavaViewer/OptionsFrame.java 2007-05-13 22:18:30.000000000 -0400 +@@ -144,7 +144,10 @@ + choices[jpegQualityIndex].select("6"); + choices[cursorUpdatesIndex].select("Enable"); + choices[useCopyRectIndex].select("Yes"); +- choices[eightBitColorsIndex].select("64"); ++// begin runge/x11vnc ++// choices[eightBitColorsIndex].select("64"); ++ choices[eightBitColorsIndex].select("Full"); ++// end runge/x11vnc + choices[mouseButtonIndex].select("Normal"); + choices[viewOnlyIndex].select("No"); + choices[shareDesktopIndex].select("Yes"); +diff -Naur JavaViewer.orig/RfbProto.java JavaViewer/RfbProto.java +--- JavaViewer.orig/RfbProto.java 2006-05-24 15:14:40.000000000 -0400 ++++ JavaViewer/RfbProto.java 2007-05-16 15:57:07.000000000 -0400 +@@ -199,6 +199,10 @@ + // playback. + int numUpdatesInSession; + ++// begin runge/x11vnc ++ int readServerDriveListCnt = -1; ++ long readServerDriveListTime = 0; ++// end runge/x11vnc + // + // Constructor. Make TCP connection to RFB server. + // +@@ -207,7 +211,27 @@ + viewer = v; + host = h; + port = p; +- sock = new Socket(host, port); ++// begin runge/x11vnc ++// sock = new Socket(host, port); ++ if (! viewer.disableSSL) { ++ System.out.println("new SSLSocketToMe"); ++ SSLSocketToMe ssl; ++ try { ++ ssl = new SSLSocketToMe(host, port, v); ++ } catch (Exception e) { ++ throw new IOException(e.getMessage()); ++ } ++ ++ try { ++ sock = ssl.connectSock(); ++ } catch (Exception es) { ++ throw new IOException(es.getMessage()); ++ } ++ } else { ++ sock = new Socket(host, port); ++ } ++// end runge/x11vnc ++ + is = + new DataInputStream( + new BufferedInputStream(sock.getInputStream(), 16384)); +@@ -1263,11 +1287,47 @@ + || dwFileAttributes == 369623040) + { + fileName = " [" + fileName + "]"; +- remoteDirsList.add(fileName); // sf@2004 ++// begin runge/x11vnc ++// remoteDirsList.add(fileName); // sf@2004 ++ int i = -1; ++ String t1 = fileName.toLowerCase(); ++ for (int j = 0; j < remoteDirsList.size(); j++) { ++ String t = (String) remoteDirsList.get(j); ++ String t2 = t.toLowerCase(); ++ if (t1.compareTo(t2) < 0) { ++ i = j; ++ break; ++ } ++ } ++ if (i >= 0) { ++ remoteDirsList.add(i, fileName); ++ } else { ++ remoteDirsList.add(fileName); ++ } ++// end runge/x11vnc + } + else + { +- remoteFilesList.add(" " + fileName); // sf@2004 ++// begin runge/x11vnc ++// remoteFilesList.add(" " + fileName); // sf@2004 ++ ++ fileName = " " + fileName; ++ int i = -1; ++ String t1 = fileName.toLowerCase(); ++ for (int j = 0; j < remoteFilesList.size(); j++) { ++ String t = (String) remoteFilesList.get(j); ++ String t2 = t.toLowerCase(); ++ if (t1.compareTo(t2) < 0) { ++ i = j; ++ break; ++ } ++ } ++ if (i >= 0) { ++ remoteFilesList.add(i, fileName); ++ } else { ++ remoteFilesList.add(fileName); ++ } ++// end runge/x11vnc + } + + // a.add(fileName); +@@ -1289,6 +1349,16 @@ + remoteDirsList.clear(); + remoteFilesList.clear(); + ++// begin runge/x11vnc ++ // Hack for double listing at startup... probably libvncserver bug.. ++ readServerDriveListCnt++; ++ if (readServerDriveListCnt == 2) { ++ if (System.currentTimeMillis() - readServerDriveListTime < 1500) { ++System.out.println("readServerDriveListCnt skip " + readServerDriveListCnt); ++ return; ++ } ++ } ++// end runge/x11vnc + viewer.ftp.printDirectory(a); + } + +@@ -1312,6 +1382,10 @@ + 0, + 0, + null); ++// begin runge/x11vnc ++ readServerDriveListCnt = 0; ++ readServerDriveListTime = System.currentTimeMillis(); ++// end runge/x11vnc + } + catch (IOException e) + { +diff -Naur JavaViewer.orig/SSLSocketToMe.java JavaViewer/SSLSocketToMe.java +--- JavaViewer.orig/SSLSocketToMe.java 1969-12-31 19:00:00.000000000 -0500 ++++ JavaViewer/SSLSocketToMe.java 2007-04-29 20:40:35.000000000 -0400 +@@ -0,0 +1,1421 @@ ++/* ++ * SSLSocketToMe.java: add SSL encryption to Java VNC Viewer. ++ * ++ * Copyright (c) 2006 Karl J. Runge ++ * All rights reserved. ++ * ++ * This is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; version 2 of the License. ++ * ++ * This software is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this software; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++ * USA. ++ * ++ */ ++ ++import java.net.*; ++import java.io.*; ++import javax.net.ssl.*; ++import java.util.*; ++ ++import java.security.*; ++import java.security.cert.*; ++import java.security.spec.*; ++import java.security.cert.Certificate; ++import java.security.cert.CertificateFactory; ++ ++import java.awt.*; ++import java.awt.event.*; ++ ++public class SSLSocketToMe { ++ ++ /* basic member data: */ ++ String host; ++ int port; ++ VncViewer viewer; ++ boolean debug = true; ++ ++ /* sockets */ ++ SSLSocket socket = null; ++ SSLSocketFactory factory; ++ ++ /* fallback for Proxy connection */ ++ boolean proxy_in_use = false; ++ boolean proxy_is_https = false; ++ boolean proxy_failure = false; ++ public DataInputStream is = null; ++ public OutputStream os = null; ++ ++ String proxy_dialog_host = null; ++ int proxy_dialog_port = 0; ++ ++ Socket proxySock; ++ DataInputStream proxy_is; ++ OutputStream proxy_os; ++ ++ /* trust contexts */ ++ SSLContext trustloc_ctx; ++ SSLContext trustall_ctx; ++ SSLContext trusturl_ctx; ++ SSLContext trustone_ctx; ++ ++ TrustManager[] trustAllCerts; ++ TrustManager[] trustUrlCert; ++ TrustManager[] trustOneCert; ++ ++ boolean use_url_cert_for_auth = true; ++ boolean user_wants_to_see_cert = true; ++ ++ /* cert(s) we retrieve from VNC server */ ++ java.security.cert.Certificate[] trustallCerts = null; ++ java.security.cert.Certificate[] trusturlCerts = null; ++ ++ byte[] hex2bytes(String s) { ++ byte[] bytes = new byte[s.length()/2]; ++ for (int i=0; i 127) { ++ val -= 256; ++ } ++ Integer I = new Integer(val); ++ bytes[i] = Byte.decode(I.toString()).byteValue(); ++ ++ } catch (Exception e) { ++ ; ++ } ++ } ++ return bytes; ++ } ++ ++ SSLSocketToMe(String h, int p, VncViewer v) throws Exception { ++ host = h; ++ port = p; ++ viewer = v; ++ ++ /* we will first try default factory for certification: */ ++ ++ factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); ++ ++ dbg("SSL startup: " + host + " " + port); ++ ++ /* create trust managers used if initial handshake fails: */ ++ ++ trustAllCerts = new TrustManager[] { ++ /* ++ * this one accepts everything. ++ */ ++ new X509TrustManager() { ++ public java.security.cert.X509Certificate[] ++ getAcceptedIssuers() { ++ return null; ++ } ++ public void checkClientTrusted( ++ java.security.cert.X509Certificate[] certs, ++ String authType) { ++ /* empty */ ++ } ++ public void checkServerTrusted( ++ java.security.cert.X509Certificate[] certs, ++ String authType) { ++ /* empty */ ++ dbg("ALL: an untrusted connect to grab cert."); ++ } ++ } ++ }; ++ ++ trustUrlCert = new TrustManager[] { ++ /* ++ * this one accepts only the retrieved server cert ++ * by SSLSocket by this applet. ++ */ ++ new X509TrustManager() { ++ public java.security.cert.X509Certificate[] ++ getAcceptedIssuers() { ++ return null; ++ } ++ public void checkClientTrusted( ++ java.security.cert.X509Certificate[] certs, ++ String authType) throws CertificateException { ++ throw new CertificateException("No Clients"); ++ } ++ public void checkServerTrusted( ++ java.security.cert.X509Certificate[] certs, ++ String authType) throws CertificateException { ++ if (trusturlCerts == null) { ++ throw new CertificateException( ++ "No Trust url Certs array."); ++ } ++ if (trusturlCerts.length < 1) { ++ throw new CertificateException( ++ "No Trust url Certs."); ++ } ++ if (trusturlCerts.length > 1) { ++ int i; ++ boolean ok = true; ++ for (i = 0; i < trusturlCerts.length - 1; i++) { ++ if (! trusturlCerts[i].equals(trusturlCerts[i+1])) { ++ ok = false; ++ } ++ } ++ if (! ok) { ++ throw new CertificateException( ++ "Too many Trust url Certs: " ++ + trusturlCerts.length ++ ); ++ } ++ } ++ if (certs == null) { ++ throw new CertificateException( ++ "No this-certs array."); ++ } ++ if (certs.length < 1) { ++ throw new CertificateException( ++ "No this-certs Certs."); ++ } ++ if (certs.length > 1) { ++ int i; ++ boolean ok = true; ++ for (i = 0; i < certs.length - 1; i++) { ++ if (! certs[i].equals(certs[i+1])) { ++ ok = false; ++ } ++ } ++ if (! ok) { ++ throw new CertificateException( ++ "Too many this-certs: " ++ + certs.length ++ ); ++ } ++ } ++ if (! trusturlCerts[0].equals(certs[0])) { ++ throw new CertificateException( ++ "Server Cert Changed != URL."); ++ } ++ dbg("URL: trusturlCerts[0] matches certs[0]"); ++ } ++ } ++ }; ++ trustOneCert = new TrustManager[] { ++ /* ++ * this one accepts only the retrieved server cert ++ * by SSLSocket by this applet. ++ */ ++ new X509TrustManager() { ++ public java.security.cert.X509Certificate[] ++ getAcceptedIssuers() { ++ return null; ++ } ++ public void checkClientTrusted( ++ java.security.cert.X509Certificate[] certs, ++ String authType) throws CertificateException { ++ throw new CertificateException("No Clients"); ++ } ++ public void checkServerTrusted( ++ java.security.cert.X509Certificate[] certs, ++ String authType) throws CertificateException { ++ if (trustallCerts == null) { ++ throw new CertificateException( ++ "No Trust All Server Certs array."); ++ } ++ if (trustallCerts.length < 1) { ++ throw new CertificateException( ++ "No Trust All Server Certs."); ++ } ++ if (trustallCerts.length > 1) { ++ int i; ++ boolean ok = true; ++ for (i = 0; i < trustallCerts.length - 1; i++) { ++ if (! trustallCerts[i].equals(trustallCerts[i+1])) { ++ ok = false; ++ } ++ } ++ if (! ok) { ++ throw new CertificateException( ++ "Too many Trust All Server Certs: " ++ + trustallCerts.length ++ ); ++ } ++ } ++ if (certs == null) { ++ throw new CertificateException( ++ "No this-certs array."); ++ } ++ if (certs.length < 1) { ++ throw new CertificateException( ++ "No this-certs Certs."); ++ } ++ if (certs.length > 1) { ++ int i; ++ boolean ok = true; ++ for (i = 0; i < certs.length - 1; i++) { ++ if (! certs[i].equals(certs[i+1])) { ++ ok = false; ++ } ++ } ++ if (! ok) { ++ throw new CertificateException( ++ "Too many this-certs: " ++ + certs.length ++ ); ++ } ++ } ++ if (! trustallCerts[0].equals(certs[0])) { ++ throw new CertificateException( ++ "Server Cert Changed != TRUSTALL."); ++ } ++ dbg("ONE: trustallCerts[0] matches certs[0]"); ++ } ++ } ++ }; ++ ++ /* ++ * They are used: ++ * ++ * 1) to retrieve the server cert in case of failure to ++ * display it to the user. ++ * 2) to subsequently connect to the server if user agrees. ++ */ ++ ++ KeyManager[] mykey = null; ++ ++ if (viewer.oneTimeKey != null && viewer.oneTimeKey.equals("PROMPT")) { ++ ClientCertDialog d = new ClientCertDialog(); ++ viewer.oneTimeKey = d.queryUser(); ++ } ++ ++ if (viewer.oneTimeKey != null && viewer.oneTimeKey.indexOf(",") > 0) { ++ int idx = viewer.oneTimeKey.indexOf(","); ++ ++ String onetimekey = viewer.oneTimeKey.substring(0, idx); ++ byte[] key = hex2bytes(onetimekey); ++ String onetimecert = viewer.oneTimeKey.substring(idx+1); ++ byte[] cert = hex2bytes(onetimecert); ++ ++ KeyFactory kf = KeyFactory.getInstance("RSA"); ++ PKCS8EncodedKeySpec keysp = new PKCS8EncodedKeySpec ( key ); ++ PrivateKey ff = kf.generatePrivate (keysp); ++ //dbg("ff " + ff); ++ String cert_str = new String(cert); ++ ++ CertificateFactory cf = CertificateFactory.getInstance("X.509"); ++ Collection c = cf.generateCertificates(new ByteArrayInputStream(cert)); ++ Certificate[] certs = new Certificate[c.toArray().length]; ++ if (c.size() == 1) { ++ Certificate tmpcert = cf.generateCertificate(new ByteArrayInputStream(cert)); ++ //dbg("tmpcert" + tmpcert); ++ certs[0] = tmpcert; ++ } else { ++ certs = (Certificate[]) c.toArray(); ++ } ++ ++ KeyStore ks = KeyStore.getInstance("JKS"); ++ ks.load(null, null); ++ ks.setKeyEntry("onetimekey", ff, "".toCharArray(), certs); ++ String da = KeyManagerFactory.getDefaultAlgorithm(); ++ KeyManagerFactory kmf = KeyManagerFactory.getInstance(da); ++ kmf.init(ks, "".toCharArray()); ++ ++ mykey = kmf.getKeyManagers(); ++ } ++ ++ ++ /* trust loc certs: */ ++ try { ++ trustloc_ctx = SSLContext.getInstance("SSL"); ++ trustloc_ctx.init(mykey, null, new ++ java.security.SecureRandom()); ++ ++ } catch (Exception e) { ++ String msg = "SSL trustloc_ctx FAILED."; ++ dbg(msg); ++ throw new Exception(msg); ++ } ++ ++ /* trust all certs: */ ++ try { ++ trustall_ctx = SSLContext.getInstance("SSL"); ++ trustall_ctx.init(mykey, trustAllCerts, new ++ java.security.SecureRandom()); ++ ++ } catch (Exception e) { ++ String msg = "SSL trustall_ctx FAILED."; ++ dbg(msg); ++ throw new Exception(msg); ++ } ++ ++ /* trust url certs: */ ++ try { ++ trusturl_ctx = SSLContext.getInstance("SSL"); ++ trusturl_ctx.init(mykey, trustUrlCert, new ++ java.security.SecureRandom()); ++ ++ } catch (Exception e) { ++ String msg = "SSL trusturl_ctx FAILED."; ++ dbg(msg); ++ throw new Exception(msg); ++ } ++ ++ /* trust the one cert from server: */ ++ try { ++ trustone_ctx = SSLContext.getInstance("SSL"); ++ trustone_ctx.init(mykey, trustOneCert, new ++ java.security.SecureRandom()); ++ ++ } catch (Exception e) { ++ String msg = "SSL trustone_ctx FAILED."; ++ dbg(msg); ++ throw new Exception(msg); ++ } ++ } ++ ++ boolean browser_cert_match() { ++ String msg = "Browser URL accept previously accepted cert"; ++ ++ if (user_wants_to_see_cert) { ++ return false; ++ } ++ ++ if (trustallCerts != null && trusturlCerts != null) { ++ if (trustallCerts.length == 1 && trusturlCerts.length == 1) { ++ if (trustallCerts[0].equals(trusturlCerts[0])) { ++ System.out.println(msg); ++ return true; ++ } ++ } ++ } ++ return false; ++ } ++ ++ public void check_for_proxy() { ++ ++ boolean result = false; ++ ++ trusturlCerts = null; ++ proxy_in_use = false; ++ if (viewer.ignoreProxy) { ++ return; ++ } ++ ++ String ustr = "https://" + host + ":"; ++ if (viewer.httpsPort != null) { ++ ustr += viewer.httpsPort; ++ } else { ++ ustr += port; // hmmm ++ } ++ ustr += viewer.urlPrefix + "/check.https.proxy.connection"; ++ dbg("ustr is: " + ustr); ++ ++ ++ try { ++ URL url = new URL(ustr); ++ HttpsURLConnection https = (HttpsURLConnection) ++ url.openConnection(); ++ ++ https.setUseCaches(false); ++ https.setRequestMethod("GET"); ++ https.setRequestProperty("Pragma", "No-Cache"); ++ https.setRequestProperty("Proxy-Connection", ++ "Keep-Alive"); ++ https.setDoInput(true); ++ ++ https.connect(); ++ ++ trusturlCerts = https.getServerCertificates(); ++ if (trusturlCerts == null) { ++ dbg("set trusturlCerts to null..."); ++ } else { ++ dbg("set trusturlCerts to non-null"); ++ } ++ ++ if (https.usingProxy()) { ++ proxy_in_use = true; ++ proxy_is_https = true; ++ dbg("HTTPS proxy in use. There may be connection problems."); ++ } ++ Object output = https.getContent(); ++ https.disconnect(); ++ result = true; ++ ++ } catch(Exception e) { ++ dbg("HttpsURLConnection: " + e.getMessage()); ++ } ++ ++ if (proxy_in_use) { ++ return; ++ } ++ ++ ustr = "http://" + host + ":" + port; ++ ustr += viewer.urlPrefix + "/index.vnc"; ++ ++ try { ++ URL url = new URL(ustr); ++ HttpURLConnection http = (HttpURLConnection) ++ url.openConnection(); ++ ++ http.setUseCaches(false); ++ http.setRequestMethod("GET"); ++ http.setRequestProperty("Pragma", "No-Cache"); ++ http.setRequestProperty("Proxy-Connection", ++ "Keep-Alive"); ++ http.setDoInput(true); ++ ++ http.connect(); ++ ++ if (http.usingProxy()) { ++ proxy_in_use = true; ++ proxy_is_https = false; ++ dbg("HTTP proxy in use. There may be connection problems."); ++ } ++ Object output = http.getContent(); ++ http.disconnect(); ++ ++ } catch(Exception e) { ++ dbg("HttpURLConnection: " + e.getMessage()); ++ } ++ } ++ ++ public Socket connectSock() throws IOException { ++ ++ /* ++ * first try a https connection to detect a proxy, and ++ * also grab the VNC server cert. ++ */ ++ check_for_proxy(); ++ ++ if (viewer.trustAllVncCerts) { ++ dbg("viewer.trustAllVncCerts-0 using trustall_ctx"); ++ factory = trustall_ctx.getSocketFactory(); ++ } else if (use_url_cert_for_auth && trusturlCerts != null) { ++ dbg("using trusturl_ctx"); ++ factory = trusturl_ctx.getSocketFactory(); ++ } else { ++ dbg("using trustloc_ctx"); ++ factory = trustloc_ctx.getSocketFactory(); ++ } ++ ++ socket = null; ++ try { ++ if (proxy_in_use && viewer.forceProxy) { ++ throw new Exception("forcing proxy (forceProxy)"); ++ } else if (viewer.CONNECT != null) { ++ throw new Exception("forcing CONNECT"); ++ } ++ ++ socket = (SSLSocket) factory.createSocket(host, port); ++ ++ } catch (Exception esock) { ++ dbg("esock: " + esock.getMessage()); ++ if (proxy_in_use || viewer.CONNECT != null) { ++ proxy_failure = true; ++ if (proxy_in_use) { ++ dbg("HTTPS proxy in use. Trying to go with it."); ++ } else { ++ dbg("viewer.CONNECT reverse proxy in use. Trying to go with it."); ++ } ++ try { ++ socket = proxy_socket(factory); ++ } catch (Exception e) { ++ dbg("err proxy_socket: " + e.getMessage()); ++ } ++ } ++ } ++ ++ try { ++ socket.startHandshake(); ++ dbg("Server Connection Verified on 1st try."); ++ ++ java.security.cert.Certificate[] currentTrustedCerts; ++ BrowserCertsDialog bcd; ++ ++ SSLSession sess = socket.getSession(); ++ currentTrustedCerts = sess.getPeerCertificates(); ++ ++ if (viewer.trustAllVncCerts) { ++ dbg("viewer.trustAllVncCerts-1"); ++ } else if (currentTrustedCerts == null || currentTrustedCerts.length < 1) { ++ socket.close(); ++ socket = null; ++ throw new SSLHandshakeException("no current certs"); ++ } ++ ++ String serv = ""; ++ try { ++ CertInfo ci = new CertInfo(currentTrustedCerts[0]); ++ serv = ci.get_certinfo("CN"); ++ } catch (Exception e) { ++ ; ++ } ++ ++ if (viewer.trustAllVncCerts) { ++ dbg("viewer.trustAllVncCerts-2"); ++ user_wants_to_see_cert = false; ++ } else if (viewer.trustUrlVncCert) { ++ dbg("viewer.trustUrlVncCert-1"); ++ user_wants_to_see_cert = false; ++ } else { ++ bcd = new BrowserCertsDialog(serv, host + ":" + port); ++ bcd.queryUser(); ++ if (bcd.showCertDialog) { ++ String msg = "user wants to see cert"; ++ dbg(msg); ++ user_wants_to_see_cert = true; ++ throw new SSLHandshakeException(msg); ++ } else { ++ user_wants_to_see_cert = false; ++ dbg("bcd: user said yes, accept it"); ++ } ++ } ++ ++ } catch (SSLHandshakeException eh) { ++ dbg("Could not automatically verify Server."); ++ dbg("msg: " + eh.getMessage()); ++ ++ socket.close(); ++ socket = null; ++ ++ /* ++ * Reconnect, trusting any cert, so we can grab ++ * the cert to show it to the user. The connection ++ * is not used for anything else. ++ */ ++ factory = trustall_ctx.getSocketFactory(); ++ if (proxy_failure) { ++ socket = proxy_socket(factory); ++ } else { ++ socket = (SSLSocket) factory.createSocket(host, port); ++ } ++ ++ try { ++ socket.startHandshake(); ++ dbg("TrustAll Server Connection Verified."); ++ ++ /* grab the cert: */ ++ try { ++ SSLSession sess = socket.getSession(); ++ trustallCerts = sess.getPeerCertificates(); ++ } catch (Exception e) { ++ throw new Exception("Could not get " + ++ "Peer Certificate"); ++ } ++ ++ if (viewer.trustAllVncCerts) { ++ dbg("viewer.trustAllVncCerts-3"); ++ } else if (! browser_cert_match()) { ++ /* ++ * close socket now, we will reopen after ++ * dialog if user agrees to use the cert. ++ */ ++ socket.close(); ++ socket = null; ++ ++ /* dialog with user to accept cert or not: */ ++ ++ TrustDialog td= new TrustDialog(host, port, ++ trustallCerts); ++ ++ if (! td.queryUser()) { ++ String msg = "User decided against it."; ++ dbg(msg); ++ throw new IOException(msg); ++ } ++ } ++ ++ } catch (Exception ehand2) { ++ dbg("** Could not TrustAll Verify Server."); ++ ++ throw new IOException(ehand2.getMessage()); ++ } ++ ++ /* ++ * Now connect a 3rd time, using the cert ++ * retrieved during connection 2 (that the user ++ * likely blindly agreed to). ++ */ ++ ++ factory = trustone_ctx.getSocketFactory(); ++ if (proxy_failure) { ++ socket = proxy_socket(factory); ++ } else { ++ socket = (SSLSocket) factory.createSocket(host, port); ++ } ++ ++ try { ++ socket.startHandshake(); ++ dbg("TrustAll Server Connection Verified #3."); ++ ++ } catch (Exception ehand3) { ++ dbg("** Could not TrustAll Verify Server #3."); ++ ++ throw new IOException(ehand3.getMessage()); ++ } ++ } ++ ++ if (socket != null && viewer.GET) { ++ String str = "GET "; ++ str += viewer.urlPrefix; ++ str += "/request.https.vnc.connection"; ++ str += " HTTP/1.0\r\n"; ++ str += "Pragma: No-Cache\r\n"; ++ str += "\r\n"; ++ System.out.println("sending GET: " + str); ++ OutputStream os = socket.getOutputStream(); ++ os.write(str.getBytes()); ++ os.flush(); ++ if (false) { ++ String rep = ""; ++ DataInputStream is = new DataInputStream( ++ new BufferedInputStream(socket.getInputStream(), 16384)); ++ while (true) { ++ rep += readline(is); ++ if (rep.indexOf("\r\n\r\n") >= 0) { ++ break; ++ } ++ } ++ System.out.println("rep: " + rep); ++ } ++ } ++ ++ dbg("SSL returning socket to caller."); ++ return (Socket) socket; ++ } ++ ++ private void dbg(String s) { ++ if (debug) { ++ System.out.println(s); ++ } ++ } ++ ++ private int gint(String s) { ++ int n = -1; ++ try { ++ Integer I = new Integer(s); ++ n = I.intValue(); ++ } catch (Exception ex) { ++ return -1; ++ } ++ return n; ++ } ++ ++ public SSLSocket proxy_socket(SSLSocketFactory factory) { ++ Properties props = null; ++ String proxyHost = null; ++ int proxyPort = 0; ++ String proxyHost_nossl = null; ++ int proxyPort_nossl = 0; ++ String str; ++ ++ /* see if we can guess the proxy info from Properties: */ ++ try { ++ props = System.getProperties(); ++ } catch (Exception e) { ++ dbg("props failed: " + e.getMessage()); ++ } ++ if (props != null) { ++ dbg("\n---------------\nAll props:"); ++ props.list(System.out); ++ dbg("\n---------------\n\n"); ++ ++ for (Enumeration e = props.propertyNames(); e.hasMoreElements(); ) { ++ String s = (String) e.nextElement(); ++ String v = System.getProperty(s); ++ String s2 = s.toLowerCase(); ++ String v2 = v.toLowerCase(); ++ ++ if (s2.indexOf("proxy") < 0 && v2.indexOf("proxy") < 0) { ++ continue; ++ } ++ if (v2.indexOf("https") < 0) { ++ continue; ++ } ++ ++ if (s2.indexOf("proxy.https.host") >= 0) { ++ proxyHost = v2; ++ continue; ++ } ++ if (s2.indexOf("proxy.https.port") >= 0) { ++ proxyPort = gint(v2); ++ continue; ++ } ++ if (s2.indexOf("proxy.http.host") >= 0) { ++ proxyHost_nossl = v2; ++ continue; ++ } ++ if (s2.indexOf("proxy.http.port") >= 0) { ++ proxyPort_nossl = gint(v2); ++ continue; ++ } ++ ++ String[] pieces = v.split("[,;]"); ++ for (int i = 0; i < pieces.length; i++) { ++ String p = pieces[i]; ++ int j = p.indexOf("https"); ++ if (j < 0) { ++ continue; ++ } ++ j = p.indexOf("=", j); ++ if (j < 0) { ++ continue; ++ } ++ p = p.substring(j+1); ++ String [] hp = p.split(":"); ++ if (hp.length != 2) { ++ continue; ++ } ++ if (hp[0].length() > 1 && hp[1].length() > 1) { ++ ++ proxyPort = gint(hp[1]); ++ if (proxyPort < 0) { ++ continue; ++ } ++ proxyHost = new String(hp[0]); ++ break; ++ } ++ } ++ } ++ } ++ if (proxyHost != null) { ++ if (proxyHost_nossl != null && proxyPort_nossl > 0) { ++ dbg("Using http proxy info instead of https."); ++ proxyHost = proxyHost_nossl; ++ proxyPort = proxyPort_nossl; ++ } ++ } ++ ++ if (proxy_in_use) { ++ if (proxy_dialog_host != null && proxy_dialog_port > 0) { ++ proxyHost = proxy_dialog_host; ++ proxyPort = proxy_dialog_port; ++ } ++ if (proxyHost != null) { ++ dbg("Lucky us! we figured out the Proxy parameters: " + proxyHost + " " + proxyPort); ++ } else { ++ /* ask user to help us: */ ++ ProxyDialog pd = new ProxyDialog(proxyHost, proxyPort); ++ pd.queryUser(); ++ proxyHost = pd.getHost(); ++ proxyPort = pd.getPort(); ++ proxy_dialog_host = new String(proxyHost); ++ proxy_dialog_port = proxyPort; ++ dbg("User said host: " + pd.getHost() + " port: " + pd.getPort()); ++ } ++ ++ dbg("proxy_in_use psocket:"); ++ proxySock = psocket(proxyHost, proxyPort); ++ if (proxySock == null) { ++ dbg("1-a sadly, returning a null socket"); ++ return null; ++ } ++ String hp = host + ":" + port; ++ ++ String req1 = "CONNECT " + hp + " HTTP/1.1\r\n" ++ + "Host: " + hp + "\r\n\r\n"; ++ ++ dbg("requesting1: " + req1); ++ ++ try { ++ proxy_os.write(req1.getBytes()); ++ String reply = readline(proxy_is); ++ ++ dbg("proxy replied1: " + reply.trim()); ++ ++ if (reply.indexOf("HTTP/1.") < 0 && reply.indexOf(" 200") < 0) { ++ proxySock.close(); ++ proxySock = psocket(proxyHost, proxyPort); ++ if (proxySock == null) { ++ dbg("2-a sadly, returning a null socket"); ++ return null; ++ } ++ } ++ } catch(Exception e) { ++ dbg("sock prob1: " + e.getMessage()); ++ } ++ ++ while (true) { ++ String line = readline(proxy_is); ++ dbg("proxy line1: " + line.trim()); ++ if (line.equals("\r\n") || line.equals("\n")) { ++ break; ++ } ++ } ++ } else if (viewer.CONNECT != null) { ++ dbg("viewer.CONNECT psocket:"); ++ proxySock = psocket(host, port); ++ if (proxySock == null) { ++ dbg("1-b sadly, returning a null socket"); ++ return null; ++ } ++ } ++ ++ if (viewer.CONNECT != null) { ++ String hp = viewer.CONNECT; ++ String req2 = "CONNECT " + hp + " HTTP/1.1\r\n" ++ + "Host: " + hp + "\r\n\r\n"; ++ ++ dbg("requesting2: " + req2); ++ ++ try { ++ proxy_os.write(req2.getBytes()); ++ String reply = readline(proxy_is); ++ ++ dbg("proxy replied2: " + reply.trim()); ++ ++ if (reply.indexOf("HTTP/1.") < 0 && reply.indexOf(" 200") < 0) { ++ proxySock.close(); ++ proxySock = psocket(proxyHost, proxyPort); ++ if (proxySock == null) { ++ dbg("2-b sadly, returning a null socket"); ++ return null; ++ } ++ } ++ } catch(Exception e) { ++ dbg("sock prob2: " + e.getMessage()); ++ } ++ ++ while (true) { ++ String line = readline(proxy_is); ++ dbg("proxy line2: " + line.trim()); ++ if (line.equals("\r\n") || line.equals("\n")) { ++ break; ++ } ++ } ++ ++ } ++ ++ Socket sslsock = null; ++ try { ++ sslsock = factory.createSocket(proxySock, host, port, true); ++ } catch(Exception e) { ++ dbg("sslsock prob: " + e.getMessage()); ++ dbg("3 sadly, returning a null socket"); ++ } ++ ++ return (SSLSocket) sslsock; ++ } ++ ++ Socket psocket(String h, int p) { ++ Socket psock = null; ++ try { ++ psock = new Socket(h, p); ++ proxy_is = new DataInputStream(new BufferedInputStream( ++ psock.getInputStream(), 16384)); ++ proxy_os = psock.getOutputStream(); ++ } catch(Exception e) { ++ dbg("psocket prob: " + e.getMessage()); ++ return null; ++ } ++ ++ return psock; ++ } ++ ++ String readline(DataInputStream i) { ++ byte[] ba = new byte[1]; ++ String s = new String(""); ++ ba[0] = 0; ++ try { ++ while (ba[0] != 0xa) { ++ ba[0] = (byte) i.readUnsignedByte(); ++ s += new String(ba); ++ } ++ } catch (Exception e) { ++ ; ++ } ++ return s; ++ } ++} ++ ++class TrustDialog implements ActionListener { ++ String msg, host, text; ++ int port; ++ java.security.cert.Certificate[] trustallCerts = null; ++ boolean viewing_cert = false; ++ boolean trust_this_session = false; ++ ++ /* ++ * this is the gui to show the user the cert and info and ask ++ * them if they want to continue using this cert. ++ */ ++ ++ Button ok, cancel, viewcert; ++ TextArea textarea; ++ Checkbox accept, deny; ++ Dialog dialog; ++ ++ String s1 = "Accept this certificate temporarily for this session"; ++ String s2 = "Do not accept this certificate and do not connect to" ++ + " this VNC server"; ++ String ln = "\n---------------------------------------------------\n\n"; ++ ++ TrustDialog (String h, int p, java.security.cert.Certificate[] s) { ++ host = h; ++ port = p; ++ trustallCerts = s; ++ ++ msg = "VNC Server " + host + ":" + port + " Not Verified"; ++ } ++ ++ public boolean queryUser() { ++ ++ /* create and display the dialog for unverified cert. */ ++ ++ Frame frame = new Frame(msg); ++ ++ dialog = new Dialog(frame, true); ++ ++ String infostr = ""; ++ if (trustallCerts.length == 1) { ++ CertInfo ci = new CertInfo(trustallCerts[0]); ++ infostr = ci.get_certinfo("all"); ++ } ++ ++ text = "\n" +++ "Unable to verify the identity of\n" +++ "\n" +++ " " + host + ":" + port + "\n" +++ "\n" +++ infostr +++ "\n" +++ "as a trusted VNC server.\n" +++ "\n" +++ "This may be due to:\n" +++ "\n" +++ " - Your requesting to View the Certificate before accepting.\n" +++ "\n" +++ " - The VNC server using a Self-Signed Certificate.\n" +++ "\n" +++ " - The VNC server using a Certificate Authority not recognized by your\n" +++ " Browser or Java Plugin runtime.\n" +++ "\n" +++ " - The use of an Apache SSL portal employing CONNECT proxying and the\n" +++ " Apache web server has a certificate different from the VNC server's. \n" +++ "\n" +++ " - A Man-In-The-Middle attack impersonating as the VNC server you wish\n" +++ " to connect to. (Wouldn't that be exciting!!)\n" +++ "\n" +++ "By safely copying the VNC server's Certificate (or using a common\n" +++ "Certificate Authority certificate) you can configure your Web Browser or\n" +++ "Java Plugin to automatically authenticate this Server.\n" +++ "\n" +++ "If you do so, then you will only have to click \"Yes\" when this VNC\n" +++ "Viewer applet asks you whether to trust your Browser/Java Plugin's\n" +++ "acceptance of the certificate. (except for the Apache portal case above.)\n" ++; ++ ++ /* the accept / do-not-accept radio buttons: */ ++ CheckboxGroup checkbox = new CheckboxGroup(); ++ accept = new Checkbox(s1, true, checkbox); ++ deny = new Checkbox(s2, false, checkbox); ++ ++ /* put the checkboxes in a panel: */ ++ Panel check = new Panel(); ++ check.setLayout(new GridLayout(2, 1)); ++ ++ check.add(accept); ++ check.add(deny); ++ ++ /* make the 3 buttons: */ ++ ok = new Button("OK"); ++ cancel = new Button("Cancel"); ++ viewcert = new Button("View Certificate"); ++ ++ ok.addActionListener(this); ++ cancel.addActionListener(this); ++ viewcert.addActionListener(this); ++ ++ /* put the buttons in their own panel: */ ++ Panel buttonrow = new Panel(); ++ buttonrow.setLayout(new FlowLayout(FlowLayout.LEFT)); ++ buttonrow.add(viewcert); ++ buttonrow.add(ok); ++ buttonrow.add(cancel); ++ ++ /* label at the top: */ ++ Label label = new Label(msg, Label.CENTER); ++ label.setFont(new Font("Helvetica", Font.BOLD, 16)); ++ ++ /* textarea in the middle */ ++ textarea = new TextArea(text, 36, 64, ++ TextArea.SCROLLBARS_VERTICAL_ONLY); ++ textarea.setEditable(false); ++ ++ /* put the two panels in their own panel at bottom: */ ++ Panel bot = new Panel(); ++ bot.setLayout(new GridLayout(2, 1)); ++ bot.add(check); ++ bot.add(buttonrow); ++ ++ /* now arrange things inside the dialog: */ ++ dialog.setLayout(new BorderLayout()); ++ ++ dialog.add("North", label); ++ dialog.add("South", bot); ++ dialog.add("Center", textarea); ++ ++ dialog.pack(); ++ dialog.resize(dialog.preferredSize()); ++ ++ dialog.show(); /* block here til OK or Cancel pressed. */ ++ ++ return trust_this_session; ++ } ++ ++ public synchronized void actionPerformed(ActionEvent evt) { ++ ++ if (evt.getSource() == viewcert) { ++ /* View Certificate button clicked */ ++ if (viewing_cert) { ++ /* show the original info text: */ ++ textarea.setText(text); ++ viewcert.setLabel("View Certificate"); ++ viewing_cert = false; ++ } else { ++ int i; ++ /* show all (likely just one) certs: */ ++ textarea.setText(""); ++ for (i=0; i < trustallCerts.length; i++) { ++ int j = i + 1; ++ textarea.append("Certificate[" + ++ j + "]\n\n"); ++ textarea.append( ++ trustallCerts[i].toString()); ++ textarea.append(ln); ++ } ++ viewcert.setLabel("View Info"); ++ viewing_cert = true; ++ ++ textarea.setCaretPosition(0); ++ } ++ ++ } else if (evt.getSource() == ok) { ++ /* OK button clicked */ ++ if (accept.getState()) { ++ trust_this_session = true; ++ } else { ++ trust_this_session = false; ++ } ++ dialog.dispose(); ++ ++ } else if (evt.getSource() == cancel) { ++ /* Cancel button clicked */ ++ trust_this_session = false; ++ ++ dialog.dispose(); ++ } ++ } ++ ++ String get_certinfo() { ++ String all = ""; ++ String fields[] = {"CN", "OU", "O", "L", "C"}; ++ int i; ++ if (trustallCerts.length < 1) { ++ all = ""; ++ return all; ++ } ++ String cert = trustallCerts[0].toString(); ++ ++ /* ++ * For now we simply scrape the cert string, there must ++ * be an API for this... perhaps optionValue? ++ */ ++ ++ for (i=0; i < fields.length; i++) { ++ int f, t, t1, t2; ++ String sub, mat = fields[i] + "="; ++ ++ f = cert.indexOf(mat, 0); ++ if (f > 0) { ++ t1 = cert.indexOf(", ", f); ++ t2 = cert.indexOf("\n", f); ++ if (t1 < 0 && t2 < 0) { ++ continue; ++ } else if (t1 < 0) { ++ t = t2; ++ } else if (t2 < 0) { ++ t = t1; ++ } else if (t1 < t2) { ++ t = t1; ++ } else { ++ t = t2; ++ } ++ if (t > f) { ++ sub = cert.substring(f, t); ++ all = all + " " + sub + "\n"; ++ } ++ } ++ } ++ return all; ++ } ++} ++ ++class ProxyDialog implements ActionListener { ++ String guessedHost = null; ++ String guessedPort = null; ++ /* ++ * this is the gui to show the user the cert and info and ask ++ * them if they want to continue using this cert. ++ */ ++ ++ Button ok; ++ Dialog dialog; ++ TextField entry; ++ String reply = ""; ++ ++ ProxyDialog (String h, int p) { ++ guessedHost = h; ++ try { ++ guessedPort = Integer.toString(p); ++ } catch (Exception e) { ++ guessedPort = "8080"; ++ } ++ } ++ ++ public void queryUser() { ++ ++ /* create and display the dialog for unverified cert. */ ++ ++ Frame frame = new Frame("Need Proxy host:port"); ++ ++ dialog = new Dialog(frame, true); ++ ++ ++ Label label = new Label("Please Enter your https Proxy info as host:port", Label.CENTER); ++ //label.setFont(new Font("Helvetica", Font.BOLD, 16)); ++ entry = new TextField(30); ++ ok = new Button("OK"); ++ ok.addActionListener(this); ++ ++ String guess = ""; ++ if (guessedHost != null) { ++ guess = guessedHost + ":" + guessedPort; ++ } ++ entry.setText(guess); ++ ++ dialog.setLayout(new BorderLayout()); ++ dialog.add("North", label); ++ dialog.add("Center", entry); ++ dialog.add("South", ok); ++ dialog.pack(); ++ dialog.resize(dialog.preferredSize()); ++ ++ dialog.show(); /* block here til OK or Cancel pressed. */ ++ return; ++ } ++ ++ public String getHost() { ++ int i = reply.indexOf(":"); ++ if (i < 0) { ++ return "unknown"; ++ } ++ String h = reply.substring(0, i); ++ return h; ++ } ++ ++ public int getPort() { ++ int i = reply.indexOf(":"); ++ int p = 8080; ++ if (i < 0) { ++ return p; ++ } ++ i++; ++ String ps = reply.substring(i); ++ try { ++ Integer I = new Integer(ps); ++ p = I.intValue(); ++ } catch (Exception e) { ++ ; ++ } ++ return p; ++ } ++ ++ public synchronized void actionPerformed(ActionEvent evt) { ++ System.out.println(evt.getActionCommand()); ++ if (evt.getSource() == ok) { ++ reply = entry.getText(); ++ dialog.dispose(); ++ } ++ } ++} ++ ++class ClientCertDialog implements ActionListener { ++ ++ Button ok; ++ Dialog dialog; ++ TextField entry; ++ String reply = ""; ++ ++ ClientCertDialog() { ++ ; ++ } ++ ++ public String queryUser() { ++ ++ /* create and display the dialog for unverified cert. */ ++ ++ Frame frame = new Frame("Enter SSL Client Cert+Key String"); ++ ++ dialog = new Dialog(frame, true); ++ ++ ++ Label label = new Label("Please Enter the SSL Client Cert+Key String 308204c0...,...522d2d0a", Label.CENTER); ++ entry = new TextField(30); ++ ok = new Button("OK"); ++ ok.addActionListener(this); ++ ++ dialog.setLayout(new BorderLayout()); ++ dialog.add("North", label); ++ dialog.add("Center", entry); ++ dialog.add("South", ok); ++ dialog.pack(); ++ dialog.resize(dialog.preferredSize()); ++ ++ dialog.show(); /* block here til OK or Cancel pressed. */ ++ return reply; ++ } ++ ++ public synchronized void actionPerformed(ActionEvent evt) { ++ System.out.println(evt.getActionCommand()); ++ if (evt.getSource() == ok) { ++ reply = entry.getText(); ++ dialog.dispose(); ++ } ++ } ++} ++ ++class BrowserCertsDialog implements ActionListener { ++ Button yes, no; ++ Dialog dialog; ++ String vncServer; ++ String hostport; ++ public boolean showCertDialog = true; ++ ++ BrowserCertsDialog(String serv, String hp) { ++ vncServer = serv; ++ hostport = hp; ++ } ++ ++ public void queryUser() { ++ ++ /* create and display the dialog for unverified cert. */ ++ ++ Frame frame = new Frame("Use Browser/JVM Certs?"); ++ ++ dialog = new Dialog(frame, true); ++ ++ String m = ""; ++m += "\n"; ++m += "This VNC Viewer applet does not have its own keystore to track\n"; ++m += "SSL certificates, and so cannot authenticate the certificate\n"; ++m += "of the VNC Server:\n"; ++m += "\n"; ++m += " " + hostport + "\n\n " + vncServer + "\n"; ++m += "\n"; ++m += "on its own.\n"; ++m += "\n"; ++m += "However, it has noticed that your Web Browser or Java VM Plugin\n"; ++m += "has previously accepted the same certificate. You may have set\n"; ++m += "this up permanently or just for this session, or the server\n"; ++m += "certificate was signed by a CA cert that your Web Browser or\n"; ++m += "Java VM Plugin has.\n"; ++m += "\n"; ++m += "Should this VNC Viewer applet now connect to the above VNC server?\n"; ++m += "\n"; ++ ++// String m = "\nShould this VNC Viewer applet use your Browser/JVM certs to\n"; ++// m += "authenticate the VNC Server:\n"; ++// m += "\n " + hostport + "\n\n " + vncServer + "\n\n"; ++// m += "(NOTE: this *includes* any certs you have Just Now accepted in a\n"; ++// m += "dialog box with your Web Browser or Java Applet Plugin)\n\n"; ++ ++ TextArea textarea = new TextArea(m, 20, 64, ++ TextArea.SCROLLBARS_VERTICAL_ONLY); ++ textarea.setEditable(false); ++ yes = new Button("Yes"); ++ yes.addActionListener(this); ++ no = new Button("No, Let Me See the Certificate."); ++ no.addActionListener(this); ++ ++ dialog.setLayout(new BorderLayout()); ++ dialog.add("North", textarea); ++ dialog.add("Center", yes); ++ dialog.add("South", no); ++ dialog.pack(); ++ dialog.resize(dialog.preferredSize()); ++ ++ dialog.show(); /* block here til Yes or No pressed. */ ++ return; ++ } ++ ++ public synchronized void actionPerformed(ActionEvent evt) { ++ System.out.println(evt.getActionCommand()); ++ if (evt.getSource() == yes) { ++ showCertDialog = false; ++ dialog.dispose(); ++ } else if (evt.getSource() == no) { ++ showCertDialog = true; ++ dialog.dispose(); ++ } ++ } ++} ++ ++class CertInfo { ++ String fields[] = {"CN", "OU", "O", "L", "C"}; ++ java.security.cert.Certificate cert; ++ String certString = ""; ++ ++ CertInfo(java.security.cert.Certificate c) { ++ cert = c; ++ certString = cert.toString(); ++ } ++ ++ String get_certinfo(String which) { ++ int i; ++ String cs = new String(certString); ++ String all = ""; ++ ++ /* ++ * For now we simply scrape the cert string, there must ++ * be an API for this... perhaps optionValue? ++ */ ++ for (i=0; i < fields.length; i++) { ++ int f, t, t1, t2; ++ String sub, mat = fields[i] + "="; ++ ++ f = cs.indexOf(mat, 0); ++ if (f > 0) { ++ t1 = cs.indexOf(", ", f); ++ t2 = cs.indexOf("\n", f); ++ if (t1 < 0 && t2 < 0) { ++ continue; ++ } else if (t1 < 0) { ++ t = t2; ++ } else if (t2 < 0) { ++ t = t1; ++ } else if (t1 < t2) { ++ t = t1; ++ } else { ++ t = t2; ++ } ++ if (t > f) { ++ sub = cs.substring(f, t); ++ all = all + " " + sub + "\n"; ++ if (which.equals(fields[i])) { ++ return sub; ++ } ++ } ++ } ++ } ++ if (which.equals("all")) { ++ return all; ++ } else { ++ return ""; ++ } ++ } ++} +diff -Naur JavaViewer.orig/VncCanvas.java JavaViewer/VncCanvas.java +--- JavaViewer.orig/VncCanvas.java 2005-11-21 18:50:18.000000000 -0500 ++++ JavaViewer/VncCanvas.java 2007-05-16 15:57:36.000000000 -0400 +@@ -27,6 +27,9 @@ + import java.lang.*; + import java.util.zip.*; + ++// begin runge/x11vnc ++import java.util.Collections; ++// end runge/x11vnc + + // + // VncCanvas is a subclass of Canvas which draws a VNC desktop on it. +@@ -85,6 +88,22 @@ + + cm24 = new DirectColorModel(24, 0xFF0000, 0x00FF00, 0x0000FF); + ++// begin runge/x11vnc ++// kludge to not show any Java cursor in the canvas since we are ++// showing the soft cursor (should be a user setting...) ++Cursor dot = Toolkit.getDefaultToolkit().createCustomCursor( ++ Toolkit.getDefaultToolkit().createImage(new byte[4]), new Point(0,0), ++ "dot"); ++this.setCursor(dot); ++ ++// while we are at it... get rid of the keyboard traversals that ++// make it so we can't type a Tab character: ++this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, ++ Collections.EMPTY_SET); ++this.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, ++ Collections.EMPTY_SET); ++// end runge/x11vnc ++ + colors = new Color[256]; + // sf@2005 - Now Default + for (int i = 0; i < 256; i++) +@@ -237,6 +256,9 @@ + } + else + { ++// begin runge/x11vnc ++ viewer.options.oldEightBitColors = viewer.options.eightBitColors; ++// end runge/x11vnc + rfb.writeSetPixelFormat( + 32, + 24, +@@ -1532,9 +1554,14 @@ + else + { + result = +- 0xFF000000 | (pixBuf[i * 4 + 1] & 0xFF) +- << 16 | (pixBuf[i * 4 + 2] & 0xFF) +- << 8 | (pixBuf[i * 4 + 3] & 0xFF); ++// begin runge/x11vnc ++// 0xFF000000 | (pixBuf[i * 4 + 1] & 0xFF) ++// << 16 | (pixBuf[i * 4 + 2] & 0xFF) ++// << 8 | (pixBuf[i * 4 + 3] & 0xFF); ++ 0xFF000000 | (pixBuf[i * 4 + 2] & 0xFF) ++ << 16 | (pixBuf[i * 4 + 1] & 0xFF) ++ << 8 | (pixBuf[i * 4 + 0] & 0xFF); ++// end runge/x11vnc + } + } else { + result = 0; // Transparent pixel +@@ -1565,9 +1592,14 @@ + else + { + result = +- 0xFF000000 | (pixBuf[i * 4 + 1] & 0xFF) +- << 16 | (pixBuf[i * 4 + 2] & 0xFF) +- << 8 | (pixBuf[i * 4 + 3] & 0xFF); ++// begin runge/x11vnc ++// 0xFF000000 | (pixBuf[i * 4 + 1] & 0xFF) ++// << 16 | (pixBuf[i * 4 + 2] & 0xFF) ++// << 8 | (pixBuf[i * 4 + 3] & 0xFF); ++ 0xFF000000 | (pixBuf[i * 4 + 2] & 0xFF) ++ << 16 | (pixBuf[i * 4 + 1] & 0xFF) ++ << 8 | (pixBuf[i * 4 + 0] & 0xFF); ++// end runge/x11vnc + } + } else { + result = 0; // Transparent pixel +diff -Naur JavaViewer.orig/VncViewer.java JavaViewer/VncViewer.java +--- JavaViewer.orig/VncViewer.java 2006-05-24 15:14:40.000000000 -0400 ++++ JavaViewer/VncViewer.java 2007-05-15 15:09:10.000000000 -0400 +@@ -115,6 +115,22 @@ + int i; + // mslogon support 2 end + ++// begin runge/x11vnc ++boolean disableSSL; ++boolean GET; ++String CONNECT; ++String urlPrefix; ++String httpsPort; ++String oneTimeKey; ++boolean forceProxy; ++boolean ignoreProxy; ++boolean trustAllVncCerts; ++boolean trustUrlVncCert; ++ ++boolean ignoreMSLogonCheck; ++// end runge/x11vnc ++ ++ + // + // init() + // +@@ -336,7 +352,12 @@ + // + + +- prologueDetectAuthProtocol() ; ++// begin runge/x11vnc ++// prologueDetectAuthProtocol() ; ++ if (ignoreMSLogonCheck == false) { ++ prologueDetectAuthProtocol() ; ++ } ++// end runge/x11vnc + + authenticator = new AuthPanel(mslogon); + +@@ -435,7 +456,7 @@ + + rfb.readVersionMsg(); + +- System.out.println("RFB server supports protocol version " + ++ System.out.println("RFB server supports protocol version: " + + rfb.serverMajor + "." + rfb.serverMinor); + + rfb.writeVersionMsg(); +@@ -804,6 +825,75 @@ + deferScreenUpdates = readIntParameter("Defer screen updates", 20); + deferCursorUpdates = readIntParameter("Defer cursor updates", 10); + deferUpdateRequests = readIntParameter("Defer update requests", 50); ++ ++// begin runge/x11vnc ++ // SSL ++ disableSSL = false; ++ str = readParameter("DisableSSL", false); ++ if (str != null && str.equalsIgnoreCase("Yes")) ++ disableSSL = true; ++ ++ httpsPort = readParameter("httpsPort", false); ++ ++ // Extra GET, CONNECT string: ++ CONNECT = readParameter("CONNECT", false); ++ if (CONNECT != null) { ++ CONNECT = CONNECT.replaceAll(" ", ":"); ++ } ++ ++ GET = false; ++ str = readParameter("GET", false); ++ if (str != null && str.equalsIgnoreCase("Yes")) { ++ GET = true; ++ } ++ if (str != null && str.equalsIgnoreCase("1")) { ++ GET = true; ++ } ++ ++ urlPrefix = readParameter("urlPrefix", false); ++ if (urlPrefix != null) { ++ urlPrefix = urlPrefix.replaceAll("%2F", "/"); ++ urlPrefix = urlPrefix.replaceAll("%2f", "/"); ++ urlPrefix = urlPrefix.replaceAll("_2F_", "/"); ++ if (urlPrefix.indexOf("/") != 0) { ++ urlPrefix = "/" + urlPrefix; ++ } ++ } else { ++ urlPrefix = ""; ++ } ++ System.out.println("urlPrefix: '" + urlPrefix + "'"); ++ ++ oneTimeKey = readParameter("oneTimeKey", false); ++ if (oneTimeKey != null) { ++ System.out.println("oneTimeKey: is set"); ++ } ++ ++ forceProxy = false; ++ str = readParameter("forceProxy", false); ++ if (str != null && str.equalsIgnoreCase("Yes")) { ++ forceProxy = true; ++ } ++ ignoreProxy = false; ++ str = readParameter("ignoreProxy", false); ++ if (str != null && str.equalsIgnoreCase("Yes")) { ++ ignoreProxy = true; ++ } ++ trustAllVncCerts = false; ++ str = readParameter("trustAllVncCerts", false); ++ if (str != null && str.equalsIgnoreCase("Yes")) { ++ trustAllVncCerts = true; ++ } ++ trustUrlVncCert = false; ++ str = readParameter("trustUrlVncCert", false); ++ if (str != null && str.equalsIgnoreCase("Yes")) { ++ trustUrlVncCert = true; ++ } ++ ignoreMSLogonCheck = false; ++ str = readParameter("ignoreMSLogonCheck", false); ++ if (str != null && str.equalsIgnoreCase("Yes")) { ++ ignoreMSLogonCheck = true; ++ } ++// end runge/x11vnc + } + + public String readParameter(String name, boolean required) {