Skip to content

Commit a7f7dda

Browse files
authored
Merge pull request #84 from brave/brave-ua-whitelist
Use Brave UA for whitelist of URL patterns
2 parents 27a33af + ceaa968 commit a7f7dda

4 files changed

+105
-6
lines changed

browser/net/brave_site_hacks_network_delegate_helper.cc

+22
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <vector>
99

1010
#include "base/base64url.h"
11+
#include "base/strings/string_util.h"
1112
#include "brave/common/network_constants.h"
1213
#include "extensions/common/url_pattern.h"
1314
#include "net/url_request/url_request.h"
@@ -34,6 +35,20 @@ bool IsBlockedResource(const GURL& gurl) {
3435
});
3536
}
3637

38+
bool IsUAWhitelisted(const GURL& gurl) {
39+
static std::vector<URLPattern> whitelist_patterns({
40+
URLPattern(URLPattern::SCHEME_ALL, "https://*.adobe.com/*"),
41+
URLPattern(URLPattern::SCHEME_ALL, "https://*.duckduckgo.com/*"),
42+
URLPattern(URLPattern::SCHEME_ALL, "https://*.brave.com/*"),
43+
// For Widevine
44+
URLPattern(URLPattern::SCHEME_ALL, "https://*.netflix.com/*")
45+
});
46+
return std::any_of(whitelist_patterns.begin(), whitelist_patterns.end(),
47+
[&gurl](URLPattern pattern){
48+
return pattern.MatchesURL(gurl);
49+
});
50+
}
51+
3752
std::string GetGoogleTagManagerPolyfillJS() {
3853
static std::string base64_output;
3954
if (base64_output.length() != 0) {
@@ -142,6 +157,13 @@ int OnBeforeStartTransaction_SiteHacksWork(net::URLRequest* request,
142157
request->Cancel();
143158
return net::ERR_ABORTED;
144159
}
160+
if (IsUAWhitelisted(request->url())) {
161+
std::string user_agent;
162+
if (headers->GetHeader(kUserAgentHeader, &user_agent)) {
163+
base::ReplaceFirstSubstringAfterOffset(&user_agent, 0, "Chrome", "Brave Chrome");
164+
headers->SetHeader(kUserAgentHeader, user_agent);
165+
}
166+
}
145167
return net::OK;
146168
}
147169

browser/net/brave_site_hacks_network_delegate_helper_unittest.cc

+74-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ TEST_F(BraveSiteHacksNetworkDelegateHelperTest, RedirectsToEmptyDataURLs) {
6565
brave_request_info);
6666
EXPECT_EQ(ret, net::OK);
6767
EXPECT_STREQ(new_url.spec().c_str(), kEmptyDataURI);
68-
}); }
68+
});
69+
}
6970

7071
TEST_F(BraveSiteHacksNetworkDelegateHelperTest, RedirectsToStubs) {
7172
std::vector<GURL> urls({
@@ -217,5 +218,77 @@ TEST_F(BraveSiteHacksNetworkDelegateHelperTest, TwitterNoCancelWithReferer) {
217218
EXPECT_EQ(ret, net::OK);
218219
}
219220

221+
TEST_F(BraveSiteHacksNetworkDelegateHelperTest, UAWhitelistedTest) {
222+
std::vector<GURL> urls({
223+
GURL("https://adobe.com"),
224+
GURL("https://adobe.com/something"),
225+
GURL("https://duckduckgo.com"),
226+
GURL("https://duckduckgo.com/something"),
227+
GURL("https://brave.com"),
228+
GURL("https://brave.com/something"),
229+
GURL("https://netflix.com"),
230+
GURL("https://netflix.com/something"),
231+
GURL("https://a.adobe.com"),
232+
GURL("https://a.duckduckgo.com"),
233+
GURL("https://a.brave.com"),
234+
GURL("https://a.netflix.com"),
235+
GURL("https://a.adobe.com/something"),
236+
GURL("https://a.duckduckgo.com/something"),
237+
GURL("https://a.brave.com/something"),
238+
GURL("https://a.netflix.com/something")
239+
});
240+
std::for_each(urls.begin(), urls.end(),
241+
[this](GURL url){
242+
net::TestDelegate test_delegate;
243+
std::unique_ptr<net::URLRequest> request =
244+
context()->CreateRequest(url, net::IDLE, &test_delegate,
245+
TRAFFIC_ANNOTATION_FOR_TESTS);
246+
net::HttpRequestHeaders headers;
247+
headers.SetHeader(kUserAgentHeader,
248+
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 "
249+
"(KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36");
250+
std::shared_ptr<brave::BraveRequestInfo>
251+
brave_request_info(new brave::BraveRequestInfo());
252+
brave::ResponseCallback callback;
253+
int ret = brave::OnBeforeStartTransaction_SiteHacksWork(request.get(), &headers,
254+
callback, brave_request_info);
255+
std::string user_agent;
256+
headers.GetHeader(kUserAgentHeader, &user_agent);
257+
EXPECT_EQ(ret, net::OK);
258+
EXPECT_STREQ(user_agent.c_str(),
259+
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 "
260+
"(KHTML, like Gecko) Brave Chrome/33.0.1750.117 Safari/537.36");
261+
});
262+
}
263+
264+
TEST_F(BraveSiteHacksNetworkDelegateHelperTest, NOTUAWhitelistedTest) {
265+
std::vector<GURL> urls({
266+
GURL("https://brianbondy.com"),
267+
GURL("https://bravecombo.com"),
268+
GURL("https://brave.example.com")
269+
});
270+
std::for_each(urls.begin(), urls.end(),
271+
[this](GURL url){
272+
net::TestDelegate test_delegate;
273+
std::unique_ptr<net::URLRequest> request =
274+
context()->CreateRequest(url, net::IDLE, &test_delegate,
275+
TRAFFIC_ANNOTATION_FOR_TESTS);
276+
net::HttpRequestHeaders headers;
277+
headers.SetHeader(kUserAgentHeader,
278+
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 "
279+
"(KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36");
280+
std::shared_ptr<brave::BraveRequestInfo>
281+
brave_request_info(new brave::BraveRequestInfo());
282+
brave::ResponseCallback callback;
283+
int ret = brave::OnBeforeStartTransaction_SiteHacksWork(request.get(), &headers,
284+
callback, brave_request_info);
285+
std::string user_agent;
286+
headers.GetHeader(kUserAgentHeader, &user_agent);
287+
EXPECT_EQ(ret, net::OK);
288+
EXPECT_STREQ(user_agent.c_str(),
289+
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 "
290+
"(KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36");
291+
});
292+
}
220293

221294
} // namespace

common/network_constants.cc

+5-3
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ const char kJSDataURLPrefix[] = "data:application/javascript;base64,";
55
const char kGeoLocationsPattern[] = "https://www.googleapis.com/geolocation/v1/geolocate?key=*";
66
const char kGoogleTagManagerPattern[] = "https://www.googletagmanager.com/gtm.js";
77
const char kGoogleTagServicesPattern[] = "https://www.googletagservices.com/tag/js/gpt.js";
8-
const char kCookieHeader[] = "Cookie";
9-
// Intentional mispelling on referrer to match HTTP spec
10-
const char kRefererHeader[] = "Referer";
118
const char kForbesPattern[] = "https://www.forbes.com/*";
129
const char kForbesExtraCookies[] = "forbes_ab=true; welcomeAd=true; adblock_session=Off; dailyWelcomeCookie=true";
1310
const char kTwitterPattern[] = "https://*.twitter.com/*";
1411
const char kTwitterReferrer[] = "https://twitter.com/*";
1512
const char kTwitterRedirectURL[] = "https://mobile.twitter.com/i/nojs_router*";
13+
14+
const char kCookieHeader[] = "Cookie";
15+
// Intentional mispelling on referrer to match HTTP spec
16+
const char kRefererHeader[] = "Referer";
17+
const char kUserAgentHeader[] = "User-Agent";

common/network_constants.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ extern const char kJSDataURLPrefix[];
66
extern const char kGeoLocationsPattern[];
77
extern const char kGoogleTagManagerPattern[];
88
extern const char kGoogleTagServicesPattern[];
9-
extern const char kCookieHeader[];
10-
extern const char kRefererHeader[];
119
extern const char kForbesPattern[];
1210
extern const char kForbesExtraCookies[];
1311
extern const char kTwitterPattern[];
1412
extern const char kTwitterReferrer[];
1513
extern const char kTwitterRedirectURL[];
1614

15+
extern const char kCookieHeader[];
16+
extern const char kRefererHeader[];
17+
extern const char kUserAgentHeader[];
18+
1719
#endif // BRAVE_COMMON_NETWORK_CONSTANTS_H_
1820

0 commit comments

Comments
 (0)