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

Side by Side Diff: chrome/browser/permissions/permission_decision_auto_blocker.cc

Issue 2640033006: Convert AutoBlocker static class to KeyedService. (Closed)
Patch Set: Reformat conversion method + nits Created 3 years, 11 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/browser/permissions/permission_decision_auto_blocker.h" 5 #include "chrome/browser/permissions/permission_decision_auto_blocker.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/feature_list.h" 9 #include "base/feature_list.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/strings/string_number_conversions.h" 12 #include "base/strings/string_number_conversions.h"
13 #include "base/time/time.h"
14 #include "base/values.h" 13 #include "base/values.h"
14 #include "chrome/browser/browser_process.h"
15 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 15 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
16 #include "chrome/browser/permissions/permission_blacklist_client.h" 16 #include "chrome/browser/permissions/permission_blacklist_client.h"
17 #include "chrome/browser/permissions/permission_util.h" 17 #include "chrome/browser/permissions/permission_util.h"
18 #include "chrome/browser/permissions/permission_blacklist_client.h" 18 #include "chrome/browser/profiles/incognito_helpers.h"
19 #include "chrome/browser/permissions/permission_util.h" 19 #include "chrome/browser/profiles/profile.h"
20 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
20 #include "chrome/common/chrome_features.h" 21 #include "chrome/common/chrome_features.h"
21 #include "components/content_settings/core/browser/host_content_settings_map.h" 22 #include "components/content_settings/core/browser/host_content_settings_map.h"
23 #include "components/keyed_service/content/browser_context_dependency_manager.h"
24 #include "components/safe_browsing_db/database_manager.h"
22 #include "components/variations/variations_associated_data.h" 25 #include "components/variations/variations_associated_data.h"
23 #include "content/public/browser/permission_type.h" 26 #include "content/public/browser/permission_type.h"
24 #include "content/public/browser/web_contents.h" 27 #include "content/public/browser/web_contents.h"
25 #include "url/gurl.h" 28 #include "url/gurl.h"
26 29
27 namespace { 30 namespace {
28 31
29 // The number of times that users may explicitly dismiss a permission prompt 32 // The number of times that users may explicitly dismiss a permission prompt
30 // from an origin before it is automatically blocked. 33 // from an origin before it is automatically blocked.
31 int g_prompt_dismissals_before_block = 3; 34 int g_prompt_dismissals_before_block = 3;
32 35
33 // The number of days that an origin will stay under embargo for a requested 36 // The number of days that an origin will stay under embargo for a requested
34 // permission due to blacklisting. 37 // permission due to blacklisting.
35 int g_blacklist_embargo_days = 7; 38 int g_blacklist_embargo_days = 7;
36 39
37 // The number of days that an origin will stay under embargo for a requested 40 // The number of days that an origin will stay under embargo for a requested
38 // permission due to repeated dismissals. 41 // permission due to repeated dismissals.
39 int g_dismissal_embargo_days = 7; 42 int g_dismissal_embargo_days = 7;
40 43
44 // Maximum time in milliseconds to wait for safe browsing service to check a
45 // url for blacklisting. After this amount of time, the check will be aborted
46 // and the url will be treated as not safe.
47 // TODO(meredithl): Revisit this once UMA metrics have data about request time.
48 const int kCheckUrlTimeoutMs = 2000;
49
50 // TODO(meredithl): Migrate to a new and more fitting type, once metrics have
51 // been gathered, and deprecate CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT.
41 std::unique_ptr<base::DictionaryValue> GetOriginDict( 52 std::unique_ptr<base::DictionaryValue> GetOriginDict(
42 HostContentSettingsMap* settings, 53 HostContentSettingsMap* settings,
43 const GURL& origin_url) { 54 const GURL& origin_url) {
44 std::unique_ptr<base::DictionaryValue> dict = 55 std::unique_ptr<base::DictionaryValue> dict =
45 base::DictionaryValue::From(settings->GetWebsiteSetting( 56 base::DictionaryValue::From(settings->GetWebsiteSetting(
46 origin_url, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT, 57 origin_url, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT,
47 std::string(), nullptr)); 58 std::string(), nullptr));
48 if (!dict) 59 if (!dict)
49 return base::MakeUnique<base::DictionaryValue>(); 60 return base::MakeUnique<base::DictionaryValue>();
50 61
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict( 108 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict(
98 dict.get(), PermissionUtil::GetPermissionString(permission)); 109 dict.get(), PermissionUtil::GetPermissionString(permission));
99 110
100 int current_count = 0; 111 int current_count = 0;
101 permission_dict->GetInteger(key, &current_count); 112 permission_dict->GetInteger(key, &current_count);
102 return current_count; 113 return current_count;
103 } 114 }
104 115
105 } // namespace 116 } // namespace
106 117
118 // PermissionDecisionAutoBlocker::Factory --------------------------------------
119
120 // static
121 PermissionDecisionAutoBlocker*
122 PermissionDecisionAutoBlocker::Factory::GetForProfile(Profile* profile) {
123 return static_cast<PermissionDecisionAutoBlocker*>(
124 GetInstance()->GetServiceForBrowserContext(profile, true));
125 }
126
127 // static
128 PermissionDecisionAutoBlocker::Factory*
129 PermissionDecisionAutoBlocker::Factory::GetInstance() {
130 return base::Singleton<PermissionDecisionAutoBlocker::Factory>::get();
131 }
132
133 PermissionDecisionAutoBlocker::Factory::Factory()
134 : BrowserContextKeyedServiceFactory(
135 "PermissionDecisionAutoBlocker",
136 BrowserContextDependencyManager::GetInstance()) {}
137
138 PermissionDecisionAutoBlocker::Factory::~Factory() {}
139
140 KeyedService* PermissionDecisionAutoBlocker::Factory::BuildServiceInstanceFor(
141 content::BrowserContext* context) const {
142 Profile* profile = static_cast<Profile*>(context);
143 return new PermissionDecisionAutoBlocker(profile);
144 }
145
146 content::BrowserContext*
147 PermissionDecisionAutoBlocker::Factory::GetBrowserContextToUse(
148 content::BrowserContext* context) const {
149 return chrome::GetBrowserContextOwnInstanceInIncognito(context);
150 }
151
152 // PermissionDecisionAutoBlocker -----------------------------------------------
153
107 // static 154 // static
108 const char PermissionDecisionAutoBlocker::kPromptDismissCountKey[] = 155 const char PermissionDecisionAutoBlocker::kPromptDismissCountKey[] =
109 "dismiss_count"; 156 "dismiss_count";
110 157
111 // static 158 // static
112 const char PermissionDecisionAutoBlocker::kPromptIgnoreCountKey[] = 159 const char PermissionDecisionAutoBlocker::kPromptIgnoreCountKey[] =
113 "ignore_count"; 160 "ignore_count";
114 161
115 // static 162 // static
116 const char PermissionDecisionAutoBlocker::kPermissionBlacklistEmbargoKey[] = 163 const char PermissionDecisionAutoBlocker::kPermissionBlacklistEmbargoKey[] =
117 "blacklisting_embargo_days"; 164 "blacklisting_embargo_days";
118 165
119 // static 166 // static
120 const char PermissionDecisionAutoBlocker::kPermissionDismissalEmbargoKey[] = 167 const char PermissionDecisionAutoBlocker::kPermissionDismissalEmbargoKey[] =
121 "dismissal_embargo_days"; 168 "dismissal_embargo_days";
122 169
123 // static 170 // static
171 PermissionDecisionAutoBlocker* PermissionDecisionAutoBlocker::GetForProfile(
172 Profile* profile) {
173 return PermissionDecisionAutoBlocker::Factory::GetForProfile(profile);
174 }
175
176 PermissionDecisionAutoBlocker::PermissionDecisionAutoBlocker(Profile* profile)
177 : profile_(profile),
178 db_manager_(nullptr),
179 safe_browsing_timeout_(kCheckUrlTimeoutMs),
180 clock_(new base::DefaultClock()) {
181 safe_browsing::SafeBrowsingService* sb_service =
182 g_browser_process->safe_browsing_service();
183 if (sb_service)
184 db_manager_ = sb_service->database_manager();
185 }
186
187 PermissionDecisionAutoBlocker::~PermissionDecisionAutoBlocker() {}
188
124 void PermissionDecisionAutoBlocker::RemoveCountsByUrl( 189 void PermissionDecisionAutoBlocker::RemoveCountsByUrl(
125 Profile* profile,
126 base::Callback<bool(const GURL& url)> filter) { 190 base::Callback<bool(const GURL& url)> filter) {
127 HostContentSettingsMap* map = 191 HostContentSettingsMap* map =
128 HostContentSettingsMapFactory::GetForProfile(profile); 192 HostContentSettingsMapFactory::GetForProfile(profile_);
129 193
130 std::unique_ptr<ContentSettingsForOneType> settings( 194 std::unique_ptr<ContentSettingsForOneType> settings(
131 new ContentSettingsForOneType); 195 new ContentSettingsForOneType);
132 map->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT, 196 map->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT,
133 std::string(), settings.get()); 197 std::string(), settings.get());
134 198
135 for (const auto& site : *settings) { 199 for (const auto& site : *settings) {
136 GURL origin(site.primary_pattern.ToString()); 200 GURL origin(site.primary_pattern.ToString());
137 201
138 if (origin.is_valid() && filter.Run(origin)) { 202 if (origin.is_valid() && filter.Run(origin)) {
139 map->SetWebsiteSettingDefaultScope( 203 map->SetWebsiteSettingDefaultScope(
140 origin, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT, 204 origin, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT,
141 std::string(), nullptr); 205 std::string(), nullptr);
142 } 206 }
143 } 207 }
144 } 208 }
145 209
146 // static
147 int PermissionDecisionAutoBlocker::GetDismissCount( 210 int PermissionDecisionAutoBlocker::GetDismissCount(
148 const GURL& url, 211 const GURL& url,
149 content::PermissionType permission, 212 content::PermissionType permission) {
150 Profile* profile) { 213 return GetActionCount(url, permission, kPromptDismissCountKey, profile_);
151 return GetActionCount(url, permission, kPromptDismissCountKey, profile);
152 } 214 }
153 215
154 // static
155 int PermissionDecisionAutoBlocker::GetIgnoreCount( 216 int PermissionDecisionAutoBlocker::GetIgnoreCount(
156 const GURL& url, 217 const GURL& url,
157 content::PermissionType permission, 218 content::PermissionType permission) {
158 Profile* profile) { 219 return GetActionCount(url, permission, kPromptIgnoreCountKey, profile_);
159 return GetActionCount(url, permission, kPromptIgnoreCountKey, profile);
160 } 220 }
161 221
162 // static
163 bool PermissionDecisionAutoBlocker::RecordDismissAndEmbargo( 222 bool PermissionDecisionAutoBlocker::RecordDismissAndEmbargo(
164 const GURL& url, 223 const GURL& url,
165 content::PermissionType permission, 224 content::PermissionType permission) {
166 Profile* profile,
167 base::Time current_time) {
168 int current_dismissal_count = RecordActionInWebsiteSettings( 225 int current_dismissal_count = RecordActionInWebsiteSettings(
169 url, permission, kPromptDismissCountKey, profile); 226 url, permission, kPromptDismissCountKey, profile_);
227
170 if (base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften) && 228 if (base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften) &&
171 current_dismissal_count >= g_prompt_dismissals_before_block) { 229 current_dismissal_count >= g_prompt_dismissals_before_block) {
172 HostContentSettingsMap* map = 230 PlaceUnderEmbargo(permission, url, kPermissionDismissalEmbargoKey);
173 HostContentSettingsMapFactory::GetForProfile(profile);
174 PlaceUnderEmbargo(permission, url, map, current_time,
175 kPermissionDismissalEmbargoKey);
176 return true; 231 return true;
177 } 232 }
178 return false; 233 return false;
179 } 234 }
180 235
181 // static
182 int PermissionDecisionAutoBlocker::RecordIgnore( 236 int PermissionDecisionAutoBlocker::RecordIgnore(
183 const GURL& url, 237 const GURL& url,
184 content::PermissionType permission, 238 content::PermissionType permission) {
185 Profile* profile) {
186 return RecordActionInWebsiteSettings(url, permission, kPromptIgnoreCountKey, 239 return RecordActionInWebsiteSettings(url, permission, kPromptIgnoreCountKey,
187 profile); 240 profile_);
188 } 241 }
189 242
190 // static 243 // static
191 bool PermissionDecisionAutoBlocker::ShouldChangeDismissalToBlock(
192 const GURL& url,
193 content::PermissionType permission,
194 Profile* profile) {
195 int current_dismissal_count =
196 RecordDismissAndEmbargo(url, permission, profile, base::Time::Now());
197
198 if (!base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften))
199 return false;
200
201 return current_dismissal_count >= g_prompt_dismissals_before_block;
202 }
203
204 // static
205 void PermissionDecisionAutoBlocker::UpdateFromVariations() { 244 void PermissionDecisionAutoBlocker::UpdateFromVariations() {
206 int prompt_dismissals = -1; 245 int prompt_dismissals = -1;
207 int blacklist_embargo_days = -1; 246 int blacklist_embargo_days = -1;
208 int dismissal_embargo_days = -1; 247 int dismissal_embargo_days = -1;
209 std::string dismissals_value = variations::GetVariationParamValueByFeature( 248 std::string dismissals_value = variations::GetVariationParamValueByFeature(
210 features::kBlockPromptsIfDismissedOften, kPromptDismissCountKey); 249 features::kBlockPromptsIfDismissedOften, kPromptDismissCountKey);
211 std::string blacklist_embargo_value = 250 std::string blacklist_embargo_value =
212 variations::GetVariationParamValueByFeature( 251 variations::GetVariationParamValueByFeature(
213 features::kPermissionsBlacklist, kPermissionBlacklistEmbargoKey); 252 features::kPermissionsBlacklist, kPermissionBlacklistEmbargoKey);
214 std::string dismissal_embargo_value = 253 std::string dismissal_embargo_value =
215 variations::GetVariationParamValueByFeature( 254 variations::GetVariationParamValueByFeature(
216 features::kBlockPromptsIfDismissedOften, 255 features::kBlockPromptsIfDismissedOften,
217 kPermissionDismissalEmbargoKey); 256 kPermissionDismissalEmbargoKey);
218 // If converting the value fails, stick with the current value. 257 // If converting the value fails, stick with the current value.
219 if (base::StringToInt(dismissals_value, &prompt_dismissals) && 258 if (base::StringToInt(dismissals_value, &prompt_dismissals) &&
220 prompt_dismissals > 0) { 259 prompt_dismissals > 0) {
221 g_prompt_dismissals_before_block = prompt_dismissals; 260 g_prompt_dismissals_before_block = prompt_dismissals;
222 } 261 }
223 if (base::StringToInt(blacklist_embargo_value, &blacklist_embargo_days) && 262 if (base::StringToInt(blacklist_embargo_value, &blacklist_embargo_days) &&
224 blacklist_embargo_days > 0) { 263 blacklist_embargo_days > 0) {
225 g_blacklist_embargo_days = blacklist_embargo_days; 264 g_blacklist_embargo_days = blacklist_embargo_days;
226 } 265 }
227 if (base::StringToInt(dismissal_embargo_value, &dismissal_embargo_days) && 266 if (base::StringToInt(dismissal_embargo_value, &dismissal_embargo_days) &&
228 dismissal_embargo_days > 0) { 267 dismissal_embargo_days > 0) {
229 g_dismissal_embargo_days = dismissal_embargo_days; 268 g_dismissal_embargo_days = dismissal_embargo_days;
230 } 269 }
231 } 270 }
232 271
233 // static
234 // TODO(meredithl): Have PermissionDecisionAutoBlocker handle the database
235 // manager, rather than passing it in.
236 void PermissionDecisionAutoBlocker::UpdateEmbargoedStatus( 272 void PermissionDecisionAutoBlocker::UpdateEmbargoedStatus(
237 scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
238 content::PermissionType permission, 273 content::PermissionType permission,
239 const GURL& request_origin, 274 const GURL& request_origin,
240 content::WebContents* web_contents, 275 content::WebContents* web_contents,
241 int timeout,
242 Profile* profile,
243 base::Time current_time,
244 base::Callback<void(bool)> callback) { 276 base::Callback<void(bool)> callback) {
245 // Check if origin is currently under embargo for the requested permission. 277 // Check if origin is currently under embargo for the requested permission.
246 if (IsUnderEmbargo(permission, profile, request_origin, current_time)) { 278 if (IsUnderEmbargo(permission, request_origin)) {
247 callback.Run(true /* permission_blocked */); 279 callback.Run(true /* permission_blocked */);
248 return; 280 return;
249 } 281 }
250 282
251 if (base::FeatureList::IsEnabled(features::kPermissionsBlacklist) && 283 if (base::FeatureList::IsEnabled(features::kPermissionsBlacklist) &&
252 db_manager) { 284 db_manager_) {
285 // The CheckSafeBrowsingResult callback won't be called if the profile is
286 // destroyed before a result is received. In that case this object will have
287 // been destroyed by that point.
253 PermissionBlacklistClient::CheckSafeBrowsingBlacklist( 288 PermissionBlacklistClient::CheckSafeBrowsingBlacklist(
254 db_manager, permission, request_origin, web_contents, timeout, 289 db_manager_, permission, request_origin, web_contents,
290 safe_browsing_timeout_,
255 base::Bind(&PermissionDecisionAutoBlocker::CheckSafeBrowsingResult, 291 base::Bind(&PermissionDecisionAutoBlocker::CheckSafeBrowsingResult,
256 permission, profile, request_origin, current_time, 292 base::Unretained(this), permission, request_origin,
257 callback)); 293 callback));
258 return; 294 return;
259 } 295 }
260 296
261 callback.Run(false /* permission blocked */); 297 callback.Run(false /* permission blocked */);
262 } 298 }
263 299
264 // static
265 bool PermissionDecisionAutoBlocker::IsUnderEmbargo( 300 bool PermissionDecisionAutoBlocker::IsUnderEmbargo(
266 content::PermissionType permission, 301 content::PermissionType permission,
267 Profile* profile, 302 const GURL& request_origin) {
268 const GURL& request_origin,
269 base::Time current_time) {
270 HostContentSettingsMap* map = 303 HostContentSettingsMap* map =
271 HostContentSettingsMapFactory::GetForProfile(profile); 304 HostContentSettingsMapFactory::GetForProfile(profile_);
272 std::unique_ptr<base::DictionaryValue> dict = 305 std::unique_ptr<base::DictionaryValue> dict =
273 GetOriginDict(map, request_origin); 306 GetOriginDict(map, request_origin);
274 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict( 307 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict(
275 dict.get(), PermissionUtil::GetPermissionString(permission)); 308 dict.get(), PermissionUtil::GetPermissionString(permission));
276 double embargo_date = -1; 309 double embargo_date = -1;
277 bool is_under_dismiss_embargo = false; 310 bool is_under_dismiss_embargo = false;
278 bool is_under_blacklist_embargo = false; 311 bool is_under_blacklist_embargo = false;
312 base::Time current_time = clock_->Now();
279 if (base::FeatureList::IsEnabled(features::kPermissionsBlacklist) && 313 if (base::FeatureList::IsEnabled(features::kPermissionsBlacklist) &&
280 permission_dict->GetDouble(kPermissionBlacklistEmbargoKey, 314 permission_dict->GetDouble(kPermissionBlacklistEmbargoKey,
281 &embargo_date)) { 315 &embargo_date)) {
282 if (current_time < 316 if (current_time <
283 base::Time::FromInternalValue(embargo_date) + 317 base::Time::FromInternalValue(embargo_date) +
284 base::TimeDelta::FromDays(g_blacklist_embargo_days)) { 318 base::TimeDelta::FromDays(g_blacklist_embargo_days)) {
285 is_under_blacklist_embargo = true; 319 is_under_blacklist_embargo = true;
286 } 320 }
287 } 321 }
288 322
289 if (base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften) && 323 if (base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften) &&
290 permission_dict->GetDouble(kPermissionDismissalEmbargoKey, 324 permission_dict->GetDouble(kPermissionDismissalEmbargoKey,
291 &embargo_date)) { 325 &embargo_date)) {
292 if (current_time < 326 if (current_time <
293 base::Time::FromInternalValue(embargo_date) + 327 base::Time::FromInternalValue(embargo_date) +
294 base::TimeDelta::FromDays(g_dismissal_embargo_days)) { 328 base::TimeDelta::FromDays(g_dismissal_embargo_days)) {
295 is_under_dismiss_embargo = true; 329 is_under_dismiss_embargo = true;
296 } 330 }
297 } 331 }
298 // If either embargoes is still in effect, return true. 332
333 // If either embargo is still in effect, return true.
299 return is_under_dismiss_embargo || is_under_blacklist_embargo; 334 return is_under_dismiss_embargo || is_under_blacklist_embargo;
300 } 335 }
301 336
302 void PermissionDecisionAutoBlocker::PlaceUnderEmbargo(
303 content::PermissionType permission,
304 const GURL& request_origin,
305 HostContentSettingsMap* map,
306 base::Time current_time,
307 const char* key) {
308 std::unique_ptr<base::DictionaryValue> dict =
309 GetOriginDict(map, request_origin);
310 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict(
311 dict.get(), PermissionUtil::GetPermissionString(permission));
312 permission_dict->SetDouble(key, current_time.ToInternalValue());
313 map->SetWebsiteSettingDefaultScope(
314 request_origin, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT,
315 std::string(), std::move(dict));
316 }
317
318 // static 337 // static
319 void PermissionDecisionAutoBlocker::CheckSafeBrowsingResult( 338 void PermissionDecisionAutoBlocker::CheckSafeBrowsingResult(
320 content::PermissionType permission, 339 content::PermissionType permission,
321 Profile* profile,
322 const GURL& request_origin, 340 const GURL& request_origin,
323 base::Time current_time,
324 base::Callback<void(bool)> callback, 341 base::Callback<void(bool)> callback,
325 bool should_be_embargoed) { 342 bool should_be_embargoed) {
326 if (should_be_embargoed) { 343 if (should_be_embargoed) {
327 // Requesting site is blacklisted for this permission, update the content 344 // Requesting site is blacklisted for this permission, update the content
328 // setting to place it under embargo. 345 // setting to place it under embargo.
329 PlaceUnderEmbargo(permission, request_origin, 346 PlaceUnderEmbargo(permission, request_origin,
330 HostContentSettingsMapFactory::GetForProfile(profile), 347 kPermissionBlacklistEmbargoKey);
331 current_time, kPermissionBlacklistEmbargoKey);
332 } 348 }
333 callback.Run(should_be_embargoed /* permission blocked */); 349 callback.Run(should_be_embargoed /* permission blocked */);
334 } 350 }
335 351
336 // static 352 // static
337 // TODO(meredithl): Have PermissionDecisionAutoBlocker handle the database 353 void PermissionDecisionAutoBlocker::PlaceUnderEmbargo(
338 // manager, rather than passing it in.
339 void PermissionDecisionAutoBlocker::UpdateEmbargoedStatus(
340 scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
341 content::PermissionType permission, 354 content::PermissionType permission,
342 const GURL& request_origin, 355 const GURL& request_origin,
343 content::WebContents* web_contents, 356 const char* key) {
344 int timeout,
345 Profile* profile,
346 base::Time current_time,
347 base::Callback<void(bool)> callback) {
348 // Check if origin is currently under embargo for the requested permission.
349 if (IsUnderEmbargo(permission, profile, request_origin, current_time)) {
350 callback.Run(true /* permission_blocked */);
351 return;
352 }
353
354 if (base::FeatureList::IsEnabled(features::kPermissionsBlacklist) &&
355 db_manager) {
356 PermissionBlacklistClient::CheckSafeBrowsingBlacklist(
357 db_manager, permission, request_origin, web_contents, timeout,
358 base::Bind(&PermissionDecisionAutoBlocker::CheckSafeBrowsingResult,
359 permission, profile, request_origin, current_time,
360 callback));
361 }
362
363 callback.Run(false /* permission blocked */);
364 }
365
366 // static
367 bool PermissionDecisionAutoBlocker::IsUnderEmbargo(
368 content::PermissionType permission,
369 Profile* profile,
370 const GURL& request_origin,
371 base::Time current_time) {
372 HostContentSettingsMap* map = 357 HostContentSettingsMap* map =
373 HostContentSettingsMapFactory::GetForProfile(profile); 358 HostContentSettingsMapFactory::GetForProfile(profile_);
374 std::unique_ptr<base::DictionaryValue> dict = 359 std::unique_ptr<base::DictionaryValue> dict =
375 GetOriginDict(map, request_origin); 360 GetOriginDict(map, request_origin);
376 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict( 361 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict(
377 dict.get(), PermissionUtil::GetPermissionString(permission)); 362 dict.get(), PermissionUtil::GetPermissionString(permission));
378 double embargo_date = -1; 363 permission_dict->SetDouble(key, clock_->Now().ToInternalValue());
379 bool is_under_dismiss_embargo = false;
380 bool is_under_blacklist_embargo = false;
381 if (base::FeatureList::IsEnabled(features::kPermissionsBlacklist) &&
382 permission_dict->GetDouble(kPermissionBlacklistEmbargoKey,
383 &embargo_date)) {
384 if (current_time <
385 base::Time::FromInternalValue(embargo_date) +
386 base::TimeDelta::FromDays(g_blacklist_embargo_days)) {
387 is_under_blacklist_embargo = true;
388 }
389 }
390
391 if (base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften) &&
392 permission_dict->GetDouble(kPermissionDismissalEmbargoKey,
393 &embargo_date)) {
394 if (current_time <
395 base::Time::FromInternalValue(embargo_date) +
396 base::TimeDelta::FromDays(g_dismissal_embargo_days)) {
397 is_under_dismiss_embargo = true;
398 }
399 }
400 // If either embargoes is still in effect, return true.
401 return is_under_dismiss_embargo || is_under_blacklist_embargo;
402 }
403
404 void PermissionDecisionAutoBlocker::PlaceUnderEmbargo(
405 content::PermissionType permission,
406 const GURL& request_origin,
407 HostContentSettingsMap* map,
408 base::Time current_time,
409 const char* key) {
410 std::unique_ptr<base::DictionaryValue> dict =
411 GetOriginDict(map, request_origin);
412 base::DictionaryValue* permission_dict = GetOrCreatePermissionDict(
413 dict.get(), PermissionUtil::GetPermissionString(permission));
414 permission_dict->SetDouble(key, current_time.ToInternalValue());
415 map->SetWebsiteSettingDefaultScope( 364 map->SetWebsiteSettingDefaultScope(
416 request_origin, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT, 365 request_origin, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT,
417 std::string(), std::move(dict)); 366 std::string(), std::move(dict));
418 } 367 }
419 368
420 // static 369 void PermissionDecisionAutoBlocker::
421 void PermissionDecisionAutoBlocker::CheckSafeBrowsingResult( 370 SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(
422 content::PermissionType permission, 371 scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
423 Profile* profile, 372 int timeout) {
424 const GURL& request_origin, 373 db_manager_ = db_manager;
425 base::Time current_time, 374 safe_browsing_timeout_ = timeout;
426 base::Callback<void(bool)> callback,
427 bool should_be_embargoed) {
428 if (should_be_embargoed) {
429 // Requesting site is blacklisted for this permission, update the content
430 // setting to place it under embargo.
431 PlaceUnderEmbargo(permission, request_origin,
432 HostContentSettingsMapFactory::GetForProfile(profile),
433 current_time, kPermissionBlacklistEmbargoKey);
434 }
435 callback.Run(should_be_embargoed /* permission blocked */);
436 } 375 }
376
377 void PermissionDecisionAutoBlocker::SetClockForTesting(
378 std::unique_ptr<base::Clock> clock) {
379 clock_ = std::move(clock);
380 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698