|
Packit Service |
ca3877 |
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
|
Packit Service |
ca3877 |
/*
|
|
Packit Service |
ca3877 |
* soup-cookie-jar.c
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Copyright (C) 2008 Red Hat, Inc.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
ca3877 |
#include <config.h>
|
|
Packit Service |
ca3877 |
#endif
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#include <string.h>
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#include "soup-cookie-jar.h"
|
|
Packit Service |
ca3877 |
#include "soup-misc-private.h"
|
|
Packit Service |
ca3877 |
#include "soup.h"
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SECTION:soup-cookie-jar
|
|
Packit Service |
ca3877 |
* @short_description: Automatic cookie handling for SoupSession
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* A #SoupCookieJar stores #SoupCookies and arrange for them
|
|
Packit Service |
ca3877 |
* to be sent with the appropriate #SoupMessages.
|
|
Packit Service |
ca3877 |
* #SoupCookieJar implements #SoupSessionFeature, so you can add a
|
|
Packit Service |
ca3877 |
* cookie jar to a session with soup_session_add_feature() or
|
|
Packit Service |
ca3877 |
* soup_session_add_feature_by_type().
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Note that the base #SoupCookieJar class does not support any form
|
|
Packit Service |
ca3877 |
* of long-term cookie persistence.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
enum {
|
|
Packit Service |
ca3877 |
CHANGED,
|
|
Packit Service |
ca3877 |
LAST_SIGNAL
|
|
Packit Service |
ca3877 |
};
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static guint signals[LAST_SIGNAL] = { 0 };
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
enum {
|
|
Packit Service |
ca3877 |
PROP_0,
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
PROP_READ_ONLY,
|
|
Packit Service |
ca3877 |
PROP_ACCEPT_POLICY,
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
LAST_PROP
|
|
Packit Service |
ca3877 |
};
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
typedef struct {
|
|
Packit Service |
ca3877 |
gboolean constructed, read_only;
|
|
Packit Service |
ca3877 |
GHashTable *domains, *serials;
|
|
Packit Service |
ca3877 |
guint serial;
|
|
Packit Service |
ca3877 |
SoupCookieJarAcceptPolicy accept_policy;
|
|
Packit Service |
ca3877 |
} SoupCookieJarPrivate;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void soup_cookie_jar_session_feature_init (SoupSessionFeatureInterface *feature_interface, gpointer interface_data);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
G_DEFINE_TYPE_WITH_CODE (SoupCookieJar, soup_cookie_jar, G_TYPE_OBJECT,
|
|
Packit Service |
ca3877 |
G_ADD_PRIVATE (SoupCookieJar)
|
|
Packit Service |
ca3877 |
G_IMPLEMENT_INTERFACE (SOUP_TYPE_SESSION_FEATURE,
|
|
Packit Service |
ca3877 |
soup_cookie_jar_session_feature_init))
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_init (SoupCookieJar *jar)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv = soup_cookie_jar_get_instance_private (jar);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
priv->domains = g_hash_table_new_full (soup_str_case_hash,
|
|
Packit Service |
ca3877 |
soup_str_case_equal,
|
|
Packit Service |
ca3877 |
g_free, NULL);
|
|
Packit Service |
ca3877 |
priv->serials = g_hash_table_new (NULL, NULL);
|
|
Packit Service |
ca3877 |
priv->accept_policy = SOUP_COOKIE_JAR_ACCEPT_ALWAYS;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_constructed (GObject *object)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv =
|
|
Packit Service |
ca3877 |
soup_cookie_jar_get_instance_private (SOUP_COOKIE_JAR (object));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
priv->constructed = TRUE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_finalize (GObject *object)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv =
|
|
Packit Service |
ca3877 |
soup_cookie_jar_get_instance_private (SOUP_COOKIE_JAR (object));
|
|
Packit Service |
ca3877 |
GHashTableIter iter;
|
|
Packit Service |
ca3877 |
gpointer key, value;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_hash_table_iter_init (&iter, priv->domains);
|
|
Packit Service |
ca3877 |
while (g_hash_table_iter_next (&iter, &key, &value))
|
|
Packit Service |
ca3877 |
soup_cookies_free (value);
|
|
Packit Service |
ca3877 |
g_hash_table_destroy (priv->domains);
|
|
Packit Service |
ca3877 |
g_hash_table_destroy (priv->serials);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
G_OBJECT_CLASS (soup_cookie_jar_parent_class)->finalize (object);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_set_property (GObject *object, guint prop_id,
|
|
Packit Service |
ca3877 |
const GValue *value, GParamSpec *pspec)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv =
|
|
Packit Service |
ca3877 |
soup_cookie_jar_get_instance_private (SOUP_COOKIE_JAR (object));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
switch (prop_id) {
|
|
Packit Service |
ca3877 |
case PROP_READ_ONLY:
|
|
Packit Service |
ca3877 |
priv->read_only = g_value_get_boolean (value);
|
|
Packit Service |
ca3877 |
break;
|
|
Packit Service |
ca3877 |
case PROP_ACCEPT_POLICY:
|
|
Packit Service |
ca3877 |
priv->accept_policy = g_value_get_enum (value);
|
|
Packit Service |
ca3877 |
break;
|
|
Packit Service |
ca3877 |
default:
|
|
Packit Service |
ca3877 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit Service |
ca3877 |
break;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_get_property (GObject *object, guint prop_id,
|
|
Packit Service |
ca3877 |
GValue *value, GParamSpec *pspec)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv =
|
|
Packit Service |
ca3877 |
soup_cookie_jar_get_instance_private (SOUP_COOKIE_JAR (object));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
switch (prop_id) {
|
|
Packit Service |
ca3877 |
case PROP_READ_ONLY:
|
|
Packit Service |
ca3877 |
g_value_set_boolean (value, priv->read_only);
|
|
Packit Service |
ca3877 |
break;
|
|
Packit Service |
ca3877 |
case PROP_ACCEPT_POLICY:
|
|
Packit Service |
ca3877 |
g_value_set_enum (value, priv->accept_policy);
|
|
Packit Service |
ca3877 |
break;
|
|
Packit Service |
ca3877 |
default:
|
|
Packit Service |
ca3877 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit Service |
ca3877 |
break;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static gboolean
|
|
Packit Service |
ca3877 |
soup_cookie_jar_real_is_persistent (SoupCookieJar *jar)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
return FALSE;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_class_init (SoupCookieJarClass *jar_class)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GObjectClass *object_class = G_OBJECT_CLASS (jar_class);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
object_class->constructed = soup_cookie_jar_constructed;
|
|
Packit Service |
ca3877 |
object_class->finalize = soup_cookie_jar_finalize;
|
|
Packit Service |
ca3877 |
object_class->set_property = soup_cookie_jar_set_property;
|
|
Packit Service |
ca3877 |
object_class->get_property = soup_cookie_jar_get_property;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
jar_class->is_persistent = soup_cookie_jar_real_is_persistent;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SoupCookieJar::changed:
|
|
Packit Service |
ca3877 |
* @jar: the #SoupCookieJar
|
|
Packit Service |
ca3877 |
* @old_cookie: the old #SoupCookie value
|
|
Packit Service |
ca3877 |
* @new_cookie: the new #SoupCookie value
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Emitted when @jar changes. If a cookie has been added,
|
|
Packit Service |
ca3877 |
* @new_cookie will contain the newly-added cookie and
|
|
Packit Service |
ca3877 |
* @old_cookie will be %NULL. If a cookie has been deleted,
|
|
Packit Service |
ca3877 |
* @old_cookie will contain the to-be-deleted cookie and
|
|
Packit Service |
ca3877 |
* @new_cookie will be %NULL. If a cookie has been changed,
|
|
Packit Service |
ca3877 |
* @old_cookie will contain its old value, and @new_cookie its
|
|
Packit Service |
ca3877 |
* new value.
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
signals[CHANGED] =
|
|
Packit Service |
ca3877 |
g_signal_new ("changed",
|
|
Packit Service |
ca3877 |
G_OBJECT_CLASS_TYPE (object_class),
|
|
Packit Service |
ca3877 |
G_SIGNAL_RUN_FIRST,
|
|
Packit Service |
ca3877 |
G_STRUCT_OFFSET (SoupCookieJarClass, changed),
|
|
Packit Service |
ca3877 |
NULL, NULL,
|
|
Packit Service |
ca3877 |
NULL,
|
|
Packit Service |
ca3877 |
G_TYPE_NONE, 2,
|
|
Packit Service |
ca3877 |
SOUP_TYPE_COOKIE | G_SIGNAL_TYPE_STATIC_SCOPE,
|
|
Packit Service |
ca3877 |
SOUP_TYPE_COOKIE | G_SIGNAL_TYPE_STATIC_SCOPE);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SOUP_COOKIE_JAR_READ_ONLY:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Alias for the #SoupCookieJar:read-only property. (Whether
|
|
Packit Service |
ca3877 |
* or not the cookie jar is read-only.)
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
g_object_class_install_property (
|
|
Packit Service |
ca3877 |
object_class, PROP_READ_ONLY,
|
|
Packit Service |
ca3877 |
g_param_spec_boolean (SOUP_COOKIE_JAR_READ_ONLY,
|
|
Packit Service |
ca3877 |
"Read-only",
|
|
Packit Service |
ca3877 |
"Whether or not the cookie jar is read-only",
|
|
Packit Service |
ca3877 |
FALSE,
|
|
Packit Service |
ca3877 |
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SOUP_COOKIE_JAR_ACCEPT_POLICY:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Alias for the #SoupCookieJar:accept-policy property.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.30
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SoupCookieJar:accept-policy:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* The policy the jar should follow to accept or reject cookies
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.30
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
g_object_class_install_property (
|
|
Packit Service |
ca3877 |
object_class, PROP_ACCEPT_POLICY,
|
|
Packit Service |
ca3877 |
g_param_spec_enum (SOUP_COOKIE_JAR_ACCEPT_POLICY,
|
|
Packit Service |
ca3877 |
"Accept-policy",
|
|
Packit Service |
ca3877 |
"The policy the jar should follow to accept or reject cookies",
|
|
Packit Service |
ca3877 |
SOUP_TYPE_COOKIE_JAR_ACCEPT_POLICY,
|
|
Packit Service |
ca3877 |
SOUP_COOKIE_JAR_ACCEPT_ALWAYS,
|
|
Packit Service |
ca3877 |
G_PARAM_READWRITE));
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_new:
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Creates a new #SoupCookieJar. The base #SoupCookieJar class does
|
|
Packit Service |
ca3877 |
* not support persistent storage of cookies; use a subclass for that.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Returns: a new #SoupCookieJar
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.24
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
SoupCookieJar *
|
|
Packit Service |
ca3877 |
soup_cookie_jar_new (void)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
return g_object_new (SOUP_TYPE_COOKIE_JAR, NULL);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_save:
|
|
Packit Service |
ca3877 |
* @jar: a #SoupCookieJar
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* This function exists for backward compatibility, but does not do
|
|
Packit Service |
ca3877 |
* anything any more; cookie jars are saved automatically when they
|
|
Packit Service |
ca3877 |
* are changed.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.24
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Deprecated: This is a no-op.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_save (SoupCookieJar *jar)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
/* Does nothing, obsolete */
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_changed (SoupCookieJar *jar,
|
|
Packit Service |
ca3877 |
SoupCookie *old, SoupCookie *new)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv = soup_cookie_jar_get_instance_private (jar);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (old && old != new)
|
|
Packit Service |
ca3877 |
g_hash_table_remove (priv->serials, old);
|
|
Packit Service |
ca3877 |
if (new) {
|
|
Packit Service |
ca3877 |
priv->serial++;
|
|
Packit Service |
ca3877 |
g_hash_table_insert (priv->serials, new, GUINT_TO_POINTER (priv->serial));
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (priv->read_only || !priv->constructed)
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_signal_emit (jar, signals[CHANGED], 0, old, new);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static int
|
|
Packit Service |
ca3877 |
compare_cookies (gconstpointer a, gconstpointer b, gpointer jar)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookie *ca = (SoupCookie *)a;
|
|
Packit Service |
ca3877 |
SoupCookie *cb = (SoupCookie *)b;
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv = soup_cookie_jar_get_instance_private (jar);
|
|
Packit Service |
ca3877 |
int alen, blen;
|
|
Packit Service |
ca3877 |
guint aserial, bserial;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* "Cookies with longer path fields are listed before cookies
|
|
Packit Service |
ca3877 |
* with shorter path field."
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
alen = ca->path ? strlen (ca->path) : 0;
|
|
Packit Service |
ca3877 |
blen = cb->path ? strlen (cb->path) : 0;
|
|
Packit Service |
ca3877 |
if (alen != blen)
|
|
Packit Service |
ca3877 |
return blen - alen;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* "Among cookies that have equal length path fields, cookies
|
|
Packit Service |
ca3877 |
* with earlier creation dates are listed before cookies with
|
|
Packit Service |
ca3877 |
* later creation dates."
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
aserial = GPOINTER_TO_UINT (g_hash_table_lookup (priv->serials, ca));
|
|
Packit Service |
ca3877 |
bserial = GPOINTER_TO_UINT (g_hash_table_lookup (priv->serials, cb));
|
|
Packit Service |
ca3877 |
return aserial - bserial;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static GSList *
|
|
Packit Service |
ca3877 |
get_cookies (SoupCookieJar *jar, SoupURI *uri, gboolean for_http, gboolean copy_cookies)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv;
|
|
Packit Service |
ca3877 |
GSList *cookies, *domain_cookies;
|
|
Packit Service |
ca3877 |
char *domain, *cur, *next_domain;
|
|
Packit Service |
ca3877 |
GSList *new_head, *cookies_to_remove = NULL, *p;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
priv = soup_cookie_jar_get_instance_private (jar);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!uri->host || !uri->host[0])
|
|
Packit Service |
ca3877 |
return NULL;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* The logic here is a little weird, but the plan is that if
|
|
Packit Service |
ca3877 |
* uri->host is "www.foo.com", we will end up looking up
|
|
Packit Service |
ca3877 |
* cookies for ".www.foo.com", "www.foo.com", ".foo.com", and
|
|
Packit Service |
ca3877 |
* ".com", in that order. (Logic stolen from Mozilla.)
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
cookies = NULL;
|
|
Packit Service |
ca3877 |
domain = cur = g_strdup_printf (".%s", uri->host);
|
|
Packit Service |
ca3877 |
next_domain = domain + 1;
|
|
Packit Service |
ca3877 |
do {
|
|
Packit Service |
ca3877 |
new_head = domain_cookies = g_hash_table_lookup (priv->domains, cur);
|
|
Packit Service |
ca3877 |
while (domain_cookies) {
|
|
Packit Service |
ca3877 |
GSList *next = domain_cookies->next;
|
|
Packit Service |
ca3877 |
SoupCookie *cookie = domain_cookies->data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (cookie->expires && soup_date_is_past (cookie->expires)) {
|
|
Packit Service |
ca3877 |
cookies_to_remove = g_slist_append (cookies_to_remove,
|
|
Packit Service |
ca3877 |
cookie);
|
|
Packit Service |
ca3877 |
new_head = g_slist_delete_link (new_head, domain_cookies);
|
|
Packit Service |
ca3877 |
g_hash_table_insert (priv->domains,
|
|
Packit Service |
ca3877 |
g_strdup (cur),
|
|
Packit Service |
ca3877 |
new_head);
|
|
Packit Service |
ca3877 |
} else if (soup_cookie_applies_to_uri (cookie, uri) &&
|
|
Packit Service |
ca3877 |
(for_http || !cookie->http_only))
|
|
Packit Service |
ca3877 |
cookies = g_slist_append (cookies, copy_cookies ? soup_cookie_copy (cookie) : cookie);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
domain_cookies = next;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
cur = next_domain;
|
|
Packit Service |
ca3877 |
if (cur)
|
|
Packit Service |
ca3877 |
next_domain = strchr (cur + 1, '.');
|
|
Packit Service |
ca3877 |
} while (cur);
|
|
Packit Service |
ca3877 |
g_free (domain);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
for (p = cookies_to_remove; p; p = p->next) {
|
|
Packit Service |
ca3877 |
SoupCookie *cookie = p->data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_cookie_jar_changed (jar, cookie, NULL);
|
|
Packit Service |
ca3877 |
soup_cookie_free (cookie);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
g_slist_free (cookies_to_remove);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return g_slist_sort_with_data (cookies, compare_cookies, jar);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_get_cookies:
|
|
Packit Service |
ca3877 |
* @jar: a #SoupCookieJar
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @for_http: whether or not the return value is being passed directly
|
|
Packit Service |
ca3877 |
* to an HTTP operation
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Retrieves (in Cookie-header form) the list of cookies that would
|
|
Packit Service |
ca3877 |
* be sent with a request to @uri.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* If @for_http is %TRUE, the return value will include cookies marked
|
|
Packit Service |
ca3877 |
* "HttpOnly" (that is, cookies that the server wishes to keep hidden
|
|
Packit Service |
ca3877 |
* from client-side scripting operations such as the JavaScript
|
|
Packit Service |
ca3877 |
* document.cookies property). Since #SoupCookieJar sets the Cookie
|
|
Packit Service |
ca3877 |
* header itself when making the actual HTTP request, you should
|
|
Packit Service |
ca3877 |
* almost certainly be setting @for_http to %FALSE if you are calling
|
|
Packit Service |
ca3877 |
* this.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: (nullable): the cookies, in string form, or %NULL if
|
|
Packit Service |
ca3877 |
* there are no cookies for @uri.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.24
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
char *
|
|
Packit Service |
ca3877 |
soup_cookie_jar_get_cookies (SoupCookieJar *jar, SoupURI *uri,
|
|
Packit Service |
ca3877 |
gboolean for_http)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GSList *cookies;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (SOUP_IS_COOKIE_JAR (jar), NULL);
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
cookies = get_cookies (jar, uri, for_http, FALSE);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (cookies) {
|
|
Packit Service |
ca3877 |
char *result = soup_cookies_to_cookie_header (cookies);
|
|
Packit Service |
ca3877 |
g_slist_free (cookies);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!*result) {
|
|
Packit Service |
ca3877 |
g_free (result);
|
|
Packit Service |
ca3877 |
result = NULL;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
return result;
|
|
Packit Service |
ca3877 |
} else
|
|
Packit Service |
ca3877 |
return NULL;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_get_cookie_list:
|
|
Packit Service |
ca3877 |
* @jar: a #SoupCookieJar
|
|
Packit Service |
ca3877 |
* @uri: a #SoupURI
|
|
Packit Service |
ca3877 |
* @for_http: whether or not the return value is being passed directly
|
|
Packit Service |
ca3877 |
* to an HTTP operation
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Retrieves the list of cookies that would be sent with a request to @uri
|
|
Packit Service |
ca3877 |
* as a #GSList of #SoupCookie objects.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* If @for_http is %TRUE, the return value will include cookies marked
|
|
Packit Service |
ca3877 |
* "HttpOnly" (that is, cookies that the server wishes to keep hidden
|
|
Packit Service |
ca3877 |
* from client-side scripting operations such as the JavaScript
|
|
Packit Service |
ca3877 |
* document.cookies property). Since #SoupCookieJar sets the Cookie
|
|
Packit Service |
ca3877 |
* header itself when making the actual HTTP request, you should
|
|
Packit Service |
ca3877 |
* almost certainly be setting @for_http to %FALSE if you are calling
|
|
Packit Service |
ca3877 |
* this.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: (transfer full) (element-type Soup.Cookie): a #GSList
|
|
Packit Service |
ca3877 |
* with the cookies in the @jar that would be sent with a request to @uri.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.40
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
GSList *
|
|
Packit Service |
ca3877 |
soup_cookie_jar_get_cookie_list (SoupCookieJar *jar, SoupURI *uri, gboolean for_http)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (SOUP_IS_COOKIE_JAR (jar), NULL);
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (uri != NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return get_cookies (jar, uri, for_http, TRUE);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_add_cookie:
|
|
Packit Service |
ca3877 |
* @jar: a #SoupCookieJar
|
|
Packit Service |
ca3877 |
* @cookie: (transfer full): a #SoupCookie
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Adds @cookie to @jar, emitting the 'changed' signal if we are modifying
|
|
Packit Service |
ca3877 |
* an existing cookie or adding a valid new cookie ('valid' means
|
|
Packit Service |
ca3877 |
* that the cookie's expire date is not in the past).
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* @cookie will be 'stolen' by the jar, so don't free it afterwards.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.26
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_add_cookie (SoupCookieJar *jar, SoupCookie *cookie)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv;
|
|
Packit Service |
ca3877 |
GSList *old_cookies, *oc, *last = NULL;
|
|
Packit Service |
ca3877 |
SoupCookie *old_cookie;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_if_fail (SOUP_IS_COOKIE_JAR (jar));
|
|
Packit Service |
ca3877 |
g_return_if_fail (cookie != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Never accept cookies for public domains. */
|
|
Packit Service |
ca3877 |
if (!g_hostname_is_ip_address (cookie->domain) &&
|
|
Packit Service |
ca3877 |
soup_tld_domain_is_public_suffix (cookie->domain)) {
|
|
Packit Service |
ca3877 |
soup_cookie_free (cookie);
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
priv = soup_cookie_jar_get_instance_private (jar);
|
|
Packit Service |
ca3877 |
old_cookies = g_hash_table_lookup (priv->domains, cookie->domain);
|
|
Packit Service |
ca3877 |
for (oc = old_cookies; oc; oc = oc->next) {
|
|
Packit Service |
ca3877 |
old_cookie = oc->data;
|
|
Packit Service |
ca3877 |
if (!strcmp (cookie->name, old_cookie->name) &&
|
|
Packit Service |
ca3877 |
!g_strcmp0 (cookie->path, old_cookie->path)) {
|
|
Packit Service |
ca3877 |
if (cookie->expires && soup_date_is_past (cookie->expires)) {
|
|
Packit Service |
ca3877 |
/* The new cookie has an expired date,
|
|
Packit Service |
ca3877 |
* this is the way the the server has
|
|
Packit Service |
ca3877 |
* of telling us that we have to
|
|
Packit Service |
ca3877 |
* remove the cookie.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
old_cookies = g_slist_delete_link (old_cookies, oc);
|
|
Packit Service |
ca3877 |
g_hash_table_insert (priv->domains,
|
|
Packit Service |
ca3877 |
g_strdup (cookie->domain),
|
|
Packit Service |
ca3877 |
old_cookies);
|
|
Packit Service |
ca3877 |
soup_cookie_jar_changed (jar, old_cookie, NULL);
|
|
Packit Service |
ca3877 |
soup_cookie_free (old_cookie);
|
|
Packit Service |
ca3877 |
soup_cookie_free (cookie);
|
|
Packit Service |
ca3877 |
} else {
|
|
Packit Service |
ca3877 |
oc->data = cookie;
|
|
Packit Service |
ca3877 |
soup_cookie_jar_changed (jar, old_cookie, cookie);
|
|
Packit Service |
ca3877 |
soup_cookie_free (old_cookie);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
last = oc;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* The new cookie is... a new cookie */
|
|
Packit Service |
ca3877 |
if (cookie->expires && soup_date_is_past (cookie->expires)) {
|
|
Packit Service |
ca3877 |
soup_cookie_free (cookie);
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (last)
|
|
Packit Service |
ca3877 |
last->next = g_slist_append (NULL, cookie);
|
|
Packit Service |
ca3877 |
else {
|
|
Packit Service |
ca3877 |
old_cookies = g_slist_append (NULL, cookie);
|
|
Packit Service |
ca3877 |
g_hash_table_insert (priv->domains, g_strdup (cookie->domain),
|
|
Packit Service |
ca3877 |
old_cookies);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_cookie_jar_changed (jar, NULL, cookie);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static const char *
|
|
Packit Service |
ca3877 |
normalize_cookie_domain (const char *domain)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
/* Trim any leading dot if present to transform the cookie
|
|
Packit Service |
ca3877 |
* domain into a valid hostname.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
if (domain != NULL && domain[0] == '.')
|
|
Packit Service |
ca3877 |
return domain + 1;
|
|
Packit Service |
ca3877 |
return domain;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static gboolean
|
|
Packit Service |
ca3877 |
incoming_cookie_is_third_party (SoupCookie *cookie, SoupURI *first_party)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
const char *normalized_cookie_domain;
|
|
Packit Service |
ca3877 |
const char *cookie_base_domain;
|
|
Packit Service |
ca3877 |
const char *first_party_base_domain;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (first_party == NULL || first_party->host == NULL)
|
|
Packit Service |
ca3877 |
return TRUE;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
normalized_cookie_domain = normalize_cookie_domain (cookie->domain);
|
|
Packit Service |
ca3877 |
cookie_base_domain = soup_tld_get_base_domain (normalized_cookie_domain, NULL);
|
|
Packit Service |
ca3877 |
if (cookie_base_domain == NULL)
|
|
Packit Service |
ca3877 |
cookie_base_domain = cookie->domain;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
first_party_base_domain = soup_tld_get_base_domain (first_party->host, NULL);
|
|
Packit Service |
ca3877 |
if (first_party_base_domain == NULL)
|
|
Packit Service |
ca3877 |
first_party_base_domain = first_party->host;
|
|
Packit Service |
ca3877 |
return !soup_host_matches_host (cookie_base_domain, first_party_base_domain);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_add_cookie_with_first_party:
|
|
Packit Service |
ca3877 |
* @jar: a #SoupCookieJar
|
|
Packit Service |
ca3877 |
* @first_party: the URI for the main document
|
|
Packit Service |
ca3877 |
* @cookie: (transfer full): a #SoupCookie
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Adds @cookie to @jar, emitting the 'changed' signal if we are modifying
|
|
Packit Service |
ca3877 |
* an existing cookie or adding a valid new cookie ('valid' means
|
|
Packit Service |
ca3877 |
* that the cookie's expire date is not in the past).
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* @first_party will be used to reject cookies coming from third party
|
|
Packit Service |
ca3877 |
* resources in case such a security policy is set in the @jar.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* @cookie will be 'stolen' by the jar, so don't free it afterwards.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.40
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_add_cookie_with_first_party (SoupCookieJar *jar, SoupURI *first_party, SoupCookie *cookie)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_if_fail (SOUP_IS_COOKIE_JAR (jar));
|
|
Packit Service |
ca3877 |
g_return_if_fail (first_party != NULL);
|
|
Packit Service |
ca3877 |
g_return_if_fail (cookie != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
priv = soup_cookie_jar_get_instance_private (jar);
|
|
Packit Service |
ca3877 |
if (priv->accept_policy == SOUP_COOKIE_JAR_ACCEPT_NEVER) {
|
|
Packit Service |
ca3877 |
soup_cookie_free (cookie);
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (priv->accept_policy == SOUP_COOKIE_JAR_ACCEPT_ALWAYS ||
|
|
Packit Service |
ca3877 |
!incoming_cookie_is_third_party (cookie, first_party)) {
|
|
Packit Service |
ca3877 |
/* will steal or free soup_cookie */
|
|
Packit Service |
ca3877 |
soup_cookie_jar_add_cookie (jar, cookie);
|
|
Packit Service |
ca3877 |
} else {
|
|
Packit Service |
ca3877 |
soup_cookie_free (cookie);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_set_cookie:
|
|
Packit Service |
ca3877 |
* @jar: a #SoupCookieJar
|
|
Packit Service |
ca3877 |
* @uri: the URI setting the cookie
|
|
Packit Service |
ca3877 |
* @cookie: the stringified cookie to set
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Adds @cookie to @jar, exactly as though it had appeared in a
|
|
Packit Service |
ca3877 |
* Set-Cookie header returned from a request to @uri.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Keep in mind that if the #SoupCookieJarAcceptPolicy
|
|
Packit Service |
ca3877 |
* %SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY is set you'll need to use
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_set_cookie_with_first_party(), otherwise the jar
|
|
Packit Service |
ca3877 |
* will have no way of knowing if the cookie is being set by a third
|
|
Packit Service |
ca3877 |
* party or not.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.24
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_set_cookie (SoupCookieJar *jar, SoupURI *uri,
|
|
Packit Service |
ca3877 |
const char *cookie)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookie *soup_cookie;
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_if_fail (SOUP_IS_COOKIE_JAR (jar));
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
g_return_if_fail (cookie != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!uri->host)
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
priv = soup_cookie_jar_get_instance_private (jar);
|
|
Packit Service |
ca3877 |
if (priv->accept_policy == SOUP_COOKIE_JAR_ACCEPT_NEVER)
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_if_fail (priv->accept_policy != SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_cookie = soup_cookie_parse (cookie, uri);
|
|
Packit Service |
ca3877 |
if (soup_cookie) {
|
|
Packit Service |
ca3877 |
/* will steal or free soup_cookie */
|
|
Packit Service |
ca3877 |
soup_cookie_jar_add_cookie (jar, soup_cookie);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_set_cookie_with_first_party:
|
|
Packit Service |
ca3877 |
* @jar: a #SoupCookieJar
|
|
Packit Service |
ca3877 |
* @uri: the URI setting the cookie
|
|
Packit Service |
ca3877 |
* @first_party: the URI for the main document
|
|
Packit Service |
ca3877 |
* @cookie: the stringified cookie to set
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Adds @cookie to @jar, exactly as though it had appeared in a
|
|
Packit Service |
ca3877 |
* Set-Cookie header returned from a request to @uri. @first_party
|
|
Packit Service |
ca3877 |
* will be used to reject cookies coming from third party resources in
|
|
Packit Service |
ca3877 |
* case such a security policy is set in the @jar.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.30
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_set_cookie_with_first_party (SoupCookieJar *jar,
|
|
Packit Service |
ca3877 |
SoupURI *uri,
|
|
Packit Service |
ca3877 |
SoupURI *first_party,
|
|
Packit Service |
ca3877 |
const char *cookie)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookie *soup_cookie;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_if_fail (SOUP_IS_COOKIE_JAR (jar));
|
|
Packit Service |
ca3877 |
g_return_if_fail (uri != NULL);
|
|
Packit Service |
ca3877 |
g_return_if_fail (first_party != NULL);
|
|
Packit Service |
ca3877 |
g_return_if_fail (cookie != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (!uri->host)
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_cookie = soup_cookie_parse (cookie, uri);
|
|
Packit Service |
ca3877 |
if (soup_cookie)
|
|
Packit Service |
ca3877 |
soup_cookie_jar_add_cookie_with_first_party (jar, first_party, soup_cookie);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
process_set_cookie_header (SoupMessage *msg, gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJar *jar = user_data;
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv = soup_cookie_jar_get_instance_private (jar);
|
|
Packit Service |
ca3877 |
GSList *new_cookies, *nc;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (priv->accept_policy == SOUP_COOKIE_JAR_ACCEPT_NEVER)
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
new_cookies = soup_cookies_from_response (msg);
|
|
Packit Service |
ca3877 |
for (nc = new_cookies; nc; nc = nc->next) {
|
|
Packit Service |
ca3877 |
SoupURI *first_party = soup_message_get_first_party (msg);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if ((priv->accept_policy == SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY &&
|
|
Packit Service |
ca3877 |
!incoming_cookie_is_third_party (nc->data, first_party)) ||
|
|
Packit Service |
ca3877 |
priv->accept_policy == SOUP_COOKIE_JAR_ACCEPT_ALWAYS)
|
|
Packit Service |
ca3877 |
soup_cookie_jar_add_cookie (jar, nc->data);
|
|
Packit Service |
ca3877 |
else
|
|
Packit Service |
ca3877 |
soup_cookie_free (nc->data);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
g_slist_free (new_cookies);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
msg_starting_cb (SoupMessage *msg, gpointer feature)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJar *jar = SOUP_COOKIE_JAR (feature);
|
|
Packit Service |
ca3877 |
char *cookies;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
cookies = soup_cookie_jar_get_cookies (jar, soup_message_get_uri (msg), TRUE);
|
|
Packit Service |
ca3877 |
if (cookies) {
|
|
Packit Service |
ca3877 |
soup_message_headers_replace (msg->request_headers,
|
|
Packit Service |
ca3877 |
"Cookie", cookies);
|
|
Packit Service |
ca3877 |
g_free (cookies);
|
|
Packit Service |
ca3877 |
} else
|
|
Packit Service |
ca3877 |
soup_message_headers_remove (msg->request_headers, "Cookie");
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_request_queued (SoupSessionFeature *feature,
|
|
Packit Service |
ca3877 |
SoupSession *session,
|
|
Packit Service |
ca3877 |
SoupMessage *msg)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_signal_connect (msg, "starting",
|
|
Packit Service |
ca3877 |
G_CALLBACK (msg_starting_cb),
|
|
Packit Service |
ca3877 |
feature);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_message_add_header_handler (msg, "got-headers",
|
|
Packit Service |
ca3877 |
"Set-Cookie",
|
|
Packit Service |
ca3877 |
G_CALLBACK (process_set_cookie_header),
|
|
Packit Service |
ca3877 |
feature);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_request_unqueued (SoupSessionFeature *feature,
|
|
Packit Service |
ca3877 |
SoupSession *session,
|
|
Packit Service |
ca3877 |
SoupMessage *msg)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_signal_handlers_disconnect_by_func (msg, process_set_cookie_header, feature);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_session_feature_init (SoupSessionFeatureInterface *feature_interface,
|
|
Packit Service |
ca3877 |
gpointer interface_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
feature_interface->request_queued = soup_cookie_jar_request_queued;
|
|
Packit Service |
ca3877 |
feature_interface->request_unqueued = soup_cookie_jar_request_unqueued;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_all_cookies:
|
|
Packit Service |
ca3877 |
* @jar: a #SoupCookieJar
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Constructs a #GSList with every cookie inside the @jar.
|
|
Packit Service |
ca3877 |
* The cookies in the list are a copy of the original, so
|
|
Packit Service |
ca3877 |
* you have to free them when you are done with them.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Return value: (transfer full) (element-type Soup.Cookie): a #GSList
|
|
Packit Service |
ca3877 |
* with all the cookies in the @jar.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.26
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
GSList *
|
|
Packit Service |
ca3877 |
soup_cookie_jar_all_cookies (SoupCookieJar *jar)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv;
|
|
Packit Service |
ca3877 |
GHashTableIter iter;
|
|
Packit Service |
ca3877 |
GSList *l = NULL;
|
|
Packit Service |
ca3877 |
gpointer key, value;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (SOUP_IS_COOKIE_JAR (jar), NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
priv = soup_cookie_jar_get_instance_private (jar);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_hash_table_iter_init (&iter, priv->domains);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
|
Packit Service |
ca3877 |
GSList *p, *cookies = value;
|
|
Packit Service |
ca3877 |
for (p = cookies; p; p = p->next)
|
|
Packit Service |
ca3877 |
l = g_slist_prepend (l, soup_cookie_copy (p->data));
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return l;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_delete_cookie:
|
|
Packit Service |
ca3877 |
* @jar: a #SoupCookieJar
|
|
Packit Service |
ca3877 |
* @cookie: a #SoupCookie
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Deletes @cookie from @jar, emitting the 'changed' signal.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.26
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_delete_cookie (SoupCookieJar *jar,
|
|
Packit Service |
ca3877 |
SoupCookie *cookie)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv;
|
|
Packit Service |
ca3877 |
GSList *cookies, *p;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_if_fail (SOUP_IS_COOKIE_JAR (jar));
|
|
Packit Service |
ca3877 |
g_return_if_fail (cookie != NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
priv = soup_cookie_jar_get_instance_private (jar);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
cookies = g_hash_table_lookup (priv->domains, cookie->domain);
|
|
Packit Service |
ca3877 |
if (cookies == NULL)
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
for (p = cookies; p; p = p->next ) {
|
|
Packit Service |
ca3877 |
SoupCookie *c = (SoupCookie*)p->data;
|
|
Packit Service |
ca3877 |
if (soup_cookie_equal (cookie, c)) {
|
|
Packit Service |
ca3877 |
cookies = g_slist_delete_link (cookies, p);
|
|
Packit Service |
ca3877 |
g_hash_table_insert (priv->domains,
|
|
Packit Service |
ca3877 |
g_strdup (cookie->domain),
|
|
Packit Service |
ca3877 |
cookies);
|
|
Packit Service |
ca3877 |
soup_cookie_jar_changed (jar, c, NULL);
|
|
Packit Service |
ca3877 |
soup_cookie_free (c);
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* SoupCookieJarAcceptPolicy:
|
|
Packit Service |
ca3877 |
* @SOUP_COOKIE_JAR_ACCEPT_ALWAYS: accept all cookies unconditionally.
|
|
Packit Service |
ca3877 |
* @SOUP_COOKIE_JAR_ACCEPT_NEVER: reject all cookies unconditionally.
|
|
Packit Service |
ca3877 |
* @SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY: accept all cookies set by
|
|
Packit Service |
ca3877 |
* the main document loaded in the application using libsoup. An
|
|
Packit Service |
ca3877 |
* example of the most common case, web browsers, would be: If
|
|
Packit Service |
ca3877 |
* http://www.example.com is the page loaded, accept all cookies set
|
|
Packit Service |
ca3877 |
* by example.com, but if a resource from http://www.third-party.com
|
|
Packit Service |
ca3877 |
* is loaded from that page reject any cookie that it could try to
|
|
Packit Service |
ca3877 |
* set. For libsoup to be able to tell apart first party cookies from
|
|
Packit Service |
ca3877 |
* the rest, the application must call soup_message_set_first_party()
|
|
Packit Service |
ca3877 |
* on each outgoing #SoupMessage, setting the #SoupURI of the main
|
|
Packit Service |
ca3877 |
* document. If no first party is set in a message when this policy is
|
|
Packit Service |
ca3877 |
* in effect, cookies will be assumed to be third party by default.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* The policy for accepting or rejecting cookies returned in
|
|
Packit Service |
ca3877 |
* responses.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.30
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_get_accept_policy:
|
|
Packit Service |
ca3877 |
* @jar: a #SoupCookieJar
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Gets @jar's #SoupCookieJarAcceptPolicy
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Returns: the #SoupCookieJarAcceptPolicy set in the @jar
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.30
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
SoupCookieJarAcceptPolicy
|
|
Packit Service |
ca3877 |
soup_cookie_jar_get_accept_policy (SoupCookieJar *jar)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (SOUP_IS_COOKIE_JAR (jar), SOUP_COOKIE_JAR_ACCEPT_ALWAYS);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
priv = soup_cookie_jar_get_instance_private (jar);
|
|
Packit Service |
ca3877 |
return priv->accept_policy;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_set_accept_policy:
|
|
Packit Service |
ca3877 |
* @jar: a #SoupCookieJar
|
|
Packit Service |
ca3877 |
* @policy: a #SoupCookieJarAcceptPolicy
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Sets @policy as the cookie acceptance policy for @jar.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.30
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
void
|
|
Packit Service |
ca3877 |
soup_cookie_jar_set_accept_policy (SoupCookieJar *jar,
|
|
Packit Service |
ca3877 |
SoupCookieJarAcceptPolicy policy)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupCookieJarPrivate *priv;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_return_if_fail (SOUP_IS_COOKIE_JAR (jar));
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
priv = soup_cookie_jar_get_instance_private (jar);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (priv->accept_policy != policy) {
|
|
Packit Service |
ca3877 |
priv->accept_policy = policy;
|
|
Packit Service |
ca3877 |
g_object_notify (G_OBJECT (jar), SOUP_COOKIE_JAR_ACCEPT_POLICY);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/**
|
|
Packit Service |
ca3877 |
* soup_cookie_jar_is_persistent:
|
|
Packit Service |
ca3877 |
* @jar: a #SoupCookieJar
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Gets whether @jar stores cookies persistenly.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Returns: %TRUE if @jar storage is persistent or %FALSE otherwise.
|
|
Packit Service |
ca3877 |
*
|
|
Packit Service |
ca3877 |
* Since: 2.40
|
|
Packit Service |
ca3877 |
**/
|
|
Packit Service |
ca3877 |
gboolean
|
|
Packit Service |
ca3877 |
soup_cookie_jar_is_persistent (SoupCookieJar *jar)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
g_return_val_if_fail (SOUP_IS_COOKIE_JAR (jar), FALSE);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
return SOUP_COOKIE_JAR_GET_CLASS (jar)->is_persistent (jar);
|
|
Packit Service |
ca3877 |
}
|