Mercurial > pidgin
diff libpurple/protocols/msn/oim.c @ 21110:dead11aac1bc
merge_into_workspace of ad5838522d44d037dc333469f1ab6df844ca1875
author | Ka-Hing Cheung <khc@hxbc.us> |
---|---|
date | Tue, 30 Oct 2007 06:37:35 +0000 |
parents | 741c3b5eac21 e64e6fbd1351 |
children | c5df2bf2bf8e |
line wrap: on
line diff
--- a/libpurple/protocols/msn/oim.c Sun Oct 14 22:18:59 2007 +0000 +++ b/libpurple/protocols/msn/oim.c Tue Oct 30 06:37:35 2007 +0000 @@ -138,7 +138,6 @@ gpointer data) { MsnOim *oim = data; - xmlnode *faultNode, *challengeNode; MsnOimSendReq *msg = g_queue_pop_head(oim->send_queue); g_return_if_fail(msg != NULL); @@ -146,34 +145,54 @@ if (response == NULL) { purple_debug_info("MSNP14", "cannot send OIM: %s\n", msg->oim_msg); } else { - faultNode = msn_soap_xml_get(response->xml, "Body/Fault"); + xmlnode *faultNode = msn_soap_xml_get(response->xml, "Body/Fault"); if (faultNode == NULL) { /*Send OK! return*/ purple_debug_info("MSNP14", "sent OIM: %s\n", msg->oim_msg); } else { - /*get the challenge,and repost it*/ - challengeNode = msn_soap_xml_get(faultNode, - "detail/LockKeyChallenge"); + xmlnode *faultcode = xmlnode_get_child(faultNode, "faultcode"); + + if (faultcode) { + char *faultcode_str = xmlnode_get_data(faultcode); - if (challengeNode == NULL) { - purple_debug_info("MSNP14", "can't find lock key for OIM: %s\n", msg); - } else { - char buf[33]; + if (g_str_equal(faultcode_str, "q0:AuthenticationFailed")) { + xmlnode *challengeNode = msn_soap_xml_get(faultNode, + "detail/LockKeyChallenge"); + + if (challengeNode == NULL) { + if (oim->challenge) { + g_free(oim->challenge); + oim->challenge = NULL; - char *challenge = xmlnode_get_data(challengeNode); - msn_handle_chl(challenge, buf); + purple_debug_info("msnoim","resending OIM: %s\n", + msg->oim_msg); + g_queue_push_head(oim->send_queue, msg); + msn_oim_send_msg(oim); + return; + } else { + purple_debug_info("msnoim", + "can't find lock key for OIM: %s\n", + msg->oim_msg); + } + } else { + char buf[33]; - g_free(oim->challenge); - oim->challenge = g_strndup(buf, sizeof(buf)); - g_free(challenge); - purple_debug_info("MSNP14","lockkey:{%s}\n",oim->challenge); + char *challenge = xmlnode_get_data(challengeNode); + msn_handle_chl(challenge, buf); + + g_free(oim->challenge); + oim->challenge = g_strndup(buf, sizeof(buf)); + g_free(challenge); + purple_debug_info("MSNP14","lockkey:{%s}\n",oim->challenge); - /*repost the send*/ - purple_debug_info("MSNP14","resending OIM: %s\n", msg->oim_msg); - g_queue_push_head(oim->send_queue, msg); - msn_oim_send_msg(oim); - return; + /*repost the send*/ + purple_debug_info("MSNP14","resending OIM: %s\n", msg->oim_msg); + g_queue_push_head(oim->send_queue, msg); + msn_oim_send_msg(oim); + return; + } + } } } }