weblayer_security_blocking_page_factory.cc 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. // Copyright 2020 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 "weblayer/browser/weblayer_security_blocking_page_factory.h"
  5. #include "build/build_config.h"
  6. #include "components/captive_portal/core/buildflags.h"
  7. #include "components/security_interstitials/content/content_metrics_helper.h"
  8. #include "components/security_interstitials/content/insecure_form_blocking_page.h"
  9. #include "components/security_interstitials/content/settings_page_helper.h"
  10. #include "components/security_interstitials/content/ssl_blocking_page.h"
  11. #include "components/security_interstitials/core/metrics_helper.h"
  12. #include "content/public/browser/web_contents.h"
  13. #include "weblayer/browser/captive_portal_service_factory.h"
  14. #include "weblayer/browser/insecure_form_controller_client.h"
  15. #include "weblayer/browser/ssl_error_controller_client.h"
  16. #if BUILDFLAG(IS_ANDROID)
  17. #include "content/public/browser/page_navigator.h"
  18. #include "content/public/browser/web_contents.h"
  19. #include "content/public/common/referrer.h"
  20. #include "ui/base/window_open_disposition.h"
  21. #endif
  22. namespace weblayer {
  23. namespace {
  24. #if BUILDFLAG(IS_ANDROID)
  25. GURL GetCaptivePortalLoginPageUrlInternal() {
  26. // NOTE: This is taken from the default login URL in //chrome's
  27. // CaptivePortalHelper.java, which is used in the implementation referenced
  28. // in OpenLoginPage() below.
  29. return GURL("http://connectivitycheck.gstatic.com/generate_204");
  30. }
  31. #endif
  32. void OpenLoginPage(content::WebContents* web_contents) {
  33. // TODO(https://crbug.com/1030692): Componentize and share the
  34. // Android implementation from //chrome's
  35. // ChromeSecurityBlockingPageFactory::OpenLoginPage(), from which this is
  36. // adapted.
  37. #if BUILDFLAG(IS_ANDROID)
  38. content::OpenURLParams params(GetCaptivePortalLoginPageUrlInternal(),
  39. content::Referrer(),
  40. WindowOpenDisposition::NEW_FOREGROUND_TAB,
  41. ui::PAGE_TRANSITION_LINK, false);
  42. web_contents->OpenURL(params);
  43. #else
  44. NOTIMPLEMENTED();
  45. #endif
  46. }
  47. std::unique_ptr<security_interstitials::MetricsHelper>
  48. CreateMetricsHelperAndStartRecording(content::WebContents* web_contents,
  49. const GURL& request_url,
  50. const std::string& metric_prefix,
  51. bool overridable) {
  52. security_interstitials::MetricsHelper::ReportDetails report_details;
  53. report_details.metric_prefix = metric_prefix;
  54. auto metrics_helper = std::make_unique<ContentMetricsHelper>(
  55. /*history_service=*/nullptr, request_url, report_details);
  56. #if BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION)
  57. metrics_helper.get()->StartRecordingCaptivePortalMetrics(
  58. CaptivePortalServiceFactory::GetForBrowserContext(
  59. web_contents->GetBrowserContext()),
  60. overridable);
  61. #endif
  62. return metrics_helper;
  63. }
  64. std::unique_ptr<security_interstitials::SettingsPageHelper>
  65. CreateSettingsPageHelper() {
  66. // TODO(crbug.com/1078381): Set settings_page_helper once enhanced protection
  67. // is supported on weblayer.
  68. return nullptr;
  69. }
  70. } // namespace
  71. std::unique_ptr<SSLBlockingPage>
  72. WebLayerSecurityBlockingPageFactory::CreateSSLPage(
  73. content::WebContents* web_contents,
  74. int cert_error,
  75. const net::SSLInfo& ssl_info,
  76. const GURL& request_url,
  77. int options_mask,
  78. const base::Time& time_triggered,
  79. const GURL& support_url,
  80. std::unique_ptr<SSLCertReporter> ssl_cert_reporter) {
  81. bool overridable = SSLBlockingPage::IsOverridable(options_mask);
  82. auto controller_client = std::make_unique<SSLErrorControllerClient>(
  83. web_contents, cert_error, ssl_info, request_url,
  84. CreateMetricsHelperAndStartRecording(
  85. web_contents, request_url,
  86. overridable ? "ssl_overridable" : "ssl_nonoverridable", overridable),
  87. CreateSettingsPageHelper());
  88. auto interstitial_page = std::make_unique<SSLBlockingPage>(
  89. web_contents, cert_error, ssl_info, request_url, options_mask,
  90. base::Time::NowFromSystemTime(), /*support_url=*/GURL(),
  91. std::move(ssl_cert_reporter), overridable,
  92. /*can_show_enhanced_protection_message=*/false,
  93. std::move(controller_client));
  94. return interstitial_page;
  95. }
  96. std::unique_ptr<CaptivePortalBlockingPage>
  97. WebLayerSecurityBlockingPageFactory::CreateCaptivePortalBlockingPage(
  98. content::WebContents* web_contents,
  99. const GURL& request_url,
  100. const GURL& login_url,
  101. std::unique_ptr<SSLCertReporter> ssl_cert_reporter,
  102. const net::SSLInfo& ssl_info,
  103. int cert_error) {
  104. auto controller_client = std::make_unique<SSLErrorControllerClient>(
  105. web_contents, cert_error, ssl_info, request_url,
  106. CreateMetricsHelperAndStartRecording(web_contents, request_url,
  107. "captive_portal", false),
  108. CreateSettingsPageHelper());
  109. auto interstitial_page = std::make_unique<CaptivePortalBlockingPage>(
  110. web_contents, request_url, login_url, std::move(ssl_cert_reporter),
  111. /*can_show_enhanced_protection_message=*/false, ssl_info,
  112. std::move(controller_client), base::BindRepeating(&OpenLoginPage));
  113. return interstitial_page;
  114. }
  115. std::unique_ptr<BadClockBlockingPage>
  116. WebLayerSecurityBlockingPageFactory::CreateBadClockBlockingPage(
  117. content::WebContents* web_contents,
  118. int cert_error,
  119. const net::SSLInfo& ssl_info,
  120. const GURL& request_url,
  121. const base::Time& time_triggered,
  122. ssl_errors::ClockState clock_state,
  123. std::unique_ptr<SSLCertReporter> ssl_cert_reporter) {
  124. auto controller_client = std::make_unique<SSLErrorControllerClient>(
  125. web_contents, cert_error, ssl_info, request_url,
  126. CreateMetricsHelperAndStartRecording(web_contents, request_url,
  127. "bad_clock", false),
  128. CreateSettingsPageHelper());
  129. auto interstitial_page = std::make_unique<BadClockBlockingPage>(
  130. web_contents, cert_error, ssl_info, request_url,
  131. base::Time::NowFromSystemTime(),
  132. /*can_show_enhanced_protection_message=*/false, clock_state,
  133. std::move(ssl_cert_reporter), std::move(controller_client));
  134. return interstitial_page;
  135. }
  136. std::unique_ptr<MITMSoftwareBlockingPage>
  137. WebLayerSecurityBlockingPageFactory::CreateMITMSoftwareBlockingPage(
  138. content::WebContents* web_contents,
  139. int cert_error,
  140. const GURL& request_url,
  141. std::unique_ptr<SSLCertReporter> ssl_cert_reporter,
  142. const net::SSLInfo& ssl_info,
  143. const std::string& mitm_software_name) {
  144. auto controller_client = std::make_unique<SSLErrorControllerClient>(
  145. web_contents, cert_error, ssl_info, request_url,
  146. CreateMetricsHelperAndStartRecording(web_contents, request_url,
  147. "mitm_software", false),
  148. CreateSettingsPageHelper());
  149. auto interstitial_page = std::make_unique<MITMSoftwareBlockingPage>(
  150. web_contents, cert_error, request_url, std::move(ssl_cert_reporter),
  151. /*can_show_enhanced_protection_message=*/false, ssl_info,
  152. mitm_software_name,
  153. /*is_enterprise_managed=*/false, std::move(controller_client));
  154. return interstitial_page;
  155. }
  156. std::unique_ptr<BlockedInterceptionBlockingPage>
  157. WebLayerSecurityBlockingPageFactory::CreateBlockedInterceptionBlockingPage(
  158. content::WebContents* web_contents,
  159. int cert_error,
  160. const GURL& request_url,
  161. std::unique_ptr<SSLCertReporter> ssl_cert_reporter,
  162. const net::SSLInfo& ssl_info) {
  163. auto controller_client = std::make_unique<SSLErrorControllerClient>(
  164. web_contents, cert_error, ssl_info, request_url,
  165. CreateMetricsHelperAndStartRecording(web_contents, request_url,
  166. "blocked_interception", false),
  167. CreateSettingsPageHelper());
  168. auto interstitial_page = std::make_unique<BlockedInterceptionBlockingPage>(
  169. web_contents, cert_error, request_url, std::move(ssl_cert_reporter),
  170. /*can_show_enhanced_protection_message=*/false, ssl_info,
  171. std::move(controller_client));
  172. return interstitial_page;
  173. }
  174. std::unique_ptr<security_interstitials::InsecureFormBlockingPage>
  175. WebLayerSecurityBlockingPageFactory::CreateInsecureFormBlockingPage(
  176. content::WebContents* web_contents,
  177. const GURL& request_url) {
  178. std::unique_ptr<InsecureFormControllerClient> client =
  179. std::make_unique<InsecureFormControllerClient>(web_contents, request_url);
  180. auto page =
  181. std::make_unique<security_interstitials::InsecureFormBlockingPage>(
  182. web_contents, request_url, std::move(client));
  183. return page;
  184. }
  185. std::unique_ptr<security_interstitials::HttpsOnlyModeBlockingPage>
  186. WebLayerSecurityBlockingPageFactory::CreateHttpsOnlyModeBlockingPage(
  187. content::WebContents* web_contents,
  188. const GURL& request_url) {
  189. // HTTPS-only mode is not implemented for weblayer.
  190. return nullptr;
  191. }
  192. #if BUILDFLAG(IS_ANDROID)
  193. // static
  194. GURL WebLayerSecurityBlockingPageFactory::
  195. GetCaptivePortalLoginPageUrlForTesting() {
  196. return GetCaptivePortalLoginPageUrlInternal();
  197. }
  198. #endif
  199. } // namespace weblayer