summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/rfb.js93
1 files changed, 92 insertions, 1 deletions
diff --git a/include/rfb.js b/include/rfb.js
index 55d38c0..b071935 100644
--- a/include/rfb.js
+++ b/include/rfb.js
@@ -45,6 +45,7 @@ var that = {}, // Public API methods
rfb_version = 0,
rfb_max_version= 3.8,
rfb_auth_scheme= '',
+ rfb_tightvnc = false,
// In preference order
@@ -709,7 +710,7 @@ init_msg = function() {
types = ws.rQshiftBytes(num_types);
Util.Debug("Server security types: " + types);
for (i=0; i < types.length; i+=1) {
- if ((types[i] > rfb_auth_scheme) && (types[i] < 3)) {
+ if ((types[i] > rfb_auth_scheme) && (types[i] <= 16)) {
rfb_auth_scheme = types[i];
}
}
@@ -765,6 +766,68 @@ init_msg = function() {
ws.send(response);
updateState('SecurityResult');
return;
+ case 16: // TightVNC Security Type
+ if (ws.rQwait("num tunnels", 4)) { return false; }
+ var numTunnels = ws.rQshift32();
+ //console.log("Number of tunnels: "+numTunnels);
+
+ rfb_tightvnc = true;
+
+ if (numTunnels != 0)
+ {
+ fail("Protocol requested tunnels, not currently supported. numTunnels: " + numTunnels);
+ return;
+ }
+
+ var clientSupportedTypes = {
+ 'STDVNOAUTH__': 1,
+ 'STDVVNCAUTH_': 2
+ };
+
+ var serverSupportedTypes = [];
+
+ if (ws.rQwait("sub auth count", 4)) { return false; }
+ var subAuthCount = ws.rQshift32();
+ //console.log("Sub auth count: "+subAuthCount);
+ for (var i=0;i<subAuthCount;i++)
+ {
+
+ if (ws.rQwait("sub auth capabilities "+i, 16)) { return false; }
+ var capNum = ws.rQshift32();
+ var capabilities = ws.rQshiftStr(12);
+ //console.log("queue: "+ws.rQlen());
+ //console.log("auth type: "+capNum+": "+capabilities);
+
+ serverSupportedTypes.push(capabilities);
+ }
+
+ for (var authType in clientSupportedTypes)
+ {
+ if (serverSupportedTypes.indexOf(authType) != -1)
+ {
+ //console.log("selected authType "+authType);
+ ws.send([0,0,0,clientSupportedTypes[authType]]);
+
+ switch (authType)
+ {
+ case 'STDVNOAUTH__':
+ // No authentication
+ updateState('SecurityResult');
+ return;
+ case 'STDVVNCAUTH_':
+ // VNC Authentication. Reenter auth handler to complete auth
+ rfb_auth_scheme = 2;
+ init_msg();
+ return;
+ default:
+ fail("Unsupported tiny auth scheme: " + authType);
+ return;
+ }
+ }
+ }
+
+
+ return;
default:
fail("Unsupported auth scheme: " + rfb_auth_scheme);
return;
@@ -857,6 +920,34 @@ init_msg = function() {
conf.true_color = false;
}
+ if (rfb_tightvnc)
+ {
+ // In TightVNC mode, ServerInit message is extended
+ var numServerMessages = ws.rQshift16();
+ var numClientMessages = ws.rQshift16();
+ var numEncodings = ws.rQshift16();
+ ws.rQshift16(); // padding
+ //console.log("numServerMessages "+numServerMessages);
+ //console.log("numClientMessages "+numClientMessages);
+ //console.log("numEncodings "+numEncodings);
+
+ for (var i=0;i<numServerMessages;i++)
+ {
+ var srvMsg = ws.rQshiftStr(16);
+ //console.log("server message: "+srvMsg);
+ }
+ for (var i=0;i<numClientMessages;i++)
+ {
+ var clientMsg = ws.rQshiftStr(16);
+ //console.log("client message: "+clientMsg);
+ }
+ for (var i=0;i<numEncodings;i++)
+ {
+ var encoding = ws.rQshiftStr(16);
+ //console.log("encoding: "+encoding);
+ }
+ }
+
display.set_true_color(conf.true_color);
conf.onFBResize(that, fb_width, fb_height);
display.resize(fb_width, fb_height);