diff options
Diffstat (limited to 'toolkit/components/reputationservice/test/unit/test_login_rep.js')
-rw-r--r-- | toolkit/components/reputationservice/test/unit/test_login_rep.js | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/toolkit/components/reputationservice/test/unit/test_login_rep.js b/toolkit/components/reputationservice/test/unit/test_login_rep.js new file mode 100644 index 0000000000..14f0918968 --- /dev/null +++ b/toolkit/components/reputationservice/test/unit/test_login_rep.js @@ -0,0 +1,183 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const { NetUtil } = ChromeUtils.import("resource://gre/modules/NetUtil.jsm"); + +// LoginReputationService +const gLoginRep = Cc[ + "@mozilla.org/reputationservice/login-reputation-service;1" +].getService(Ci.nsILoginReputationService); + +let gListManager = Cc["@mozilla.org/url-classifier/listmanager;1"].getService( + Ci.nsIUrlListManager +); + +var gHttpServ = null; + +const whitelistedURI = "http://foo:bar@whitelisted.com/index.htm#junk"; +const exampleURI = "http://user:password@example.com/i.html?foo=bar"; + +const LOCAL_WHITELIST_DATA = { + tableName: "test-passwordwhite-proto", + providerName: "test", + updateUrl: "http://localhost:5555/safebrowsing/update?", + gethashUrl: "", +}; + +add_task(async function test_setup() { + // Enable login reputation service + Services.prefs.setBoolPref("browser.safebrowsing.passwords.enabled", true); + gLoginRep.init(); + + // Setup local whitelist table. + Services.prefs.setCharPref( + "urlclassifier.passwordAllowTable", + "test-passwordwhite-proto" + ); + gListManager.registerTable( + LOCAL_WHITELIST_DATA.tableName, + LOCAL_WHITELIST_DATA.providerName, + LOCAL_WHITELIST_DATA.updateUrl, + LOCAL_WHITELIST_DATA.gethashUrl + ); + + registerCleanupFunction(function () { + gListManager.unregisterTable(LOCAL_WHITELIST_DATA.tableName); + + Services.prefs.clearUserPref("browser.safebrowsing.passwords.enabled"); + Services.prefs.clearUserPref("urlclassifier.passwordAllowTable"); + }); +}); + +add_test(function test_setup_local_whitelist() { + // Setup the http server for SafeBrowsing update, so we can save SAFE entries + // to SafeBrowsing database while update. + gHttpServ = new HttpServer(); + gHttpServ.registerDirectory("/", do_get_cwd()); + gHttpServ.registerPathHandler( + "/safebrowsing/update", + function (request, response) { + response.setHeader( + "Content-Type", + "application/vnd.google.safebrowsing-update", + false + ); + + response.setStatusLine(request.httpVersion, 200, "OK"); + + // The protobuf binary represention of response: + // + // [ + // { + // 'threat_type': 8, // CSD_WHITELIST + // 'response_type': 2, // FULL_UPDATE + // 'new_client_state': 'sta\x00te', // NEW_CLIENT_STATE + // 'checksum': { "sha256": CHECKSUM }, // CHECKSUM + // 'additions': { 'compression_type': RAW, + // 'prefix_size': 32, + // 'raw_hashes': "whitelisted.com/index.htm"} + // } + // ] + // + let content = + "\x0A\x36\x08\x08\x20\x02\x2A\x28\x08\x01\x12\x24\x08" + + "\x20\x12\x20\x0F\xE4\x66\xBB\xDD\x34\xAB\x1E\xF7\x8F" + + "\xDD\x9D\x8C\xF8\x9F\x4E\x42\x97\x92\x86\x02\x03\xE0" + + "\xE9\x60\xBD\xD6\x3A\x85\xCD\x08\xD0\x3A\x06\x73\x74" + + "\x61\x00\x74\x65\x12\x04\x08\x0C\x10\x0A"; + + response.bodyOutputStream.write(content, content.length); + } + ); + + gHttpServ.start(5555); + + // Trigger the update once http server is ready. + Services.obs.addObserver(function (aSubject, aTopic, aData) { + if (aData.startsWith("success")) { + run_next_test(); + } else { + do_throw("update fail"); + } + }, "safebrowsing-update-finished"); + gListManager.forceUpdates(LOCAL_WHITELIST_DATA.tableName); + + registerCleanupFunction(function () { + return (async function () { + await new Promise(resolve => { + gHttpServ.stop(resolve); + }); + })(); + }); +}); + +add_test(function test_disable() { + Services.prefs.setBoolPref("browser.safebrowsing.passwords.enabled", false); + + gLoginRep.queryReputation( + { + formURI: NetUtil.newURI("http://example.com"), + }, + { + onComplete(aStatus, aVerdict) { + Assert.equal(aStatus, Cr.NS_ERROR_ABORT); + Assert.equal(aVerdict, Ci.nsILoginReputationVerdictType.UNSPECIFIED); + + Services.prefs.setBoolPref( + "browser.safebrowsing.passwords.enabled", + true + ); + + run_next_test(); + }, + } + ); +}); + +add_test(function test_nullQuery() { + try { + gLoginRep.queryReputation(null, { + onComplete(aStatus, aVerdict) {}, + }); + do_throw("Query parameter cannot be null"); + } catch (ex) { + Assert.equal(ex.result, Cr.NS_ERROR_INVALID_POINTER); + + run_next_test(); + } +}); + +add_test(function test_local_whitelist() { + gLoginRep.queryReputation( + { + formURI: NetUtil.newURI(whitelistedURI), + }, + { + onComplete(aStatus, aVerdict) { + Assert.equal(aStatus, Cr.NS_OK); + Assert.equal(aVerdict, Ci.nsILoginReputationVerdictType.SAFE); + + run_next_test(); + }, + } + ); +}); + +add_test(function test_notin_local_whitelist() { + gLoginRep.queryReputation( + { + formURI: NetUtil.newURI(exampleURI), + }, + { + onComplete(aStatus, aVerdict) { + Assert.equal(aStatus, Cr.NS_OK); + Assert.equal(aVerdict, Ci.nsILoginReputationVerdictType.UNSPECIFIED); + + run_next_test(); + }, + } + ); +}); |