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