| 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 676 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 687  private: | 687  private: | 
| 688   CanonicalCookie cookie_; | 688   CanonicalCookie cookie_; | 
| 689 | 689 | 
| 690   DISALLOW_COPY_AND_ASSIGN(DeleteCanonicalCookieTask); | 690   DISALLOW_COPY_AND_ASSIGN(DeleteCanonicalCookieTask); | 
| 691 }; | 691 }; | 
| 692 | 692 | 
| 693 int CookieMonster::DeleteCanonicalCookieTask::RunDeleteTask() { | 693 int CookieMonster::DeleteCanonicalCookieTask::RunDeleteTask() { | 
| 694   return this->cookie_monster()->DeleteCanonicalCookie(cookie_); | 694   return this->cookie_monster()->DeleteCanonicalCookie(cookie_); | 
| 695 } | 695 } | 
| 696 | 696 | 
|  | 697 // Task class for SetCanonicalCookie call. | 
|  | 698 class CookieMonster::SetCanonicalCookieTask : public CookieMonsterTask { | 
|  | 699  public: | 
|  | 700   SetCanonicalCookieTask(CookieMonster* cookie_monster, | 
|  | 701                          std::unique_ptr<CanonicalCookie> cookie, | 
|  | 702                          bool secure_source, | 
|  | 703                          bool modify_http_only, | 
|  | 704                          const SetCookiesCallback& callback) | 
|  | 705       : CookieMonsterTask(cookie_monster), | 
|  | 706         cookie_(std::move(cookie)), | 
|  | 707         secure_source_(secure_source), | 
|  | 708         modify_http_only_(modify_http_only), | 
|  | 709         callback_(callback) {} | 
|  | 710 | 
|  | 711   // CookieMonsterTask: | 
|  | 712   void Run() override; | 
|  | 713 | 
|  | 714  protected: | 
|  | 715   ~SetCanonicalCookieTask() override {} | 
|  | 716 | 
|  | 717  private: | 
|  | 718   std::unique_ptr<CanonicalCookie> cookie_; | 
|  | 719   bool secure_source_; | 
|  | 720   bool modify_http_only_; | 
|  | 721   SetCookiesCallback callback_; | 
|  | 722 | 
|  | 723   DISALLOW_COPY_AND_ASSIGN(SetCanonicalCookieTask); | 
|  | 724 }; | 
|  | 725 | 
|  | 726 void CookieMonster::SetCanonicalCookieTask::Run() { | 
|  | 727   bool result = this->cookie_monster()->SetCanonicalCookie( | 
|  | 728       std::move(cookie_), secure_source_, modify_http_only_); | 
|  | 729   if (!callback_.is_null()) | 
|  | 730     callback_.Run(result); | 
|  | 731 } | 
|  | 732 | 
| 697 // Task class for SetCookieWithOptions call. | 733 // Task class for SetCookieWithOptions call. | 
| 698 class CookieMonster::SetCookieWithOptionsTask : public CookieMonsterTask { | 734 class CookieMonster::SetCookieWithOptionsTask : public CookieMonsterTask { | 
| 699  public: | 735  public: | 
| 700   SetCookieWithOptionsTask(CookieMonster* cookie_monster, | 736   SetCookieWithOptionsTask(CookieMonster* cookie_monster, | 
| 701                            const GURL& url, | 737                            const GURL& url, | 
| 702                            const std::string& cookie_line, | 738                            const std::string& cookie_line, | 
| 703                            const CookieOptions& options, | 739                            const CookieOptions& options, | 
| 704                            const SetCookiesCallback& callback) | 740                            const SetCookiesCallback& callback) | 
| 705       : CookieMonsterTask(cookie_monster), | 741       : CookieMonsterTask(cookie_monster), | 
| 706         url_(url), | 742         url_(url), | 
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 895     store_->SetForceKeepSessionState(); | 931     store_->SetForceKeepSessionState(); | 
| 896 } | 932 } | 
| 897 | 933 | 
| 898 void CookieMonster::SetAllCookiesAsync(const CookieList& list, | 934 void CookieMonster::SetAllCookiesAsync(const CookieList& list, | 
| 899                                        const SetCookiesCallback& callback) { | 935                                        const SetCookiesCallback& callback) { | 
| 900   scoped_refptr<SetAllCookiesTask> task = | 936   scoped_refptr<SetAllCookiesTask> task = | 
| 901       new SetAllCookiesTask(this, list, callback); | 937       new SetAllCookiesTask(this, list, callback); | 
| 902   DoCookieTask(task); | 938   DoCookieTask(task); | 
| 903 } | 939 } | 
| 904 | 940 | 
|  | 941 void CookieMonster::SetCanonicalCookieAsync( | 
|  | 942     std::unique_ptr<CanonicalCookie> cookie, | 
|  | 943     bool secure_source, | 
|  | 944     bool modify_http_only, | 
|  | 945     const SetCookiesCallback& callback) { | 
|  | 946   DCHECK(cookie->IsCanonical()); | 
|  | 947   scoped_refptr<SetCanonicalCookieTask> task = new SetCanonicalCookieTask( | 
|  | 948       this, std::move(cookie), secure_source, modify_http_only, callback); | 
|  | 949 | 
|  | 950   // TODO(rdsmith): Switch to DoCookieTaskForURL (or the equivalent). | 
|  | 951   // This is tricky because we don't have the scheme in this routine | 
|  | 952   // and DoCookieTaskForURL uses cookie_util::GetEffectiveDomain(scheme, host) | 
|  | 953   // to generate the database key to block behind. | 
|  | 954   DoCookieTask(task); | 
|  | 955 } | 
|  | 956 | 
| 905 void CookieMonster::SetCookieWithOptionsAsync( | 957 void CookieMonster::SetCookieWithOptionsAsync( | 
| 906     const GURL& url, | 958     const GURL& url, | 
| 907     const std::string& cookie_line, | 959     const std::string& cookie_line, | 
| 908     const CookieOptions& options, | 960     const CookieOptions& options, | 
| 909     const SetCookiesCallback& callback) { | 961     const SetCookiesCallback& callback) { | 
| 910   scoped_refptr<SetCookieWithOptionsTask> task = | 962   scoped_refptr<SetCookieWithOptionsTask> task = | 
| 911       new SetCookieWithOptionsTask(this, url, cookie_line, options, callback); | 963       new SetCookieWithOptionsTask(this, url, cookie_line, options, callback); | 
| 912 | 964 | 
| 913   DoCookieTaskForURL(task, url); | 965   DoCookieTaskForURL(task, url); | 
| 914 } | 966 } | 
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1061                                          base::Time last_access_time, | 1113                                          base::Time last_access_time, | 
| 1062                                          bool secure, | 1114                                          bool secure, | 
| 1063                                          bool http_only, | 1115                                          bool http_only, | 
| 1064                                          CookieSameSite same_site, | 1116                                          CookieSameSite same_site, | 
| 1065                                          CookiePriority priority) { | 1117                                          CookiePriority priority) { | 
| 1066   DCHECK(thread_checker_.CalledOnValidThread()); | 1118   DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1067 | 1119 | 
| 1068   if (!HasCookieableScheme(url)) | 1120   if (!HasCookieableScheme(url)) | 
| 1069     return false; | 1121     return false; | 
| 1070 | 1122 | 
| 1071   // TODO(mmenke): This class assumes each cookie to have a unique creation |  | 
| 1072   // time. Allowing the caller to set the creation time violates that |  | 
| 1073   // assumption. Worth fixing? Worth noting that time changes between browser |  | 
| 1074   // restarts can cause the same issue. |  | 
| 1075   base::Time actual_creation_time = creation_time; |  | 
| 1076   if (creation_time.is_null()) { |  | 
| 1077     actual_creation_time = CurrentTime(); |  | 
| 1078     last_time_seen_ = actual_creation_time; |  | 
| 1079   } |  | 
| 1080 |  | 
| 1081   // Validate consistency of passed arguments. | 1123   // Validate consistency of passed arguments. | 
| 1082   if (ParsedCookie::ParseTokenString(name) != name || | 1124   if (ParsedCookie::ParseTokenString(name) != name || | 
| 1083       ParsedCookie::ParseValueString(value) != value || | 1125       ParsedCookie::ParseValueString(value) != value || | 
| 1084       ParsedCookie::ParseValueString(domain) != domain || | 1126       ParsedCookie::ParseValueString(domain) != domain || | 
| 1085       ParsedCookie::ParseValueString(path) != path) { | 1127       ParsedCookie::ParseValueString(path) != path) { | 
| 1086     return false; | 1128     return false; | 
| 1087   } | 1129   } | 
| 1088 | 1130 | 
| 1089   std::string cookie_domain; | 1131   std::string cookie_domain; | 
| 1090   if (!cookie_util::GetCookieDomainWithString(url, domain, &cookie_domain)) | 1132   if (!cookie_util::GetCookieDomainWithString(url, domain, &cookie_domain)) | 
| 1091     return false; | 1133     return false; | 
| 1092 | 1134 | 
| 1093   std::string cookie_path = CanonicalCookie::CanonPathWithString(url, path); | 1135   std::string cookie_path = CanonicalCookie::CanonPathWithString(url, path); | 
| 1094   if (!path.empty() && cookie_path != path) | 1136   if (!path.empty() && cookie_path != path) | 
| 1095     return false; | 1137     return false; | 
| 1096 | 1138 | 
| 1097   // Canonicalize path again to make sure it escapes characters as needed. | 1139   // Canonicalize path again to make sure it escapes characters as needed. | 
| 1098   url::Component path_component(0, cookie_path.length()); | 1140   url::Component path_component(0, cookie_path.length()); | 
| 1099   url::RawCanonOutputT<char> canon_path; | 1141   url::RawCanonOutputT<char> canon_path; | 
| 1100   url::Component canon_path_component; | 1142   url::Component canon_path_component; | 
| 1101   url::CanonicalizePath(cookie_path.data(), path_component, &canon_path, | 1143   url::CanonicalizePath(cookie_path.data(), path_component, &canon_path, | 
| 1102                         &canon_path_component); | 1144                         &canon_path_component); | 
| 1103   cookie_path = std::string(canon_path.data() + canon_path_component.begin, | 1145   cookie_path = std::string(canon_path.data() + canon_path_component.begin, | 
| 1104                             canon_path_component.len); | 1146                             canon_path_component.len); | 
| 1105 | 1147 | 
| 1106   std::unique_ptr<CanonicalCookie> cc(base::MakeUnique<CanonicalCookie>( | 1148   std::unique_ptr<CanonicalCookie> cc(base::MakeUnique<CanonicalCookie>( | 
| 1107       name, value, cookie_domain, cookie_path, actual_creation_time, | 1149       name, value, cookie_domain, cookie_path, creation_time, expiration_time, | 
| 1108       expiration_time, last_access_time, secure, http_only, same_site, | 1150       last_access_time, secure, http_only, same_site, priority)); | 
| 1109       priority)); |  | 
| 1110 | 1151 | 
| 1111   return SetCanonicalCookie(std::move(cc), url.SchemeIsCryptographic(), true); | 1152   return SetCanonicalCookie(std::move(cc), url.SchemeIsCryptographic(), true); | 
| 1112 } | 1153 } | 
| 1113 | 1154 | 
| 1114 CookieList CookieMonster::GetAllCookies() { | 1155 CookieList CookieMonster::GetAllCookies() { | 
| 1115   DCHECK(thread_checker_.CalledOnValidThread()); | 1156   DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1116 | 1157 | 
| 1117   // This function is being called to scrape the cookie list for management UI | 1158   // This function is being called to scrape the cookie list for management UI | 
| 1118   // or similar.  We shouldn't show expired cookies in this list since it will | 1159   // or similar.  We shouldn't show expired cookies in this list since it will | 
| 1119   // just be confusing to users, and this function is called rarely enough (and | 1160   // just be confusing to users, and this function is called rarely enough (and | 
| (...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1759 } | 1800 } | 
| 1760 | 1801 | 
| 1761 bool CookieMonster::SetCanonicalCookie(std::unique_ptr<CanonicalCookie> cc, | 1802 bool CookieMonster::SetCanonicalCookie(std::unique_ptr<CanonicalCookie> cc, | 
| 1762                                        bool secure_source, | 1803                                        bool secure_source, | 
| 1763                                        bool modify_http_only) { | 1804                                        bool modify_http_only) { | 
| 1764   DCHECK(thread_checker_.CalledOnValidThread()); | 1805   DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1765 | 1806 | 
| 1766   if (cc->IsSecure() && !secure_source) | 1807   if (cc->IsSecure() && !secure_source) | 
| 1767     return false; | 1808     return false; | 
| 1768 | 1809 | 
| 1769   Time creation_time = cc->CreationDate(); |  | 
| 1770   const std::string key(GetKey(cc->Domain())); | 1810   const std::string key(GetKey(cc->Domain())); | 
| 1771   bool already_expired = cc->IsExpired(creation_time); | 1811 | 
|  | 1812   // TODO(mmenke): This class assumes each cookie to have a unique creation | 
|  | 1813   // time. Allowing the caller to set the creation time violates that | 
|  | 1814   // assumption. Worth fixing? Worth noting that time changes between browser | 
|  | 1815   // restarts can cause the same issue. | 
|  | 1816   base::Time creation_date = cc->CreationDate(); | 
|  | 1817   if (creation_date.is_null()) { | 
|  | 1818     creation_date = CurrentTime(); | 
|  | 1819     cc->SetCreationDate(creation_date); | 
|  | 1820     last_time_seen_ = creation_date; | 
|  | 1821   } | 
|  | 1822   bool already_expired = cc->IsExpired(creation_date); | 
| 1772 | 1823 | 
| 1773   if (DeleteAnyEquivalentCookie(key, *cc, secure_source, !modify_http_only, | 1824   if (DeleteAnyEquivalentCookie(key, *cc, secure_source, !modify_http_only, | 
| 1774                                 already_expired)) { | 1825                                 already_expired)) { | 
| 1775     std::string error; | 1826     std::string error; | 
| 1776     error = | 1827     error = | 
| 1777         "SetCookie() not clobbering httponly cookie or secure cookie for " | 1828         "SetCookie() not clobbering httponly cookie or secure cookie for " | 
| 1778         "insecure scheme"; | 1829         "insecure scheme"; | 
| 1779 | 1830 | 
| 1780     VLOG(kVlogSetCookies) << error; | 1831     VLOG(kVlogSetCookies) << error; | 
| 1781     return false; | 1832     return false; | 
| 1782   } | 1833   } | 
| 1783 | 1834 | 
| 1784   VLOG(kVlogSetCookies) << "SetCookie() key: " << key | 1835   VLOG(kVlogSetCookies) << "SetCookie() key: " << key | 
| 1785                         << " cc: " << cc->DebugString(); | 1836                         << " cc: " << cc->DebugString(); | 
| 1786 | 1837 | 
| 1787   // Realize that we might be setting an expired cookie, and the only point | 1838   // Realize that we might be setting an expired cookie, and the only point | 
| 1788   // was to delete the cookie which we've already done. | 1839   // was to delete the cookie which we've already done. | 
| 1789   if (!already_expired) { | 1840   if (!already_expired) { | 
| 1790     // See InitializeHistograms() for details. | 1841     // See InitializeHistograms() for details. | 
| 1791     if (cc->IsPersistent()) { | 1842     if (cc->IsPersistent()) { | 
| 1792       histogram_expiration_duration_minutes_->Add( | 1843       histogram_expiration_duration_minutes_->Add( | 
| 1793           (cc->ExpiryDate() - creation_time).InMinutes()); | 1844           (cc->ExpiryDate() - creation_date).InMinutes()); | 
| 1794     } | 1845     } | 
| 1795 | 1846 | 
| 1796     // Histogram the type of scheme used on URLs that set cookies. This | 1847     // Histogram the type of scheme used on URLs that set cookies. This | 
| 1797     // intentionally includes cookies that are set or overwritten by | 1848     // intentionally includes cookies that are set or overwritten by | 
| 1798     // http:// URLs, but not cookies that are cleared by http:// URLs, to | 1849     // http:// URLs, but not cookies that are cleared by http:// URLs, to | 
| 1799     // understand if the former behavior can be deprecated for Secure | 1850     // understand if the former behavior can be deprecated for Secure | 
| 1800     // cookies. | 1851     // cookies. | 
| 1801     CookieSource cookie_source_sample = | 1852     CookieSource cookie_source_sample = | 
| 1802         (secure_source | 1853         (secure_source | 
| 1803              ? (cc->IsSecure() | 1854              ? (cc->IsSecure() | 
| 1804                     ? COOKIE_SOURCE_SECURE_COOKIE_CRYPTOGRAPHIC_SCHEME | 1855                     ? COOKIE_SOURCE_SECURE_COOKIE_CRYPTOGRAPHIC_SCHEME | 
| 1805                     : COOKIE_SOURCE_NONSECURE_COOKIE_CRYPTOGRAPHIC_SCHEME) | 1856                     : COOKIE_SOURCE_NONSECURE_COOKIE_CRYPTOGRAPHIC_SCHEME) | 
| 1806              : (cc->IsSecure() | 1857              : (cc->IsSecure() | 
| 1807                     ? COOKIE_SOURCE_SECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME | 1858                     ? COOKIE_SOURCE_SECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME | 
| 1808                     : COOKIE_SOURCE_NONSECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME)); | 1859                     : COOKIE_SOURCE_NONSECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME)); | 
| 1809     histogram_cookie_source_scheme_->Add(cookie_source_sample); | 1860     histogram_cookie_source_scheme_->Add(cookie_source_sample); | 
| 1810 | 1861 | 
| 1811     InternalInsertCookie(key, std::move(cc), true); | 1862     InternalInsertCookie(key, std::move(cc), true); | 
| 1812   } else { | 1863   } else { | 
| 1813     VLOG(kVlogSetCookies) << "SetCookie() not storing already expired cookie."; | 1864     VLOG(kVlogSetCookies) << "SetCookie() not storing already expired cookie."; | 
| 1814   } | 1865   } | 
| 1815 | 1866 | 
| 1816   // We assume that hopefully setting a cookie will be less common than | 1867   // We assume that hopefully setting a cookie will be less common than | 
| 1817   // querying a cookie.  Since setting a cookie can put us over our limits, | 1868   // querying a cookie.  Since setting a cookie can put us over our limits, | 
| 1818   // make sure that we garbage collect...  We can also make the assumption that | 1869   // make sure that we garbage collect...  We can also make the assumption that | 
| 1819   // if a cookie was set, in the common case it will be used soon after, | 1870   // if a cookie was set, in the common case it will be used soon after, | 
| 1820   // and we will purge the expired cookies in GetCookies(). | 1871   // and we will purge the expired cookies in GetCookies(). | 
| 1821   GarbageCollect(creation_time, key); | 1872   GarbageCollect(creation_date, key); | 
| 1822 | 1873 | 
| 1823   return true; | 1874   return true; | 
| 1824 } | 1875 } | 
| 1825 | 1876 | 
| 1826 bool CookieMonster::SetAllCookies(const CookieList& list) { | 1877 bool CookieMonster::SetAllCookies(const CookieList& list) { | 
| 1827   DCHECK(thread_checker_.CalledOnValidThread()); | 1878   DCHECK(thread_checker_.CalledOnValidThread()); | 
| 1828   for (const auto& cookie : list) { | 1879   for (const auto& cookie : list) { | 
| 1829     const std::string key(GetKey(cookie.Domain())); | 1880     const std::string key(GetKey(cookie.Domain())); | 
| 1830     Time creation_time = cookie.CreationDate(); | 1881     Time creation_time = cookie.CreationDate(); | 
| 1831     bool already_expired = cookie.IsExpired(creation_time); | 1882     bool already_expired = cookie.IsExpired(creation_time); | 
| (...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2443        it != hook_map_.end(); ++it) { | 2494        it != hook_map_.end(); ++it) { | 
| 2444     std::pair<GURL, std::string> key = it->first; | 2495     std::pair<GURL, std::string> key = it->first; | 
| 2445     if (cookie.IncludeForRequestURL(key.first, opts) && | 2496     if (cookie.IncludeForRequestURL(key.first, opts) && | 
| 2446         cookie.Name() == key.second) { | 2497         cookie.Name() == key.second) { | 
| 2447       it->second->Notify(cookie, cause); | 2498       it->second->Notify(cookie, cause); | 
| 2448     } | 2499     } | 
| 2449   } | 2500   } | 
| 2450 } | 2501 } | 
| 2451 | 2502 | 
| 2452 }  // namespace net | 2503 }  // namespace net | 
| OLD | NEW | 
|---|