Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: remoting/webapp/client_session.js

Issue 12867004: Webapp changes to support asking for a PIN (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @fileoverview 6 * @fileoverview
7 * Class handling creation and teardown of a remoting client session. 7 * Class handling creation and teardown of a remoting client session.
8 * 8 *
9 * The ClientSession class controls lifetime of the client plugin 9 * The ClientSession class controls lifetime of the client plugin
10 * object and provides the plugin with the functionality it needs to 10 * object and provides the plugin with the functionality it needs to
11 * establish connection. Specifically it: 11 * establish connection. Specifically it:
12 * - Delivers incoming/outgoing signaling messages, 12 * - Delivers incoming/outgoing signaling messages,
13 * - Adjusts plugin size and position when destop resolution changes, 13 * - Adjusts plugin size and position when destop resolution changes,
14 * 14 *
15 * This class should not access the plugin directly, instead it should 15 * This class should not access the plugin directly, instead it should
16 * do it through ClientPlugin class which abstracts plugin version 16 * do it through ClientPlugin class which abstracts plugin version
17 * differences. 17 * differences.
18 */ 18 */
19 19
20 'use strict'; 20 'use strict';
21 21
22 /** @suppress {duplicate} */ 22 /** @suppress {duplicate} */
23 var remoting = remoting || {}; 23 var remoting = remoting || {};
24 24
25 /** 25 /**
26 * @param {string} hostJid The jid of the host to connect to. 26 * @param {string} hostJid The jid of the host to connect to.
27 * @param {string} clientJid The jid of the WCS client. 27 * @param {string} clientJid The jid of the WCS client.
28 * @param {string} hostPublicKey The base64 encoded version of the host's 28 * @param {string} hostPublicKey The base64 encoded version of the host's
29 * public key. 29 * public key.
30 * @param {string} sharedSecret The access code for IT2Me or the PIN 30 * @param {string} passPhrase The pre-determined pass phrase for connection.
Jamie 2013/03/18 20:28:23 I think it's worth keeping the style of the origin
rmsousa 2013/03/18 21:58:01 Done.
31 * for Me2Me. 31 * @param {function(function(string): void): void} fetchPin Called
32 * when a PIN needs to be obtained interactively.
Jamie 2013/03/18 20:28:23 I think we should be consistent with referring to
rmsousa 2013/03/18 21:58:01 I tried to differentiate between a user-generated
32 * @param {string} authenticationMethods Comma-separated list of 33 * @param {string} authenticationMethods Comma-separated list of
33 * authentication methods the client should attempt to use. 34 * authentication methods the client should attempt to use.
34 * @param {string} hostId The host identifier for Me2Me, or empty for IT2Me. 35 * @param {string} hostId The host identifier for Me2Me, or empty for IT2Me.
35 * Mixed into authentication hashes for some authentication methods. 36 * Mixed into authentication hashes for some authentication methods.
36 * @param {remoting.ClientSession.Mode} mode The mode of this connection. 37 * @param {remoting.ClientSession.Mode} mode The mode of this connection.
37 * @constructor 38 * @constructor
38 */ 39 */
39 remoting.ClientSession = function(hostJid, clientJid, 40 remoting.ClientSession = function(hostJid, clientJid,
40 hostPublicKey, sharedSecret, 41 hostPublicKey, passPhrase,
42 fetchPin,
Jamie 2013/03/18 20:28:23 Nit: I'm not sure what the intended line-break sch
rmsousa 2013/03/18 21:58:01 Done.
41 authenticationMethods, hostId, mode) { 43 authenticationMethods, hostId, mode) {
42 this.state = remoting.ClientSession.State.CREATED; 44 this.state = remoting.ClientSession.State.CREATED;
43 45
44 this.hostJid = hostJid; 46 this.hostJid = hostJid;
45 this.clientJid = clientJid; 47 this.clientJid = clientJid;
46 this.hostPublicKey = hostPublicKey; 48 this.hostPublicKey = hostPublicKey;
47 this.sharedSecret = sharedSecret; 49 this.passPhrase_ = passPhrase;
50 this.fetchPin_ = fetchPin;
Jamie 2013/03/18 20:28:23 Please add @private annotations to these members.
rmsousa 2013/03/18 21:58:01 Done.
48 this.authenticationMethods = authenticationMethods; 51 this.authenticationMethods = authenticationMethods;
49 this.hostId = hostId; 52 this.hostId = hostId;
50 /** @type {remoting.ClientSession.Mode} */ 53 /** @type {remoting.ClientSession.Mode} */
51 this.mode = mode; 54 this.mode = mode;
52 this.sessionId = ''; 55 this.sessionId = '';
53 /** @type {remoting.ClientPlugin} */ 56 /** @type {remoting.ClientPlugin} */
54 this.plugin = null; 57 this.plugin = null;
55 /** @private */ 58 /** @private */
56 this.shrinkToFit_ = true; 59 this.shrinkToFit_ = true;
57 /** @private */ 60 /** @private */
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 this.resizeToClient_ = /** @type {boolean} */ 286 this.resizeToClient_ = /** @type {boolean} */
284 options[remoting.ClientSession.KEY_RESIZE_TO_CLIENT]; 287 options[remoting.ClientSession.KEY_RESIZE_TO_CLIENT];
285 } 288 }
286 if (remoting.ClientSession.KEY_SHRINK_TO_FIT in options && 289 if (remoting.ClientSession.KEY_SHRINK_TO_FIT in options &&
287 typeof(options[remoting.ClientSession.KEY_SHRINK_TO_FIT]) == 290 typeof(options[remoting.ClientSession.KEY_SHRINK_TO_FIT]) ==
288 'boolean') { 291 'boolean') {
289 this.shrinkToFit_ = /** @type {boolean} */ 292 this.shrinkToFit_ = /** @type {boolean} */
290 options[remoting.ClientSession.KEY_SHRINK_TO_FIT]; 293 options[remoting.ClientSession.KEY_SHRINK_TO_FIT];
291 } 294 }
292 295
293 this.plugin.element().focus();
294
295 /** @param {boolean} result */ 296 /** @param {boolean} result */
296 this.plugin.initialize(this.onPluginInitialized_.bind(this)); 297 this.plugin.initialize(this.onPluginInitialized_.bind(this));
298 };
299
300 /**
301 * Constrains the focus to the plugin element.
Jamie 2013/03/18 20:28:23 Add @private
rmsousa 2013/03/18 21:58:01 Done.
302 */
303 remoting.ClientSession.prototype.setFocusHandlers_ = function() {
297 this.plugin.element().addEventListener( 304 this.plugin.element().addEventListener(
298 'focus', this.callPluginGotFocus_, false); 305 'focus', this.callPluginGotFocus_, false);
299 this.plugin.element().addEventListener( 306 this.plugin.element().addEventListener(
300 'blur', this.callPluginLostFocus_, false); 307 'blur', this.callPluginLostFocus_, false);
308 this.plugin.element().focus();
301 }; 309 };
302 310
303 /** 311 /**
304 * @param {boolean} initialized 312 * @param {boolean} initialized
305 */ 313 */
306 remoting.ClientSession.prototype.onPluginInitialized_ = function(initialized) { 314 remoting.ClientSession.prototype.onPluginInitialized_ = function(initialized) {
307 if (!initialized) { 315 if (!initialized) {
308 console.error('ERROR: remoting plugin not loaded'); 316 console.error('ERROR: remoting plugin not loaded');
309 this.plugin.cleanup(); 317 this.plugin.cleanup();
310 delete this.plugin; 318 delete this.plugin;
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 }; 589 };
582 590
583 /** 591 /**
584 * Connects the plugin to WCS. 592 * Connects the plugin to WCS.
585 * 593 *
586 * @private 594 * @private
587 * @return {void} Nothing. 595 * @return {void} Nothing.
588 */ 596 */
589 remoting.ClientSession.prototype.connectPluginToWcs_ = function() { 597 remoting.ClientSession.prototype.connectPluginToWcs_ = function() {
590 remoting.formatIq.setJids(this.clientJid, this.hostJid); 598 remoting.formatIq.setJids(this.clientJid, this.hostJid);
599 /** @type remoting.ClientPlugin */
Jamie 2013/03/18 20:28:23 Brackets around the type, please.
rmsousa 2013/03/18 21:58:01 Done.
591 var plugin = this.plugin; 600 var plugin = this.plugin;
592 var forwardIq = plugin.onIncomingIq.bind(plugin); 601 var forwardIq = plugin.onIncomingIq.bind(plugin);
593 /** @param {string} stanza The IQ stanza received. */ 602 /** @param {string} stanza The IQ stanza received. */
594 var onIncomingIq = function(stanza) { 603 var onIncomingIq = function(stanza) {
595 // HACK: Remove 'x' prefix added to the id in sendIq_(). 604 // HACK: Remove 'x' prefix added to the id in sendIq_().
596 try { 605 try {
597 var parser = new DOMParser(); 606 var parser = new DOMParser();
598 var iqNode = parser.parseFromString(stanza, 'text/xml').firstChild; 607 var iqNode = parser.parseFromString(stanza, 'text/xml').firstChild;
599 var type = iqNode.getAttribute('type'); 608 var type = iqNode.getAttribute('type');
600 var id = iqNode.getAttribute('id'); 609 var id = iqNode.getAttribute('id');
601 if (type != 'set' && id.charAt(0) == 'x') { 610 if (type != 'set' && id.charAt(0) == 'x') {
602 iqNode.setAttribute('id', id.substr(1)); 611 iqNode.setAttribute('id', id.substr(1));
603 stanza = (new XMLSerializer()).serializeToString(iqNode); 612 stanza = (new XMLSerializer()).serializeToString(iqNode);
604 } 613 }
605 } catch (err) { 614 } catch (err) {
606 // Pass message as is when it is malformed. 615 // Pass message as is when it is malformed.
607 } 616 }
608 617
609 console.log(remoting.timestamp(), 618 console.log(remoting.timestamp(),
610 remoting.formatIq.prettifyReceiveIq(stanza)); 619 remoting.formatIq.prettifyReceiveIq(stanza));
611 forwardIq(stanza); 620 forwardIq(stanza);
612 } 621 }
613 remoting.wcsSandbox.setOnIq(onIncomingIq); 622 remoting.wcsSandbox.setOnIq(onIncomingIq);
Jamie 2013/03/18 20:28:23 Blank line here, please.
rmsousa 2013/03/18 21:58:01 Done.
623 // Pass phrase was already supplied before connecting (It2Me case).
Jamie 2013/03/18 20:28:23 Can you move this comment inside the if, for consi
rmsousa 2013/03/18 21:58:01 Done.
624 if (this.passPhrase_) {
625 this.connectToHost_(this.passPhrase_);
626 } else if (plugin.hasFeature(
627 remoting.ClientPlugin.Feature.USE_ASYNC_PIN_DIALOG)) {
628 // Plugin supports asynchronously asking for passphrase.
629 plugin.useAsyncPinDialog();
630 /** @type remoting.ClientSession */
631 var that = this;
632 var fetchPin = function() {
633 that.fetchPin_(plugin.onPinFetched.bind(plugin));
634 };
635 plugin.fetchPinHandler = fetchPin;
636 this.connectToHost_('');
637 } else {
638 // Plugin doesn't support asynchronously asking for passphrase, ask now.
639 this.fetchPin_(this.connectToHost_.bind(this));
640 }
641 };
642
643 /**
644 * Connects to the host.
645 *
646 * @private
Jamie 2013/03/18 20:28:23 Nit: We're pretty consistent about @private being
rmsousa 2013/03/18 21:58:01 Done.
647 * @param {string} sharedSecret Shared secret for SPAKE negotiation.
648 * @return {void} Nothing.
649 */
650 remoting.ClientSession.prototype.connectToHost_ = function(sharedSecret) {
614 this.plugin.connect(this.hostJid, this.hostPublicKey, this.clientJid, 651 this.plugin.connect(this.hostJid, this.hostPublicKey, this.clientJid,
615 this.sharedSecret, this.authenticationMethods, 652 sharedSecret, this.authenticationMethods,
616 this.hostId); 653 this.hostId);
617 }; 654 };
618 655
619 /** 656 /**
620 * Callback that the plugin invokes to indicate that the connection 657 * Callback that the plugin invokes to indicate that the connection
621 * status has changed. 658 * status has changed.
622 * 659 *
623 * @private 660 * @private
624 * @param {number} status The plugin's status. 661 * @param {number} status The plugin's status.
625 * @param {number} error The plugin's error state, if any. 662 * @param {number} error The plugin's error state, if any.
626 */ 663 */
627 remoting.ClientSession.prototype.onConnectionStatusUpdate_ = 664 remoting.ClientSession.prototype.onConnectionStatusUpdate_ =
628 function(status, error) { 665 function(status, error) {
629 if (status == remoting.ClientSession.State.CONNECTED) { 666 if (status == remoting.ClientSession.State.CONNECTED) {
667 this.setFocusHandlers_();
630 this.onDesktopSizeChanged_(); 668 this.onDesktopSizeChanged_();
631 if (this.resizeToClient_) { 669 if (this.resizeToClient_) {
632 this.plugin.notifyClientResolution(window.innerWidth, 670 this.plugin.notifyClientResolution(window.innerWidth,
633 window.innerHeight, 671 window.innerHeight,
634 window.devicePixelRatio); 672 window.devicePixelRatio);
635 } 673 }
636 } else if (status == remoting.ClientSession.State.FAILED) { 674 } else if (status == remoting.ClientSession.State.FAILED) {
637 this.error_ = /** @type {remoting.ClientSession.ConnectionError} */ (error); 675 this.error_ = /** @type {remoting.ClientSession.ConnectionError} */ (error);
638 } 676 }
639 this.setState_(/** @type {remoting.ClientSession.State} */ (status)); 677 this.setState_(/** @type {remoting.ClientSession.State} */ (status));
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
1021 var lateAdjustment = 1 + (now - expected) / timeout; 1059 var lateAdjustment = 1 + (now - expected) / timeout;
1022 if (!that.scroll_(lateAdjustment * dx, lateAdjustment * dy)) { 1060 if (!that.scroll_(lateAdjustment * dx, lateAdjustment * dy)) {
1023 that.bumpScrollTimer_ = window.setTimeout( 1061 that.bumpScrollTimer_ = window.setTimeout(
1024 function() { repeatScroll(now + timeout); }, 1062 function() { repeatScroll(now + timeout); },
1025 timeout); 1063 timeout);
1026 } 1064 }
1027 }; 1065 };
1028 repeatScroll(new Date().getTime()); 1066 repeatScroll(new Date().getTime());
1029 } 1067 }
1030 }; 1068 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698