Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(179)

Unified Diff: chrome/browser/resources/gaia_auth/main.js

Issue 258123002: Implement a second version of the credentials passing API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed comment. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/gaia_auth/main.js
diff --git a/chrome/browser/resources/gaia_auth/main.js b/chrome/browser/resources/gaia_auth/main.js
index e1daff6e7ffc0450573b2302ddd2f61c9e40ec14..59430ad9362344575812846f61702a07aeff4e41 100644
--- a/chrome/browser/resources/gaia_auth/main.js
+++ b/chrome/browser/resources/gaia_auth/main.js
@@ -16,6 +16,26 @@ Authenticator.THIS_EXTENSION_ORIGIN =
'chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik';
/**
+ * The lowest version of the credentials passing API supported.
+ * @type {number}
+ */
+Authenticator.MIN_API_VERSION_VERSION = 1;
+
+/**
+ * The highest version of the credentials passing API supported.
+ * @type {number}
+ */
+Authenticator.MAX_API_VERSION_VERSION = 2;
+
+/**
+ * The key types supported for credentials passing API 2 and higher.
+ * @type {Array} Array of strings.
+ */
+Authenticator.API_KEY_TYPES = [
+ 'KEY_TYPE_PASSWORD_PLAIN',
Jorge Lucangeli Obes 2014/04/30 22:31:37 Is this equivalent of what we're doing in v1?
bartfab (slow) 2014/05/01 22:47:48 Yes. For now, both v1 and v2 expect the password i
Jorge Lucangeli Obes 2014/05/01 23:00:24 IIUC the password is transmitted in plaintext, but
bartfab (slow) 2014/05/02 06:29:53 The password is sent to two places: 1) The SAML I
+];
+
+/**
* Singleton getter of Authenticator.
* @return {Object} The singleton instance of Authenticator.
*/
@@ -28,7 +48,7 @@ Authenticator.getInstance = function() {
Authenticator.prototype = {
email_: null,
- password_: null,
+ passwordBytes_: null,
attemptToken_: null,
// Input params from extension initialization URL.
@@ -175,7 +195,8 @@ Authenticator.prototype = {
var msg = {
'method': 'completeLogin',
'email': (opt_extraMsg && opt_extraMsg.email) || this.email_,
- 'password': (opt_extraMsg && opt_extraMsg.password) || this.password_,
+ 'password': (opt_extraMsg && opt_extraMsg.password) ||
+ this.passwordBytes_,
'usingSAML': this.isSAMLFlow_,
'chooseWhatToSync': this.chooseWhatToSync_ || false,
'skipForNow': opt_extraMsg && opt_extraMsg.skipForNow,
@@ -231,10 +252,10 @@ Authenticator.prototype = {
if (isSAMLPage && !this.isSAMLFlow_) {
// GAIA redirected to a SAML login page. The credentials provided to this
// page will determine what user gets logged in. The credentials obtained
- // from the GAIA login from are no longer relevant and can be discarded.
+ // from the GAIA login form are no longer relevant and can be discarded.
this.isSAMLFlow_ = true;
this.email_ = null;
- this.password_ = null;
+ this.passwordBytes_ = null;
}
window.parent.postMessage({
@@ -260,10 +281,46 @@ Authenticator.prototype = {
*/
onAPICall_: function(msg) {
var call = msg.call;
+ if (call.method == 'initialize') {
+ // TODO(bartfab): There was no |requestedVersion| parameter in version 1
+ // of the API. Remove this code once all consumers have switched to
+ // version 2 or higher.
+ if (!call.hasOwnProperty('requestedVersion')) {
+ if (Authenticator.MIN_API_VERSION_VERSION == 1) {
+ this.apiVersion_ = 1;
+ this.initialized_ = true;
+ this.sendInitializationSuccess_();
+ }
+ // The glue code for API version 1 interprets all responses as success.
+ // Instead of reporting failure, do not send any response at all.
+ return;
+ }
+
+ if (!Number.isInteger(call.requestedVersion) ||
+ call.requestedVersion < Authenticator.MIN_API_VERSION_VERSION) {
+ this.sendInitializationFailure_();
+ return;
+ }
+
+ this.apiVersion_ = Math.min(call.requested_version,
+ Authenticator.MAX_API_VERSION_VERSION);
+ this.initialized_ = true;
+ this.sendInitializationSuccess_();
+ return;
+ }
+
if (call.method == 'add') {
+ if (this.apiVersion_ > 1 &&
+ Authenticator.API_KEY_TYPES.indexOf(call.keyType) == -1) {
+ console.error('Authenticator.onAPICall_: unsupported key type');
+ return;
+ }
this.apiToken_ = call.token;
this.email_ = call.user;
- this.password_ = call.password;
+ if (this.apiVersion_ == 1)
+ this.passwordBytes_ = call.password;
+ else
+ this.passwordBytes_ = call.passwordBytes;
} else if (call.method == 'confirm') {
if (call.token != this.apiToken_)
console.error('Authenticator.onAPICall_: token mismatch');
@@ -272,13 +329,31 @@ Authenticator.prototype = {
}
},
+ sendInitializationSuccess_: function() {
+ var response = {
+ result: 'initialized',
+ version: this.apiVersion_
+ };
+ if (this.apiVersion_ >= 2)
+ response['keyTypes'] = Authenticator.API_KEY_TYPES;
+
+ this.supportChannel_.send({name: 'apiResponse', response: response});
+ },
+
+ sendInitializationFailure_: function() {
+ this.supportChannel_.send({
+ name: 'apiResponse',
+ response: {result: 'initialization_failed'}
+ });
+ },
+
onConfirmLogin_: function() {
if (!this.isSAMLFlow_) {
this.completeLogin_();
return;
}
- var apiUsed = !!this.password_;
+ var apiUsed = !!this.passwordBytes_;
// Retrieve the e-mail address of the user who just authenticated from GAIA.
window.parent.postMessage({method: 'retrieveAuthenticatedUserEmail',
@@ -307,7 +382,7 @@ Authenticator.prototype = {
maybeCompleteSAMLLogin_: function() {
// SAML login is complete when the user's e-mail address has been retrieved
// from GAIA and the user has successfully confirmed the password.
- if (this.email_ !== null && this.password_ !== null)
+ if (this.email_ !== null && this.passwordBytes_ !== null)
this.completeLogin_();
},
@@ -317,7 +392,7 @@ Authenticator.prototype = {
function(passwords) {
for (var i = 0; i < passwords.length; ++i) {
if (passwords[i] == password) {
- this.password_ = passwords[i];
+ this.passwordBytes_ = passwords[i];
this.maybeCompleteSAMLLogin_();
return;
}
@@ -332,7 +407,7 @@ Authenticator.prototype = {
var msg = e.data;
if (msg.method == 'attemptLogin' && this.isGaiaMessage_(e)) {
this.email_ = msg.email;
- this.password_ = msg.password;
+ this.passwordBytes_ = msg.password;
this.attemptToken_ = msg.attemptToken;
this.chooseWhatToSync_ = msg.chooseWhatToSync;
this.isSAMLFlow_ = false;
@@ -340,7 +415,7 @@ Authenticator.prototype = {
this.supportChannel_.send({name: 'startAuth'});
} else if (msg.method == 'clearOldAttempts' && this.isGaiaMessage_(e)) {
this.email_ = null;
- this.password_ = null;
+ this.passwordBytes_ = null;
this.attemptToken_ = null;
this.isSAMLFlow_ = false;
this.onLoginUILoaded_();
« no previous file with comments | « chrome/browser/resources/gaia_auth/background.js ('k') | chrome/browser/resources/gaia_auth/saml_injected.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698