libpurple/protocols/yahoo/libymsg.c

branch
soc.2013.gobjectification
changeset 34703
caf380128870
parent 34699
09b2c9219b57
parent 34235
35b02d591bd9
child 34704
918042654cac
--- 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)

mercurial