blob: 872f602775b2f3f97353ba91c02927aeb2c0b5f6 [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/cookies/cookie_constants.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/notreached.h"
#include "base/strings/string_util.h"
#include "url/url_constants.h"
namespace net {
const base::TimeDelta kLaxAllowUnsafeMaxAge = base::Minutes(2);
const base::TimeDelta kShortLaxAllowUnsafeMaxAge = base::Seconds(10);
namespace {
const char kPriorityLow[] = "low";
const char kPriorityMedium[] = "medium";
const char kPriorityHigh[] = "high";
const char kSameSiteLax[] = "lax";
const char kSameSiteStrict[] = "strict";
const char kSameSiteNone[] = "none";
const char kSameSiteExtended[] = "extended";
const char kSameSiteUnspecified[] = "unspecified";
} // namespace
std::string CookiePriorityToString(CookiePriority priority) {
switch(priority) {
case COOKIE_PRIORITY_HIGH:
return kPriorityHigh;
case COOKIE_PRIORITY_MEDIUM:
return kPriorityMedium;
case COOKIE_PRIORITY_LOW:
return kPriorityLow;
default:
NOTREACHED();
}
return std::string();
}
CookiePriority StringToCookiePriority(const std::string& priority) {
std::string priority_comp = base::ToLowerASCII(priority);
if (priority_comp == kPriorityHigh)
return COOKIE_PRIORITY_HIGH;
if (priority_comp == kPriorityMedium)
return COOKIE_PRIORITY_MEDIUM;
if (priority_comp == kPriorityLow)
return COOKIE_PRIORITY_LOW;
return COOKIE_PRIORITY_DEFAULT;
}
std::string CookieSameSiteToString(CookieSameSite same_site) {
switch (same_site) {
case CookieSameSite::LAX_MODE:
return kSameSiteLax;
case CookieSameSite::STRICT_MODE:
return kSameSiteStrict;
case CookieSameSite::NO_RESTRICTION:
return kSameSiteNone;
case CookieSameSite::UNSPECIFIED:
return kSameSiteUnspecified;
}
}
CookieSameSite StringToCookieSameSite(const std::string& same_site,
CookieSameSiteString* samesite_string) {
// Put a value on the stack so that we can assign to |*samesite_string|
// instead of having to null-check it all the time.
CookieSameSiteString ignored = CookieSameSiteString::kUnspecified;
if (!samesite_string)
samesite_string = &ignored;
*samesite_string = CookieSameSiteString::kUnrecognized;
CookieSameSite samesite = CookieSameSite::UNSPECIFIED;
if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteNone)) {
samesite = CookieSameSite::NO_RESTRICTION;
*samesite_string = CookieSameSiteString::kNone;
} else if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteLax)) {
samesite = CookieSameSite::LAX_MODE;
*samesite_string = CookieSameSiteString::kLax;
} else if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteStrict)) {
samesite = CookieSameSite::STRICT_MODE;
*samesite_string = CookieSameSiteString::kStrict;
} else if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteExtended)) {
// Extended isn't supported anymore -- we just parse it for UMA stats.
*samesite_string = CookieSameSiteString::kExtended;
} else if (same_site == "") {
*samesite_string = CookieSameSiteString::kEmptyString;
}
return samesite;
}
void RecordCookieSameSiteAttributeValueHistogram(CookieSameSiteString value) {
UMA_HISTOGRAM_ENUMERATION("Cookie.SameSiteAttributeValue", value);
}
CookiePort ReducePortRangeForCookieHistogram(const int port) {
switch (port) {
case 80:
return CookiePort::k80;
case 81:
return CookiePort::k81;
case 82:
return CookiePort::k82;
case 83:
return CookiePort::k83;
case 84:
return CookiePort::k84;
case 85:
return CookiePort::k85;
case 443:
return CookiePort::k443;
case 444:
return CookiePort::k444;
case 445:
return CookiePort::k445;
case 446:
return CookiePort::k446;
case 447:
return CookiePort::k447;
case 448:
return CookiePort::k448;
case 3000:
return CookiePort::k3000;
case 3001:
return CookiePort::k3001;
case 3002:
return CookiePort::k3002;
case 3003:
return CookiePort::k3003;
case 3004:
return CookiePort::k3004;
case 3005:
return CookiePort::k3005;
case 4200:
return CookiePort::k4200;
case 4201:
return CookiePort::k4201;
case 4202:
return CookiePort::k4202;
case 4203:
return CookiePort::k4203;
case 4204:
return CookiePort::k4204;
case 4205:
return CookiePort::k4205;
case 5000:
return CookiePort::k5000;
case 5001:
return CookiePort::k5001;
case 5002:
return CookiePort::k5002;
case 5003:
return CookiePort::k5003;
case 5004:
return CookiePort::k5004;
case 5005:
return CookiePort::k5005;
case 7000:
return CookiePort::k7000;
case 7001:
return CookiePort::k7001;
case 7002:
return CookiePort::k7002;
case 7003:
return CookiePort::k7003;
case 7004:
return CookiePort::k7004;
case 7005:
return CookiePort::k7005;
case 8000:
return CookiePort::k8000;
case 8001:
return CookiePort::k8001;
case 8002:
return CookiePort::k8002;
case 8003:
return CookiePort::k8003;
case 8004:
return CookiePort::k8004;
case 8005:
return CookiePort::k8005;
case 8080:
return CookiePort::k8080;
case 8081:
return CookiePort::k8081;
case 8082:
return CookiePort::k8082;
case 8083:
return CookiePort::k8083;
case 8084:
return CookiePort::k8084;
case 8085:
return CookiePort::k8085;
case 8090:
return CookiePort::k8090;
case 8091:
return CookiePort::k8091;
case 8092:
return CookiePort::k8092;
case 8093:
return CookiePort::k8093;
case 8094:
return CookiePort::k8094;
case 8095:
return CookiePort::k8095;
case 8100:
return CookiePort::k8100;
case 8101:
return CookiePort::k8101;
case 8102:
return CookiePort::k8102;
case 8103:
return CookiePort::k8103;
case 8104:
return CookiePort::k8104;
case 8105:
return CookiePort::k8105;
case 8200:
return CookiePort::k8200;
case 8201:
return CookiePort::k8201;
case 8202:
return CookiePort::k8202;
case 8203:
return CookiePort::k8203;
case 8204:
return CookiePort::k8204;
case 8205:
return CookiePort::k8205;
case 8443:
return CookiePort::k8443;
case 8444:
return CookiePort::k8444;
case 8445:
return CookiePort::k8445;
case 8446:
return CookiePort::k8446;
case 8447:
return CookiePort::k8447;
case 8448:
return CookiePort::k8448;
case 8888:
return CookiePort::k8888;
case 8889:
return CookiePort::k8889;
case 8890:
return CookiePort::k8890;
case 8891:
return CookiePort::k8891;
case 8892:
return CookiePort::k8892;
case 8893:
return CookiePort::k8893;
case 9000:
return CookiePort::k9000;
case 9001:
return CookiePort::k9001;
case 9002:
return CookiePort::k9002;
case 9003:
return CookiePort::k9003;
case 9004:
return CookiePort::k9004;
case 9005:
return CookiePort::k9005;
case 9090:
return CookiePort::k9090;
case 9091:
return CookiePort::k9091;
case 9092:
return CookiePort::k9092;
case 9093:
return CookiePort::k9093;
case 9094:
return CookiePort::k9094;
case 9095:
return CookiePort::k9095;
default:
return CookiePort::kOther;
}
}
CookieSourceSchemeName GetSchemeNameEnum(const GURL& url) {
// The most likely schemes are first, to improve performance.
if (url.SchemeIs(url::kHttpsScheme)) {
return CookieSourceSchemeName::kHttpsScheme;
} else if (url.SchemeIs(url::kHttpScheme)) {
return CookieSourceSchemeName::kHttpScheme;
} else if (url.SchemeIs(url::kWssScheme)) {
return CookieSourceSchemeName::kWssScheme;
} else if (url.SchemeIs(url::kWsScheme)) {
return CookieSourceSchemeName::kWsScheme;
} else if (url.SchemeIs("chrome-extension")) {
return CookieSourceSchemeName::kChromeExtensionScheme;
} else if (url.SchemeIs(url::kFileScheme)) {
return CookieSourceSchemeName::kFileScheme;
}
// These all aren't marked as cookieable and so are much less likely to
// occur.
else if (url.SchemeIs(url::kAboutBlankURL)) {
return CookieSourceSchemeName::kAboutBlankURL;
} else if (url.SchemeIs(url::kAboutSrcdocURL)) {
return CookieSourceSchemeName::kAboutSrcdocURL;
} else if (url.SchemeIs(url::kAboutBlankPath)) {
return CookieSourceSchemeName::kAboutBlankPath;
} else if (url.SchemeIs(url::kAboutSrcdocPath)) {
return CookieSourceSchemeName::kAboutSrcdocPath;
} else if (url.SchemeIs(url::kAboutScheme)) {
return CookieSourceSchemeName::kAboutScheme;
} else if (url.SchemeIs(url::kBlobScheme)) {
return CookieSourceSchemeName::kBlobScheme;
} else if (url.SchemeIs(url::kContentScheme)) {
return CookieSourceSchemeName::kContentScheme;
} else if (url.SchemeIs(url::kContentIDScheme)) {
return CookieSourceSchemeName::kContentIDScheme;
} else if (url.SchemeIs(url::kDataScheme)) {
return CookieSourceSchemeName::kDataScheme;
} else if (url.SchemeIs(url::kFileSystemScheme)) {
return CookieSourceSchemeName::kFileSystemScheme;
} else if (url.SchemeIs(url::kFtpScheme)) {
return CookieSourceSchemeName::kFtpScheme;
} else if (url.SchemeIs(url::kJavaScriptScheme)) {
return CookieSourceSchemeName::kJavaScriptScheme;
} else if (url.SchemeIs(url::kMailToScheme)) {
return CookieSourceSchemeName::kMailToScheme;
} else if (url.SchemeIs(url::kTelScheme)) {
return CookieSourceSchemeName::kTelScheme;
} else if (url.SchemeIs(url::kUrnScheme)) {
return CookieSourceSchemeName::kUrnScheme;
}
return CookieSourceSchemeName::kOther;
}
const char kEmptyCookiePartitionKey[] = "";
} // namespace net