diff --git a/browserid/static/dialog/resources/browserid-identities.js b/browserid/static/dialog/resources/browserid-identities.js index f33acef45da33db6098e2ea7abad44d5e758c681..d5140f92924e18f78f25f170e0d0baf7485cdaa1 100644 --- a/browserid/static/dialog/resources/browserid-identities.js +++ b/browserid/static/dialog/resources/browserid-identities.js @@ -124,7 +124,7 @@ var BrowserIDIdentities = (function() { var email = emails_to_add.shift(); - self.syncIdentity(email, "browserid.org:443", addNextEmail, onFailure); + self.syncIdentity(email, addNextEmail, onFailure); } addNextEmail(); @@ -157,19 +157,21 @@ var BrowserIDIdentities = (function() { * Stage an identity - this creates an identity that must be verified. * Used when creating a new account or resetting the password of an * existing account. + * FIXME: rename to indicate new account * @method stageIdentity * @param {string} email - Email address. * @param {function} [onSuccess] - Called on successful completion. * @param {function} [onFailure] - Called on error. */ stageIdentity: function(email, password, onSuccess, onFailure) { - var self=this, - keypair = CryptoStubs.genKeyPair(); + var self=this; + // FIXME: keysize + var keypair = jwk.KeyPair.generate(vep.params.algorithm, 64); self.stagedEmail = email; self.stagedKeypair = keypair; - network.stageUser(email, password, keypair, function() { + network.stageUser(email, password, function() { if (onSuccess) { onSuccess(keypair); } @@ -186,12 +188,16 @@ var BrowserIDIdentities = (function() { confirmIdentity: function(email, onSuccess, onFailure) { var self = this; if (email === self.stagedEmail) { + var keypair = self.stagedKeypair; + self.stagedEmail = null; + self.stagedKeypair = null; - // FIXME for certs, maybe call certKey here? - self.persistIdentity(self.stagedEmail, self.stagedKeypair, "browserid.org:443", function() { + // certify + Identities.certifyIdentity(email, keypair, function() { self.syncIdentities(onSuccess, onFailure); - }, onFailure); + }); + } else if (onFailure) { onFailure(); @@ -260,6 +266,19 @@ var BrowserIDIdentities = (function() { }, onFailure); }, + /** + * Certify an identity + */ + certifyIdentity: function(email, keypair, onSuccess, onFailure) { + network.certKey(email, keypair.publicKey, function(cert) { + Identities.persistIdentity(email, keypair, cert, function() { + if (onSuccess) { + onSuccess(); + } + }, onFailure); + }, onFailure); + }, + /** * Sync an identity with the server. Creates and stores locally and on the * server a keypair for the given email address. @@ -269,17 +288,11 @@ var BrowserIDIdentities = (function() { * @param {function} [onSuccess] - Called on successful completion. * @param {function} [onFailure] - Called on error. */ - syncIdentity: function(email, issuer, onSuccess, onFailure) { + syncIdentity: function(email, onSuccess, onFailure) { // FIXME use true key sizes //var keypair = jwk.KeyPair.generate(vep.params.algorithm, vep.params.keysize); var keypair = jwk.KeyPair.generate(vep.params.algorithm, 64); - network.certKey(email, keypair.publicKey, function(cert) { - Identities.persistIdentity(email, keypair, cert, issuer, function() { - if (onSuccess) { - onSuccess(keypair); - } - }, onFailure); - }, onFailure); + Identities.certifyIdentity(email, keypair, onSuccess, onFailure); }, /** @@ -293,8 +306,8 @@ var BrowserIDIdentities = (function() { * @param {function} [onFailure] - Called on error. */ addIdentity: function(email, onSuccess, onFailure) { - var self = this, - keypair = CryptoStubs.genKeyPair(); + var self = this; + var keypair = jwk.KeyPair.generate(vep.params.algorithm, 64); self.stagedEmail = email; self.stagedKeypair = keypair; @@ -315,7 +328,7 @@ var BrowserIDIdentities = (function() { * @param {function} [onSuccess] - Called on successful completion. * @param {function} [onFailure] - Called on error. */ - persistIdentity: function(email, keypair, cert, issuer, onSuccess, onFailure) { + persistIdentity: function(email, keypair, cert, onSuccess, onFailure) { var new_email_obj= { created: new Date(), pub: keypair.publicKey.toSimpleObject(), @@ -323,10 +336,6 @@ var BrowserIDIdentities = (function() { cert: cert }; - if (issuer) { - new_email_obj.issuer = issuer; - } - addEmail(email, new_email_obj); if (onSuccess) { @@ -362,7 +371,6 @@ var BrowserIDIdentities = (function() { assertion; if (storedID) { - // assertion = CryptoStubs.createAssertion(network.origin, email, storedID.priv, storedID.issuer); // parse the secret key var sk = jwk.SecretKey.fromSimpleObject(storedID.priv); var tok = new jwt.JWT(null, new Date(), network.origin); diff --git a/browserid/static/dialog/test/qunit/browserid-identities_unit_test.js b/browserid/static/dialog/test/qunit/browserid-identities_unit_test.js index 045e7d50451844a575129e1d1e243bd189e0e15c..39cebdbdc534a13d709a58cc45de61111b3bc7e7 100644 --- a/browserid/static/dialog/test/qunit/browserid-identities_unit_test.js +++ b/browserid/static/dialog/test/qunit/browserid-identities_unit_test.js @@ -38,16 +38,19 @@ * This test assumes for authentication that there is a user named * "testuser@testuser.com" with the password "testuser" */ +var jwk = require("./jwk"); + steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-identities", function() { - var credentialsValid, unknownEmails, keyRefresh, syncValid; + var credentialsValid, unknownEmails, keyRefresh, syncValid, userEmails; var netStub = { reset: function() { credentialsValid = syncValid = true; unknownEmails = []; keyRefresh = []; + userEmails = {"testuser@testuser.com": {}}; }, - stageUser: function(email, password, keypair, onSuccess) { + stageUser: function(email, password, onSuccess) { onSuccess(); }, @@ -59,7 +62,7 @@ steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-iden onSuccess(credentialsValid); }, - addEmail: function(email, keypair, onSuccess, onFailure) { + addEmail: function(email, onSuccess, onFailure) { onSuccess(); }, @@ -67,6 +70,19 @@ steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-iden onSuccess(); }, + listEmails: function(onSuccess, onFailure) { + onSuccess(userEmails); + }, + + certKey: function(email, pubkey, onSuccess, onFailure) { + if (syncValid) { + onSuccess("foocert"); + } + else { + onFailure(); + } + }, + syncEmails: function(issued_identities, onSuccess, onFailure) { onSuccess({ unknown_emails: unknownEmails, @@ -285,7 +301,7 @@ steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-iden clearEmails(); syncValid = true; - BrowserIDIdentities.syncIdentity("testemail@testemail.com", "issuer", function(keypair) { + BrowserIDIdentities.syncIdentity("testemail@testemail.com", function(keypair) { var identities = BrowserIDIdentities.getStoredIdentities(); ok("testemail@testemail.com" in identities, "Valid email is synced"); @@ -300,7 +316,7 @@ steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-iden clearEmails(); syncValid = false; - BrowserIDIdentities.syncIdentity("testemail@testemail.com", "issuer", function(keypair) { + BrowserIDIdentities.syncIdentity("testemail@testemail.com", function(keypair) { ok(false, "sync was invalid, this should have failed"); start(); }, function() { @@ -316,7 +332,8 @@ steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-iden test("persistIdentity", function() { - BrowserIDIdentities.persistIdentity("testemail2@testemail.com", { pub: "pub", priv: "priv" }, undefined, function onSuccess() { + var user_kp = jwk.KeyPair.generate("RS",64); + BrowserIDIdentities.persistIdentity("testemail2@testemail.com", user_kp, undefined, function onSuccess() { var identities = BrowserIDIdentities.getStoredIdentities(); ok("testemail2@testemail.com" in identities, "Our new email is added"); start(); @@ -357,6 +374,8 @@ steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-iden test("syncIdentities with no pre-loaded identities and no identities to add", function() { clearEmails(); + userEmails = {}; + BrowserIDIdentities.syncIdentities(function onSuccess() { var identities = BrowserIDIdentities.getStoredIdentities(); ok(true, "we have synced identities"); @@ -369,7 +388,8 @@ steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-iden test("syncIdentities with no pre-loaded identities and identities to add", function() { clearEmails(); - keyRefresh = ["testuser@testuser.com"]; + userEmails = {"testuser@testuser.com": {}}; + BrowserIDIdentities.syncIdentities(function onSuccess() { var identities = BrowserIDIdentities.getStoredIdentities(); ok("testuser@testuser.com" in identities, "Our new email is added"); @@ -382,6 +402,7 @@ steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-iden test("syncIdentities with identities preloaded and none to add", function() { clearEmails(); + userEmails = {"testuser@testuser.com": {}}; addEmail("testuser@testuser.com", {}); BrowserIDIdentities.syncIdentities(function onSuccess() { @@ -398,7 +419,8 @@ steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-iden test("syncIdentities with identities preloaded and one to add", function() { clearEmails(); addEmail("testuser@testuser.com", {}); - keyRefresh = ["testuser2@testuser.com"]; + userEmails = {"testuser@testuser.com": {}, + "testuser2@testuser.com": {}}; BrowserIDIdentities.syncIdentities(function onSuccess() { var identities = BrowserIDIdentities.getStoredIdentities(); @@ -416,8 +438,8 @@ steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-iden clearEmails(); addEmail("testuser@testuser.com", {}); addEmail("testuser2@testuser.com", {}); - unknownEmails = ["testuser2@testuser.com"]; - + userEmails = {"testuser@testuser.com": {}}; + BrowserIDIdentities.syncIdentities(function onSuccess() { var identities = BrowserIDIdentities.getStoredIdentities(); ok("testuser@testuser.com" in identities, "Our old email address is still there"); @@ -432,13 +454,13 @@ steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-iden test("getIdentityAssertion with known email", function() { clearEmails(); - var keypair = CryptoStubs.genKeyPair(); - addEmail("testuser@testuser.com", { priv: keypair.priv, issuer: "issuer" }); - - BrowserIDIdentities.getIdentityAssertion("testuser@testuser.com", function onSuccess(assertion) { - equal("string", typeof assertion, "we have an assertion!"); - start(); - }); + var keypair = jwk.KeyPair.generate("RS",64); + BrowserIDIdentities.certifyIdentity("testuser@testuser.com", keypair, function() { + BrowserIDIdentities.getIdentityAssertion("testuser@testuser.com", function onSuccess(assertion) { + equal("string", typeof assertion, "we have an assertion!"); + start(); + }); + }, failure("getIdentityAssertion failure")); stop(); }); @@ -446,14 +468,14 @@ steal.plugins("jquery", "funcunit/qunit").then("/dialog/resources/browserid-iden test("getIdentityAssertion with unknown email", function() { clearEmails(); - var keypair = CryptoStubs.genKeyPair(); - addEmail("testuser@testuser.com", { priv: keypair.priv, issuer: "issuer" }); - - BrowserIDIdentities.getIdentityAssertion("testuser2@testuser.com", function onSuccess(assertion) { - equal("undefined", typeof assertion, "email was unknown, we do not have an assertion"); - start(); - }); - + var keypair = jwk.KeyPair.generate("RS",64); + BrowserIDIdentities.certifyIdentity("testuser@testuser.com", keypair, function() { + BrowserIDIdentities.getIdentityAssertion("testuser2@testuser.com", function onSuccess(assertion) { + equal("undefined", typeof assertion, "email was unknown, we do not have an assertion"); + start(); + }); + }, failure("getIdentityAssertion failure")); + stop(); });