| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 An UI component to authenciate to Chrome. The component hosts | 6 * @fileoverview An UI component to authenciate to Chrome. The component hosts |
| 7 * IdP web pages in a webview. A client who is interested in monitoring | 7 * IdP web pages in a webview. A client who is interested in monitoring |
| 8 * authentication events should pass a listener object of type | 8 * authentication events should pass a listener object of type |
| 9 * cr.login.GaiaAuthHost.Listener as defined in this file. After initialization, | 9 * cr.login.GaiaAuthHost.Listener as defined in this file. After initialization, |
| 10 * call {@code load} to start the authentication flow. | 10 * call {@code load} to start the authentication flow. |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 this.chooseWhatToSync_ = false; | 83 this.chooseWhatToSync_ = false; |
| 84 this.skipForNow_ = false; | 84 this.skipForNow_ = false; |
| 85 this.authFlow_ = AuthFlow.DEFAULT; | 85 this.authFlow_ = AuthFlow.DEFAULT; |
| 86 this.loaded_ = false; | 86 this.loaded_ = false; |
| 87 this.idpOrigin_ = null; | 87 this.idpOrigin_ = null; |
| 88 this.continueUrl_ = null; | 88 this.continueUrl_ = null; |
| 89 this.continueUrlWithoutParams_ = null; | 89 this.continueUrlWithoutParams_ = null; |
| 90 this.initialFrameUrl_ = null; | 90 this.initialFrameUrl_ = null; |
| 91 this.reloadUrl_ = null; | 91 this.reloadUrl_ = null; |
| 92 this.trusted_ = true; | 92 this.trusted_ = true; |
| 93 |
| 94 this.webview_.addEventListener( |
| 95 'newwindow', this.onNewWindow_.bind(this)); |
| 96 this.webview_.addEventListener( |
| 97 'contentload', this.onContentLoad_.bind(this)); |
| 98 this.webview_.addEventListener( |
| 99 'loadstop', this.onLoadStop_.bind(this)); |
| 100 this.webview_.request.onCompleted.addListener( |
| 101 this.onRequestCompleted_.bind(this), |
| 102 {urls: ['<all_urls>'], types: ['main_frame']}, |
| 103 ['responseHeaders']); |
| 104 this.webview_.request.onHeadersReceived.addListener( |
| 105 this.onHeadersReceived_.bind(this), |
| 106 {urls: ['<all_urls>'], types: ['main_frame']}, |
| 107 ['responseHeaders']); |
| 108 window.addEventListener( |
| 109 'message', this.onMessageFromWebview_.bind(this), false); |
| 110 window.addEventListener( |
| 111 'focus', this.onFocus_.bind(this), false); |
| 112 window.addEventListener( |
| 113 'popstate', this.onPopState_.bind(this), false); |
| 93 } | 114 } |
| 94 | 115 |
| 95 // TODO(guohui,xiyuan): no need to inherit EventTarget once we deprecate the | 116 // TODO(guohui,xiyuan): no need to inherit EventTarget once we deprecate the |
| 96 // old event-based signin flow. | 117 // old event-based signin flow. |
| 97 Authenticator.prototype = Object.create(cr.EventTarget.prototype); | 118 Authenticator.prototype = Object.create(cr.EventTarget.prototype); |
| 98 | 119 |
| 99 /** | 120 /** |
| 100 * Loads the authenticator component with the given parameters. | 121 * Loads the authenticator component with the given parameters. |
| 101 * @param {AuthMode} authMode Authorization mode. | 122 * @param {AuthMode} authMode Authorization mode. |
| 102 * @param {Object} data Parameters for the authorization flow. | 123 * @param {Object} data Parameters for the authorization flow. |
| 103 */ | 124 */ |
| 104 Authenticator.prototype.load = function(authMode, data) { | 125 Authenticator.prototype.load = function(authMode, data) { |
| 105 this.idpOrigin_ = data.gaiaUrl || IDP_ORIGIN; | 126 this.idpOrigin_ = data.gaiaUrl || IDP_ORIGIN; |
| 106 this.continueUrl_ = data.continueUrl || CONTINUE_URL; | 127 this.continueUrl_ = data.continueUrl || CONTINUE_URL; |
| 107 this.continueUrlWithoutParams_ = | 128 this.continueUrlWithoutParams_ = |
| 108 this.continueUrl_.substring(0, this.continueUrl_.indexOf('?')) || | 129 this.continueUrl_.substring(0, this.continueUrl_.indexOf('?')) || |
| 109 this.continueUrl_; | 130 this.continueUrl_; |
| 110 this.isConstrainedWindow_ = data.constrained == '1'; | 131 this.isConstrainedWindow_ = data.constrained == '1'; |
| 111 | 132 |
| 112 this.initialFrameUrl_ = this.constructInitialFrameUrl_(data); | 133 this.initialFrameUrl_ = this.constructInitialFrameUrl_(data); |
| 113 this.reloadUrl_ = data.frameUrl || this.initialFrameUrl_; | 134 this.reloadUrl_ = data.frameUrl || this.initialFrameUrl_; |
| 114 this.authFlow_ = AuthFlow.DEFAULT; | 135 this.authFlow_ = AuthFlow.DEFAULT; |
| 115 | 136 |
| 116 this.webview_.src = this.reloadUrl_; | 137 this.webview_.src = this.reloadUrl_; |
| 117 this.webview_.addEventListener( | |
| 118 'newwindow', this.onNewWindow_.bind(this)); | |
| 119 this.webview_.addEventListener( | |
| 120 'contentload', this.onContentLoad_.bind(this)); | |
| 121 this.webview_.addEventListener( | |
| 122 'loadstop', this.onLoadStop_.bind(this)); | |
| 123 this.webview_.request.onCompleted.addListener( | |
| 124 this.onRequestCompleted_.bind(this), | |
| 125 {urls: ['*://*/*', this.continueUrlWithoutParams_ + '*'], | |
| 126 types: ['main_frame']}, | |
| 127 ['responseHeaders']); | |
| 128 this.webview_.request.onHeadersReceived.addListener( | |
| 129 this.onHeadersReceived_.bind(this), | |
| 130 {urls: [this.idpOrigin_ + '*'], types: ['main_frame']}, | |
| 131 ['responseHeaders']); | |
| 132 window.addEventListener( | |
| 133 'message', this.onMessageFromWebview_.bind(this), false); | |
| 134 window.addEventListener( | |
| 135 'focus', this.onFocus_.bind(this), false); | |
| 136 window.addEventListener( | |
| 137 'popstate', this.onPopState_.bind(this), false); | |
| 138 | 138 |
| 139 this.loaded_ = false; | 139 this.loaded_ = false; |
| 140 }; | 140 }; |
| 141 | 141 |
| 142 /** | 142 /** |
| 143 * Reloads the authenticator component. | 143 * Reloads the authenticator component. |
| 144 */ | 144 */ |
| 145 Authenticator.prototype.reload = function() { | 145 Authenticator.prototype.reload = function() { |
| 146 this.webview_.src = this.reloadUrl_; | 146 this.webview_.src = this.reloadUrl_; |
| 147 this.authFlow_ = AuthFlow.DEFAULT; | 147 this.authFlow_ = AuthFlow.DEFAULT; |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 }; | 235 }; |
| 236 | 236 |
| 237 /** | 237 /** |
| 238 * Invoked when headers are received in the main frame of the webview. It | 238 * Invoked when headers are received in the main frame of the webview. It |
| 239 * 1) reads the authenticated user info from a signin header, | 239 * 1) reads the authenticated user info from a signin header, |
| 240 * 2) signals the start of a saml flow upon receiving a saml header. | 240 * 2) signals the start of a saml flow upon receiving a saml header. |
| 241 * @return {!Object} Modified request headers. | 241 * @return {!Object} Modified request headers. |
| 242 * @private | 242 * @private |
| 243 */ | 243 */ |
| 244 Authenticator.prototype.onHeadersReceived_ = function(details) { | 244 Authenticator.prototype.onHeadersReceived_ = function(details) { |
| 245 var currentUrl = details.url; |
| 246 if (currentUrl.lastIndexOf(this.idpOrigin_, 0) != 0) |
| 247 return; |
| 248 |
| 245 var headers = details.responseHeaders; | 249 var headers = details.responseHeaders; |
| 246 for (var i = 0; headers && i < headers.length; ++i) { | 250 for (var i = 0; headers && i < headers.length; ++i) { |
| 247 var header = headers[i]; | 251 var header = headers[i]; |
| 248 var headerName = header.name.toLowerCase(); | 252 var headerName = header.name.toLowerCase(); |
| 249 if (headerName == SIGN_IN_HEADER) { | 253 if (headerName == SIGN_IN_HEADER) { |
| 250 var headerValues = header.value.toLowerCase().split(','); | 254 var headerValues = header.value.toLowerCase().split(','); |
| 251 var signinDetails = {}; | 255 var signinDetails = {}; |
| 252 headerValues.forEach(function(e) { | 256 headerValues.forEach(function(e) { |
| 253 var pair = e.split('='); | 257 var pair = e.split('='); |
| 254 signinDetails[pair[0].trim()] = pair[1].trim(); | 258 signinDetails[pair[0].trim()] = pair[1].trim(); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 Authenticator.AuthFlow = AuthFlow; | 348 Authenticator.AuthFlow = AuthFlow; |
| 345 Authenticator.AuthMode = AuthMode; | 349 Authenticator.AuthMode = AuthMode; |
| 346 Authenticator.SUPPORTED_PARAMS = SUPPORTED_PARAMS; | 350 Authenticator.SUPPORTED_PARAMS = SUPPORTED_PARAMS; |
| 347 | 351 |
| 348 return { | 352 return { |
| 349 // TODO(guohui, xiyuan): Rename GaiaAuthHost to Authenticator once the old | 353 // TODO(guohui, xiyuan): Rename GaiaAuthHost to Authenticator once the old |
| 350 // iframe-based flow is deprecated. | 354 // iframe-based flow is deprecated. |
| 351 GaiaAuthHost: Authenticator | 355 GaiaAuthHost: Authenticator |
| 352 }; | 356 }; |
| 353 }); | 357 }); |
| OLD | NEW |