blob: 474e4d80777f01e2549505834c546cc6235bcfa5 [file] [log] [blame]
// Copyright 2013 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.
#ifndef CHROME_BROWSER_SAFE_BROWSING_DOWNLOAD_FEEDBACK_SERVICE_H_
#define CHROME_BROWSER_SAFE_BROWSING_DOWNLOAD_FEEDBACK_SERVICE_H_
#include <memory>
#include <queue>
#include <string>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "chrome/browser/download/download_commands.h"
#include "chrome/browser/safe_browsing/download_protection_service.h"
#include "content/public/browser/download_danger_type.h"
namespace base {
class TaskRunner;
}
namespace content {
class DownloadItem;
}
namespace net {
class URLRequestContextGetter;
}
namespace safe_browsing {
class DownloadFeedback;
// Tracks active DownloadFeedback objects, provides interface for storing ping
// data for malicious downloads.
// Lives on the UI thread.
class DownloadFeedbackService {
public:
DownloadFeedbackService(net::URLRequestContextGetter* request_context_getter,
base::TaskRunner* file_task_runner);
~DownloadFeedbackService();
// Stores the request and response ping data from the download check, if the
// check result and file size are eligible. This must be called after a
// download has been flagged as malicious in order for the download to be
// enabled for uploading.
static void MaybeStorePingsForDownload(
DownloadProtectionService::DownloadCheckResult result,
content::DownloadItem* download,
const std::string& ping,
const std::string& response);
// Test if pings have been stored for |download|.
static bool IsEnabledForDownload(const content::DownloadItem& download);
// Get the ping values stored in |download|. Returns false if no ping values
// are present.
static bool GetPingsForDownloadForTesting(
const content::DownloadItem& download,
std::string* ping,
std::string* response);
// Records histogram for download feedback option shown to user.
static void RecordEligibleDownloadShown(
content::DownloadDangerType danger_type);
// Begin download feedback for |download|. Then delete download file if
// |download_command| is DISCARD, or run the KEEP command otherwise.This must
// only be called if IsEnabledForDownload is true for |download|.
void BeginFeedbackForDownload(content::DownloadItem* download,
DownloadCommands::Command download_command);
private:
static void BeginFeedbackOrDeleteFile(
const scoped_refptr<base::TaskRunner>& file_task_runner,
const base::WeakPtr<DownloadFeedbackService>& service,
const std::string& ping_request,
const std::string& ping_response,
const base::FilePath& path);
void StartPendingFeedback();
void BeginFeedback(const std::string& ping_request,
const std::string& ping_response,
const base::FilePath& path);
void FeedbackComplete();
scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
scoped_refptr<base::TaskRunner> file_task_runner_;
// Currently active & pending uploads. The first item is active, remaining
// items are pending.
std::queue<std::unique_ptr<DownloadFeedback>> active_feedback_;
base::WeakPtrFactory<DownloadFeedbackService> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(DownloadFeedbackService);
};
} // namespace safe_browsing
#endif // CHROME_BROWSER_SAFE_BROWSING_DOWNLOAD_FEEDBACK_SERVICE_H_