Source code

Revision control

Copy as Markdown

Other Tools

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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 "CookieLogging.h"
#include "Cookie.h"
#include "nsIConsoleReportCollector.h"
constexpr auto TIME_STRING_LENGTH = 40;
namespace mozilla {
namespace net {
LazyLogModule gCookieLog("cookie");
static const char* SameSiteToString(uint32_t aSameSite) {
switch (aSameSite) {
case nsICookie::SAMESITE_NONE:
return "none";
case nsICookie::SAMESITE_LAX:
return "lax";
case nsICookie::SAMESITE_STRICT:
return "strict";
default:
MOZ_CRASH("Invalid nsICookie sameSite value");
return "";
}
}
// static
void CookieLogging::LogSuccess(bool aSetCookie, nsIURI* aHostURI,
const nsACString& aCookieString, Cookie* aCookie,
bool aReplacing) {
// if logging isn't enabled, return now to save cycles
if (!MOZ_LOG_TEST(gCookieLog, LogLevel::Debug)) {
return;
}
nsAutoCString spec;
if (aHostURI) {
aHostURI->GetAsciiSpec(spec);
}
MOZ_LOG(gCookieLog, LogLevel::Debug,
("===== %s =====\n", aSetCookie ? "COOKIE ACCEPTED" : "COOKIE SENT"));
MOZ_LOG(gCookieLog, LogLevel::Debug, ("request URL: %s\n", spec.get()));
MOZ_LOG(gCookieLog, LogLevel::Debug,
("cookie string: %s\n", aCookieString.BeginReading()));
if (aSetCookie) {
MOZ_LOG(gCookieLog, LogLevel::Debug,
("replaces existing cookie: %s\n", aReplacing ? "true" : "false"));
}
LogCookie(aCookie);
MOZ_LOG(gCookieLog, LogLevel::Debug, ("\n"));
}
// static
void CookieLogging::LogFailure(bool aSetCookie, nsIURI* aHostURI,
const nsACString& aCookieString,
const char* aReason) {
// if logging isn't enabled, return now to save cycles
if (!MOZ_LOG_TEST(gCookieLog, LogLevel::Warning)) {
return;
}
nsAutoCString spec;
if (aHostURI) {
aHostURI->GetAsciiSpec(spec);
}
MOZ_LOG(gCookieLog, LogLevel::Warning,
("===== %s =====\n",
aSetCookie ? "COOKIE NOT ACCEPTED" : "COOKIE NOT SENT"));
MOZ_LOG(gCookieLog, LogLevel::Warning, ("request URL: %s\n", spec.get()));
if (aSetCookie) {
MOZ_LOG(gCookieLog, LogLevel::Warning,
("cookie string: %s\n", aCookieString.BeginReading()));
}
PRExplodedTime explodedTime;
PR_ExplodeTime(PR_Now(), PR_GMTParameters, &explodedTime);
char timeString[TIME_STRING_LENGTH];
PR_FormatTimeUSEnglish(timeString, TIME_STRING_LENGTH, "%c GMT",
&explodedTime);
MOZ_LOG(gCookieLog, LogLevel::Warning, ("current time: %s", timeString));
MOZ_LOG(gCookieLog, LogLevel::Warning, ("rejected because %s\n", aReason));
MOZ_LOG(gCookieLog, LogLevel::Warning, ("\n"));
}
// static
void CookieLogging::LogCookie(Cookie* aCookie) {
PRExplodedTime explodedTime;
PR_ExplodeTime(PR_Now(), PR_GMTParameters, &explodedTime);
char timeString[TIME_STRING_LENGTH];
PR_FormatTimeUSEnglish(timeString, TIME_STRING_LENGTH, "%c GMT",
&explodedTime);
MOZ_LOG(gCookieLog, LogLevel::Debug, ("current time: %s", timeString));
if (aCookie) {
MOZ_LOG(gCookieLog, LogLevel::Debug, ("----------------\n"));
MOZ_LOG(gCookieLog, LogLevel::Debug, ("name: %s\n", aCookie->Name().get()));
MOZ_LOG(gCookieLog, LogLevel::Debug,
("value: %s\n", aCookie->Value().get()));
MOZ_LOG(gCookieLog, LogLevel::Debug,
("%s: %s\n", aCookie->IsDomain() ? "domain" : "host",
aCookie->Host().get()));
MOZ_LOG(gCookieLog, LogLevel::Debug, ("path: %s\n", aCookie->Path().get()));
PR_ExplodeTime(aCookie->Expiry() * int64_t(PR_USEC_PER_SEC),
PR_GMTParameters, &explodedTime);
PR_FormatTimeUSEnglish(timeString, TIME_STRING_LENGTH, "%c GMT",
&explodedTime);
MOZ_LOG(gCookieLog, LogLevel::Debug,
("expires: %s%s", timeString,
aCookie->IsSession() ? " (at end of session)" : ""));
PR_ExplodeTime(aCookie->CreationTime(), PR_GMTParameters, &explodedTime);
PR_FormatTimeUSEnglish(timeString, TIME_STRING_LENGTH, "%c GMT",
&explodedTime);
MOZ_LOG(gCookieLog, LogLevel::Debug, ("created: %s", timeString));
MOZ_LOG(gCookieLog, LogLevel::Debug,
("is secure: %s\n", aCookie->IsSecure() ? "true" : "false"));
MOZ_LOG(gCookieLog, LogLevel::Debug,
("is httpOnly: %s\n", aCookie->IsHttpOnly() ? "true" : "false"));
MOZ_LOG(gCookieLog, LogLevel::Debug,
("sameSite: %s - rawSameSite: %s\n",
SameSiteToString(aCookie->SameSite()),
SameSiteToString(aCookie->RawSameSite())));
MOZ_LOG(
gCookieLog, LogLevel::Debug,
("schemeMap %d (http: %s | https: %s | file: %s)\n",
aCookie->SchemeMap(),
(aCookie->SchemeMap() & nsICookie::SCHEME_HTTP ? "true" : "false"),
(aCookie->SchemeMap() & nsICookie::SCHEME_HTTPS ? "true" : "false"),
(aCookie->SchemeMap() & nsICookie::SCHEME_FILE ? "true" : "false")));
nsAutoCString suffix;
aCookie->OriginAttributesRef().CreateSuffix(suffix);
MOZ_LOG(gCookieLog, LogLevel::Debug,
("origin attributes: %s\n",
suffix.IsEmpty() ? "{empty}" : suffix.get()));
}
}
// static
void CookieLogging::LogEvicted(Cookie* aCookie, const char* details) {
MOZ_LOG(gCookieLog, LogLevel::Debug, ("===== COOKIE EVICTED =====\n"));
MOZ_LOG(gCookieLog, LogLevel::Debug, ("%s\n", details));
LogCookie(aCookie);
MOZ_LOG(gCookieLog, LogLevel::Debug, ("\n"));
}
// static
void CookieLogging::LogMessageToConsole(nsIConsoleReportCollector* aCRC,
nsIURI* aURI, uint32_t aErrorFlags,
const nsACString& aCategory,
const nsACString& aMsg,
const nsTArray<nsString>& aParams) {
if (!aCRC) {
return;
}
nsAutoCString uri;
if (aURI) {
nsresult rv = aURI->GetSpec(uri);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
}
aCRC->AddConsoleReport(aErrorFlags, aCategory,
nsContentUtils::eNECKO_PROPERTIES, uri, 0, 0, aMsg,
aParams);
}
} // namespace net
} // namespace mozilla