[FedCM] Perform CSP checks on the provider URL
Bug: 1233548
Change-Id: I043caf897ef5c344181b86a2773a5c669029f871
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3440497
Commit-Queue: Christian Biesinger <cbiesinger@chromium.org>
Reviewed-by: Yi Gu <yigu@chromium.org>
Reviewed-by: Antonio Sartori <antoniosartori@chromium.org>
Cr-Commit-Position: refs/heads/main@{#969514}
diff --git a/credential-management/fedcm-logout-rps.https.html b/credential-management/fedcm-logout-rps.https.html
index dc35992..d949526 100644
--- a/credential-management/fedcm-logout-rps.https.html
+++ b/credential-management/fedcm-logout-rps.https.html
@@ -26,4 +26,13 @@
url: "https://rp.example/logout.php"
}]);
}, "FederatedCredential.logoutRps() success.");
+
+ fedcm_test(async (t, mock) => {
+ return promise_rejects_dom(t, "NetworkError",
+ FederatedCredential.logoutRps([{
+ accountId: "1234",
+ url: "https://other-rp.example/logout.php"
+ }])
+ );
+ }, "Logout URL should honor Content-Security-Policy.");
</script>
diff --git a/credential-management/fedcm-logout.https.html.headers b/credential-management/fedcm-logout.https.html.headers
new file mode 100644
index 0000000..90454db
--- /dev/null
+++ b/credential-management/fedcm-logout.https.html.headers
@@ -0,0 +1 @@
+Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; connect-src https://rp.example
diff --git a/credential-management/fedcm-revoke.https.html b/credential-management/fedcm-revoke.https.html
index c014724..73ccb85 100644
--- a/credential-management/fedcm-revoke.https.html
+++ b/credential-management/fedcm-revoke.https.html
@@ -25,4 +25,14 @@
const result = FederatedCredential.revoke("foo@bar.com", provider);
return promise_rejects_dom(t, "NetworkError", result);
}, "Error should reject the promise.");
+
+ fedcm_test(async (t, mock) => {
+ var provider = {
+ url: "https://other-idp.example/",
+ clientId: "1",
+ nonce: "1",
+ };
+ const result = FederatedCredential.revoke("foo@bar.com", provider);
+ return promise_rejects_dom(t, "NetworkError", result);
+ }, "Provider URL should honor Content-Security-Policy.");
</script>
diff --git a/credential-management/fedcm-revoke.https.html.headers b/credential-management/fedcm-revoke.https.html.headers
new file mode 100644
index 0000000..fd82d50
--- /dev/null
+++ b/credential-management/fedcm-revoke.https.html.headers
@@ -0,0 +1 @@
+Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; connect-src https://idp.example
diff --git a/credential-management/fedcm.https.html b/credential-management/fedcm.https.html
index 618f0ec..688212e 100644
--- a/credential-management/fedcm.https.html
+++ b/credential-management/fedcm.https.html
@@ -5,6 +5,7 @@
<script src="/resources/testharnessreport.js"></script>
<script type="module">
import {fedcm_test} from './support/fedcm-helper.js';
+
const test_options = {
federated: {
providers: [{
@@ -152,4 +153,18 @@
const token = await navigator.credentials.get(test_options);
assert_equals(token, "a_token");
}, "get after abort should work");
+
+ promise_test(async t => {
+ const result = navigator.credentials.get({
+ federated: {
+ providers: [{
+ url: 'https://other-idp.test/',
+ clientId: '1',
+ nonce: '1',
+ }]
+ }
+ });
+ return promise_rejects_dom(t, "NetworkError", result);
+ }, "Provider URL should honor Content-Security-Policy.");
+
</script>
diff --git a/credential-management/fedcm.https.html.headers b/credential-management/fedcm.https.html.headers
new file mode 100644
index 0000000..e907cdd
--- /dev/null
+++ b/credential-management/fedcm.https.html.headers
@@ -0,0 +1 @@
+Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; connect-src https://idp.test