From d417133ed24bb7f48ea4f8f8b84deeb8db7ae2eb Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Thu, 23 Jan 2014 17:20:43 +0100 Subject: [PATCH] Fix cookies with far expiration date. Some websites set cookies expiring in the (not so) far future, after year 2038. So, using time_t to store the cookie expiration date won't do. Use the BDateTime class instead. This makes goodsearch.com login work again (#10460). --- headers/private/net/HttpTime.h | 9 +++--- src/kits/network/libnetapi/HttpTime.cpp | 34 ++++++++++++-------- src/kits/network/libnetapi/NetworkCookie.cpp | 6 ++-- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/headers/private/net/HttpTime.h b/headers/private/net/HttpTime.h index cb9527105c..7f622de8b3 100644 --- a/headers/private/net/HttpTime.h +++ b/headers/private/net/HttpTime.h @@ -7,6 +7,7 @@ #include +#include #include namespace BPrivate { @@ -24,21 +25,21 @@ enum { class BHttpTime { public: BHttpTime(); - BHttpTime(time_t date); + BHttpTime(BDateTime date); BHttpTime(const BString& dateString); // Date modification void SetString(const BString& string); - void SetDate(time_t date); + void SetDate(BDateTime date); // Date conversion - time_t Parse(); + BDateTime Parse(); BString ToString(int8 format = B_HTTP_TIME_FORMAT_PARSED); private: BString fDateString; - time_t fDate; + BDateTime fDate; int8 fDateFormat; }; diff --git a/src/kits/network/libnetapi/HttpTime.cpp b/src/kits/network/libnetapi/HttpTime.cpp index ecc9c15155..b3cd5d6e2a 100644 --- a/src/kits/network/libnetapi/HttpTime.cpp +++ b/src/kits/network/libnetapi/HttpTime.cpp @@ -13,9 +13,6 @@ #include -#define PRINT(x) printf x - - static const char* kRfc1123Format = "%a, %d %b %Y %H:%M:%S GMT"; static const char* kCookieFormat = "%a, %d-%b-%Y %H:%M:%S GMT"; static const char* kRfc1036Format = "%A, %d-%b-%y %H:%M:%S GMT"; @@ -33,7 +30,7 @@ BHttpTime::BHttpTime() } -BHttpTime::BHttpTime(time_t date) +BHttpTime::BHttpTime(BDateTime date) : fDate(date), fDateFormat(B_HTTP_TIME_FORMAT_PREFERRED) @@ -61,7 +58,7 @@ BHttpTime::SetString(const BString& string) void -BHttpTime::SetDate(time_t date) +BHttpTime::SetDate(BDateTime date) { fDate = date; } @@ -70,7 +67,7 @@ BHttpTime::SetDate(time_t date) // #pragma mark Date conversion -time_t +BDateTime BHttpTime::Parse() { struct tm expireTime; @@ -109,9 +106,10 @@ BHttpTime::Parse() // since Haiku does not appear to implement timegm(). // Using mktime() doesn't cut it, as cookies set with a date shortly in the // future (eg. 1 hour) would expire immediately. - time_t t = mktime(&expireTime); - t -= mktime(gmtime(&t)) - (int)mktime(localtime(&t)); - return t; + BTime time(expireTime.tm_hour, expireTime.tm_min, expireTime.tm_sec); + BDate date(expireTime.tm_year, expireTime.tm_mon, expireTime.tm_mday); + BDateTime dateTime(date, time); + return dateTime; } @@ -119,7 +117,17 @@ BString BHttpTime::ToString(int8 format) { BString expirationFinal; - struct tm* expirationTm = localtime(&fDate); + struct tm expirationTm; + expirationTm.tm_sec = fDate.Time().Second(); + expirationTm.tm_min = fDate.Time().Minute(); + expirationTm.tm_hour = fDate.Time().Hour(); + expirationTm.tm_mday = fDate.Date().Day(); + expirationTm.tm_mon = fDate.Date().Month(); + expirationTm.tm_year = fDate.Date().Day(); + expirationTm.tm_wday = 0; + expirationTm.tm_yday = 0; + expirationTm.tm_isdst = 0; + char expirationString[kTimetToStringMaxLength + 1]; size_t strLength; @@ -127,17 +135,17 @@ BHttpTime::ToString(int8 format) default: case B_HTTP_TIME_FORMAT_RFC1123: strLength = strftime(expirationString, kTimetToStringMaxLength, - kRfc1123Format, expirationTm); + kRfc1123Format, &expirationTm); break; case B_HTTP_TIME_FORMAT_RFC1036: strLength = strftime(expirationString, kTimetToStringMaxLength, - kRfc1036Format, expirationTm); + kRfc1036Format, &expirationTm); break; case B_HTTP_TIME_FORMAT_ASCTIME: strLength = strftime(expirationString, kTimetToStringMaxLength, - kAscTimeFormat, expirationTm); + kAscTimeFormat, &expirationTm); break; } diff --git a/src/kits/network/libnetapi/NetworkCookie.cpp b/src/kits/network/libnetapi/NetworkCookie.cpp index d3a11724e5..d27b8c2501 100644 --- a/src/kits/network/libnetapi/NetworkCookie.cpp +++ b/src/kits/network/libnetapi/NetworkCookie.cpp @@ -157,8 +157,8 @@ BNetworkCookie::ParseCookieString(const BString& string, const BUrl& url) result = B_BAD_VALUE; continue; } - BHttpTime date(value); - SetExpirationDate(date.Parse()); + BDateTime parsed = BHttpTime(value).Parse(); + SetExpirationDate(parsed); } else if (name.ICompare("domain") == 0) { if (value.IsEmpty()) { result = B_BAD_VALUE; @@ -350,7 +350,7 @@ BNetworkCookie::ExpirationDate() const const BString& BNetworkCookie::ExpirationString() const { - BHttpTime date(ExpirationDate()); + BHttpTime date(fExpiration); if (!fExpirationStringValid) { fExpirationString = date.ToString(BPrivate::B_HTTP_TIME_FORMAT_COOKIE);