diff options
author | droger@google.com <droger@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-17 09:22:03 +0000 |
---|---|---|
committer | droger@google.com <droger@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-17 09:22:03 +0000 |
commit | 2fb376add13b6f658741e804bc226ac87b68698b (patch) | |
tree | 229b69a8ddc07ad0218677b6d3e438347a9633a4 /net/base/cookie_util.cc | |
parent | 0654cc8ef8cd3fa4af7980a899c6ec1e8791d6f2 (diff) | |
download | chromium_src-2fb376add13b6f658741e804bc226ac87b68698b.zip chromium_src-2fb376add13b6f658741e804bc226ac87b68698b.tar.gz chromium_src-2fb376add13b6f658741e804bc226ac87b68698b.tar.bz2 |
Creation of cookie_utils.
BUG=NONE
TEST=NONE
Follow up on:
Review URL: http://codereview.chromium.org/8465022
Then reverted by:
http://codereview.chromium.org/8571008/
Review URL: http://codereview.chromium.org/8468010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110476 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/cookie_util.cc')
-rw-r--r-- | net/base/cookie_util.cc | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/net/base/cookie_util.cc b/net/base/cookie_util.cc new file mode 100644 index 0000000..8d8a0c3 --- /dev/null +++ b/net/base/cookie_util.cc @@ -0,0 +1,79 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/base/cookie_util.h" + +#include "base/logging.h" +#include "googleurl/src/gurl.h" +#include "net/base/net_util.h" +#include "net/base/registry_controlled_domain.h" + +namespace net { +namespace cookie_util { + +bool DomainIsHostOnly(const std::string& domain_string) { + return (domain_string.empty() || domain_string[0] != '.'); +} + +std::string GetEffectiveDomain(const std::string& scheme, + const std::string& host) { + if (scheme == "http" || scheme == "https") + return RegistryControlledDomainService::GetDomainAndRegistry(host); + + if (!DomainIsHostOnly(host)) + return host.substr(1); + return host; +} + +bool GetCookieDomainWithString(const GURL& url, + const std::string& domain_string, + std::string* result) { + const std::string url_host(url.host()); + + // If no domain was specified in the domain string, default to a host cookie. + // We match IE/Firefox in allowing a domain=IPADDR if it matches the url + // ip address hostname exactly. It should be treated as a host cookie. + if (domain_string.empty() || + (url.HostIsIPAddress() && url_host == domain_string)) { + *result = url_host; + DCHECK(DomainIsHostOnly(*result)); + return true; + } + + // Get the normalized domain specified in cookie line. + url_canon::CanonHostInfo ignored; + std::string cookie_domain(CanonicalizeHost(domain_string, &ignored)); + if (cookie_domain.empty()) + return false; + if (cookie_domain[0] != '.') + cookie_domain = "." + cookie_domain; + + // Ensure |url| and |cookie_domain| have the same domain+registry. + const std::string url_scheme(url.scheme()); + const std::string url_domain_and_registry( + GetEffectiveDomain(url_scheme, url_host)); + if (url_domain_and_registry.empty()) + return false; // IP addresses/intranet hosts can't set domain cookies. + const std::string cookie_domain_and_registry( + GetEffectiveDomain(url_scheme, cookie_domain)); + if (url_domain_and_registry != cookie_domain_and_registry) + return false; // Can't set a cookie on a different domain + registry. + + // Ensure |url_host| is |cookie_domain| or one of its subdomains. Given that + // we know the domain+registry are the same from the above checks, this is + // basically a simple string suffix check. + const bool is_suffix = (url_host.length() < cookie_domain.length()) ? + (cookie_domain != ("." + url_host)) : + (url_host.compare(url_host.length() - cookie_domain.length(), + cookie_domain.length(), cookie_domain) != 0); + if (is_suffix) + return false; + + *result = cookie_domain; + return true; +} + +} // namespace cookie_utils +} // namespace net + |