Skip to content

Commit 43acf25

Browse files
authored
Merge pull request #14612 from brave/pr14338_mpilgrim_accept_language_subresources_1.42.x
Farble Accept-Language header on subresources (uplift to 1.42.x)
2 parents 8e476db + 269e7e9 commit 43acf25

13 files changed

+196
-190
lines changed

browser/brave_content_browser_client.cc

-8
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#include "brave/browser/brave_browser_main_extra_parts.h"
1818
#include "brave/browser/brave_browser_process.h"
1919
#include "brave/browser/brave_shields/brave_shields_web_contents_observer.h"
20-
#include "brave/browser/brave_shields/reduce_language_navigation_throttle.h"
2120
#include "brave/browser/brave_wallet/brave_wallet_context_utils.h"
2221
#include "brave/browser/brave_wallet/brave_wallet_provider_delegate_impl.h"
2322
#include "brave/browser/brave_wallet/brave_wallet_service_factory.h"
@@ -973,13 +972,6 @@ BraveContentBrowserClient::CreateThrottlesForNavigation(
973972
g_browser_process->GetApplicationLocale()))
974973
throttles.push_back(std::move(domain_block_navigation_throttle));
975974

976-
if (std::unique_ptr<content::NavigationThrottle>
977-
reduce_language_navigation_throttle = brave_shields::
978-
ReduceLanguageNavigationThrottle::MaybeCreateThrottleFor(
979-
handle, HostContentSettingsMapFactory::GetForProfile(
980-
Profile::FromBrowserContext(context))))
981-
throttles.push_back(std::move(reduce_language_navigation_throttle));
982-
983975
// Debounce
984976
if (auto debounce_throttle =
985977
debounce::DebounceNavigationThrottle::MaybeCreateThrottleFor(

browser/brave_shields/reduce_language_navigation_throttle.cc

-116
This file was deleted.

browser/brave_shields/reduce_language_navigation_throttle.h

-60
This file was deleted.

browser/brave_shields/sources.gni

-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ brave_browser_brave_shields_sources = [
1212
"//brave/browser/brave_shields/brave_shields_web_contents_observer.h",
1313
"//brave/browser/brave_shields/https_everywhere_component_installer.cc",
1414
"//brave/browser/brave_shields/https_everywhere_component_installer.h",
15-
"//brave/browser/brave_shields/reduce_language_navigation_throttle.cc",
16-
"//brave/browser/brave_shields/reduce_language_navigation_throttle.h",
1715
]
1816

1917
brave_browser_brave_shields_deps = [

browser/farbling/brave_navigator_languages_farbling_browsertest.cc

+34-4
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class BraveNavigatorLanguagesFarblingBrowserTest : public InProcessBrowserTest {
131131
}
132132

133133
void MonitorHTTPRequest(const net::test_server::HttpRequest& request) {
134-
if (request.relative_url != "/simple.html")
134+
if (request.relative_url.find("/reduce-language/") == std::string::npos)
135135
return;
136136
if (expected_http_accept_language_.empty())
137137
return;
@@ -232,13 +232,15 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorLanguagesFarblingBrowserTest,
232232
EXPECT_EQ(expected_title, watcher2.WaitAndGetTitle());
233233
}
234234

235-
// Tests results of farbling user agent
235+
// Tests results of farbling HTTP Accept-Language header
236236
IN_PROC_BROWSER_TEST_F(BraveNavigatorLanguagesFarblingBrowserTest,
237237
FarbleHTTPAcceptLanguage) {
238238
std::string domain_b = "b.test";
239239
std::string domain_d = "d.test";
240-
GURL url_b = https_server_.GetURL(domain_b, "/simple.html");
241-
GURL url_d = https_server_.GetURL(domain_d, "/simple.html");
240+
GURL url_b = https_server_.GetURL(
241+
domain_b, "/reduce-language/page-with-subresources.html");
242+
GURL url_d = https_server_.GetURL(
243+
domain_d, "/reduce-language/page-with-subresources.html");
242244
SetAcceptLanguages("la,es,en");
243245

244246
// Farbling level: off
@@ -265,4 +267,32 @@ IN_PROC_BROWSER_TEST_F(BraveNavigatorLanguagesFarblingBrowserTest,
265267
NavigateToURLUntilLoadStop(url_b);
266268
BlockFingerprinting(domain_d);
267269
NavigateToURLUntilLoadStop(url_d);
270+
271+
// Test with subdivided language code as the primary language.
272+
SetAcceptLanguages("zh-HK,zh,la");
273+
274+
// Farbling level: off
275+
// HTTP Accept-Language header should not be farbled.
276+
AllowFingerprinting(domain_b);
277+
SetExpectedHTTPAcceptLanguage("zh-HK,zh;q=0.9,la;q=0.8");
278+
NavigateToURLUntilLoadStop(url_b);
279+
AllowFingerprinting(domain_d);
280+
NavigateToURLUntilLoadStop(url_d);
281+
282+
// Farbling level: default
283+
// HTTP Accept-Language header should be farbled by domain.
284+
SetFingerprintingDefault(domain_b);
285+
SetExpectedHTTPAcceptLanguage("zh-HK,zh;q=0.7");
286+
NavigateToURLUntilLoadStop(url_b);
287+
SetExpectedHTTPAcceptLanguage("zh-HK,zh;q=0.8");
288+
SetFingerprintingDefault(domain_d);
289+
NavigateToURLUntilLoadStop(url_d);
290+
291+
// Farbling level: maximum
292+
// HTTP Accept-Language header should be farbled but the same across domains.
293+
BlockFingerprinting(domain_b);
294+
SetExpectedHTTPAcceptLanguage("en-US,en;q=0.9");
295+
NavigateToURLUntilLoadStop(url_b);
296+
BlockFingerprinting(domain_d);
297+
NavigateToURLUntilLoadStop(url_d);
268298
}

browser/net/BUILD.gn

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ source_set("net") {
3535
"brave_proxying_url_loader_factory.h",
3636
"brave_proxying_web_socket.cc",
3737
"brave_proxying_web_socket.h",
38+
"brave_reduce_language_network_delegate_helper.cc",
39+
"brave_reduce_language_network_delegate_helper.h",
3840
"brave_request_handler.cc",
3941
"brave_request_handler.h",
4042
"brave_service_key_network_delegate_helper.cc",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/* Copyright (c) 2022 The Brave Authors. All rights reserved.
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
4+
* You can obtain one at http://mozilla.org/MPL/2.0/. */
5+
6+
#include "brave/browser/net/brave_reduce_language_network_delegate_helper.h"
7+
8+
#include <array>
9+
#include <string>
10+
#include <vector>
11+
12+
#include "base/strings/string_split.h"
13+
#include "brave/browser/brave_browser_process.h"
14+
#include "brave/components/brave_shields/browser/brave_farbling_service.h"
15+
#include "brave/components/brave_shields/browser/brave_shields_util.h"
16+
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
17+
#include "chrome/browser/profiles/profile.h"
18+
#include "components/content_settings/core/browser/host_content_settings_map.h"
19+
#include "components/language/core/browser/language_prefs.h"
20+
#include "components/language/core/browser/pref_names.h"
21+
#include "components/prefs/pref_service.h"
22+
#include "content/public/browser/browser_context.h"
23+
#include "net/base/net_errors.h"
24+
25+
using brave_shields::ControlType;
26+
27+
namespace brave {
28+
29+
namespace {
30+
constexpr char kAcceptLanguageMax[] = "en-US,en;q=0.9";
31+
const std::array<std::string, 5> kFakeQValues = {";q=0.5", ";q=0.6", ";q=0.7",
32+
";q=0.8", ";q=0.9"};
33+
} // namespace
34+
35+
std::string FarbleAcceptLanguageHeader(
36+
const GURL& tab_origin,
37+
Profile* profile,
38+
HostContentSettingsMap* content_settings) {
39+
std::string languages =
40+
profile->GetPrefs()->Get(language::prefs::kAcceptLanguages)->GetString();
41+
std::string accept_language_string = language::GetFirstLanguage(languages);
42+
// If the first language is a multi-part code like "en-US" or "zh-HK",
43+
// extract and append the base language code to |accept_language_string|.
44+
const std::vector<std::string> tokens = base::SplitString(
45+
accept_language_string, "-", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
46+
if (!tokens.empty() && tokens[0] != accept_language_string) {
47+
accept_language_string += "," + tokens[0];
48+
}
49+
// Add a fake q value after the language code.
50+
brave::FarblingPRNG prng;
51+
if (g_brave_browser_process->brave_farbling_service()
52+
->MakePseudoRandomGeneratorForURL(
53+
tab_origin, profile && profile->IsOffTheRecord(), &prng)) {
54+
accept_language_string += kFakeQValues[prng() % kFakeQValues.size()];
55+
}
56+
return accept_language_string;
57+
}
58+
59+
int OnBeforeStartTransaction_ReduceLanguageWork(
60+
net::HttpRequestHeaders* headers,
61+
const ResponseCallback& next_callback,
62+
std::shared_ptr<BraveRequestInfo> ctx) {
63+
Profile* profile = Profile::FromBrowserContext(ctx->browser_context);
64+
DCHECK(profile);
65+
HostContentSettingsMap* content_settings =
66+
HostContentSettingsMapFactory::GetForProfile(profile);
67+
DCHECK(content_settings);
68+
if (!brave_shields::ShouldDoReduceLanguage(content_settings, ctx->tab_origin,
69+
profile->GetPrefs())) {
70+
return net::OK;
71+
}
72+
73+
std::string accept_language_string;
74+
switch (brave_shields::GetFingerprintingControlType(content_settings,
75+
ctx->tab_origin)) {
76+
case ControlType::BLOCK: {
77+
// If fingerprint blocking is maximum, set Accept-Language header to
78+
// static value regardless of other preferences.
79+
accept_language_string = kAcceptLanguageMax;
80+
break;
81+
}
82+
case ControlType::DEFAULT: {
83+
// If fingerprint blocking is default, compute Accept-Language header
84+
// based on user preferences and some randomization.
85+
accept_language_string = FarbleAcceptLanguageHeader(
86+
ctx->tab_origin, profile, content_settings);
87+
break;
88+
}
89+
default:
90+
// Other cases are handled within ShouldDoReduceLanguage, so we should
91+
// never reach here.
92+
NOTREACHED();
93+
}
94+
95+
headers->SetHeader(net::HttpRequestHeaders::kAcceptLanguage,
96+
accept_language_string);
97+
ctx->set_headers.insert(net::HttpRequestHeaders::kAcceptLanguage);
98+
99+
return net::OK;
100+
}
101+
102+
} // namespace brave

0 commit comments

Comments
 (0)