OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Portions of this code based on Mozilla: | 5 // Portions of this code based on Mozilla: |
6 // (netwerk/cookie/src/nsCookieService.cpp) | 6 // (netwerk/cookie/src/nsCookieService.cpp) |
7 /* ***** BEGIN LICENSE BLOCK ***** | 7 /* ***** BEGIN LICENSE BLOCK ***** |
8 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 8 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
9 * | 9 * |
10 * The contents of this file are subject to the Mozilla Public License Version | 10 * The contents of this file are subject to the Mozilla Public License Version |
(...skipping 29 matching lines...) Expand all Loading... | |
40 * the provisions above, a recipient may use your version of this file under | 40 * the provisions above, a recipient may use your version of this file under |
41 * the terms of any one of the MPL, the GPL or the LGPL. | 41 * the terms of any one of the MPL, the GPL or the LGPL. |
42 * | 42 * |
43 * ***** END LICENSE BLOCK ***** */ | 43 * ***** END LICENSE BLOCK ***** */ |
44 | 44 |
45 #include "net/cookies/canonical_cookie.h" | 45 #include "net/cookies/canonical_cookie.h" |
46 | 46 |
47 #include "base/basictypes.h" | 47 #include "base/basictypes.h" |
48 #include "base/format_macros.h" | 48 #include "base/format_macros.h" |
49 #include "base/logging.h" | 49 #include "base/logging.h" |
50 #include "base/metrics/histogram_macros.h" | |
50 #include "base/strings/stringprintf.h" | 51 #include "base/strings/stringprintf.h" |
51 #include "net/cookies/cookie_util.h" | 52 #include "net/cookies/cookie_util.h" |
52 #include "net/cookies/parsed_cookie.h" | 53 #include "net/cookies/parsed_cookie.h" |
53 #include "url/gurl.h" | 54 #include "url/gurl.h" |
54 #include "url/url_canon.h" | 55 #include "url/url_canon.h" |
55 | 56 |
56 using base::Time; | 57 using base::Time; |
57 using base::TimeDelta; | 58 using base::TimeDelta; |
58 | 59 |
59 namespace net { | 60 namespace net { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
109 if (diff != 0) | 110 if (diff != 0) |
110 return diff; | 111 return diff; |
111 | 112 |
112 diff = a.Domain().compare(b.Domain()); | 113 diff = a.Domain().compare(b.Domain()); |
113 if (diff != 0) | 114 if (diff != 0) |
114 return diff; | 115 return diff; |
115 | 116 |
116 return a.Path().compare(b.Path()); | 117 return a.Path().compare(b.Path()); |
117 } | 118 } |
118 | 119 |
119 // Returns true if the cookie does not violate any constraints imposed | |
120 // by the cookie name's prefix, as described in | |
121 // https://tools.ietf.org/html/draft-west-cookie-prefixes | |
122 bool IsCookiePrefixValid(const GURL& url, const ParsedCookie& parsed_cookie) { | |
123 const char kSecurePrefix[] = "$Secure-"; | |
124 const char kHostPrefix[] = "$Host-"; | |
125 if (parsed_cookie.Name().find(kSecurePrefix) == 0) | |
126 return parsed_cookie.IsSecure() && url.SchemeIsCryptographic(); | |
127 if (parsed_cookie.Name().find(kHostPrefix) == 0) { | |
128 return parsed_cookie.IsSecure() && url.SchemeIsCryptographic() && | |
129 !parsed_cookie.HasDomain() && parsed_cookie.Path() == "/"; | |
130 } | |
131 return true; | |
132 } | |
133 | |
134 } // namespace | 120 } // namespace |
135 | 121 |
136 CanonicalCookie::CanonicalCookie() | 122 CanonicalCookie::CanonicalCookie() |
137 : secure_(false), | 123 : secure_(false), |
138 httponly_(false) { | 124 httponly_(false) { |
139 } | 125 } |
140 | 126 |
141 CanonicalCookie::CanonicalCookie(const GURL& url, | 127 CanonicalCookie::CanonicalCookie(const GURL& url, |
142 const std::string& name, | 128 const std::string& name, |
143 const std::string& value, | 129 const std::string& value, |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
256 | 242 |
257 std::string cookie_path = CanonicalCookie::CanonPath(url, parsed_cookie); | 243 std::string cookie_path = CanonicalCookie::CanonPath(url, parsed_cookie); |
258 Time server_time(creation_time); | 244 Time server_time(creation_time); |
259 if (options.has_server_time()) | 245 if (options.has_server_time()) |
260 server_time = options.server_time(); | 246 server_time = options.server_time(); |
261 | 247 |
262 Time cookie_expires = CanonicalCookie::CanonExpiration(parsed_cookie, | 248 Time cookie_expires = CanonicalCookie::CanonExpiration(parsed_cookie, |
263 creation_time, | 249 creation_time, |
264 server_time); | 250 server_time); |
265 | 251 |
266 if (options.enforce_prefixes() && !IsCookiePrefixValid(url, parsed_cookie)) { | 252 CookiePrefix prefix = CanonicalCookie::GetCookiePrefix(parsed_cookie.Name()); |
253 bool is_cookie_valid = | |
254 CanonicalCookie::IsCookiePrefixValid(prefix, url, parsed_cookie); | |
255 CanonicalCookie::RecordCookiePrefixMetrics(prefix, is_cookie_valid); | |
256 if (options.enforce_prefixes() && !is_cookie_valid) { | |
267 VLOG(kVlogSetCookies) | 257 VLOG(kVlogSetCookies) |
268 << "Create() failed because the cookie violated prefix rules."; | 258 << "Create() failed because the cookie violated prefix rules."; |
269 return nullptr; | 259 return nullptr; |
270 } | 260 } |
271 | 261 |
272 return new CanonicalCookie( | 262 return new CanonicalCookie( |
273 url, parsed_cookie.Name(), parsed_cookie.Value(), cookie_domain, | 263 url, parsed_cookie.Name(), parsed_cookie.Value(), cookie_domain, |
274 cookie_path, creation_time, cookie_expires, creation_time, | 264 cookie_path, creation_time, cookie_expires, creation_time, |
275 parsed_cookie.IsSecure(), parsed_cookie.IsHttpOnly(), | 265 parsed_cookie.IsSecure(), parsed_cookie.IsHttpOnly(), |
276 parsed_cookie.IsFirstPartyOnly(), parsed_cookie.Priority()); | 266 parsed_cookie.IsFirstPartyOnly(), parsed_cookie.Priority()); |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
462 | 452 |
463 if (IsSecure() != other.IsSecure()) | 453 if (IsSecure() != other.IsSecure()) |
464 return IsSecure(); | 454 return IsSecure(); |
465 | 455 |
466 if (IsHttpOnly() != other.IsHttpOnly()) | 456 if (IsHttpOnly() != other.IsHttpOnly()) |
467 return IsHttpOnly(); | 457 return IsHttpOnly(); |
468 | 458 |
469 return Priority() < other.Priority(); | 459 return Priority() < other.Priority(); |
470 } | 460 } |
471 | 461 |
462 // static | |
463 CanonicalCookie::CookiePrefix CanonicalCookie::GetCookiePrefix( | |
464 const std::string& name) { | |
465 const char kSecurePrefix[] = "$Secure-"; | |
466 const char kHostPrefix[] = "$Host-"; | |
467 if (name.find(kSecurePrefix) == 0) | |
468 return CanonicalCookie::COOKIE_PREFIX_SECURE; | |
469 if (name.find(kHostPrefix) == 0) | |
470 return CanonicalCookie::COOKIE_PREFIX_HOST; | |
471 return CanonicalCookie::COOKIE_PREFIX_NONE; | |
472 } | |
473 | |
474 // static | |
475 void CanonicalCookie::RecordCookiePrefixMetrics( | |
476 CanonicalCookie::CookiePrefix prefix, | |
477 bool is_cookie_valid) { | |
478 const char kCookiePrefixHistogram[] = "Cookie.CookiePrefix"; | |
479 const char kCookiePrefixBlockedHistogram[] = "Cookie.CookiePrefixBlocked"; | |
480 UMA_HISTOGRAM_ENUMERATION(kCookiePrefixHistogram, prefix, | |
481 CanonicalCookie::COOKIE_PREFIX_LAST); | |
482 if (!is_cookie_valid) { | |
483 UMA_HISTOGRAM_ENUMERATION(kCookiePrefixBlockedHistogram, prefix, | |
484 CanonicalCookie::COOKIE_PREFIX_LAST); | |
Mike West
2015/11/20 14:43:58
It might be easier to compare numbers if these wer
estark
2015/11/20 18:19:32
It might be because I started trying to write code
| |
485 } | |
486 } | |
487 | |
488 // Returns true if the cookie does not violate any constraints imposed | |
489 // by the cookie name's prefix, as described in | |
490 // https://tools.ietf.org/html/draft-west-cookie-prefixes | |
491 // | |
492 // static | |
493 bool CanonicalCookie::IsCookiePrefixValid(CanonicalCookie::CookiePrefix prefix, | |
494 const GURL& url, | |
495 const ParsedCookie& parsed_cookie) { | |
496 if (prefix == CanonicalCookie::COOKIE_PREFIX_SECURE) | |
497 return parsed_cookie.IsSecure() && url.SchemeIsCryptographic(); | |
498 if (prefix == CanonicalCookie::COOKIE_PREFIX_HOST) { | |
499 return parsed_cookie.IsSecure() && url.SchemeIsCryptographic() && | |
500 !parsed_cookie.HasDomain() && parsed_cookie.Path() == "/"; | |
501 } | |
502 return true; | |
503 } | |
504 | |
472 } // namespace net | 505 } // namespace net |
OLD | NEW |