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

Side by Side Diff: remoting/webapp/crd/js/session_connector_impl.js

Issue 984793003: [Webapp Refactor] Remove It2Me connection code from SessionConnectorImpl. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 * Connect set-up state machine for Me2Me and IT2Me 7 * Connect set-up state machine for Me2Me and IT2Me
8 */ 8 */
9 9
10 'use strict'; 10 'use strict';
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 */ 70 */
71 this.requiredCapabilities_ = requiredCapabilities; 71 this.requiredCapabilities_ = requiredCapabilities;
72 72
73 /** 73 /**
74 * @type {string} 74 * @type {string}
75 * @private 75 * @private
76 */ 76 */
77 this.defaultRemapKeys_ = defaultRemapKeys; 77 this.defaultRemapKeys_ = defaultRemapKeys;
78 78
79 /** 79 /**
80 * @type {string}
81 * @private
82 */
83 this.clientJid_ = '';
84
85 /**
86 * @type {remoting.DesktopConnectedView.Mode} 80 * @type {remoting.DesktopConnectedView.Mode}
87 * @private 81 * @private
88 */ 82 */
89 this.connectionMode_ = remoting.DesktopConnectedView.Mode.ME2ME; 83 this.connectionMode_ = remoting.DesktopConnectedView.Mode.ME2ME;
90 84
91 /** 85 /**
92 * @type {remoting.SignalStrategy} 86 * @type {remoting.SignalStrategy}
93 * @private 87 * @private
94 */ 88 */
95 this.signalStrategy_ = null; 89 this.signalStrategy_ = null;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 */ 122 */
129 this.logHostOfflineErrors_ = false; 123 this.logHostOfflineErrors_ = false;
130 124
131 /** 125 /**
132 * @type {remoting.ClientSession} 126 * @type {remoting.ClientSession}
133 * @private 127 * @private
134 */ 128 */
135 this.clientSession_ = null; 129 this.clientSession_ = null;
136 130
137 /** 131 /**
138 * @type {XMLHttpRequest}
139 * @private
140 */
141 this.pendingXhr_ = null;
142
143 /**
144 * @type {remoting.CredentialsProvider} 132 * @type {remoting.CredentialsProvider}
145 * @private 133 * @private
146 */ 134 */
147 this.credentialsProvider_ = null; 135 this.credentialsProvider_ = null;
148 }; 136 };
149 137
150 /** 138 /**
151 * Initiate a Me2Me connection. 139 * Initiate a Me2Me connection.
152 * 140 *
153 * This doesn't report host-offline errors because the connection will 141 * This doesn't report host-offline errors because the connection will
154 * be retried and retryConnectMe2Me is responsible for reporting these errors. 142 * be retried and retryConnectMe2Me is responsible for reporting these errors.
155 * 143 *
156 * @param {remoting.Host} host The Me2Me host to which to connect. 144 * @param {remoting.Host} host The Me2Me host to which to connect.
157 * @param {function(boolean, function(string):void):void} fetchPin Function to 145 * @param {function(boolean, function(string):void):void} fetchPin Function to
158 * interactively obtain the PIN from the user. 146 * interactively obtain the PIN from the user.
159 * @param {string} clientPairingId The client id issued by the host when 147 * @param {string} clientPairingId The client id issued by the host when
160 * this device was paired, if it is already paired. 148 * this device was paired, if it is already paired.
161 * @param {string} clientPairedSecret The shared secret issued by the host when 149 * @param {string} clientPairedSecret The shared secret issued by the host when
162 * this device was paired, if it is already paired. 150 * this device was paired, if it is already paired.
163 * @return {void} Nothing. 151 * @return {void} Nothing.
164 */ 152 */
165 remoting.SessionConnectorImpl.prototype.connectMe2Me = 153 remoting.SessionConnectorImpl.prototype.connectMe2Me =
166 function(host, fetchPin, fetchThirdPartyToken, 154 function(host, fetchPin, fetchThirdPartyToken,
167 clientPairingId, clientPairedSecret) { 155 clientPairingId, clientPairedSecret) {
168 this.connectionMode_ = remoting.DesktopConnectedView.Mode.ME2ME;
169 this.logHostOfflineErrors_ = false; 156 this.logHostOfflineErrors_ = false;
170 var credentialsProvider = new remoting.CredentialsProvider({ 157 var credentialsProvider = new remoting.CredentialsProvider({
171 fetchPin: fetchPin, 158 fetchPin: fetchPin,
172 pairingInfo: { id: clientPairingId, secret: clientPairedSecret }, 159 pairingInfo: { id: clientPairingId, secret: clientPairedSecret },
173 fetchThirdPartyToken: fetchThirdPartyToken 160 fetchThirdPartyToken: fetchThirdPartyToken
174 }); 161 });
175 this.connectInternal_(host, credentialsProvider); 162 this.connect(
163 remoting.DesktopConnectedView.Mode.ME2ME, host, credentialsProvider);
176 }; 164 };
177 165
178 /** 166 /**
179 * Retry connecting to a Me2Me host after a connection failure. 167 * Retry connecting to a Me2Me host after a connection failure.
180 * 168 *
181 * This is the same as connectMe2Me except that is will log errors if the 169 * This is the same as connectMe2Me except that is will log errors if the
182 * host is offline. 170 * host is offline.
183 * 171 *
184 * @param {remoting.Host} host The Me2Me host to refresh. 172 * @param {remoting.Host} host The Me2Me host to refresh.
185 * @return {void} Nothing. 173 * @return {void} Nothing.
186 */ 174 */
187 remoting.SessionConnectorImpl.prototype.retryConnectMe2Me = function(host) { 175 remoting.SessionConnectorImpl.prototype.retryConnectMe2Me = function(host) {
188 this.connectionMode_ = remoting.DesktopConnectedView.Mode.ME2ME;
189 this.logHostOfflineErrors_ = true; 176 this.logHostOfflineErrors_ = true;
190 this.connectInternal_(host, this.credentialsProvider_); 177 this.connect(remoting.DesktopConnectedView.Mode.ME2ME, host,
178 this.credentialsProvider_);
191 }; 179 };
192 180
193 /** 181 /**
194 * Initiate a Me2App connection. 182 * Initiate a Me2App connection.
195 * 183 *
196 * @param {remoting.Host} host The Me2Me host to which to connect. 184 * @param {remoting.Host} host The Me2Me host to which to connect.
197 * @param {function(string, string, string, 185 * @param {function(string, string, string,
198 * function(string, string): void): void} 186 * function(string, string): void): void}
199 * fetchThirdPartyToken Function to obtain a token from a third party 187 * fetchThirdPartyToken Function to obtain a token from a third party
200 * authenticaiton server. 188 * authenticaiton server.
201 * @return {void} Nothing. 189 * @return {void} Nothing.
202 */ 190 */
203 remoting.SessionConnectorImpl.prototype.connectMe2App = 191 remoting.SessionConnectorImpl.prototype.connectMe2App =
204 function(host, fetchThirdPartyToken) { 192 function(host, fetchThirdPartyToken) {
205 this.connectionMode_ = remoting.DesktopConnectedView.Mode.APP_REMOTING;
206 this.logHostOfflineErrors_ = true; 193 this.logHostOfflineErrors_ = true;
207 var credentialsProvider = new remoting.CredentialsProvider({ 194 var credentialsProvider = new remoting.CredentialsProvider({
208 fetchThirdPartyToken : fetchThirdPartyToken 195 fetchThirdPartyToken : fetchThirdPartyToken
209 }); 196 });
210 this.connectInternal_(host, credentialsProvider); 197 this.connect(
198 remoting.DesktopConnectedView.Mode.APP_REMOTING, host,
199 credentialsProvider);
211 }; 200 };
212 201
213 /** 202 /**
214 * Update the pairing info so that the reconnect function will work correctly. 203 * Update the pairing info so that the reconnect function will work correctly.
215 * 204 *
216 * @param {string} clientId The paired client id. 205 * @param {string} clientId The paired client id.
217 * @param {string} sharedSecret The shared secret. 206 * @param {string} sharedSecret The shared secret.
218 */ 207 */
219 remoting.SessionConnectorImpl.prototype.updatePairingInfo = 208 remoting.SessionConnectorImpl.prototype.updatePairingInfo =
220 function(clientId, sharedSecret) { 209 function(clientId, sharedSecret) {
221 var pairingInfo = this.credentialsProvider_.getPairingInfo(); 210 var pairingInfo = this.credentialsProvider_.getPairingInfo();
222 pairingInfo.id = clientId; 211 pairingInfo.id = clientId;
223 pairingInfo.secret = sharedSecret; 212 pairingInfo.secret = sharedSecret;
224 }; 213 };
225 214
226 /** 215 /**
227 * Initiates a connection. 216 * Initiates a connection.
228 * 217 *
218 * @param {remoting.DesktopConnectedView.Mode} mode
229 * @param {remoting.Host} host the Host to connect to. 219 * @param {remoting.Host} host the Host to connect to.
230 * @param {remoting.CredentialsProvider} credentialsProvider 220 * @param {remoting.CredentialsProvider} credentialsProvider
231 * @return {void} Nothing. 221 * @return {void} Nothing.
232 * @private 222 * @private
233 */ 223 */
234 remoting.SessionConnectorImpl.prototype.connectInternal_ = 224 remoting.SessionConnectorImpl.prototype.connect =
235 function(host, credentialsProvider) { 225 function(mode, host, credentialsProvider) {
236 // Cancel any existing connect operation. 226 // Cancel any existing connect operation.
237 this.cancel(); 227 this.cancel();
238 228 this.connectionMode_ = mode;
239 this.host_ = host; 229 this.host_ = host;
240 this.credentialsProvider_ = credentialsProvider; 230 this.credentialsProvider_ = credentialsProvider;
241 this.connectSignaling_(); 231 this.connectSignaling_();
242 }; 232 };
243 233
244 /** 234 /**
245 * Initiate an IT2Me connection.
246 *
247 * @param {string} accessCode The access code as entered by the user.
248 * @return {void} Nothing.
249 */
250 remoting.SessionConnectorImpl.prototype.connectIT2Me = function(accessCode) {
kelvinp 2015/03/06 01:58:20 Moved to It2MeConnectFlow()
251 var kSupportIdLen = 7;
252 var kHostSecretLen = 5;
253 var kAccessCodeLen = kSupportIdLen + kHostSecretLen;
254
255 // Cancel any existing connect operation.
256 this.cancel();
257
258 var normalizedAccessCode = this.normalizeAccessCode_(accessCode);
259 if (normalizedAccessCode.length != kAccessCodeLen) {
260 this.onError_(remoting.Error.INVALID_ACCESS_CODE);
261 return;
262 }
263 var hostId = normalizedAccessCode.substring(0, kSupportIdLen);
264 this.credentialsProvider_ = new remoting.CredentialsProvider({
265 accessCode: normalizedAccessCode
266 });
267 this.connectionMode_ = remoting.DesktopConnectedView.Mode.IT2ME;
268 remoting.identity.getToken().then(
269 this.connectIT2MeWithToken_.bind(this, hostId),
270 remoting.Error.handler(this.onError_));
271 };
272
273 /**
274 * Reconnect a closed connection. 235 * Reconnect a closed connection.
275 * 236 *
276 * @return {void} Nothing. 237 * @return {void} Nothing.
277 */ 238 */
278 remoting.SessionConnectorImpl.prototype.reconnect = function() { 239 remoting.SessionConnectorImpl.prototype.reconnect = function() {
279 if (this.connectionMode_ == remoting.DesktopConnectedView.Mode.IT2ME) { 240 if (this.connectionMode_ == remoting.DesktopConnectedView.Mode.IT2ME) {
280 console.error('reconnect not supported for IT2Me.'); 241 console.error('reconnect not supported for IT2Me.');
281 return; 242 return;
282 } 243 }
283 this.logHostOfflineErrors_ = false; 244 this.logHostOfflineErrors_ = false;
284 this.connectInternal_(this.host_, this.credentialsProvider_); 245 this.connect(this.connectionMode_, this.host_, this.credentialsProvider_);
285 }; 246 };
286 247
287 /** 248 /**
288 * Cancel a connection-in-progress. 249 * Cancel a connection-in-progress.
289 */ 250 */
290 remoting.SessionConnectorImpl.prototype.cancel = function() { 251 remoting.SessionConnectorImpl.prototype.cancel = function() {
291 if (this.clientSession_) { 252 if (this.clientSession_) {
292 this.clientSession_.removePlugin(); 253 this.clientSession_.removePlugin();
293 this.clientSession_ = null; 254 this.clientSession_ = null;
294 } 255 }
295 if (this.pendingXhr_) {
296 this.pendingXhr_.abort();
297 this.pendingXhr_ = null;
298 }
299 this.reset(); 256 this.reset();
300 }; 257 };
301 258
302 /** 259 /**
303 * Get the connection mode (Me2Me or IT2Me) 260 * Get the connection mode (Me2Me or IT2Me)
304 * 261 *
305 * @return {remoting.DesktopConnectedView.Mode} 262 * @return {remoting.DesktopConnectedView.Mode}
306 */ 263 */
307 remoting.SessionConnectorImpl.prototype.getConnectionMode = function() { 264 remoting.SessionConnectorImpl.prototype.getConnectionMode = function() {
308 return this.connectionMode_; 265 return this.connectionMode_;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 } 327 }
371 break; 328 break;
372 329
373 case remoting.SignalStrategy.State.FAILED: 330 case remoting.SignalStrategy.State.FAILED:
374 this.onError_(this.signalStrategy_.getError()); 331 this.onError_(this.signalStrategy_.getError());
375 break; 332 break;
376 } 333 }
377 }; 334 };
378 335
379 /** 336 /**
380 * Continue an IT2Me connection once an access token has been obtained.
381 *
382 * @param {string} hostId
383 * @param {string} token An OAuth2 access token.
384 * @return {void} Nothing.
385 * @private
386 */
387 remoting.SessionConnectorImpl.prototype.connectIT2MeWithToken_ =
kelvinp 2015/03/06 01:58:20 Moved to It2MeConnectFlow()
388 function(hostId, token) {
389 // Resolve the host id to get the host JID.
390 this.pendingXhr_ = remoting.xhr.start({
391 method: 'GET',
392 url: remoting.settings.DIRECTORY_API_BASE_URL + '/support-hosts/' +
393 encodeURIComponent(hostId),
394 onDone: this.onIT2MeHostInfo_.bind(this, hostId),
395 oauthToken: token
396 });
397 };
398
399 /**
400 * Continue an IT2Me connection once the host JID has been looked up.
401 *
402 * @param {string} hostId
403 * @param {XMLHttpRequest} xhr The server response to the support-hosts query.
404 * @return {void} Nothing.
405 * @private
406 */
407 remoting.SessionConnectorImpl.prototype.onIT2MeHostInfo_ =
kelvinp 2015/03/06 01:58:19 Moved to It2MeConnectFlow()
408 function(hostId, xhr) {
409 this.pendingXhr_ = null;
410 if (xhr.status == 200) {
411 var host = /** @type {{data: {jabberId: string, publicKey: string}}} */
412 (base.jsonParseSafe(xhr.responseText));
413 if (host && host.data && host.data.jabberId && host.data.publicKey) {
414 this.host_ = new remoting.Host();
415 this.host_.hostId = hostId;
416 this.host_.jabberId = host.data.jabberId;
417 this.host_.publicKey = host.data.publicKey;
418 this.host_.hostName = host.data.jabberId.split('/')[0];
419 this.connectSignaling_();
420 return;
421 } else {
422 console.error('Invalid "support-hosts" response from server.');
423 }
424 } else {
425 this.onError_(this.translateSupportHostsError_(xhr.status));
426 }
427 };
428
429 /**
430 * Creates ClientSession object. 337 * Creates ClientSession object.
431 */ 338 */
432 remoting.SessionConnectorImpl.prototype.createSession_ = function() { 339 remoting.SessionConnectorImpl.prototype.createSession_ = function() {
433 // In some circumstances, the WCS <iframe> can get reloaded, which results 340 // In some circumstances, the WCS <iframe> can get reloaded, which results
434 // in a new clientJid and a new callback. In this case, remove the old 341 // in a new clientJid and a new callback. In this case, remove the old
435 // client plugin before instantiating a new one. 342 // client plugin before instantiating a new one.
436 if (this.clientSession_) { 343 if (this.clientSession_) {
437 this.clientSession_.removePlugin(); 344 this.clientSession_.removePlugin();
438 this.clientSession_ = null; 345 this.clientSession_ = null;
439 } 346 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 422
516 default: 423 default:
517 console.error('Unexpected client plugin state: ' + event.current); 424 console.error('Unexpected client plugin state: ' + event.current);
518 // This should only happen if the web-app and client plugin get out of 425 // This should only happen if the web-app and client plugin get out of
519 // sync, and even then the version check should ensure compatibility. 426 // sync, and even then the version check should ensure compatibility.
520 this.onError_(remoting.Error.MISSING_PLUGIN); 427 this.onError_(remoting.Error.MISSING_PLUGIN);
521 } 428 }
522 }; 429 };
523 430
524 /** 431 /**
525 * @param {number} error An HTTP error code returned by the support-hosts
526 * endpoint.
527 * @return {remoting.Error} The equivalent remoting.Error code.
528 * @private
529 */
530 remoting.SessionConnectorImpl.prototype.translateSupportHostsError_ =
kelvinp 2015/03/06 01:58:20 Moved to It2MeConnectFlow()
531 function(error) {
532 switch (error) {
533 case 0: return remoting.Error.NETWORK_FAILURE;
534 case 404: return remoting.Error.INVALID_ACCESS_CODE;
535 case 502: // No break
536 case 503: return remoting.Error.SERVICE_UNAVAILABLE;
537 default: return remoting.Error.UNEXPECTED;
538 }
539 };
540
541 /**
542 * Normalize the access code entered by the user.
543 *
544 * @param {string} accessCode The access code, as entered by the user.
545 * @return {string} The normalized form of the code (whitespace removed).
546 * @private
547 */
548 remoting.SessionConnectorImpl.prototype.normalizeAccessCode_ =
549 function(accessCode) {
550 // Trim whitespace.
551 return accessCode.replace(/\s/g, '');
552 };
553
554
555 /**
556 * @constructor 432 * @constructor
557 * @implements {remoting.SessionConnectorFactory} 433 * @implements {remoting.SessionConnectorFactory}
558 */ 434 */
559 remoting.DefaultSessionConnectorFactory = function() { 435 remoting.DefaultSessionConnectorFactory = function() {};
560 };
561 436
562 /** 437 /**
563 * @param {HTMLElement} clientContainer Container element for the client view. 438 * @param {HTMLElement} clientContainer Container element for the client view.
564 * @param {function(remoting.ClientSession):void} onConnected Callback on 439 * @param {function(remoting.ClientSession):void} onConnected Callback on
565 * success. 440 * success.
566 * @param {function(remoting.Error):void} onError Callback on error. 441 * @param {function(remoting.Error):void} onError Callback on error.
567 * @param {function(string, string):boolean} onExtensionMessage The handler for 442 * @param {function(string, string):boolean} onExtensionMessage The handler for
568 * protocol extension messages. Returns true if a message is recognized; 443 * protocol extension messages. Returns true if a message is recognized;
569 * false otherwise. 444 * false otherwise.
570 * @param {function(remoting.Error):void} onConnectionFailed Callback for when 445 * @param {function(remoting.Error):void} onConnectionFailed Callback for when
571 * the connection fails. 446 * the connection fails.
572 * @param {Array<string>} requiredCapabilities Connector capabilities 447 * @param {Array<string>} requiredCapabilities Connector capabilities
573 * required by this application. 448 * required by this application.
574 * @param {string} defaultRemapKeys The default set of key mappings to use 449 * @param {string} defaultRemapKeys The default set of key mappings to use
575 * in the client session. 450 * in the client session.
576 * @return {remoting.SessionConnector} 451 * @return {remoting.SessionConnector}
577 */ 452 */
578 remoting.DefaultSessionConnectorFactory.prototype.createConnector = 453 remoting.DefaultSessionConnectorFactory.prototype.createConnector =
579 function(clientContainer, onConnected, onError, onExtensionMessage, 454 function(clientContainer, onConnected, onError, onExtensionMessage,
580 onConnectionFailed, requiredCapabilities, defaultRemapKeys) { 455 onConnectionFailed, requiredCapabilities, defaultRemapKeys) {
581 return new remoting.SessionConnectorImpl(clientContainer, onConnected, 456 return new remoting.SessionConnectorImpl(clientContainer, onConnected,
582 onError, onExtensionMessage, 457 onError, onExtensionMessage,
583 onConnectionFailed, 458 onConnectionFailed,
584 requiredCapabilities, 459 requiredCapabilities,
585 defaultRemapKeys); 460 defaultRemapKeys);
586 }; 461 };
OLDNEW
« remoting/webapp/crd/js/it2me_connect_flow.js ('K') | « remoting/webapp/crd/js/session_connector.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698