1 // Copyright 2013 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/cookies/cookie_constants.h" 6 7 #include "base/metrics/histogram_functions.h" 8 #include "base/metrics/histogram_macros.h" 9 #include "base/notreached.h" 10 #include "base/strings/string_util.h" 11 #include "url/url_constants.h" 12 13 namespace net { 14 15 const base::TimeDelta kLaxAllowUnsafeMaxAge = base::Minutes(2); 16 const base::TimeDelta kShortLaxAllowUnsafeMaxAge = base::Seconds(10); 17 18 namespace { 19 20 const char kPriorityLow[] = "low"; 21 const char kPriorityMedium[] = "medium"; 22 const char kPriorityHigh[] = "high"; 23 24 const char kSameSiteLax[] = "lax"; 25 const char kSameSiteStrict[] = "strict"; 26 const char kSameSiteNone[] = "none"; 27 const char kSameSiteExtended[] = "extended"; 28 const char kSameSiteUnspecified[] = "unspecified"; 29 30 } // namespace 31 CookiePriorityToString(CookiePriority priority)32std::string CookiePriorityToString(CookiePriority priority) { 33 switch(priority) { 34 case COOKIE_PRIORITY_HIGH: 35 return kPriorityHigh; 36 case COOKIE_PRIORITY_MEDIUM: 37 return kPriorityMedium; 38 case COOKIE_PRIORITY_LOW: 39 return kPriorityLow; 40 default: 41 NOTREACHED(); 42 } 43 } 44 StringToCookiePriority(const std::string & priority)45CookiePriority StringToCookiePriority(const std::string& priority) { 46 std::string priority_comp = base::ToLowerASCII(priority); 47 48 if (priority_comp == kPriorityHigh) 49 return COOKIE_PRIORITY_HIGH; 50 if (priority_comp == kPriorityMedium) 51 return COOKIE_PRIORITY_MEDIUM; 52 if (priority_comp == kPriorityLow) 53 return COOKIE_PRIORITY_LOW; 54 55 return COOKIE_PRIORITY_DEFAULT; 56 } 57 CookieSameSiteToString(CookieSameSite same_site)58std::string CookieSameSiteToString(CookieSameSite same_site) { 59 switch (same_site) { 60 case CookieSameSite::LAX_MODE: 61 return kSameSiteLax; 62 case CookieSameSite::STRICT_MODE: 63 return kSameSiteStrict; 64 case CookieSameSite::NO_RESTRICTION: 65 return kSameSiteNone; 66 case CookieSameSite::UNSPECIFIED: 67 return kSameSiteUnspecified; 68 } 69 } 70 StringToCookieSameSite(const std::string & same_site,CookieSameSiteString * samesite_string)71CookieSameSite StringToCookieSameSite(const std::string& same_site, 72 CookieSameSiteString* samesite_string) { 73 // Put a value on the stack so that we can assign to |*samesite_string| 74 // instead of having to null-check it all the time. 75 CookieSameSiteString ignored = CookieSameSiteString::kUnspecified; 76 if (!samesite_string) 77 samesite_string = &ignored; 78 79 *samesite_string = CookieSameSiteString::kUnrecognized; 80 CookieSameSite samesite = CookieSameSite::UNSPECIFIED; 81 82 if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteNone)) { 83 samesite = CookieSameSite::NO_RESTRICTION; 84 *samesite_string = CookieSameSiteString::kNone; 85 } else if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteLax)) { 86 samesite = CookieSameSite::LAX_MODE; 87 *samesite_string = CookieSameSiteString::kLax; 88 } else if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteStrict)) { 89 samesite = CookieSameSite::STRICT_MODE; 90 *samesite_string = CookieSameSiteString::kStrict; 91 } else if (base::EqualsCaseInsensitiveASCII(same_site, kSameSiteExtended)) { 92 // Extended isn't supported anymore -- we just parse it for UMA stats. 93 *samesite_string = CookieSameSiteString::kExtended; 94 } else if (same_site == "") { 95 *samesite_string = CookieSameSiteString::kEmptyString; 96 } 97 return samesite; 98 } 99 RecordCookieSameSiteAttributeValueHistogram(CookieSameSiteString value)100void RecordCookieSameSiteAttributeValueHistogram(CookieSameSiteString value) { 101 UMA_HISTOGRAM_ENUMERATION("Cookie.SameSiteAttributeValue", value); 102 } 103 ReducePortRangeForCookieHistogram(const int port)104CookiePort ReducePortRangeForCookieHistogram(const int port) { 105 switch (port) { 106 case 80: 107 return CookiePort::k80; 108 case 81: 109 return CookiePort::k81; 110 case 82: 111 return CookiePort::k82; 112 case 83: 113 return CookiePort::k83; 114 case 84: 115 return CookiePort::k84; 116 case 85: 117 return CookiePort::k85; 118 case 443: 119 return CookiePort::k443; 120 case 444: 121 return CookiePort::k444; 122 case 445: 123 return CookiePort::k445; 124 case 446: 125 return CookiePort::k446; 126 case 447: 127 return CookiePort::k447; 128 case 448: 129 return CookiePort::k448; 130 case 3000: 131 return CookiePort::k3000; 132 case 3001: 133 return CookiePort::k3001; 134 case 3002: 135 return CookiePort::k3002; 136 case 3003: 137 return CookiePort::k3003; 138 case 3004: 139 return CookiePort::k3004; 140 case 3005: 141 return CookiePort::k3005; 142 case 4200: 143 return CookiePort::k4200; 144 case 4201: 145 return CookiePort::k4201; 146 case 4202: 147 return CookiePort::k4202; 148 case 4203: 149 return CookiePort::k4203; 150 case 4204: 151 return CookiePort::k4204; 152 case 4205: 153 return CookiePort::k4205; 154 case 5000: 155 return CookiePort::k5000; 156 case 5001: 157 return CookiePort::k5001; 158 case 5002: 159 return CookiePort::k5002; 160 case 5003: 161 return CookiePort::k5003; 162 case 5004: 163 return CookiePort::k5004; 164 case 5005: 165 return CookiePort::k5005; 166 case 7000: 167 return CookiePort::k7000; 168 case 7001: 169 return CookiePort::k7001; 170 case 7002: 171 return CookiePort::k7002; 172 case 7003: 173 return CookiePort::k7003; 174 case 7004: 175 return CookiePort::k7004; 176 case 7005: 177 return CookiePort::k7005; 178 case 8000: 179 return CookiePort::k8000; 180 case 8001: 181 return CookiePort::k8001; 182 case 8002: 183 return CookiePort::k8002; 184 case 8003: 185 return CookiePort::k8003; 186 case 8004: 187 return CookiePort::k8004; 188 case 8005: 189 return CookiePort::k8005; 190 case 8080: 191 return CookiePort::k8080; 192 case 8081: 193 return CookiePort::k8081; 194 case 8082: 195 return CookiePort::k8082; 196 case 8083: 197 return CookiePort::k8083; 198 case 8084: 199 return CookiePort::k8084; 200 case 8085: 201 return CookiePort::k8085; 202 case 8090: 203 return CookiePort::k8090; 204 case 8091: 205 return CookiePort::k8091; 206 case 8092: 207 return CookiePort::k8092; 208 case 8093: 209 return CookiePort::k8093; 210 case 8094: 211 return CookiePort::k8094; 212 case 8095: 213 return CookiePort::k8095; 214 case 8100: 215 return CookiePort::k8100; 216 case 8101: 217 return CookiePort::k8101; 218 case 8102: 219 return CookiePort::k8102; 220 case 8103: 221 return CookiePort::k8103; 222 case 8104: 223 return CookiePort::k8104; 224 case 8105: 225 return CookiePort::k8105; 226 case 8200: 227 return CookiePort::k8200; 228 case 8201: 229 return CookiePort::k8201; 230 case 8202: 231 return CookiePort::k8202; 232 case 8203: 233 return CookiePort::k8203; 234 case 8204: 235 return CookiePort::k8204; 236 case 8205: 237 return CookiePort::k8205; 238 case 8443: 239 return CookiePort::k8443; 240 case 8444: 241 return CookiePort::k8444; 242 case 8445: 243 return CookiePort::k8445; 244 case 8446: 245 return CookiePort::k8446; 246 case 8447: 247 return CookiePort::k8447; 248 case 8448: 249 return CookiePort::k8448; 250 case 8888: 251 return CookiePort::k8888; 252 case 8889: 253 return CookiePort::k8889; 254 case 8890: 255 return CookiePort::k8890; 256 case 8891: 257 return CookiePort::k8891; 258 case 8892: 259 return CookiePort::k8892; 260 case 8893: 261 return CookiePort::k8893; 262 case 9000: 263 return CookiePort::k9000; 264 case 9001: 265 return CookiePort::k9001; 266 case 9002: 267 return CookiePort::k9002; 268 case 9003: 269 return CookiePort::k9003; 270 case 9004: 271 return CookiePort::k9004; 272 case 9005: 273 return CookiePort::k9005; 274 case 9090: 275 return CookiePort::k9090; 276 case 9091: 277 return CookiePort::k9091; 278 case 9092: 279 return CookiePort::k9092; 280 case 9093: 281 return CookiePort::k9093; 282 case 9094: 283 return CookiePort::k9094; 284 case 9095: 285 return CookiePort::k9095; 286 default: 287 return CookiePort::kOther; 288 } 289 } 290 GetSchemeNameEnum(const GURL & url)291CookieSourceSchemeName GetSchemeNameEnum(const GURL& url) { 292 // The most likely schemes are first, to improve performance. 293 if (url.SchemeIs(url::kHttpsScheme)) { 294 return CookieSourceSchemeName::kHttpsScheme; 295 } else if (url.SchemeIs(url::kHttpScheme)) { 296 return CookieSourceSchemeName::kHttpScheme; 297 } else if (url.SchemeIs(url::kWssScheme)) { 298 return CookieSourceSchemeName::kWssScheme; 299 } else if (url.SchemeIs(url::kWsScheme)) { 300 return CookieSourceSchemeName::kWsScheme; 301 } else if (url.SchemeIs("chrome-extension")) { 302 return CookieSourceSchemeName::kChromeExtensionScheme; 303 } else if (url.SchemeIs(url::kFileScheme)) { 304 return CookieSourceSchemeName::kFileScheme; 305 } 306 // These all aren't marked as cookieable and so are much less likely to 307 // occur. 308 else if (url.SchemeIs(url::kAboutBlankURL)) { 309 return CookieSourceSchemeName::kAboutBlankURL; 310 } else if (url.SchemeIs(url::kAboutSrcdocURL)) { 311 return CookieSourceSchemeName::kAboutSrcdocURL; 312 } else if (url.SchemeIs(url::kAboutBlankPath)) { 313 return CookieSourceSchemeName::kAboutBlankPath; 314 } else if (url.SchemeIs(url::kAboutSrcdocPath)) { 315 return CookieSourceSchemeName::kAboutSrcdocPath; 316 } else if (url.SchemeIs(url::kAboutScheme)) { 317 return CookieSourceSchemeName::kAboutScheme; 318 } else if (url.SchemeIs(url::kBlobScheme)) { 319 return CookieSourceSchemeName::kBlobScheme; 320 } else if (url.SchemeIs(url::kContentScheme)) { 321 return CookieSourceSchemeName::kContentScheme; 322 } else if (url.SchemeIs(url::kContentIDScheme)) { 323 return CookieSourceSchemeName::kContentIDScheme; 324 } else if (url.SchemeIs(url::kDataScheme)) { 325 return CookieSourceSchemeName::kDataScheme; 326 } else if (url.SchemeIs(url::kFileSystemScheme)) { 327 return CookieSourceSchemeName::kFileSystemScheme; 328 } else if (url.SchemeIs(url::kFtpScheme)) { 329 return CookieSourceSchemeName::kFtpScheme; 330 } else if (url.SchemeIs(url::kJavaScriptScheme)) { 331 return CookieSourceSchemeName::kJavaScriptScheme; 332 } else if (url.SchemeIs(url::kMailToScheme)) { 333 return CookieSourceSchemeName::kMailToScheme; 334 } else if (url.SchemeIs(url::kTelScheme)) { 335 return CookieSourceSchemeName::kTelScheme; 336 } else if (url.SchemeIs(url::kUrnScheme)) { 337 return CookieSourceSchemeName::kUrnScheme; 338 } 339 340 return CookieSourceSchemeName::kOther; 341 } 342 343 const char kEmptyCookiePartitionKey[] = ""; 344 345 } // namespace net 346