1// Copyright (c) 2011 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#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SAFE_BROWSING_CLIENT_H_
6#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SAFE_BROWSING_CLIENT_H_
7#pragma once
8
9#include "base/callback.h"
10#include "base/memory/ref_counted.h"
11#include "base/time.h"
12#include "chrome/browser/safe_browsing/safe_browsing_service.h"
13
14struct DownloadCreateInfo;
15
16// This is a helper class used by DownloadManager to check a download URL with
17// SafeBrowsingService. The client is refcounted and will be  released once
18// there is no reference to it.
19// Usage:
20// {
21//    scoped_refptr<DownloadSBClient> client_ = new DownloadSBClient(...);
22//    client_->CheckDownloadUrl(..., NewCallback(this,
23//                              &DownloadManager::UrlCallBack));
24//    or
25//    client_->CheckDownloadHash(..., NewCallback(this,
26//                               &DownloadManager::HashCallBack));
27// }
28// DownloadManager::UrlCallBack(...) or HashCallCall {
29//    // After this, the |client_| is gone.
30// }
31class DownloadSBClient
32    : public SafeBrowsingService::Client,
33      public base::RefCountedThreadSafe<DownloadSBClient> {
34 public:
35  typedef Callback2<DownloadCreateInfo*, bool>::Type UrlDoneCallback;
36  typedef Callback2<int32, bool>::Type HashDoneCallback;
37
38  DownloadSBClient(int32 download_id,
39                   const std::vector<GURL>& url_chain,
40                   const GURL& referrer_url);
41
42  // Call safebrowsing service to verifiy the download.
43  // For each DownloadSBClient instance, either CheckDownloadUrl or
44  // CheckDownloadHash can be called, and be called only once.
45  // DownloadSBClient instance.
46  void CheckDownloadUrl(DownloadCreateInfo* info, UrlDoneCallback* callback);
47  void CheckDownloadHash(const std::string& hash, HashDoneCallback* callback);
48
49 private:
50  // Call SafeBrowsingService on IO thread to verify the download URL or
51  // hash of downloaded file.
52  void CheckDownloadUrlOnIOThread(const std::vector<GURL>& url_chain);
53  void CheckDownloadHashOnIOThread(const std::string& hash);
54
55  // Callback interfaces for SafeBrowsingService::Client.
56  virtual void OnDownloadUrlCheckResult(
57      const std::vector<GURL>& url_chain,
58      SafeBrowsingService::UrlCheckResult result);
59  virtual void OnDownloadHashCheckResult(
60      const std::string& hash, SafeBrowsingService::UrlCheckResult result);
61
62  // Enumerate for histogramming purposes.
63  // DO NOT CHANGE THE ORDERING OF THESE VALUES (different histogram data will
64  // be mixed together based on their values).
65  enum SBStatsType {
66    DOWNLOAD_URL_CHECKS_TOTAL,
67    DOWNLOAD_URL_CHECKS_CANCELED,
68    DOWNLOAD_URL_CHECKS_MALWARE,
69
70    DOWNLOAD_HASH_CHECKS_TOTAL,
71    DOWNLOAD_HASH_CHECKS_MALWARE,
72
73    // Memory space for histograms is determined by the max.
74    // ALWAYS ADD NEW VALUES BEFORE THIS ONE.
75    DOWNLOAD_CHECKS_MAX
76  };
77
78  friend class base::RefCountedThreadSafe<DownloadSBClient>;
79  virtual ~DownloadSBClient();
80
81  // Call DownloadManager on UI thread for download URL or hash check.
82  void SafeBrowsingCheckUrlDone(SafeBrowsingService::UrlCheckResult result);
83  void SafeBrowsingCheckHashDone(SafeBrowsingService::UrlCheckResult result);
84
85  // Report malware hits to safebrowsing service.
86  void ReportMalware(SafeBrowsingService::UrlCheckResult result);
87
88  // Update the UMA stats.
89  void UpdateDownloadCheckStats(SBStatsType stat_type);
90
91  scoped_ptr<UrlDoneCallback> url_done_callback_;
92  scoped_ptr<HashDoneCallback> hash_done_callback_;
93
94  // Not owned by this class.
95  DownloadCreateInfo* info_;
96
97  int32 download_id_;
98  scoped_refptr<SafeBrowsingService> sb_service_;
99
100  // These URLs are used to report malware to safe browsing service.
101  std::vector<GURL> url_chain_;
102  GURL referrer_url_;
103
104  // When a safebrowsing check starts, for stats purpose.
105  base::TimeTicks start_time_;
106
107  DISALLOW_COPY_AND_ASSIGN(DownloadSBClient);
108};
109
110#endif  // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_SAFE_BROWSING_CLIENT_H_
111