• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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 // Patterns used in content setting rules.
6 
7 #ifndef COMPONENTS_CONTENT_SETTINGS_CORE_COMMON_CONTENT_SETTINGS_PATTERN_H_
8 #define COMPONENTS_CONTENT_SETTINGS_CORE_COMMON_CONTENT_SETTINGS_PATTERN_H_
9 
10 #include <string>
11 
12 #include "base/gtest_prod_util.h"
13 
14 class GURL;
15 
16 namespace content_settings {
17 class PatternParser;
18 }
19 
20 // A pattern used in content setting rules. See |IsValid| for a description of
21 // possible patterns.
22 class ContentSettingsPattern {
23  public:
24   // Each content settings pattern describes a set of origins. Patterns, and the
25   // sets they describe, have specific relations. |Relation| describes the
26   // relation of two patterns A and B. When pattern A is compared with pattern B
27   // (A compare B) interesting relations are:
28   // - IDENTITY:
29   //   Pattern A and B are identical. The patterns are equal.
30   //
31   // - DISJOINT_ORDER_PRE:
32   //   Pattern A and B have no intersection. A and B never match the origin of
33   //   a URL at the same time. But pattern A has a higher precedence than
34   //   pattern B when patterns are sorted.
35   //
36   // - DISJOINT_ORDER_POST:
37   //   Pattern A and B have no intersection. A and B never match the origin of
38   //   a URL at the same time. But pattern A has a lower precedence than
39   //   pattern B when patterns are sorted.
40   //
41   // - SUCCESSOR:
42   //   Pattern A and B have an intersection. But pattern B has a higher
43   //   precedence than pattern A for URLs that are matched by both pattern.
44   //
45   // - PREDECESSOR:
46   //   Pattern A and B have an intersection. But pattern A has a higher
47   //   precedence than pattern B for URLs that are matched by both pattern.
48   enum Relation {
49     DISJOINT_ORDER_POST = -2,
50     SUCCESSOR = -1,
51     IDENTITY = 0,
52     PREDECESSOR = 1,
53     DISJOINT_ORDER_PRE = 2,
54   };
55 
56   struct PatternParts {
57     PatternParts();
58     ~PatternParts();
59 
60     // Lowercase string of the URL scheme to match. This string is empty if the
61     // |is_scheme_wildcard| flag is set.
62     std::string scheme;
63 
64     // True if the scheme wildcard is set.
65     bool is_scheme_wildcard;
66 
67     // Normalized string that is either of the following:
68     // - IPv4 or IPv6
69     // - hostname
70     // - domain
71     // - empty string if the |is_host_wildcard flag is set.
72     std::string host;
73 
74     // True if the domain wildcard is set.
75     bool has_domain_wildcard;
76 
77     // String with the port to match. This string is empty if the
78     // |is_port_wildcard| flag is set.
79     std::string port;
80 
81     // True if the port wildcard is set.
82     bool is_port_wildcard;
83 
84     // TODO(markusheintz): Needed for legacy reasons. Remove. Path
85     // specification. Only used for content settings pattern with a "file"
86     // scheme part.
87     std::string path;
88 
89     // True if the path wildcard is set.
90     bool is_path_wildcard;
91   };
92 
93   class BuilderInterface {
94    public:
~BuilderInterface()95     virtual ~BuilderInterface() {}
96 
97     virtual BuilderInterface* WithPort(const std::string& port) = 0;
98 
99     virtual BuilderInterface* WithPortWildcard() = 0;
100 
101     virtual BuilderInterface* WithHost(const std::string& host) = 0;
102 
103     virtual BuilderInterface* WithDomainWildcard() = 0;
104 
105     virtual BuilderInterface* WithScheme(const std::string& scheme) = 0;
106 
107     virtual BuilderInterface* WithSchemeWildcard() = 0;
108 
109     virtual BuilderInterface* WithPath(const std::string& path) = 0;
110 
111     virtual BuilderInterface* WithPathWildcard() = 0;
112 
113     virtual BuilderInterface* Invalid() = 0;
114 
115     // Returns a content settings pattern according to the current configuration
116     // of the builder.
117     virtual ContentSettingsPattern Build() = 0;
118   };
119 
120   static BuilderInterface* CreateBuilder(bool use_legacy_validate);
121 
122   // The version of the pattern format implemented.
123   static const int kContentSettingsPatternVersion;
124 
125   // Returns a wildcard content settings pattern that matches all possible valid
126   // origins.
127   static ContentSettingsPattern Wildcard();
128 
129   // Returns a pattern that matches the scheme and host of this URL, as well as
130   // all subdomains and ports.
131   static ContentSettingsPattern FromURL(const GURL& url);
132 
133   // Returns a pattern that matches exactly this URL.
134   static ContentSettingsPattern FromURLNoWildcard(const GURL& url);
135 
136   // Returns a pattern that matches the given pattern specification.
137   // Valid patterns specifications are:
138   //   - [*.]domain.tld (matches domain.tld and all sub-domains)
139   //   - host (matches an exact hostname)
140   //   - scheme://host:port (supported schemes: http,https)
141   //   - scheme://[*.]domain.tld:port (supported schemes: http,https)
142   //   - file://path (The path has to be an absolute path and start with a '/')
143   //   - a.b.c.d (matches an exact IPv4 ip)
144   //   - [a:b:c:d:e:f:g:h] (matches an exact IPv6 ip)
145   static ContentSettingsPattern FromString(const std::string& pattern_spec);
146 
147   // Sets the scheme that doesn't support domain wildcard and port.
148   // Needs to be called by the embedder before using ContentSettingsPattern.
149   // |scheme| can't be NULL, and the pointed string must remain alive until the
150   // app terminates.
151   static void SetNonWildcardDomainNonPortScheme(const char* scheme);
152 
153   // Compares |scheme| against the scheme set by the embedder.
154   static bool IsNonWildcardDomainNonPortScheme(const std::string& scheme);
155 
156   // Constructs an empty pattern. Empty patterns are invalid patterns. Invalid
157   // patterns match nothing.
158   ContentSettingsPattern();
159 
160   // True if this is a valid pattern.
IsValid()161   bool IsValid() const { return is_valid_; }
162 
163   // True if |url| matches this pattern.
164   bool Matches(const GURL& url) const;
165 
166   // True if this pattern matches all hosts (i.e. it has a host wildcard).
167   bool MatchesAllHosts() const;
168 
169   // Returns a std::string representation of this pattern.
170   std::string ToString() const;
171 
172   // Compares the pattern with a given |other| pattern and returns the
173   // |Relation| of the two patterns.
174   Relation Compare(const ContentSettingsPattern& other) const;
175 
176   // Returns true if the pattern and the |other| pattern are identical.
177   bool operator==(const ContentSettingsPattern& other) const;
178 
179   // Returns true if the pattern and the |other| pattern are not identical.
180   bool operator!=(const ContentSettingsPattern& other) const;
181 
182   // Returns true if the pattern has a lower priority than the |other| pattern.
183   bool operator<(const ContentSettingsPattern& other) const;
184 
185   // Returns true if the pattern has a higher priority than the |other| pattern.
186   bool operator>(const ContentSettingsPattern& other) const;
187 
188  private:
189   friend class content_settings::PatternParser;
190   friend class ContentSettingsPatternSerializer;
191   FRIEND_TEST_ALL_PREFIXES(ContentSettingsPatternParserTest, SerializePatterns);
192 
193   class Builder;
194 
195   static Relation CompareScheme(
196       const ContentSettingsPattern::PatternParts& parts,
197       const ContentSettingsPattern::PatternParts& other_parts);
198 
199   static Relation CompareHost(
200       const ContentSettingsPattern::PatternParts& parts,
201       const ContentSettingsPattern::PatternParts& other_parts);
202 
203   static Relation ComparePort(
204       const ContentSettingsPattern::PatternParts& parts,
205       const ContentSettingsPattern::PatternParts& other_parts);
206 
207   ContentSettingsPattern(const PatternParts& parts, bool valid);
208 
209   PatternParts parts_;
210 
211   bool is_valid_;
212 };
213 
214 #endif  // COMPONENTS_CONTENT_SETTINGS_CORE_COMMON_CONTENT_SETTINGS_PATTERN_H_
215