void yahoo_fetch_aliases(PurpleConnection *gc) { YahooData *yd = gc->proto_data; const char *url; gchar *request, *webpage, *webaddress; PurpleUtilFetchUrlData *url_data; /* use whole URL if using HTTP Proxy */ gboolean use_whole_url = yahoo_account_use_http_proxy(gc); /* Build all the info to make the web request */ url = yd->jp ? YAHOOJP_ALIAS_FETCH_URL : YAHOO_ALIAS_FETCH_URL; purple_url_parse(url, &webaddress, NULL, &webpage, NULL, NULL); request = g_strdup_printf("GET %s%s/%s HTTP/1.1\r\n" "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" "Cookie: T=%s; Y=%s\r\n" "Host: %s\r\n" "Cache-Control: no-cache\r\n\r\n", use_whole_url ? "http://" : "", use_whole_url ? webaddress : "", webpage, yd->cookie_t, yd->cookie_y, webaddress); /* We have a URL and some header information, let's connect and get some aliases */ url_data = purple_util_fetch_url_request_len_with_account(purple_connection_get_account(gc), url, use_whole_url, NULL, TRUE, request, FALSE, -1, yahoo_fetch_aliases_cb, gc); if (url_data != NULL) yd->url_datas = g_slist_prepend(yd->url_datas, url_data); g_free(webaddress); g_free(webpage); g_free(request); }
void yahoo_process_picture(PurpleConnection *gc, struct yahoo_packet *pkt) { YahooData *yd; GSList *l = pkt->hash; char *who = NULL; gboolean got_icon_info = FALSE, send_icon_info = FALSE; char *url = NULL; int checksum = 0; while (l) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 1: case 4: if (g_utf8_validate(pair->value, -1, NULL)) { who = pair->value; } else { purple_debug_warning("yahoo", "yahoo_process_picture " "got non-UTF-8 string for key %d\n", pair->key); } break; case 5: /* us */ break; case 13: { int tmp; tmp = strtol(pair->value, NULL, 10); if (tmp == 1) { send_icon_info = TRUE; } else if (tmp == 2) { got_icon_info = TRUE; } break; } case 20: if (g_utf8_validate(pair->value, -1, NULL)) { url = pair->value; } else { purple_debug_warning("yahoo", "yahoo_process_picture " "got non-UTF-8 string for key %d\n", pair->key); } break; case 192: checksum = strtol(pair->value, NULL, 10); break; } l = l->next; } if (!who) return; if (!purple_privacy_check(purple_connection_get_account(gc), who)) { purple_debug_info("yahoo", "Picture packet from %s dropped.\n", who); return; } /* Yahoo IM 6 spits out 0.png as the URL if the buddy icon is not set */ if (who && got_icon_info && url && !g_ascii_strncasecmp(url, "http://", 7)) { /* TODO: make this work p2p, try p2p before the url */ PurpleUtilFetchUrlData *url_data; struct yahoo_fetch_picture_data *data; /* use whole URL if using HTTP Proxy */ gboolean use_whole_url = yahoo_account_use_http_proxy(gc); data = g_new0(struct yahoo_fetch_picture_data, 1); data->gc = gc; data->who = g_strdup(who); data->checksum = checksum; /* TODO: Does this need to be MSIE 5.0? */ url_data = purple_util_fetch_url(url, use_whole_url, "Mozilla/4.0 (compatible; MSIE 5.5)", FALSE, yahoo_fetch_picture_cb, data); if (url_data != NULL) { yd = gc->proto_data; yd->url_datas = g_slist_prepend(yd->url_datas, url_data); } } else if (who && send_icon_info) {
void yahoo_update_alias(PurpleConnection *gc, const char *who, const char *alias) { YahooData *yd; const char *url; gchar *content, *request, *webpage, *webaddress; struct callback_data *cb; PurpleUtilFetchUrlData *url_data; YahooFriend *f; /* use whole URL if using HTTP Proxy */ gboolean use_whole_url = yahoo_account_use_http_proxy(gc); g_return_if_fail(who != NULL); g_return_if_fail(gc != NULL); if (alias == NULL) alias = ""; f = yahoo_friend_find(gc, who); if (f == NULL) { purple_debug_error("yahoo", "Missing YahooFriend. Unable to set server alias.\n"); return; } yd = gc->proto_data; /* Using callback_data so I have access to gc in the callback function */ cb = g_new0(struct callback_data, 1); cb->who = g_strdup(who); cb->id = g_strdup(yahoo_friend_get_alias_id(f)); cb->gc = gc; /* Build all the info to make the web request */ url = yd->jp ? YAHOOJP_ALIAS_UPDATE_URL: YAHOO_ALIAS_UPDATE_URL; purple_url_parse(url, &webaddress, NULL, &webpage, NULL, NULL); if (cb->id == NULL) { /* No id for this buddy, so create an address book entry */ purple_debug_info("yahoo", "Creating '%s' as new alias for user '%s'\n", alias, who); if (yd->jp) { gchar *alias_jp = g_convert(alias, -1, "EUC-JP", "UTF-8", NULL, NULL, NULL); gchar *converted_alias_jp = yahoo_convert_to_numeric(alias_jp); content = g_strdup_printf("<ab k=\"%s\" cc=\"9\">\n" "<ct a=\"1\" yi='%s' nn='%s' />\n</ab>\r\n", purple_account_get_username(gc->account), who, converted_alias_jp); g_free(converted_alias_jp); g_free(alias_jp); } else { gchar *escaped_alias = g_markup_escape_text(alias, -1); content = g_strdup_printf("<?xml version=\"1.0\" encoding=\"utf-8\"?><ab k=\"%s\" cc=\"9\">\n" "<ct a=\"1\" yi='%s' nn='%s' />\n</ab>\r\n", purple_account_get_username(gc->account), who, escaped_alias); g_free(escaped_alias); } } else { purple_debug_info("yahoo", "Updating '%s' as new alias for user '%s'\n", alias, who); if (yd->jp) { gchar *alias_jp = g_convert(alias, -1, "EUC-JP", "UTF-8", NULL, NULL, NULL); gchar *converted_alias_jp = yahoo_convert_to_numeric(alias_jp); content = g_strdup_printf("<ab k=\"%s\" cc=\"1\">\n" "<ct e=\"1\" yi='%s' id='%s' nn='%s' pr='0' />\n</ab>\r\n", purple_account_get_username(gc->account), who, cb->id, converted_alias_jp); g_free(converted_alias_jp); g_free(alias_jp); } else { gchar *escaped_alias = g_markup_escape_text(alias, -1); content = g_strdup_printf("<?xml version=\"1.0\" encoding=\"utf-8\"?><ab k=\"%s\" cc=\"1\">\n" "<ct e=\"1\" yi='%s' id='%s' nn='%s' pr='0' />\n</ab>\r\n", purple_account_get_username(gc->account), who, cb->id, escaped_alias); g_free(escaped_alias); } } request = g_strdup_printf("POST %s%s/%s HTTP/1.1\r\n" "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n" "Cookie: T=%s; Y=%s\r\n" "Host: %s\r\n" "Content-Length: %" G_GSIZE_FORMAT "\r\n" "Cache-Control: no-cache\r\n\r\n" "%s", use_whole_url ? "http://" : "", use_whole_url ? webaddress : "", webpage, yd->cookie_t, yd->cookie_y, webaddress, strlen(content), content); /* We have a URL and some header information, let's connect and update the alias */ url_data = purple_util_fetch_url_request_len_with_account( purple_connection_get_account(gc), url, use_whole_url, NULL, TRUE, request, FALSE, -1, yahoo_update_alias_cb, cb); if (url_data != NULL) yd->url_datas = g_slist_prepend(yd->url_datas, url_data); g_free(webpage); g_free(webaddress); g_free(content); g_free(request); }