216 lines
6.4 KiB
JavaScript
216 lines
6.4 KiB
JavaScript
const { NetUtil } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/NetUtil.sys.mjs"
|
|
);
|
|
|
|
function inChildProcess() {
|
|
return Services.appinfo.processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
|
|
}
|
|
|
|
const { CookieXPCShellUtils } = ChromeUtils.importESModule(
|
|
"resource://testing-common/CookieXPCShellUtils.sys.mjs"
|
|
);
|
|
|
|
let CookieXPCShellUtilsInitialized = false;
|
|
function maybeInitializeCookieXPCShellUtils() {
|
|
if (!CookieXPCShellUtilsInitialized) {
|
|
CookieXPCShellUtilsInitialized = true;
|
|
CookieXPCShellUtils.init(this);
|
|
|
|
CookieXPCShellUtils.createServer({ hosts: ["example.org"] });
|
|
}
|
|
}
|
|
|
|
// Don't pick up default permissions from profile.
|
|
Services.prefs.setCharPref("permissions.manager.defaultsUrl", "");
|
|
|
|
add_task(async _ => {
|
|
do_get_profile();
|
|
|
|
// Allow all cookies if the pref service is available in this process.
|
|
if (!inChildProcess()) {
|
|
Services.prefs.setIntPref("network.cookie.cookieBehavior", 0);
|
|
Services.prefs.setBoolPref(
|
|
"network.cookieJarSettings.unblocked_for_testing",
|
|
true
|
|
);
|
|
}
|
|
|
|
info("Let's set a cookie from HTTP example.org");
|
|
|
|
let uri = NetUtil.newURI("http://example.org/");
|
|
let principal = Services.scriptSecurityManager.createContentPrincipal(
|
|
uri,
|
|
{}
|
|
);
|
|
let channel = NetUtil.newChannel({
|
|
uri,
|
|
loadingPrincipal: principal,
|
|
securityFlags: Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
|
|
contentPolicyType: Ci.nsIContentPolicy.TYPE_OTHER,
|
|
});
|
|
|
|
Services.cookies.setCookieStringFromHttp(uri, "a=b; sameSite=lax", channel);
|
|
|
|
let cookies = Services.cookies.getCookiesFromHost("example.org", {});
|
|
Assert.equal(cookies.length, 1, "We expect 1 cookie only");
|
|
|
|
Assert.equal(cookies[0].schemeMap, Ci.nsICookie.SCHEME_HTTP, "HTTP Scheme");
|
|
|
|
info("Let's set a cookie from HTTPS example.org");
|
|
|
|
uri = NetUtil.newURI("https://example.org/");
|
|
principal = Services.scriptSecurityManager.createContentPrincipal(uri, {});
|
|
channel = NetUtil.newChannel({
|
|
uri,
|
|
loadingPrincipal: principal,
|
|
securityFlags: Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
|
|
contentPolicyType: Ci.nsIContentPolicy.TYPE_OTHER,
|
|
});
|
|
|
|
Services.cookies.setCookieStringFromHttp(uri, "a=b; sameSite=lax", channel);
|
|
|
|
cookies = Services.cookies.getCookiesFromHost("example.org", {});
|
|
Assert.equal(cookies.length, 1, "We expect 1 cookie only");
|
|
|
|
Assert.equal(
|
|
cookies[0].schemeMap,
|
|
Ci.nsICookie.SCHEME_HTTP | Ci.nsICookie.SCHEME_HTTPS,
|
|
"HTTP + HTTPS Schemes"
|
|
);
|
|
|
|
Services.cookies.removeAll();
|
|
});
|
|
|
|
[true, false].forEach(schemefulComparison => {
|
|
add_task(async () => {
|
|
do_get_profile();
|
|
Services.prefs.setBoolPref("dom.security.https_first", false);
|
|
|
|
maybeInitializeCookieXPCShellUtils();
|
|
|
|
// Allow all cookies if the pref service is available in this process.
|
|
if (!inChildProcess()) {
|
|
Services.prefs.setBoolPref(
|
|
"network.cookie.sameSite.schemeful",
|
|
schemefulComparison
|
|
);
|
|
Services.prefs.setIntPref("network.cookie.cookieBehavior", 0);
|
|
Services.prefs.setBoolPref(
|
|
"network.cookieJarSettings.unblocked_for_testing",
|
|
true
|
|
);
|
|
}
|
|
|
|
info(
|
|
`Testing schemefulSameSite=${schemefulComparison}. Let's set a cookie from HTTPS example.org`
|
|
);
|
|
|
|
let https_uri = NetUtil.newURI("https://example.org/");
|
|
let https_principal = Services.scriptSecurityManager.createContentPrincipal(
|
|
https_uri,
|
|
{}
|
|
);
|
|
let same_site_channel = NetUtil.newChannel({
|
|
uri: https_uri,
|
|
loadingPrincipal: https_principal,
|
|
securityFlags: Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
|
|
contentPolicyType: Ci.nsIContentPolicy.TYPE_OTHER,
|
|
});
|
|
|
|
Services.cookies.setCookieStringFromHttp(
|
|
https_uri,
|
|
"a=b; sameSite=lax",
|
|
same_site_channel
|
|
);
|
|
|
|
let cookies = Services.cookies.getCookieStringFromHttp(
|
|
https_uri,
|
|
same_site_channel
|
|
);
|
|
Assert.equal(cookies, "a=b", "Cookies match");
|
|
|
|
let http_uri = NetUtil.newURI("http://example.org/");
|
|
let http_principal = Services.scriptSecurityManager.createContentPrincipal(
|
|
http_uri,
|
|
{}
|
|
);
|
|
let cross_site_channel = NetUtil.newChannel({
|
|
uri: https_uri,
|
|
loadingPrincipal: http_principal,
|
|
securityFlags: Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
|
|
contentPolicyType: Ci.nsIContentPolicy.TYPE_OTHER,
|
|
});
|
|
|
|
cookies = Services.cookies.getCookieStringFromHttp(
|
|
http_uri,
|
|
cross_site_channel
|
|
);
|
|
if (schemefulComparison) {
|
|
Assert.equal(cookies, "", "No http(s) cookie for different scheme!");
|
|
} else {
|
|
Assert.equal(cookies, "a=b", "http(s) Cookie even for differentscheme!");
|
|
}
|
|
|
|
// SameSite cookies are included via document.domain
|
|
cookies = await CookieXPCShellUtils.getCookieStringFromDocument(
|
|
http_uri.spec
|
|
);
|
|
Assert.equal(cookies, "a=b", "document.cookie even for different scheme!");
|
|
|
|
Services.cookies.removeAll();
|
|
Services.prefs.clearUserPref("dom.security.https_first");
|
|
});
|
|
});
|
|
|
|
add_task(async _ => {
|
|
do_get_profile();
|
|
Services.prefs.setBoolPref("dom.security.https_first", false);
|
|
|
|
// Allow all cookies if the pref service is available in this process.
|
|
if (!inChildProcess()) {
|
|
Services.prefs.setIntPref("network.cookie.cookieBehavior", 0);
|
|
Services.prefs.setBoolPref(
|
|
"network.cookieJarSettings.unblocked_for_testing",
|
|
true
|
|
);
|
|
}
|
|
|
|
info("Let's set a cookie without scheme");
|
|
Services.cookies.add(
|
|
"example.org",
|
|
"/",
|
|
"a",
|
|
"b",
|
|
false,
|
|
false,
|
|
false,
|
|
Math.floor(Date.now() / 1000 + 1000),
|
|
{},
|
|
Ci.nsICookie.SAMESITE_LAX,
|
|
Ci.nsICookie.SCHEME_UNSET
|
|
);
|
|
|
|
let cookies = Services.cookies.getCookiesFromHost("example.org", {});
|
|
Assert.equal(cookies.length, 1, "We expect 1 cookie only");
|
|
Assert.equal(cookies[0].schemeMap, Ci.nsICookie.SCHEME_UNSET, "Unset scheme");
|
|
|
|
["https", "http"].forEach(scheme => {
|
|
let uri = NetUtil.newURI(scheme + "://example.org/");
|
|
let principal = Services.scriptSecurityManager.createContentPrincipal(
|
|
uri,
|
|
{}
|
|
);
|
|
let channel = NetUtil.newChannel({
|
|
uri,
|
|
loadingPrincipal: principal,
|
|
securityFlags: Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
|
|
contentPolicyType: Ci.nsIContentPolicy.TYPE_OTHER,
|
|
});
|
|
|
|
cookies = Services.cookies.getCookieStringFromHttp(uri, channel);
|
|
Assert.equal(cookies, "a=b", "Cookie for unset scheme");
|
|
});
|
|
|
|
Services.cookies.removeAll();
|
|
Services.prefs.clearUserPref("dom.security.https_first");
|
|
});
|