| Index: chrome/common/safe_browsing/file_type_policies.h
|
| diff --git a/chrome/common/safe_browsing/file_type_policies.h b/chrome/common/safe_browsing/file_type_policies.h
|
| index ff88f66922ab0496009003e41238123ea308ea9d..ae2ef937e13780a8a24136748bca904e75e87624 100644
|
| --- a/chrome/common/safe_browsing/file_type_policies.h
|
| +++ b/chrome/common/safe_browsing/file_type_policies.h
|
| @@ -10,10 +10,13 @@
|
|
|
| #include "base/files/file_path.h"
|
| #include "base/gtest_prod_util.h"
|
| +#include "base/synchronization/lock.h"
|
| #include "chrome/common/safe_browsing/download_file_types.pb.h"
|
|
|
| namespace safe_browsing {
|
|
|
| +struct FileTypePoliciesSingletonTrait;
|
| +
|
| // This holds a list of file types (aka file extensions) that we know about,
|
| // with policies related to how Safe Browsing and the download UI should treat
|
| // them.
|
| @@ -21,44 +24,51 @@ namespace safe_browsing {
|
| // The data to populate it is read from a ResourceBundle and then also
|
| // fetched periodically from Google to get the most up-to-date policies.
|
| //
|
| -// It should be setup and accessed on IO thread.
|
| -
|
| -// TODO(nparker): Replace the following methods' contents with calls to
|
| -// g_browser_process->safe_browsing_service()->file_type_policies()->***.
|
| -//
|
| -// bool IsSupportedBinaryFile(const base::FilePath& file);
|
| -// bool IsArchiveFile(const base::FilePath& file);
|
| -// ClientDownloadRequest::DownloadType GetDownloadType(
|
| -// const base::FilePath& file);
|
| -// int GetSBClientDownloadTypeValueForUMA(const base::FilePath& file);
|
| -// bool IsAllowedToOpenAutomatically(const base::FilePath& path);
|
| -// DownloadDangerLevel GetFileDangerLevel(const base::FilePath& path);
|
| +// This is thread safe. We assume it is updated at most every few hours.
|
|
|
| class FileTypePolicies {
|
| public:
|
| - // Creator must call one of Populate* before calling other methods.
|
| - FileTypePolicies();
|
| virtual ~FileTypePolicies();
|
|
|
| - // Read data from the main ResourceBundle. This updates the internal list
|
| - // only if the data passes integrity checks. This is normally called once
|
| - // after construction.
|
| - void PopulateFromResourceBundle();
|
| + static FileTypePolicies* GetInstance(); // Singleton
|
|
|
| // Update the internal list from a binary proto fetched from the network.
|
| // Same integrity checks apply. This can be called multiple times with new
|
| // protos.
|
| void PopulateFromDynamicUpdate(const std::string& binary_pb);
|
|
|
| - // Accessors
|
| - const DownloadFileType& PolicyForFile(const base::FilePath& file);
|
| - const DownloadFileType::PlatformSettings& SettingsForFile(
|
| + //
|
| + // Static Utils
|
| + //
|
| +
|
| + // Returns the final extension with the leading dot, after stripping
|
| + // trailing dots and spaces. It is difference from FilePath::Extension()
|
| + // and FilePath::FinalExtension().
|
| + // TODO(nparker): Consolidate. Maybe add this code to FinalExtension().
|
| + static base::FilePath::StringType GetFileExtension(
|
| const base::FilePath& file);
|
| - int64_t UmaValueForFile(const base::FilePath& file);
|
| - bool IsFileAnArchive(const base::FilePath& file);
|
| +
|
| + //
|
| + // Accessors
|
| + //
|
| + DownloadFileType PolicyForFile(const base::FilePath& file) const;
|
| + DownloadFileType::PlatformSettings SettingsForFile(
|
| + const base::FilePath& file) const;
|
| + bool IsArchiveFile(const base::FilePath& file) const;
|
| +
|
| + // SBClientDownloadExtensions UMA histogram bucket for this file's type.
|
| + int64_t UmaValueForFile(const base::FilePath& file) const;
|
| +
|
| + // True if download protection should send a ping to check
|
| + // this type of file.
|
| + bool IsCheckedBinaryFile(const base::FilePath& file) const;
|
| +
|
| float SampledPingProbability() const;
|
|
|
| protected:
|
| + // Creator must call one of Populate* before calling other methods.
|
| + FileTypePolicies();
|
| +
|
| // Used in metrics, do not reorder.
|
| enum class UpdateResult {
|
| SUCCESS = 1,
|
| @@ -84,19 +94,35 @@ class FileTypePolicies {
|
| // Return the ASCII lowercase extension w/o leading dot, or empty.
|
| static std::string CanonicalizedExtension(const base::FilePath& file);
|
|
|
| + // Look up the policy for a given ASCII ext.
|
| + virtual const DownloadFileType& PolicyForExtension(
|
| + const std::string& ext) const;
|
| +
|
| private:
|
| + // Read data from the main ResourceBundle. This updates the internal list
|
| + // only if the data passes integrity checks. This is normally called once
|
| + // after construction.
|
| + void PopulateFromResourceBundle();
|
| +
|
| // The latest config we've committed. Starts out null.
|
| + // Protected by lock_.
|
| std::unique_ptr<DownloadFileTypeConfig> config_;
|
|
|
| // This references entries in config_.
|
| + // Protected by lock_.
|
| std::map<std::string, const DownloadFileType*> file_type_by_ext_;
|
|
|
| // Type used if we can't load from disk.
|
| + // Written only in the constructor.
|
| DownloadFileType last_resort_default_;
|
|
|
| + mutable base::Lock lock_;
|
| +
|
| FRIEND_TEST_ALL_PREFIXES(FileTypePoliciesTest, UnpackResourceBundle);
|
| FRIEND_TEST_ALL_PREFIXES(FileTypePoliciesTest, BadProto);
|
| FRIEND_TEST_ALL_PREFIXES(FileTypePoliciesTest, BadUpdateFromExisting);
|
| +
|
| + friend struct FileTypePoliciesSingletonTrait;
|
| };
|
|
|
| } // namespace safe_browsing
|
|
|