blob: a55674052422314f3fa9e8d84491bde7fb0ab662 [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// 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#ifndef NET_COOKIES_CANONICAL_COOKIE_H_
6#define NET_COOKIES_CANONICAL_COOKIE_H_
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
Ben Murdocheb525c52013-07-10 11:40:50 +010012#include "base/time/time.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000013#include "net/base/net_export.h"
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010014#include "net/cookies/cookie_constants.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000015#include "net/cookies/cookie_options.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000016
17class GURL;
18
19namespace net {
20
21class ParsedCookie;
22
23class NET_EXPORT CanonicalCookie {
24 public:
25 // These constructors do no validation or canonicalization of their inputs;
26 // the resulting CanonicalCookies should not be relied on to be canonical
27 // unless the caller has done appropriate validation and canonicalization
28 // themselves.
29 CanonicalCookie();
30 CanonicalCookie(const GURL& url,
31 const std::string& name,
32 const std::string& value,
33 const std::string& domain,
34 const std::string& path,
Torne (Richard Coles)58218062012-11-14 11:43:16 +000035 const base::Time& creation,
36 const base::Time& expiration,
37 const base::Time& last_access,
38 bool secure,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010039 bool httponly,
40 CookiePriority priority);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000041
42 // This constructor does canonicalization but not validation.
43 // The result of this constructor should not be relied on in contexts
44 // in which pre-validation of the ParsedCookie has not been done.
45 CanonicalCookie(const GURL& url, const ParsedCookie& pc);
46
47 ~CanonicalCookie();
48
49 // Supports the default copy constructor.
50
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000051 // Creates a new |CanonicalCookie| from the |cookie_line| and the
52 // |creation_time|. Canonicalizes and validates inputs. May return NULL if
53 // an attribut value is invalid.
Torne (Richard Coles)58218062012-11-14 11:43:16 +000054 static CanonicalCookie* Create(const GURL& url,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000055 const std::string& cookie_line,
56 const base::Time& creation_time,
57 const CookieOptions& options);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000058
59 // Creates a canonical cookie from unparsed attribute values.
60 // Canonicalizes and validates inputs. May return NULL if an attribute
61 // value is invalid.
62 static CanonicalCookie* Create(const GURL& url,
63 const std::string& name,
64 const std::string& value,
65 const std::string& domain,
66 const std::string& path,
Torne (Richard Coles)58218062012-11-14 11:43:16 +000067 const base::Time& creation,
68 const base::Time& expiration,
69 bool secure,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010070 bool http_only,
71 CookiePriority priority);
Torne (Richard Coles)58218062012-11-14 11:43:16 +000072
73 const std::string& Source() const { return source_; }
74 const std::string& Name() const { return name_; }
75 const std::string& Value() const { return value_; }
76 const std::string& Domain() const { return domain_; }
77 const std::string& Path() const { return path_; }
Torne (Richard Coles)58218062012-11-14 11:43:16 +000078 const base::Time& CreationDate() const { return creation_date_; }
79 const base::Time& LastAccessDate() const { return last_access_date_; }
80 bool IsPersistent() const { return !expiry_date_.is_null(); }
81 const base::Time& ExpiryDate() const { return expiry_date_; }
82 bool IsSecure() const { return secure_; }
83 bool IsHttpOnly() const { return httponly_; }
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010084 CookiePriority Priority() const { return priority_; }
Torne (Richard Coles)58218062012-11-14 11:43:16 +000085 bool IsDomainCookie() const {
86 return !domain_.empty() && domain_[0] == '.'; }
87 bool IsHostCookie() const { return !IsDomainCookie(); }
88
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010089 bool IsExpired(const base::Time& current) const {
Torne (Richard Coles)58218062012-11-14 11:43:16 +000090 return !expiry_date_.is_null() && current >= expiry_date_;
91 }
92
93 // Are the cookies considered equivalent in the eyes of RFC 2965.
94 // The RFC says that name must match (case-sensitive), domain must
95 // match (case insensitive), and path must match (case sensitive).
96 // For the case insensitive domain compare, we rely on the domain
97 // having been canonicalized (in
98 // GetCookieDomainWithString->CanonicalizeHost).
99 bool IsEquivalent(const CanonicalCookie& ecc) const {
100 // It seems like it would make sense to take secure and httponly into
101 // account, but the RFC doesn't specify this.
102 // NOTE: Keep this logic in-sync with TrimDuplicateCookiesForHost().
103 return (name_ == ecc.Name() && domain_ == ecc.Domain()
104 && path_ == ecc.Path());
105 }
106
107 void SetLastAccessDate(const base::Time& date) {
108 last_access_date_ = date;
109 }
110
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000111 // Returns true if the given |url_path| path-matches the cookie-path as
112 // described in section 5.1.4 in RFC 6265.
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000113 bool IsOnPath(const std::string& url_path) const;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000114
115 // Returns true if the cookie domain matches the given |host| as described in
116 // section 5.1.3 of RFC 6265.
117 bool IsDomainMatch(const std::string& host) const;
118
119 // Returns true if the cookie should be included for the given request |url|.
120 // HTTP only cookies can be filter by using appropriate cookie |options|.
121 // PLEASE NOTE that this method does not check whether a cookie is expired or
122 // not!
123 bool IncludeForRequestURL(const GURL& url,
124 const CookieOptions& options) const;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000125
126 std::string DebugString() const;
127
Torne (Richard Coles)cedac222014-06-03 10:58:34 +0100128 // Returns a duplicate of this cookie.
129 CanonicalCookie* Duplicate();
130
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000131 // Returns the cookie source when cookies are set for |url|. This function
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000132 // is public for unit test purposes only.
133 static std::string GetCookieSourceFromURL(const GURL& url);
134 static std::string CanonPath(const GURL& url, const ParsedCookie& pc);
135 static base::Time CanonExpiration(const ParsedCookie& pc,
136 const base::Time& current,
137 const base::Time& server_time);
138
139 private:
Torne (Richard Coles)cedac222014-06-03 10:58:34 +0100140 // NOTE: When any new members are added below, the implementation of
141 // Duplicate() must be updated to copy the new member accordingly.
142
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000143 // The source member of a canonical cookie is the origin of the URL that tried
144 // to set this cookie, minus the port number if any. This field is not
145 // persistent though; its only used in the in-tab cookies dialog to show the
146 // user the source URL. This is used for both allowed and blocked cookies.
147 // When a CanonicalCookie is constructed from the backing store (common case)
148 // this field will be null. CanonicalCookie consumers should not rely on
149 // this field unless they guarantee that the creator of those
150 // CanonicalCookies properly initialized the field.
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000151 std::string source_;
152 std::string name_;
153 std::string value_;
154 std::string domain_;
155 std::string path_;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000156 base::Time creation_date_;
157 base::Time expiry_date_;
158 base::Time last_access_date_;
159 bool secure_;
160 bool httponly_;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100161 CookiePriority priority_;
Torne (Richard Coles)cedac222014-06-03 10:58:34 +0100162 // NOTE: When any new members are added above this comment, the
163 // implementation of Duplicate() must be updated to copy the new member
164 // accordingly.
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000165};
166
167typedef std::vector<CanonicalCookie> CookieList;
168
169} // namespace net
170
171#endif // NET_COOKIES_CANONICAL_COOKIE_H_