# HG changeset patch # User Sadrul Habib Chowdhury # Date 1241029474 0 # Node ID 7ea04b53f5534ae9e441ca5d15d2df12a087da15 # Parent 1cf0b4f71d16a4d39d1d9df0b9945b76edc1deae Pluck the MSN bug fixes. *** Plucked rev e3608f6f (qulogic@pidgin.im): Ignore the Forward List status bit when checking if user is on the Allow and Block lists at the same time. References #6702. *** Plucked rev 99d00e33 (qulogic@pidgin.im): For federated buddies, we should set / to Email, and use an node instead of . Along with that, we shouldn't set any to specify it's a federated buddy either, since the MSN server will complain about it. Fixes #7939. *** Plucked rev bf71505b (qulogic@pidgin.im): Fix a faulty condition that would result in an attempt to add most of your email-only contacts to your buddy and/or privacy list. This was temporary, but resulted in a lot of extra traffic during login. References #8579. diff -r 1cf0b4f71d16 -r 7ea04b53f553 libpurple/protocols/msn/contact.c --- a/libpurple/protocols/msn/contact.c Wed Apr 29 18:19:22 2009 +0000 +++ b/libpurple/protocols/msn/contact.c Wed Apr 29 18:24:34 2009 +0000 @@ -697,25 +697,28 @@ /*TODO: need to support the Mobile type*/ continue; } - for (contactEmailNode = xmlnode_get_child(emailsNode, "ContactEmail"); contactEmailNode; - contactEmailNode = xmlnode_get_next_twin(contactEmailNode)) { - if (!(messengerEnabledNode = xmlnode_get_child(contactEmailNode, "isMessengerEnabled"))) - continue; + for (contactEmailNode = xmlnode_get_child(emailsNode, "ContactEmail"); + contactEmailNode; + contactEmailNode = xmlnode_get_next_twin(contactEmailNode)) { + if ((messengerEnabledNode = xmlnode_get_child(contactEmailNode, "isMessengerEnabled"))) { - msnEnabled = xmlnode_get_data(messengerEnabledNode); + msnEnabled = xmlnode_get_data(messengerEnabledNode); + + if (msnEnabled && !strcmp(msnEnabled, "true")) { + if ((emailNode = xmlnode_get_child(contactEmailNode, "email"))) + passport = xmlnode_get_data(emailNode); - if (msnEnabled && !strcmp(msnEnabled, "true")) { - if ((emailNode = xmlnode_get_child(contactEmailNode, "email"))) - passport = xmlnode_get_data(emailNode); + /* Messenger enabled, Get the Passport*/ + purple_debug_info("msn", "AB Yahoo/Federated User %s\n", passport ? passport : "(null)"); + g_free(msnEnabled); + break; + } - /*Messenger enabled, Get the Passport*/ - purple_debug_info("msn", "AB Yahoo/Federated User %s\n", passport ? passport : "(null)"); g_free(msnEnabled); - break; } - - g_free(msnEnabled); } + if (passport == NULL) /* Couldn't find anything */ + continue; } else { xmlnode *messenger_user; /* ignore non-messenger contacts */ @@ -1482,8 +1485,6 @@ const gchar *passport, const MsnListId list) { gchar *body = NULL, *member = NULL; - const char *type = "PassportMember"; - gchar *federate = NULL; MsnSoapPartnerScenario partner_scenario; MsnUser *user; @@ -1501,23 +1502,28 @@ msn_callback_state_set_who(state, passport); user = msn_userlist_find_user(session->userlist, passport); - if (user && user->networkid != MSN_NETWORK_PASSPORT) { - type = "EmailMember"; - federate = g_strdup_printf(MSN_MEMBER_FEDERATED_ANNOTATION_XML, - user->networkid); - } if (list == MSN_LIST_PL) { partner_scenario = MSN_PS_CONTACT_API; - member = g_strdup_printf(MSN_MEMBER_MEMBERSHIPID_XML, - type, user->membership_id[MSN_LIST_PL], - federate ? federate : ""); + if (user && user->networkid != MSN_NETWORK_PASSPORT) + member = g_strdup_printf(MSN_MEMBER_MEMBERSHIPID_XML, + "EmailMember", "Email", + user->membership_id[MSN_LIST_PL]); + else + member = g_strdup_printf(MSN_MEMBER_MEMBERSHIPID_XML, + "PassportMember", "Passport", + user->membership_id[MSN_LIST_PL]); } else { /* list == MSN_LIST_AL || list == MSN_LIST_BL */ partner_scenario = MSN_PS_BLOCK_UNBLOCK; - member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, - type, passport, - federate ? federate : ""); + if (user && user->networkid != MSN_NETWORK_PASSPORT) + member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, + "EmailMember", "Email", + "Email", passport, "Email"); + else + member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, + "PassportMember", "Passport", + "PassportName", passport, "PassportName"); } body = g_strdup_printf(MSN_CONTACT_DELETE_FROM_LIST_TEMPLATE, @@ -1530,7 +1536,6 @@ state->cb = msn_del_contact_from_list_read_cb; msn_contact_request(state); - g_free(federate); g_free(member); g_free(body); } @@ -1578,8 +1583,6 @@ const gchar *passport, const MsnListId list) { gchar *body = NULL, *member = NULL; - const char *type = "PassportMember"; - gchar *federate = NULL; MsnSoapPartnerScenario partner_scenario; MsnUser *user; @@ -1596,15 +1599,16 @@ msn_callback_state_set_who(state, passport); user = msn_userlist_find_user(session->userlist, passport); - if (user && user->networkid != MSN_NETWORK_PASSPORT) { - type = "EmailMember"; - federate = g_strdup_printf(MSN_MEMBER_FEDERATED_ANNOTATION_XML, - user->networkid); - } partner_scenario = (list == MSN_LIST_RL) ? MSN_PS_CONTACT_API : MSN_PS_BLOCK_UNBLOCK; - member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, - type, state->who, federate ? federate : ""); + if (user && user->networkid != MSN_NETWORK_PASSPORT) + member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, + "EmailMember", "Email", + "Email", state->who, "Email"); + else + member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, + "PassportMember", "Passport", + "PassportName", state->who, "PassportName"); body = g_strdup_printf(MSN_CONTACT_ADD_TO_LIST_TEMPLATE, MsnSoapPartnerScenarioText[partner_scenario], @@ -1616,7 +1620,6 @@ state->cb = msn_add_contact_to_list_read_cb; msn_contact_request(state); - g_free(federate); g_free(member); g_free(body); } diff -r 1cf0b4f71d16 -r 7ea04b53f553 libpurple/protocols/msn/contact.h --- a/libpurple/protocols/msn/contact.h Wed Apr 29 18:19:22 2009 +0000 +++ b/libpurple/protocols/msn/contact.h Wed Apr 29 18:24:34 2009 +0000 @@ -397,28 +397,18 @@ #define MSN_MEMBER_PASSPORT_XML \ ""\ - "Passport"\ + "%s"\ "Accepted"\ - "%s"\ - "%s"\ + "<%s>%s"\ "" #define MSN_MEMBER_MEMBERSHIPID_XML \ ""\ - "Passport"\ + "%s"\ "%u"\ "Accepted"\ - "%s"\ "" -#define MSN_MEMBER_FEDERATED_ANNOTATION_XML \ - ""\ - ""\ - "MSN.IM.BuddyType"\ - "%02d:"\ - ""\ - "" - /* first delete contact from allow list */ #define MSN_CONTACT_DELETE_FROM_LIST_TEMPLATE ""\ diff -r 1cf0b4f71d16 -r 7ea04b53f553 libpurple/protocols/msn/notification.c --- a/libpurple/protocols/msn/notification.c Wed Apr 29 18:19:22 2009 +0000 +++ b/libpurple/protocols/msn/notification.c Wed Apr 29 18:24:34 2009 +0000 @@ -665,13 +665,14 @@ if (user->passport && !strcmp(user->passport, "messenger@microsoft.com")) continue; - if ((user->list_op & MSN_LIST_OP_MASK) == (MSN_LIST_AL_OP | MSN_LIST_BL_OP)) { + if ((user->list_op & MSN_LIST_OP_MASK & ~MSN_LIST_FL_OP) + == (MSN_LIST_AL_OP | MSN_LIST_BL_OP)) { /* The server will complain if we send it a user on both the Allow and Block lists. So assume they're on the Block list and remove them from the Allow list in the membership lists to stop this from happening again. */ purple_debug_warning("msn", - "User %s is on both Allow and Block list," + "User %s is on both Allow and Block list; " "removing from Allow list.\n", user->passport); msn_userlist_rem_buddy_from_list(session->userlist, user->passport, MSN_LIST_AL);