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