OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2011 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 "net/base/cookie_utils.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "googleurl/src/gurl.h" |
| 9 #include "net/base/net_util.h" |
| 10 #include "net/base/registry_controlled_domain.h" |
| 11 |
| 12 namespace net { |
| 13 namespace cookie_utils { |
| 14 |
| 15 bool DomainIsHostOnly(const std::string& domain_string) { |
| 16 return (domain_string.empty() || domain_string[0] != '.'); |
| 17 } |
| 18 |
| 19 std::string GetEffectiveDomain(const std::string& scheme, |
| 20 const std::string& host) { |
| 21 if (scheme == "http" || scheme == "https") |
| 22 return RegistryControlledDomainService::GetDomainAndRegistry(host); |
| 23 |
| 24 if (!DomainIsHostOnly(host)) |
| 25 return host.substr(1); |
| 26 return host; |
| 27 } |
| 28 |
| 29 bool GetCookieDomainWithString(const GURL& url, |
| 30 const std::string& domain_string, |
| 31 std::string* result) { |
| 32 const std::string url_host(url.host()); |
| 33 |
| 34 // If no domain was specified in the domain string, default to a host cookie. |
| 35 // We match IE/Firefox in allowing a domain=IPADDR if it matches the url |
| 36 // ip address hostname exactly. It should be treated as a host cookie. |
| 37 if (domain_string.empty() || |
| 38 (url.HostIsIPAddress() && url_host == domain_string)) { |
| 39 *result = url_host; |
| 40 DCHECK(DomainIsHostOnly(*result)); |
| 41 return true; |
| 42 } |
| 43 |
| 44 // Get the normalized domain specified in cookie line. |
| 45 url_canon::CanonHostInfo ignored; |
| 46 std::string cookie_domain(CanonicalizeHost(domain_string, &ignored)); |
| 47 if (cookie_domain.empty()) |
| 48 return false; |
| 49 if (cookie_domain[0] != '.') |
| 50 cookie_domain = "." + cookie_domain; |
| 51 |
| 52 // Ensure |url| and |cookie_domain| have the same domain+registry. |
| 53 const std::string url_scheme(url.scheme()); |
| 54 const std::string url_domain_and_registry( |
| 55 GetEffectiveDomain(url_scheme, url_host)); |
| 56 if (url_domain_and_registry.empty()) |
| 57 return false; // IP addresses/intranet hosts can't set domain cookies. |
| 58 const std::string cookie_domain_and_registry( |
| 59 GetEffectiveDomain(url_scheme, cookie_domain)); |
| 60 if (url_domain_and_registry != cookie_domain_and_registry) |
| 61 return false; // Can't set a cookie on a different domain + registry. |
| 62 |
| 63 // Ensure |url_host| is |cookie_domain| or one of its subdomains. Given that |
| 64 // we know the domain+registry are the same from the above checks, this is |
| 65 // basically a simple string suffix check. |
| 66 const bool is_suffix = (url_host.length() < cookie_domain.length()) ? |
| 67 (cookie_domain != ("." + url_host)) : |
| 68 (url_host.compare(url_host.length() - cookie_domain.length(), |
| 69 cookie_domain.length(), cookie_domain) != 0); |
| 70 if (is_suffix) |
| 71 return false; |
| 72 |
| 73 *result = cookie_domain; |
| 74 return true; |
| 75 } |
| 76 |
| 77 } // namespace cookie_utils |
| 78 } // namespace net |
| 79 |
OLD | NEW |