<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="utf8"> <title>Test for the network actor (HPKP detection)</title> <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> <script type="text/javascript;version=1.8" src="common.js"></script> <!-- Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ --> </head> <body> <p>Test for the network actor (HPKP detection)</p> <iframe src="https://example.com/chrome/devtools/shared/webconsole/test/network_requests_iframe.html"></iframe> <script class="testbody" type="text/javascript;version=1.8"> SimpleTest.waitForExplicitFinish(); let gCurrentTestCase = -1; const HPKP_PREF = "security.cert_pinning.process_headers_from_non_builtin_roots"; // Static pins tested by unit/test_security-info-static-hpkp.js. const TEST_CASES = [ { desc: "no Public Key Pinning", url: "https://example.com", usesPinning: false, }, { desc: "dynamic Public Key Pinning with this request", url: "https://include-subdomains.pinning-dynamic.example.com/" + "browser/browser/base/content/test/general/pinning_headers.sjs", usesPinning: true, }, { desc: "dynamic Public Key Pinning with previous request", url: "https://include-subdomains.pinning-dynamic.example.com/", usesPinning: true, } ]; function startTest() { // Need to enable this pref or pinning headers are rejected due test // certificate. Services.prefs.setBoolPref(HPKP_PREF, true); SimpleTest.registerCleanupFunction(() => { Services.prefs.setBoolPref(HPKP_PREF, false); // Reset pinning state. let gSSService = Cc["@mozilla.org/ssservice;1"] .getService(Ci.nsISiteSecurityService); let gIOService = Cc["@mozilla.org/network/io-service;1"] .getService(Ci.nsIIOService); for (let {url} of TEST_CASES) { let uri = gIOService.newURI(url, null, null); gSSService.removeState(Ci.nsISiteSecurityService.HEADER_HPKP, uri, 0); } }); info("Test detection of Public Key Pinning."); removeEventListener("load", startTest); attachConsoleToTab(["NetworkActivity"], onAttach); } function onAttach(aState, aResponse) { onNetworkEventUpdate = onNetworkEventUpdate.bind(null, aState); aState.dbgClient.addListener("networkEventUpdate", onNetworkEventUpdate); runNextCase(aState); } function runNextCase(aState) { gCurrentTestCase++; if (gCurrentTestCase === TEST_CASES.length) { info("Tests ran. Cleaning up."); closeDebugger(aState, SimpleTest.finish); return; } let { desc, url } = TEST_CASES[gCurrentTestCase]; info("Testing site with " + desc); let iframe = document.querySelector("iframe").contentWindow; iframe.wrappedJSObject.makeXhrCallback("GET", url); } function onNetworkEventUpdate(aState, aType, aPacket) { function onSecurityInfo(packet) { let data = TEST_CASES[gCurrentTestCase]; is(packet.securityInfo.hpkp, data.usesPinning, "Public Key Pinning detected correctly."); runNextCase(aState); } if (aPacket.updateType === "securityInfo") { aState.client.getSecurityInfo(aPacket.from, onSecurityInfo); } } addEventListener("load", startTest); </script> </body> </html>