This directory contains a patched Java applet VNC viewer that is SSL
enabled.

The patches in the *.patch files are relative to the source tarball:

	tightvnc-1.3dev7_javasrc.tar.gz  

currently (4/06) available here:

   http://prdownloads.sourceforge.net/vnc-tight/tightvnc-1.3dev7_javasrc.tar.gz?download

It also includes some simple patches to:

	- fix richcursor colors

	- make the Java Applet cursor (not the cursor drawn to the canvas
	  framebuffer) invisible when it is inside the canvas.

	- allow Tab (and some other) keystrokes to be sent to the vnc
	  server instead of doing widget traversal.


This SSL applet should work with any VNC viewer that has an SSL tunnel in
front of it.  It has been tested on x11vnc and using the stunnel tunnel
to other VNC servers.

By default this Vnc Viewer will only do SSL.  To do unencrypted traffic
see the "DisableSSL" applet parameter (e.g. set it to Yes in index.vnc).

Proxies: they are a general problem with java socket applets (a socket
connection does not go through the proxy).  See the info in the proxy.vnc
file for a workaround.  It uses SignedVncViewer.jar which is simply
a signed version of VncViewer.jar.  The basic idea is the user clicks
"Yes" to trust the applet and then it can connect directly to the proxy
and issue a CONNECT request.

This applet has been tested on versions 1.4.2 and 1.5.0 of the Sun
Java plugin.  It may not work on older releases or different vendor VM's.
Send full Java Console output for failures.

---------------------------------------------------------------
Tips:

When doing single-port proxy connections (e.g. both VNC and HTTPS
through port 5900) it helps to move through the 'do you trust this site'
dialogs quickly.   x11vnc has to wait to see if the traffic is VNC or
HTTP and this can cause timeouts if you don't move through them quickly.

You may have to restart your browser completely if it gets into a
weird state.  For one case we saw the JVM requesting VncViewer.class
even when no such file exists.


---------------------------------------------------------------
Extras:

ss_vncviewer (not Java):

        Wrapper script for native VNC viewer to connect to x11vnc in
        SSL mode.  Script launches stunnel(8) and then connects to it
        via localhost which in turn is then redirected to x11vnc via an
        SSL tunnel.  stunnel(8) must be installed and available in PATH.


Running Java SSL VncViewer from the command line:

	From this directory:

	java -cp ./VncViewer.jar VncViewer HOST <thehost> PORT <theport>

	substitute <thehost> and <theport> 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

---------------------------------------------------------------
Applet Parameters:

Some additional applet parameters can be set via the URL, e.g.

	http://host:5800/?param=value
	http://host:5800/ultra.vnc?param=value
	https://host:5900/ultra.vnc?param=value

etc.  If running java from command line as show above, it comes
in as java ... VncViewer param value ... 

There is a limitation with libvncserver that param and value can
only be alphanumeric, underscore, "+" (for space), or "."

We have added some applet parameters to the stock VNC java
viewers.  Here are the applet parameters:

Both TightVNC and UltraVNC Java viewers:

  HOST
	string, default: none.
	The Hostname to connect to.
	
  PORT
	number, default: 0
	The VNC server port to connect to.

  Open New Window
	yes/no, default: no
	Run applet in separate frame.

  Show Controls
	yes/no, default: yes
	Show Controls button panel.

  Show Offline Desktop
	yes/no, default: no
	Do we continue showing desktop on remote disconnect?

  Defer screen updates
	number, default: 20
	Milliseconds delay

  Defer cursor updates
	number, default: 10
	Milliseconds delay

  Defer update requests
	number, default: 50
	Milliseconds delay

  PASSWORD
	string, default: none
	VNC session password in plain text.

  ENCPASSWORD
	string, default: none
	VNC session password in encrypted in DES with KNOWN FIXED
	key.  It is a hex string.  This is like the ~/.vnc/passwd format.
  
  
  The following are added by x11vnc and/or ssvnc project
  
  VNCSERVERPORT
	number, default: 0
	Like PORT, but if there is a firewall this is the Actual VNC
	server port.  PORT might be a redir port on the firewall.

  DisableSSL
	yes/no, default: no
	Do unencrypted connection, no SSL. 

  httpsPort
	number, default: none
	When checking for proxy, use this at the url port number.

  CONNECT
	string, default: none
	Sets to host:port for the CONNECT line to a Web proxy. 
	The Web proxy should connect us to it.

  GET
	yes/no, default: no
	Set to do a special HTTP GET (/request.https.vnc.connection)
	to the vnc server that will cause it to switch to VNC instead.
	This is to speedup/make more robust, the single port HTTPS and VNC
	mode of x11vnc (e.g. both services through port 5900, etc)
	
  urlPrefix
	string, default: none
	set to a string that will be prefixed to all URL's when contacting
	the VNC server.  Idea is a special proxy will use this to indicate
	internal hostname, etc.

  oneTimeKey
	string, default: none
	set a special hex "key" to correspond to an SSL X.509 cert+key.
	See the 'onetimekey' helper script.  Can also be PROMPT to prompt
	the user to paste the hex key string in.

	This provides a Client-Side cert+key that the client will use to
	authenticate itself by SSL To the VNC Server.

	This is to try to work around the problem that the Java applet
	cannot keep an SSL keystore on disk, etc.  E.g. if they log
	into an HTTPS website via password they are authenticated and
	encrypted, then the website can safely put oneTimeKey=... on the
	URL.  The Vncviewer authenticates the VNC server with this key.

	Note that there is currently a problem in that if x11vnc requires
	Client Certificates the user cannot download the index.vnc HTML
	and VncViewer.jar from the same x11vnc.  Those need to come from
	a different x11vnc or from a web server.

	Note that the HTTPS website can also put the VNC Password
	(e.g. a temporary/one-time one) in the parameter PASSWORD.
	The Java Applet will automatically supply this VNC password
	instead of prompting.

  serverCert
	string, default: none
	set a special hex "cert" to correspond to an SSL X.509 cert
	See the 'onetimekey -certonly' helper script.

	This provides a Server-Side cert that the client will authenticate
	the VNC Server against by SSL.

	This is to try to work around the problem that the Java applet
	cannot keep an SSL keystore on disk, etc.  E.g. if they log
	into an HTTPS website via password they are authenticated and
	encrypted, then the website can safely put serverCert=... on the
	URL.

	Of course the VNC Server is sending this string to the Java
	Applet, so this is only reasonable security if the VNC Viewer
	already trusts the HTTPS retrieval of the URL + serverCert param
	that it gets.  This should be done over HTTPS not HTTP.

  proxyHost
	string, default: none
	Do not try to guess the proxy's hostname, use the value in
	proxyHost.  Does not imply forceProxy (below.)

  proxyPort
	string, default: none
	Do not try to guess the proxy's port number, use the value in
	proxyPort.  Does not imply forceProxy (below.)

  forceProxy
	yes/no, default: no
	Assume there is a proxy and force its use.

	If a string other than "yes" or "no" is given, it implies "yes"
	and uses the string for proxyHost and proxyPort (see above).
	In this case the string must be of the form "hostname+port".
	Note that it is "+" and not ":" before the port number.

  ignoreProxy
	yes/no, default: no
	Don't check for a proxy, assume there is none.

  trustAllVncCerts
	yes/no, default: no
	Automatically trust any cert received from the VNC server
	(obviously this could be dangerous and lead to man in the
	middle attack).  Do not ask the user to verify any of these
	certs from the VNC server.

  trustUrlVncCert
	yes/no, default: no
	Automatically trust any cert that the web browsers has accepted.
	E.g. the user said "Yes" or "Continue" to a web browser dialog
	regarding a certificate.  If we get the same cert (chain) from
	the VNC server we trust it without prompting the user.

  debugCerts
	yes/no, default: no
	Print out every cert in the Server, TrustUrl, TrustAll chains.


TightVNC Java viewer only:

  Offer Relogin
	yes/no, default: yes
	"Offer Relogin" set to "No" disables "Login again" 

  SocketFactory
	string, default: none
	set Java Socket class factory.

UltraVNC Java viewer only:

  None.

  The following are added by x11vnc and/or ssvnc project
  
  ftpDropDown
	string, default: none
	Sets the file transfer "drives" dropdown to the "." separated
	list.  Use "+" for space. The default is

		My+Documents.Desktop.Home

	for 3 entries in the dropdown in addition to the "drives"
	(e.g. C:\)  These items should be expanded properly by the VNC
	Server.  x11vnc will prepend $HOME to them, which is normally
	what one wants.  To include a "/" use "_2F_".  Another example:

		Home.Desktop.bin_2F_linux

	If an item is prefixed with "TOP_" then the item is inserted at
	the top of the drop down rather than being appended to the end.
	E.g. to try to initially load the user homedir instead of /:

		TOP_Home.My+Documents.Desktop

	If ftpDropDown is set to the empty string, "", then no special
	locations, [Desktop] etc., are placed in the drop down.  Only the
	ultravnc "drives" will appear.

  ftpOnly
	yes/no, default: no
	The VNC viewer only shows the filetransfer panel, no desktop
	is displayed.

  graftFtp
	yes/no, default: no
	As ftpOnly, the VNC viewer only shows the filetransfer panel,
	no desktop is displayed, however it is "grafted" onto an existing
	SSVNC unix vncviewer.  The special SSVNC vncviewer merges the two
	channels.

  dsmActive
	yes/no, default: no
	Special usage mode with the SSVNC unix vncviewer.  The UltraVNC
	DSM encryption is active.  Foolishly, UltraVNC DSM encryption
	*MODIFIES* the VNC protocol when active (it is not a pure tunnel).
	This option indicates to modify the VNC protocol to make this work. 
	Usually only used with graftFtp and SSVNC unix vncviewer.

  delayAuthPanel
	yes/no, default: no
	This is another special usage mode with the SSVNC unix vncviewer.
	A login panel is delayed (not shown at startup.)  Could be useful
	for non SSVNC usage too.

  ignoreMSLogonCheck
	yes/no, default: no
	Similar to delayAuthPanel, do not put up a popup asking for
	Windows username, etc.
