15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)/**
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) * Authenticator class wraps the communications between Gaia and its host.
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) */
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function Authenticator() {
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Gaia auth extension url origin.
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @type {string}
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Authenticator.THIS_EXTENSION_ORIGIN =
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik';
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * The lowest version of the credentials passing API supported.
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * @type {number}
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)Authenticator.MIN_API_VERSION_VERSION = 1;
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/**
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * The highest version of the credentials passing API supported.
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * @type {number}
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)Authenticator.MAX_API_VERSION_VERSION = 1;
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/**
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * The key types supported by the credentials passing API.
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * @type {Array} Array of strings.
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)Authenticator.API_KEY_TYPES = [
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  'KEY_TYPE_PASSWORD_PLAIN',
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)];
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/**
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Singleton getter of Authenticator.
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return {Object} The singleton instance of Authenticator.
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Authenticator.getInstance = function() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!Authenticator.instance_) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Authenticator.instance_ = new Authenticator();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Authenticator.instance_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Authenticator.prototype = {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  email_: null,
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Depending on the key type chosen, this will contain the plain text password
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // or a credential derived from it along with the information required to
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // repeat the derivation, such as a salt. The information will be encoded so
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // that it contains printable ASCII characters only. The exact encoding is TBD
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // when support for key types other than plain text password is added.
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  passwordBytes_: null,
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attemptToken_: null,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Input params from extension initialization URL.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inputLang_: undefined,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  intputEmail_: undefined,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  isSAMLFlow_: false,
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  isSAMLEnabled_: false,
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  supportChannel_: null,
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GAIA_URL: 'https://accounts.google.com/',
708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  GAIA_PAGE_PATH: 'ServiceLogin?skipvpage=true&sarp=1&rm=hide',
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PARENT_PAGE: 'chrome://oobe/',
728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  SERVICE_ID: 'chromeoslogin',
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CONTINUE_URL: Authenticator.THIS_EXTENSION_ORIGIN + '/success.html',
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CONSTRAINED_FLOW_SOURCE: 'chrome',
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initialize: function() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var params = getUrlSearchParams(location.search);
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.parentPage_ = params.parentPage || this.PARENT_PAGE;
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.gaiaUrl_ = params.gaiaUrl || this.GAIA_URL;
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    this.gaiaPath_ = params.gaiaPath || this.GAIA_PAGE_PATH;
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.inputLang_ = params.hl;
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.inputEmail_ = params.email;
838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    this.service_ = params.service || this.SERVICE_ID;
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    this.continueUrl_ = params.continueUrl || this.CONTINUE_URL;
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.desktopMode_ = params.desktopMode == '1';
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.isConstrainedWindow_ = params.constrained == '1';
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    this.initialFrameUrl_ = params.frameUrl || this.constructInitialFrameUrl_();
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    this.initialFrameUrlWithoutParams_ = stripParams(this.initialFrameUrl_);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    document.addEventListener('DOMContentLoaded', this.onPageLoad_.bind(this));
91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    if (!this.desktopMode_) {
92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      // SAML is always enabled in desktop mode, thus no need to listen for
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      // enableSAML event.
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      document.addEventListener('enableSAML', this.onEnableSAML_.bind(this));
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  isGaiaMessage_: function(msg) {
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Not quite right, but good enough.
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return this.gaiaUrl_.indexOf(msg.origin) == 0 ||
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           this.GAIA_URL.indexOf(msg.origin) == 0;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  isInternalMessage_: function(msg) {
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return msg.origin == Authenticator.THIS_EXTENSION_ORIGIN;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  isParentMessage_: function(msg) {
109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return msg.origin == this.parentPage_;
110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  },
111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  constructInitialFrameUrl_: function() {
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    var url = this.gaiaUrl_ + this.gaiaPath_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    url = appendParam(url, 'service', this.service_);
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    url = appendParam(url, 'continue', this.continueUrl_);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (this.inputLang_)
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      url = appendParam(url, 'hl', this.inputLang_);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (this.inputEmail_)
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      url = appendParam(url, 'Email', this.inputEmail_);
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (this.isConstrainedWindow_)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      url = appendParam(url, 'source', this.CONSTRAINED_FLOW_SOURCE);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  onPageLoad_: function() {
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window.addEventListener('message', this.onMessage.bind(this), false);
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var gaiaFrame = $('gaia-frame');
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gaiaFrame.src = this.initialFrameUrl_;
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (this.desktopMode_) {
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var handler = function() {
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this.onLoginUILoaded_();
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gaiaFrame.removeEventListener('load', handler);
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        this.initDesktopChannel_();
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }.bind(this);
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gaiaFrame.addEventListener('load', handler);
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  },
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  initDesktopChannel_: function() {
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    this.supportChannel_ = new Channel();
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    this.supportChannel_.connect('authMain');
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    var channelConnected = false;
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    this.supportChannel_.registerMessage('channelConnected', function() {
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      channelConnected = true;
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      this.supportChannel_.send({
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        name: 'initDesktopFlow',
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        gaiaUrl: this.gaiaUrl_,
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        continueUrl: stripParams(this.continueUrl_),
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        isConstrainedWindow: this.isConstrainedWindow_
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      });
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      this.supportChannel_.registerMessage(
158e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          'switchToFullTab', this.switchToFullTab_.bind(this));
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      this.supportChannel_.registerMessage(
160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          'completeLogin', this.completeLogin_.bind(this));
161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      this.onEnableSAML_();
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }.bind(this));
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    window.setTimeout(function() {
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (!channelConnected) {
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        // Re-initialize the channel if it is not connected properly, e.g.
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        // connect may be called before background script started running.
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        this.initDesktopChannel_();
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      }
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }.bind(this), 200);
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  },
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /**
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Invoked when the login UI is initialized or reset.
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   */
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  onLoginUILoaded_: function() {
178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    var msg = {
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'method': 'loginUILoaded'
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    };
181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    window.parent.postMessage(msg, this.parentPage_);
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  },
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Invoked when the background script sends a message to indicate that the
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * current content does not fit in a constrained window.
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {Object=} opt_extraMsg Optional extra info to send.
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  switchToFullTab_: function(msg) {
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var parentMsg = {
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'method': 'switchToFullTab',
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'url': msg.url
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    };
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window.parent.postMessage(parentMsg, this.parentPage_);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Invoked when the signin flow is complete.
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {Object=} opt_extraMsg Optional extra info to send.
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  completeLogin_: function(opt_extraMsg) {
202d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    var msg = {
203d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      'method': 'completeLogin',
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'email': (opt_extraMsg && opt_extraMsg.email) || this.email_,
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'password': (opt_extraMsg && opt_extraMsg.password) ||
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  this.passwordBytes_,
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'usingSAML': this.isSAMLFlow_,
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'chooseWhatToSync': this.chooseWhatToSync_ || false,
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'skipForNow': opt_extraMsg && opt_extraMsg.skipForNow,
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'sessionIndex': opt_extraMsg && opt_extraMsg.sessionIndex
211d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    };
212d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    window.parent.postMessage(msg, this.parentPage_);
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (this.isSAMLEnabled_)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.supportChannel_.send({name: 'resetAuth'});
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  /**
218e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch   * Invoked when 'enableSAML' event is received to initialize SAML support on
219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   * Chrome OS, or when initDesktopChannel_ is called on desktop.
220d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)   */
221d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  onEnableSAML_: function() {
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.isSAMLEnabled_ = true;
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.isSAMLFlow_ = false;
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!this.supportChannel_) {
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.supportChannel_ = new Channel();
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.supportChannel_.connect('authMain');
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
229d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.supportChannel_.registerMessage(
231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        'onAuthPageLoaded', this.onAuthPageLoaded_.bind(this));
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.supportChannel_.registerMessage(
233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        'onInsecureContentBlocked', this.onInsecureContentBlocked_.bind(this));
234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    this.supportChannel_.registerMessage(
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        'apiCall', this.onAPICall_.bind(this));
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.supportChannel_.send({
237d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      name: 'setGaiaUrl',
238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      gaiaUrl: this.gaiaUrl_
239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    });
240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (!this.desktopMode_ && this.gaiaUrl_.indexOf('https://') == 0) {
241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // Abort the login flow when content served over an unencrypted connection
242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // is detected on Chrome OS. This does not apply to tests that explicitly
243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // set a non-https GAIA URL and want to perform all authentication over
244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // http.
245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      this.supportChannel_.send({
246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        name: 'setBlockInsecureContent',
247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        blockInsecureContent: true
248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      });
249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  },
251d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
252d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  /**
253d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)   * Invoked when the background page sends 'onHostedPageLoaded' message.
254d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)   * @param {!Object} msg Details sent with the message.
255d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)   */
256d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  onAuthPageLoaded_: function(msg) {
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var isSAMLPage = msg.url.indexOf(this.gaiaUrl_) != 0;
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (isSAMLPage && !this.isSAMLFlow_) {
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // GAIA redirected to a SAML login page. The credentials provided to this
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // page will determine what user gets logged in. The credentials obtained
262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      // from the GAIA login form are no longer relevant and can be discarded.
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.isSAMLFlow_ = true;
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.email_ = null;
265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      this.passwordBytes_ = null;
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
268d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    window.parent.postMessage({
269d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      'method': 'authPageLoaded',
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'isSAML': this.isSAMLFlow_,
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'domain': extractDomain(msg.url)
272d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }, this.parentPage_);
273d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  },
274d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /**
276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   * Invoked when the background page sends an 'onInsecureContentBlocked'
277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   * message.
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   * @param {!Object} msg Details sent with the message.
279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   */
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  onInsecureContentBlocked_: function(msg) {
281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    window.parent.postMessage({
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'method': 'insecureContentBlocked',
283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      'url': stripParams(msg.url)
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }, this.parentPage_);
285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  },
286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  /**
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * Invoked when one of the credential passing API methods is called by a SAML
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * provider.
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   * @param {!Object} msg Details of the API call.
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   */
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  onAPICall_: function(msg) {
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    var call = msg.call;
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (call.method == 'initialize') {
295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (!Number.isInteger(call.requestedVersion) ||
296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          call.requestedVersion < Authenticator.MIN_API_VERSION_VERSION) {
297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        this.sendInitializationFailure_();
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      this.apiVersion_ = Math.min(call.requestedVersion,
302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                  Authenticator.MAX_API_VERSION_VERSION);
303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      this.initialized_ = true;
304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      this.sendInitializationSuccess_();
305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return;
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (call.method == 'add') {
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (Authenticator.API_KEY_TYPES.indexOf(call.keyType) == -1) {
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        console.error('Authenticator.onAPICall_: unsupported key type');
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        return;
312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      }
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.apiToken_ = call.token;
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.email_ = call.user;
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      this.passwordBytes_ = call.passwordBytes;
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else if (call.method == 'confirm') {
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (call.token != this.apiToken_)
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        console.error('Authenticator.onAPICall_: token mismatch');
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else {
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      console.error('Authenticator.onAPICall_: unknown message');
321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  sendInitializationSuccess_: function() {
325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    this.supportChannel_.send({name: 'apiResponse', response: {
326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      result: 'initialized',
327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      version: this.apiVersion_,
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      keyTypes: Authenticator.API_KEY_TYPES
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }});
330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  },
331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  sendInitializationFailure_: function() {
333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    this.supportChannel_.send({
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      name: 'apiResponse',
335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      response: {result: 'initialization_failed'}
336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    });
337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  },
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
339d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  onConfirmLogin_: function() {
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!this.isSAMLFlow_) {
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.completeLogin_();
342d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return;
343d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
344d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    var apiUsed = !!this.passwordBytes_;
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Retrieve the e-mail address of the user who just authenticated from GAIA.
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    window.parent.postMessage({method: 'retrieveAuthenticatedUserEmail',
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               attemptToken: this.attemptToken_,
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               apiUsed: apiUsed},
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              this.parentPage_);
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!apiUsed) {
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.supportChannel_.sendWithCallback(
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          {name: 'getScrapedPasswords'},
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          function(passwords) {
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            if (passwords.length == 0) {
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              window.parent.postMessage(
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  {method: 'noPassword', email: this.email_},
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  this.parentPage_);
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            } else {
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              window.parent.postMessage({method: 'confirmPassword',
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         email: this.email_,
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         passwordCount: passwords.length},
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        this.parentPage_);
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            }
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          }.bind(this));
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  maybeCompleteSAMLLogin_: function() {
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // SAML login is complete when the user's e-mail address has been retrieved
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // from GAIA and the user has successfully confirmed the password.
374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (this.email_ !== null && this.passwordBytes_ !== null)
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.completeLogin_();
376d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  },
377d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
378d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  onVerifyConfirmedPassword_: function(password) {
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    this.supportChannel_.sendWithCallback(
380d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        {name: 'getScrapedPasswords'},
381d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        function(passwords) {
382d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          for (var i = 0; i < passwords.length; ++i) {
383d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            if (passwords[i] == password) {
384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              this.passwordBytes_ = passwords[i];
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              this.maybeCompleteSAMLLogin_();
386d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)              return;
387d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            }
388d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          }
389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          window.parent.postMessage(
390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              {method: 'confirmPassword', email: this.email_},
391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              this.parentPage_);
392d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        }.bind(this));
393d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  },
394d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  onMessage: function(e) {
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var msg = e.data;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (msg.method == 'attemptLogin' && this.isGaiaMessage_(e)) {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.email_ = msg.email;
399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      this.passwordBytes_ = msg.password;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.attemptToken_ = msg.attemptToken;
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.chooseWhatToSync_ = msg.chooseWhatToSync;
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.isSAMLFlow_ = false;
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (this.isSAMLEnabled_)
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this.supportChannel_.send({name: 'startAuth'});
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (msg.method == 'clearOldAttempts' && this.isGaiaMessage_(e)) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.email_ = null;
407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      this.passwordBytes_ = null;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.attemptToken_ = null;
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.isSAMLFlow_ = false;
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      this.onLoginUILoaded_();
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (this.isSAMLEnabled_)
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this.supportChannel_.send({name: 'resetAuth'});
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else if (msg.method == 'setAuthenticatedUserEmail' &&
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               this.isParentMessage_(e)) {
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (this.attemptToken_ == msg.attemptToken) {
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this.email_ = msg.email;
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        this.maybeCompleteSAMLLogin_();
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (msg.method == 'confirmLogin' && this.isInternalMessage_(e)) {
420d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      if (this.attemptToken_ == msg.attemptToken)
421d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        this.onConfirmLogin_();
422d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      else
423d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        console.error('Authenticator.onMessage: unexpected attemptToken!?');
424d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    } else if (msg.method == 'verifyConfirmedPassword' &&
425d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)               this.isParentMessage_(e)) {
426d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      this.onVerifyConfirmedPassword_(msg.password);
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else if (msg.method == 'redirectToSignin' &&
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               this.isParentMessage_(e)) {
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      $('gaia-frame').src = this.constructInitialFrameUrl_();
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       console.error('Authenticator.onMessage: unknown message + origin!?');
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Authenticator.getInstance().initialize();
437