Mercurial > pidgin
changeset 25582:7ea04b53f553
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 <Member>/<Type> to Email, and use an
<Email> node instead of <PassportName>. Along with that, we shouldn't set
any <Annotations> 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.
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Wed, 29 Apr 2009 18:24:34 +0000 |
parents | 1cf0b4f71d16 |
children | 51ff18d00dea |
files | libpurple/protocols/msn/contact.c libpurple/protocols/msn/contact.h libpurple/protocols/msn/notification.c |
diffstat | 3 files changed, 46 insertions(+), 52 deletions(-) [+] |
line wrap: on
line diff
--- 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); }
--- 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 \ "<Member xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"%s\">"\ - "<Type>Passport</Type>"\ + "<Type>%s</Type>"\ "<State>Accepted</State>"\ - "<PassportName>%s</PassportName>"\ - "%s"\ + "<%s>%s</%s>"\ "</Member>" #define MSN_MEMBER_MEMBERSHIPID_XML \ "<Member xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"%s\">"\ - "<Type>Passport</Type>"\ + "<Type>%s</Type>"\ "<MembershipId>%u</MembershipId>"\ "<State>Accepted</State>"\ - "%s"\ "</Member>" -#define MSN_MEMBER_FEDERATED_ANNOTATION_XML \ - "<Annotations>"\ - "<Annotation>"\ - "<Name>MSN.IM.BuddyType</Name>"\ - "<Value>%02d:</Value>"\ - "</Annotation>"\ - "</Annotations>" - /* first delete contact from allow list */ #define MSN_CONTACT_DELETE_FROM_LIST_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
--- 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);