| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>DBSC credentials matching</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="helper.js" type="module"></script> |
| |
| <script type="module"> |
| import { expireCookie, documentHasCookie, waitForCookie, addCookieAndSessionCleanup, setupShardedServerState, configureServer, pullServerState} from "./helper.js"; |
| |
| const futureDate = new Date(); |
| futureDate.setFullYear(futureDate.getFullYear() + 1); |
| |
| async function runTest(t, sessionCookieAttributes, requestCookieAttributes, expectCallRefresh) { |
| await setupShardedServerState(); |
| const expectedCookieAndValue = "auth_cookie=abcdef0123"; |
| const expectedAttributes = sessionCookieAttributes; |
| const expectedCookieAndAttributes = `${expectedCookieAndValue};${expectedAttributes}`; |
| addCookieAndSessionCleanup(t); |
| |
| // Configure server to set the session credentials and the associated Set-Cookie header. |
| configureServer({ cookieDetails: [{ attributes: expectedAttributes }] }); |
| |
| // Prompt starting a session, and wait until registration completes. |
| const loginResponse = await fetch('login.py'); |
| assert_equals(loginResponse.status, 200); |
| await waitForCookie(expectedCookieAndValue, /*expectCookie=*/true); |
| |
| // Confirm that a request has the cookie set. |
| const authResponse = await fetch('verify_authenticated.py'); |
| assert_equals(authResponse.status, 200); |
| |
| // Delete the cookie, and replace it with a similar cookie with custom attributes. |
| expireCookie(expectedCookieAndAttributes); |
| assert_false(documentHasCookie(expectedCookieAndValue)); |
| await fetch('set_cookie.py', { |
| method: 'POST', |
| body: `${expectedCookieAndValue};${requestCookieAttributes}`, |
| }); |
| |
| // Send a request. Then, confirm refresh was or was not sent. |
| const authResponseAfterExpiry = await fetch('verify_authenticated.py'); |
| assert_equals(authResponseAfterExpiry.status, 200); |
| assert_true(documentHasCookie(expectedCookieAndValue)); |
| const serverState = await pullServerState(); |
| assert_equals(serverState.hasCalledRefresh, expectCallRefresh); |
| } |
| |
| promise_test(async t => { |
| const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`; |
| const requestCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;Expires=${futureDate.toUTCString()}`; |
| await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/false); |
| }, "Expires attribute in credentials doesn't affect matching"); |
| |
| promise_test(async t => { |
| const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`; |
| const requestCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;Max-Age=86400`; |
| await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/false); |
| }, "Max-Age attribute in credentials doesn't affect matching"); |
| |
| promise_test(async t => { |
| const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`; |
| const requestCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;HttpOnly`; |
| await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true); |
| }, "HttpOnly attribute in credentials affects matching"); |
| |
| promise_test(async t => { |
| const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`; |
| const requestCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;SameSite=Strict`; |
| await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true); |
| }, "SameSite attribute in credentials affects matching"); |
| |
| promise_test(async t => { |
| const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`; |
| const requestCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;Secure`; |
| await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true); |
| }, "Secure attribute in credentials affects matching"); |
| |
| promise_test(async t => { |
| const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials`; |
| const requestCookieAttributes = `Domain=${location.hostname};Path=/`; |
| await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true); |
| }, "Path attribute in credentials affects matching"); |
| |
| promise_test(async t => { |
| const sessionCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;Secure`; |
| const requestCookieAttributes = `Domain=${location.hostname};Path=/device-bound-session-credentials;Partitioned;Secure`; |
| await runTest(t, sessionCookieAttributes, requestCookieAttributes, /*expectCallRefresh=*/true); |
| }, "Partition attribute in credentials affects matching"); |
| </script> |