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