]> git.proxmox.com Git - mirror_novnc.git/commitdiff
Work around Siemens touch panel authentication bug
authorPierre Ossman <ossman@cendio.se>
Thu, 7 Jun 2018 13:03:34 +0000 (15:03 +0200)
committerPierre Ossman <ossman@cendio.se>
Thu, 7 Jun 2018 13:03:34 +0000 (15:03 +0200)
Siemens' touch panels support Tight authentication as well as NOTUNNEL,
but they fail to advertise the latter. Work around this issue by detecting
a Siemens device (through their custom tunnel types) and assume NOTUNNEL
support even if not advertised.

core/rfb.js
tests/test.rfb.js

index 2f4e81550c848a7c73c6205ec2f305399200dec4..3150082903953c3da2d5f8f65edb12671e083c24 100644 (file)
@@ -1008,6 +1008,16 @@ RFB.prototype = {
 
         Log.Debug("Server Tight tunnel types: " + serverSupportedTunnelTypes);
 
+        // Siemens touch panels have a VNC server that supports NOTUNNEL,
+        // but forgets to advertise it. Try to detect such servers by
+        // looking for their custom tunnel type.
+        if (serverSupportedTunnelTypes[1] &&
+            (serverSupportedTunnelTypes[1].vendor === "SICR") &&
+            (serverSupportedTunnelTypes[1].signature === "SCHANNEL")) {
+            Log.Debug("Detected Siemens server. Assuming NOTUNNEL support.");
+            serverSupportedTunnelTypes[0] = { vendor: 'TGHT', signature: 'NOTUNNEL' };
+        }
+
         // choose the notunnel type
         if (serverSupportedTunnelTypes[0]) {
             if (serverSupportedTunnelTypes[0].vendor != clientSupportedTunnelTypes[0].vendor ||
index 21cfc359998b29121d9a75ce0cb547d195d9f088..0ebad9c61a48d5acc9a651a0a3e76e26825c5ccd 100644 (file)
@@ -1272,6 +1272,11 @@ describe('Remote Frame Buffer Protocol Client', function() {
                     expect(client._sock).to.have.sent(new Uint8Array([0, 0, 0, 0]));
                 });
 
+                it('should choose the notunnel tunnel type for Siemens devices', function () {
+                    send_num_str_pairs([[1, 'SICR', 'SCHANNEL'], [2, 'SICR', 'SCHANLPW']], client);
+                    expect(client._sock).to.have.sent(new Uint8Array([0, 0, 0, 0]));
+                });
+
                 it('should continue to sub-auth negotiation after tunnel negotiation', function () {
                     send_num_str_pairs([[0, 'TGHT', 'NOTUNNEL']], client);
                     client._sock._websocket._get_sent_data();  // skip the tunnel choice here