• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2     Copyright (C) 2010 ProFUSION embedded systems
3     Copyright (C) 2010 Samsung Electronics
4 
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Library General Public
7     License as published by the Free Software Foundation; either
8     version 2 of the License, or (at your option) any later version.
9 
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Library General Public License for more details.
14 
15     You should have received a copy of the GNU Library General Public License
16     along with this library; see the file COPYING.LIB.  If not, write to
17     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18     Boston, MA 02110-1301, USA.
19 */
20 
21 #include "config.h"
22 #include "ewk_cookies.h"
23 
24 #if USE(SOUP)
25 #include "CookieJarSoup.h"
26 #endif
27 #include "EWebKit.h"
28 #include "ResourceHandle.h"
29 
30 #include <Eina.h>
31 #include <eina_safety_checks.h>
32 #if USE(SOUP)
33 #include <glib.h>
34 #include <libsoup/soup.h>
35 #endif
36 #include <wtf/text/CString.h>
37 
38 
39 /**
40  * Sets the path where the cookies are going to be stored. Use @c NULL for keep
41  * them just in memory.
42  *
43  * @param filename path to the cookies.txt file.
44  *
45  * @return @c EINA_FALSE if it wasn't possible to create the cookie jar,
46  *          @c EINA_FALSE otherwise.
47  */
ewk_cookies_file_set(const char * filename)48 EAPI Eina_Bool ewk_cookies_file_set(const char *filename)
49 {
50 #if USE(SOUP)
51     SoupCookieJar* cookieJar = 0;
52     if (filename)
53         cookieJar = soup_cookie_jar_text_new(filename, FALSE);
54     else
55         cookieJar = soup_cookie_jar_new();
56 
57     if (!cookieJar)
58         return EINA_FALSE;
59 
60     soup_cookie_jar_set_accept_policy(cookieJar, SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY);
61 
62     SoupSession* session = WebCore::ResourceHandle::defaultSession();
63     SoupSessionFeature* oldjar = soup_session_get_feature(session, SOUP_TYPE_COOKIE_JAR);
64     if (oldjar)
65         soup_session_remove_feature(session, oldjar);
66 
67     WebCore::setDefaultCookieJar(cookieJar);
68     soup_session_add_feature(session, SOUP_SESSION_FEATURE(cookieJar));
69 
70     return EINA_TRUE;
71 #else
72     return EINA_FALSE;
73 #endif
74 }
75 
76 /**
77  * Clears all the cookies from the cookie jar.
78  */
ewk_cookies_clear(void)79 EAPI void ewk_cookies_clear(void)
80 {
81 #if USE(SOUP)
82     GSList* l;
83     GSList* p;
84     SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
85 
86     l = soup_cookie_jar_all_cookies(cookieJar);
87     for (p = l; p; p = p->next)
88         soup_cookie_jar_delete_cookie(cookieJar, (SoupCookie*)p->data);
89 
90     soup_cookies_free(l);
91 #endif
92 }
93 
94 /**
95  * Returns a list of cookies in the cookie jar.
96  *
97  * @return an @c Eina_List with all the cookies in the cookie jar.
98  */
ewk_cookies_get_all(void)99 EAPI Eina_List* ewk_cookies_get_all(void)
100 {
101     Eina_List* el = 0;
102 #if USE(SOUP)
103     GSList* l;
104     GSList* p;
105     SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
106 
107     l = soup_cookie_jar_all_cookies(cookieJar);
108     for (p = l; p; p = p->next) {
109         SoupCookie* cookie = static_cast<SoupCookie*>(p->data);
110         Ewk_Cookie* c = static_cast<Ewk_Cookie*>(malloc(sizeof(*c)));
111         c->name = strdup(cookie->name);
112         c->value = strdup(cookie->value);
113         c->domain = strdup(cookie->domain);
114         c->path = strdup(cookie->path);
115         c->expires = soup_date_to_time_t(cookie->expires);
116         c->secure = static_cast<Eina_Bool>(cookie->secure);
117         c->http_only = static_cast<Eina_Bool>(cookie->http_only);
118         el = eina_list_append(el, c);
119     }
120 
121     soup_cookies_free(l);
122 #endif
123     return el;
124 }
125 
126 /**
127  * Deletes a cookie from the cookie jar.
128  *
129  * Note that the fields name, value, domain and path are used to match this
130  * cookie in the cookie jar.
131  *
132  * @param cookie an @c Ewk_Cookie that has the info relative to that cookie.
133  */
ewk_cookies_cookie_del(Ewk_Cookie * cookie)134 EAPI void ewk_cookies_cookie_del(Ewk_Cookie *cookie)
135 {
136 #if USE(SOUP)
137     EINA_SAFETY_ON_NULL_RETURN(cookie);
138     GSList* l;
139     GSList* p;
140     SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
141     SoupCookie* c1 = soup_cookie_new(
142         cookie->name, cookie->value, cookie->domain, cookie->path, -1);
143 
144     l = soup_cookie_jar_all_cookies(cookieJar);
145     for (p = l; p; p = p->next) {
146         SoupCookie* c2 = static_cast<SoupCookie*>(p->data);
147         if (soup_cookie_equal(c1, c2)) {
148             soup_cookie_jar_delete_cookie(cookieJar, c2);
149             break;
150         }
151     }
152 
153     soup_cookie_free(c1);
154     soup_cookies_free(l);
155 #endif
156 }
157 
158 /**
159  * Frees the memory used by a cookie.
160  *
161  * @param cookie the Ewk_Cookie struct that will be freed.
162  */
ewk_cookies_cookie_free(Ewk_Cookie * cookie)163 EAPI void ewk_cookies_cookie_free(Ewk_Cookie *cookie)
164 {
165 #if USE(SOUP)
166     EINA_SAFETY_ON_NULL_RETURN(cookie);
167     free(cookie->name);
168     free(cookie->value);
169     free(cookie->domain);
170     free(cookie->path);
171     free(cookie);
172 #endif
173 }
174 
175 /**
176  * Sets the cookies accept policy.
177  *
178  * @param p the acceptance policy
179  * @see Ewk_Cookie_Policy
180  */
ewk_cookies_policy_set(Ewk_Cookie_Policy p)181 EAPI void ewk_cookies_policy_set(Ewk_Cookie_Policy p)
182 {
183 #if USE(SOUP)
184     SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
185     SoupCookieJarAcceptPolicy policy;
186 
187     policy = SOUP_COOKIE_JAR_ACCEPT_ALWAYS;
188     switch (p) {
189     case EWK_COOKIE_JAR_ACCEPT_NEVER:
190         policy = SOUP_COOKIE_JAR_ACCEPT_NEVER;
191         break;
192     case EWK_COOKIE_JAR_ACCEPT_ALWAYS:
193         policy = SOUP_COOKIE_JAR_ACCEPT_ALWAYS;
194         break;
195     case EWK_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY:
196         policy = SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY;
197         break;
198     }
199 
200     soup_cookie_jar_set_accept_policy(cookieJar, policy);
201 #endif
202 }
203 
204 /**
205  * Gets the acceptance policy used in the current cookie jar.
206  *
207  * @return the current acceptance policy
208  * @see Ewk_Cookie_Policy
209  */
ewk_cookies_policy_get(void)210 EAPI Ewk_Cookie_Policy ewk_cookies_policy_get(void)
211 {
212     Ewk_Cookie_Policy ewk_policy = EWK_COOKIE_JAR_ACCEPT_ALWAYS;
213 #if USE(SOUP)
214     SoupCookieJar* cookieJar = WebCore::defaultCookieJar();
215     SoupCookieJarAcceptPolicy policy;
216 
217     policy = soup_cookie_jar_get_accept_policy(cookieJar);
218     switch (policy) {
219     case SOUP_COOKIE_JAR_ACCEPT_NEVER:
220         ewk_policy = EWK_COOKIE_JAR_ACCEPT_NEVER;
221         break;
222     case SOUP_COOKIE_JAR_ACCEPT_ALWAYS:
223         ewk_policy = EWK_COOKIE_JAR_ACCEPT_ALWAYS;
224         break;
225     case SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY:
226         ewk_policy = EWK_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY;
227         break;
228     }
229 #endif
230 
231     return ewk_policy;
232 }
233