Home | History | Annotate | Download | only in safe_browsing
      1 // Copyright 2013 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_SAFE_BROWSING_DOWNLOAD_FEEDBACK_SERVICE_H_
      6 #define CHROME_BROWSER_SAFE_BROWSING_DOWNLOAD_FEEDBACK_SERVICE_H_
      7 
      8 #include <string>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/memory/ref_counted.h"
     12 #include "base/memory/scoped_vector.h"
     13 #include "base/threading/non_thread_safe.h"
     14 #include "chrome/browser/safe_browsing/download_protection_service.h"
     15 #include "content/public/browser/download_danger_type.h"
     16 
     17 namespace base {
     18 class TaskRunner;
     19 }
     20 
     21 namespace content {
     22 class DownloadItem;
     23 }
     24 
     25 namespace net {
     26 class URLRequestContextGetter;
     27 }
     28 
     29 namespace safe_browsing {
     30 
     31 class DownloadFeedback;
     32 
     33 // Tracks active DownloadFeedback objects, provides interface for storing ping
     34 // data for malicious downloads.
     35 class DownloadFeedbackService : public base::NonThreadSafe {
     36  public:
     37   DownloadFeedbackService(net::URLRequestContextGetter* request_context_getter,
     38                           base::TaskRunner* file_task_runner);
     39   ~DownloadFeedbackService();
     40 
     41   // Stores the request and response ping data from the download check, if the
     42   // check result and file size are eligible. This must be called after a
     43   // download has been flagged as malicious in order for the download to be
     44   // enabled for uploading.
     45   static void MaybeStorePingsForDownload(
     46       DownloadProtectionService::DownloadCheckResult result,
     47       content::DownloadItem* download,
     48       const std::string& ping,
     49       const std::string& response);
     50 
     51   // Test if pings have been stored for |download|.
     52   static bool IsEnabledForDownload(const content::DownloadItem& download);
     53 
     54   // Get the ping values stored in |download|. Returns false if no ping values
     55   // are present.
     56   static bool GetPingsForDownloadForTesting(
     57       const content::DownloadItem& download,
     58       std::string* ping,
     59       std::string* response);
     60 
     61   // Records histogram for download feedback option shown to user.
     62   static void RecordEligibleDownloadShown(
     63       content::DownloadDangerType danger_type);
     64 
     65   // Begin download feedback for |download|. The |download| will be deleted
     66   // when this function returns. This must only be called if
     67   // IsEnabledForDownload is true for |download|.
     68   void BeginFeedbackForDownload(content::DownloadItem* download);
     69 
     70  private:
     71   static void BeginFeedbackOrDeleteFile(
     72       const scoped_refptr<base::TaskRunner>& file_task_runner,
     73       const base::WeakPtr<DownloadFeedbackService>& service,
     74       const std::string& ping_request,
     75       const std::string& ping_response,
     76       const base::FilePath& path);
     77   void StartPendingFeedback();
     78   void BeginFeedback(const std::string& ping_request,
     79                      const std::string& ping_response,
     80                      const base::FilePath& path);
     81   void FeedbackComplete();
     82 
     83   scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
     84   scoped_refptr<base::TaskRunner> file_task_runner_;
     85 
     86   // Currently active & pending uploads. The first item is active, remaining
     87   // items are pending.
     88   ScopedVector<DownloadFeedback> active_feedback_;
     89 
     90   base::WeakPtrFactory<DownloadFeedbackService> weak_ptr_factory_;
     91 
     92   DISALLOW_COPY_AND_ASSIGN(DownloadFeedbackService);
     93 };
     94 }  // namespace safe_browsing
     95 
     96 #endif  // CHROME_BROWSER_SAFE_BROWSING_DOWNLOAD_FEEDBACK_SERVICE_H_
     97