OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 if (!m_hostIsIPAddress) { | 91 if (!m_hostIsIPAddress) { |
92 WebPublicSuffixList* suffixList = Platform::current()->publicSuffixList(); | 92 WebPublicSuffixList* suffixList = Platform::current()->publicSuffixList(); |
93 if (!suffixList) | 93 if (!suffixList) |
94 return; | 94 return; |
95 | 95 |
96 size_t publicSuffixLength = suffixList->getPublicSuffixLength(m_host); | 96 size_t publicSuffixLength = suffixList->getPublicSuffixLength(m_host); |
97 if (m_host.length() <= publicSuffixLength + 1) { | 97 if (m_host.length() <= publicSuffixLength + 1) { |
98 m_hostIsPublicSuffix = true; | 98 m_hostIsPublicSuffix = true; |
99 } else if (subdomainSetting == AllowRegisterableDomains && | 99 } else if (subdomainSetting == AllowRegisterableDomains && |
100 publicSuffixLength) { | 100 publicSuffixLength) { |
101 // The "2" in the next line is 1 for the '.', plus a 1-char minimum label
length. | 101 // The "2" in the next line is 1 for the '.', plus a 1-char minimum label |
| 102 // length. |
102 const size_t dot = | 103 const size_t dot = |
103 m_host.reverseFind('.', m_host.length() - publicSuffixLength - 2); | 104 m_host.reverseFind('.', m_host.length() - publicSuffixLength - 2); |
104 if (dot == kNotFound) | 105 if (dot == kNotFound) |
105 m_registerableDomain = host; | 106 m_registerableDomain = host; |
106 else | 107 else |
107 m_registerableDomain = host.substring(dot + 1); | 108 m_registerableDomain = host.substring(dot + 1); |
108 } | 109 } |
109 } | 110 } |
110 } | 111 } |
111 | 112 |
112 OriginAccessEntry::MatchResult OriginAccessEntry::matchesOrigin( | 113 OriginAccessEntry::MatchResult OriginAccessEntry::matchesOrigin( |
113 const SecurityOrigin& origin) const { | 114 const SecurityOrigin& origin) const { |
114 ASSERT(origin.protocol() == origin.protocol().lower()); | 115 ASSERT(origin.protocol() == origin.protocol().lower()); |
115 | 116 |
116 if (m_protocol != origin.protocol()) | 117 if (m_protocol != origin.protocol()) |
117 return DoesNotMatchOrigin; | 118 return DoesNotMatchOrigin; |
118 | 119 |
119 return matchesDomain(origin); | 120 return matchesDomain(origin); |
120 } | 121 } |
121 | 122 |
122 OriginAccessEntry::MatchResult OriginAccessEntry::matchesDomain( | 123 OriginAccessEntry::MatchResult OriginAccessEntry::matchesDomain( |
123 const SecurityOrigin& origin) const { | 124 const SecurityOrigin& origin) const { |
124 ASSERT(origin.host() == origin.host().lower()); | 125 ASSERT(origin.host() == origin.host().lower()); |
125 // Special case: Include subdomains and empty host means "all hosts, including
ip addresses". | 126 // Special case: Include subdomains and empty host means "all hosts, including |
| 127 // ip addresses". |
126 if (m_subdomainSettings != DisallowSubdomains && m_host.isEmpty()) | 128 if (m_subdomainSettings != DisallowSubdomains && m_host.isEmpty()) |
127 return MatchesOrigin; | 129 return MatchesOrigin; |
128 | 130 |
129 // Exact match. | 131 // Exact match. |
130 if (m_host == origin.host()) | 132 if (m_host == origin.host()) |
131 return MatchesOrigin; | 133 return MatchesOrigin; |
132 | 134 |
133 // Don't try to do subdomain matching on IP addresses. | 135 // Don't try to do subdomain matching on IP addresses. |
134 if (m_hostIsIPAddress) | 136 if (m_hostIsIPAddress) |
135 return DoesNotMatchOrigin; | 137 return DoesNotMatchOrigin; |
136 | 138 |
137 // Match subdomains. | 139 // Match subdomains. |
138 switch (m_subdomainSettings) { | 140 switch (m_subdomainSettings) { |
139 case DisallowSubdomains: | 141 case DisallowSubdomains: |
140 return DoesNotMatchOrigin; | 142 return DoesNotMatchOrigin; |
141 | 143 |
142 case AllowSubdomains: | 144 case AllowSubdomains: |
143 if (!IsSubdomainOfHost(origin.host(), m_host)) | 145 if (!IsSubdomainOfHost(origin.host(), m_host)) |
144 return DoesNotMatchOrigin; | 146 return DoesNotMatchOrigin; |
145 break; | 147 break; |
146 | 148 |
147 case AllowRegisterableDomains: | 149 case AllowRegisterableDomains: |
148 // Fall back to a simple subdomain check if no registerable domain could b
e found: | 150 // Fall back to a simple subdomain check if no registerable domain could |
| 151 // be found: |
149 if (m_registerableDomain.isEmpty()) { | 152 if (m_registerableDomain.isEmpty()) { |
150 if (!IsSubdomainOfHost(origin.host(), m_host)) | 153 if (!IsSubdomainOfHost(origin.host(), m_host)) |
151 return DoesNotMatchOrigin; | 154 return DoesNotMatchOrigin; |
152 } else if (m_registerableDomain != origin.host() && | 155 } else if (m_registerableDomain != origin.host() && |
153 !IsSubdomainOfHost(origin.host(), m_registerableDomain)) { | 156 !IsSubdomainOfHost(origin.host(), m_registerableDomain)) { |
154 return DoesNotMatchOrigin; | 157 return DoesNotMatchOrigin; |
155 } | 158 } |
156 break; | 159 break; |
157 }; | 160 }; |
158 | 161 |
159 if (m_hostIsPublicSuffix) | 162 if (m_hostIsPublicSuffix) |
160 return MatchesOriginButIsPublicSuffix; | 163 return MatchesOriginButIsPublicSuffix; |
161 | 164 |
162 return MatchesOrigin; | 165 return MatchesOrigin; |
163 } | 166 } |
164 | 167 |
165 } // namespace blink | 168 } // namespace blink |
OLD | NEW |