Cookie.h (6404B)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef mozilla_net_Cookie_h 7 #define mozilla_net_Cookie_h 8 9 #include "nsICookie.h" 10 #include "nsIMemoryReporter.h" 11 #include "nsString.h" 12 13 #include "mozilla/MemoryReporting.h" 14 #include "mozilla/BasePrincipal.h" 15 #include "mozilla/net/NeckoChannelParams.h" 16 #include "nsIMemoryReporter.h" 17 18 using mozilla::OriginAttributes; 19 20 namespace mozilla { 21 namespace net { 22 23 /** 24 * The Cookie class is the main cookie storage medium for use within cookie 25 * code. 26 */ 27 28 /****************************************************************************** 29 * Cookie: 30 * implementation 31 ******************************************************************************/ 32 33 class Cookie final : public nsICookie { 34 MOZ_DEFINE_MALLOC_SIZE_OF(MallocSizeOf) 35 36 public: 37 // nsISupports 38 NS_DECL_ISUPPORTS 39 NS_DECL_NSICOOKIE 40 41 static Cookie* Cast(nsICookie* aCookie) { 42 return static_cast<Cookie*>(aCookie); 43 } 44 45 static const Cookie* Cast(const nsICookie* aCookie) { 46 return static_cast<const Cookie*>(aCookie); 47 } 48 49 private: 50 // for internal use only. see Cookie::Create(). 51 Cookie(const CookieStruct& aCookieData, 52 const OriginAttributes& aOriginAttributes) 53 : mData(aCookieData), mOriginAttributes(aOriginAttributes) {} 54 55 static already_AddRefed<Cookie> FromCookieStruct( 56 const CookieStruct& aCookieData, 57 const OriginAttributes& aOriginAttributes); 58 59 public: 60 // Generate a unique and monotonically increasing creation time. See comment 61 // in Cookie.cpp. 62 static int64_t GenerateUniqueCreationTimeInUSec(int64_t aCreationTimeInUSec); 63 64 // public helper to create an Cookie object. 65 static already_AddRefed<Cookie> Create( 66 const CookieStruct& aCookieData, 67 const OriginAttributes& aOriginAttributes); 68 69 // Same as Cookie::Create but fixes the last accessed and creation time 70 // attributes if they are set in the future. Should only get called from 71 // CookiePersistentStorage::InitDBConn 72 static already_AddRefed<Cookie> CreateValidated( 73 const CookieStruct& aCookieData, 74 const OriginAttributes& aOriginAttributes); 75 76 size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const; 77 78 // fast (inline, non-xpcom) getters 79 inline const nsCString& Name() const { return mData.name(); } 80 inline const nsCString& Value() const { return mData.value(); } 81 inline const nsCString& Host() const { return mData.host(); } 82 inline nsDependentCSubstring RawHost() const { 83 return nsDependentCSubstring(mData.host(), IsDomain() ? 1 : 0); 84 } 85 inline const nsCString& Path() const { return mData.path(); } 86 inline int64_t ExpiryInMSec() const { return mData.expiryInMSec(); } 87 inline int64_t LastAccessedInUSec() const { 88 return mData.lastAccessedInUSec(); 89 } 90 inline int64_t CreationTimeInUSec() const { 91 return mData.creationTimeInUSec(); 92 } 93 inline int64_t UpdateTimeInUSec() const { return mData.updateTimeInUSec(); } 94 inline bool IsSession() const { return mData.isSession(); } 95 inline bool IsDomain() const { return *mData.host().get() == '.'; } 96 inline bool IsSecure() const { return mData.isSecure(); } 97 inline bool IsHttpOnly() const { return mData.isHttpOnly(); } 98 inline bool IsPartitioned() const { 99 return !mOriginAttributes.mPartitionKey.IsEmpty(); 100 } 101 inline bool RawIsPartitioned() const { return mData.isPartitioned(); } 102 inline const OriginAttributes& OriginAttributesRef() const { 103 return mOriginAttributes; 104 } 105 inline int32_t SameSite() const { return mData.sameSite(); } 106 inline uint8_t SchemeMap() const { return mData.schemeMap(); } 107 108 // setters 109 inline void SetExpiryInMSec(int64_t aExpiryInMSec) { 110 mData.expiryInMSec() = aExpiryInMSec; 111 } 112 inline void SetLastAccessedInUSec(int64_t aTimeInUSec) { 113 mData.lastAccessedInUSec() = aTimeInUSec; 114 } 115 inline void SetIsSession(bool aIsSession) { mData.isSession() = aIsSession; } 116 inline bool SetIsHttpOnly(bool aIsHttpOnly) { 117 return mData.isHttpOnly() = aIsHttpOnly; 118 } 119 // Set the creation time manually, overriding the monotonicity checks in 120 // Create(). Use with caution! 121 inline void SetCreationTimeInUSec(int64_t aTimeInUSec) { 122 mData.creationTimeInUSec() = aTimeInUSec; 123 } 124 inline void SetUpdateTimeInUSec(int64_t aTimeInUSec) { 125 mData.updateTimeInUSec() = aTimeInUSec; 126 } 127 inline void SetSchemeMap(uint8_t aSchemeMap) { 128 mData.schemeMap() = aSchemeMap; 129 } 130 inline void SetSameSite(int32_t aSameSite) { mData.sameSite() = aSameSite; } 131 inline void SetHost(const nsACString& aHost) { mData.host() = aHost; } 132 133 uint32_t NameAndValueBytes() { 134 return mData.name().Length() + mData.value().Length(); 135 } 136 137 bool IsStale() const; 138 139 const CookieStruct& ToIPC() const { return mData; } 140 141 already_AddRefed<Cookie> Clone() const; 142 143 protected: 144 virtual ~Cookie() = default; 145 146 private: 147 // member variables 148 // 149 // Please update SizeOfIncludingThis if this strategy changes. 150 CookieStruct mData; 151 OriginAttributes mOriginAttributes; 152 }; 153 154 // Comparator class for sorting cookies before sending to a server. 155 class CompareCookiesForSending { 156 public: 157 bool Equals(const nsICookie* aCookie1, const nsICookie* aCookie2) const { 158 return Cookie::Cast(aCookie1)->CreationTimeInUSec() == 159 Cookie::Cast(aCookie2)->CreationTimeInUSec() && 160 Cookie::Cast(aCookie2)->Path().Length() == 161 Cookie::Cast(aCookie1)->Path().Length(); 162 } 163 164 bool LessThan(const nsICookie* aCookie1, const nsICookie* aCookie2) const { 165 // compare by cookie path length in accordance with RFC2109 166 int32_t result = Cookie::Cast(aCookie2)->Path().Length() - 167 Cookie::Cast(aCookie1)->Path().Length(); 168 if (result != 0) return result < 0; 169 170 // when path lengths match, older cookies should be listed first. this is 171 // required for backwards compatibility since some websites erroneously 172 // depend on receiving cookies in the order in which they were sent to the 173 // browser! see bug 236772. 174 return Cookie::Cast(aCookie1)->CreationTimeInUSec() < 175 Cookie::Cast(aCookie2)->CreationTimeInUSec(); 176 } 177 }; 178 179 } // namespace net 180 } // namespace mozilla 181 182 #endif // mozilla_net_Cookie_h