safe_browsing_resource_throttle.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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_RENDERER_HOST_SAFE_BROWSING_RESOURCE_THROTTLE_H_
6#define CHROME_BROWSER_RENDERER_HOST_SAFE_BROWSING_RESOURCE_THROTTLE_H_
7
8#include <string>
9#include <vector>
10
11#include "base/memory/ref_counted.h"
12#include "base/time/time.h"
13#include "base/timer/timer.h"
14#include "chrome/browser/safe_browsing/database_manager.h"
15#include "chrome/browser/safe_browsing/ui_manager.h"
16#include "content/public/browser/resource_throttle.h"
17
18class ResourceDispatcherHost;
19
20namespace net {
21class URLRequest;
22}
23
24// SafeBrowsingResourceThrottle checks that URLs are "safe" before navigating
25// to them. To be considered "safe", a URL must not appear in the
26// malware/phishing blacklists (see SafeBrowsingService for details).
27//
28// This check is done before requesting the original URL, and additionally
29// before following any subsequent redirect.
30//
31// In the common case, the check completes synchronously (no match in the bloom
32// filter), so the request's flow is un-interrupted.
33//
34// However if the URL fails this quick check, it has the possibility of being
35// on the blacklist. Now the request is suspended (prevented from starting),
36// and a more expensive safe browsing check is begun (fetches the full hashes).
37//
38// Note that the safe browsing check takes at most kCheckUrlTimeoutMs
39// milliseconds. If it takes longer than this, then the system defaults to
40// treating the URL as safe.
41//
42// Once the safe browsing check has completed, if the URL was decided to be
43// dangerous, a warning page is thrown up and the request remains suspended.
44// If on the other hand the URL was decided to be safe, the request is
45// resumed.
46class SafeBrowsingResourceThrottle
47    : public content::ResourceThrottle,
48      public SafeBrowsingDatabaseManager::Client,
49      public base::SupportsWeakPtr<SafeBrowsingResourceThrottle> {
50 public:
51  SafeBrowsingResourceThrottle(const net::URLRequest* request,
52                               bool is_subresource,
53                               SafeBrowsingService* safe_browsing);
54
55  // content::ResourceThrottle implementation (called on IO thread):
56  virtual void WillStartRequest(bool* defer) OVERRIDE;
57  virtual void WillRedirectRequest(const GURL& new_url, bool* defer) OVERRIDE;
58  virtual const char* GetNameForLogging() const OVERRIDE;
59
60  // SafeBrowsingDabaseManager::Client implementation (called on IO thread):
61  virtual void OnCheckBrowseUrlResult(
62      const GURL& url, SBThreatType result) OVERRIDE;
63
64 private:
65  // Describes what phase of the check a throttle is in.
66  enum State {
67    STATE_NONE,
68    STATE_CHECKING_URL,
69    STATE_DISPLAYING_BLOCKING_PAGE,
70  };
71
72  // Describes what stage of the request got paused by the check.
73  enum DeferState {
74    DEFERRED_NONE,
75    DEFERRED_START,
76    DEFERRED_REDIRECT,
77  };
78
79  virtual ~SafeBrowsingResourceThrottle();
80
81  // SafeBrowsingService::UrlCheckCallback implementation.
82  void OnBlockingPageComplete(bool proceed);
83
84  // Starts running |url| through the safe browsing check. Returns true if the
85  // URL is safe to visit. Otherwise returns false and will call
86  // OnBrowseUrlResult() when the check has completed.
87  bool CheckUrl(const GURL& url);
88
89  // Callback for when the safe browsing check (which was initiated by
90  // StartCheckingUrl()) has taken longer than kCheckUrlTimeoutMs.
91  void OnCheckUrlTimeout();
92
93  // Starts displaying the safe browsing interstitial page if it's not
94  // prerendering. Called on the UI thread.
95  static void StartDisplayingBlockingPage(
96      const base::WeakPtr<SafeBrowsingResourceThrottle>& throttle,
97      scoped_refptr<SafeBrowsingUIManager> ui_manager,
98      const SafeBrowsingUIManager::UnsafeResource& resource);
99
100  // Called on the IO thread if the request turned out to be for a prerendered
101  // page.
102  void Cancel();
103
104  // Resumes the request, by continuing the deferred action (either starting the
105  // request, or following a redirect).
106  void ResumeRequest();
107
108  State state_;
109  DeferState defer_state_;
110
111  // The result of the most recent safe browsing check. Only valid to read this
112  // when state_ != STATE_CHECKING_URL.
113  SBThreatType threat_type_;
114
115  // The time when the outstanding safe browsing check was started.
116  base::TimeTicks url_check_start_time_;
117
118  // Timer to abort the safe browsing check if it takes too long.
119  base::OneShotTimer<SafeBrowsingResourceThrottle> timer_;
120
121  // The redirect chain for this resource
122  std::vector<GURL> redirect_urls_;
123
124  GURL url_being_checked_;
125
126  scoped_refptr<SafeBrowsingDatabaseManager> database_manager_;
127  scoped_refptr<SafeBrowsingUIManager> ui_manager_;
128  const net::URLRequest* request_;
129  bool is_subresource_;
130
131  DISALLOW_COPY_AND_ASSIGN(SafeBrowsingResourceThrottle);
132};
133
134
135#endif  // CHROME_BROWSER_RENDERER_HOST_SAFE_BROWSING_RESOURCE_THROTTLE_H_
136