Skip to content

Commit 65e87e0

Browse files
authored
Merge pull request #554 from brave/disable_webtorrent_in_tor
Disable WebTorrent in Tor profile
2 parents c44deb8 + a3fb805 commit 65e87e0

File tree

3 files changed

+112
-7
lines changed

3 files changed

+112
-7
lines changed

components/brave_webtorrent/browser/content_browser_client_helper.h

+7-5
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,13 @@ static bool HandleTorrentURLRewrite(GURL* url,
6767
return false;
6868
}
6969

70-
static bool IsWebtorrentInstalled(content::BrowserContext* browser_context) {
70+
static bool IsWebtorrentEnabled(content::BrowserContext* browser_context) {
71+
bool isTorProfile =
72+
Profile::FromBrowserContext(browser_context)->IsTorProfile();
7173
extensions::ExtensionRegistry* registry =
7274
extensions::ExtensionRegistry::Get(browser_context);
73-
return registry->enabled_extensions().Contains(
74-
brave_webtorrent_extension_id);
75+
return !isTorProfile &&
76+
registry->enabled_extensions().Contains(brave_webtorrent_extension_id);
7577
}
7678

7779
static void LoadOrLaunchMagnetURL(
@@ -83,7 +85,7 @@ static void LoadOrLaunchMagnetURL(
8385
if (!web_contents)
8486
return;
8587

86-
if (IsWebtorrentInstalled(web_contents->GetBrowserContext())) {
88+
if (IsWebtorrentEnabled(web_contents->GetBrowserContext())) {
8789
web_contents->GetController().LoadURL(url, content::Referrer(),
8890
page_transition, std::string());
8991
} else {
@@ -96,7 +98,7 @@ static void LoadOrLaunchMagnetURL(
9698

9799
static bool HandleMagnetURLRewrite(GURL* url,
98100
content::BrowserContext* browser_context) {
99-
if (IsWebtorrentInstalled(browser_context) && url->SchemeIs(kMagnetScheme)) {
101+
if (IsWebtorrentEnabled(browser_context) && url->SchemeIs(kMagnetScheme)) {
100102
*url = TranslateMagnetURL(*url);
101103
return true;
102104
}

components/brave_webtorrent/browser/net/brave_torrent_redirect_network_delegate_helper.cc

+20
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66

77
#include "base/strings/strcat.h"
88
#include "base/strings/string_util.h"
9+
#include "brave/browser/renderer_host/brave_navigation_ui_data.h"
910
#include "brave/common/network_constants.h"
1011
#include "brave/common/extensions/extension_constants.h"
12+
#include "content/public/browser/resource_request_info.h"
1113
#include "extensions/common/constants.h"
1214
#include "net/http/http_content_disposition.h"
1315
#include "net/http/http_response_headers.h"
@@ -63,6 +65,23 @@ bool IsWebtorrentInitiated(net::URLRequest* request) {
6365
brave_webtorrent_extension_id, "/"});
6466
}
6567

68+
bool IsTorProfile(net::URLRequest* request) {
69+
const content::ResourceRequestInfo* resource_info =
70+
content::ResourceRequestInfo::ForRequest(request);
71+
if (!resource_info) {
72+
return false;
73+
}
74+
75+
const BraveNavigationUIData* ui_data =
76+
static_cast<const BraveNavigationUIData*>(
77+
resource_info->GetNavigationUIData());
78+
if (!ui_data) {
79+
return false;
80+
}
81+
82+
return ui_data->GetTorProfileService() ? true : false;
83+
}
84+
6685
} // namespace
6786

6887
namespace webtorrent {
@@ -76,6 +95,7 @@ int OnHeadersReceived_TorrentRedirectWork(
7695
std::shared_ptr<brave::BraveRequestInfo> ctx) {
7796

7897
if (!request || !original_response_headers ||
98+
IsTorProfile(request) ||
7999
IsWebtorrentInitiated(request) || // download .torrent, do not redirect
80100
!IsTorrentFile(request, original_response_headers)) {
81101
return net::OK;

components/brave_webtorrent/browser/net/brave_torrent_redirect_network_delegate_helper_unittest.cc

+85-2
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,64 @@
44

55
#include "brave/components/brave_webtorrent/browser/net/brave_torrent_redirect_network_delegate_helper.h"
66

7+
#include "base/files/file_path.h"
8+
#include "base/files/scoped_temp_dir.h"
79
#include "base/strings/strcat.h"
810
#include "brave/browser/net/url_context.h"
11+
#include "brave/browser/profiles/brave_profile_manager.h"
12+
#include "brave/browser/profiles/tor_unittest_profile_manager.h"
13+
#include "brave/browser/renderer_host/brave_navigation_ui_data.h"
14+
#include "brave/browser/tor/mock_tor_profile_service_factory.h"
915
#include "brave/common/network_constants.h"
16+
#include "chrome/test/base/scoped_testing_local_state.h"
17+
#include "chrome/test/base/testing_browser_process.h"
18+
#include "content/public/browser/resource_request_info.h"
19+
#include "content/public/test/mock_resource_context.h"
1020
#include "content/public/test/test_browser_thread_bundle.h"
1121
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
1222
#include "net/url_request/url_request_test_util.h"
1323
#include "testing/gtest/include/gtest/gtest.h"
1424

1525
namespace {
1626

27+
int kRenderProcessId = 1;
28+
int kRenderFrameId = 2;
29+
30+
} // namespace
31+
1732
class BraveTorrentRedirectNetworkDelegateHelperTest: public testing::Test {
1833
public:
1934
BraveTorrentRedirectNetworkDelegateHelperTest()
20-
: thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
35+
: local_state_(TestingBrowserProcess::GetGlobal()),
36+
thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
2137
context_(new net::TestURLRequestContext(true)) {
2238
}
2339

2440
~BraveTorrentRedirectNetworkDelegateHelperTest() override {}
2541

2642
void SetUp() override {
43+
// Create a new temporary directory, and store the path
44+
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
45+
TestingBrowserProcess::GetGlobal()->SetProfileManager(
46+
new TorUnittestProfileManager(temp_dir_.GetPath()));
2747
context_->Init();
48+
2849
torrent_url_ = GURL("https://webtorrent.io/torrents/sintel.torrent");
2950
non_torrent_url_ = GURL("https://webtorrent.io/torrents/sintel");
3051
extension_url_ = GURL("chrome-extension://lgjmpdmojkpocjcopdikifhejkkjglho/extension/brave_webtorrent.html?https://webtorrent.io/torrents/sintel.torrent");
3152
non_torrent_extension_url_ = GURL("chrome-extension://lgjmpdmojkpocjcopdikifhejkkjglho/extension/brave_webtorrent.html?https://webtorrent.io/torrents/sintel");
3253
}
3354

55+
void TearDown() override {
56+
TestingBrowserProcess::GetGlobal()->SetProfileManager(nullptr);
57+
}
58+
3459
net::TestURLRequestContext* context() { return context_.get(); }
3560

61+
content::MockResourceContext* resource_context() {
62+
return resource_context_.get();
63+
}
64+
3665
const GURL& torrent_url() {
3766
return torrent_url_;
3867
}
@@ -49,13 +78,19 @@ class BraveTorrentRedirectNetworkDelegateHelperTest: public testing::Test {
4978
return non_torrent_extension_url_;
5079
}
5180

81+
protected:
82+
// The path to temporary directory used to contain the test operations.
83+
base::ScopedTempDir temp_dir_;
84+
ScopedTestingLocalState local_state_;
85+
5286
private:
5387
GURL torrent_url_;
5488
GURL non_torrent_url_;
5589
GURL extension_url_;
5690
GURL non_torrent_extension_url_;
5791
content::TestBrowserThreadBundle thread_bundle_;
5892
std::unique_ptr<net::TestURLRequestContext> context_;
93+
std::unique_ptr<content::MockResourceContext> resource_context_;
5994
};
6095

6196
TEST_F(BraveTorrentRedirectNetworkDelegateHelperTest, NoRedirectWithoutMimeType) {
@@ -283,4 +318,52 @@ TEST_F(BraveTorrentRedirectNetworkDelegateHelperTest, WebtorrentInitiatedNoRedir
283318
EXPECT_EQ(ret, net::OK);
284319
}
285320

286-
} // namespace
321+
TEST_F(BraveTorrentRedirectNetworkDelegateHelperTest, NoRedirectTorProfile) {
322+
ProfileManager* profile_manager = g_browser_process->profile_manager();
323+
base::FilePath tor_path = BraveProfileManager::GetTorProfilePath();
324+
Profile* profile = profile_manager->GetProfile(tor_path);
325+
ASSERT_TRUE(profile);
326+
327+
net::TestDelegate test_delegate;
328+
std::unique_ptr<net::URLRequest> request =
329+
context()->CreateRequest(torrent_url(), net::IDLE, &test_delegate,
330+
TRAFFIC_ANNOTATION_FOR_TESTS);
331+
332+
scoped_refptr<net::HttpResponseHeaders> orig_response_headers =
333+
new net::HttpResponseHeaders(std::string());
334+
orig_response_headers->AddHeader(
335+
base::StrCat({"Content-Type: ", kBittorrentMimeType}));
336+
std::string mimeType;
337+
ASSERT_TRUE(orig_response_headers->GetMimeType(&mimeType));
338+
ASSERT_EQ(mimeType, kBittorrentMimeType);
339+
340+
scoped_refptr<net::HttpResponseHeaders> overwrite_response_headers =
341+
new net::HttpResponseHeaders(std::string());
342+
GURL allowed_unsafe_redirect_url = GURL::EmptyGURL();
343+
std::shared_ptr<brave::BraveRequestInfo>
344+
brave_request_info(new brave::BraveRequestInfo());
345+
brave::ResponseCallback callback;
346+
347+
std::unique_ptr<BraveNavigationUIData> navigation_ui_data =
348+
std::make_unique<BraveNavigationUIData>();
349+
BraveNavigationUIData* navigation_ui_data_ptr = navigation_ui_data.get();
350+
351+
content::ResourceRequestInfo::AllocateForTesting(
352+
request.get(), content::RESOURCE_TYPE_MAIN_FRAME, resource_context(),
353+
kRenderProcessId, /*render_view_id=*/-1, kRenderFrameId,
354+
/*is_main_frame=*/true, /*allow_download=*/false, /*is_async=*/true,
355+
content::PREVIEWS_OFF, std::move(navigation_ui_data));
356+
357+
MockTorProfileServiceFactory::SetTorNavigationUIData(profile,
358+
navigation_ui_data_ptr);
359+
360+
int ret = webtorrent::OnHeadersReceived_TorrentRedirectWork(request.get(),
361+
orig_response_headers.get(), &overwrite_response_headers,
362+
&allowed_unsafe_redirect_url, callback, brave_request_info);
363+
364+
EXPECT_EQ(overwrite_response_headers->GetStatusLine(), "HTTP/1.0 200 OK");
365+
std::string location;
366+
EXPECT_FALSE(overwrite_response_headers->EnumerateHeader(nullptr, "Location", &location));
367+
EXPECT_EQ(allowed_unsafe_redirect_url, GURL::EmptyGURL());
368+
EXPECT_EQ(ret, net::OK);
369+
}

0 commit comments

Comments
 (0)