| /* |
| 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; |
| } |