diff libpurple/protocols/msn/oim.c @ 21107:ca624eda4267

merge of '3380c786d272dcd9ab1360f49c3e4e51227af663' and 'c0e79d15a4fe4c5b0129fcae5060754b25f72a56'
author Ka-Hing Cheung <khc@hxbc.us>
date Wed, 24 Oct 2007 06:45:26 +0000
parents f387e8c671a4 90fd0826c6ce
children 7ac87187bbec
line wrap: on
line diff
--- a/libpurple/protocols/msn/oim.c	Wed Oct 24 02:48:32 2007 +0000
+++ b/libpurple/protocols/msn/oim.c	Wed Oct 24 06:45:26 2007 +0000
@@ -139,7 +139,6 @@
 	gpointer data)
 {
 	MsnOim *oim = data;
-	xmlnode	*faultNode, *challengeNode;
 	MsnOimSendReq *msg = g_queue_pop_head(oim->send_queue);
 
 	g_return_if_fail(msg != NULL);
@@ -147,34 +146,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;
+					}
+				}
 			}
 		}
 	}