diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/utils.c | 71 | ||||
-rw-r--r-- | utils/utils.h | 1 |
2 files changed, 72 insertions, 0 deletions
diff --git a/utils/utils.c b/utils/utils.c index 260c1f7ea..ecc31f995 100644 --- a/utils/utils.c +++ b/utils/utils.c @@ -15,6 +15,7 @@ #include <uri.h> #include <sys/types.h> #include <regex.h> +#include <time.h> #include "libxml/encoding.h" #include "libxml/uri.h" #ifdef riscos @@ -305,3 +306,73 @@ void regcomp_wrapper(regex_t *preg, const char *regex, int cflags) } } +/** + * Remove expired cookies from the cookie jar. + * libcurl /really/ should do this for us. + * This gets called every time a window is closed or NetSurf is quit. + */ + +void clean_cookiejar(void) { + + FILE *fp; + int len; + char *cookies = 0, *pos; + char domain[256], flag[10], path[256], secure[10], + exp[50], name[256], val[256]; + long int expiry; + + fp = fopen(messages_get("cookiejar"), "r"); + if (!fp) { + LOG(("Failed to open cookie jar")); + return; + } + + /* read file length */ + fseek(fp, 0, SEEK_END); + len = ftell(fp); + fseek(fp, 0, SEEK_SET); + + cookies = xcalloc((unsigned int)len, sizeof(char)); + fread(cookies, (unsigned int)len, sizeof(char), fp); + fclose(fp); + + if (remove(messages_get("cookiejar"))) { + LOG(("Failed to remove old jar")); + xfree(cookies); + return; + } + + fp = fopen(messages_get("cookiejar"), "w+"); + if (!fp) { + xfree(cookies); + LOG(("Failed to create new jar")); + return; + } + /* write header */ + fputs("# Netscape HTTP Cookie File\n" + "# http://www.netscape.com/newsref/std/cookie_spec.html\n" + "# This file was generated by libcurl! Edit at your own risk.\n\n", + fp); + + pos = cookies; + while (pos != (cookies+len-1)) { + if (*pos == '#') { + for (; *pos != '\n'; pos++); + pos += 1; + continue; + } + sscanf(pos, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n", domain, flag, + path, secure, exp, name, val); + pos += (strlen(domain) + strlen(flag) + strlen(path) + + strlen(secure) + strlen(exp) + strlen(name) + + strlen(val) + 7); + sscanf(exp, "%ld", &expiry); + if (time(NULL) < expiry) { /* cookie hasn't expired */ + fprintf(fp, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n", domain, + flag, path, secure, exp, name, val); + } + } + fclose(fp); + + xfree(cookies); +} diff --git a/utils/utils.h b/utils/utils.h index e3a210352..4feeb34a3 100644 --- a/utils/utils.h +++ b/utils/utils.h @@ -30,5 +30,6 @@ char *url_join(char *rel_url, char *base_url); char *get_host_from_url(char* url); bool is_dir(const char *path); void regcomp_wrapper(regex_t *preg, const char *regex, int cflags); +void clean_cookiejar(void); #endif |