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

Unified Diff: components/safe_browsing/password_protection/password_protection_service.cc

Issue 2870193002: Clean up expired verdicts at shutdown (Closed)
Patch Set: nit Created 3 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 side-by-side diff with in-line comments
Download patch
Index: components/safe_browsing/password_protection/password_protection_service.cc
diff --git a/components/safe_browsing/password_protection/password_protection_service.cc b/components/safe_browsing/password_protection/password_protection_service.cc
index 32038372bb4d03e780fd3566b616531391888bc7..bc31c45634fd0276d2c0a2b159a99d10c0418cbd 100644
--- a/components/safe_browsing/password_protection/password_protection_service.cc
+++ b/components/safe_browsing/password_protection/password_protection_service.cc
@@ -201,6 +201,62 @@ void PasswordProtectionService::CacheVerdict(
std::string(), std::move(verdict_dictionary));
}
+void PasswordProtectionService::CleanUpExpiredVerdicts() {
+ DCHECK(content_settings_);
+ if (GetStoredVerdictCount() <= 0)
+ return;
+
+ ContentSettingsForOneType password_protection_settings;
+ content_settings_->GetSettingsForOneType(
+ CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION, std::string(),
+ &password_protection_settings);
+
+ for (const ContentSettingPatternSource& source :
+ password_protection_settings) {
+ GURL primary_pattern_url = GURL(source.primary_pattern.ToString());
+ // Find all verdicts associated with this origin.
+ std::unique_ptr<base::DictionaryValue> verdict_dictionary =
+ base::DictionaryValue::From(content_settings_->GetWebsiteSetting(
+ primary_pattern_url, GURL(),
+ CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION, std::string(), nullptr));
+ std::vector<base::StringPiece> expired_keys;
+ for (base::DictionaryValue::Iterator it(*verdict_dictionary.get());
+ !it.IsAtEnd(); it.Advance()) {
+ base::DictionaryValue* verdict_entry = nullptr;
+ CHECK(verdict_dictionary->GetDictionaryWithoutPathExpansion(
+ it.key(), &verdict_entry));
lpz 2017/05/10 14:03:54 nit: align?
Jialiu Lin 2017/05/10 22:26:32 Acknowledged. "git cl format" insists this is the
+ int verdict_received_time;
+ LoginReputationClientResponse verdict;
+ CHECK(ParseVerdictEntry(verdict_entry, &verdict_received_time, &verdict));
+
+ if (IsCacheExpired(verdict_received_time, verdict.cache_duration_sec())) {
+ // Since DictionaryValue::Iterator cannot be used to modify the
+ // dictionary, we record the keys of expired verdicts in |expired_keys|
+ // and remove them in the next for-loop.
+ expired_keys.push_back(it.key());
+ }
+ }
+
+ for (const base::StringPiece& key : expired_keys) {
+ verdict_dictionary->RemoveWithoutPathExpansion(key, nullptr);
+ stored_verdict_count_--;
+ }
+
+ if (verdict_dictionary->size() == 0u) {
+ content_settings_->ClearSettingsForOneTypeWithPredicate(
+ CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION, base::Time(),
+ base::Bind(&OriginMatchPrimaryPattern, primary_pattern_url));
+ } else if (expired_keys.size() > 0u) {
+ // Set the website setting of this origin with the updated
+ // |verdict_diectionary|.
+ content_settings_->SetWebsiteSettingDefaultScope(
+ primary_pattern_url, GURL(),
+ CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION, std::string(),
+ std::move(verdict_dictionary));
+ }
+ }
+}
+
void PasswordProtectionService::StartRequest(
const GURL& main_frame_url,
const GURL& password_form_action,

Powered by Google App Engine
This is Rietveld 408576698