# HG changeset patch # User Paul Aurich # Date 1242197447 0 # Node ID 53d4b3a1c80f3f0064a910d8ad7c755d8c574de4 # Parent 644606f508e6443986edca45db66dd308a0bf40b Whitespace, syntatic sugar, move the URLs to yahoo.h, and escape the token-fetching URL parameters. I'm appalled their server works if I pass https://login.yahoo.com/config/pwtoken_get?src=ymsgr&ts=&login=me&passwd=hunter2&chal=e^r-t*w%4+h&p^y-o|i|(p&l^z/a-j-l&x/r+h&q^u)/s/a&s|8&j/j^e*1+4|f diff -r 644606f508e6 -r 53d4b3a1c80f libpurple/protocols/yahoo/yahoo.c --- a/libpurple/protocols/yahoo/yahoo.c Tue May 12 00:50:45 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoo.c Wed May 13 06:50:47 2009 +0000 @@ -279,7 +279,7 @@ f->status = YAHOO_STATUS_OFFLINE; if (name) { purple_prpl_got_user_status(account, name, "offline", NULL); - purple_prpl_got_user_status_deactive(account, name, YAHOO_STATUS_TYPE_MOBILE); + purple_prpl_got_user_status_deactive(account, name, YAHOO_STATUS_TYPE_MOBILE); } break; } @@ -354,7 +354,7 @@ f->version_id = strtol(pair->value, NULL, 10); break; case 241: /* protocol buddy belongs to */ - if(strtol(pair->value, NULL, 10) == 2) { + if(strtol(pair->value, NULL, 10) == 2) { msn_name = g_strconcat("msn/", name, NULL); name = msn_name; } @@ -510,7 +510,7 @@ break; case 301: /* This is 319 before all s/n's in a group after the first. It is followed by an identical 300. */ - if(temp != NULL) { + if(temp != NULL) { if(protocol == 2) norm_bud = g_strconcat("msn/", temp, NULL); else @@ -528,7 +528,7 @@ purple_blist_add_buddy(b, NULL, g, NULL); } yahoo_do_group_check(account, ht, norm_bud, yd->current_list15_grp); - if(protocol != 0) { + if(protocol != 0) { f->protocol = protocol; purple_debug_info("yahoo", "Setting protocol to %d\n", f->protocol); } @@ -536,7 +536,7 @@ f->presence = YAHOO_PRESENCE_PERM_OFFLINE; /* set p2p status not connected and no p2p packet sent */ - if(protocol == 0) { + if(protocol == 0) { yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED); f->p2p_packet_sent = 0; } else @@ -776,7 +776,7 @@ if (!g_ascii_strncasecmp(msg, "TYPING", strlen("TYPING")) && (purple_privacy_check(account, from))) { - if(msn) { + if(msn) { if (*stat == '1') serv_got_typing(gc, msn_from, 0, PURPLE_TYPING); else @@ -841,7 +841,7 @@ while (l != NULL) { struct yahoo_pair *pair = l->data; - if (pair->key == 4) { + if (pair->key == 4) { sms = g_new0(struct _yahoo_im, 1); sms->from = g_strdup_printf("+%s", pair->value); sms->time = time(NULL); @@ -859,8 +859,8 @@ l = l->next; } - if( (pkt->status == -1) || (pkt->status == YAHOO_STATUS_DISCONNECTED) ) { - if (server_msg) { + if( (pkt->status == -1) || (pkt->status == YAHOO_STATUS_DISCONNECTED) ) { + if (server_msg) { PurpleConversation *c; c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sms->from, account); if (c == NULL) @@ -927,7 +927,7 @@ if (im) im->msg = pair->value; } - if (pair->key == 241) { + if (pair->key == 241) { if(strtol(pair->value, NULL, 10) == 2) msn = TRUE; } @@ -1025,7 +1025,7 @@ if (!strcmp(m, "")) { char *username; - if(c == NULL) { + if(c == NULL) { if(msn) c = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, msn_from); else @@ -1055,7 +1055,7 @@ g_free(m2); /* laters : implement buddy icon for msn friends */ - if(!msn) { + if(!msn) { if ((f = yahoo_friend_find(gc, im->from)) && im->buddy_icon == 2) { if (yahoo_friend_get_buddy_icon_need_request(f)) { yahoo_send_picture_request(gc, im->from); @@ -1579,8 +1579,8 @@ md5_cipher = purple_ciphers_find_cipher("md5"); md5_ctx = purple_cipher_context_new(md5_cipher, NULL); - purple_cipher_context_append(md5_ctx,(guchar *)crypt, strlen(crypt)); - purple_cipher_context_digest(md5_ctx, sizeof(md5_digest),md5_digest, NULL); + purple_cipher_context_append(md5_ctx, (guchar *)crypt, strlen(crypt)); + purple_cipher_context_digest(md5_ctx, sizeof(md5_digest), md5_digest, NULL); to_y64(base64_string, md5_digest, 16); @@ -1632,7 +1632,7 @@ g_return_if_fail(PURPLE_CONNECTION_IS_VALID(gc)); - if (error_message != NULL) { + if (error_message != NULL) { purple_debug_error("yahoo", "Login Failed, unable to retrieve stage 2 url: %s\n", error_message); purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_message); g_free(auth_data->seed); @@ -1642,21 +1642,21 @@ else if (len > 0 && ret_data && *ret_data) { split_data = g_strsplit(ret_data, "\r\n", -1); totalelements = g_strv_length(split_data); - if(totalelements >= 5) { - response_no = strtol(*(split_data+1), NULL, 10); - crumb = g_strdup(*(split_data+2)+6); - yd->cookie_y = g_strdup(*(split_data+3)+2); - yd->cookie_t = g_strdup(*(split_data+4)+2); + if (totalelements >= 5) { + response_no = strtol(split_data[1], NULL, 10); + crumb = g_strdup(split_data[2] + 6); + yd->cookie_y = g_strdup(split_data[3] + 2); + yd->cookie_t = g_strdup(split_data[4] + 2); } else response_no = -1; g_strfreev(split_data); - if(response_no != 0) { + if(response_no != 0) { /* Some error in the login process */ PurpleConnectionError error; - switch(response_no) { + switch(response_no) { case -1: /* Some error in the received stream */ error_reason = g_strdup(_("Error in the received data")); @@ -1669,7 +1669,7 @@ 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((crumb != NULL) && (yd->cookie_y != NULL) && (yd->cookie_t != NULL)) { try_login_on_error = TRUE; break; } @@ -1677,13 +1677,13 @@ error = PURPLE_CONNECTION_ERROR_OTHER_ERROR; break; } - if(error_reason) { + if(error_reason) { purple_debug_error("yahoo","Authentication error: %s", error_reason); purple_connection_error_reason(gc, error, error_reason); g_free(error_reason); } } - if((response_no == 0) || try_login_on_error) { + if((response_no == 0) || try_login_on_error) { crypt = g_strconcat(crumb, auth_data->seed, NULL); yahoo_auth16_stage3(gc, crypt); g_free(crumb); @@ -1708,7 +1708,7 @@ g_return_if_fail(PURPLE_CONNECTION_IS_VALID(gc)); - if (error_message != NULL) { + if (error_message != NULL) { purple_debug_error("yahoo", "Login Failed, unable to retrieve login url: %s\n", error_message); purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_message); g_free(auth_data->seed); @@ -1719,19 +1719,19 @@ split_data = g_strsplit(ret_data, "\r\n", -1); totalelements = g_strv_length(split_data); - if(totalelements >= 5) { - response_no = strtol(*(split_data+1), NULL, 10); - token = g_strdup(*(split_data+2)+6); + if(totalelements >= 5) { + response_no = strtol(split_data[1], NULL, 10); + token = g_strdup(split_data[2] + 6); } else response_no = -1; g_strfreev(split_data); - if(response_no != 0) { + if(response_no != 0) { /* Some error in the login process */ PurpleConnectionError error; - switch(response_no) { + switch(response_no) { case -1: /* Some error in the received stream */ error_reason = g_strdup(_("Error in the received data")); @@ -1780,10 +1780,7 @@ gboolean yahoojp = purple_account_get_bool(purple_connection_get_account(gc), "yahoojp", 0); - url = g_strdup_printf(yahoojp ? - "https://login.yahoo.co.jp/config/pwtoken_login?src=ymsgr&ts=&token=%s" : - "https://login.yahoo.com/config/pwtoken_login?src=ymsgr&ts=&token=%s", - token); + url = g_strdup_printf(yahoojp ? YAHOOJP_LOGIN_URL : YAHOO_LOGIN_URL, token); url_data2 = purple_util_fetch_url_request(url, TRUE, "Mozilla/4.0 (compatible; MSIE 5.5)", TRUE, NULL, FALSE, yahoo_auth16_stage2, auth_data); g_free(url); g_free(token); @@ -1796,6 +1793,8 @@ PurpleUtilFetchUrlData *url_data = NULL; struct yahoo_auth_data *auth_data = NULL; char *url = NULL; + char *encoded_username; + char *encoded_password; gboolean yahoojp; purple_debug_info("yahoo","Authentication: In yahoo_auth16_stage1\n"); @@ -1811,11 +1810,12 @@ auth_data->gc = gc; auth_data->seed = g_strdup(seed); - url = g_strdup_printf(yahoojp ? - "https://login.yahoo.co.jp/config/pwtoken_get?src=ymsgr&ts=&login=%s&passwd=%s&chal=%s" : - "https://login.yahoo.com/config/pwtoken_get?src=ymsgr&ts=&login=%s&passwd=%s&chal=%s", - purple_account_get_username(purple_connection_get_account(gc)), - purple_connection_get_password(gc), seed); + 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); + g_free(encoded_username); url_data = purple_util_fetch_url_request(url, TRUE, "Mozilla/4.0 (compatible; MSIE 5.5)", TRUE, NULL, FALSE, yahoo_auth16_stage1_cb, auth_data); g_free(url); @@ -2087,10 +2087,10 @@ if(protocol) f->protocol = protocol; - if( !g_hash_table_lookup(yd->peers, who) ) { + if( !g_hash_table_lookup(yd->peers, who) ) { /* we are not connected as client, so set friend to not connected */ if(msn) - yahoo_friend_set_p2p_status(f,YAHOO_P2PSTATUS_DO_NOT_CONNECT); + yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_DO_NOT_CONNECT); else { yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED); f->p2p_packet_sent = 0; @@ -2226,7 +2226,7 @@ * WHEN WE ARE SERVER: we send val_13 = 0 to yahoo server, peer sends us val_13 = 1, we send val_13 = 5, * receive val_13 = 6, send val_13 = 7, receive val_13 = 7. HALT. Keep sending val_13 = 7 as keep alive. */ - switch(p2p_data->val_13) { + switch(p2p_data->val_13) { case 1 : val_13_to_send = 5; break; case 5 : val_13_to_send = 6; break; case 6 : val_13_to_send = 7; break; @@ -2251,12 +2251,12 @@ yahoo_packet_free(pkt_to_send); if( val_13_to_send == 7 ) - if( !g_hash_table_lookup(yd->peers, p2p_data->host_username) ) { + if( !g_hash_table_lookup(yd->peers, p2p_data->host_username) ) { g_hash_table_insert(yd->peers, g_strdup(p2p_data->host_username), p2p_data); /* If the peer is a friend, set him connected */ f = yahoo_friend_find(p2p_data->gc, p2p_data->host_username); - if (f) { - if(p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER) { + if (f) { + if(p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER) { p2p_data->session_id = f->session_id; yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_WE_ARE_SERVER); } @@ -2329,7 +2329,7 @@ yahoo_packet_read(pkt, buf + pos, pktlen); /* packet processing */ - switch(pkt->service) { + switch(pkt->service) { case YAHOO_SERVICE_P2PFILEXFER: yahoo_p2p_process_p2pfilexfer(data, source, pkt); break; @@ -2415,7 +2415,7 @@ if(!(p2p_data = data)) return ; - if(listenfd == -1) { + if(listenfd == -1) { purple_debug_warning("yahoo","p2p: error starting p2p server\n"); yahoo_p2p_disconnect_destroy_data(data); return; @@ -2516,7 +2516,7 @@ return ; yd = p2p_data->gc->proto_data; - if(error_message != NULL) { + if(error_message != NULL) { purple_debug_warning("yahoo","p2p: %s\n",error_message); yahoo_send_p2p_pkt(p2p_data->gc, p2p_data->host_username, 2);/* send p2p init packet with val_13=2 */ @@ -2623,7 +2623,7 @@ account = purple_connection_get_account(gc); - if(val_11==0) { + if(val_11==0) { if(!f) return; else @@ -2640,7 +2640,7 @@ p2p_data->source = -1; /* connect to host */ - if((purple_proxy_connect(NULL, account, host_ip, YAHOO_PAGER_PORT_P2P, yahoo_p2p_init_cb, p2p_data))==NULL) { + if((purple_proxy_connect(NULL, account, host_ip, YAHOO_PAGER_PORT_P2P, yahoo_p2p_init_cb, p2p_data))==NULL) { purple_debug_info("yahoo","p2p: Connection to %s failed\n", host_ip); g_free(p2p_data->host_ip); g_free(p2p_data->host_username); @@ -3072,7 +3072,7 @@ i += strlen("Set-Cookie: "); for (;*i != ';' && *i != '\0'; i++) g_string_append_c(s, *i); - + g_string_append(s, "; "); /* Should these cookies be included too when trying for xfer? * It seems to work without these @@ -4019,7 +4019,7 @@ PurpleAccount *account = purple_connection_get_account(gc); PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sms_cb_data->who, account); - if (error_message != NULL) { + if (error_message != NULL) { purple_conversation_write(conv, NULL, "Cant send SMS, Unable to obtain mobile carrier", PURPLE_MESSAGE_SYSTEM, time(NULL)); g_free(sms_cb_data->who); @@ -4041,7 +4041,7 @@ purple_debug_info("yahoo","SMS validate data: Mobile:%s, Status:%s, Carrier:%s\n", mobile_no, status, carrier); - if( strcmp(status, "Valid") == 0) { + if( strcmp(status, "Valid") == 0) { g_hash_table_insert(yd->sms_carrier, g_strdup_printf("+%s", mobile_no), g_strdup(carrier)); yahoo_send_im(sms_cb_data->gc, sms_cb_data->who, sms_cb_data->what, PURPLE_MESSAGE_SEND); } @@ -4108,7 +4108,7 @@ g_free(request); g_free(validate_request_str); - if (!url_data) { + if (!url_data) { PurpleAccount *account = purple_connection_get_account(gc); PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sms_cb_data->who, account); purple_conversation_write(conv, NULL, "Cant send SMS, Unable to obtain mobile carrier", PURPLE_MESSAGE_SYSTEM, time(NULL)); @@ -4151,7 +4151,7 @@ msn = g_str_has_prefix(who, "msn/") || g_str_has_prefix(who, "MSN/"); - if( strncmp(who, "+", 1) == 0 ) { + if( strncmp(who, "+", 1) == 0 ) { /* we have an sms to be sent */ gchar *carrier = NULL; const char *alias = NULL; @@ -4159,7 +4159,7 @@ PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, account); carrier = g_hash_table_lookup(yd->sms_carrier, who); - if (!carrier) { + if (!carrier) { struct yahoo_sms_carrier_cb_data *sms_cb_data; sms_cb_data = g_malloc(sizeof(struct yahoo_sms_carrier_cb_data)); sms_cb_data->gc = gc; @@ -4201,7 +4201,7 @@ } pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YAHOO_STATUS_OFFLINE, 0); - if(msn) { + if(msn) { yahoo_packet_hash(pkt, "ss", 1, purple_connection_get_display_name(gc), 5, who+4); yahoo_packet_hash_int(pkt, 241, 2); } @@ -4248,9 +4248,9 @@ yahoo_packet_hash_str(pkt, 206, "2"); /* We may need to not send any packets over 2000 bytes, but I'm not sure yet. */ - if ((YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt)) <= 2000) { + if ((YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt)) <= 2000) { /* if p2p link exists, send through it. To-do: key 15, time value to be sent in case of p2p */ - if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn ) { + if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn ) { yahoo_packet_hash_int(pkt, 11, p2p_data->session_id); yahoo_p2p_write_pkt(p2p_data->source, pkt); } @@ -4285,7 +4285,7 @@ pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YAHOO_STATUS_TYPING, 0); /* check to see if p2p link exists, send through it */ - if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn ) { + if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn ) { yahoo_packet_hash(pkt, "sssssis", 49, "TYPING", 1, purple_connection_get_display_name(gc), 14, " ", 13, state == PURPLE_TYPING ? "1" : "0", 5, who, 11, p2p_data->session_id, 1002, "1"); /* To-do: key 15 to be sent in case of p2p */ @@ -4556,7 +4556,7 @@ group2 = yahoo_string_encode(gc, group, NULL); pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0); - if(msn) { + if(msn) { yahoo_packet_hash(pkt, "sssssssssss", 14, "", 65, group2, @@ -4719,7 +4719,7 @@ if (!f) return; - if(f->protocol == 2) { + if(f->protocol == 2) { msn = TRUE; temp = who+4; } else diff -r 644606f508e6 -r 53d4b3a1c80f libpurple/protocols/yahoo/yahoo.h --- a/libpurple/protocols/yahoo/yahoo.h Tue May 12 00:50:45 2009 +0000 +++ b/libpurple/protocols/yahoo/yahoo.h Wed May 13 06:50:47 2009 +0000 @@ -31,6 +31,10 @@ #define YAHOO_PAGER_HOST "scs.msg.yahoo.com" #define YAHOO_PAGER_PORT 5050 #define YAHOO_PAGER_PORT_P2P 5101 +#define YAHOO_LOGIN_URL "https://login.yahoo.com/config/pwtoken_login?src=ymsgr&ts=&token=%s" + +#define YAHOO_AUTH_URL "https://login.yahoo.co.jp/config/pwtoken_login?src=ymsgr&ts=&token=%s" +#define YAHOO_TOKEN_URL "https://login.yahoo.com/config/pwtoken_get?src=ymsgr&ts=&login=%s&passwd=%s&chal=%s" #define YAHOO_P2P_KEEPALIVE_SECS 300 #define YAHOO_P2P_SERVER_TIMEOUT 10 #define YAHOO_PROFILE_URL "http://profiles.yahoo.com/" @@ -44,6 +48,8 @@ /* really we should get the list of servers from http://update.messenger.yahoo.co.jp/servers.html */ #define YAHOOJP_PAGER_HOST "cs.yahoo.co.jp" +#define YAHOOJP_TOKEN_URL "https://login.yahoo.co.jp/config/pwtoken_get?src=ymsgr&ts=&login=%s&passwd=%s&chal=%s" +#define YAHOOJP_LOGIN_URL "https://login.yahoo.co.jp/config/pwtoken_login?src=ymsgr&ts=&token=%s" #define YAHOOJP_PROFILE_URL "http://profiles.yahoo.co.jp/" #define YAHOOJP_MAIL_URL "http://mail.yahoo.co.jp/" #define YAHOOJP_XFER_HOST "filetransfer.msg.yahoo.co.jp"