15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_SAFE_BROWSING_PING_MANAGER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SAFE_BROWSING_PING_MANAGER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class that reports safebrowsing statistics to Google's SafeBrowsing 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// servers. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/protocol_manager_helper.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_util.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContextGetter; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingPingManager : public net::URLFetcherDelegate { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SafeBrowsingPingManager(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create an instance of the safe browsing ping manager. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static SafeBrowsingPingManager* Create( 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestContextGetter* request_context_getter, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SafeBrowsingProtocolConfig& config); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // net::URLFetcherDelegate interface. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For UMA users we report to Google when a SafeBrowsing interstitial is shown 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the user. |threat_type| should be one of the types known by 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SafeBrowsingHitUrl. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportSafeBrowsingHit(const GURL& malicious_url, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& referrer_url, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_subresource, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBThreatType threat_type, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& post_data); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Users can opt-in on the SafeBrowsing interstitial to send detailed 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // malware reports. |report| is the serialized report. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportMalwareDetails(const std::string& report); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SafeBrowsingPingManagerTest, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestSafeBrowsingHitUrl); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SafeBrowsingPingManagerTest, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestMalwareDetailsUrl); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) typedef std::set<const net::URLFetcher*> Reports; 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructs a SafeBrowsingPingManager that issues network requests 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // using |request_context_getter|. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SafeBrowsingPingManager( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestContextGetter* request_context_getter, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SafeBrowsingProtocolConfig& config); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generates URL for reporting safe browsing hits for UMA users. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL SafeBrowsingHitUrl( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& malicious_url, const GURL& page_url, const GURL& referrer_url, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_subresource, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SBThreatType threat_type) const; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generates URL for reporting malware details for users who opt-in. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL MalwareDetailsUrl() const; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current product version sent in each request. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string version_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The safe browsing client name sent in each request. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string client_name_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The context we use to issue network requests. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> request_context_getter_; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL prefix where browser reports hits to the safebrowsing list and 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sends detaild malware reports for UMA users. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string url_prefix_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Track outstanding SafeBrowsing report fetchers for clean up. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We add both "hit" and "detail" fetchers in this set. 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Reports safebrowsing_reports_; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SafeBrowsingPingManager); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_SAFE_BROWSING_PING_MANAGER_H_ 95