• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)32 std::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)45 CookiePriority 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)58 std::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)71 CookieSameSite 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)100 void RecordCookieSameSiteAttributeValueHistogram(CookieSameSiteString value) {
101   UMA_HISTOGRAM_ENUMERATION("Cookie.SameSiteAttributeValue", value);
102 }
103 
ReducePortRangeForCookieHistogram(const int port)104 CookiePort 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)291 CookieSourceSchemeName 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