diff --git a/app/ui.js b/app/ui.js index 1aa5f8cc..3ec3648a 100644 --- a/app/ui.js +++ b/app/ui.js @@ -432,7 +432,7 @@ var UI = { UI.inhibit_reconnect = false; UI.doneInitialResize = false; document.documentElement.classList.add("noVNC_connected"); - if (rfb && rfb.get_encrypt()) { + if (UI.getSetting('encrypt')) { msg = _("Connected (encrypted) to ") + UI.desktopName; } else { msg = _("Connected (unencrypted) to ") + UI.desktopName; @@ -1062,14 +1062,23 @@ var UI = { UI.closeAllPanels(); UI.closeConnectPanel(); - UI.rfb.set_encrypt(UI.getSetting('encrypt')); UI.rfb.set_shared(UI.getSetting('shared')); UI.rfb.set_repeaterID(UI.getSetting('repeaterID')); UI.updateLocalCursor(); UI.updateViewOnly(); - UI.rfb.connect(host, port, { password: password }, path); + var url; + + url = UI.getSetting('encrypt') ? 'wss' : 'ws'; + + url += '://' + host; + if(port) { + url += ':' + port; + } + url += '/' + path; + + UI.rfb.connect(url, { password: password }); }, disconnect: function() { diff --git a/core/rfb.js b/core/rfb.js index 4037bf9f..ec413a84 100644 --- a/core/rfb.js +++ b/core/rfb.js @@ -35,10 +35,8 @@ export default function RFB(defaults) { } // Connection details - this._rfb_host = ''; - this._rfb_port = 5900; + this._url = ''; this._rfb_credentials = {}; - this._rfb_path = ''; // Internal state this._rfb_connection_state = ''; @@ -131,7 +129,6 @@ export default function RFB(defaults) { // set the default value on user-facing properties set_defaults(this, defaults, { 'target': 'null', // VNC display rendering Canvas object - 'encrypt': false, // Use TLS/SSL/wss encryption 'local_cursor': false, // Request locally rendered cursor 'shared': true, // Request shared mode 'view_only': false, // Disable client mouse/keyboard @@ -247,15 +244,13 @@ export default function RFB(defaults) { RFB.prototype = { // Public methods - connect: function (host, port, creds, path) { - this._rfb_host = host; - this._rfb_port = port; + connect: function (url, creds) { + this._url = url; this._rfb_credentials = (creds !== undefined) ? creds : {}; - this._rfb_path = (path !== undefined) ? path : ""; - if (!this._rfb_host) { - return this._fail( - _("Must set host")); + if (!url) { + this._fail(_("Must specify URL")); + return; } this._rfb_init_state = ''; @@ -376,24 +371,11 @@ RFB.prototype = { _connect: function () { Log.Debug(">> RFB.connect"); - var uri; - if (typeof UsingSocketIO !== 'undefined') { - uri = 'http'; - } else { - uri = this._encrypt ? 'wss' : 'ws'; - } - - uri += '://' + this._rfb_host; - if(this._rfb_port) { - uri += ':' + this._rfb_port; - } - uri += '/' + this._rfb_path; - - Log.Info("connecting to " + uri); + Log.Info("connecting to " + this._url); try { // WebSocket.onopen transitions to the RFB init states - this._sock.open(uri, this._wsProtocols); + this._sock.open(this._url, this._wsProtocols); } catch (e) { if (e.name === 'SyntaxError') { this._fail("Invalid host or port value given", e); @@ -1464,7 +1446,6 @@ RFB.prototype = { make_properties(RFB, [ ['target', 'wo', 'dom'], // VNC display rendering Canvas object - ['encrypt', 'rw', 'bool'], // Use TLS/SSL/wss encryption ['local_cursor', 'rw', 'bool'], // Request locally rendered cursor ['shared', 'rw', 'bool'], // Request shared mode ['view_only', 'rw', 'bool'], // Disable client mouse/keyboard diff --git a/docs/API.md b/docs/API.md index bec9b173..8617be49 100644 --- a/docs/API.md +++ b/docs/API.md @@ -10,14 +10,14 @@ Each configuration option has a default value, which can be overridden by a a configuration object passed to the constructor. Configuration options can then be read and modified after initialization with "get_*" and "set_*" methods respectively. For example, the following -initializes an RFB object with the 'encrypt' configuration option +initializes an RFB object with the 'view_only' configuration option enabled, then confirms it was set, then disables it: - var rfb = new RFB({'encrypt': true}); - if (rfb.get_encrypt()) { - alert("Encryption is set"); + var rfb = new RFB({'view_only': true}); + if (rfb.get_view_only()) { + alert("View Only is set"); } - rfb.set_encrypt(false); + rfb.set_view_only(false); Some attributes are read-only and cannot be changed. An exception will be thrown if an attempt is made to set one of these attributs. The @@ -30,7 +30,6 @@ attribute mode is one of the following: | name | type | mode | default | description | ----------------- | ----- | ---- | ---------- | ------------ | target | DOM | WO | null | Canvas element for rendering (passed to Display, Mouse and Keyboard) -| encrypt | bool | RW | false | Use TLS/SSL encryption | local_cursor | bool | RW | false | Request locally rendered cursor | shared | bool | RW | true | Request shared VNC mode | view_only | bool | RW | false | Disable client mouse/keyboard @@ -52,7 +51,7 @@ object instance. | name | parameters | description | ------------------ | ------------------------------- | ------------ -| connect | (host, port, credentials, path) | Connect to the given host:port/path. Optional credentials and path. +| connect | (url, credentials) | Connect to the given URL. Optional credentials. | disconnect | () | Disconnect | sendCredentials | (credentials) | Send credentials after onCredentialsRequired callback | sendCtrlAltDel | () | Send Ctrl-Alt-Del key sequence diff --git a/tests/playback.js b/tests/playback.js index ac36ee42..ffb4859b 100644 --- a/tests/playback.js +++ b/tests/playback.js @@ -93,7 +93,7 @@ RecordingPlayer.prototype = { this._running = true; // launch the tests - this._rfb.connect('test', 0, 'bogus'); + this._rfb.connect('wss://test'); this._queueNextPacket(); }, @@ -104,11 +104,9 @@ RecordingPlayer.prototype = { this._rfb._sock.close = function () {}; this._rfb._sock.flush = function () {}; this._rfb._checkEvents = function () {}; - this._rfb.connect = function (host, port, credentials, path) { - this._rfb_host = host; - this._rfb_port = port; + this._rfb.connect = function (url) { + this._url = url; this._rfb_credentials = {}; - this._rfb_path = (path !== undefined) ? path : ""; this._sock.init('binary', 'ws'); this._rfb_connection_state = 'connecting'; this._rfb_init_state = 'ProtocolVersion'; diff --git a/tests/test.rfb.js b/tests/test.rfb.js index f6112b93..51720663 100644 --- a/tests/test.rfb.js +++ b/tests/test.rfb.js @@ -73,15 +73,15 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { client._updateConnectionState = sinon.spy(); }); it('should set the current state to "connecting"', function () { - client.connect('host', 8675); + client.connect('wss://host:8675'); expect(client._updateConnectionState).to.have.been.calledOnce; expect(client._updateConnectionState).to.have.been.calledWith('connecting'); }); - it('should not try to connect if we are missing a host', function () { + it('should not try to connect if we are missing a URL', function () { client._fail = sinon.spy(); client._rfb_connection_state = ''; - client.connect(undefined, 8675); + client.connect(undefined); expect(client._fail).to.have.been.calledOnce; expect(client._updateConnectionState).to.not.have.been.called; expect(client._rfb_connection_state).to.equal(''); @@ -347,7 +347,6 @@ describe('Remote Frame Buffer Protocol Client', function() { client.set_onUpdateState(sinon.spy()); client._updateConnectionState('connecting'); var spy = client.get_onUpdateState(); - expect(spy).to.have.been.calledOnce; expect(spy.args[0][1]).to.equal('connecting'); }); @@ -386,7 +385,7 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { this.clock = sinon.useFakeTimers(); client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); }); afterEach(function () { @@ -465,36 +464,12 @@ describe('Remote Frame Buffer Protocol Client', function() { expect(client._sock.open).to.have.been.calledOnce; }); - it('should use wss:// to connect if encryption is enabled', function () { + it('should use a url specified to connect', function () { sinon.spy(client._sock, 'open'); - client.set_encrypt(true); - client._updateConnectionState('connecting'); - expect(client._sock.open.args[0][0]).to.contain('wss://'); - }); - - it('should use ws:// to connect if encryption is not enabled', function () { - sinon.spy(client._sock, 'open'); - client.set_encrypt(true); - client._updateConnectionState('connecting'); - expect(client._sock.open.args[0][0]).to.contain('wss://'); - }); - - it('should use a uri with the host, port, and path specified to connect', function () { - sinon.spy(client._sock, 'open'); - client.set_encrypt(false); - client._rfb_host = 'HOST'; - client._rfb_port = 8675; - client._rfb_path = 'PATH'; + client._url = 'ws://HOST:8675/PATH'; client._updateConnectionState('connecting'); expect(client._sock.open).to.have.been.calledWith('ws://HOST:8675/PATH'); }); - - it('should not include a port in the uri if not specified in connect', function () { - sinon.spy(client._sock, 'open'); - client.set_encrypt(true); - client.connect('HOST', undefined) - expect(client._sock.open).to.have.been.calledWith('wss://HOST/'); - }); }); describe('disconnecting', function () { @@ -502,7 +477,7 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { this.clock = sinon.useFakeTimers(); client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); }); afterEach(function () { @@ -603,7 +578,7 @@ describe('Remote Frame Buffer Protocol Client', function() { var client; beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); }); @@ -666,7 +641,7 @@ describe('Remote Frame Buffer Protocol Client', function() { var client; beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); }); @@ -706,7 +681,7 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); client._rfb_init_state = 'Security'; }); @@ -770,7 +745,7 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); client._rfb_init_state = 'Security'; }); @@ -819,7 +794,7 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); client._rfb_init_state = 'Security'; client._rfb_version = 3.8; @@ -869,7 +844,7 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); client._rfb_init_state = 'Security'; client._rfb_version = 3.8; @@ -926,7 +901,7 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); client._rfb_init_state = 'Security'; client._rfb_version = 3.8; @@ -1016,7 +991,7 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); client._rfb_init_state = 'SecurityResult'; }); @@ -1049,7 +1024,7 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); client._rfb_init_state = 'SecurityResult'; }); @@ -1077,7 +1052,7 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); client._rfb_init_state = 'ServerInitialisation'; }); @@ -1233,7 +1208,7 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); client._rfb_connection_state = 'connected'; client._fb_name = 'some device'; @@ -1353,7 +1328,7 @@ describe('Remote Frame Buffer Protocol Client', function() { beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); client._rfb_connection_state = 'connected'; client._fb_name = 'some device'; @@ -1439,7 +1414,7 @@ describe('Remote Frame Buffer Protocol Client', function() { var client; beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); client._sock._websocket._open(); client._rfb_connection_state = 'connected'; client._fb_name = 'some device'; @@ -1997,7 +1972,7 @@ describe('Remote Frame Buffer Protocol Client', function() { var client; beforeEach(function () { client = make_rfb(); - client.connect('host', 8675); + client.connect('wss://host:8675'); this.clock = sinon.useFakeTimers(); }); diff --git a/vnc_lite.html b/vnc_lite.html index f1bf6f37..c91f564f 100644 --- a/vnc_lite.html +++ b/vnc_lite.html @@ -156,7 +156,8 @@ break; case 'connected': doneInitialResize = false; - if (rfb && rfb.get_encrypt()) { + if (WebUtil.getConfigVar('encrypt', + (window.location.protocol === "https:"))) { status("Connected (encrypted) to " + desktopName, "normal"); } else { @@ -256,8 +257,6 @@ try { rfb = new RFB({'target': document.getElementById('noVNC_canvas'), - 'encrypt': WebUtil.getConfigVar('encrypt', - (window.location.protocol === "https:")), 'repeaterID': WebUtil.getConfigVar('repeaterID', ''), 'local_cursor': WebUtil.getConfigVar('cursor', true), 'shared': WebUtil.getConfigVar('shared', true), @@ -273,7 +272,22 @@ return; // don't continue trying to connect } - rfb.connect(host, port, { password: password }, path); + var url; + + if (WebUtil.getConfigVar('encrypt', + (window.location.protocol === "https:"))) { + url = 'wss'; + } else { + url = 'ws'; + } + + url += '://' + host; + if(port) { + url += ':' + port; + } + url += '/' + path; + + rfb.connect(url, { password: password }); })();