// Copyright 2013 The Chromium Authors. All rights reserved. // 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, bool is_cookie_same_party) { UMA_HISTOGRAM_ENUMERATION("Cookie.SameSiteAttributeValue", value); if (is_cookie_same_party) { base::UmaHistogramEnumeration( "Cookie.SamePartyCookieSameSiteAttributeValue", 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::kQuicTransportScheme)) { return CookieSourceSchemeName::kQuicTransportScheme; } 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