/*
Copyright (C) 2010 ProFUSION embedded systems
Copyright (C) 2010 Samsung Electronics
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "config.h"
#include "ewk_cookies.h"
#if USE(SOUP)
#include "CookieJarSoup.h"
#endif
#include "EWebKit.h"
#include "ResourceHandle.h"
#include <Eina.h>
#include <eina_safety_checks.h>
#if USE(SOUP)
#include <glib.h>
#include <libsoup/soup.h>
#endif
#include <wtf/text/CString.h>
/**
* Sets the path where the cookies are going to be stored. Use @c NULL for keep
* them just in memory.
*
* @param filename path to the cookies.txt file.
*
* @return @c EINA_FALSE if it wasn't possible to create the cookie jar,
* @c EINA_FALSE otherwise.
*/
EAPI Eina_Bool ewk_cookies_file_set(const char *filename)
{
#if USE(SOUP)
SoupCookieJar* cookieJar = 0;
if (filename)
cookieJar = soup_cookie_jar_text_new(filename, FALSE);
else
cookieJar = soup_cookie_jar_new();
if (!cookieJar)
return EINA_FALSE;
soup_cookie_jar_set_accept_policy(cookieJar, SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY);
SoupSession* session = WebCore::ResourceHandle::defaultSession();
SoupSessionFeature* oldjar = soup_session_get_feature(session, SOUP_TYPE_COOKIE_JAR);
if (oldjar)
soup_session_remove_feature(session, oldjar);
WebCore::setDefaultCookieJar(cookieJar);
soup_session_add_feature(session, SOUP_SESSION_FEATURE(cookieJar));
return EINA_TRUE;
#else
return EINA_FALSE;
#endif
}
/**
* Clears all the cookies from the cookie jar.
*/
EAPI void ewk_cookies_clear(void)
{
#if USE(SOUP)
GSList* l;
GSList* p;
SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
l = soup_cookie_jar_all_cookies(cookieJar);
for (p = l; p; p = p->next)
soup_cookie_jar_delete_cookie(cookieJar, (SoupCookie*)p->data);
soup_cookies_free(l);
#endif
}
/**
* Returns a list of cookies in the cookie jar.
*
* @return an @c Eina_List with all the cookies in the cookie jar.
*/
EAPI Eina_List* ewk_cookies_get_all(void)
{
Eina_List* el = 0;
#if USE(SOUP)
GSList* l;
GSList* p;
SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
l = soup_cookie_jar_all_cookies(cookieJar);
for (p = l; p; p = p->next) {
SoupCookie* cookie = static_cast<SoupCookie*>(p->data);
Ewk_Cookie* c = static_cast<Ewk_Cookie*>(malloc(sizeof(*c)));
c->name = strdup(cookie->name);
c->value = strdup(cookie->value);
c->domain = strdup(cookie->domain);
c->path = strdup(cookie->path);
c->expires = soup_date_to_time_t(cookie->expires);
c->secure = static_cast<Eina_Bool>(cookie->secure);
c->http_only = static_cast<Eina_Bool>(cookie->http_only);
el = eina_list_append(el, c);
}
soup_cookies_free(l);
#endif
return el;
}
/**
* Deletes a cookie from the cookie jar.
*
* Note that the fields name, value, domain and path are used to match this
* cookie in the cookie jar.
*
* @param cookie an @c Ewk_Cookie that has the info relative to that cookie.
*/
EAPI void ewk_cookies_cookie_del(Ewk_Cookie *cookie)
{
#if USE(SOUP)
EINA_SAFETY_ON_NULL_RETURN(cookie);
GSList* l;
GSList* p;
SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
SoupCookie* c1 = soup_cookie_new(
cookie->name, cookie->value, cookie->domain, cookie->path, -1);
l = soup_cookie_jar_all_cookies(cookieJar);
for (p = l; p; p = p->next) {
SoupCookie* c2 = static_cast<SoupCookie*>(p->data);
if (soup_cookie_equal(c1, c2)) {
soup_cookie_jar_delete_cookie(cookieJar, c2);
break;
}
}
soup_cookie_free(c1);
soup_cookies_free(l);
#endif
}
/**
* Frees the memory used by a cookie.
*
* @param cookie the Ewk_Cookie struct that will be freed.
*/
EAPI void ewk_cookies_cookie_free(Ewk_Cookie *cookie)
{
#if USE(SOUP)
EINA_SAFETY_ON_NULL_RETURN(cookie);
free(cookie->name);
free(cookie->value);
free(cookie->domain);
free(cookie->path);
free(cookie);
#endif
}
/**
* Sets the cookies accept policy.
*
* @param p the acceptance policy
* @see Ewk_Cookie_Policy
*/
EAPI void ewk_cookies_policy_set(Ewk_Cookie_Policy p)
{
#if USE(SOUP)
SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
SoupCookieJarAcceptPolicy policy;
policy = SOUP_COOKIE_JAR_ACCEPT_ALWAYS;
switch (p) {
case EWK_COOKIE_JAR_ACCEPT_NEVER:
policy = SOUP_COOKIE_JAR_ACCEPT_NEVER;
break;
case EWK_COOKIE_JAR_ACCEPT_ALWAYS:
policy = SOUP_COOKIE_JAR_ACCEPT_ALWAYS;
break;
case EWK_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY:
policy = SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY;
break;
}
soup_cookie_jar_set_accept_policy(cookieJar, policy);
#endif
}
/**
* Gets the acceptance policy used in the current cookie jar.
*
* @return the current acceptance policy
* @see Ewk_Cookie_Policy
*/
EAPI Ewk_Cookie_Policy ewk_cookies_policy_get(void)
{
Ewk_Cookie_Policy ewk_policy = EWK_COOKIE_JAR_ACCEPT_ALWAYS;
#if USE(SOUP)
SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
SoupCookieJarAcceptPolicy policy;
policy = soup_cookie_jar_get_accept_policy(cookieJar);
switch (policy) {
case SOUP_COOKIE_JAR_ACCEPT_NEVER:
ewk_policy = EWK_COOKIE_JAR_ACCEPT_NEVER;
break;
case SOUP_COOKIE_JAR_ACCEPT_ALWAYS:
ewk_policy = EWK_COOKIE_JAR_ACCEPT_ALWAYS;
break;
case SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY:
ewk_policy = EWK_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY;
break;
}
#endif
return ewk_policy;
}