]> source.dussan.org Git - tigervnc.git/commitdiff
[Development] java: Implement VeNCrypt chooser (Martin Koegler)
authorAdam Tkac <atkac@redhat.com>
Thu, 11 Nov 2010 13:21:55 +0000 (13:21 +0000)
committerAdam Tkac <atkac@redhat.com>
Thu, 11 Nov 2010 13:21:55 +0000 (13:21 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4191 3789f03b-4d11-0410-bbf8-ca57d06f2519

java/src/com/tigervnc/vncviewer/RfbProto.java
java/src/com/tigervnc/vncviewer/VncViewer.java

index dc7aa2e5dab2b44c3be74ac9da717546ae40dbb4..ab3c1521fb14f01d01113953154aa145c3c656bc 100644 (file)
@@ -391,7 +391,8 @@ class RfbProto {
 
     // Find first supported security type.
     for (int i = 0; i < nSecTypes; i++) {
-      if (secTypes[i] == SecTypeNone || secTypes[i] == SecTypeVncAuth) {
+      if (secTypes[i] == SecTypeNone || secTypes[i] == SecTypeVncAuth
+          || secTypes[i] == SecTypeVeNCrypt) {
        secType = secTypes[i];
        break;
       }
@@ -406,6 +407,36 @@ class RfbProto {
     return secType;
   }
 
+    int authenticateVeNCrypt() throws Exception {
+       int majorVersion = readU8();
+       int minorVersion = readU8();
+       int Version = (majorVersion << 8) | minorVersion;
+       if (Version < 0x0002) {
+           os.write(0);
+           os.write(0);
+           throw new Exception("Server reported an unsupported VeNCrypt version");
+       }
+       os.write(0);
+       os.write(2);
+       if (readU8() != 0)
+           throw new Exception("Server reported it could not support the VeNCrypt version");
+       int nSecTypes = readU8();
+       int[] secTypes = new int[nSecTypes];
+       for(int i = 0; i < nSecTypes; i++)
+           secTypes[i] = readU32();
+
+       for(int i = 0; i < nSecTypes; i++)
+           switch(secTypes[i])
+               {
+               case SecTypeNone:
+               case SecTypeVncAuth:
+                   writeInt(secTypes[i]);
+                   return secTypes[i];
+               }
+
+       throw new Exception("No valid VeNCrypt sub-type");
+    }
+
   //
   // Perform "no authentication".
   //
index 3c527ba795b653240b0e6d4a003369945e97029c..711b1c95a0ff92c257a6694b0e76d362ca21b75b 100644 (file)
@@ -361,25 +361,34 @@ public class VncViewer extends java.applet.Applet
       authType = secType;
     }
 
-    switch (authType) {
-    case RfbProto.AuthNone:
-      showConnectionStatus("No authentication needed");
-      rfb.authenticateNone();
-      break;
-    case RfbProto.AuthVNC:
-      showConnectionStatus("Performing standard VNC authentication");
-      if (passwordParam != null) {
-        rfb.authenticateVNC(passwordParam);
-      } else {
-        String pw = askPassword();
-        rfb.authenticateVNC(pw);
-      }
-      break;
-    default:
-      throw new Exception("Unknown authentication scheme " + authType);
-    }
+    doAuthentification(authType);
   }
 
+    void doAuthentification(int secType) throws Exception {
+       switch (secType) {
+       case RfbProto.SecTypeNone:
+           showConnectionStatus("No authentication needed");
+           rfb.authenticateNone();
+           break;
+       case RfbProto.SecTypeVncAuth:
+           showConnectionStatus("Performing standard VNC authentication");
+           if (passwordParam != null) {
+               rfb.authenticateVNC(passwordParam);
+           } else {
+               String pw = askPassword();
+               rfb.authenticateVNC(pw);
+           }
+           break;
+       case RfbProto.SecTypeVeNCrypt:
+           showConnectionStatus("VeNCrypt chooser");
+           secType = rfb.authenticateVeNCrypt();
+           doAuthentification(secType);
+           break;
+       default:
+           throw new Exception("Unknown authentication scheme " + secType);
+       }
+    }
+
 
   //
   // Show a message describing the connection status.