Commit f3b221b0 authored by arthursonzogni's avatar arthursonzogni Committed by Commit Bot

[COOP] access reporting: Extend report.body.type values.

Split the report.body.type:

From:
  access-to-coop-page
  access-from-coop-page

To:
  access-from-coop-page-to-opener
  access-from-coop-page-to-openee
  access-from-coop-page-to-other
  access-to-coop-page-from-opener
  access-to-coop-page-from-openee
  access-to-coop-page-from-other

to match with the new specification updates.

Bug: 1090273
Change-Id: Ia8b9af6b2751ba5154f1c56793d01542cd736bad
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2356404Reviewed-by: default avatarMike West <mkwst@chromium.org>
Reviewed-by: default avatarCamille Lamy <clamy@chromium.org>
Commit-Queue: Arthur Sonzogni <arthursonzogni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#800157}
parent 99f89b83
...@@ -53,10 +53,18 @@ std::string ToString(network::mojom::CrossOriginOpenerPolicyValue coop_value) { ...@@ -53,10 +53,18 @@ std::string ToString(network::mojom::CrossOriginOpenerPolicyValue coop_value) {
const char* ToString(network::mojom::CoopAccessReportType report_type) { const char* ToString(network::mojom::CoopAccessReportType report_type) {
switch (report_type) { switch (report_type) {
case network::mojom::CoopAccessReportType::kReportAccessTo: case network::mojom::CoopAccessReportType::kAccessFromCoopPageToOpener:
return "access-to-coop-page"; return "access-from-coop-page-to-opener";
case network::mojom::CoopAccessReportType::kReportAccessFrom: case network::mojom::CoopAccessReportType::kAccessFromCoopPageToOpenee:
return "access-from-coop-page"; return "access-from-coop-page-to-openee";
case network::mojom::CoopAccessReportType::kAccessFromCoopPageToOther:
return "access-from-coop-page-to-other";
case network::mojom::CoopAccessReportType::kAccessToCoopPageFromOpener:
return "access-to-coop-page-from-opener";
case network::mojom::CoopAccessReportType::kAccessToCoopPageFromOpenee:
return "access-to-coop-page-from-openee";
case network::mojom::CoopAccessReportType::kAccessToCoopPageFromOther:
return "access-to-coop-page-from-other";
} }
} }
...@@ -100,6 +108,11 @@ std::vector<FrameTreeNode*> CollectOtherWindowForCoopAccess( ...@@ -100,6 +108,11 @@ std::vector<FrameTreeNode*> CollectOtherWindowForCoopAccess(
return out; return out;
} }
FrameTreeNode* TopLevelOpener(FrameTreeNode* frame) {
FrameTreeNode* opener = frame->original_opener();
return opener ? opener->frame_tree()->root() : nullptr;
}
} // namespace } // namespace
CrossOriginOpenerPolicyReporter::CrossOriginOpenerPolicyReporter( CrossOriginOpenerPolicyReporter::CrossOriginOpenerPolicyReporter(
...@@ -188,8 +201,8 @@ void CrossOriginOpenerPolicyReporter::QueueAccessReport( ...@@ -188,8 +201,8 @@ void CrossOriginOpenerPolicyReporter::QueueAccessReport(
ToString(coop_.report_only_value)); ToString(coop_.report_only_value));
body.SetStringPath(kProperty, property); body.SetStringPath(kProperty, property);
// TODO(arthursonzogni): Fill "blocked-window-url". // TODO(arthursonzogni): Fill "blocked-window-url".
if (source_location->url != "" && if (network::IsAccessFromCoopPage(report_type) &&
report_type == network::mojom::CoopAccessReportType::kReportAccessFrom) { source_location->url != "") {
body.SetStringPath(kSourceFile, source_location->url); body.SetStringPath(kSourceFile, source_location->url);
body.SetIntPath(kLineNumber, source_location->line); body.SetIntPath(kLineNumber, source_location->line);
body.SetIntPath(kColumnNumber, source_location->column); body.SetIntPath(kColumnNumber, source_location->column);
...@@ -278,10 +291,26 @@ void CrossOriginOpenerPolicyReporter::MonitorAccesses( ...@@ -278,10 +291,26 @@ void CrossOriginOpenerPolicyReporter::MonitorAccesses(
remote_reporter; remote_reporter;
Clone(remote_reporter.InitWithNewPipeAndPassReceiver()); Clone(remote_reporter.InitWithNewPipeAndPassReceiver());
network::mojom::CoopAccessReportType report_type = bool access_from_coop_page =
accessing_node->current_frame_host()->coop_reporter() == this this == accessing_node->current_frame_host()->coop_reporter();
? network::mojom::CoopAccessReportType::kReportAccessFrom
: network::mojom::CoopAccessReportType::kReportAccessTo; using network::mojom::CoopAccessReportType;
CoopAccessReportType report_type;
if (access_from_coop_page) {
if (accessing_node == TopLevelOpener(accessed_node))
report_type = CoopAccessReportType::kAccessFromCoopPageToOpenee;
else if (accessed_node == TopLevelOpener(accessing_node))
report_type = CoopAccessReportType::kAccessFromCoopPageToOpener;
else
report_type = CoopAccessReportType::kAccessFromCoopPageToOther;
} else {
if (accessed_node == TopLevelOpener(accessing_node))
report_type = CoopAccessReportType::kAccessToCoopPageFromOpenee;
else if (accessing_node == TopLevelOpener(accessed_node))
report_type = CoopAccessReportType::kAccessToCoopPageFromOpener;
else
report_type = CoopAccessReportType::kAccessToCoopPageFromOther;
}
accessing_rfh->GetAssociatedLocalMainFrame()->InstallCoopAccessMonitor( accessing_rfh->GetAssociatedLocalMainFrame()->InstallCoopAccessMonitor(
report_type, accessed_window_token, std::move(remote_reporter)); report_type, accessed_window_token, std::move(remote_reporter));
......
...@@ -25,4 +25,17 @@ bool CrossOriginOpenerPolicy::operator==( ...@@ -25,4 +25,17 @@ bool CrossOriginOpenerPolicy::operator==(
report_only_reporting_endpoint == other.report_only_reporting_endpoint; report_only_reporting_endpoint == other.report_only_reporting_endpoint;
} }
bool IsAccessFromCoopPage(mojom::CoopAccessReportType type) {
switch (type) {
case mojom::CoopAccessReportType::kAccessFromCoopPageToOpener:
case mojom::CoopAccessReportType::kAccessFromCoopPageToOpenee:
case mojom::CoopAccessReportType::kAccessFromCoopPageToOther:
return true;
case mojom::CoopAccessReportType::kAccessToCoopPageFromOpener:
case mojom::CoopAccessReportType::kAccessToCoopPageFromOpenee:
case mojom::CoopAccessReportType::kAccessToCoopPageFromOther:
return false;
}
}
} // namespace network } // namespace network
...@@ -31,6 +31,9 @@ struct COMPONENT_EXPORT(NETWORK_CPP_BASE) CrossOriginOpenerPolicy final { ...@@ -31,6 +31,9 @@ struct COMPONENT_EXPORT(NETWORK_CPP_BASE) CrossOriginOpenerPolicy final {
base::Optional<std::string> report_only_reporting_endpoint; base::Optional<std::string> report_only_reporting_endpoint;
}; };
COMPONENT_EXPORT(NETWORK_CPP_BASE)
bool IsAccessFromCoopPage(mojom::CoopAccessReportType);
} // namespace network } // namespace network
#endif // SERVICES_NETWORK_PUBLIC_CPP_CROSS_ORIGIN_OPENER_POLICY_H_ #endif // SERVICES_NETWORK_PUBLIC_CPP_CROSS_ORIGIN_OPENER_POLICY_H_
...@@ -9,8 +9,12 @@ import "mojo/public/mojom/base/unguessable_token.mojom"; ...@@ -9,8 +9,12 @@ import "mojo/public/mojom/base/unguessable_token.mojom";
import "services/network/public/mojom/source_location.mojom"; import "services/network/public/mojom/source_location.mojom";
enum CoopAccessReportType { enum CoopAccessReportType {
kReportAccessFrom, // The reports are sent to the 'accessing window'. kAccessFromCoopPageToOpener,
kReportAccessTo, // The reports are sent to the 'accessed window'. kAccessFromCoopPageToOpenee,
kAccessFromCoopPageToOther,
kAccessToCoopPageFromOpener,
kAccessToCoopPageFromOpenee,
kAccessToCoopPageFromOther,
}; };
// Reports potential COOP violations. Implemented in the browser process. // Reports potential COOP violations. Implemented in the browser process.
......
...@@ -501,8 +501,7 @@ void DOMWindow::ReportCoopAccess(const char* property_name) { ...@@ -501,8 +501,7 @@ void DOMWindow::ReportCoopAccess(const char* property_name) {
// TODO(arthursonzogni): Dispatch a console error/warning message. // TODO(arthursonzogni): Dispatch a console error/warning message.
// Send a coop-access-violation report. // Send a coop-access-violation report.
if (it->report_type == if (network::IsAccessFromCoopPage(it->report_type)) {
network::mojom::CoopAccessReportType::kReportAccessFrom) {
ReportingContext::From(accessing_main_frame.DomWindow()) ReportingContext::From(accessing_main_frame.DomWindow())
->QueueReport(MakeGarbageCollected<Report>( ->QueueReport(MakeGarbageCollected<Report>(
ReportType::kCoopAccessViolation, ReportType::kCoopAccessViolation,
......
...@@ -39,11 +39,11 @@ promise_test(async t => { ...@@ -39,11 +39,11 @@ promise_test(async t => {
tryAccess(openee); tryAccess(openee);
// 3. Check a report is sent to the openee. // 3. Check a report is sent to the openee.
let report = await receiveReport(report_token, "access-to-coop-page") let report =
await receiveReport(report_token, "access-to-coop-page-from-opener")
assert_not_equals(report, "timeout", "Report not received"); assert_not_equals(report, "timeout", "Report not received");
assert_equals(report.type, "coop"); assert_equals(report.type, "coop");
assert_equals(report.url, openee_url.replace(/"/g, '%22')); assert_equals(report.url, openee_url.replace(/"/g, '%22'));
assert_equals(report.body.type, "access-to-coop-page");
assert_equals(report.body.disposition, "reporting"); assert_equals(report.body.disposition, "reporting");
assert_equals(report.body.effectivePolicy, "same-origin-plus-coep"); assert_equals(report.body.effectivePolicy, "same-origin-plus-coep");
assert_equals(report.body.property, "blur"); assert_equals(report.body.property, "blur");
......
...@@ -58,11 +58,11 @@ promise_test(async t => { ...@@ -58,11 +58,11 @@ promise_test(async t => {
`); `);
// 5. Check a report sent to the opener. // 5. Check a report sent to the opener.
let report = await receiveReport(opener_report_token, "access-from-coop-page") let report =
await receiveReport(opener_report_token, "access-from-coop-page-to-openee")
assert_not_equals(report, "timeout", "Report not received"); assert_not_equals(report, "timeout", "Report not received");
assert_equals(report.type, "coop"); assert_equals(report.type, "coop");
assert_equals(report.url, opener_url.replace(/"/g, '%22')); assert_equals(report.url, opener_url.replace(/"/g, '%22'));
assert_equals(report.body.type, "access-from-coop-page");
assert_equals(report.body.disposition, "reporting"); assert_equals(report.body.disposition, "reporting");
assert_equals(report.body.effectivePolicy, "same-origin-plus-coep"); assert_equals(report.body.effectivePolicy, "same-origin-plus-coep");
assert_equals(report.body.property, "blur"); assert_equals(report.body.property, "blur");
......
...@@ -33,11 +33,11 @@ promise_test(async t => { ...@@ -33,11 +33,11 @@ promise_test(async t => {
`); `);
// 2. Check a report is sent to the openee. // 2. Check a report is sent to the openee.
let report = await receiveReport(report_token, "access-from-coop-page") let report =
await receiveReport(report_token, "access-from-coop-page-to-opener")
assert_not_equals(report, "timeout", "Report not received"); assert_not_equals(report, "timeout", "Report not received");
assert_equals(report.type, "coop"); assert_equals(report.type, "coop");
assert_equals(report.url, openee_url.replace(/"/g, '%22')); assert_equals(report.url, openee_url.replace(/"/g, '%22'));
assert_equals(report.body.type, "access-from-coop-page");
assert_equals(report.body.disposition, "reporting"); assert_equals(report.body.disposition, "reporting");
assert_equals(report.body.effectivePolicy, "same-origin-plus-coep"); assert_equals(report.body.effectivePolicy, "same-origin-plus-coep");
assert_equals(report.body.property, "blur"); assert_equals(report.body.property, "blur");
......
...@@ -52,11 +52,11 @@ promise_test(async t => { ...@@ -52,11 +52,11 @@ promise_test(async t => {
`); `);
// 4. Check a report sent to the opener. // 4. Check a report sent to the opener.
let report = await receiveReport(opener_report_token, "access-to-coop-page") let report =
await receiveReport(opener_report_token, "access-to-coop-page-from-openee")
assert_not_equals(report, "timeout", "Report not received"); assert_not_equals(report, "timeout", "Report not received");
assert_equals(report.type, "coop"); assert_equals(report.type, "coop");
assert_equals(report.url, opener_url.replace(/"/g, '%22')); assert_equals(report.url, opener_url.replace(/"/g, '%22'));
assert_equals(report.body.type, "access-to-coop-page");
assert_equals(report.body.disposition, "reporting"); assert_equals(report.body.disposition, "reporting");
assert_equals(report.body.effectivePolicy, "same-origin-plus-coep"); assert_equals(report.body.effectivePolicy, "same-origin-plus-coep");
assert_equals(report.body.property, "blur"); assert_equals(report.body.property, "blur");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment