Correctly process an additional <Service> with type Profile and name 'Messenger Roaming Identity' sent with the contact list using a recently registered WLM account, that was causing the initial ADL command to be sent malformed, and our presence status not being forwarded to our buddies cpw.khc.msnp14

Sat, 14 Jul 2007 00:04:48 +0000

author
Carlos Silva <typ0@pidgin.im>
date
Sat, 14 Jul 2007 00:04:48 +0000
branch
cpw.khc.msnp14
changeset 20546
35d778ab0450
parent 20545
383fd2ad3500
child 20547
35cff3479def

Correctly process an additional <Service> with type Profile and name 'Messenger Roaming Identity' sent with the contact list using a recently registered WLM account, that was causing the initial ADL command to be sent malformed, and our presence status not being forwarded to our buddies

libpurple/protocols/msn/contact.c file | annotate | diff | comparison | revisions
libpurple/protocols/msn/notification.c file | annotate | diff | comparison | revisions
libpurple/protocols/msn/userlist.c file | annotate | diff | comparison | revisions
libpurple/xmlnode.h file | annotate | diff | comparison | revisions
--- a/libpurple/protocols/msn/contact.c	Mon Jul 09 17:59:36 2007 +0000
+++ b/libpurple/protocols/msn/contact.c	Sat Jul 14 00:04:48 2007 +0000
@@ -90,6 +90,9 @@
 static int
 msn_get_memberrole(char * role)
 {
+	
+	purple_debug_info("::","msn_get_memberrole()\n");
+
 	if(!strcmp(role,"Allow")){
 		return MSN_LIST_AL_OP;
 	}else if(!strcmp(role,"Block")){
@@ -124,25 +127,31 @@
 msn_parse_contact_list(MsnContact * contact)
 {
 	MsnSession * session;
-	int list_op =0;
-	char * passport;
-	xmlnode * node,*body,*response,*result,*services;
-	xmlnode *service,*memberships;
+	int list_op = 0;
+	char * passport, *debugdata, *typedata;
+	xmlnode *node, *body, *response, *result, *services;
+	xmlnode *service, *memberships, *info, *handle, *handletype;
 	xmlnode *LastChangeNode;
-	xmlnode *membershipnode,*members,*member,*passportNode;
+	xmlnode *membershipnode, *members, *member, *passportNode;
 	char *LastChangeStr;
 
+	purple_debug_info("::","msn_parse_contact_list()\n");
+
 	session = contact->session;
-	purple_debug_misc("MSNCL","parse contact list:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len);
-	node = 	xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len);
+	node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len);
+
+	debugdata = xmlnode_to_formatted_str(node, NULL);
+	purple_debug_info("MSNCL","Received contact list, parsing:\n%s",debugdata);
+	g_free(debugdata);
 
 	if(node == NULL){
-		purple_debug_misc("MSNCL","parse contact from str err!\n");
+		purple_debug_error("MSNCL","Unable to parse SOAP data!\n");
 		return;
 	}
-	purple_debug_misc("MSNCL","node{%p},name:%s,child:%s,last:%s\n",node,node->name,node->child->name,node->lastchild->name);
+
+	purple_debug_info("MSNCL","Root node @ %p: Name: '%s', child: '%s', lastchild: '%s'\n",node,node->name,node->child->name,node->lastchild->name);
 	body = xmlnode_get_child(node,"Body");
-	purple_debug_misc("MSNCL","body{%p},name:%s\n",body,body->name);
+	purple_debug_info("MSNCL","Body @ %p:  Name: '%s'\n",body,body->name);
 	response = xmlnode_get_child(body,"FindMembershipResponse");
 
 	if (response == NULL) {
@@ -154,77 +163,115 @@
 		msn_get_contact_list(contact, NULL);
 		return;
 	}
+	purple_debug_info("MSNCL","Response @ %p: Name: '%s'\n",response,response->name);
 
-	purple_debug_misc("MSNCL","response{%p},name:%s\n",response,response->name);
-	result =xmlnode_get_child(response,"FindMembershipResult");
+	result = xmlnode_get_child(response,"FindMembershipResult");
 	if(result == NULL){
-		purple_debug_misc("MSNCL","receive No Update!\n");
-		return;
-	}
-	purple_debug_misc("MSNCL","result{%p},name:%s\n",result,result->name);
-	services =xmlnode_get_child(result,"Services");
-	purple_debug_misc("MSNCL","services{%p},name:%s\n",services,services->name);
-	service =xmlnode_get_child(services,"Service");
-	purple_debug_misc("MSNCL","service{%p},name:%s\n",service,service->name);
-	
-	/*Last Change Node*/
-	LastChangeNode = xmlnode_get_child(service,"LastChange");
-	LastChangeStr = xmlnode_get_data(LastChangeNode);
-	purple_debug_misc("MSNCL","LastChangeNode0 %s\n",LastChangeStr);	
-	purple_account_set_string(session->account, "CLLastChange",LastChangeStr);
-	purple_debug_misc("MSNCL","LastChangeNode %s\n",LastChangeStr);
-	
-	memberships =xmlnode_get_child(service,"Memberships");
-	if (memberships == NULL) {
-		xmlnode_free(node);
+		purple_debug_warning("MSNCL","receive No Update!\n");
 		return;
 	}
-	purple_debug_misc("MSNCL","memberships{%p},name:%s\n",memberships,memberships->name);
-	for(membershipnode = xmlnode_get_child(memberships, "Membership"); membershipnode;
-					membershipnode = xmlnode_get_next_twin(membershipnode)){
-		xmlnode *roleNode;
-		char *role;
-		roleNode = xmlnode_get_child(membershipnode,"MemberRole");
-		role=xmlnode_get_data(roleNode);
-		list_op = msn_get_memberrole(role);
-		purple_debug_misc("MSNCL","MemberRole role:%s,list_op:%d\n",role,list_op);
-		g_free(role);
-		members = xmlnode_get_child(membershipnode,"Members");
-		for(member = xmlnode_get_child(members, "Member"); member;
-				member = xmlnode_get_next_twin(member)){
-			MsnUser *user;
-			xmlnode * typeNode;
-			char * type;
+	purple_debug_info("MSNCL","Result @ %p: Name: '%s'\n",result,result->name);
+
+	services = xmlnode_get_child(result,"Services");
+	purple_debug_info("MSNCL","Services @ %p\n",services);
+	
+	for( service = xmlnode_get_child(services, "Service"); service;
+	                                service = xmlnode_get_next_twin(service)) {
+		purple_debug_info("MSNCL","Service @ %p\n",service);
+	
+		if ( (info = xmlnode_get_child(service,"Info")) == NULL ) {
+			purple_debug_error("MSNCL","Error getting 'Info' child node\n");
+			continue;
+		}
+		if ( (handle = xmlnode_get_child(info,"Handle")) == NULL ) {
+			purple_debug_error("MSNCL","Error getting 'Handle' child node\n");
+			continue;
+		}
+		if ( (handletype = xmlnode_get_child(handle,"Type")) == NULL ) {
+			purple_debug_error("MSNCL","Error getting 'Type' child node\n");
+			continue;
+		}
+
+		if ( (typedata = xmlnode_get_data(handletype)) == NULL) {
+			purple_debug_error("MSNCL","Error retrieving data from 'Type' child node\n");
+			continue;
+		}
+
+		purple_debug_info("MSNCL","processing '%s' Service\n",typedata);
+
+		if ( !g_strcasecmp(typedata, "Profile") ) {
+			/* Process Windows Live 'Messenger Roaming Identity' */
+			g_free(typedata);
+			continue;
+		}
+
+		if ( !g_strcasecmp(typedata, "Messenger") ) {
 
-			purple_debug_misc("MSNCL","type:%s\n",xmlnode_get_attrib(member,"type"));
-			if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"PassportMember")){
-				passportNode = xmlnode_get_child(member,"PassportName");
-				passport = xmlnode_get_data(passportNode);
-				typeNode = xmlnode_get_child(member,"Type");
-				type = xmlnode_get_data(typeNode);
-				purple_debug_misc("MSNCL","Passport name:%s,type:%s\n",passport,type);
-				g_free(type);
-
-				user = msn_userlist_find_add_user(session->userlist,passport,NULL);
-				msn_got_lst_user(session, user, list_op, NULL);
-				g_free(passport);
+			/*Last Change Node*/
+			LastChangeNode = xmlnode_get_child(service, "LastChange");
+			LastChangeStr = xmlnode_get_data(LastChangeNode);
+			purple_debug_info("MSNCL","LastChangeNode: '%s'\n",LastChangeStr);	
+			purple_account_set_string(session->account, "CLLastChange",LastChangeStr);
+	
+			memberships = xmlnode_get_child(service,"Memberships");
+			if (memberships == NULL) {
+				purple_debug_warning("MSNCL","Memberships = NULL, cleaning up and returning.\n");
+				g_free(typedata);
+				xmlnode_free(node);
+				return;
 			}
-			if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"PhoneMember")){
-			}
-			if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"EmailMember")){
-				xmlnode *emailNode;
+			purple_debug_info("MSNCL","Memberships @ %p: Name: '%s'\n",memberships,memberships->name);
+			for(membershipnode = xmlnode_get_child(memberships, "Membership"); membershipnode;
+							membershipnode = xmlnode_get_next_twin(membershipnode)){
+				xmlnode *roleNode;
+				char *role;
+
+				roleNode = xmlnode_get_child(membershipnode,"MemberRole");
+				role = xmlnode_get_data(roleNode);
+				list_op = msn_get_memberrole(role);
+				purple_debug_info("MSNCL","MemberRole role: %s, list_op: %d\n",role,list_op);
+				
+				g_free(role);
+				
+				members = xmlnode_get_child(membershipnode,"Members");
+				for(member = xmlnode_get_child(members, "Member"); member;
+						member = xmlnode_get_next_twin(member)){
+					MsnUser *user;
+					xmlnode * typeNode;
+					char * type;
 
-				emailNode = xmlnode_get_child(member,"Email");
-				passport = xmlnode_get_data(emailNode);
-				purple_debug_info("MSNCL","Email Member :name:%s,list_op:%d\n",passport,list_op);
-				user = msn_userlist_find_add_user(session->userlist,passport,NULL);
-				msn_got_lst_user(session,user,list_op,NULL);
-				g_free(passport);
+					purple_debug_info("MSNCL","Member type: %s\n",xmlnode_get_attrib(member,"type"));
+					if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"PassportMember")){
+						passportNode = xmlnode_get_child(member,"PassportName");
+						passport = xmlnode_get_data(passportNode);
+						typeNode = xmlnode_get_child(member,"Type");
+						type = xmlnode_get_data(typeNode);
+						purple_debug_info("MSNCL","Passport name: '%s', Type: %s\n",passport,type);
+						g_free(type);
+
+						user = msn_userlist_find_add_user(session->userlist,passport,NULL);
+						msn_got_lst_user(session, user, list_op, NULL);
+						g_free(passport);
+					}
+					if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"PhoneMember")){
+					}
+					if(!g_strcasecmp(xmlnode_get_attrib(member,"type"),"EmailMember")){
+						xmlnode *emailNode;
+
+						emailNode = xmlnode_get_child(member,"Email");
+						passport = xmlnode_get_data(emailNode);
+						purple_debug_info("MSNCL","Email Member: Name: '%s', list_op: %d\n",passport,list_op);
+						user = msn_userlist_find_add_user(session->userlist,passport,NULL);
+						msn_got_lst_user(session,user,list_op,NULL);
+						g_free(passport);
+					}
+				}
 			}
+			g_free(typedata);	/* Free 'Type' node data after processing 'Messenger' Service */
 		}
 	}
 
-	xmlnode_free(node);
+	xmlnode_free(node);	/* Free the whole XML tree */
 }
 
 static void
@@ -236,13 +283,15 @@
 	const char *abLastChange;
 	const char *dynamicItemLastChange;
 
+	purple_debug_info("::","msn_get_contact_list_cb()\n");
+
 	contact = soapconn->parent;
 	g_return_if_fail(contact != NULL);
 	session = soapconn->session;
 	g_return_if_fail(session != NULL);
 
 #ifdef  MSN_CONTACT_SOAP_DEBUG
-	purple_debug_misc("msn", "soap contact server Reply: {%s}\n", soapconn->read_buf);
+	purple_debug_info("msn", "soap contact server Reply: {%s}\n", soapconn->read_buf);
 #endif
 	msn_parse_contact_list(contact);
 	/*free the read buffer*/
@@ -278,7 +327,9 @@
 	MsnSoapReq *soap_request;
 	char *body = NULL;
 	char * update_str;
-	
+
+	purple_debug_info("::","msn_get_contact_list()\n");
+
 	purple_debug_info("MaYuan","Getting Contact List...\n");
 	if(update_time != NULL){
 		purple_debug_info("MSNCL","last update time:{%s}\n",update_time);
@@ -303,6 +354,8 @@
 	MsnSession *session = contact->session;
 	xmlnode *group;
 
+	purple_debug_info("::","msn_parse_addressbook_groups()\n");
+
 	for(group = xmlnode_get_child(node, "Group"); group;
 					group = xmlnode_get_next_twin(group)){
 		xmlnode *groupId, *groupInfo, *groupname;
@@ -321,7 +374,7 @@
 			continue;
 		}
 
-		purple_debug_misc("MsnAB","group_id:%s name:%s\n",group_id,group_name);
+		purple_debug_info("MsnAB","group_id: %s, name: %s\n",group_id,group_name);
 		if ((purple_find_group(group_name)) == NULL){
 			PurpleGroup *g = purple_group_new(group_name);
 			purple_blist_add_group(g, NULL);
--- a/libpurple/protocols/msn/notification.c	Mon Jul 09 17:59:36 2007 +0000
+++ b/libpurple/protocols/msn/notification.c	Sat Jul 14 00:04:48 2007 +0000
@@ -592,7 +592,8 @@
 	char *email,*domain;
 	char *list_op_str,*type_str;
 
-	purple_debug_info("MaYuan","passport:%s type: %d\n",passport, type);
+	purple_debug_info("::","msn_add_contact_xml()\n");
+	purple_debug_info("MaYuan","Passport: %s, type: %d\n",passport, type);
 	tokens = g_strsplit(passport, "@", 2);
 	email = tokens[0];
 	domain = tokens[1];
@@ -601,7 +602,7 @@
 	for(d_node = xmlnode_get_child(mlNode,"d"); d_node; d_node = xmlnode_get_next_twin(d_node))
 	{
 		const char * attr = NULL;
-		purple_debug_info("MaYuan","d_node:%s\n",d_node->name);
+		purple_debug_info("MaYuan","d_node: %s\n",d_node->name);
 		attr = xmlnode_get_attrib(d_node,"n");
 		if(attr == NULL){
 			continue;
@@ -624,7 +625,7 @@
 	xmlnode_set_attrib(c_node,"n",email);
 
 	list_op_str = g_strdup_printf("%d",list_op);
-	purple_debug_info("MaYuan","list_op:%d\n",list_op);
+	purple_debug_info("MaYuan","list_op: %d\n",list_op);
 	xmlnode_set_attrib(c_node,"l",list_op_str);
 	g_free(list_op_str);
 
@@ -650,8 +651,8 @@
 msn_notification_post_adl(MsnCmdProc *cmdproc, const char *payload, int payload_len)
 {
 	MsnTransaction *trans;
-
-	purple_debug_info("MaYuan","Send ADL{%s}\n",payload);
+	purple_debug_info("::","msn_notification_post_adl()\n");
+	purple_debug_info("MaYuan","Sending ADL with payload: %s\n",payload);
 	trans = msn_transaction_new(cmdproc, "ADL","%d",strlen(payload));
 	msn_transaction_set_payload(trans, payload, strlen(payload));
 	msn_cmdproc_send_trans(cmdproc, trans);
@@ -669,6 +670,7 @@
 	int adl_count = 0;
 	const char *display_name;
 
+	purple_debug_info("::","msn_notification_dump_contact()\n");
 	adl_node = xmlnode_new("ml");
 	adl_node->child = NULL;
 	xmlnode_set_attrib(adl_node, "l", "1");
@@ -750,7 +752,7 @@
 
 	if (!initial)
         {
-                purple_debug_info("::","Initial ADL received\n");
+                purple_debug_info("typ0","Initial ADL received\n");
                 msn_session_finish_login(cmdproc->session);
         }
 }
@@ -892,6 +894,8 @@
 	gint group_id;
 	const char *group_name;
 
+	purple_debug_info("::","adg_cmd()\n");
+	
 	session = cmdproc->session;
 
 	group_id = atoi(cmd->params[3]);
@@ -1551,7 +1555,7 @@
 static void
 ubx_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 {
-	purple_debug_info("MaYuan","UBX... \n");
+	purple_debug_info("typ0","UBX received.\n");
 	if(cmd->payload_len == 0){
 		return;
 	}
@@ -1561,7 +1565,7 @@
 static void
 uux_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 {
-	purple_debug_info("MaYuan","UUX... \n");
+	purple_debug_info("typ0","UUX received.\n");
 }
 
 /**************************************************************************
@@ -1575,7 +1579,7 @@
 	const char *value;
 	const char *clLastChange;
 
-	purple_debug_info("MaYuan","profile_msg... \n");
+	purple_debug_info("::","profile_msg()\n");
 	session = cmdproc->session;
 
 	if (strcmp(msg->remote_user, "Hotmail"))
@@ -1760,6 +1764,7 @@
 static void
 delete_oim_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
 {
+	purple_debug_info("::","delete_oim_msg()\n");
 }
 
 static void
@@ -1871,7 +1876,7 @@
 	xmlnode *adl_node;
 	char *payload;
 	int payload_len;
-
+	purple_debug_info("::","msn_notification_add_buddy()\n");
 	cmdproc = notification->servconn->cmdproc;
 
 	adl_node = xmlnode_new("ml");
@@ -1902,6 +1907,7 @@
 	char *payload;
 	int payload_len;
 
+	purple_debug_info("::","msn_notification_rem_buddy()\n");
 	cmdproc = notification->servconn->cmdproc;
 
 	rml_node = xmlnode_new("ml");
@@ -1912,7 +1918,7 @@
 	payload = xmlnode_to_str(rml_node,&payload_len);
 	xmlnode_free(rml_node);
 
-	purple_debug_info("MaYuan","RML{%s}\n",payload);
+	purple_debug_info("MaYuan","Send RML with payload {%s}\n",payload);
 	trans = msn_transaction_new(cmdproc, "RML","%d",strlen(payload));
 	msn_transaction_set_payload(trans, payload, strlen(payload));
 	msn_cmdproc_send_trans(cmdproc, trans);
--- a/libpurple/protocols/msn/userlist.c	Mon Jul 09 17:59:36 2007 +0000
+++ b/libpurple/protocols/msn/userlist.c	Sat Jul 14 00:04:48 2007 +0000
@@ -196,6 +196,7 @@
 	return -1;
 }
 
+/* this function msn_got_add_user isn't called anywhere */
 void
 msn_got_add_user(MsnSession *session, MsnUser *user,
 				 MsnListId list_id, const char * group_id)
@@ -349,6 +350,8 @@
 	const char *passport;
 	const char *store;
 
+	purple_debug_info("::","msn_got_lst_user()\n");
+
 	account = session->account;
 	gc = purple_account_get_connection(account);
 
@@ -745,6 +748,8 @@
 	GSList *l;
 	MsnUser * user;
 
+	purple_debug_info("::","msn_userlist_load()\n");
+
 	g_return_if_fail(gc != NULL);
 
 	for (gnode = purple_get_blist()->root; gnode; gnode = gnode->next)
--- a/libpurple/xmlnode.h	Mon Jul 09 17:59:36 2007 +0000
+++ b/libpurple/xmlnode.h	Sat Jul 14 00:04:48 2007 +0000
@@ -128,7 +128,7 @@
  *
  * @param node The node to get data from.
  *
- * @return The data from the node.  This data is in raw escaped format.
+ * @return The data from the node or NULL. This data is in raw escaped format.
  *         You must g_free this string when finished using it.
  */
 char *xmlnode_get_data(xmlnode *node);

mercurial