static void delete_cookie (const char *filename, SoupCookie *cookie) { char *contents = NULL, *line, *p; gsize length = 0; FILE *f; SoupCookie *c; time_t now = time (NULL); if (!g_file_get_contents (filename, &contents, &length, NULL)) return; f = fopen (filename, "w"); if (!f) { g_free (contents); return; } line = contents; for (p = contents; *p; p++) { /* \r\n comes out as an extra empty line and gets ignored */ if (*p == '\r' || *p == '\n') { *p = '\0'; c = parse_cookie (line, now); line = p + 1; if (!c) continue; if (!soup_cookie_equal (cookie, c)) write_cookie (f, c); soup_cookie_free (c); } } c = parse_cookie (line, now); if (c) { if (!soup_cookie_equal (cookie, c)) write_cookie (f, c); soup_cookie_free (c); } g_free (contents); fclose (f); }
static gboolean katze_http_cookies_update_jar (KatzeHttpCookies* http_cookies) { gint fn = 0; FILE* f = NULL; gchar* temporary_filename = NULL; GSList* cookies; http_cookies->timeout = 0; temporary_filename = g_strconcat (http_cookies->filename, ".XXXXXX", NULL); if ((fn = g_mkstemp (temporary_filename)) == -1) goto failed; if (!((f = fdopen (fn, "wb")))) goto failed; cookies = soup_cookie_jar_all_cookies (http_cookies->jar); for (; cookies != NULL; cookies = g_slist_next (cookies)) { SoupCookie* cookie = cookies->data; if (cookie->expires && !soup_date_is_past (cookie->expires)) write_cookie (f, cookie); soup_cookie_free (cookie); } g_slist_free (cookies); if (fclose (f) != 0) { f = NULL; goto failed; } f = NULL; if (g_rename (temporary_filename, http_cookies->filename) == -1) goto failed; g_free (temporary_filename); if (g_getenv ("MIDORI_COOKIES_DEBUG") != NULL) { g_print ("KatzeHttpCookies: %d cookies changed\n", http_cookies->counter); http_cookies->counter = 0; } return FALSE; failed: if (f) fclose (f); g_unlink (temporary_filename); g_free (temporary_filename); if (g_getenv ("MIDORI_COOKIES_DEBUG") != NULL) g_print ("KatzeHttpCookies: Failed to write '%s'\n", http_cookies->filename); return FALSE; }
/** write_cookies writes all the valid cookies in the array, up to the maximum Returns 0 - (number of cookies not written) */ int write_cookies(const int fd, cookie c[], int max) { int i, n, total = 0; write(fd, "Cookie: ", 8); for(i = max; i-- ; ) { total += (n = write_cookie(fd, &c[i])); if(n != -1) write(fd, "; ", 2); } write(fd, "\r\n", 2); return total; }
static void soup_cookie_jar_text_changed (SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) { FILE *out; SoupCookieJarTextPrivate *priv = SOUP_COOKIE_JAR_TEXT_GET_PRIVATE (jar); /* We can sort of ignore the semantics of the 'changed' * signal here and simply delete the old cookie if present * and write the new cookie if present. That will do the * right thing for all 'added', 'deleted' and 'modified' * meanings. */ /* Also, delete_cookie takes the filename and write_cookie * a FILE pointer. Seems more convenient that way considering * the implementations of the functions */ if (old_cookie) delete_cookie (priv->filename, old_cookie); if (new_cookie) { gboolean write_header = FALSE; if (!g_file_test (priv->filename, G_FILE_TEST_EXISTS)) write_header = TRUE; out = fopen (priv->filename, "a"); if (!out) { /* FIXME: error? */ return; } if (write_header) { fprintf (out, "# HTTP Cookie File\n"); fprintf (out, "# http://www.netscape.com/newsref/std/cookie_spec.html\n"); fprintf (out, "# This is a generated file! Do not edit.\n"); fprintf (out, "# To delete cookies, use the Cookie Manager.\n\n"); } if (new_cookie->expires) write_cookie (out, new_cookie); if (fclose (out) != 0) { /* FIXME: error? */ return; } } }