OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include <string> | |
6 #include <vector> | |
7 | |
8 #include "base/bind.h" | |
9 #include "chrome/browser/browsing_data/browsing_data_remover_filter.h" | |
10 #include "components/content_settings/core/common/content_settings_pattern.h" | |
11 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" | |
12 | |
13 using net::registry_controlled_domains::GetDomainAndRegistry; | |
14 using net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES; | |
15 using Relation = ContentSettingsPattern::Relation; | |
16 | |
17 namespace { | |
18 | |
19 bool NoopFilter(const GURL& url) { | |
20 return true; | |
21 } | |
22 | |
23 } // namespace | |
24 | |
25 BrowsingDataRemoverFilter::BrowsingDataRemoverFilter(Mode mode) : mode_(mode) {} | |
26 | |
27 BrowsingDataRemoverFilter::~BrowsingDataRemoverFilter() {} | |
28 | |
29 void BrowsingDataRemoverFilter::AddOrigin(const url::Origin& origin) { | |
30 // TODO(msramek): Optimize OriginFilterBuilder for larger filters if needed. | |
31 DCHECK_LE(origin_list_.size(), 10U) << "OriginFilterBuilder is only suitable " | |
32 "for creating small filters."; | |
33 | |
34 // By limiting the filter to non-unique origins, we can guarantee that | |
35 // origin1 < origin2 && origin1 > origin2 <=> origin1.isSameOrigin(origin2). | |
36 // This means that std::set::find() will use the same semantics for | |
37 // origin comparison as Origin::IsSameOriginWith(). Furthermore, this | |
38 // means that two filters are equal iff they are equal element-wise. | |
39 DCHECK(!origin.unique()) << "Invalid origin passed into OriginFilter."; | |
40 | |
41 // TODO(msramek): All urls with file scheme currently map to the same | |
42 // origin. This is currently not a problem, but if it becomes one, | |
43 // consider recognizing the URL path. | |
44 | |
45 origin_list_.insert(origin); | |
46 } | |
47 | |
48 void BrowsingDataRemoverFilter::AddRegisterableDomain( | |
49 const std::string& domain) { | |
50 DCHECK_EQ(GetDomainAndRegistry("www." + domain, INCLUDE_PRIVATE_REGISTRIES), | |
msramek
2016/04/07 16:19:12
Please explain this DCHECK.
dmurph
2016/04/08 23:33:45
Done.
| |
51 domain); | |
52 domain_list_.insert(domain); | |
53 } | |
54 | |
55 void BrowsingDataRemoverFilter::SetMode(Mode mode) { | |
56 mode_ = mode; | |
57 } | |
58 | |
59 bool BrowsingDataRemoverFilter::IsEmptyBlacklist() const { | |
60 return mode_ == Mode::BLACKLIST && origin_list_.empty(); | |
61 } | |
62 | |
63 base::Callback<bool(const GURL&)> | |
64 BrowsingDataRemoverFilter::BuildSameOriginOrDomainFilter() const { | |
65 std::set<url::Origin>* origins = new std::set<url::Origin>(origin_list_); | |
66 std::set<std::string>* domains = new std::set<std::string>(domain_list_); | |
67 return base::Bind(&BrowsingDataRemoverFilter::MatchesURL, | |
68 base::Owned(origins), base::Owned(domains), mode_); | |
69 } | |
70 | |
71 base::Callback<bool(const ContentSettingsPattern& pattern)> | |
72 BrowsingDataRemoverFilter::BuildWebsiteSettingsPatternMatchesFilter() const { | |
73 std::set<url::Origin>* origins = new std::set<url::Origin>(origin_list_); | |
74 std::vector<ContentSettingsPattern>* patterns_from_domains = | |
75 new std::vector<ContentSettingsPattern>(domain_list_.size()); | |
76 | |
77 ContentSettingsPattern::BuilderInterface* builder = | |
78 ContentSettingsPattern::CreateBuilder(false); | |
msramek
2016/04/07 16:19:12
nit: /* validate */
dmurph
2016/04/08 23:33:45
Done.
| |
79 for (const std::string& domain : domain_list_) { | |
80 patterns_from_domains->push_back(builder->WithSchemeWildcard() | |
81 ->WithPortWildcard() | |
82 ->WithDomainWildcard() | |
83 ->WithPathWildcard() | |
84 ->WithHost(domain) | |
85 ->Build()); | |
86 } | |
87 | |
88 return base::Bind(&BrowsingDataRemoverFilter::MatchesWebsiteSettingsPattern, | |
89 base::Owned(origins), base::Owned(patterns_from_domains), | |
90 mode_); | |
91 } | |
92 | |
93 base::Callback<bool(const net::CanonicalCookie& pattern)> | |
94 BrowsingDataRemoverFilter::BuildDomainCookieFilter() const { | |
95 std::set<std::string>* domains_and_ips = | |
96 new std::set<std::string>(domain_list_); | |
97 for (const url::Origin origin : origin_list_) { | |
98 GURL origin_url(origin.Serialize()); | |
99 if (origin_url.HostIsIPAddress()) { | |
100 domains_and_ips->insert(origin_url.host()); | |
101 } else { | |
102 domains_and_ips->insert( | |
103 GetDomainAndRegistry(origin.host(), INCLUDE_PRIVATE_REGISTRIES)); | |
104 } | |
105 } | |
106 return base::Bind( | |
107 &BrowsingDataRemoverFilter::MatchesCookieForRegisterableDomainsAndIPs, | |
108 base::Owned(domains_and_ips), mode_); | |
109 } | |
110 | |
111 // static | |
112 base::Callback<bool(const GURL&)> BrowsingDataRemoverFilter::BuildNoopFilter() { | |
113 return base::Bind(&NoopFilter); | |
114 } | |
115 | |
116 // static | |
117 bool BrowsingDataRemoverFilter::MatchesURL( | |
118 std::set<url::Origin>* origins, | |
119 std::set<std::string>* registerable_domains, | |
120 Mode mode, | |
121 const GURL& url) { | |
122 return (((origins->find(url::Origin(url)) != origins->end()) || | |
123 (registerable_domains->find( | |
124 GetDomainAndRegistry(url, INCLUDE_PRIVATE_REGISTRIES)) != | |
125 registerable_domains->end())) == (mode == WHITELIST)); | |
126 } | |
127 | |
128 // static | |
129 bool BrowsingDataRemoverFilter::MatchesWebsiteSettingsPattern( | |
130 std::set<url::Origin>* origins, | |
131 std::vector<ContentSettingsPattern>* domain_patterns, | |
132 Mode mode, | |
133 const ContentSettingsPattern& pattern) { | |
134 for (const url::Origin& origin : *origins) { | |
135 if (pattern.Matches(GURL(origin.Serialize()))) | |
136 return mode == WHITELIST; | |
137 } | |
138 for (const ContentSettingsPattern& domain : *domain_patterns) { | |
139 Relation relation = pattern.Compare(domain); | |
140 if (relation == Relation::IDENTITY || relation == Relation::PREDECESSOR) | |
141 return mode == WHITELIST; | |
142 } | |
143 return mode != WHITELIST; | |
144 } | |
145 | |
146 // static | |
147 bool BrowsingDataRemoverFilter::MatchesCookieForRegisterableDomainsAndIPs( | |
148 std::set<std::string>* domains_and_ips, | |
149 Mode mode, | |
150 const net::CanonicalCookie& cookie) { | |
151 if (domains_and_ips->empty()) | |
152 return mode == BLACKLIST; | |
153 std::string cookie_domain = cookie.Domain(); | |
154 if (cookie.IsDomainCookie()) | |
155 cookie_domain = cookie_domain.substr(1); | |
156 std::string parsed_cookie_domain = | |
157 GetDomainAndRegistry(cookie_domain, INCLUDE_PRIVATE_REGISTRIES); | |
158 // This means we're an IP address. | |
159 if (parsed_cookie_domain.empty()) | |
160 parsed_cookie_domain = cookie_domain; | |
161 return (mode == WHITELIST) == (domains_and_ips->find(parsed_cookie_domain) != | |
162 domains_and_ips->end()); | |
163 } | |
OLD | NEW |