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