aw_safe_browsing_ui_manager.cc 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // Copyright 2017 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. #include "android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.h"
  5. #include <memory>
  6. #include <string>
  7. #include <utility>
  8. #include <vector>
  9. #include "android_webview/browser/aw_content_browser_client.h"
  10. #include "android_webview/browser/safe_browsing/aw_ping_manager_factory.h"
  11. #include "android_webview/browser/safe_browsing/aw_safe_browsing_blocking_page.h"
  12. #include "android_webview/common/aw_paths.h"
  13. #include "base/bind.h"
  14. #include "base/command_line.h"
  15. #include "base/path_service.h"
  16. #include "components/safe_browsing/content/browser/base_ui_manager.h"
  17. #include "components/safe_browsing/content/browser/safe_browsing_network_context.h"
  18. #include "components/safe_browsing/core/browser/db/v4_protocol_manager_util.h"
  19. #include "components/safe_browsing/core/common/safebrowsing_constants.h"
  20. #include "components/security_interstitials/content/unsafe_resource_util.h"
  21. #include "content/public/browser/browser_task_traits.h"
  22. #include "content/public/browser/browser_thread.h"
  23. #include "content/public/browser/navigation_controller.h"
  24. #include "content/public/browser/navigation_entry.h"
  25. #include "content/public/browser/network_service_instance.h"
  26. #include "services/cert_verifier/public/mojom/cert_verifier_service_factory.mojom.h"
  27. #include "services/network/public/mojom/network_context.mojom.h"
  28. #include "services/network/public/mojom/network_service.mojom.h"
  29. using content::BrowserThread;
  30. using content::WebContents;
  31. namespace android_webview {
  32. namespace {
  33. network::mojom::NetworkContextParamsPtr CreateDefaultNetworkContextParams() {
  34. network::mojom::NetworkContextParamsPtr network_context_params =
  35. network::mojom::NetworkContextParams::New();
  36. network_context_params->cert_verifier_params = content::GetCertVerifierParams(
  37. cert_verifier::mojom::CertVerifierCreationParams::New());
  38. network_context_params->user_agent = GetUserAgent();
  39. return network_context_params;
  40. }
  41. } // namespace
  42. AwSafeBrowsingUIManager::AwSafeBrowsingUIManager() {
  43. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  44. // TODO(timvolodine): verify this is what we want regarding the directory.
  45. base::FilePath user_data_dir;
  46. bool result = base::PathService::Get(android_webview::DIR_SAFE_BROWSING,
  47. &user_data_dir);
  48. DCHECK(result);
  49. network_context_ =
  50. std::make_unique<safe_browsing::SafeBrowsingNetworkContext>(
  51. user_data_dir, /*trigger_migration=*/false,
  52. base::BindRepeating(CreateDefaultNetworkContextParams));
  53. }
  54. AwSafeBrowsingUIManager::~AwSafeBrowsingUIManager() {}
  55. void AwSafeBrowsingUIManager::DisplayBlockingPage(
  56. const UnsafeResource& resource) {
  57. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  58. WebContents* web_contents =
  59. security_interstitials::GetWebContentsForResource(resource);
  60. // Check the size of the view
  61. UIManagerClient* client = UIManagerClient::FromWebContents(web_contents);
  62. if (!client || !client->CanShowInterstitial()) {
  63. OnBlockingPageDone(std::vector<UnsafeResource>{resource}, false,
  64. web_contents, resource.url.GetWithEmptyPath(),
  65. false /* showed_interstitial */);
  66. return;
  67. }
  68. safe_browsing::BaseUIManager::DisplayBlockingPage(resource);
  69. }
  70. scoped_refptr<network::SharedURLLoaderFactory>
  71. AwSafeBrowsingUIManager::GetURLLoaderFactoryOnIOThread() {
  72. DCHECK_CURRENTLY_ON(BrowserThread::IO);
  73. if (!shared_url_loader_factory_on_io_) {
  74. content::GetUIThreadTaskRunner({})->PostTask(
  75. FROM_HERE,
  76. base::BindOnce(&AwSafeBrowsingUIManager::CreateURLLoaderFactoryForIO,
  77. this,
  78. url_loader_factory_on_io_.BindNewPipeAndPassReceiver()));
  79. shared_url_loader_factory_on_io_ =
  80. base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
  81. url_loader_factory_on_io_.get());
  82. }
  83. return shared_url_loader_factory_on_io_;
  84. }
  85. int AwSafeBrowsingUIManager::GetErrorUiType(
  86. content::WebContents* web_contents) const {
  87. UIManagerClient* client = UIManagerClient::FromWebContents(web_contents);
  88. DCHECK(client);
  89. return client->GetErrorUiType();
  90. }
  91. void AwSafeBrowsingUIManager::SendThreatDetails(
  92. content::BrowserContext* browser_context,
  93. std::unique_ptr<safe_browsing::ClientSafeBrowsingReportRequest> report) {
  94. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  95. DVLOG(1) << "Sending threat details";
  96. safe_browsing::AwPingManagerFactory::GetForBrowserContext(browser_context)
  97. ->ReportThreatDetails(std::move(report));
  98. }
  99. safe_browsing::BaseBlockingPage*
  100. AwSafeBrowsingUIManager::CreateBlockingPageForSubresource(
  101. content::WebContents* contents,
  102. const GURL& blocked_url,
  103. const UnsafeResource& unsafe_resource) {
  104. // The AwWebResourceRequest can't be provided yet, since the navigation hasn't
  105. // started. Once it has, it will be provided via
  106. // AwSafeBrowsingBlockingPage::CreatedErrorPageNavigation.
  107. AwSafeBrowsingBlockingPage* blocking_page =
  108. AwSafeBrowsingBlockingPage::CreateBlockingPage(
  109. this, contents, blocked_url, unsafe_resource, nullptr);
  110. return blocking_page;
  111. }
  112. void AwSafeBrowsingUIManager::CreateURLLoaderFactoryForIO(
  113. mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver) {
  114. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  115. auto url_loader_factory_params =
  116. network::mojom::URLLoaderFactoryParams::New();
  117. url_loader_factory_params->process_id = network::mojom::kBrowserProcessId;
  118. url_loader_factory_params->is_corb_enabled = false;
  119. network_context_->GetNetworkContext()->CreateURLLoaderFactory(
  120. std::move(receiver), std::move(url_loader_factory_params));
  121. }
  122. scoped_refptr<network::SharedURLLoaderFactory>
  123. AwSafeBrowsingUIManager::GetURLLoaderFactory() {
  124. return network_context_->GetURLLoaderFactory();
  125. }
  126. } // namespace android_webview