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