diff -r 2d73192cdcf8 -r caf380128870 libpurple/protocols/yahoo/libymsg.c --- a/libpurple/protocols/yahoo/libymsg.c Fri Jul 05 23:19:08 2013 +0530 +++ b/libpurple/protocols/yahoo/libymsg.c Fri Jul 05 23:31:34 2013 +0530 @@ -22,7 +22,6 @@ */ #include "internal.h" -#include "obsolete.h" #include "account.h" #include "accountopt.h" @@ -1700,6 +1699,8 @@ purple_debug_info("yahoo","Authentication: In yahoo_auth16_stage3\n"); + g_return_if_fail(crypt != NULL); + md5_hash = purple_md5_hash_new(); purple_hash_append(md5_hash, (guchar *)crypt, strlen(crypt)); purple_hash_digest(md5_hash, md5_digest, sizeof(md5_digest)); @@ -1743,170 +1744,134 @@ g_object_unref(md5_hash); } -static gchar *yahoo_auth16_get_cookie_b(gchar *headers) +static void yahoo_auth16_stage2(PurpleHttpConnection *http_conn, + PurpleHttpResponse *response, gpointer _auth_data) { - gchar **splits = g_strsplit(headers, "\r\n", -1); - gchar *tmp = NULL, *tmp2 = NULL, *sem = NULL; - int elements = g_strv_length(splits), i; - - if(elements > 1) { - for(i = 0; i < elements; i++) { - if(g_ascii_strncasecmp(splits[i], "Set-Cookie: B=", 14) == 0) { - tmp = &splits[i][14]; - sem = strchr(tmp, ';'); - - if (sem != NULL) { - tmp2 = g_strndup(tmp, sem - tmp); - purple_debug_info("yahoo", "Got needed part of B cookie: %s\n", - tmp2 ? tmp2 : "(null)"); - break; - } - } - } - } - - g_strfreev(splits); - return tmp2; -} - -static void yahoo_auth16_stage2(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *ret_data, size_t len, const gchar *error_message) -{ - struct yahoo_auth_data *auth_data = user_data; + struct yahoo_auth_data *auth_data = _auth_data; PurpleConnection *gc = auth_data->gc; YahooData *yd = purple_connection_get_protocol_data(gc); + int i; + gchar **splits; + int response_no = -1; + char *crumb = NULL; + char *crypt = NULL; + PurpleHttpCookieJar *cookiejar; + purple_debug_info("yahoo","Authentication: In yahoo_auth16_stage2\n"); - yd->url_datas = g_slist_remove(yd->url_datas, url_data); - - if (error_message != NULL) { + yd->http_reqs = g_slist_remove(yd->http_reqs, http_conn); + + if (!purple_http_response_is_successfull(response)) { + const gchar *error_message = purple_http_response_get_error(response); purple_debug_error("yahoo", "Login Failed, unable to retrieve stage 2 url: %s\n", error_message); purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_message); g_free(auth_data->seed); g_free(auth_data); return; } - else if (len > 0 && ret_data && *ret_data) { - gchar **splits = g_strsplit(ret_data, "\r\n\r\n", -1), **split_data = NULL; - int totalelements = 0; - int response_no = -1; - char *crumb = NULL; - char *crypt = NULL; - - if(g_strv_length(splits) > 1) { - yd->cookie_b = yahoo_auth16_get_cookie_b(splits[0]); - split_data = g_strsplit(splits[1], "\r\n", -1); - totalelements = g_strv_length(split_data); - } - - if (totalelements >= 4) { - int i; - - for(i = 0; i < totalelements; i++) { - /* I'm not exactly a fan of the magic numbers, but it's obvious, - * so no sense in wasting a bajillion vars or calls to strlen */ - - if(g_ascii_isdigit(split_data[i][0])) { - /* if the current line and the next line both start with numbers, - * the current line is the length of the body, so skip. If not, - * then the current line is the response code from the login process. */ - if(!g_ascii_isdigit(split_data[i + 1][0])) { - response_no = strtol(split_data[i], NULL, 10); - purple_debug_info("yahoo", "Got auth16 stage 2 response code: %d\n", - response_no); - } - } else if(strncmp(split_data[i], "crumb=", 6) == 0) { - crumb = g_strdup(&split_data[i][6]); - - if(purple_debug_is_unsafe()) - purple_debug_info("yahoo", "Got crumb: %s\n", crumb); - - } else if(strncmp(split_data[i], "Y=", 2) == 0) { - yd->cookie_y = g_strdup(&split_data[i][2]); - - if(purple_debug_is_unsafe()) - purple_debug_info("yahoo", "Got Y cookie: %s\n", yd->cookie_y); - - } else if(strncmp(split_data[i], "T=", 2) == 0) { - yd->cookie_t = g_strdup(&split_data[i][2]); - - if(purple_debug_is_unsafe()) - purple_debug_info("yahoo", "Got T cookie: %s\n", yd->cookie_t); - } - } + + splits = g_strsplit(purple_http_response_get_data(response, NULL), + "\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")); + + i = 0; + while (splits[i]) { + /* I'm not exactly a fan of the magic numbers, but it's obvious, + * so no sense in wasting a bajillion vars or calls to strlen */ + + if (i == 0 && g_ascii_isdigit(splits[i][0])) { + response_no = strtol(splits[i], NULL, 10); + purple_debug_info("yahoo", "Got auth16 stage 2 response code: %d\n", + response_no); + } else if (strncmp(splits[i], "crumb=", 6) == 0) { + crumb = g_strdup(&splits[i][6]); + + if (purple_debug_is_unsafe()) + purple_debug_info("yahoo", "Got crumb: %s\n", crumb); } - - g_strfreev(splits); - g_strfreev(split_data); - - if(response_no != 0) { - /* Some error in the login process */ - PurpleConnectionError error; - char *error_reason = NULL; - - switch(response_no) { - case -1: - /* Some error in the received stream */ - error_reason = g_strdup(_("Received invalid data")); - error = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; - break; - case 100: - /* Unknown error */ - error_reason = g_strdup(_("Unknown error")); - error = PURPLE_CONNECTION_ERROR_OTHER_ERROR; - break; - default: - /* if we have everything we need, why not try to login irrespective of response */ - if((crumb != NULL) && (yd->cookie_y != NULL) && (yd->cookie_t != NULL)) { + i++; + } + + g_strfreev(splits); + + if (crumb == NULL) + response_no = -1; + + if(response_no != 0) { + /* Some error in the login process */ + PurpleConnectionError error; + char *error_reason = NULL; + + switch (response_no) { + case -1: + /* Some error in the received stream */ + error_reason = g_strdup(_("Received invalid data")); + error = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + break; + case 100: + /* Unknown error */ + error_reason = g_strdup(_("Unknown error")); + error = PURPLE_CONNECTION_ERROR_OTHER_ERROR; + break; + default: + /* if we have everything we need, why not try to login irrespective of response */ + if ((crumb != NULL) && (yd->cookie_y != NULL) && (yd->cookie_t != NULL)) { #if 0 - try_login_on_error = TRUE; + try_login_on_error = TRUE; #endif - break; - } - error_reason = g_strdup(_("Unknown error")); - error = PURPLE_CONNECTION_ERROR_OTHER_ERROR; break; - } - if(error_reason) { - purple_debug_error("yahoo", "Authentication error: %s. " - "Code %d\n", error_reason, response_no); - purple_connection_error(gc, error, error_reason); - g_free(error_reason); - g_free(auth_data->seed); - g_free(auth_data); - return; - } + } + error_reason = g_strdup(_("Unknown error")); + error = PURPLE_CONNECTION_ERROR_OTHER_ERROR; + break; } - - crypt = g_strconcat(crumb, auth_data->seed, NULL); - yahoo_auth16_stage3(gc, crypt); - g_free(crypt); - g_free(crumb); + if (error_reason) { + purple_debug_error("yahoo", "Authentication error: %s. " + "Code %d\n", error_reason, response_no); + purple_connection_error(gc, error, error_reason); + g_free(error_reason); + g_free(crumb); + g_free(auth_data->seed); + g_free(auth_data); + return; + } } + + crypt = g_strconcat(crumb, auth_data->seed, NULL); + yahoo_auth16_stage3(gc, crypt); + g_free(crypt); + g_free(crumb); g_free(auth_data->seed); g_free(auth_data); } -static void yahoo_auth16_stage1_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *ret_data, size_t len, const gchar *error_message) +static void yahoo_auth16_stage1_cb(PurpleHttpConnection *http_conn, + PurpleHttpResponse *response, gpointer _auth_data) { - struct yahoo_auth_data *auth_data = user_data; + struct yahoo_auth_data *auth_data = _auth_data; PurpleConnection *gc = auth_data->gc; YahooData *yd = purple_connection_get_protocol_data(gc); purple_debug_info("yahoo","Authentication: In yahoo_auth16_stage1_cb\n"); - yd->url_datas = g_slist_remove(yd->url_datas, url_data); - - if (error_message != NULL) { + yd->http_reqs = g_slist_remove(yd->http_reqs, http_conn); + + if (!purple_http_response_is_successfull(response)) { + const gchar *error_message = purple_http_response_get_error(response); purple_debug_error("yahoo", "Login Failed, unable to retrieve login url: %s\n", error_message); purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_message); g_free(auth_data->seed); g_free(auth_data); return; - } - else if (len > 0 && ret_data && *ret_data) { + } else { PurpleAccount *account = purple_connection_get_account(gc); - gchar **split_data = g_strsplit(ret_data, "\r\n", -1); + gchar **split_data = g_strsplit(purple_http_response_get_data( + response, NULL), "\r\n", -1); int totalelements = 0; int response_no = -1; char *token = NULL; @@ -1987,19 +1952,22 @@ g_free(token); } else { - /* OK to login, correct information provided */ - PurpleUtilFetchUrlData *url_data = NULL; - char *url = NULL; + /* OK to login, correct information provided */ gboolean yahoojp = yahoo_is_japan(account); - gboolean proxy_ssl = purple_account_get_bool(account, "proxy_ssl", FALSE); - - url = g_strdup_printf(yahoojp ? YAHOOJP_LOGIN_URL : YAHOO_LOGIN_URL, token); - url_data = purple_util_fetch_url_request( - proxy_ssl ? account : NULL, url, TRUE, YAHOO_CLIENT_USERAGENT, - TRUE, NULL, TRUE, -1, yahoo_auth16_stage2, auth_data); - if (url_data) - yd->url_datas = g_slist_prepend(yd->url_datas, url_data); - g_free(url); + PurpleHttpRequest *req; + PurpleHttpConnection *hc; + + req = purple_http_request_new(NULL); + purple_http_request_set_url_printf(req, + yahoojp ? YAHOOJP_LOGIN_URL : YAHOO_LOGIN_URL, + token); + purple_http_request_header_set(req, "User-Agent", + YAHOO_CLIENT_USERAGENT); + hc = purple_http_request(gc, req, yahoo_auth16_stage2, + auth_data); + purple_http_request_unref(req); + yd->http_reqs = g_slist_prepend(yd->http_reqs, hc); + g_free(token); } } @@ -2009,13 +1977,12 @@ { YahooData *yd = purple_connection_get_protocol_data(gc); PurpleAccount *account = purple_connection_get_account(gc); - PurpleUtilFetchUrlData *url_data = NULL; + PurpleHttpRequest *req; + PurpleHttpConnection *hc; struct yahoo_auth_data *auth_data = NULL; - char *url = NULL; char *encoded_username; char *encoded_password; gboolean yahoojp = yahoo_is_japan(account); - gboolean proxy_ssl = purple_account_get_bool(account, "proxy_ssl", FALSE); purple_debug_info("yahoo", "Authentication: In yahoo_auth16_stage1\n"); @@ -2030,19 +1997,18 @@ encoded_username = g_strdup(purple_url_encode(purple_account_get_username(purple_connection_get_account(gc)))); encoded_password = g_strdup(purple_url_encode(purple_connection_get_password(gc))); - url = g_strdup_printf(yahoojp ? YAHOOJP_TOKEN_URL : YAHOO_TOKEN_URL, - encoded_username, encoded_password, purple_url_encode(seed)); - g_free(encoded_password); + + req = purple_http_request_new(NULL); + purple_http_request_set_url_printf(req, + yahoojp ? YAHOOJP_TOKEN_URL : YAHOO_TOKEN_URL, + encoded_username, encoded_password, purple_url_encode(seed)); + purple_http_request_header_set(req, "User-Agent", YAHOO_CLIENT_USERAGENT); + hc = purple_http_request(gc, req, yahoo_auth16_stage1_cb, auth_data); + purple_http_request_unref(req); + yd->http_reqs = g_slist_prepend(yd->http_reqs, hc); + + purple_str_wipe(encoded_password); g_free(encoded_username); - - url_data = purple_util_fetch_url_request( - proxy_ssl ? account : NULL, url, TRUE, - YAHOO_CLIENT_USERAGENT, TRUE, NULL, FALSE, -1, - yahoo_auth16_stage1_cb, auth_data); - if (url_data) - yd->url_datas = g_slist_prepend(yd->url_datas, url_data); - - g_free(url); } static void yahoo_process_auth(PurpleConnection *gc, struct yahoo_packet *pkt) @@ -3585,22 +3551,22 @@ } } -static void yahoo_got_pager_server(PurpleUtilFetchUrlData *url_data, - gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message) +static void yahoo_got_pager_server(PurpleHttpConnection *http_conn, + PurpleHttpResponse *response, gpointer _yd) { - YahooData *yd = user_data; + YahooData *yd = _yd; PurpleConnection *gc = yd->gc; PurpleAccount *a = purple_connection_get_account(gc); gchar **strings = NULL, *cs_server = NULL; int port = purple_account_get_int(a, "port", YAHOO_PAGER_PORT); int stringslen = 0; - - yd->url_datas = g_slist_remove(yd->url_datas, url_data); - - if(error_message != NULL || len == 0) { - purple_debug_error("yahoo", "Unable to retrieve server info. %" - G_GSIZE_FORMAT " bytes retrieved with error message: %s\n", len, - error_message ? error_message : "(null)"); + const gchar *got_data; + + yd->http_reqs = g_slist_remove(yd->http_reqs, http_conn); + + if (!purple_http_response_is_successfull(response)) { + purple_debug_error("yahoo", "Unable to retrieve server info: %s\n", + purple_http_response_get_error(response)); if(yahoo_is_japan(a)) { /* We don't know fallback hosts for Yahoo Japan :( */ purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, @@ -3613,7 +3579,8 @@ } } } else { - strings = g_strsplit(url_text, "\r\n", -1); + got_data = purple_http_response_get_data(response, NULL); + strings = g_strsplit(got_data, "\r\n", -1); if((stringslen = g_strv_length(strings)) > 1) { int i; @@ -3634,7 +3601,7 @@ _("Unable to connect")); } else { purple_debug_error("yahoo", "No CS address retrieved! Server " - "response:\n%s\n", url_text ? url_text : "(null)"); + "response:\n%s\n", got_data); if(yahoo_is_japan(a)) { /* We don't know fallback hosts for Yahoo Japan :( */ purple_connection_error(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, @@ -3655,11 +3622,10 @@ void yahoo_login(PurpleAccount *account) { PurpleConnection *gc = purple_account_get_connection(account); + PurpleHttpRequest *req; + PurpleHttpConnection *hc; YahooData *yd = g_new0(YahooData, 1); PurpleStatus *status = purple_account_get_active_status(account); - gboolean use_whole_url = yahoo_account_use_http_proxy(gc); - gboolean proxy_ssl = purple_account_get_bool(account, "proxy_ssl", FALSE); - PurpleUtilFetchUrlData *url_data; purple_connection_set_protocol_data(gc, yd); purple_connection_set_flags(gc, PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_NO_URLDESC); @@ -3693,14 +3659,12 @@ /* Get the pager server. Actually start connecting in the callback since we * must have the contents of the HTTP response to proceed. */ - url_data = purple_util_fetch_url_request( - proxy_ssl ? purple_connection_get_account(gc) : NULL, - yd->jp ? YAHOOJP_PAGER_HOST_REQ_URL : YAHOO_PAGER_HOST_REQ_URL, - use_whole_url ? TRUE : FALSE, - YAHOO_CLIENT_USERAGENT, FALSE, NULL, FALSE, -1, - yahoo_got_pager_server, yd); - if (url_data) - yd->url_datas = g_slist_prepend(yd->url_datas, url_data); + req = purple_http_request_new(yd->jp ? YAHOOJP_PAGER_HOST_REQ_URL : + YAHOO_PAGER_HOST_REQ_URL); + purple_http_request_header_set(req, "User-Agent", YAHOO_CLIENT_USERAGENT); + hc = purple_http_request(gc, req, yahoo_got_pager_server, yd); + purple_http_request_unref(req); + yd->http_reqs = g_slist_prepend(yd->http_reqs, hc); return; } @@ -3714,10 +3678,6 @@ yd->inpa = 0; } - while (yd->url_datas) { - purple_util_fetch_url_cancel(yd->url_datas->data); - yd->url_datas = g_slist_delete_link(yd->url_datas, yd->url_datas); - } while (yd->http_reqs) { purple_http_conn_cancel(yd->http_reqs->data); yd->http_reqs = g_slist_delete_link(yd->http_reqs, yd->http_reqs); @@ -4110,6 +4070,8 @@ yahoo_doodle_initiate(gc, purple_buddy_get_name(b)); } +#if 0 +/* XXX: it doesn't seems to work */ static void yahoo_userinfo_blist_node(PurpleBListNode *node, gpointer data) { @@ -4119,6 +4081,7 @@ yahoo_set_userinfo_for_buddy(gc, b); } +#endif static GList *yahoo_buddy_menu(PurpleBuddy *buddy) { @@ -4189,10 +4152,13 @@ m = g_list_append(m, act); } +#if 0 + /* XXX: it doesn't seems to work */ act = purple_menu_action_new(_("Set User Info..."), PURPLE_CALLBACK(yahoo_userinfo_blist_node), NULL, NULL); m = g_list_append(m, act); +#endif } return m; @@ -4220,33 +4186,34 @@ } static void -yahoo_get_inbox_token_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, - const gchar *token, size_t len, const gchar *error_message) +yahoo_get_inbox_token_cb(PurpleHttpConnection *http_conn, + PurpleHttpResponse *response, gpointer _unused) { - PurpleConnection *gc = user_data; - gboolean set_cookie = FALSE; + PurpleConnection *gc = + purple_http_conn_get_purple_connection(http_conn); gchar *url; YahooData *yd = purple_connection_get_protocol_data(gc); g_return_if_fail(PURPLE_CONNECTION_IS_VALID(gc)); - yd->url_datas = g_slist_remove(yd->url_datas, url_data); - - if (error_message != NULL) - purple_debug_error("yahoo", "Requesting mail login token failed: %s\n", error_message); - else if (len > 0 && token && *token) { - /* Should we not be hardcoding the rd url? */ + yd->http_reqs = g_slist_remove(yd->http_reqs, http_conn); + + if (!purple_http_response_is_successfull(response)) { + purple_debug_error("yahoo", + "Requesting mail login token failed: %s\n", + purple_http_response_get_error(response)); + url = g_strdup(yd->jp ? YAHOOJP_MAIL_URL : YAHOO_MAIL_URL); + } else { + /* Should we not be hardcoding the rd url? */ + gchar *token; + token = g_strdup(purple_http_response_get_data(response, NULL)); + g_strstrip(token); url = g_strdup_printf( "http://login.yahoo.com/config/reset_cookies_token?" ".token=%s" - "&.done=http://us.rd.yahoo.com/messenger/client/%%3fhttp://mail.yahoo.com/", - token); - set_cookie = TRUE; - } - - if (!set_cookie) { - purple_debug_error("yahoo", "No mail login token; forwarding to login screen.\n"); - url = g_strdup(yd->jp ? YAHOOJP_MAIL_URL : YAHOO_MAIL_URL); + "&.done=http://us.rd.yahoo.com/messenger/client/%%3f" + "http://mail.yahoo.com/", token); + purple_str_wipe(token); } /* Open the mailbox with the parsed url data */ @@ -4263,42 +4230,32 @@ PurpleConnection *gc = action->context; YahooData *yd = purple_connection_get_protocol_data(gc); - - PurpleUtilFetchUrlData *url_data; - const char* base_url = "http://login.yahoo.com"; - /* use whole URL if using HTTP Proxy */ - gboolean use_whole_url = yahoo_account_use_http_proxy(gc); - gchar *request = g_strdup_printf( - "POST %s/config/cookie_token HTTP/1.0\r\n" - "Cookie: T=%s; path=/; domain=.yahoo.com; Y=%s;\r\n" - "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" - "Host: login.yahoo.com\r\n" - "Content-Length: 0\r\n\r\n", - use_whole_url ? base_url : "", - yd->cookie_t, yd->cookie_y); - - url_data = purple_util_fetch_url_request( - purple_connection_get_account(gc), base_url, use_whole_url, - YAHOO_CLIENT_USERAGENT, TRUE, request, FALSE, -1, - yahoo_get_inbox_token_cb, gc); - - g_free(request); - - if (url_data != NULL) - yd->url_datas = g_slist_prepend(yd->url_datas, url_data); - else { - const char *yahoo_mail_url = (yd->jp ? YAHOOJP_MAIL_URL : YAHOO_MAIL_URL); - purple_debug_error("yahoo", - "Unable to request mail login token; forwarding to login screen."); - purple_notify_uri(gc, yahoo_mail_url); - } + PurpleHttpRequest *req; + PurpleHttpCookieJar *cookiejar; + PurpleHttpConnection *hc; + + req = purple_http_request_new( + "https://login.yahoo.com/config/cookie_token"); + purple_http_request_set_method(req, "POST"); + purple_http_request_header_set(req, "User-Agent", + YAHOO_CLIENT_USERAGENT); + cookiejar = purple_http_request_get_cookie_jar(req); + purple_http_cookie_jar_set(cookiejar, "T", yd->cookie_t); + purple_http_cookie_jar_set(cookiejar, "Y", yd->cookie_y); + hc = purple_http_request(gc, req, yahoo_get_inbox_token_cb, NULL); + purple_http_request_unref(req); + + yd->http_reqs = g_slist_prepend(yd->http_reqs, hc); } +#if 0 +/* XXX: it doesn't seems to work */ static void yahoo_set_userinfo_fn(PurplePluginAction *action) { yahoo_set_userinfo(action->context); } +#endif static void yahoo_show_act_id(PurplePluginAction *action) { @@ -4345,9 +4302,12 @@ GList *m = NULL; PurplePluginAction *act; +#if 0 + /* XXX: it doesn't seems to work */ act = purple_plugin_action_new(_("Set User Info..."), yahoo_set_userinfo_fn); m = g_list_append(m, act); +#endif act = purple_plugin_action_new(_("Activate ID..."), yahoo_show_act_id); @@ -4371,30 +4331,29 @@ char *what; }; -static void yahoo_get_sms_carrier_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, - const gchar *webdata, size_t len, const gchar *error_message) +static void yahoo_get_sms_carrier_cb(PurpleHttpConnection *http_conn, + PurpleHttpResponse *response, gpointer _sms_cb_data) { - struct yahoo_sms_carrier_cb_data *sms_cb_data = user_data; + struct yahoo_sms_carrier_cb_data *sms_cb_data = _sms_cb_data; PurpleConnection *gc = sms_cb_data->gc; YahooData *yd = purple_connection_get_protocol_data(gc); char *status = NULL; char *carrier = NULL; PurpleAccount *account = purple_connection_get_account(gc); - PurpleIMConversation *im = purple_conversations_find_im_with_account(sms_cb_data->who, account); - - yd->url_datas = g_slist_remove(yd->url_datas, url_data); - - if (error_message != NULL) { - purple_conversation_write(PURPLE_CONVERSATION(im), NULL, _("Can't send SMS. Unable to obtain mobile carrier."), - PURPLE_MESSAGE_SYSTEM, time(NULL)); + PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sms_cb_data->who, account); + + yd->http_reqs = g_slist_remove(yd->http_reqs, http_conn); + + if (!purple_http_response_is_successfull(response)) { + purple_conversation_write(conv, NULL, _("Can't send SMS. Unable to obtain mobile carrier."), PURPLE_MESSAGE_SYSTEM, time(NULL)); g_free(sms_cb_data->who); g_free(sms_cb_data->what); g_free(sms_cb_data); return ; - } - else if (len > 0 && webdata && *webdata) { - xmlnode *validate_data_root = xmlnode_from_str(webdata, -1); + } else { + const gchar *got_data = purple_http_response_get_data(response, NULL); + xmlnode *validate_data_root = xmlnode_from_str(got_data, -1); xmlnode *validate_data_child = xmlnode_get_child(validate_data_root, "mobile_no"); const char *mobile_no = xmlnode_get_attrib(validate_data_child, "msisdn"); @@ -4405,7 +4364,7 @@ validate_data_child = xmlnode_get_child(validate_data_root, "carrier"); carrier = xmlnode_get_data(validate_data_child); - purple_debug_info("yahoo", "SMS validate data: %s\n", webdata); + purple_debug_info("yahoo", "SMS validate data: %s\n", got_data); if (status && g_str_equal(status, "Valid")) { g_hash_table_insert(yd->sms_carrier, @@ -4433,11 +4392,11 @@ static void yahoo_get_sms_carrier(PurpleConnection *gc, gpointer data) { YahooData *yd = purple_connection_get_protocol_data(gc); - PurpleUtilFetchUrlData *url_data; + PurpleHttpRequest *req; + PurpleHttpCookieJar *cookiejar; + PurpleHttpConnection *hc; struct yahoo_sms_carrier_cb_data *sms_cb_data; char *validate_request_str = NULL; - char *request = NULL; - gboolean use_whole_url = FALSE; xmlnode *validate_request_root = NULL; xmlnode *validate_request_child = NULL; @@ -4457,38 +4416,22 @@ xmlnode_free(validate_request_child); xmlnode_free(validate_request_root); - request = g_strdup_printf( - "POST /mobileno?intl=us&version=%s HTTP/1.1\r\n" - "Cookie: T=%s; path=/; domain=.yahoo.com; Y=%s; path=/; domain=.yahoo.com;\r\n" - "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" - "Host: validate.msg.yahoo.com\r\n" - "Content-Length: %" G_GSIZE_FORMAT "\r\n" - "Cache-Control: no-cache\r\n\r\n%s", - YAHOO_CLIENT_VERSION, yd->cookie_t, yd->cookie_y, strlen(validate_request_str), validate_request_str); - - /* use whole URL if using HTTP Proxy */ - if ((purple_account_get_proxy_info(purple_connection_get_account(gc))) && (purple_proxy_info_get_type(purple_account_get_proxy_info(purple_connection_get_account(gc))) == PURPLE_PROXY_HTTP)) - use_whole_url = TRUE; - - url_data = purple_util_fetch_url_request( - purple_connection_get_account(gc), YAHOO_SMS_CARRIER_URL, use_whole_url, - YAHOO_CLIENT_USERAGENT, TRUE, request, FALSE, -1, - yahoo_get_sms_carrier_cb, data); - - g_free(request); + req = purple_http_request_new(NULL); + purple_http_request_set_url_printf(req, "http://validate.msg.yahoo.com" + "/mobileno?intl=us&version=%s", YAHOO_CLIENT_VERSION); + purple_http_request_set_method(req, "POST"); + purple_http_request_header_set(req, "User-Agent", + YAHOO_CLIENT_USERAGENT); + cookiejar = purple_http_request_get_cookie_jar(req); + purple_http_cookie_jar_set(cookiejar, "T", yd->cookie_t); + purple_http_cookie_jar_set(cookiejar, "Y", yd->cookie_y); + purple_http_request_set_contents(req, validate_request_str, -1); + hc = purple_http_request(gc, req, yahoo_get_sms_carrier_cb, data); + purple_http_request_unref(req); + + yd->http_reqs = g_slist_prepend(yd->http_reqs, hc); + g_free(validate_request_str); - - if (url_data) - yd->url_datas = g_slist_prepend(yd->url_datas, url_data); - else { - PurpleAccount *account = purple_connection_get_account(gc); - PurpleIMConversation *im = purple_conversations_find_im_with_account(sms_cb_data->who, account); - purple_conversation_write(PURPLE_CONVERSATION(im), NULL, _("Can't send SMS. Unable to obtain mobile carrier."), - PURPLE_MESSAGE_SYSTEM, time(NULL)); - g_free(sms_cb_data->who); - g_free(sms_cb_data->what); - g_free(sms_cb_data); - } } int yahoo_send_im(PurpleConnection *gc, const char *who, const char *what, PurpleMessageFlags flags)