summaryrefslogtreecommitdiff
path: root/utils/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/utils.c')
-rw-r--r--utils/utils.c71
1 files changed, 71 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);
+}