Allow cookies domain to not start with a dot

* The dot was mandatory in older RFCs, but the new RFC6265 disallow it.
 * Both schemes are used around the web, so we allow them both.

It's possible to login to mail.google.com again.
This commit is contained in:
Adrien Destugues
2013-10-09 15:50:33 +02:00
parent 8ca6eeb77c
commit 0e030f22e1
+19 -7
View File
@@ -195,6 +195,15 @@ BNetworkCookie::SetDomain(const BString& domain)
{
// TODO: canonicalize the domain
fDomain = domain;
// RFC 2109 (legacy) support: domain string may start with a dot,
// meant to indicate the cookie should also be used for subdomains.
// RFC 6265 makes all cookies work for subdomains, unless the domain is
// not specified at all (in this case it has to exactly match the Url of
// the page that set the cookie). In any case, we don't need to handle
// dot-cookies specifically anymore, so just remove the extra dot.
if(fDomain[0] == '.')
fDomain.Remove(0, 1);
fHostOnly = false;
fRawFullCookieValid = false;
@@ -410,13 +419,14 @@ BNetworkCookie::IsValidForDomain(const BString& domain) const
// Here's a list of TLD:
// https://github.com/rsimoes/Mozilla-PublicSuffix/blob/master/effective_tld_names.dat
// Otherwise, the domains must match exactly, or the cookie domain
// must be a suffix starting with a dot.
// FIXME do not do substring matching on IP addresses. The RFCs disallow it.
// Otherwise, the domains must match exactly, or the domain must have a dot
// character just before the common suffix.
const char* suffix = domain.String() + difference;
if (strcmp(suffix, cookieDomain.String()) == 0) {
if (difference == 0 || suffix[0] == '.')
return true;
}
if (strcmp(suffix, cookieDomain.String()) == 0 && (difference == 0
|| domain[difference - 1] == '.'))
return true;
return false;
}
@@ -426,6 +436,7 @@ bool
BNetworkCookie::IsValidForPath(const BString& path) const
{
const BString& cookiePath = Path();
if (path.Length() < cookiePath.Length())
return false;
@@ -438,8 +449,9 @@ BNetworkCookie::IsValidForPath(const BString& path) const
// after the prefix is a slash.
if (path.Length() == cookiePath.Length()
|| cookiePath[cookiePath.Length() - 1] == '/'
|| path[cookiePath.Length()] == '/')
|| path[cookiePath.Length()] == '/') {
return true;
}
return false;
}