Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!DOCTYPE html>
<meta charset="utf-8">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/device-bound-session-credentials/helper.js" type="module"></script>
<script type="module">
import {
addCookieAndSessionCleanup,
configureServer,
documentHasCookie,
expireCookie,
setupShardedServerState,
waitForCookie
} from "/device-bound-session-credentials/helper.js";
async function waitForRefresh(cookieAndAttributes, cookieAndValue, expectRefreshed) {
const startTime = Date.now();
const refreshed = await new Promise(resolve => {
async function tryRefresh() {
expireCookie(cookieAndAttributes);
assert_false(documentHasCookie(cookieAndValue));
const authResponseAfterExpiry = await fetch('verify_authenticated.py');
if (authResponseAfterExpiry.status == 200) {
resolve(true);
return;
}
if (!expectRefreshed && Date.now() - startTime >= 1000) {
resolve(false);
return;
}
step_timeout(tryRefresh, 100);
}
tryRefresh();
});
assert_equals(refreshed, expectRefreshed);
}
async function runTest(t, subdomain, expectRegistration) {
await setupShardedServerState();
const expectedCookieAndValue = "auth_cookie=abcdef0123";
const expectedCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`;
const expectedCookieAndAttributes = `${expectedCookieAndValue};${expectedCookieAttributes}`;
addCookieAndSessionCleanup(t);
// Configure the server with the parent domain's origin + cookie
// details instead of the subdomain's.
await configureServer({
"scopeOrigin": location.origin,
"cookieDetails": [
{
"nameAndValue": expectedCookieAndValue,
"attributes": expectedCookieAttributes
}
]
});
// .well-known/device-bound-sessions hardcodes www as allowed, but not www1.
const loginUrl = new URL("/device-bound-session-credentials/login.py", location);
loginUrl.hostname = `${subdomain}.${location.hostname}`;
const loginResponse = await fetch(loginUrl.toString(), {credentials: "include"});
assert_equals(loginResponse.status, 200);
// Wait for the cookie returned by the server providing the session config to
// the user agent.
await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true);
// There is still well-known fetching after that, so we can't conclude yet that
// registration is finished and has either succeeded or failed as expected.
// Trigger repeated refresh attempts to confirm this instead.
await waitForRefresh(expectedCookieAndAttributes, expectedCookieAndValue, /*expectRefresh=*/expectRegistration);
}
promise_test(async t => {
await runTest(t, /*subdomain=*/"www1", /*expectRegistration=*/false);
}, "Registration fails without a .well-known");
promise_test(async t => {
await runTest(t, /*subdomain=*/"www", /*expectRegistration=*/true);
}, "Registration succeeds with a .well-known");
</script>