Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Side by Side Diff: components/safe_browsing/base_resource_throttle.h

Issue 2876473003: [ABANDONED] [WIP] Refactor SafeBrowsingResourceThrottle in preparation for WebSocket (Closed)
Patch Set: Minor fixes Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/safe_browsing/DEPS ('k') | components/safe_browsing/base_resource_throttle.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 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
5 #ifndef COMPONENTS_SAFE_BROWSING_BASE_RESOURCE_THROTTLE_H_
6 #define COMPONENTS_SAFE_BROWSING_BASE_RESOURCE_THROTTLE_H_
7
8 #include <vector>
9
10 #include "base/macros.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/time/time.h"
13 #include "base/timer/timer.h"
14 #include "components/safe_browsing/base_ui_manager.h"
15 #include "components/safe_browsing_db/database_manager.h"
16 #include "components/security_interstitials/content/unsafe_resource.h"
17 #include "content/public/browser/resource_throttle.h"
18 #include "content/public/common/resource_type.h"
19 #include "net/log/net_log_event_type.h"
20 #include "net/log/net_log_with_source.h"
21 #include "url/gurl.h"
22
23 namespace content {
24 class ResourceRequestInfo;
25 }
26
27 namespace net {
28 class URLRequest;
29 }
30
31 namespace safe_browsing {
32
33 // BaseResourceThrottle checks that URLs are "safe" before
34 // navigating to them. To be considered "safe", a URL must not appear in the
35 // malware/phishing blacklists (see SafeBrowsingService for details).
36 //
37 // Note that the safe browsing check takes at most kCheckUrlTimeoutMs
38 // milliseconds. If it takes longer than this, then the system defaults to
39 // treating the URL as safe.
40 //
41 // If the URL is classified as dangerous, a warning page is thrown up and
42 // the request remains suspended. If the user clicks "proceed" on warning
43 // page, we resume the request.
44 //
45 // Note: The ResourceThrottle interface is called in this order:
46 // WillStartRequest once, WillRedirectRequest zero or more times, and then
47 // WillProcessReponse once.
48 class BaseResourceThrottle
49 : public content::ResourceThrottle,
50 public SafeBrowsingDatabaseManager::Client,
51 public base::SupportsWeakPtr<BaseResourceThrottle> {
52 public:
53 // Construct a BaseResourceThrottle, or return nullptr if we
54 // cannot access the safe browsing API on Android
55 static BaseResourceThrottle* MaybeCreate(
56 net::URLRequest* request,
57 content::ResourceType resource_type,
58 scoped_refptr<SafeBrowsingDatabaseManager>
59 database_manager,
60 scoped_refptr<BaseUIManager> ui_manager);
61
62 // content::ResourceThrottle implementation (called on IO thread):
63 void WillStartRequest(bool* defer) override;
64 void WillRedirectRequest(const net::RedirectInfo& redirect_info,
65 bool* defer) override;
66 void WillProcessResponse(bool* defer) override;
67 bool MustProcessResponseBeforeReadingBody() override;
68
69 const char* GetNameForLogging() const override;
70
71 // SafeBrowsingDatabaseManager::Client implementation (called on IO thread):
72 void OnCheckBrowseUrlResult(
73 const GURL& url,
74 SBThreatType threat_type,
75 const ThreatMetadata& metadata) override;
76
77 protected:
78 BaseResourceThrottle(
79 const net::URLRequest* request,
80 content::ResourceType resource_type,
81 scoped_refptr<SafeBrowsingDatabaseManager>
82 database_manager,
83 scoped_refptr<BaseUIManager> ui_manager);
84
85 ~BaseResourceThrottle() override;
86
87 // If our blocked resource is the main frame, this calls
88 // ContentSubresourceFilterDriverFactory's
89 // OnMainResourceMatchedSafeBrowsingBlacklist method.
90 static void NotifySubresourceFilterOfBlockedResource(
91 const security_interstitials::UnsafeResource& resource);
92
93 // Does nothing in the base class. Override this to destroy prerender contents
94 // in chrome.
95 virtual void MaybeDestroyPrerenderContents(
96 const content::ResourceRequestInfo* info);
97
98 // Posts a task for StartDisplayingBlockingPage
99 virtual void StartDisplayingBlockingPageHelper(
100 security_interstitials::UnsafeResource resource);
101
102 // Called by OnBlockingPageComplete when proceed == false. This removes the
103 // blocking page. This calls ResourceThrottle::Cancel() to show the previous
104 // page, but may be overridden in a subclass.
105 virtual void CancelResourceLoad();
106
107 scoped_refptr<BaseUIManager> ui_manager();
108
109 private:
110 // Describes what phase of the check a throttle is in.
111 enum State {
112 // Haven't started checking or checking is complete. Not deferred.
113 STATE_NONE,
114 // We have one outstanding URL-check. Could be deferred.
115 STATE_CHECKING_URL,
116 // We're displaying a blocking page. Could be deferred.
117 STATE_DISPLAYING_BLOCKING_PAGE,
118 };
119
120 // Describes what stage of the request got paused by the check.
121 enum DeferState {
122 DEFERRED_NONE,
123 DEFERRED_START,
124 DEFERRED_REDIRECT,
125 DEFERRED_UNCHECKED_REDIRECT, // unchecked_redirect_url_ is populated.
126 DEFERRED_PROCESSING,
127 };
128
129 scoped_refptr<BaseUIManager> ui_manager_;
130
131 // Called on the IO thread when the user has decided to proceed with the
132 // current request, or go back.
133 void OnBlockingPageComplete(bool proceed);
134
135 // Starts running |url| through the safe browsing check. Returns true if the
136 // URL is safe to visit. Otherwise returns false and will call
137 // OnBrowseUrlResult() when the check has completed.
138 bool CheckUrl(const GURL& url);
139
140 // Callback for when the safe browsing check (which was initiated by
141 // StartCheckingUrl()) has taken longer than kCheckUrlTimeoutMs.
142 void OnCheckUrlTimeout();
143
144 // Starts displaying the safe browsing interstitial page. Called on the UI
145 // thread.
146 static void StartDisplayingBlockingPage(
147 const base::WeakPtr<BaseResourceThrottle>& throttle,
148 scoped_refptr<BaseUIManager> ui_manager,
149 const security_interstitials::UnsafeResource& resource);
150
151 void ResumeRequest();
152
153 // For marking network events. |name| and |value| can be null.
154 void BeginNetLogEvent(net::NetLogEventType type,
155 const GURL& url,
156 const char* name,
157 const char* value);
158 void EndNetLogEvent(net::NetLogEventType type,
159 const char* name,
160 const char* value);
161
162 // The result of the most recent safe browsing check. Only valid to read this
163 // when state_ != STATE_CHECKING_URL.
164 safe_browsing::SBThreatType threat_type_;
165
166 // The time when we started deferring the request.
167 base::TimeTicks defer_start_time_;
168
169 // Timer to abort the safe browsing check if it takes too long.
170 base::OneShotTimer timer_;
171
172 // The redirect chain for this resource
173 std::vector<GURL> redirect_urls_;
174
175 // If in DEFERRED_UNCHECKED_REDIRECT state, this is the
176 // URL we still need to check before resuming.
177 GURL unchecked_redirect_url_;
178 GURL url_being_checked_;
179
180 scoped_refptr<SafeBrowsingDatabaseManager> database_manager_;
181 const net::URLRequest* request_;
182
183 State state_;
184 DeferState defer_state_;
185
186 const content::ResourceType resource_type_;
187 net::NetLogWithSource net_log_with_source_;
188
189 DISALLOW_COPY_AND_ASSIGN(BaseResourceThrottle);
190 };
191
192 } // namespace safe_browsing
193
194 #endif // COMPONENTS_SAFE_BROWSING_BASE_RESOURCE_THROTTLE_H_
OLDNEW
« no previous file with comments | « components/safe_browsing/DEPS ('k') | components/safe_browsing/base_resource_throttle.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698