mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
184 lines
5.6 KiB
JavaScript
184 lines
5.6 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const {utils: Cu} = Components;
|
|
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
Cu.import("resource://services-common/utils.js");
|
|
Cu.import("resource://testing-common/httpd.js");
|
|
|
|
XPCOMUtils.defineLazyModuleGetter(this, "FxAccountsMgmtService",
|
|
"resource://gre/modules/FxAccountsMgmtService.jsm",
|
|
"FxAccountsMgmtService");
|
|
|
|
// At end of test, restore original state
|
|
const ORIGINAL_AUTH_URI = Services.prefs.getCharPref("identity.fxaccounts.auth.uri");
|
|
let { SystemAppProxy } = Cu.import("resource://gre/modules/FxAccountsMgmtService.jsm");
|
|
const ORIGINAL_SENDCUSTOM = SystemAppProxy._sendCustomEvent;
|
|
do_register_cleanup(function() {
|
|
Services.prefs.setCharPref("identity.fxaccounts.auth.uri", ORIGINAL_AUTH_URI);
|
|
SystemAppProxy._sendCustomEvent = ORIGINAL_SENDCUSTOM;
|
|
});
|
|
|
|
// Make profile available so that fxaccounts can store user data
|
|
do_get_profile();
|
|
|
|
// Mock the system app proxy; make message passing possible
|
|
let mockSendCustomEvent = function(aEventName, aMsg) {
|
|
Services.obs.notifyObservers({wrappedJSObject: aMsg}, aEventName, null);
|
|
};
|
|
|
|
function run_test() {
|
|
run_next_test();
|
|
}
|
|
|
|
add_task(function test_overall() {
|
|
do_check_neq(FxAccountsMgmtService, null);
|
|
});
|
|
|
|
// Check that invalid email capitalization is corrected on signIn.
|
|
// https://github.com/mozilla/fxa-auth-server/blob/master/docs/api.md#post-v1accountlogin
|
|
add_test(function test_invalidEmailCase_signIn() {
|
|
do_test_pending();
|
|
let clientEmail = "greta.garbo@gmail.com";
|
|
let canonicalEmail = "Greta.Garbo@gmail.COM";
|
|
let attempts = 0;
|
|
|
|
function writeResp(response, msg) {
|
|
if (typeof msg === "object") {
|
|
msg = JSON.stringify(msg);
|
|
}
|
|
response.bodyOutputStream.write(msg, msg.length);
|
|
}
|
|
|
|
// Mock of the fxa accounts auth server, reproducing the behavior of
|
|
// /account/login when email capitalization is incorrect on signIn.
|
|
let server = httpd_setup({
|
|
"/account/login": function(request, response) {
|
|
response.setHeader("Content-Type", "application/json");
|
|
attempts += 1;
|
|
|
|
// Ensure we don't get in an endless loop
|
|
if (attempts > 2) {
|
|
response.setStatusLine(request.httpVersion, 429, "Sorry, you had your chance");
|
|
writeResp(response, {});
|
|
return;
|
|
}
|
|
|
|
let body = CommonUtils.readBytesFromInputStream(request.bodyInputStream);
|
|
let jsonBody = JSON.parse(body);
|
|
let email = jsonBody.email;
|
|
|
|
// The second time through, the accounts client will call the api with
|
|
// the correct email capitalization.
|
|
if (email == canonicalEmail) {
|
|
response.setStatusLine(request.httpVersion, 200, "Yay");
|
|
writeResp(response, {
|
|
uid: "your-uid",
|
|
sessionToken: "your-sessionToken",
|
|
keyFetchToken: "your-keyFetchToken",
|
|
verified: true,
|
|
authAt: 1392144866,
|
|
});
|
|
return;
|
|
}
|
|
|
|
// If the client has the wrong case on the email, we return a 400, with
|
|
// the capitalization of the email as saved in the accounts database.
|
|
response.setStatusLine(request.httpVersion, 400, "Incorrect email case");
|
|
writeResp(response, {
|
|
code: 400,
|
|
errno: 120,
|
|
error: "Incorrect email case",
|
|
email: canonicalEmail,
|
|
});
|
|
return;
|
|
},
|
|
});
|
|
|
|
// Point the FxAccountsClient's hawk rest request client to the mock server
|
|
Services.prefs.setCharPref("identity.fxaccounts.auth.uri", server.baseURI);
|
|
|
|
// Receive a mozFxAccountsChromeEvent message
|
|
function onMessage(subject, topic, data) {
|
|
let message = subject.wrappedJSObject;
|
|
|
|
switch (message.id) {
|
|
// When we signed in as "Greta.Garbo", the server should have told us
|
|
// that the proper capitalization is really "greta.garbo". Call
|
|
// getAccounts to get the signed-in user and ensure that the
|
|
// capitalization is correct.
|
|
case "signIn":
|
|
FxAccountsMgmtService.handleEvent({
|
|
detail: {
|
|
id: "getAccounts",
|
|
data: {
|
|
method: "getAccounts",
|
|
}
|
|
}
|
|
});
|
|
break;
|
|
|
|
// Having initially signed in as "Greta.Garbo", getAccounts should show
|
|
// us that the signed-in user has the properly-capitalized email,
|
|
// "greta.garbo".
|
|
case "getAccounts":
|
|
Services.obs.removeObserver(onMessage, "mozFxAccountsChromeEvent");
|
|
|
|
do_check_eq(message.data.email, canonicalEmail);
|
|
|
|
do_test_finished();
|
|
server.stop(run_next_test);
|
|
break;
|
|
|
|
// We should not receive any other mozFxAccountsChromeEvent messages
|
|
default:
|
|
do_throw("wat!");
|
|
break;
|
|
}
|
|
}
|
|
|
|
Services.obs.addObserver(onMessage, "mozFxAccountsChromeEvent", false);
|
|
|
|
SystemAppProxy._sendCustomEvent = mockSendCustomEvent;
|
|
|
|
// Trigger signIn using an email with incorrect capitalization
|
|
FxAccountsMgmtService.handleEvent({
|
|
detail: {
|
|
id: "signIn",
|
|
data: {
|
|
method: "signIn",
|
|
email: clientEmail,
|
|
password: "123456",
|
|
},
|
|
},
|
|
});
|
|
});
|
|
|
|
// End of tests
|
|
// Utility functions follow
|
|
|
|
function httpd_setup (handlers, port=-1) {
|
|
let server = new HttpServer();
|
|
for (let path in handlers) {
|
|
server.registerPathHandler(path, handlers[path]);
|
|
}
|
|
try {
|
|
server.start(port);
|
|
} catch (ex) {
|
|
dump("ERROR starting server on port " + port + ". Already a process listening?");
|
|
do_throw(ex);
|
|
}
|
|
|
|
// Set the base URI for convenience.
|
|
let i = server.identity;
|
|
server.baseURI = i.primaryScheme + "://" + i.primaryHost + ":" + i.primaryPort;
|
|
|
|
return server;
|
|
}
|
|
|
|
|