blob: 2f323d91037a606a9dce998ec18cb32c594e752a [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// 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_PROTECTION_DOWNLOAD_REQUEST_MAKER_H_
#define CHROME_BROWSER_SAFE_BROWSING_DOWNLOAD_PROTECTION_DOWNLOAD_REQUEST_MAKER_H_
#include <memory>
#include <optional>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "chrome/browser/safe_browsing/download_protection/file_analyzer.h"
#include "components/download/public/common/download_item.h"
#include "components/history/core/browser/history_service.h"
#include "components/safe_browsing/content/browser/safe_browsing_navigation_observer_manager.h"
#include "components/safe_browsing/core/common/proto/csd.pb.h"
#include "content/public/browser/file_system_access_write_item.h"
namespace safe_browsing {
// This class encapsulate the process of populating all the fields in a Safe
// Browsing download ping.
class DownloadRequestMaker {
public:
// Details about a DownloadRequestMaker run, to pass back to the caller.
struct RequestCreationDetails {
// What type of file inspection was performed.
DownloadFileType::InspectionType inspection_type = DownloadFileType::NONE;
};
using Callback =
base::OnceCallback<void(std::unique_ptr<ClientDownloadRequest>)>;
using CallbackWithDetails =
base::OnceCallback<void(RequestCreationDetails,
std::unique_ptr<ClientDownloadRequest>)>;
// URL and referrer of the window the download was started from.
struct TabUrls {
GURL url;
GURL referrer;
};
static std::unique_ptr<DownloadRequestMaker> CreateFromDownloadItem(
scoped_refptr<BinaryFeatureExtractor> binary_feature_extractor,
download::DownloadItem* item,
base::optional_ref<const std::string> password = std::nullopt);
static std::unique_ptr<DownloadRequestMaker> CreateFromFileSystemAccess(
scoped_refptr<BinaryFeatureExtractor> binary_feature_extractor,
const content::FileSystemAccessWriteItem& item);
DownloadRequestMaker(
scoped_refptr<BinaryFeatureExtractor> binary_feature_extractor,
content::BrowserContext* browser_context,
TabUrls tab_urls,
base::FilePath target_file_name,
base::FilePath full_path,
GURL source_url,
std::string sha256_hash,
int64_t length,
const std::vector<ClientDownloadRequest::Resource>& resources,
bool is_user_initiated,
ReferrerChainData* referrer_chain_data,
base::optional_ref<const std::string> password,
const std::string& previous_token,
base::OnceCallback<void(const FileAnalyzer::Results&)>
on_results_callback);
DownloadRequestMaker(const DownloadRequestMaker&) = delete;
DownloadRequestMaker& operator=(const DownloadRequestMaker&) = delete;
~DownloadRequestMaker();
// Starts filling in fields in the download ping. Will run the callback with
// the fully-populated ping.
void Start(Callback callback);
// Same as above but also returns a RequestCreationDetails to the caller.
void Start(CallbackWithDetails callback);
private:
// Callback when |file_analyzer_| is done analyzing the download.
void OnFileFeatureExtractionDone(FileAnalyzer::Results results);
// Helper function to get the tab redirects from the history service.
void GetTabRedirects();
// Callback when the history service has retrieved the tab redirects.
void OnGotTabRedirects(history::RedirectList redirect_list);
// Populates the tailored info field for tailored warnings.
void PopulateTailoredInfo();
raw_ptr<content::BrowserContext> browser_context_;
std::unique_ptr<ClientDownloadRequest> request_;
const scoped_refptr<BinaryFeatureExtractor> binary_feature_extractor_;
const std::unique_ptr<FileAnalyzer> file_analyzer_ =
std::make_unique<FileAnalyzer>(binary_feature_extractor_);
base::CancelableTaskTracker request_tracker_; // For HistoryService lookup.
// The current URL for the WebContents that initiated the download, and its
// referrer.
TabUrls tab_urls_;
// The ultimate destination/filename for the download. This is used to
// determine the filetype and populate request fields requiring a
// human-readable filename. On platforms where the target file *path* does not
// contain file name but is instead a different identifier (e.g. a content-URI
// on Android), this should be populated with the file *name* i.e. a display
// name for the download.
const base::FilePath target_file_name_;
// The current path to the file contents.
const base::FilePath full_path_;
const std::optional<std::string> password_;
// Callback used for handling behavior specific to download items of file
// system accesses.
base::OnceCallback<void(const FileAnalyzer::Results&)> on_results_callback_;
CallbackWithDetails callback_;
RequestCreationDetails details_;
base::WeakPtrFactory<DownloadRequestMaker> weakptr_factory_{this};
};
} // namespace safe_browsing
#endif // CHROME_BROWSER_SAFE_BROWSING_DOWNLOAD_PROTECTION_DOWNLOAD_REQUEST_MAKER_H_