More fixes for bug #3418256. Copied jarsigning routine from TurboVNC in order to produce a signed applet so the system clipboard can be accessed from when used in applet mode. These changes will need some testing to make sure that there aren't any corner-cases where something breaks.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4695 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/java/src/com/tigervnc/vncviewer/CConn.java b/java/src/com/tigervnc/vncviewer/CConn.java
index 8784750..ee96947 100644
--- a/java/src/com/tigervnc/vncviewer/CConn.java
+++ b/java/src/com/tigervnc/vncviewer/CConn.java
@@ -154,7 +154,7 @@
     encodingChange = false; sameMachine = false;
     fullScreen = viewer.fullScreen.getValue();
     menuKey = Keysyms.F8;
-    options = new OptionsDialog(this, this);
+    options = new OptionsDialog(this);
     options.initDialog();
     clipboardDialog = new ClipboardDialog(this);
     firstUpdate = true; pendingUpdate = false;
diff --git a/java/src/com/tigervnc/vncviewer/ClipboardDialog.java b/java/src/com/tigervnc/vncviewer/ClipboardDialog.java
index ef479ed..dca85f2 100644
--- a/java/src/com/tigervnc/vncviewer/ClipboardDialog.java
+++ b/java/src/com/tigervnc/vncviewer/ClipboardDialog.java
@@ -62,16 +62,20 @@
 
   public void serverCutText(String str, int len) {
     setContents(str);    
-    Clipboard cb = null;
-    if (!cc.viewer.applet)
-      cb = Toolkit.getDefaultToolkit().getSystemClipboard();
-    if (cb != null) {
-      StringSelection ss = new StringSelection(str);
-      try {
-        cb.setContents(ss, ss);
-      } catch(Exception e) {
-        vlog.debug(e.toString());
+    SecurityManager sm = System.getSecurityManager();
+    try {
+      if (sm != null) sm.checkSystemClipboardAccess();
+      Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
+      if (cb != null) {
+        StringSelection ss = new StringSelection(str);
+        try {
+          cb.setContents(ss, ss);
+        } catch(Exception e) {
+          vlog.debug(e.toString());
+        }
       }
+    } catch(SecurityException e) {
+      System.err.println("Cannot access the system clipboard");
     }
   }
 
diff --git a/java/src/com/tigervnc/vncviewer/DesktopWindow.java b/java/src/com/tigervnc/vncviewer/DesktopWindow.java
index d6704e0..1ecc0e3 100644
--- a/java/src/com/tigervnc/vncviewer/DesktopWindow.java
+++ b/java/src/com/tigervnc/vncviewer/DesktopWindow.java
@@ -364,23 +364,27 @@
   String oldContents = "";
   
   synchronized public void checkClipboard() {
-    Clipboard cb = null;
-    if (!cc.viewer.applet)
-      cb = Toolkit.getDefaultToolkit().getSystemClipboard();
-    if (cb != null && cc.viewer.sendClipboard.getValue()) {
-      Transferable t = cb.getContents(null);
-      if ((t != null) && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
-        try {
-          String newContents = (String)t.getTransferData(DataFlavor.stringFlavor);
-          if (newContents != null && !newContents.equals(oldContents)) {
-            cc.writeClientCutText(newContents, newContents.length());
-            oldContents = newContents;
-            cc.clipboardDialog.setContents(newContents);
+    SecurityManager sm = System.getSecurityManager();
+    try {
+      if (sm != null) sm.checkSystemClipboardAccess();
+      Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
+      if (cb != null && cc.viewer.sendClipboard.getValue()) {
+        Transferable t = cb.getContents(null);
+        if ((t != null) && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+          try {
+            String newContents = (String)t.getTransferData(DataFlavor.stringFlavor);
+            if (newContents != null && !newContents.equals(oldContents)) {
+              cc.writeClientCutText(newContents, newContents.length());
+              oldContents = newContents;
+              cc.clipboardDialog.setContents(newContents);
+            }
+          } catch (java.lang.Exception e) {
+            System.out.println("Exception getting clipboard data: " + e.getMessage());
           }
-        } catch (java.lang.Exception e) {
-          System.out.println("Exception getting clipboard data: " + e.getMessage());
         }
       }
+    } catch(SecurityException e) {
+      System.err.println("Cannot access the system clipboard");
     }
   }
 
diff --git a/java/src/com/tigervnc/vncviewer/Makefile b/java/src/com/tigervnc/vncviewer/Makefile
index 614057b..51d4917 100644
--- a/java/src/com/tigervnc/vncviewer/Makefile
+++ b/java/src/com/tigervnc/vncviewer/Makefile
@@ -40,6 +40,14 @@
 		com/jcraft/jzlib/*.class \
 		com/tigervnc/vncviewer/tigervnc.png \
 		com/tigervnc/vncviewer/tigervnc.ico
+	rm -f tigervnc.keystore
+	keytool -genkey -alias TigerVNC -keystore tigervnc.keystore -keyalg RSA \
+		-storepass tigervnc -keypass tigervnc -validity 7300 \
+		-dname "CN=TigerVNC, OU=Software Development, O=The TigerVNC Project, L=Austin, S=Texas, C=US"
+	jarsigner -keystore tigervnc.keystore -storepass tigervnc -keypass tigervnc \
+		$(ARCHIVE) TigerVNC
+	rm -f tigervnc.keystore
+
 
 $(TIMESTAMP):
 	$(shell cat $(MANIFEST) > $(TIMESTAMP))
diff --git a/java/src/com/tigervnc/vncviewer/OptionsDialog.java b/java/src/com/tigervnc/vncviewer/OptionsDialog.java
index 265c7d2..4913fad 100644
--- a/java/src/com/tigervnc/vncviewer/OptionsDialog.java
+++ b/java/src/com/tigervnc/vncviewer/OptionsDialog.java
@@ -57,17 +57,13 @@
 
   boolean autoScale = false;
   boolean fixedRatioScale = false;
-  boolean applet = false;
 
-  public OptionsDialog(OptionsDialogCallback cb_, CConn cc_) { 
+  public OptionsDialog(OptionsDialogCallback cb_) { 
     super(false);
     cb = cb_;
-    CConn cc = cc_;
-    applet = cc.viewer.applet;
     setResizable(false);
     setTitle("VNC Viewer Options");
-    if (!applet)
-      defaults = new UserPrefs("vncviewer");
+    defaults = new UserPrefs("vncviewer");
 
     getContentPane().setLayout(
       new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
@@ -196,7 +192,7 @@
     addGBComponent(cfSaveAsButton,configPanel, 0, 2, 1, 1, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, new Insets(4,8,4,8));
     cfReloadButton.setEnabled(false);
     cfSaveButton.setEnabled(false);
-    cfSaveAsButton.setEnabled(!applet);
+    //cfSaveAsButton.setEnabled(!applet);
 
     JPanel defaultsPanel = new JPanel(new GridBagLayout());
     defaultsPanel.setBorder(BorderFactory.createTitledBorder("Defaults"));
@@ -209,8 +205,8 @@
 
     addGBComponent(configPanel,DefaultsPanel, 0, 0, 1, GridBagConstraints.REMAINDER, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.PAGE_START, new Insets(4,4,4,4));
     addGBComponent(defaultsPanel,DefaultsPanel, 1, 0, 1, GridBagConstraints.REMAINDER, 0, 0, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.PAGE_START, new Insets(4,4,4,4));
-    defReloadButton.setEnabled(!applet);
-    defSaveButton.setEnabled(!applet);
+    //defReloadButton.setEnabled(!applet);
+    //defSaveButton.setEnabled(!applet);
 
     // security tab
     SecPanel=new JPanel(new GridBagLayout());
@@ -349,8 +345,7 @@
       endDialog();
     } else if (s instanceof JButton && (JButton)s == defSaveButton) {
       try {
-        if (!applet)
-          defaults.Save();
+        defaults.Save();
       } catch (java.lang.Exception x) { }
     } else if (s instanceof JButton && (JButton)s == ca) {
       JFileChooser fc = new JFileChooser();
@@ -378,18 +373,15 @@
       mediumColour.setEnabled(!autoSelect.isSelected());
       lowColour.setEnabled(!autoSelect.isSelected());
       veryLowColour.setEnabled(!autoSelect.isSelected());
-      if (!applet)
-        defaults.setPref("autoSelect",(autoSelect.isSelected()) ? "on" : "off");
+      defaults.setPref("autoSelect",(autoSelect.isSelected()) ? "on" : "off");
     } 
     if (s instanceof JCheckBox && (JCheckBox)s == customCompressLevel) {
       compressLevel.setEnabled(customCompressLevel.isSelected());
-      if (!applet)
-        defaults.setPref("customCompressLevel",(customCompressLevel.isSelected()) ? "on" : "off");
+      defaults.setPref("customCompressLevel",(customCompressLevel.isSelected()) ? "on" : "off");
     }
     if (s instanceof JCheckBox && (JCheckBox)s == noJpeg) {
       qualityLevel.setEnabled(noJpeg.isSelected());
-      if (!applet)
-        defaults.setPref("noJpeg",(noJpeg.isSelected()) ? "on" : "off");
+      defaults.setPref("noJpeg",(noJpeg.isSelected()) ? "on" : "off");
     }
     if (s instanceof JComboBox && (JComboBox)s == scalingFactor) {
       autoScale = fixedRatioScale = false;
@@ -400,8 +392,7 @@
       }
     }
     if (s instanceof JCheckBox && (JCheckBox)s == sendLocalUsername) {
-      if (!applet)
-        defaults.setPref("sendLocalUsername",(sendLocalUsername.isSelected()) ? "on" : "off");
+      defaults.setPref("sendLocalUsername",(sendLocalUsername.isSelected()) ? "on" : "off");
     }
     if (s instanceof JCheckBox && (JCheckBox)s == secVeNCrypt) {
       encNone.setEnabled(secVeNCrypt.isSelected());
diff --git a/java/src/com/tigervnc/vncviewer/ServerDialog.java b/java/src/com/tigervnc/vncviewer/ServerDialog.java
index 1ba6dc2..00a7e18 100644
--- a/java/src/com/tigervnc/vncviewer/ServerDialog.java
+++ b/java/src/com/tigervnc/vncviewer/ServerDialog.java
@@ -137,24 +137,28 @@
   }
   
   public void endDialog() {
-    if (ok && !cc.viewer.applet) {
-      options.defaults.setPref("encryption",(encryption.getSelectedIndex()==1) ? "off" : "on");
-      if (!server.getSelectedItem().toString().equals("")) {
-        String t = (options.defaults.getString("server")==null) ? "" : options.defaults.getString("server");
-        StringTokenizer st = new StringTokenizer(t, ",");
-        StringBuffer sb = new StringBuffer().append((String)server.getSelectedItem());
-        while (st.hasMoreTokens()) {
-          String s = st.nextToken();
-          if (!s.equals((String)server.getSelectedItem()) && !s.equals("")) {
-            sb.append(',');
-            sb.append(s);
-          }
-        }
-        options.defaults.setPref("server", sb.toString());
-      }
+    if (ok) {
       try {
+        options.defaults.setPref("encryption",(encryption.getSelectedIndex()==1) ? "off" : "on");
+        if (!server.getSelectedItem().toString().equals("")) {
+          String t = (options.defaults.getString("server")==null) ? "" : options.defaults.getString("server");
+          StringTokenizer st = new StringTokenizer(t, ",");
+          StringBuffer sb = new StringBuffer().append((String)server.getSelectedItem());
+          while (st.hasMoreTokens()) {
+            String s = st.nextToken();
+            if (!s.equals((String)server.getSelectedItem()) && !s.equals("")) {
+              sb.append(',');
+              sb.append(s);
+            }
+          }
+          options.defaults.setPref("server", sb.toString());
+        }
         options.defaults.Save();
-      } catch (java.lang.Exception x) { }
+      } catch (java.io.IOException e) {
+        System.out.println(e.toString());
+      } catch(java.security.AccessControlException e) {
+        System.out.println(e.toString());
+		  }
     }
     done = true;
     if (modal) {
diff --git a/java/src/com/tigervnc/vncviewer/UserPrefs.java b/java/src/com/tigervnc/vncviewer/UserPrefs.java
index 51b8b90..b370221 100644
--- a/java/src/com/tigervnc/vncviewer/UserPrefs.java
+++ b/java/src/com/tigervnc/vncviewer/UserPrefs.java
@@ -58,13 +58,19 @@
 	public UserPrefs(String appName_) {
 		appName = appName_;
 		
-		systemprops=System.getProperties();
+		try {
+			systemprops=System.getProperties();
+		} catch(java.security.AccessControlException e) {
+			System.out.println("Cannot access system properties");
+		}
 		// This is guaranteed as always being some valid directory,
 		// according to spec.
 		prefFile= getHomeDir()+getFileSeperator()+
                 "."+appName;
 		try {
 			load(new java.io.FileInputStream(prefFile));
+		} catch(java.security.AccessControlException e)	{
+			System.out.println("Cannot access system properties");
 		} catch (Exception err)	{
 			if(err instanceof java.io.FileNotFoundException) {
         try {
@@ -109,33 +115,55 @@
 	 */
   final public static String getHomeDir() {
     String homeDir = null;
-    String os = System.getProperty("os.name");
-    try {
-      if (os.startsWith("Windows")) {
-        // JRE prior to 1.5 cannot reliably determine USERPROFILE
-        // return user.home and hope it's right...
-        if (Integer.parseInt(System.getProperty("java.version").split("\\.")[1]) < 5) {
-          homeDir = System.getProperty("user.home");
+		try {
+    	String os = System.getProperty("os.name");
+      try {
+        if (os.startsWith("Windows")) {
+          // JRE prior to 1.5 cannot reliably determine USERPROFILE
+          // return user.home and hope it's right...
+          if (Integer.parseInt(System.getProperty("java.version").split("\\.")[1]) < 5) {
+						try {
+            	homeDir = System.getProperty("user.home");
+						} catch(java.security.AccessControlException e) {
+							System.out.println("Cannot access user.home system property");
+						}
+          } else {
+            homeDir = System.getenv("USERPROFILE");
+          }
         } else {
-          homeDir = System.getenv("USERPROFILE");
+					try {
+          homeDir = FileSystemView.getFileSystemView().
+            getDefaultDirectory().getCanonicalPath();
+					} catch(java.security.AccessControlException e) {
+						System.out.println("Cannot access system property");
+					}
         }
-      } else {
-        homeDir = FileSystemView.getFileSystemView().
-          getDefaultDirectory().getCanonicalPath();
+      } catch (Exception e) {
+        e.printStackTrace();
       }
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
+		} catch(java.security.AccessControlException e) {
+			System.out.println("Cannot access os.name system property");
+		}
     return homeDir;
   }
 
   final private String getUserName() {
-    String userName = (String) System.getProperties().get("user.name");
+    String userName = null;
+		try {
+			userName = (String) System.getProperties().get("user.name");
+		} catch(java.security.AccessControlException e) {
+			System.out.println("Cannot access user.name system property");
+		}
     return userName;
   }
 
   final public static String getFileSeperator() {
-    String seperator = System.getProperties().get("file.separator").toString();
+    String seperator = null;
+		try {
+			seperator = System.getProperties().get("file.separator").toString();
+		} catch(java.security.AccessControlException e) {
+			System.out.println("Cannot access file.separator system property");
+		}
     return seperator;
   }
 
diff --git a/java/src/com/tigervnc/vncviewer/index.vnc b/java/src/com/tigervnc/vncviewer/index.vnc
index ba9e57c..fdd4f70 100644
--- a/java/src/com/tigervnc/vncviewer/index.vnc
+++ b/java/src/com/tigervnc/vncviewer/index.vnc
@@ -18,7 +18,6 @@
 <APPLET CODE=com.tigervnc.vncviewer.VncViewer ARCHIVE=VncViewer.jar
         WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
 <param name=PORT value=$PORT>
-$PARAMS
 </APPLET>
 <BR>
 <A href="http://www.tigervnc.org/">TigerVNC site</A>