Aric Stewart : wininet: Handle cookie expiration.
Alexandre Julliard
julliard at winehq.org
Wed Feb 18 10:15:41 CST 2009
Module: wine
Branch: master
Commit: e968f099f3d5c995c62af8252d9d38ccd7d8937c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e968f099f3d5c995c62af8252d9d38ccd7d8937c
Author: Aric Stewart <aric at codeweavers.com>
Date: Wed Feb 18 08:32:26 2009 -0600
wininet: Handle cookie expiration.
---
dlls/wininet/cookie.c | 52 ++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 45 insertions(+), 7 deletions(-)
diff --git a/dlls/wininet/cookie.c b/dlls/wininet/cookie.c
index 690cbe9..de2cb50 100644
--- a/dlls/wininet/cookie.c
+++ b/dlls/wininet/cookie.c
@@ -52,7 +52,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(wininet);
* Cookies are currently memory only.
* Cookies are NOT THREAD SAFE
* Cookies could use A LOT OF MEMORY. We need some kind of memory management here!
- * Cookies should care about the expiry time
*/
typedef struct _cookie_domain cookie_domain;
@@ -66,7 +65,7 @@ struct _cookie
LPWSTR lpCookieName;
LPWSTR lpCookieData;
- time_t expiry; /* FIXME: not used */
+ FILETIME expiry;
};
struct _cookie_domain
@@ -80,7 +79,7 @@ struct _cookie_domain
static struct list domain_list = LIST_INIT(domain_list);
-static cookie *COOKIE_addCookie(cookie_domain *domain, LPCWSTR name, LPCWSTR data);
+static cookie *COOKIE_addCookie(cookie_domain *domain, LPCWSTR name, LPCWSTR data, FILETIME expiry);
static cookie *COOKIE_findCookie(cookie_domain *domain, LPCWSTR lpszCookieName);
static void COOKIE_deleteCookie(cookie *deadCookie, BOOL deleteDomain);
static cookie_domain *COOKIE_addDomain(LPCWSTR domain, LPCWSTR path);
@@ -88,13 +87,14 @@ static void COOKIE_deleteDomain(cookie_domain *deadDomain);
/* adds a cookie to the domain */
-static cookie *COOKIE_addCookie(cookie_domain *domain, LPCWSTR name, LPCWSTR data)
+static cookie *COOKIE_addCookie(cookie_domain *domain, LPCWSTR name, LPCWSTR data, FILETIME expiry)
{
cookie *newCookie = HeapAlloc(GetProcessHeap(), 0, sizeof(cookie));
list_init(&newCookie->entry);
newCookie->lpCookieName = NULL;
newCookie->lpCookieData = NULL;
+ newCookie->expiry = expiry;
if (name)
{
@@ -293,6 +293,7 @@ BOOL WINAPI InternetGetCookieW(LPCWSTR lpszUrl, LPCWSTR lpszCookieName,
struct list * cursor;
unsigned int cnt = 0, domain_count = 0, cookie_count = 0;
WCHAR hostName[2048], path[2048];
+ FILETIME tm;
TRACE("(%s, %s, %p, %p)\n", debugstr_w(lpszUrl),debugstr_w(lpszCookieName),
lpCookieData, lpdwSize);
@@ -307,6 +308,8 @@ BOOL WINAPI InternetGetCookieW(LPCWSTR lpszUrl, LPCWSTR lpszCookieName,
ret = COOKIE_crackUrlSimple(lpszUrl, hostName, sizeof(hostName)/sizeof(hostName[0]), path, sizeof(path)/sizeof(path[0]));
if (!ret || !hostName[0]) return FALSE;
+ GetSystemTimeAsFileTime(&tm);
+
LIST_FOR_EACH(cursor, &domain_list)
{
cookie_domain *cookiesDomain = LIST_ENTRY(cursor, cookie_domain, entry);
@@ -319,6 +322,14 @@ BOOL WINAPI InternetGetCookieW(LPCWSTR lpszUrl, LPCWSTR lpszCookieName,
LIST_FOR_EACH(cursor, &cookiesDomain->cookie_list)
{
cookie *thisCookie = LIST_ENTRY(cursor, cookie, entry);
+ /* check for expiry */
+ if ((thisCookie->expiry.dwLowDateTime != 0 || thisCookie->expiry.dwHighDateTime != 0) && CompareFileTime(&tm,&thisCookie->expiry) > 0)
+ {
+ TRACE("Found expired cookie. deleting\n");
+ COOKIE_deleteCookie(thisCookie, FALSE);
+ continue;
+ }
+
if (lpCookieData == NULL) /* return the size of the buffer required to lpdwSize */
{
unsigned int len;
@@ -438,9 +449,12 @@ static BOOL set_cookie(LPCWSTR domain, LPCWSTR path, LPCWSTR cookie_name, LPCWST
struct list *cursor;
LPWSTR data;
WCHAR *ptr;
+ FILETIME expiry;
+ BOOL expired = FALSE;
data = HeapAlloc(GetProcessHeap(),0,(lstrlenW(cookie_data)+1) * sizeof(WCHAR));
strcpyW(data,cookie_data);
+ memset(&expiry,0,sizeof(expiry));
/* lots of informations can be parsed out of the cookie value */
@@ -470,7 +484,23 @@ static BOOL set_cookie(LPCWSTR domain, LPCWSTR path, LPCWSTR cookie_name, LPCWST
TRACE("Parsing new path %s\n",debugstr_w(path));
}
else if (strncmpiW(ptr, szExpires, 8) == 0)
- FIXME("expires not handled (%s)\n",debugstr_w(ptr));
+ {
+ FILETIME ft;
+ SYSTEMTIME st;
+ FIXME("persistent cookies not handled (%s)\n",debugstr_w(ptr));
+ ptr+=strlenW(szExpires);
+ if (InternetTimeToSystemTimeW(ptr, &st, 0))
+ {
+ SystemTimeToFileTime(&st, &expiry);
+ GetSystemTimeAsFileTime(&ft);
+
+ if (CompareFileTime(&ft,&expiry) > 0)
+ {
+ TRACE("Cookie already expired.\n");
+ expired = TRUE;
+ }
+ }
+ }
else if (strncmpiW(ptr, szSecure, 6) == 0)
FIXME("secure not handled (%s)\n",debugstr_w(ptr));
else if (strncmpiW(ptr, szHttpOnly, 8) == 0)
@@ -488,7 +518,15 @@ static BOOL set_cookie(LPCWSTR domain, LPCWSTR path, LPCWSTR cookie_name, LPCWST
}
if (!thisCookieDomain)
- thisCookieDomain = COOKIE_addDomain(domain, path);
+ {
+ if (!expired)
+ thisCookieDomain = COOKIE_addDomain(domain, path);
+ else
+ {
+ HeapFree(GetProcessHeap(),0,data);
+ return TRUE;
+ }
+ }
if ((thisCookie = COOKIE_findCookie(thisCookieDomain, cookie_name)))
COOKIE_deleteCookie(thisCookie, FALSE);
@@ -496,7 +534,7 @@ static BOOL set_cookie(LPCWSTR domain, LPCWSTR path, LPCWSTR cookie_name, LPCWST
TRACE("setting cookie %s=%s for domain %s path %s\n", debugstr_w(cookie_name),
debugstr_w(data), debugstr_w(thisCookieDomain->lpCookieDomain),debugstr_w(thisCookieDomain->lpCookiePath));
- if (!COOKIE_addCookie(thisCookieDomain, cookie_name,data))
+ if (!expired && !COOKIE_addCookie(thisCookieDomain, cookie_name,data, expiry))
{
HeapFree(GetProcessHeap(),0,data);
return FALSE;
More information about the wine-cvs
mailing list