diff options
Diffstat (limited to 'toolkit/components/cookiebanners/nsCookieRule.cpp')
-rw-r--r-- | toolkit/components/cookiebanners/nsCookieRule.cpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/toolkit/components/cookiebanners/nsCookieRule.cpp b/toolkit/components/cookiebanners/nsCookieRule.cpp new file mode 100644 index 0000000000..310a9f3906 --- /dev/null +++ b/toolkit/components/cookiebanners/nsCookieRule.cpp @@ -0,0 +1,101 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsCookieRule.h" + +#include "mozilla/OriginAttributes.h" +#include "nsICookie.h" +#include "nsString.h" +#include "nsCOMPtr.h" +#include "Cookie.h" +#include "prtime.h" +#include "mozilla/StaticPrefs_cookiebanners.h" + +namespace mozilla { + +NS_IMPL_ISUPPORTS(nsCookieRule, nsICookieRule) + +nsCookieRule::nsCookieRule(bool aIsOptOut, const nsACString& aName, + const nsACString& aValue, const nsACString& aHost, + const nsACString& aPath, int64_t aExpiryRelative, + const nsACString& aUnsetValue, bool aIsSecure, + bool aIsHttpOnly, bool aIsSession, int32_t aSameSite, + nsICookie::schemeType aSchemeMap) { + mExpiryRelative = aExpiryRelative; + mUnsetValue = aUnsetValue; + + net::CookieStruct cookieData(nsCString(aName), nsCString(aValue), + nsCString(aHost), nsCString(aPath), 0, 0, 0, + aIsHttpOnly, aIsSession, aIsSecure, false, + aSameSite, aSameSite, aSchemeMap); + + OriginAttributes attrs; + mCookie = net::Cookie::Create(cookieData, attrs); +} + +nsCookieRule::nsCookieRule(const nsCookieRule& aRule) { + mCookie = aRule.mCookie->AsCookie().Clone(); + mExpiryRelative = aRule.mExpiryRelative; + mUnsetValue = aRule.mUnsetValue; +} + +/* readonly attribute int64_t expiryRelative; */ +NS_IMETHODIMP nsCookieRule::GetExpiryRelative(int64_t* aExpiryRelative) { + NS_ENSURE_ARG_POINTER(aExpiryRelative); + + *aExpiryRelative = mExpiryRelative; + + return NS_OK; +} + +/* readonly attribute AUTF8String unsetValue; */ +NS_IMETHODIMP nsCookieRule::GetUnsetValue(nsACString& aUnsetValue) { + aUnsetValue = mUnsetValue; + + return NS_OK; +} + +NS_IMETHODIMP nsCookieRule::CopyForDomain(const nsACString& aDomain, + nsICookieRule** aRule) { + NS_ENSURE_TRUE(mCookie, NS_ERROR_FAILURE); + NS_ENSURE_ARG_POINTER(aRule); + NS_ENSURE_TRUE(!aDomain.IsEmpty(), NS_ERROR_FAILURE); + + // Create a copy of the rule + cookie so we can modify the host. + RefPtr<nsCookieRule> ruleCopy = new nsCookieRule(*this); + RefPtr<net::Cookie> cookie = ruleCopy->mCookie; + + // Only set the host if it's unset. + if (!cookie->Host().IsEmpty()) { + ruleCopy.forget(aRule); + return NS_OK; + } + + nsAutoCString host("."); + host.Append(aDomain); + cookie->SetHost(host); + + ruleCopy.forget(aRule); + return NS_OK; +} + +/* readonly attribute nsICookie cookie; */ +NS_IMETHODIMP nsCookieRule::GetCookie(nsICookie** aCookie) { + NS_ENSURE_ARG_POINTER(aCookie); + + // Copy cookie and update expiry, creation and last accessed time. + RefPtr<net::Cookie> cookieNative = mCookie->Clone(); + + int64_t currentTimeInUsec = PR_Now(); + cookieNative->SetCreationTime( + net::Cookie::GenerateUniqueCreationTime(currentTimeInUsec)); + cookieNative->SetLastAccessed(currentTimeInUsec); + cookieNative->SetExpiry((currentTimeInUsec / PR_USEC_PER_SEC) + + mExpiryRelative); + + cookieNative.forget(aCookie); + return NS_OK; +} + +} // namespace mozilla |