Skip to content

Commit

Permalink
SafeBrowsing for Network Service: refactor the browser-side code.
Browse files Browse the repository at this point in the history
This is a preparation for adding support for Android WebView:
- moves some files from chrome/browser to components/safe_browsing/browser.
- introduces UrlCheckerDelegate interface and moves chrome-specific logic into a subclass of UrlCheckerDelegate.

Bug=715673

Change-Id: I7c7e440f5146e6b7928e71265e7d5657f2c5b295
Reviewed-on: https://chromium-review.googlesource.com/567586
Commit-Queue: Yuzhu Shen <yzshen@chromium.org>
Reviewed-by: Varun Khaneja <vakh@chromium.org>
Reviewed-by: John Abd-El-Malek <jam@chromium.org>
Cr-Commit-Position: refs/heads/master@{#487644}
  • Loading branch information
yzshen authored and Commit Bot committed Jul 18, 2017
1 parent cfbec4b commit 44094e2
Show file tree
Hide file tree
Showing 16 changed files with 324 additions and 136 deletions.
43 changes: 34 additions & 9 deletions chrome/browser/chrome_content_browser_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,11 @@
#include "chrome/browser/renderer_host/chrome_render_message_filter.h"
#include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h"
#include "chrome/browser/resource_coordinator/background_tab_navigation_throttle.h"
#include "chrome/browser/safe_browsing/browser_url_loader_throttle.h"
#include "chrome/browser/safe_browsing/certificate_reporting_service.h"
#include "chrome/browser/safe_browsing/certificate_reporting_service_factory.h"
#include "chrome/browser/safe_browsing/mojo_safe_browsing_impl.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/browser/safe_browsing/ui_manager.h"
#include "chrome/browser/safe_browsing/url_checker_delegate_impl.h"
#include "chrome/browser/search/instant_service.h"
#include "chrome/browser/search/instant_service_factory.h"
#include "chrome/browser/search/search.h"
Expand Down Expand Up @@ -147,7 +147,11 @@
#include "components/rappor/public/rappor_utils.h"
#include "components/rappor/rappor_recorder_impl.h"
#include "components/rappor/rappor_service_impl.h"
#include "components/safe_browsing/browser/browser_url_loader_throttle.h"
#include "components/safe_browsing/browser/mojo_safe_browsing_impl.h"
#include "components/safe_browsing/browser/url_checker_delegate.h"
#include "components/safe_browsing/common/safe_browsing_prefs.h"
#include "components/safe_browsing_db/database_manager.h"
#include "components/security_interstitials/core/ssl_error_ui.h"
#include "components/signin/core/common/profile_management_switches.h"
#include "components/spellcheck/spellcheck_build_features.h"
Expand Down Expand Up @@ -2863,10 +2867,12 @@ void ChromeContentBrowserClient::ExposeInterfacesToRenderer(

if (base::FeatureList::IsEnabled(features::kNetworkService)) {
registry->AddInterface(
base::Bind(&safe_browsing::MojoSafeBrowsingImpl::Create,
safe_browsing_service_->database_manager(),
safe_browsing_service_->ui_manager(),
render_process_host->GetID()),
base::Bind(
&safe_browsing::MojoSafeBrowsingImpl::MaybeCreate,
render_process_host->GetID(),
base::Bind(
&ChromeContentBrowserClient::GetSafeBrowsingUrlCheckerDelegate,
base::Unretained(this))),
BrowserThread::GetTaskRunnerForThread(BrowserThread::IO));
}

Expand Down Expand Up @@ -3373,9 +3379,13 @@ ChromeContentBrowserClient::CreateURLLoaderThrottles(
DCHECK(base::FeatureList::IsEnabled(features::kNetworkService));

std::vector<std::unique_ptr<content::URLLoaderThrottle>> result;
result.push_back(base::MakeUnique<safe_browsing::BrowserURLLoaderThrottle>(
safe_browsing_service_->database_manager(),
safe_browsing_service_->ui_manager(), wc_getter));

auto safe_browsing_throttle =
safe_browsing::BrowserURLLoaderThrottle::MaybeCreate(
GetSafeBrowsingUrlCheckerDelegate(), wc_getter);
if (safe_browsing_throttle)
result.push_back(std::move(safe_browsing_throttle));

return result;
}

Expand Down Expand Up @@ -3431,3 +3441,18 @@ void ChromeContentBrowserClient::SetDefaultQuotaSettingsForTesting(
const storage::QuotaSettings* settings) {
g_default_quota_settings = settings;
}

safe_browsing::UrlCheckerDelegate*
ChromeContentBrowserClient::GetSafeBrowsingUrlCheckerDelegate() {
DCHECK_CURRENTLY_ON(BrowserThread::IO);

// |safe_browsing_service_| may be unavailable in tests.
if (safe_browsing_service_ && !safe_browsing_url_checker_delegate_) {
safe_browsing_url_checker_delegate_ =
new safe_browsing::UrlCheckerDelegateImpl(
safe_browsing_service_->database_manager(),
safe_browsing_service_->ui_manager());
}

return safe_browsing_url_checker_delegate_.get();
}
5 changes: 5 additions & 0 deletions chrome/browser/chrome_content_browser_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class QuotaPermissionContext;

namespace safe_browsing {
class SafeBrowsingService;
class UrlCheckerDelegate;
}

namespace user_prefs {
Expand Down Expand Up @@ -380,6 +381,8 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
static void SetDefaultQuotaSettingsForTesting(
const storage::QuotaSettings *settings);

safe_browsing::UrlCheckerDelegate* GetSafeBrowsingUrlCheckerDelegate();

#if BUILDFLAG(ENABLE_PLUGINS)
// Set of origins that can use TCP/UDP private APIs from NaCl.
std::set<std::string> allowed_socket_origins_;
Expand All @@ -397,6 +400,8 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
service_manager::BinderRegistry gpu_binder_registry_;

scoped_refptr<safe_browsing::SafeBrowsingService> safe_browsing_service_;
scoped_refptr<safe_browsing::UrlCheckerDelegate>
safe_browsing_url_checker_delegate_;

std::unique_ptr<service_manager::BinderRegistry> frame_interfaces_;
std::unique_ptr<
Expand Down
8 changes: 2 additions & 6 deletions chrome/browser/safe_browsing/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ proto_library("chunk_proto") {

static_library("safe_browsing") {
sources = [
"browser_url_loader_throttle.cc",
"browser_url_loader_throttle.h",
"chrome_cleaner/chrome_cleaner_controller_win.cc",
"chrome_cleaner/chrome_cleaner_controller_win.h",
"chrome_cleaner/chrome_cleaner_fetcher_win.cc",
Expand All @@ -37,12 +35,10 @@ static_library("safe_browsing") {
"chrome_cleaner/srt_field_trial_win.h",
"chrome_cleaner/srt_global_error_win.cc",
"chrome_cleaner/srt_global_error_win.h",
"mojo_safe_browsing_impl.cc",
"mojo_safe_browsing_impl.h",
"safe_browsing_tab_observer.cc",
"safe_browsing_tab_observer.h",
"safe_browsing_url_checker_impl.cc",
"safe_browsing_url_checker_impl.h",
"url_checker_delegate_impl.cc",
"url_checker_delegate_impl.h",
]

deps = [
Expand Down
93 changes: 93 additions & 0 deletions chrome/browser/safe_browsing/url_checker_delegate_impl.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/safe_browsing/url_checker_delegate_impl.h"

#include "base/bind.h"
#include "chrome/browser/prerender/prerender_contents.h"
#include "chrome/browser/prerender/prerender_final_status.h"
#include "chrome/browser/safe_browsing/ui_manager.h"
#include "components/safe_browsing_db/database_manager.h"
#include "components/safe_browsing_db/v4_protocol_manager_util.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"

namespace safe_browsing {
namespace {

// Destroys the prerender contents associated with the web_contents, if any.
void DestroyPrerenderContents(
const base::Callback<content::WebContents*()>& web_contents_getter) {
content::WebContents* web_contents = web_contents_getter.Run();
if (web_contents) {
prerender::PrerenderContents* prerender_contents =
prerender::PrerenderContents::FromWebContents(web_contents);
if (prerender_contents)
prerender_contents->Destroy(prerender::FINAL_STATUS_SAFE_BROWSING);
}
}

void StartDisplayingBlockingPage(
scoped_refptr<BaseUIManager> ui_manager,
const security_interstitials::UnsafeResource& resource) {
content::WebContents* web_contents = resource.web_contents_getter.Run();
if (web_contents) {
prerender::PrerenderContents* prerender_contents =
prerender::PrerenderContents::FromWebContents(web_contents);
if (prerender_contents) {
prerender_contents->Destroy(prerender::FINAL_STATUS_SAFE_BROWSING);
} else {
ui_manager->DisplayBlockingPage(resource);
return;
}
}

// Tab is gone or it's being prerendered.
content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE,
base::Bind(resource.callback, false));
}

} // namespace

UrlCheckerDelegateImpl::UrlCheckerDelegateImpl(
scoped_refptr<SafeBrowsingDatabaseManager> database_manager,
scoped_refptr<SafeBrowsingUIManager> ui_manager)
: database_manager_(std::move(database_manager)),
ui_manager_(std::move(ui_manager)),
threat_types_(
CreateSBThreatTypeSet({safe_browsing::SB_THREAT_TYPE_URL_MALWARE,
safe_browsing::SB_THREAT_TYPE_URL_PHISHING,
safe_browsing::SB_THREAT_TYPE_URL_UNWANTED})) {
}

UrlCheckerDelegateImpl::~UrlCheckerDelegateImpl() = default;

void UrlCheckerDelegateImpl::MaybeDestroyPrerenderContents(
const base::Callback<content::WebContents*()>& web_contents_getter) {
// Destroy the prefetch with FINAL_STATUS_SAFEBROSWING.
content::BrowserThread::PostTask(
content::BrowserThread::UI, FROM_HERE,
base::BindOnce(&DestroyPrerenderContents, web_contents_getter));
}

void UrlCheckerDelegateImpl::StartDisplayingBlockingPageHelper(
const security_interstitials::UnsafeResource& resource) {
content::BrowserThread::PostTask(
content::BrowserThread::UI, FROM_HERE,
base::BindOnce(&StartDisplayingBlockingPage, ui_manager_, resource));
}

const SBThreatTypeSet& UrlCheckerDelegateImpl::GetThreatTypes() {
return threat_types_;
}

SafeBrowsingDatabaseManager* UrlCheckerDelegateImpl::GetDatabaseManager() {
return database_manager_.get();
}

BaseUIManager* UrlCheckerDelegateImpl::GetUIManager() {
return ui_manager_.get();
}

} // namespace safe_browsing
44 changes: 44 additions & 0 deletions chrome/browser/safe_browsing/url_checker_delegate_impl.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_SAFE_BROWSING_URL_CHECKER_DELEGATE_IMPL_H_
#define CHROME_BROWSER_SAFE_BROWSING_URL_CHECKER_DELEGATE_IMPL_H_

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "components/safe_browsing/browser/url_checker_delegate.h"

namespace safe_browsing {

class SafeBrowsingUIManager;

class UrlCheckerDelegateImpl : public UrlCheckerDelegate {
public:
UrlCheckerDelegateImpl(
scoped_refptr<SafeBrowsingDatabaseManager> database_manager,
scoped_refptr<SafeBrowsingUIManager> ui_manager);

private:
~UrlCheckerDelegateImpl() override;

// Implementation of UrlCheckerDelegate:
void MaybeDestroyPrerenderContents(
const base::Callback<content::WebContents*()>& web_contents_getter)
override;
void StartDisplayingBlockingPageHelper(
const security_interstitials::UnsafeResource& resource) override;
const SBThreatTypeSet& GetThreatTypes() override;
SafeBrowsingDatabaseManager* GetDatabaseManager() override;
BaseUIManager* GetUIManager() override;

scoped_refptr<SafeBrowsingDatabaseManager> database_manager_;
scoped_refptr<SafeBrowsingUIManager> ui_manager_;
SBThreatTypeSet threat_types_;

DISALLOW_COPY_AND_ASSIGN(UrlCheckerDelegateImpl);
};

} // namespace safe_browsing

#endif // CHROME_BROWSER_SAFE_BROWSING_URL_CHECKER_DELEGATE_IMPL_H_
1 change: 1 addition & 0 deletions components/safe_browsing/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ include_rules = [
"+content/public/browser",
"+content/public/common",
"+google_apis",
"+mojo/public/cpp",
"+net/base",
"+net/log",
"+net/traffic_annotation",
Expand Down
8 changes: 8 additions & 0 deletions components/safe_browsing/browser/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ import("//build/config/features.gni")

source_set("browser") {
sources = [
"browser_url_loader_throttle.cc",
"browser_url_loader_throttle.h",
"mojo_safe_browsing_impl.cc",
"mojo_safe_browsing_impl.h",
"safe_browsing_url_checker_impl.cc",
"safe_browsing_url_checker_impl.h",
"safe_browsing_url_request_context_getter.cc",
"safe_browsing_url_request_context_getter.h",
"threat_details.cc",
Expand All @@ -14,6 +20,7 @@ source_set("browser") {
"threat_details_cache.h",
"threat_details_history.cc",
"threat_details_history.h",
"url_checker_delegate.h",
]

deps = [
Expand All @@ -22,6 +29,7 @@ source_set("browser") {
"//components/safe_browsing:csd_proto",
"//components/safe_browsing:safe_browsing",
"//components/safe_browsing/common:common",
"//components/safe_browsing_db:database_manager",
"//components/security_interstitials/content:security_interstitial_page",
"//content/public/browser:browser",
"//net:extras",
Expand Down
3 changes: 2 additions & 1 deletion components/safe_browsing/browser/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ include_rules = [
"+components/history/core/browser",
"+components/safe_browsing/csd.pb.h",
"+content/public/browser",
"+ipc/ipc_message.h",
"+net/cookies",
"+net/extras",
"+net/http",
"+net/ssl",
"+net/traffic_annotation",
]
]
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,33 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/safe_browsing/browser_url_loader_throttle.h"
#include "components/safe_browsing/browser/browser_url_loader_throttle.h"

#include "base/logging.h"
#include "chrome/browser/safe_browsing/safe_browsing_url_checker_impl.h"
#include "chrome/browser/safe_browsing/ui_manager.h"
#include "components/safe_browsing_db/database_manager.h"
#include "components/safe_browsing/browser/safe_browsing_url_checker_impl.h"
#include "components/safe_browsing/browser/url_checker_delegate.h"
#include "net/url_request/redirect_info.h"

namespace safe_browsing {

// static
std::unique_ptr<BrowserURLLoaderThrottle> BrowserURLLoaderThrottle::MaybeCreate(
scoped_refptr<UrlCheckerDelegate> url_checker_delegate,
const base::Callback<content::WebContents*()>& web_contents_getter) {
if (!url_checker_delegate ||
!url_checker_delegate->GetDatabaseManager()->IsSupported()) {
return nullptr;
}

return base::WrapUnique<BrowserURLLoaderThrottle>(
new BrowserURLLoaderThrottle(std::move(url_checker_delegate),
web_contents_getter));
}

BrowserURLLoaderThrottle::BrowserURLLoaderThrottle(
scoped_refptr<SafeBrowsingDatabaseManager> database_manager,
scoped_refptr<SafeBrowsingUIManager> ui_manager,
scoped_refptr<UrlCheckerDelegate> url_checker_delegate,
const base::Callback<content::WebContents*()>& web_contents_getter)
: database_manager_(database_manager),
ui_manager_(ui_manager),
: url_checker_delegate_(std::move(url_checker_delegate)),
web_contents_getter_(web_contents_getter) {}

BrowserURLLoaderThrottle::~BrowserURLLoaderThrottle() = default;
Expand All @@ -33,8 +44,8 @@ void BrowserURLLoaderThrottle::WillStartRequest(

pending_checks_++;
url_checker_ = base::MakeUnique<SafeBrowsingUrlCheckerImpl>(
load_flags, resource_type, std::move(database_manager_),
std::move(ui_manager_), web_contents_getter_);
load_flags, resource_type, std::move(url_checker_delegate_),
web_contents_getter_);
url_checker_->CheckUrl(
url, base::BindOnce(&BrowserURLLoaderThrottle::OnCheckUrlResult,
base::Unretained(this)));
Expand Down
Loading

0 comments on commit 44094e2

Please sign in to comment.