Index: chrome/browser/resources/gaia_auth_host/gaia_auth_host.js |
diff --git a/chrome/browser/resources/gaia_auth_host/gaia_auth_host.js b/chrome/browser/resources/gaia_auth_host/gaia_auth_host.js |
deleted file mode 100644 |
index 1c3aaa504b05ed4ce28bfd2ce3a3b3db46cfab94..0000000000000000000000000000000000000000 |
--- a/chrome/browser/resources/gaia_auth_host/gaia_auth_host.js |
+++ /dev/null |
@@ -1,456 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-/** |
- * @fileoverview An UI component to host gaia auth extension in an iframe. |
- * After the component binds with an iframe, call its {@code load} to start the |
- * authentication flow. There are two events would be raised after this point: |
- * a 'ready' event when the authentication UI is ready to use and a 'completed' |
- * event when the authentication is completed successfully. If caller is |
- * interested in the user credentials, they may supply a success callback with |
- * {@code load} call. The callback will be invoked when the authentication is |
- * completed successfully and with the available credential data. |
- */ |
- |
-cr.define('cr.login', function() { |
- 'use strict'; |
- |
- /** |
- * Base URL of gaia auth extension. |
- * @const |
- */ |
- var AUTH_URL_BASE = 'chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik'; |
- |
- /** |
- * Auth URL to use for online flow. |
- * @const |
- */ |
- var AUTH_URL = AUTH_URL_BASE + '/main.html'; |
- |
- /** |
- * Auth URL to use for offline flow. |
- * @const |
- */ |
- var OFFLINE_AUTH_URL = AUTH_URL_BASE + '/offline.html'; |
- |
- /** |
- * Origin of the gaia sign in page. |
- * @const |
- */ |
- var GAIA_ORIGIN = 'https://accounts.google.com'; |
- |
- /** |
- * Supported params of auth extension. For a complete list, check out the |
- * auth extension's main.js. |
- * @type {!Array<string>} |
- * @const |
- */ |
- var SUPPORTED_PARAMS = [ |
- 'gaiaUrl', // Gaia url to use; |
- 'gaiaPath', // Gaia path to use without a leading slash; |
- 'hl', // Language code for the user interface; |
- 'email', // Pre-fill the email field in Gaia UI; |
- 'service', // Name of Gaia service; |
- 'continueUrl', // Continue url to use; |
- 'frameUrl', // Initial frame URL to use. If empty defaults to gaiaUrl. |
- 'useEafe', // Whether to use EAFE. |
- 'clientId', // Chrome's client id. |
- 'constrained' // Whether the extension is loaded in a constrained window; |
- ]; |
- |
- /** |
- * Supported localized strings. For a complete list, check out the auth |
- * extension's offline.js |
- * @type {!Array<string>} |
- * @const |
- */ |
- var LOCALIZED_STRING_PARAMS = [ |
- 'stringSignIn', |
- 'stringEmail', |
- 'stringPassword', |
- 'stringEmptyEmail', |
- 'stringEmptyPassword', |
- 'stringError' |
- ]; |
- |
- /** |
- * Enum for the authorization mode, must match AuthMode defined in |
- * chrome/browser/ui/webui/inline_login_ui.cc. |
- * @enum {number} |
- */ |
- var AuthMode = { |
- DEFAULT: 0, |
- OFFLINE: 1, |
- DESKTOP: 2 |
- }; |
- |
- /** |
- * Enum for the auth flow. |
- * @enum {number} |
- */ |
- var AuthFlow = { |
- GAIA: 0, |
- SAML: 1 |
- }; |
- |
- /** |
- * Creates a new gaia auth extension host. |
- * @param {HTMLIFrameElement|string} container The iframe element or its id |
- * to host the auth extension. |
- * @constructor |
- * @extends {cr.EventTarget} |
- */ |
- function GaiaAuthHost(container) { |
- this.frame_ = typeof container == 'string' ? $(container) : container; |
- assert(this.frame_); |
- window.addEventListener('message', |
- this.onMessage_.bind(this), false); |
- } |
- |
- GaiaAuthHost.prototype = { |
- __proto__: cr.EventTarget.prototype, |
- |
- /** |
- * Auth extension params |
- * @type {Object} |
- */ |
- authParams_: {}, |
- |
- /** |
- * An url to use with {@code reload}. |
- * @type {?string} |
- * @private |
- */ |
- reloadUrl_: null, |
- |
- /** |
- * Invoked when authentication is completed successfully with credential |
- * data. A credential data object looks like this: |
- * <pre> |
- * {@code |
- * { |
- * email: 'xx@gmail.com', |
- * password: 'xxxx', // May not present |
- * authCode: 'x/xx', // May not present |
- * authMode: 'x', // Authorization mode, default/offline/desktop. |
- * } |
- * } |
- * </pre> |
- * @type {function(Object)} |
- * @private |
- */ |
- successCallback_: null, |
- |
- /** |
- * Invoked when the auth flow needs a user to confirm their passwords. This |
- * could happen when there are more than one passwords scraped during SAML |
- * flow. The embedder of GaiaAuthHost should show an UI to collect a |
- * password from user then call GaiaAuthHost.verifyConfirmedPassword to |
- * verify. If the password is good, the auth flow continues with success |
- * path. Otherwise, confirmPasswordCallback_ is invoked again. |
- * @type {function()} |
- */ |
- confirmPasswordCallback_: null, |
- |
- /** |
- * Similar to confirmPasswordCallback_ but is used when there is no |
- * password scraped after a success authentication. The authenticated user |
- * account is passed to the callback. The embedder should take over the |
- * flow and decide what to do next. |
- * @type {function(string)} |
- */ |
- noPasswordCallback_: null, |
- |
- /** |
- * Invoked when the authentication flow had to be aborted because content |
- * served over an unencrypted connection was detected. |
- */ |
- insecureContentBlockedCallback_: null, |
- |
- /** |
- * Invoked to display an error message to the user when a GAIA error occurs |
- * during authentication. |
- * @type {function()} |
- */ |
- missingGaiaInfoCallback_: null, |
- |
- /** |
- * Invoked to record that the credentials passing API was used. |
- * @type {function()} |
- */ |
- samlApiUsedCallback_: null, |
- |
- /** |
- * The iframe container. |
- * @type {HTMLIFrameElement} |
- */ |
- get frame() { |
- return this.frame_; |
- }, |
- |
- /** |
- * Sets confirmPasswordCallback_. |
- * @type {function()} |
- */ |
- set confirmPasswordCallback(callback) { |
- this.confirmPasswordCallback_ = callback; |
- }, |
- |
- /** |
- * Sets noPasswordCallback_. |
- * @type {function()} |
- */ |
- set noPasswordCallback(callback) { |
- this.noPasswordCallback_ = callback; |
- }, |
- |
- /** |
- * Sets insecureContentBlockedCallback_. |
- * @type {function(string)} |
- */ |
- set insecureContentBlockedCallback(callback) { |
- this.insecureContentBlockedCallback_ = callback; |
- }, |
- |
- /** |
- * Sets missingGaiaInfoCallback_. |
- * @type {function()} |
- */ |
- set missingGaiaInfoCallback(callback) { |
- this.missingGaiaInfoCallback_ = callback; |
- }, |
- |
- /** |
- * Sets samlApiUsedCallback_. |
- * @type {function()} |
- */ |
- set samlApiUsedCallback(callback) { |
- this.samlApiUsedCallback_ = callback; |
- }, |
- |
- /** |
- * Loads the auth extension. |
- * @param {AuthMode} authMode Authorization mode. |
- * @param {Object} data Parameters for the auth extension. See the auth |
- * extension's main.js for all supported params and their defaults. |
- * @param {function(Object)} successCallback A function to be called when |
- * the authentication is completed successfully. The callback is |
- * invoked with a credential object. |
- */ |
- load: function(authMode, data, successCallback) { |
- var params = {}; |
- |
- var populateParams = function(nameList, values) { |
- if (!values) |
- return; |
- |
- for (var i in nameList) { |
- var name = nameList[i]; |
- if (values[name]) |
- params[name] = values[name]; |
- } |
- }; |
- |
- populateParams(SUPPORTED_PARAMS, data); |
- populateParams(LOCALIZED_STRING_PARAMS, data.localizedStrings); |
- params['needPassword'] = true; |
- |
- var url; |
- switch (authMode) { |
- case AuthMode.OFFLINE: |
- url = OFFLINE_AUTH_URL; |
- break; |
- case AuthMode.DESKTOP: |
- url = AUTH_URL; |
- params['desktopMode'] = true; |
- break; |
- default: |
- url = AUTH_URL; |
- } |
- |
- this.authParams_ = params; |
- this.reloadUrl_ = url; |
- this.successCallback_ = successCallback; |
- |
- this.reload(); |
- }, |
- |
- /** |
- * Reloads the auth extension. |
- */ |
- reload: function() { |
- this.frame_.src = this.reloadUrl_; |
- this.authFlow = AuthFlow.GAIA; |
- }, |
- |
- /** |
- * Verifies the supplied password by sending it to the auth extension, |
- * which will then check if it matches the scraped passwords. |
- * @param {string} password The confirmed password that needs verification. |
- */ |
- verifyConfirmedPassword: function(password) { |
- var msg = { |
- method: 'verifyConfirmedPassword', |
- password: password |
- }; |
- this.frame_.contentWindow.postMessage(msg, AUTH_URL_BASE); |
- }, |
- |
- /** |
- * Invoked to process authentication success. |
- * @param {Object} credentials Credential object to pass to success |
- * callback. |
- * @private |
- */ |
- onAuthSuccess_: function(credentials) { |
- if (this.successCallback_) |
- this.successCallback_(credentials); |
- cr.dispatchSimpleEvent(this, 'completed'); |
- }, |
- |
- /** |
- * Checks if message comes from the loaded authentication extension. |
- * @param {Object} e Payload of the received HTML5 message. |
- * @type {boolean} |
- */ |
- isAuthExtMessage_: function(e) { |
- return this.frame_.src && |
- this.frame_.src.startsWith(e.origin) && |
- e.source == this.frame_.contentWindow; |
- }, |
- |
- /** |
- * Event handler that is invoked when HTML5 message is received. |
- * @param {object} e Payload of the received HTML5 message. |
- */ |
- onMessage_: function(e) { |
- var msg = e.data; |
- |
- if (!this.isAuthExtMessage_(e)) |
- return; |
- |
- if (msg.method == 'loginUIDOMContentLoaded') { |
- this.frame_.contentWindow.postMessage(this.authParams_, AUTH_URL_BASE); |
- return; |
- } |
- |
- if (msg.method == 'loginUILoaded') { |
- cr.dispatchSimpleEvent(this, 'ready'); |
- return; |
- } |
- |
- if (/^complete(Login|Authentication)$|^offlineLogin$/.test(msg.method)) { |
- if (!msg.email && !this.email_ && !msg.skipForNow) { |
- var msg = {method: 'redirectToSignin'}; |
- this.frame_.contentWindow.postMessage(msg, AUTH_URL_BASE); |
- return; |
- } |
- this.onAuthSuccess_({email: msg.email, |
- password: msg.password, |
- gaiaId: msg.gaiaId, |
- useOffline: msg.method == 'offlineLogin', |
- usingSAML: msg.usingSAML || false, |
- chooseWhatToSync: msg.chooseWhatToSync, |
- skipForNow: msg.skipForNow || false, |
- sessionIndex: msg.sessionIndex || ''}); |
- return; |
- } |
- |
- if (msg.method == 'completeAuthenticationAuthCodeOnly') { |
- if (!msg.authCode) { |
- console.error( |
- 'GaiaAuthHost: completeAuthentication without auth code.'); |
- var msg = {method: 'redirectToSignin'}; |
- this.frame_.contentWindow.postMessage(msg, AUTH_URL_BASE); |
- return; |
- } |
- this.onAuthSuccess_({authCodeOnly: true, authCode: msg.authCode}); |
- return; |
- } |
- |
- if (msg.method == 'confirmPassword') { |
- if (this.confirmPasswordCallback_) |
- this.confirmPasswordCallback_(msg.email, msg.passwordCount); |
- else |
- console.error('GaiaAuthHost: Invalid confirmPasswordCallback_.'); |
- return; |
- } |
- |
- if (msg.method == 'noPassword') { |
- if (this.noPasswordCallback_) |
- this.noPasswordCallback_(msg.email); |
- else |
- console.error('GaiaAuthHost: Invalid noPasswordCallback_.'); |
- return; |
- } |
- |
- if (msg.method == 'authPageLoaded') { |
- this.authDomain = msg.domain; |
- this.authFlow = msg.isSAML ? AuthFlow.SAML : AuthFlow.GAIA; |
- return; |
- } |
- |
- if (msg.method == 'resetAuthFlow') { |
- this.authFlow = AuthFlow.GAIA; |
- return; |
- } |
- |
- if (msg.method == 'insecureContentBlocked') { |
- if (this.insecureContentBlockedCallback_) { |
- this.insecureContentBlockedCallback_(msg.url); |
- } else { |
- console.error( |
- 'GaiaAuthHost: Invalid insecureContentBlockedCallback_.'); |
- } |
- return; |
- } |
- |
- if (msg.method == 'switchToFullTab') { |
- chrome.send('switchToFullTab', [msg.url]); |
- return; |
- } |
- |
- if (msg.method == 'missingGaiaInfo') { |
- if (this.missingGaiaInfoCallback_) { |
- this.missingGaiaInfoCallback_(); |
- } else { |
- console.error('GaiaAuthHost: Invalid missingGaiaInfoCallback_.'); |
- } |
- return; |
- } |
- |
- if (msg.method == 'samlApiUsed') { |
- if (this.samlApiUsedCallback_) { |
- this.samlApiUsedCallback_(); |
- } else { |
- console.error('GaiaAuthHost: Invalid samlApiUsedCallback_.'); |
- } |
- return; |
- } |
- |
- console.error('Unknown message method=' + msg.method); |
- } |
- }; |
- |
- /** |
- * The domain name of the current auth page. |
- * @type {string} |
- */ |
- cr.defineProperty(GaiaAuthHost, 'authDomain'); |
- |
- /** |
- * The current auth flow of the hosted gaia_auth extension. |
- * @type {AuthFlow} |
- */ |
- cr.defineProperty(GaiaAuthHost, 'authFlow'); |
- |
- GaiaAuthHost.SUPPORTED_PARAMS = SUPPORTED_PARAMS; |
- GaiaAuthHost.LOCALIZED_STRING_PARAMS = LOCALIZED_STRING_PARAMS; |
- GaiaAuthHost.AuthMode = AuthMode; |
- GaiaAuthHost.AuthFlow = AuthFlow; |
- |
- return { |
- GaiaAuthHost: GaiaAuthHost |
- }; |
-}); |