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

Side by Side Diff: chrome/browser/safe_browsing/protocol_manager.cc

Issue 1543153002: Add a GetFullHashWithApis method to Protocol Manager. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 11 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/safe_browsing/protocol_manager.h" 5 #include "chrome/browser/safe_browsing/protocol_manager.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/base64.h"
9 #include "base/environment.h" 10 #include "base/environment.h"
10 #include "base/logging.h" 11 #include "base/logging.h"
11 #include "base/macros.h" 12 #include "base/macros.h"
12 #include "base/metrics/histogram_macros.h" 13 #include "base/metrics/histogram_macros.h"
13 #include "base/metrics/sparse_histogram.h" 14 #include "base/metrics/sparse_histogram.h"
14 #include "base/profiler/scoped_tracker.h" 15 #include "base/profiler/scoped_tracker.h"
15 #include "base/rand_util.h" 16 #include "base/rand_util.h"
16 #include "base/stl_util.h" 17 #include "base/stl_util.h"
17 #include "base/strings/string_number_conversions.h" 18 #include "base/strings/string_number_conversions.h"
18 #include "base/strings/string_util.h" 19 #include "base/strings/string_util.h"
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 static const int kSbTimerStartIntervalSecMax = 300; 86 static const int kSbTimerStartIntervalSecMax = 300;
86 87
87 // The maximum time, in seconds, to wait for a response to an update request. 88 // The maximum time, in seconds, to wait for a response to an update request.
88 static const int kSbMaxUpdateWaitSec = 30; 89 static const int kSbMaxUpdateWaitSec = 30;
89 90
90 // Maximum back off multiplier. 91 // Maximum back off multiplier.
91 static const size_t kSbMaxBackOff = 8; 92 static const size_t kSbMaxBackOff = 8;
92 93
93 const char kUmaHashResponseMetricName[] = "SB2.GetHashResponseOrErrorCode"; 94 const char kUmaHashResponseMetricName[] = "SB2.GetHashResponseOrErrorCode";
94 95
96 // The V4 URL prefix where browser fetches hashes from the V4 server.
97 const char kSbV4UrlPrefix[] = "https://safebrowsing.googleapis.com/v4";
98
95 // The default SBProtocolManagerFactory. 99 // The default SBProtocolManagerFactory.
96 class SBProtocolManagerFactoryImpl : public SBProtocolManagerFactory { 100 class SBProtocolManagerFactoryImpl : public SBProtocolManagerFactory {
97 public: 101 public:
98 SBProtocolManagerFactoryImpl() {} 102 SBProtocolManagerFactoryImpl() {}
99 ~SBProtocolManagerFactoryImpl() override {} 103 ~SBProtocolManagerFactoryImpl() override {}
100 SafeBrowsingProtocolManager* CreateProtocolManager( 104 SafeBrowsingProtocolManager* CreateProtocolManager(
101 SafeBrowsingProtocolManagerDelegate* delegate, 105 SafeBrowsingProtocolManagerDelegate* delegate,
102 net::URLRequestContextGetter* request_context_getter, 106 net::URLRequestContextGetter* request_context_getter,
103 const SafeBrowsingProtocolConfig& config) override { 107 const SafeBrowsingProtocolConfig& config) override {
104 return new SafeBrowsingProtocolManager(delegate, request_context_getter, 108 return new SafeBrowsingProtocolManager(delegate, request_context_getter,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 193
190 bool SafeBrowsingProtocolManager::IsUpdateScheduled() const { 194 bool SafeBrowsingProtocolManager::IsUpdateScheduled() const {
191 return update_timer_.IsRunning(); 195 return update_timer_.IsRunning();
192 } 196 }
193 197
194 SafeBrowsingProtocolManager::~SafeBrowsingProtocolManager() { 198 SafeBrowsingProtocolManager::~SafeBrowsingProtocolManager() {
195 // Delete in-progress SafeBrowsing requests. 199 // Delete in-progress SafeBrowsing requests.
196 STLDeleteContainerPairFirstPointers(hash_requests_.begin(), 200 STLDeleteContainerPairFirstPointers(hash_requests_.begin(),
197 hash_requests_.end()); 201 hash_requests_.end());
198 hash_requests_.clear(); 202 hash_requests_.clear();
203
204 STLDeleteContainerPairFirstPointers(v4_hash_requests_.begin(),
205 v4_hash_requests_.end());
206 v4_hash_requests_.clear();
199 } 207 }
200 208
201 // We can only have one update or chunk request outstanding, but there may be 209 // We can only have one update or chunk request outstanding, but there may be
202 // multiple GetHash requests pending since we don't want to serialize them and 210 // multiple GetHash requests pending since we don't want to serialize them and
203 // slow down the user. 211 // slow down the user.
204 void SafeBrowsingProtocolManager::GetFullHash( 212 void SafeBrowsingProtocolManager::GetFullHash(
205 const std::vector<SBPrefix>& prefixes, 213 const std::vector<SBPrefix>& prefixes,
206 FullHashCallback callback, 214 FullHashCallback callback,
207 bool is_download, 215 bool is_download,
208 bool is_extended_reporting) { 216 bool is_extended_reporting) {
(...skipping 15 matching lines...) Expand all
224 hash_requests_[fetcher] = FullHashDetails(callback, is_download); 232 hash_requests_[fetcher] = FullHashDetails(callback, is_download);
225 233
226 const std::string get_hash = FormatGetHash(prefixes); 234 const std::string get_hash = FormatGetHash(prefixes);
227 235
228 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE); 236 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE);
229 fetcher->SetRequestContext(request_context_getter_.get()); 237 fetcher->SetRequestContext(request_context_getter_.get());
230 fetcher->SetUploadData("text/plain", get_hash); 238 fetcher->SetUploadData("text/plain", get_hash);
231 fetcher->Start(); 239 fetcher->Start();
232 } 240 }
233 241
242 std::string SafeBrowsingProtocolManager::GetV4HashRequest(
243 const std::vector<SBPrefix>& prefixes,
244 ThreatType threat_type) {
245 // Build the request. Client info and client states are not added to the
246 // request protocol buffer. Client info is passed as params in the url.
247 FindFullHashesRequest req;
248 ThreatInfo* info = req.mutable_threat_info();
249 info->add_threat_types(threat_type);
250 info->add_platform_types(CHROME_PLATFORM);
251 info->add_threat_entry_types(URL_EXPRESSION);
252 for (const SBPrefix& prefix : prefixes) {
253 std::string hash(reinterpret_cast<const char*>(&prefix), sizeof(SBPrefix));
254 info->add_threat_entries()->set_hash(hash);
255 }
256
257 // Serialize and Base64 encode.
258 std::string req_data, req_base64;
259 req.SerializeToString(&req_data);
260 base::Base64Encode(req_data, &req_base64);
261
262 return req_base64;
263 }
264
265 void SafeBrowsingProtocolManager::GetV4FullHashes(
266 const std::vector<SBPrefix>& prefixes,
267 ThreatType threat_type,
268 FullHashCallback callback) {
269 DCHECK(CalledOnValidThread());
270 // TODO(kcarattini): Implement backoff behavior.
271
272 std::string req_base64 = GetV4HashRequest(prefixes, threat_type);
273 GURL gethash_url = GetV4HashUrl(req_base64);
274
275 net::URLFetcher* fetcher =
276 net::URLFetcher::Create(url_fetcher_id_++, gethash_url,
277 net::URLFetcher::GET, this)
278 .release();
279 // TODO(kcarattini): Implement a new response processor.
280 v4_hash_requests_[fetcher] = FullHashDetails(callback,
281 false /* is_download */);
282
283 fetcher->SetLoadFlags(net::LOAD_DISABLE_CACHE);
284 fetcher->SetRequestContext(request_context_getter_.get());
285 fetcher->Start();
286 }
287
288 void SafeBrowsingProtocolManager::GetFullHashesWithApis(
289 const std::vector<SBPrefix>& prefixes,
290 FullHashCallback callback) {
291 GetV4FullHashes(prefixes, API_ABUSE, callback);
292 }
293
234 void SafeBrowsingProtocolManager::GetNextUpdate() { 294 void SafeBrowsingProtocolManager::GetNextUpdate() {
235 DCHECK(CalledOnValidThread()); 295 DCHECK(CalledOnValidThread());
236 if (request_.get() || request_type_ != NO_REQUEST) 296 if (request_.get() || request_type_ != NO_REQUEST)
237 return; 297 return;
238 298
239 IssueUpdateRequest(); 299 IssueUpdateRequest();
240 } 300 }
241 301
242 // net::URLFetcherDelegate implementation ---------------------------------- 302 // net::URLFetcherDelegate implementation ----------------------------------
243 303
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 return GURL(url); 814 return GURL(url);
755 } 815 }
756 816
757 GURL SafeBrowsingProtocolManager::GetHashUrl(bool is_extended_reporting) const { 817 GURL SafeBrowsingProtocolManager::GetHashUrl(bool is_extended_reporting) const {
758 std::string url = SafeBrowsingProtocolManagerHelper::ComposeUrl( 818 std::string url = SafeBrowsingProtocolManagerHelper::ComposeUrl(
759 url_prefix_, "gethash", client_name_, version_, additional_query_, 819 url_prefix_, "gethash", client_name_, version_, additional_query_,
760 is_extended_reporting); 820 is_extended_reporting);
761 return GURL(url); 821 return GURL(url);
762 } 822 }
763 823
824 // The API hash call uses the pver4 Safe Browsing server.
825 GURL SafeBrowsingProtocolManager::GetV4HashUrl(
826 const std::string& request_base64) const {
827 std::string url = SafeBrowsingProtocolManagerHelper::ComposePver4Url(
828 kSbV4UrlPrefix, "encodedFullHashes",
829 request_base64, client_name_, version_);
830 return GURL(url);
831 }
832
764 GURL SafeBrowsingProtocolManager::NextChunkUrl(const std::string& url) const { 833 GURL SafeBrowsingProtocolManager::NextChunkUrl(const std::string& url) const {
765 DCHECK(CalledOnValidThread()); 834 DCHECK(CalledOnValidThread());
766 std::string next_url; 835 std::string next_url;
767 if (!base::StartsWith(url, "http://", base::CompareCase::INSENSITIVE_ASCII) && 836 if (!base::StartsWith(url, "http://", base::CompareCase::INSENSITIVE_ASCII) &&
768 !base::StartsWith(url, "https://", 837 !base::StartsWith(url, "https://",
769 base::CompareCase::INSENSITIVE_ASCII)) { 838 base::CompareCase::INSENSITIVE_ASCII)) {
770 // Use https if we updated via https, otherwise http (useful for testing). 839 // Use https if we updated via https, otherwise http (useful for testing).
771 if (base::StartsWith(url_prefix_, "https://", 840 if (base::StartsWith(url_prefix_, "https://",
772 base::CompareCase::INSENSITIVE_ASCII)) 841 base::CompareCase::INSENSITIVE_ASCII))
773 next_url.append("https://"); 842 next_url.append("https://");
(...skipping 20 matching lines...) Expand all
794 SafeBrowsingProtocolManager::FullHashDetails::FullHashDetails( 863 SafeBrowsingProtocolManager::FullHashDetails::FullHashDetails(
795 FullHashCallback callback, 864 FullHashCallback callback,
796 bool is_download) 865 bool is_download)
797 : callback(callback), is_download(is_download) {} 866 : callback(callback), is_download(is_download) {}
798 867
799 SafeBrowsingProtocolManager::FullHashDetails::~FullHashDetails() {} 868 SafeBrowsingProtocolManager::FullHashDetails::~FullHashDetails() {}
800 869
801 SafeBrowsingProtocolManagerDelegate::~SafeBrowsingProtocolManagerDelegate() {} 870 SafeBrowsingProtocolManagerDelegate::~SafeBrowsingProtocolManagerDelegate() {}
802 871
803 } // namespace safe_browsing 872 } // namespace safe_browsing
OLDNEW
« no previous file with comments | « chrome/browser/safe_browsing/protocol_manager.h ('k') | chrome/browser/safe_browsing/protocol_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698