Home | History | Annotate | Download | only in ssl
      1 // Copyright (c) 2012 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 
      5 #ifndef CHROME_BROWSER_SSL_SSL_BLOCKING_PAGE_H_
      6 #define CHROME_BROWSER_SSL_SSL_BLOCKING_PAGE_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/callback.h"
     12 #include "base/strings/string16.h"
     13 #include "base/time/time.h"
     14 #include "chrome/browser/history/history_service.h"
     15 #include "content/public/browser/interstitial_page_delegate.h"
     16 #include "net/ssl/ssl_info.h"
     17 #include "url/gurl.h"
     18 
     19 namespace base {
     20 class DictionaryValue;
     21 }
     22 
     23 namespace content {
     24 class InterstitialPage;
     25 class WebContents;
     26 }
     27 
     28 // This class is responsible for showing/hiding the interstitial page that is
     29 // shown when a certificate error happens.
     30 // It deletes itself when the interstitial page is closed.
     31 //
     32 // This class should only be used on the UI thread because its implementation
     33 // uses captive_portal::CaptivePortalService which can only be accessed on the
     34 // UI thread.
     35 class SSLBlockingPage : public content::InterstitialPageDelegate,
     36                         public content::NotificationObserver {
     37  public:
     38   // These represent the commands sent from the interstitial JavaScript. They
     39   // are defined in chrome/browser/resources/ssl/ssl_errors_common.js.
     40   // DO NOT reorder or change these without also changing the JavaScript!
     41   enum SSLBlockingPageCommands {
     42    CMD_DONT_PROCEED = 0,
     43    CMD_PROCEED = 1,
     44    CMD_MORE = 2,
     45    CMD_RELOAD = 3,
     46    CMD_HELP = 4
     47   };
     48 
     49   SSLBlockingPage(
     50       content::WebContents* web_contents,
     51       int cert_error,
     52       const net::SSLInfo& ssl_info,
     53       const GURL& request_url,
     54       bool overridable,
     55       bool strict_enforcement,
     56       const base::Callback<void(bool)>& callback);
     57   virtual ~SSLBlockingPage();
     58 
     59   // A method that sets strings in the specified dictionary from the passed
     60   // vector so that they can be used to resource the ssl_roadblock.html/
     61   // ssl_error.html files.
     62   // Note: there can be up to 5 strings in |extra_info|.
     63   static void SetExtraInfo(base::DictionaryValue* strings,
     64                            const std::vector<base::string16>& extra_info);
     65 
     66  protected:
     67   // InterstitialPageDelegate implementation.
     68   virtual std::string GetHTMLContents() OVERRIDE;
     69   virtual void CommandReceived(const std::string& command) OVERRIDE;
     70   virtual void OverrideEntry(content::NavigationEntry* entry) OVERRIDE;
     71   virtual void OverrideRendererPrefs(
     72       content::RendererPreferences* prefs) OVERRIDE;
     73   virtual void OnProceed() OVERRIDE;
     74   virtual void OnDontProceed() OVERRIDE;
     75 
     76  private:
     77   void NotifyDenyCertificate();
     78   void NotifyAllowCertificate();
     79 
     80   // These fetch the appropriate HTML page, depending on the
     81   // SSLInterstitialVersion Finch trial.
     82   std::string GetHTMLContentsV1();
     83   std::string GetHTMLContentsV2();
     84 
     85   // Used to query the HistoryService to see if the URL is in history. For UMA.
     86   void OnGotHistoryCount(HistoryService::Handle handle,
     87                          bool success,
     88                          int num_visits,
     89                          base::Time first_visit);
     90 
     91   // content::NotificationObserver:
     92   virtual void Observe(
     93       int type,
     94       const content::NotificationSource& source,
     95       const content::NotificationDetails& details) OVERRIDE;
     96 
     97   base::Callback<void(bool)> callback_;
     98 
     99   content::WebContents* web_contents_;
    100   int cert_error_;
    101   const net::SSLInfo ssl_info_;
    102   GURL request_url_;
    103   // Could the user successfully override the error?
    104   bool overridable_;
    105   // Has the site requested strict enforcement of certificate errors?
    106   bool strict_enforcement_;
    107   content::InterstitialPage* interstitial_page_;  // Owns us.
    108   // Is the hostname for an internal network?
    109   bool internal_;
    110   // How many times is this same URL in history?
    111   int num_visits_;
    112   // Used for getting num_visits_.
    113   CancelableRequestConsumer request_consumer_;
    114   // Is captive portal detection enabled?
    115   bool captive_portal_detection_enabled_;
    116   // Did the probe complete before the interstitial was closed?
    117   bool captive_portal_probe_completed_;
    118   // Did the captive portal probe receive an error or get a non-HTTP response?
    119   bool captive_portal_no_response_;
    120   // Was a captive portal detected?
    121   bool captive_portal_detected_;
    122 
    123   // For the FieldTrial: this contains the name of the condition.
    124   std::string trialCondition_;
    125 
    126   content::NotificationRegistrar registrar_;
    127 
    128   DISALLOW_COPY_AND_ASSIGN(SSLBlockingPage);
    129 };
    130 
    131 #endif  // CHROME_BROWSER_SSL_SSL_BLOCKING_PAGE_H_
    132