# HG changeset patch # User Gary Kramlich # Date 1453575450 21600 # Node ID 00cc81f9b8090634fb514d3d0a0670115d2736f8 # Parent cd43092f4731e9e4187e6a51d376230e9b301464# Parent 57f67d15a87d224d3f4adabd4bf136a584aa5e68 Merged in EionRobb/pidgin (pull request #12) Cookie improvements to HTTP functions diff -r cd43092f4731 -r 00cc81f9b809 libpurple/http.c --- a/libpurple/http.c Sat Jan 23 12:54:04 2016 -0600 +++ b/libpurple/http.c Sat Jan 23 12:57:30 2016 -0600 @@ -24,8 +24,10 @@ #include "internal.h" #include "glibcompat.h" + #include "debug.h" #include "ntlm.h" +#include "proxy.h" #include "purple-socket.h" #include @@ -1990,7 +1992,7 @@ while (g_hash_table_iter_next(&it, (gpointer*)&key, (gpointer*)&cookie)) { - if (cookie->expires != -1 && cookie->expires <= now) + if (cookie->expires != -1 && cookie->expires != 0 && cookie->expires <= now) continue; g_string_append_printf(str, "%s=%s; ", key, cookie->value); } @@ -2003,7 +2005,17 @@ void purple_http_cookie_jar_set(PurpleHttpCookieJar *cookie_jar, const gchar *name, const gchar *value) { - purple_http_cookie_jar_set_ext(cookie_jar, name, value, -1); + gchar *escaped_name = g_strdup(purple_url_encode(name)); + gchar *escaped_value = NULL; + + if (escaped_value) { + escaped_value = g_strdup(purple_url_encode(value)); + } + + purple_http_cookie_jar_set_ext(cookie_jar, escaped_name, escaped_value, -1); + + g_free(escaped_name); + g_free(escaped_value); } static void purple_http_cookie_jar_set_ext(PurpleHttpCookieJar *cookie_jar, @@ -2012,7 +2024,7 @@ g_return_if_fail(cookie_jar != NULL); g_return_if_fail(name != NULL); - if (expires != -1 && time(NULL) >= expires) + if (expires != -1 && expires != 0 && time(NULL) >= expires) value = NULL; if (value != NULL) { @@ -2023,7 +2035,7 @@ g_hash_table_remove(cookie_jar->tab, name); } -const gchar * purple_http_cookie_jar_get(PurpleHttpCookieJar *cookie_jar, +gchar * purple_http_cookie_jar_get(PurpleHttpCookieJar *cookie_jar, const gchar *name) { PurpleHttpCookie *cookie; @@ -2035,7 +2047,7 @@ if (!cookie) return NULL; - return cookie->value; + return g_strdup(purple_url_decode(cookie->value)); } gchar * purple_http_cookie_jar_dump(PurpleHttpCookieJar *cjar) diff -r cd43092f4731 -r 00cc81f9b809 libpurple/http.h --- a/libpurple/http.h Sat Jan 23 12:54:04 2016 -0600 +++ b/libpurple/http.h Sat Jan 23 12:57:30 2016 -0600 @@ -463,9 +463,11 @@ * * Gets the cookie. * + * The result must be g_free'd. + * * Returns: Cookie contents, or NULL, if cookie doesn't exists. */ -const gchar * purple_http_cookie_jar_get(PurpleHttpCookieJar *cookie_jar, +gchar * purple_http_cookie_jar_get(PurpleHttpCookieJar *cookie_jar, const gchar *name); /** diff -r cd43092f4731 -r 00cc81f9b809 libpurple/protocols/yahoo/ymsg.c --- a/libpurple/protocols/yahoo/ymsg.c Sat Jan 23 12:54:04 2016 -0600 +++ b/libpurple/protocols/yahoo/ymsg.c Sat Jan 23 12:57:30 2016 -0600 @@ -1705,9 +1705,9 @@ "\r\n", -1); cookiejar = purple_http_conn_get_cookie_jar(http_conn); - yd->cookie_b = g_strdup(purple_http_cookie_jar_get(cookiejar, "B")); - yd->cookie_t = g_strdup(purple_http_cookie_jar_get(cookiejar, "T")); - yd->cookie_y = g_strdup(purple_http_cookie_jar_get(cookiejar, "Y")); + yd->cookie_b = purple_http_cookie_jar_get(cookiejar, "B"); + yd->cookie_t = purple_http_cookie_jar_get(cookiejar, "T"); + yd->cookie_y = purple_http_cookie_jar_get(cookiejar, "Y"); i = 0; while (splits[i]) { @@ -3214,7 +3214,7 @@ PurpleAccount *account = purple_connection_get_account(gc); PurpleHttpCookieJar *cjar; GString *auth_s; - const gchar *cookie; + gchar *cookie; if (purple_http_response_get_code(resp) != 302) { purple_connection_error(gc, @@ -3226,14 +3226,20 @@ auth_s = g_string_new(NULL); cjar = purple_http_conn_get_cookie_jar(hc); cookie = purple_http_cookie_jar_get(cjar, "B"); - if (cookie) + if (cookie) { g_string_append_printf(auth_s, "B=%s; ", cookie); + g_free(cookie); + } cookie = purple_http_cookie_jar_get(cjar, "T"); - if (cookie) + if (cookie) { g_string_append_printf(auth_s, "T=%s; ", cookie); + g_free(cookie); + } cookie = purple_http_cookie_jar_get(cjar, "Y"); - if (cookie) + if (cookie) { g_string_append_printf(auth_s, "Y=%s; ", cookie); + g_free(cookie); + } yd->auth = g_string_free(auth_s, FALSE); /* Now we have our cookies to login with. I'll go get the milk. */