blob: 3c1eeccbfdfa2a5b0c0ca2780362bd8342383854 [file] [log] [blame]
Alexander Timin1cc31f42020-05-12 16:26:011// Copyright 2020 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
danakjc492bf82020-09-09 20:02:445#include "content/browser/renderer_host/cookie_utils.h"
Alexander Timin1cc31f42020-05-12 16:26:016
7#include "content/browser/devtools/devtools_instrumentation.h"
danakjc492bf82020-09-09 20:02:448#include "content/browser/renderer_host/frame_tree_node.h"
9#include "content/browser/renderer_host/render_frame_host_impl.h"
Alexander Timin1cc31f42020-05-12 16:26:0110#include "content/public/browser/browser_context.h"
11#include "content/public/browser/cookie_access_details.h"
12#include "content/public/common/content_client.h"
Jihwan Marc Kim3e132f12020-05-20 17:33:1913#include "net/cookies/cookie_inclusion_status.h"
Alexander Timin1cc31f42020-05-12 16:26:0114#include "services/metrics/public/cpp/ukm_builders.h"
15
16namespace content {
17
18namespace {
19
Jihwan Marc Kim3e132f12020-05-20 17:33:1920void RecordContextDowngradeUKM(RenderFrameHost* rfh,
21 CookieAccessDetails::Type access_type,
22 const net::CookieInclusionStatus& status,
23 const GURL& url) {
Alexander Timin1cc31f42020-05-12 16:26:0124 DCHECK(rfh);
25 ukm::SourceId source_id = rfh->GetPageUkmSourceId();
26
27 if (access_type == CookieAccessDetails::Type::kRead) {
28 ukm::builders::SchemefulSameSiteContextDowngrade(source_id)
29 .SetRequestPerCookie(status.GetBreakingDowngradeMetricsEnumValue(url))
30 .Record(ukm::UkmRecorder::Get());
31 } else {
32 DCHECK(access_type == CookieAccessDetails::Type::kChange);
33 ukm::builders::SchemefulSameSiteContextDowngrade(source_id)
34 .SetResponsePerCookie(status.GetBreakingDowngradeMetricsEnumValue(url))
35 .Record(ukm::UkmRecorder::Get());
36 }
37}
38
39} // namespace
40
41void SplitCookiesIntoAllowedAndBlocked(
42 const network::mojom::CookieAccessDetailsPtr& cookie_details,
43 CookieAccessDetails* allowed,
44 CookieAccessDetails* blocked) {
45 *allowed =
46 CookieAccessDetails({cookie_details->type,
47 cookie_details->url,
48 cookie_details->site_for_cookies.RepresentativeUrl(),
49 {},
50 /* blocked_by_policy=*/false});
51 *blocked =
52 CookieAccessDetails({cookie_details->type,
53 cookie_details->url,
54 cookie_details->site_for_cookies.RepresentativeUrl(),
55 {},
56 /* blocked_by_policy=*/true});
57
Ayu Ishii2e3998902020-07-14 18:22:3058 for (auto& cookie_and_access_result : cookie_details->cookie_list) {
Lily Chen70c537a2020-07-20 18:02:0959 if (cookie_and_access_result.access_result.status.HasOnlyExclusionReason(
Jihwan Marc Kim3e132f12020-05-20 17:33:1960 net::CookieInclusionStatus::EXCLUDE_USER_PREFERENCES)) {
Ayu Ishii2e3998902020-07-14 18:22:3061 blocked->cookie_list.push_back(
62 std::move(cookie_and_access_result.cookie));
63 } else if (cookie_and_access_result.access_result.status.IsInclude()) {
64 allowed->cookie_list.push_back(
65 std::move(cookie_and_access_result.cookie));
Alexander Timin1cc31f42020-05-12 16:26:0166 }
67 }
68}
69
70void EmitSameSiteCookiesDeprecationWarning(
71 RenderFrameHostImpl* rfh,
72 const network::mojom::CookieAccessDetailsPtr& cookie_details) {
73 RenderFrameHostImpl* root_frame_host = rfh->GetMainFrame();
74
75 if (!root_frame_host->IsCurrent())
76 return;
77
78 bool samesite_treated_as_lax_cookies = false;
79 bool samesite_none_insecure_cookies = false;
Alexander Timin1cc31f42020-05-12 16:26:0180 bool breaking_context_downgrade = false;
81
Ayu Ishii2e3998902020-07-14 18:22:3082 for (const net::CookieWithAccessResult& excluded_cookie :
Alexander Timin1cc31f42020-05-12 16:26:0183 cookie_details->cookie_list) {
Ayu Ishii2e3998902020-07-14 18:22:3084 if (excluded_cookie.access_result.status.ShouldWarn()) {
Lily Chen9de4065b2020-06-24 20:18:4785 samesite_treated_as_lax_cookies =
86 samesite_treated_as_lax_cookies ||
Ayu Ishii2e3998902020-07-14 18:22:3087 excluded_cookie.access_result.status.HasWarningReason(
Jihwan Marc Kim3e132f12020-05-20 17:33:1988 net::CookieInclusionStatus::
Lily Chen9de4065b2020-06-24 20:18:4789 WARN_SAMESITE_UNSPECIFIED_CROSS_SITE_CONTEXT) ||
Ayu Ishii2e3998902020-07-14 18:22:3090 excluded_cookie.access_result.status.HasWarningReason(
Jihwan Marc Kim3e132f12020-05-20 17:33:1991 net::CookieInclusionStatus::
Lily Chen9de4065b2020-06-24 20:18:4792 WARN_SAMESITE_UNSPECIFIED_LAX_ALLOW_UNSAFE);
Alexander Timin1cc31f42020-05-12 16:26:0193
Lily Chen9de4065b2020-06-24 20:18:4794 samesite_none_insecure_cookies =
95 samesite_none_insecure_cookies ||
Ayu Ishii2e3998902020-07-14 18:22:3096 excluded_cookie.access_result.status.HasWarningReason(
Lily Chen9de4065b2020-06-24 20:18:4797 net::CookieInclusionStatus::WARN_SAMESITE_NONE_INSECURE);
98
Alexander Timin1cc31f42020-05-12 16:26:0199 devtools_instrumentation::ReportSameSiteCookieIssue(
100 root_frame_host, excluded_cookie, cookie_details->url,
101 cookie_details->site_for_cookies,
102 cookie_details->type == CookieAccessDetails::Type::kRead
Sigurd Schneiderc579e9e2020-06-17 06:53:02103 ? blink::mojom::SameSiteCookieOperation::kReadCookie
104 : blink::mojom::SameSiteCookieOperation::kSetCookie,
Alexander Timin1cc31f42020-05-12 16:26:01105 cookie_details->devtools_request_id);
106 }
Alexander Timin1cc31f42020-05-12 16:26:01107
Ayu Ishii2e3998902020-07-14 18:22:30108 breaking_context_downgrade =
109 breaking_context_downgrade ||
110 excluded_cookie.access_result.status.HasDowngradeWarning();
Alexander Timin1cc31f42020-05-12 16:26:01111
Ayu Ishii2e3998902020-07-14 18:22:30112 if (excluded_cookie.access_result.status.HasDowngradeWarning()) {
Steven Binglerdad03342020-05-19 17:21:59113 // Unlike with UMA, do not record cookies that have no downgrade warning.
Alexander Timin1cc31f42020-05-12 16:26:01114 RecordContextDowngradeUKM(rfh, cookie_details->type,
Ayu Ishii2e3998902020-07-14 18:22:30115 excluded_cookie.access_result.status,
116 cookie_details->url);
Alexander Timin1cc31f42020-05-12 16:26:01117 }
118 }
119
Alexander Timin1cc31f42020-05-12 16:26:01120 if (samesite_treated_as_lax_cookies) {
121 GetContentClient()->browser()->LogWebFeatureForCurrentPage(
122 rfh, blink::mojom::WebFeature::kCookieNoSameSite);
123 }
124
125 if (samesite_none_insecure_cookies) {
126 GetContentClient()->browser()->LogWebFeatureForCurrentPage(
127 rfh, blink::mojom::WebFeature::kCookieInsecureAndSameSiteNone);
128 }
129
130 if (breaking_context_downgrade) {
131 GetContentClient()->browser()->LogWebFeatureForCurrentPage(
132 rfh, blink::mojom::WebFeature::kSchemefulSameSiteContextDowngrade);
133 }
134}
135
136} // namespace content