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 // The Safe Browsing service is responsible for downloading anti-phishing and 6 // anti-malware tables and checking urls against them. 7 8 #ifndef CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_SERVICE_H_ 9 #define CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_SERVICE_H_ 10 11 #include <map> 12 #include <string> 13 14 #include "base/callback.h" 15 #include "base/files/file_path.h" 16 #include "base/memory/ref_counted.h" 17 #include "base/memory/scoped_ptr.h" 18 #include "base/observer_list.h" 19 #include "base/sequenced_task_runner_helpers.h" 20 #include "chrome/browser/safe_browsing/incident_reporting/delayed_analysis_callback.h" 21 #include "chrome/browser/safe_browsing/safe_browsing_util.h" 22 #include "content/public/browser/browser_thread.h" 23 #include "content/public/browser/notification_observer.h" 24 #include "content/public/browser/notification_registrar.h" 25 26 class PrefChangeRegistrar; 27 class PrefService; 28 class Profile; 29 struct SafeBrowsingProtocolConfig; 30 class SafeBrowsingDatabaseManager; 31 class SafeBrowsingPingManager; 32 class SafeBrowsingProtocolManager; 33 class SafeBrowsingServiceFactory; 34 class SafeBrowsingUIManager; 35 class SafeBrowsingURLRequestContextGetter; 36 class TrackedPreferenceValidationDelegate; 37 38 namespace base { 39 class Thread; 40 } 41 42 namespace net { 43 class URLRequestContext; 44 class URLRequestContextGetter; 45 } 46 47 namespace safe_browsing { 48 class ClientSideDetectionService; 49 class DownloadProtectionService; 50 class IncidentReportingService; 51 } 52 53 // Construction needs to happen on the main thread. 54 // The SafeBrowsingService owns both the UI and Database managers which do 55 // the heavylifting of safebrowsing service. Both of these managers stay 56 // alive until SafeBrowsingService is destroyed, however, they are disabled 57 // permanently when Shutdown method is called. 58 class SafeBrowsingService 59 : public base::RefCountedThreadSafe< 60 SafeBrowsingService, 61 content::BrowserThread::DeleteOnUIThread>, 62 public content::NotificationObserver { 63 public: 64 // Makes the passed |factory| the factory used to instanciate 65 // a SafeBrowsingService. Useful for tests. 66 static void RegisterFactory(SafeBrowsingServiceFactory* factory) { 67 factory_ = factory; 68 } 69 70 static base::FilePath GetCookieFilePathForTesting(); 71 72 static base::FilePath GetBaseFilename(); 73 74 // Create an instance of the safe browsing service. 75 static SafeBrowsingService* CreateSafeBrowsingService(); 76 77 #if defined(OS_ANDROID) && defined(FULL_SAFE_BROWSING) 78 // Return whether the user is in mobile safe browsing 79 // field trial enabled group. 80 static bool IsEnabledByFieldTrial(); 81 #endif 82 83 // Called on the UI thread to initialize the service. 84 void Initialize(); 85 86 // Called on the main thread to let us know that the io_thread is going away. 87 void ShutDown(); 88 89 // Called on UI thread to decide if the download file's sha256 hash 90 // should be calculated for safebrowsing. 91 bool DownloadBinHashNeeded() const; 92 93 // Create a protocol config struct. 94 virtual SafeBrowsingProtocolConfig GetProtocolConfig() const; 95 96 bool enabled() const { return enabled_; } 97 98 safe_browsing::ClientSideDetectionService* 99 safe_browsing_detection_service() const { 100 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 101 return csd_service_.get(); 102 } 103 104 // The DownloadProtectionService is not valid after the SafeBrowsingService 105 // is destroyed. 106 safe_browsing::DownloadProtectionService* 107 download_protection_service() const { 108 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 109 return download_service_.get(); 110 } 111 112 net::URLRequestContextGetter* url_request_context(); 113 114 const scoped_refptr<SafeBrowsingUIManager>& ui_manager() const; 115 116 const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager() const; 117 118 SafeBrowsingProtocolManager* protocol_manager() const; 119 120 SafeBrowsingPingManager* ping_manager() const; 121 122 // Returns a preference validation delegate that adds incidents to the 123 // incident reporting service for validation failures. Returns NULL if the 124 // service is not applicable for the given profile. 125 scoped_ptr<TrackedPreferenceValidationDelegate> 126 CreatePreferenceValidationDelegate(Profile* profile) const; 127 128 // Registers |callback| to be run after some delay following process launch. 129 // |callback| will be dropped if the service is not applicable for the 130 // process. 131 void RegisterDelayedAnalysisCallback( 132 const safe_browsing::DelayedAnalysisCallback& callback); 133 134 protected: 135 // Creates the safe browsing service. Need to initialize before using. 136 SafeBrowsingService(); 137 138 virtual ~SafeBrowsingService(); 139 140 virtual SafeBrowsingDatabaseManager* CreateDatabaseManager(); 141 142 virtual SafeBrowsingUIManager* CreateUIManager(); 143 144 // Registers all the delayed analysis with the incident reporting service. 145 // This is where you register your process-wide, profile-independent analysis. 146 virtual void RegisterAllDelayedAnalysis(); 147 148 private: 149 friend class SafeBrowsingServiceFactoryImpl; 150 friend struct content::BrowserThread::DeleteOnThread< 151 content::BrowserThread::UI>; 152 friend class base::DeleteHelper<SafeBrowsingService>; 153 friend class SafeBrowsingServerTest; 154 friend class SafeBrowsingServiceTest; 155 friend class SafeBrowsingURLRequestContextGetter; 156 157 void InitURLRequestContextOnIOThread( 158 net::URLRequestContextGetter* system_url_request_context_getter); 159 160 void DestroyURLRequestContextOnIOThread(); 161 162 // Called to initialize objects that are used on the io_thread. This may be 163 // called multiple times during the life of the SafeBrowsingService. 164 void StartOnIOThread( 165 net::URLRequestContextGetter* url_request_context_getter); 166 167 // Called to stop or shutdown operations on the io_thread. This may be called 168 // multiple times to stop during the life of the SafeBrowsingService. If 169 // shutdown is true, then the operations on the io thread are shutdown 170 // permanently and cannot be restarted. 171 void StopOnIOThread(bool shutdown); 172 173 // Start up SafeBrowsing objects. This can be called at browser start, or when 174 // the user checks the "Enable SafeBrowsing" option in the Advanced options 175 // UI. 176 void Start(); 177 178 // Stops the SafeBrowsingService. This can be called when the safe browsing 179 // preference is disabled. When shutdown is true, operation is permanently 180 // shutdown and cannot be restarted. 181 void Stop(bool shutdown); 182 183 // content::NotificationObserver override 184 virtual void Observe(int type, 185 const content::NotificationSource& source, 186 const content::NotificationDetails& details) OVERRIDE; 187 188 // Starts following the safe browsing preference on |pref_service|. 189 void AddPrefService(PrefService* pref_service); 190 191 // Stop following the safe browsing preference on |pref_service|. 192 void RemovePrefService(PrefService* pref_service); 193 194 // Checks if any profile is currently using the safe browsing service, and 195 // starts or stops the service accordingly. 196 void RefreshState(); 197 198 // The factory used to instanciate a SafeBrowsingService object. 199 // Useful for tests, so they can provide their own implementation of 200 // SafeBrowsingService. 201 static SafeBrowsingServiceFactory* factory_; 202 203 // The SafeBrowsingURLRequestContextGetter used to access 204 // |url_request_context_|. Accessed on UI thread. 205 scoped_refptr<net::URLRequestContextGetter> 206 url_request_context_getter_; 207 208 // The SafeBrowsingURLRequestContext. Accessed on IO thread. 209 scoped_ptr<net::URLRequestContext> url_request_context_; 210 211 // Handles interaction with SafeBrowsing servers. Accessed on IO thread. 212 SafeBrowsingProtocolManager* protocol_manager_; 213 214 // Provides phishing and malware statistics. Accessed on IO thread. 215 SafeBrowsingPingManager* ping_manager_; 216 217 // Whether the service is running. 'enabled_' is used by SafeBrowsingService 218 // on the IO thread during normal operations. 219 bool enabled_; 220 221 // Tracks existing PrefServices, and the safe browsing preference on each. 222 // This is used to determine if any profile is currently using the safe 223 // browsing service, and to start it up or shut it down accordingly. 224 // Accessed on UI thread. 225 std::map<PrefService*, PrefChangeRegistrar*> prefs_map_; 226 227 // Used to track creation and destruction of profiles on the UI thread. 228 content::NotificationRegistrar prefs_registrar_; 229 230 // The ClientSideDetectionService is managed by the SafeBrowsingService, 231 // since its running state and lifecycle depends on SafeBrowsingService's. 232 // Accessed on UI thread. 233 scoped_ptr<safe_browsing::ClientSideDetectionService> csd_service_; 234 235 // The DownloadProtectionService is managed by the SafeBrowsingService, 236 // since its running state and lifecycle depends on SafeBrowsingService's. 237 // Accessed on UI thread. 238 scoped_ptr<safe_browsing::DownloadProtectionService> download_service_; 239 240 scoped_ptr<safe_browsing::IncidentReportingService> incident_service_; 241 242 // The UI manager handles showing interstitials. Accessed on both UI and IO 243 // thread. 244 scoped_refptr<SafeBrowsingUIManager> ui_manager_; 245 246 // The database manager handles the database and download logic. Accessed on 247 // both UI and IO thread. 248 scoped_refptr<SafeBrowsingDatabaseManager> database_manager_; 249 250 DISALLOW_COPY_AND_ASSIGN(SafeBrowsingService); 251 }; 252 253 // Factory for creating SafeBrowsingService. Useful for tests. 254 class SafeBrowsingServiceFactory { 255 public: 256 SafeBrowsingServiceFactory() { } 257 virtual ~SafeBrowsingServiceFactory() { } 258 virtual SafeBrowsingService* CreateSafeBrowsingService() = 0; 259 private: 260 DISALLOW_COPY_AND_ASSIGN(SafeBrowsingServiceFactory); 261 }; 262 263 #endif // CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_SERVICE_H_ 264