Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
*/
"use strict";
let cars = Cc["@mozilla.org/security/clientAuthRememberService;1"].getService(
Ci.nsIClientAuthRememberService
);
let certDB = Cc["@mozilla.org/security/x509certdb;1"].getService(
Ci.nsIX509CertDB
);
function getOAWithPartitionKey(
{ scheme = "https", topLevelBaseDomain, port = null } = {},
originAttributes = {}
) {
if (!topLevelBaseDomain || !scheme) {
return originAttributes;
}
return {
...originAttributes,
partitionKey: `(${scheme},${topLevelBaseDomain}${port ? `,${port}` : ""})`,
};
}
// These are not actual server and client certs. The ClientAuthRememberService
// does not care which certs we store decisions for, as long as they're valid.
let [clientCert] = certDB.getCerts();
function addSecurityInfo({ host, topLevelBaseDomain, originAttributes = {} }) {
let attrs = getOAWithPartitionKey({ topLevelBaseDomain }, originAttributes);
cars.rememberDecisionScriptable(host, attrs, clientCert);
}
function testSecurityInfo({
host,
topLevelBaseDomain,
originAttributes = {},
expected = true,
}) {
let attrs = getOAWithPartitionKey({ topLevelBaseDomain }, originAttributes);
let messageSuffix = `for ${host}`;
if (topLevelBaseDomain) {
messageSuffix += ` partitioned under ${topLevelBaseDomain}`;
}
let hasRemembered = cars.hasRememberedDecisionScriptable(host, attrs, {});
Assert.equal(
hasRemembered,
expected,
`CAR ${expected ? "is set" : "is not set"} ${messageSuffix}`
);
}
function addTestEntries() {
let entries = [
{ host: "example.net" },
{ host: "test.example.net" },
{ host: "example.org" },
{ host: "example.com", topLevelBaseDomain: "example.net" },
{
host: "test.example.net",
topLevelBaseDomain: "example.org",
},
{
host: "foo.example.com",
originAttributes: {
privateBrowsingId: 1,
},
},
];
info("Add test state");
entries.forEach(addSecurityInfo);
info("Ensure we have the correct state initially");
entries.forEach(testSecurityInfo);
}
add_task(async () => {
addTestEntries();
info("Should not be set for unrelated host");
[undefined, "example.org", "example.net", "example.com"].forEach(
topLevelBaseDomain =>
testSecurityInfo({
host: "mochit.test",
topLevelBaseDomain,
expected: false,
})
);
info("Should not be set for unrelated subdomain");
testSecurityInfo({ host: "foo.example.net", expected: false });
info("Should not be set for unpartitioned first party");
testSecurityInfo({
host: "example.com",
expected: false,
});
info("Should not be set under different first party");
testSecurityInfo({
host: "example.com",
topLevelBaseDomain: "example.org",
expected: false,
});
testSecurityInfo({
host: "test.example.net",
topLevelBaseDomain: "example.com",
expected: false,
});
info("Should not be set in partitioned context");
["example.com", "example.net", "example.org", "mochi.test"].forEach(
topLevelBaseDomain =>
testSecurityInfo({
host: "foo.example.com",
topLevelBaseDomain,
expected: false,
})
);
// Cleanup
cars.clearRememberedDecisions();
});