Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

"use strict";
var gSSService = Cc["@mozilla.org/ssservice;1"].getService(
Ci.nsISiteSecurityService
);
function Observer() {}
Observer.prototype = {
observe(subject, topic) {
if (topic == "last-pb-context-exited") {
run_next_test();
}
},
};
var gObserver = new Observer();
function cleanup() {
Services.obs.removeObserver(gObserver, "last-pb-context-exited");
gSSService.clearAll();
}
function run_test() {
do_get_profile();
registerCleanupFunction(cleanup);
Services.obs.addObserver(gObserver, "last-pb-context-exited");
add_test(test_part1);
add_test(test_private_browsing1);
add_test(test_private_browsing2);
run_next_test();
}
function test_part1() {
// check that a host not in the list is not identified as an sts host
ok(
!gSSService.isSecureURI(
Services.io.newURI("https://nonexistent.example.com")
)
);
// check that an ancestor domain is not identified as an sts host
ok(!gSSService.isSecureURI(Services.io.newURI("https://com")));
// check that the pref to toggle using the preload list works
Services.prefs.setBoolPref(
"network.stricttransportsecurity.preloadlist",
false
);
ok(
!gSSService.isSecureURI(
)
);
Services.prefs.setBoolPref(
"network.stricttransportsecurity.preloadlist",
true
);
ok(
gSSService.isSecureURI(
)
);
// check that a subdomain is an sts host (includeSubdomains is set)
ok(
gSSService.isSecureURI(
)
);
// check that another subdomain is an sts host (includeSubdomains is set)
ok(
gSSService.isSecureURI(
)
);
// check that a subdomain is not an sts host (includeSubdomains is not set)
ok(
!gSSService.isSecureURI(
)
);
// check that a host with a dot on the end won't break anything
ok(
!gSSService.isSecureURI(
)
);
// check that processing a header with max-age: 0 will remove a preloaded
// site from the list
let uri = Services.io.newURI("https://includesubdomains.preloaded.test");
let subDomainUri = Services.io.newURI(
);
gSSService.processHeader(uri, "max-age=0");
ok(!gSSService.isSecureURI(uri));
ok(!gSSService.isSecureURI(subDomainUri));
// check that processing another header (with max-age non-zero) will
// re-enable a site's sts status
gSSService.processHeader(uri, "max-age=1000");
ok(gSSService.isSecureURI(uri));
// but this time include subdomains was not set, so test for that
ok(!gSSService.isSecureURI(subDomainUri));
gSSService.clearAll();
// check that processing a header with max-age: 0 from a subdomain of a site
// will not remove that (ancestor) site from the list
uri = Services.io.newURI(
);
gSSService.processHeader(uri, "max-age=0");
ok(
gSSService.isSecureURI(
)
);
ok(!gSSService.isSecureURI(uri));
uri = Services.io.newURI(
);
gSSService.processHeader(uri, "max-age=0");
// we received a header with "max-age=0", so we have "no information"
// regarding the sts state of subdomain.includesubdomains.preloaded.test specifically,
// but it is actually still an STS host, because of the preloaded
// includesubdomains.preloaded.test including subdomains.
// Here's a drawing:
// |-- includesubdomains.preloaded.test (in preload list, includes subdomains) IS sts host
// |-- subdomain.includesubdomains.preloaded.test IS sts host
// | `-- another.subdomain.includesubdomains.preloaded.test IS sts host
// `-- sibling.includesubdomains.preloaded.test IS sts host
ok(
gSSService.isSecureURI(
)
);
ok(
gSSService.isSecureURI(
)
);
ok(
gSSService.isSecureURI(
)
);
ok(
gSSService.isSecureURI(
Services.io.newURI(
)
)
);
gSSService.processHeader(uri, "max-age=1000");
// Here's what we have now:
// |-- includesubdomains.preloaded.test (in preload list, includes subdomains) IS sts host
// |-- subdomain.includesubdomains.preloaded.test (include subdomains is false) IS sts host
// | `-- another.subdomain.includesubdomains.preloaded.test IS sts host
// `-- sibling.includesubdomains.preloaded.test IS sts host
// Note that another.subdomain.includesubdomains.preloaded.test IS still an sts host, because
// there exists a superdomain that is sts and asserts includeSubdomains (namely,
// includesubdomains.preloaded.test)
ok(
gSSService.isSecureURI(
)
);
ok(
gSSService.isSecureURI(
)
);
ok(
gSSService.isSecureURI(
Services.io.newURI(
)
)
);
// Test that an expired non-private browsing entry results in correctly
// identifying a host that is on the preload list as no longer sts.
// (This happens when we're in regular browsing mode, we get a header from
// a site on the preload list, and that header later expires. We need to
// then treat that host as no longer an sts host.)
// (sanity check first - this should be in the preload list)
uri = Services.io.newURI("https://includesubdomains2.preloaded.test");
ok(gSSService.isSecureURI(uri));
gSSService.processHeader(uri, "max-age=1");
do_timeout(1250, function () {
ok(!gSSService.isSecureURI(uri));
run_next_test();
});
}
const PRIVATE_ORIGIN_ATTRIBUTES = { privateBrowsingId: 1 };
function test_private_browsing1() {
gSSService.clearAll();
let uri = Services.io.newURI("https://includesubdomains.preloaded.test");
let subDomainUri = Services.io.newURI(
);
// sanity - includesubdomains.preloaded.test is preloaded, includeSubdomains set
ok(gSSService.isSecureURI(uri, PRIVATE_ORIGIN_ATTRIBUTES));
ok(gSSService.isSecureURI(subDomainUri, PRIVATE_ORIGIN_ATTRIBUTES));
gSSService.processHeader(uri, "max-age=0", PRIVATE_ORIGIN_ATTRIBUTES);
ok(!gSSService.isSecureURI(uri, PRIVATE_ORIGIN_ATTRIBUTES));
ok(!gSSService.isSecureURI(subDomainUri, PRIVATE_ORIGIN_ATTRIBUTES));
// check adding it back in
gSSService.processHeader(uri, "max-age=1000", PRIVATE_ORIGIN_ATTRIBUTES);
ok(gSSService.isSecureURI(uri, PRIVATE_ORIGIN_ATTRIBUTES));
// but no includeSubdomains this time
ok(!gSSService.isSecureURI(subDomainUri, PRIVATE_ORIGIN_ATTRIBUTES));
// do the hokey-pokey...
gSSService.processHeader(uri, "max-age=0", PRIVATE_ORIGIN_ATTRIBUTES);
ok(!gSSService.isSecureURI(uri, PRIVATE_ORIGIN_ATTRIBUTES));
ok(!gSSService.isSecureURI(subDomainUri, PRIVATE_ORIGIN_ATTRIBUTES));
// Test that an expired private browsing entry results in correctly
// identifying a host that is on the preload list as no longer sts.
// (This happens when we're in private browsing mode, we get a header from
// a site on the preload list, and that header later expires. We need to
// then treat that host as no longer an sts host.)
// (sanity check first - this should be in the preload list)
uri = Services.io.newURI("https://includesubdomains2.preloaded.test");
ok(gSSService.isSecureURI(uri, PRIVATE_ORIGIN_ATTRIBUTES));
gSSService.processHeader(uri, "max-age=1", PRIVATE_ORIGIN_ATTRIBUTES);
do_timeout(1250, function () {
ok(!gSSService.isSecureURI(uri, PRIVATE_ORIGIN_ATTRIBUTES));
// Simulate leaving private browsing mode
Services.obs.notifyObservers(null, "last-pb-context-exited");
});
}
function test_private_browsing2() {
// if this test gets this far, it means there's a private browsing service
ok(
gSSService.isSecureURI(
)
);
// the includesubdomains.preloaded.test entry has includeSubdomains set
ok(
gSSService.isSecureURI(
)
);
// Now that we're out of private browsing mode, we need to make sure
// we've "forgotten" that we "forgot" this site's sts status.
ok(
gSSService.isSecureURI(
)
);
run_next_test();
}