Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(430)

Side by Side Diff: chrome/common/safe_browsing/file_type_policies.cc

Issue 1979153002: Use FileTypePolicies for is_archive and is_supported classifications. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@split_by_platform
Patch Set: rebase Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/common/safe_browsing/file_type_policies.h"
6
5 #include "base/logging.h" 7 #include "base/logging.h"
6 #include "base/metrics/sparse_histogram.h" 8 #include "base/metrics/sparse_histogram.h"
7 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
8 #include "chrome/common/safe_browsing/download_protection_util.h"
9 #include "chrome/common/safe_browsing/file_type_policies.h"
10 #include "chrome/grit/browser_resources.h" 10 #include "chrome/grit/browser_resources.h"
11 #include "chrome/grit/generated_resources.h" 11 #include "chrome/grit/generated_resources.h"
12 #include "ui/base/resource/resource_bundle.h" 12 #include "ui/base/resource/resource_bundle.h"
13 13
14 namespace safe_browsing { 14 namespace safe_browsing {
15 15
16 using base::AutoLock;
17
18 // --- FileTypePoliciesManager methods ---
19 FileTypePoliciesManager::FileTypePoliciesManager() {
20 if (FileTypePolicies::global_instance_ != nullptr)
21 return;
22 file_type_policies_.reset(new FileTypePolicies());
23 file_type_policies_->PopulateFromResourceBundle();
24 FileTypePolicies::SetGlobalInstance(file_type_policies_.get());
25 }
26
27 FileTypePoliciesManager::~FileTypePoliciesManager() {
28 if (file_type_policies_.get())
29 FileTypePolicies::SetGlobalInstance(nullptr);
asanka 2016/05/18 18:47:54 This one is a bit iffy. I'd lean towards leaking t
Nathan Parker 2016/05/18 23:53:28 I've switched to Singleton. Actually, this in com
30 }
31
32
33 // --- FileTypePolicies methods ---
34 FileTypePolicies* FileTypePolicies::global_instance_ = nullptr;
35
16 FileTypePolicies::FileTypePolicies() { 36 FileTypePolicies::FileTypePolicies() {
17 // Setup a file-type policy to use if the ResourceBundle is unreadable. 37 // Setup a file-type policy to use if the ResourceBundle is unreadable.
18 // This should normally never be used. 38 // This should normally never be used.
19 last_resort_default_.set_uma_value(-1l); 39 last_resort_default_.set_uma_value(-1l);
20 last_resort_default_.set_ping_setting(DownloadFileType::NO_PING); 40 last_resort_default_.set_ping_setting(DownloadFileType::NO_PING);
21 auto settings = last_resort_default_.add_platform_settings(); 41 auto settings = last_resort_default_.add_platform_settings();
22 settings->set_danger_level(DownloadFileType::ALLOW_ON_USER_GESTURE); 42 settings->set_danger_level(DownloadFileType::ALLOW_ON_USER_GESTURE);
23 settings->set_auto_open_hint(DownloadFileType::DISALLOW_AUTO_OPEN); 43 settings->set_auto_open_hint(DownloadFileType::DISALLOW_AUTO_OPEN);
24 } 44 }
25 45
26 FileTypePolicies::~FileTypePolicies() {} 46 FileTypePolicies::~FileTypePolicies() {
47 AutoLock lock(lock_); // DCHECK fail if the lock is held.
48 }
49
50 // static
51 FileTypePolicies* FileTypePolicies::GlobalInstance() {
52 DCHECK(global_instance_ != nullptr)
53 << "You must instantiate FileTypePoliciesManager in "
54 "this process before calling GlobalInstance()";
55 return global_instance_;
56 }
57
58 // static
59 void FileTypePolicies::SetGlobalInstance(FileTypePolicies* instance) {
60 global_instance_ = instance;
61 }
27 62
28 void FileTypePolicies::ReadResourceBundle(std::string* binary_pb) { 63 void FileTypePolicies::ReadResourceBundle(std::string* binary_pb) {
29 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); 64 ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
30 bundle.GetRawDataResource(IDR_DOWNLOAD_FILE_TYPES_PB).CopyToString(binary_pb); 65 bundle.GetRawDataResource(IDR_DOWNLOAD_FILE_TYPES_PB).CopyToString(binary_pb);
31 } 66 }
32 67
33 void FileTypePolicies::RecordUpdateMetrics(UpdateResult result, 68 void FileTypePolicies::RecordUpdateMetrics(UpdateResult result,
34 const std::string& src_name) { 69 const std::string& src_name) {
70 lock_.AssertAcquired();
35 // src_name should be "ResourceBundle" or "DynamicUpdate". 71 // src_name should be "ResourceBundle" or "DynamicUpdate".
36 UMA_HISTOGRAM_SPARSE_SLOWLY( 72 UMA_HISTOGRAM_SPARSE_SLOWLY(
37 "SafeBrowsing.FileTypeUpdate." + src_name + "Result", 73 "SafeBrowsing.FileTypeUpdate." + src_name + "Result",
38 static_cast<unsigned int>(result)); 74 static_cast<unsigned int>(result));
39 75
40 if (result == UpdateResult::SUCCESS) { 76 if (result == UpdateResult::SUCCESS) {
41 UMA_HISTOGRAM_SPARSE_SLOWLY( 77 UMA_HISTOGRAM_SPARSE_SLOWLY(
42 "SafeBrowsing.FileTypeUpdate." + src_name + "Version", 78 "SafeBrowsing.FileTypeUpdate." + src_name + "Version",
43 config_->version_id()); 79 config_->version_id());
44 UMA_HISTOGRAM_SPARSE_SLOWLY( 80 UMA_HISTOGRAM_SPARSE_SLOWLY(
45 "SafeBrowsing.FileTypeUpdate." + src_name + "TypeCount", 81 "SafeBrowsing.FileTypeUpdate." + src_name + "TypeCount",
46 config_->file_types().size()); 82 config_->file_types().size());
47 } 83 }
48 } 84 }
49 85
50 void FileTypePolicies::PopulateFromResourceBundle() { 86 void FileTypePolicies::PopulateFromResourceBundle() {
87 AutoLock lock(lock_);
51 std::string binary_pb; 88 std::string binary_pb;
52 ReadResourceBundle(&binary_pb); 89 ReadResourceBundle(&binary_pb);
53 UpdateResult result = PopulateFromBinaryPb(binary_pb); 90 UpdateResult result = PopulateFromBinaryPb(binary_pb);
54 RecordUpdateMetrics(result, "ResourceBundle"); 91 RecordUpdateMetrics(result, "ResourceBundle");
55 } 92 }
56 93
57 void FileTypePolicies::PopulateFromDynamicUpdate(const std::string& binary_pb) { 94 void FileTypePolicies::PopulateFromDynamicUpdate(const std::string& binary_pb) {
95 AutoLock lock(lock_);
58 UpdateResult result = PopulateFromBinaryPb(binary_pb); 96 UpdateResult result = PopulateFromBinaryPb(binary_pb);
59 RecordUpdateMetrics(result, "DynamicUpdate"); 97 RecordUpdateMetrics(result, "DynamicUpdate");
60 } 98 }
61 99
62 FileTypePolicies::UpdateResult FileTypePolicies::PopulateFromBinaryPb( 100 FileTypePolicies::UpdateResult FileTypePolicies::PopulateFromBinaryPb(
63 const std::string& binary_pb) { 101 const std::string& binary_pb) {
102 lock_.AssertAcquired();
103
64 // Parse the proto and do some validation on it. 104 // Parse the proto and do some validation on it.
65 if (binary_pb.empty()) 105 if (binary_pb.empty())
66 return UpdateResult::FAILED_EMPTY; 106 return UpdateResult::FAILED_EMPTY;
67 107
68 std::unique_ptr<DownloadFileTypeConfig> new_config( 108 std::unique_ptr<DownloadFileTypeConfig> new_config(
69 new DownloadFileTypeConfig); 109 new DownloadFileTypeConfig);
70 if (!new_config->ParseFromString(binary_pb)) 110 if (!new_config->ParseFromString(binary_pb))
71 return UpdateResult::FAILED_PROTO_PARSE; 111 return UpdateResult::FAILED_PROTO_PARSE;
72 112
73 // Need at least a default setting. 113 // Need at least a default setting.
(...skipping 24 matching lines...) Expand all
98 // Build an index for faster lookup. 138 // Build an index for faster lookup.
99 file_type_by_ext_.clear(); 139 file_type_by_ext_.clear();
100 for (const DownloadFileType& file_type : config_->file_types()) { 140 for (const DownloadFileType& file_type : config_->file_types()) {
101 // If there are dups, first one wins. 141 // If there are dups, first one wins.
102 file_type_by_ext_.insert(std::make_pair(file_type.extension(), &file_type)); 142 file_type_by_ext_.insert(std::make_pair(file_type.extension(), &file_type));
103 } 143 }
104 144
105 return UpdateResult::SUCCESS; 145 return UpdateResult::SUCCESS;
106 } 146 }
107 147
108 float FileTypePolicies::SampledPingProbability() const { 148 float FileTypePolicies::SampledPingProbability() {
149 AutoLock lock(lock_);
109 return config_ ? config_->sampled_ping_probability() : 0.0; 150 return config_ ? config_->sampled_ping_probability() : 0.0;
110 } 151 }
111 152
112 // static 153 // static
154 const base::FilePath::StringType FileTypePolicies::GetFileExtension(
155 const base::FilePath& file) {
156 // Remove trailing space and period characters from the extension.
157 base::FilePath::StringType file_basename = file.BaseName().value();
158 base::FilePath::StringPieceType trimmed_filename = base::TrimString(
159 file_basename, FILE_PATH_LITERAL(". "), base::TRIM_TRAILING);
160 return base::FilePath(trimmed_filename).FinalExtension();
161 }
162
163 // static
113 std::string FileTypePolicies::CanonicalizedExtension( 164 std::string FileTypePolicies::CanonicalizedExtension(
114 const base::FilePath& file) { 165 const base::FilePath& file) {
115 // The policy list is all ASCII, so a non-ASCII extension won't be in it. 166 // The policy list is all ASCII, so a non-ASCII extension won't be in it.
116 const base::FilePath::StringType ext = 167 const base::FilePath::StringType ext = GetFileExtension(file);
117 download_protection_util::GetFileExtension(file);
118 std::string ascii_ext = 168 std::string ascii_ext =
119 base::ToLowerASCII(base::FilePath(ext).MaybeAsASCII()); 169 base::ToLowerASCII(base::FilePath(ext).MaybeAsASCII());
120 if (ascii_ext[0] == '.') 170 if (ascii_ext[0] == '.')
121 ascii_ext.erase(0, 1); 171 ascii_ext.erase(0, 1);
122 return ascii_ext; 172 return ascii_ext;
123 } 173 }
124 174
125 const DownloadFileType& FileTypePolicies::PolicyForFile( 175 const DownloadFileType& FileTypePolicies::PolicyForExtension(
126 const base::FilePath& file) { 176 const std::string& ascii_ext) {
177 lock_.AssertAcquired();
127 // This could happen if the ResourceBundle is corrupted. 178 // This could happen if the ResourceBundle is corrupted.
128 if (!config_) { 179 if (!config_) {
129 DCHECK(false); 180 DCHECK(false);
130 return last_resort_default_; 181 return last_resort_default_;
131 } 182 }
132
133 std::string ascii_ext = CanonicalizedExtension(file);
134 auto itr = file_type_by_ext_.find(ascii_ext); 183 auto itr = file_type_by_ext_.find(ascii_ext);
135 if (itr != file_type_by_ext_.end()) 184 if (itr != file_type_by_ext_.end())
136 return *itr->second; 185 return *itr->second;
137 else 186 else
138 return config_->default_file_type(); 187 return config_->default_file_type();
139 } 188 }
140 189
141 const DownloadFileType::PlatformSettings& FileTypePolicies::SettingsForFile( 190 DownloadFileType FileTypePolicies::PolicyForFile(const base::FilePath& file) {
191 const std::string ext = CanonicalizedExtension(file);
192 AutoLock lock(lock_);
193 return PolicyForExtension(ext);
194 }
195
196 DownloadFileType::PlatformSettings FileTypePolicies::SettingsForFile(
142 const base::FilePath& file) { 197 const base::FilePath& file) {
143 DCHECK_EQ(1, PolicyForFile(file).platform_settings().size()); 198 const std::string ext = CanonicalizedExtension(file);
144 return PolicyForFile(file).platform_settings(0); 199 AutoLock lock(lock_);
200 DCHECK_EQ(1, PolicyForExtension(ext).platform_settings().size());
201 return PolicyForExtension(ext).platform_settings(0);
145 } 202 }
146 203
147 int64_t FileTypePolicies::UmaValueForFile(const base::FilePath& file) { 204 int64_t FileTypePolicies::UmaValueForFile(const base::FilePath& file) {
148 return PolicyForFile(file).uma_value(); 205 const std::string ext = CanonicalizedExtension(file);
206 AutoLock lock(lock_);
207 return PolicyForExtension(ext).uma_value();
149 } 208 }
150 209
151 bool FileTypePolicies::IsFileAnArchive(const base::FilePath& file) { 210 bool FileTypePolicies::IsArchiveFile(const base::FilePath& file) {
152 return PolicyForFile(file).is_archive(); 211 const std::string ext = CanonicalizedExtension(file);
212 AutoLock lock(lock_);
213 return PolicyForExtension(ext).is_archive();
214 }
215
216 bool FileTypePolicies::IsCheckedBinaryFile(const base::FilePath& file) {
217 const std::string ext = CanonicalizedExtension(file);
218 AutoLock lock(lock_);
219 return PolicyForExtension(ext).ping_setting() ==
220 DownloadFileType::FULL_PING;
153 } 221 }
154 222
155 } // namespace safe_browsing 223 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698