Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(131)

Side by Side Diff: net/cookies/canonical_cookie.cc

Issue 876973003: Implement the "first-party-only" cookie flag. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: FirstPartyOnly. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/cookies/canonical_cookie.h ('k') | net/cookies/canonical_cookie_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 return url_path.substr(0, idx); 102 return url_path.substr(0, idx);
103 } 103 }
104 104
105 } // namespace 105 } // namespace
106 106
107 CanonicalCookie::CanonicalCookie() 107 CanonicalCookie::CanonicalCookie()
108 : secure_(false), 108 : secure_(false),
109 httponly_(false) { 109 httponly_(false) {
110 } 110 }
111 111
112 CanonicalCookie::CanonicalCookie( 112 CanonicalCookie::CanonicalCookie(const GURL& url,
113 const GURL& url, const std::string& name, const std::string& value, 113 const std::string& name,
114 const std::string& domain, const std::string& path, 114 const std::string& value,
115 const base::Time& creation, const base::Time& expiration, 115 const std::string& domain,
116 const base::Time& last_access, bool secure, bool httponly, 116 const std::string& path,
117 CookiePriority priority) 117 const base::Time& creation,
118 const base::Time& expiration,
119 const base::Time& last_access,
120 bool secure,
121 bool httponly,
122 bool firstpartyonly,
123 CookiePriority priority)
118 : source_(GetCookieSourceFromURL(url)), 124 : source_(GetCookieSourceFromURL(url)),
119 name_(name), 125 name_(name),
120 value_(value), 126 value_(value),
121 domain_(domain), 127 domain_(domain),
122 path_(path), 128 path_(path),
123 creation_date_(creation), 129 creation_date_(creation),
124 expiry_date_(expiration), 130 expiry_date_(expiration),
125 last_access_date_(last_access), 131 last_access_date_(last_access),
126 secure_(secure), 132 secure_(secure),
127 httponly_(httponly), 133 httponly_(httponly),
134 first_party_only_(firstpartyonly),
128 priority_(priority) { 135 priority_(priority) {
129 } 136 }
130 137
131 CanonicalCookie::CanonicalCookie(const GURL& url, const ParsedCookie& pc) 138 CanonicalCookie::CanonicalCookie(const GURL& url, const ParsedCookie& pc)
132 : source_(GetCookieSourceFromURL(url)), 139 : source_(GetCookieSourceFromURL(url)),
133 name_(pc.Name()), 140 name_(pc.Name()),
134 value_(pc.Value()), 141 value_(pc.Value()),
135 path_(CanonPath(url, pc)), 142 path_(CanonPath(url, pc)),
136 creation_date_(Time::Now()), 143 creation_date_(Time::Now()),
137 last_access_date_(Time()), 144 last_access_date_(Time()),
138 secure_(pc.IsSecure()), 145 secure_(pc.IsSecure()),
139 httponly_(pc.IsHttpOnly()), 146 httponly_(pc.IsHttpOnly()),
147 first_party_only_(pc.IsFirstPartyOnly()),
140 priority_(pc.Priority()) { 148 priority_(pc.Priority()) {
141 if (pc.HasExpires()) 149 if (pc.HasExpires())
142 expiry_date_ = CanonExpiration(pc, creation_date_, creation_date_); 150 expiry_date_ = CanonExpiration(pc, creation_date_, creation_date_);
143 151
144 // Do the best we can with the domain. 152 // Do the best we can with the domain.
145 std::string cookie_domain; 153 std::string cookie_domain;
146 std::string domain_string; 154 std::string domain_string;
147 if (pc.HasDomain()) { 155 if (pc.HasDomain()) {
148 domain_string = pc.Domain(); 156 domain_string = pc.Domain();
149 } 157 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 239
232 std::string cookie_path = CanonicalCookie::CanonPath(url, parsed_cookie); 240 std::string cookie_path = CanonicalCookie::CanonPath(url, parsed_cookie);
233 Time server_time(creation_time); 241 Time server_time(creation_time);
234 if (options.has_server_time()) 242 if (options.has_server_time())
235 server_time = options.server_time(); 243 server_time = options.server_time();
236 244
237 Time cookie_expires = CanonicalCookie::CanonExpiration(parsed_cookie, 245 Time cookie_expires = CanonicalCookie::CanonExpiration(parsed_cookie,
238 creation_time, 246 creation_time,
239 server_time); 247 server_time);
240 248
241 return new CanonicalCookie(url, parsed_cookie.Name(), parsed_cookie.Value(), 249 return new CanonicalCookie(
242 cookie_domain, cookie_path, creation_time, 250 url, parsed_cookie.Name(), parsed_cookie.Value(), cookie_domain,
243 cookie_expires, creation_time, 251 cookie_path, creation_time, cookie_expires, creation_time,
244 parsed_cookie.IsSecure(), 252 parsed_cookie.IsSecure(), parsed_cookie.IsHttpOnly(),
245 parsed_cookie.IsHttpOnly(), 253 parsed_cookie.IsFirstPartyOnly(), parsed_cookie.Priority());
246 parsed_cookie.Priority());
247 } 254 }
248 255
249 CanonicalCookie* CanonicalCookie::Create(const GURL& url, 256 CanonicalCookie* CanonicalCookie::Create(const GURL& url,
250 const std::string& name, 257 const std::string& name,
251 const std::string& value, 258 const std::string& value,
252 const std::string& domain, 259 const std::string& domain,
253 const std::string& path, 260 const std::string& path,
254 const base::Time& creation, 261 const base::Time& creation,
255 const base::Time& expiration, 262 const base::Time& expiration,
256 bool secure, 263 bool secure,
257 bool http_only, 264 bool http_only,
265 bool first_party_only,
258 CookiePriority priority) { 266 CookiePriority priority) {
259 // Expect valid attribute tokens and values, as defined by the ParsedCookie 267 // Expect valid attribute tokens and values, as defined by the ParsedCookie
260 // logic, otherwise don't create the cookie. 268 // logic, otherwise don't create the cookie.
261 std::string parsed_name = ParsedCookie::ParseTokenString(name); 269 std::string parsed_name = ParsedCookie::ParseTokenString(name);
262 if (parsed_name != name) 270 if (parsed_name != name)
263 return NULL; 271 return NULL;
264 std::string parsed_value = ParsedCookie::ParseValueString(value); 272 std::string parsed_value = ParsedCookie::ParseValueString(value);
265 if (parsed_value != value) 273 if (parsed_value != value)
266 return NULL; 274 return NULL;
267 275
(...skipping 18 matching lines...) Expand all
286 url::Component path_component(0, cookie_path.length()); 294 url::Component path_component(0, cookie_path.length());
287 url::RawCanonOutputT<char> canon_path; 295 url::RawCanonOutputT<char> canon_path;
288 url::Component canon_path_component; 296 url::Component canon_path_component;
289 url::CanonicalizePath(cookie_path.data(), path_component, &canon_path, 297 url::CanonicalizePath(cookie_path.data(), path_component, &canon_path,
290 &canon_path_component); 298 &canon_path_component);
291 cookie_path = std::string(canon_path.data() + canon_path_component.begin, 299 cookie_path = std::string(canon_path.data() + canon_path_component.begin,
292 canon_path_component.len); 300 canon_path_component.len);
293 301
294 return new CanonicalCookie(url, parsed_name, parsed_value, cookie_domain, 302 return new CanonicalCookie(url, parsed_name, parsed_value, cookie_domain,
295 cookie_path, creation, expiration, creation, 303 cookie_path, creation, expiration, creation,
296 secure, http_only, priority); 304 secure, http_only, first_party_only, priority);
297 } 305 }
298 306
299 bool CanonicalCookie::IsOnPath(const std::string& url_path) const { 307 bool CanonicalCookie::IsOnPath(const std::string& url_path) const {
300 308
301 // A zero length would be unsafe for our trailing '/' checks, and 309 // A zero length would be unsafe for our trailing '/' checks, and
302 // would also make no sense for our prefix match. The code that 310 // would also make no sense for our prefix match. The code that
303 // creates a CanonicalCookie should make sure the path is never zero length, 311 // creates a CanonicalCookie should make sure the path is never zero length,
304 // but we double check anyway. 312 // but we double check anyway.
305 if (path_.empty()) 313 if (path_.empty())
306 return false; 314 return false;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 if (IsSecure() && !url.SchemeIsSecure()) 383 if (IsSecure() && !url.SchemeIsSecure())
376 return false; 384 return false;
377 // Don't include cookies for requests that don't apply to the cookie domain. 385 // Don't include cookies for requests that don't apply to the cookie domain.
378 if (!IsDomainMatch(url.host())) 386 if (!IsDomainMatch(url.host()))
379 return false; 387 return false;
380 // Don't include cookies for requests with a url path that does not path 388 // Don't include cookies for requests with a url path that does not path
381 // match the cookie-path. 389 // match the cookie-path.
382 if (!IsOnPath(url.path())) 390 if (!IsOnPath(url.path()))
383 return false; 391 return false;
384 392
393 // Include first-party-only cookies iff |options| tells us to include all of
394 // them, or if a first-party URL is set and its origin matches the origin of
395 // |url|.
396 if (IsFirstPartyOnly() && !options.include_first_party_only() &&
397 options.first_party_url().GetOrigin() != url.GetOrigin()) {
398 return false;
399 }
400
385 return true; 401 return true;
386 } 402 }
387 403
388 std::string CanonicalCookie::DebugString() const { 404 std::string CanonicalCookie::DebugString() const {
389 return base::StringPrintf( 405 return base::StringPrintf(
390 "name: %s value: %s domain: %s path: %s creation: %" 406 "name: %s value: %s domain: %s path: %s creation: %"
391 PRId64, 407 PRId64,
392 name_.c_str(), value_.c_str(), 408 name_.c_str(), value_.c_str(),
393 domain_.c_str(), path_.c_str(), 409 domain_.c_str(), path_.c_str(),
394 static_cast<int64>(creation_date_.ToTimeT())); 410 static_cast<int64>(creation_date_.ToTimeT()));
395 } 411 }
396 412
397 CanonicalCookie* CanonicalCookie::Duplicate() const { 413 CanonicalCookie* CanonicalCookie::Duplicate() const {
398 CanonicalCookie* cc = new CanonicalCookie(); 414 CanonicalCookie* cc = new CanonicalCookie();
399 cc->source_ = source_; 415 cc->source_ = source_;
400 cc->name_ = name_; 416 cc->name_ = name_;
401 cc->value_ = value_; 417 cc->value_ = value_;
402 cc->domain_ = domain_; 418 cc->domain_ = domain_;
403 cc->path_ = path_; 419 cc->path_ = path_;
404 cc->creation_date_ = creation_date_; 420 cc->creation_date_ = creation_date_;
405 cc->expiry_date_ = expiry_date_; 421 cc->expiry_date_ = expiry_date_;
406 cc->last_access_date_ = last_access_date_; 422 cc->last_access_date_ = last_access_date_;
407 cc->secure_ = secure_; 423 cc->secure_ = secure_;
408 cc->httponly_ = httponly_; 424 cc->httponly_ = httponly_;
425 cc->first_party_only_ = first_party_only_;
409 cc->priority_ = priority_; 426 cc->priority_ = priority_;
410 return cc; 427 return cc;
411 } 428 }
412 429
413 } // namespace net 430 } // namespace net
OLDNEW
« no previous file with comments | « net/cookies/canonical_cookie.h ('k') | net/cookies/canonical_cookie_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698