Home | History | Annotate | Download | only in common
      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:
     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.
    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