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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function Authenticator() {
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/**
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Singleton getter of Authenticator.
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return {Object} The singleton instance of Authenticator.
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Authenticator.getInstance = function() {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!Authenticator.instance_) {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Authenticator.instance_ = new Authenticator();
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Authenticator.instance_;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Authenticator.prototype = {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  email_: null,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_: null,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attemptToken_: null,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Input params from extension initialization URL.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inputLang_: undefined,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  intputEmail_: undefined,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GAIA_URL: 'https://accounts.google.com/',
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GAIA_PAGE_PATH: 'ServiceLogin?service=chromeoslogin' +
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '&skipvpage=true&sarp=1&rm=hide' +
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '&continue=chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik/' +
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'success.html',
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  THIS_EXTENSION_ORIGIN: 'chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik',
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PARENT_PAGE: 'chrome://oobe/',
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initialize: function() {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var params = getUrlSearchParams(location.search);
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    this.parentPage_ = params['parentPage'] || this.PARENT_PAGE;
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    this.gaiaUrl_ = params['gaiaUrl'] || this.GAIA_URL;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.inputLang_ = params['hl'];
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.inputEmail_ = params['email'];
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    document.addEventListener('DOMContentLoaded', this.onPageLoad.bind(this));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  isGaiaMessage_: function(msg) {
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Not quite right, but good enough.
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return this.gaiaUrl_.indexOf(msg.origin) == 0 ||
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           this.GAIA_URL.indexOf(msg.origin) == 0;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  isInternalMessage_: function(msg) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return msg.origin == this.THIS_EXTENSION_ORIGIN;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  getFrameUrl_: function() {
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    var url = this.gaiaUrl_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url += this.GAIA_PAGE_PATH;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (this.inputLang_)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url += '&hl=' + encodeURIComponent(this.inputLang_);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (this.inputEmail_)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url += '&Email=' + encodeURIComponent(this.inputEmail_);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  loadFrame_: function() {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    $('gaia-frame').src = this.getFrameUrl_();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  onPageLoad: function(e) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window.addEventListener('message', this.onMessage.bind(this), false);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    this.loadFrame_();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  onLoginUILoaded: function() {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var msg = {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'method': 'loginUILoaded'
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    window.parent.postMessage(msg, this.parentPage_);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  onMessage: function(e) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var msg = e.data;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (msg.method == 'attemptLogin' && this.isGaiaMessage_(e)) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.email_ = msg.email;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.password_ = msg.password;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.attemptToken_ = msg.attemptToken;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (msg.method == 'clearOldAttempts' && this.isGaiaMessage_(e)) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.email_ = null;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.password_ = null;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.attemptToken_ = null;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this.onLoginUILoaded();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (msg.method == 'confirmLogin' && this.isInternalMessage_(e)) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (this.attemptToken_ == msg.attemptToken) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var msg = {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'method': 'completeLogin',
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'email': this.email_,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'password': this.password_
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        };
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        window.parent.postMessage(msg, this.parentPage_);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        console.log('#### Authenticator.onMessage: unexpected attemptToken!?');
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      console.log('#### Authenticator.onMessage: unknown message + origin!?');
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Authenticator.getInstance().initialize();
113