summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKa-Hing Cheung <khc@pidgin.im>2007-12-26 02:01:28 +0000
committerKa-Hing Cheung <khc@pidgin.im>2007-12-26 02:01:28 +0000
commitc1492ec5aba10748a9312f2d836a2558055d4f15 (patch)
tree1f71868992c4b75a57bf3f257eac94f4bb186425
parent1e369864743d50684dc18af82ccbcb18c007db5e (diff)
parent90fa2f7c2c92a2c60e1878feee28d101cfcc9600 (diff)
downloadpidgin-c1492ec5aba10748a9312f2d836a2558055d4f15.tar.gz
propagate from branch 'im.pidgin.pidgin' (head 5cf20e84d1b5c7c1554a6b851c47b02dc960b8b0)
to branch 'im.pidgin.pidgin.khc.msnp15' (head 1abf46eeccec8097ae02517637e41bd7a50ae2c2)
-rw-r--r--libpurple/protocols/msn/contact.c74
-rw-r--r--libpurple/protocols/msn/contact.h304
-rw-r--r--libpurple/protocols/msn/msn.h8
-rw-r--r--libpurple/protocols/msn/msnutils.c4
-rw-r--r--libpurple/protocols/msn/nexus.c445
-rw-r--r--libpurple/protocols/msn/nexus.h200
-rw-r--r--libpurple/protocols/msn/notification.c41
-rw-r--r--libpurple/protocols/msn/notification.h7
-rw-r--r--libpurple/protocols/msn/oim.c15
-rw-r--r--libpurple/protocols/msn/oim.h4
-rw-r--r--libpurple/protocols/msn/session.c2
-rw-r--r--libpurple/protocols/msn/soap.c2
-rw-r--r--libpurple/protocols/msn/soap2.c10
13 files changed, 780 insertions, 336 deletions
diff --git a/libpurple/protocols/msn/contact.c b/libpurple/protocols/msn/contact.c
index 776a4bc9c6..87eb29cdc2 100644
--- a/libpurple/protocols/msn/contact.c
+++ b/libpurple/protocols/msn/contact.c
@@ -29,6 +29,7 @@
#include "xmlnode.h"
#include "group.h"
#include "soap2.h"
+#include "nexus.h"
const char *MsnSoapPartnerScenarioText[] =
{
@@ -230,7 +231,9 @@ msn_create_address_book(MsnContact * contact)
purple_debug_info("msnab","Creating an Address Book.\n");
- body = g_strdup_printf(MSN_ADD_ADDRESSBOOK_TEMPLATE, contact->session->user->passport);
+ body = g_strdup_printf(MSN_ADD_ADDRESSBOOK_TEMPLATE,
+ msn_nexus_get_token_str(contact->session->nexus, MSN_AUTH_CONTACTS),
+ contact->session->user->passport);
msn_soap_message_send(contact->session,
msn_soap_message_new(MSN_ADD_ADDRESSBOOK_SOAP_ACTION,
@@ -416,7 +419,9 @@ msn_get_contact_list(MsnContact * contact,
update_str = g_strdup_printf(MSN_GET_CONTACT_UPDATE_XML,update_time);
}
- body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, partner_scenario_str, update_str ? update_str : "");
+ body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, partner_scenario_str,
+ msn_nexus_get_token_str(contact->session->nexus, MSN_AUTH_CONTACTS),
+ update_str ? update_str : "");
msn_soap_message_send(contact->session,
msn_soap_message_new(MSN_GET_CONTACT_SOAP_ACTION,
@@ -729,7 +734,10 @@ msn_get_address_book(MsnContact *contact,
else if (LastChanged != NULL)
update_str = g_strdup_printf(MSN_GET_ADDRESS_UPDATE_XML, LastChanged);
- body = g_strdup_printf(MSN_GET_ADDRESS_TEMPLATE, MsnSoapPartnerScenarioText[partner_scenario], update_str ? update_str : "");
+ body = g_strdup_printf(MSN_GET_ADDRESS_TEMPLATE,
+ MsnSoapPartnerScenarioText[partner_scenario],
+ msn_nexus_get_token_str(contact->session->nexus, MSN_AUTH_CONTACTS),
+ update_str ? update_str : "");
msn_soap_message_send(contact->session,
msn_soap_message_new(MSN_GET_ADDRESS_SOAP_ACTION,
@@ -794,7 +802,9 @@ msn_add_contact(MsnContact *contact, MsnCallbackState *state, const char *passpo
purple_debug_info("MSNCL","Adding contact %s to contact list\n", passport);
contact_xml = g_strdup_printf(MSN_CONTACT_XML, passport);
- body = g_strdup_printf(MSN_ADD_CONTACT_TEMPLATE, contact_xml);
+ body = g_strdup_printf(MSN_ADD_CONTACT_TEMPLATE,
+ msn_nexus_get_token_str(contact->session->nexus, MSN_AUTH_CONTACTS),
+ contact_xml);
msn_soap_message_send(contact->session,
msn_soap_message_new(MSN_CONTACT_ADD_SOAP_ACTION,
@@ -902,7 +912,9 @@ msn_add_contact_to_group(MsnContact *contact, MsnCallbackState *state,
contact_xml = g_strdup_printf(MSN_CONTACT_XML, passport);
}
- body = g_strdup_printf(MSN_ADD_CONTACT_GROUP_TEMPLATE, groupId, contact_xml);
+ body = g_strdup_printf(MSN_ADD_CONTACT_GROUP_TEMPLATE,
+ msn_nexus_get_token_str(contact->session->nexus, MSN_AUTH_CONTACTS),
+ groupId, contact_xml);
msn_soap_message_send(state->session,
msn_soap_message_new(MSN_ADD_CONTACT_GROUP_SOAP_ACTION,
@@ -950,7 +962,10 @@ msn_delete_contact(MsnContact *contact, const char *contactId)
/* build SOAP request */
purple_debug_info("MSNCL","Deleting contact with contactId: %s\n", contactId);
- body = g_strdup_printf(MSN_DEL_CONTACT_TEMPLATE, contact_id_xml);
+ body = g_strdup_printf(MSN_DEL_CONTACT_TEMPLATE,
+ msn_nexus_get_token_str(contact->session->nexus, MSN_AUTH_CONTACTS),
+ contact_id_xml);
+
msn_soap_message_send(contact->session,
msn_soap_message_new(MSN_CONTACT_DEL_SOAP_ACTION,
xmlnode_from_str(body, -1)),
@@ -1022,7 +1037,9 @@ msn_del_contact_from_group(MsnContact *contact, const char *passport, const char
msn_callback_state_set_old_group_name(state, group_name);
contact_id_xml = g_strdup_printf(MSN_CONTACT_ID_XML, user->uid);
- body = g_strdup_printf(MSN_CONTACT_DEL_GROUP_TEMPLATE, contact_id_xml, groupId);
+ body = g_strdup_printf(MSN_CONTACT_DEL_GROUP_TEMPLATE,
+ msn_nexus_get_token_str(contact->session->nexus, MSN_AUTH_CONTACTS),
+ contact_id_xml, groupId);
msn_soap_message_send(contact->session,
msn_soap_message_new(MSN_CONTACT_DEL_GROUP_SOAP_ACTION,
@@ -1055,7 +1072,9 @@ msn_update_contact(MsnContact *contact, const char* nickname)
escaped_nickname = g_markup_escape_text(nickname, -1);
- body = g_strdup_printf(MSN_CONTACT_UPDATE_TEMPLATE, escaped_nickname);
+ body = g_strdup_printf(MSN_CONTACT_UPDATE_TEMPLATE,
+ msn_nexus_get_token_str(contact->session->nexus, MSN_AUTH_CONTACTS),
+ escaped_nickname);
msn_soap_message_send(contact->session,
msn_soap_message_new(MSN_CONTACT_UPDATE_SOAP_ACTION,
@@ -1133,9 +1152,9 @@ msn_del_contact_from_list(MsnContact *contact, MsnCallbackState *state,
}
body = g_strdup_printf( MSN_CONTACT_DELECT_FROM_LIST_TEMPLATE,
- MsnSoapPartnerScenarioText[partner_scenario],
- MsnMemberRole[list],
- member);
+ MsnSoapPartnerScenarioText[partner_scenario],
+ msn_nexus_get_token_str(contact->session->nexus, MSN_AUTH_CONTACTS),
+ MsnMemberRole[list], member);
msn_soap_message_send(contact->session,
msn_soap_message_new(MSN_DELETE_MEMBER_FROM_LIST_SOAP_ACTION,
@@ -1205,9 +1224,9 @@ msn_add_contact_to_list(MsnContact *contact, MsnCallbackState *state,
member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, state->who);
body = g_strdup_printf(MSN_CONTACT_ADD_TO_LIST_TEMPLATE,
- MsnSoapPartnerScenarioText[partner_scenario],
- MsnMemberRole[list],
- member);
+ MsnSoapPartnerScenarioText[partner_scenario],
+ msn_nexus_get_token_str(contact->session->nexus, MSN_AUTH_CONTACTS),
+ MsnMemberRole[list], member);
msn_soap_message_send(contact->session,
msn_soap_message_new(MSN_ADD_MEMBER_TO_LIST_SOAP_ACTION,
@@ -1234,13 +1253,19 @@ void
msn_get_gleams(MsnContact *contact)
{
MsnSoapReq *soap_request;
+ gchar *body = NULL;
purple_debug_info("MSNP14","msn get gleams info...\n");
+
+ body = g_strdup_printf(MSN_GLEAMS_TEMPLATE,
+ msn_nexus_get_token_str(contact->session->nexus, MSN_AUTH_CONTACTS));
+
msn_soap_message_send(contact->session,
msn_soap_message_new(MSN_GET_GLEAMS_SOAP_ACTION,
- xmlnode_from_str(MSN_GLEAMS_TEMPLATE, -1)),
+ xmlnode_from_str(body, -1)),
MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL,
msn_gleams_read_cb, NULL);
+ g_free(body);
}
#endif
@@ -1323,6 +1348,7 @@ void
msn_add_group(MsnSession *session, MsnCallbackState *state, const char* group_name)
{
char *body = NULL;
+ char *escaped_group_name = NULL;
g_return_if_fail(session != NULL);
g_return_if_fail(group_name != NULL);
@@ -1339,7 +1365,10 @@ msn_add_group(MsnSession *session, MsnCallbackState *state, const char* group_na
/* escape group name's html special chars so it can safely be sent
* in a XML SOAP request
*/
- body = g_markup_printf_escaped(MSN_GROUP_ADD_TEMPLATE, group_name);
+ escaped_group_name = g_markup_escape_text(group_name, -1);
+ body = g_strdup_printf(MSN_GROUP_ADD_TEMPLATE,
+ msn_nexus_get_token_str(session->nexus, MSN_AUTH_CONTACTS),
+ escaped_group_name);
msn_soap_message_send(session,
msn_soap_message_new(MSN_GROUP_ADD_SOAP_ACTION,
@@ -1347,6 +1376,7 @@ msn_add_group(MsnSession *session, MsnCallbackState *state, const char* group_na
MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL,
msn_group_read_cb, state);
+ g_free(escaped_group_name);
g_free(body);
}
@@ -1382,7 +1412,9 @@ msn_del_group(MsnSession *session, const gchar *group_name)
msn_callback_state_set_action(state, MSN_DEL_GROUP);
msn_callback_state_set_guid(state, guid);
- body = g_strdup_printf(MSN_GROUP_DEL_TEMPLATE, guid);
+ body = g_strdup_printf(MSN_GROUP_DEL_TEMPLATE,
+ msn_nexus_get_token_str(session->nexus, MSN_AUTH_CONTACTS),
+ guid);
msn_soap_message_send(session,
msn_soap_message_new(MSN_GROUP_DEL_SOAP_ACTION,
@@ -1400,6 +1432,7 @@ msn_contact_rename_group(MsnSession *session, const char *old_group_name, const
gchar *body = NULL;
const gchar * guid;
MsnCallbackState *state;
+ char *escaped_group_name;
g_return_if_fail(session != NULL);
g_return_if_fail(session->userlist != NULL);
@@ -1423,8 +1456,10 @@ msn_contact_rename_group(MsnSession *session, const char *old_group_name, const
msn_callback_state_set_action(state, MSN_RENAME_GROUP);
- body = g_markup_printf_escaped(MSN_GROUP_RENAME_TEMPLATE,
- guid, new_group_name);
+ escaped_group_name = g_markup_escape_text(new_group_name, -1);
+ body = g_strdup_printf(MSN_GROUP_RENAME_TEMPLATE,
+ msn_nexus_get_token_str(session->nexus, MSN_AUTH_CONTACTS),
+ guid, escaped_group_name);
msn_soap_message_send(session,
msn_soap_message_new(MSN_GROUP_RENAME_SOAP_ACTION,
@@ -1432,5 +1467,6 @@ msn_contact_rename_group(MsnSession *session, const char *old_group_name, const
MSN_CONTACT_SERVER, MSN_ADDRESS_BOOK_POST_URL,
msn_group_read_cb, state);
+ g_free(escaped_group_name);
g_free(body);
}
diff --git a/libpurple/protocols/msn/contact.h b/libpurple/protocols/msn/contact.h
index d1ba9a451a..59567a9676 100644
--- a/libpurple/protocols/msn/contact.h
+++ b/libpurple/protocols/msn/contact.h
@@ -31,9 +31,12 @@
#define MSN_GET_CONTACT_POST_URL "/abservice/SharingService.asmx"
#define MSN_GET_CONTACT_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/FindMembership"
-#define MSN_GET_CONTACT_UPDATE_XML "<View>Full</View>"\
+
+#define MSN_GET_CONTACT_UPDATE_XML \
+ "<View>Full</View>"\
"<deltasOnly>true</deltasOnly>"\
"<lastChange>%s</lastChange>"
+
#define MSN_GET_CONTACT_TEMPLATE "<?xml version='1.0' encoding='utf-8'?>"\
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\
"<soap:Header xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\
@@ -44,6 +47,7 @@
"</ABApplicationHeader>"\
"<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ManagedGroupRequest xmlns=\"http://www.msn.com/webservices/AddressBook\">false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
"</ABAuthHeader>"\
"</soap:Header>"\
"<soap:Body xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\
@@ -72,7 +76,11 @@
#define MSN_ADD_ADDRESSBOOK_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABAdd"
#define MSN_ADD_ADDRESSBOOK_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
-"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+"<soap:Envelope"\
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
"<soap:Header>"\
"<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
@@ -81,6 +89,7 @@
"</ABApplicationHeader>"\
"<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
"</ABAuthHeader>"\
"</soap:Header>"\
"<soap:Body>"\
@@ -98,7 +107,8 @@
/* Get AddressBook */
#define MSN_GET_ADDRESS_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABFindAll"
#define MSN_GET_ADDRESS_FULL_TIME "0001-01-01T00:00:00.0000000-08:00"
-#define MSN_GET_ADDRESS_UPDATE_XML "<deltasOnly>true</deltasOnly>"\
+#define MSN_GET_ADDRESS_UPDATE_XML \
+ "<deltasOnly>true</deltasOnly>"\
"<lastChange>%s</lastChange>"
#define MSN_GET_GLEAM_UPDATE_XML \
@@ -107,7 +117,11 @@
"<dynamicItemLastChange>%s</dynamicItemLastChange>"
#define MSN_GET_ADDRESS_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
-"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+"<soap:Envelope"\
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
"<soap:Header>"\
"<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
@@ -116,6 +130,7 @@
"</ABApplicationHeader>"\
"<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
"</ABAuthHeader>"\
"</soap:Header>"\
"<soap:Body>"\
@@ -131,7 +146,11 @@
/*Gleams SOAP request template*/
#define MSN_GET_GLEAMS_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABFindAll"
#define MSN_GLEAMS_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
-"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+"<soap:Envelope"\
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
"<soap:Header>"\
"<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
@@ -140,6 +159,7 @@
"</ABApplicationHeader>"\
"<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
"</ABAuthHeader>"\
"</soap:Header>"\
"<soap:Body>"\
@@ -157,26 +177,69 @@
* Contact Management SOAP actions
*******************************************************/
-/* Add a new contact t*/
+/* Add a new contact */
#define MSN_CONTACT_ADD_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactAdd"
-#define MSN_CONTACT_LIVE_PENDING_XML "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\"><contactInfo><contactType>LivePending</contactType><passportName>%s</passportName><isMessengerUser>true</isMessengerUser></contactInfo></Contact>"
-
-#define MSN_CONTACT_XML "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
- "<contactInfo>"\
- "<passportName>%s</passportName>"\
- "<isSmtp>false</isSmtp>"\
- "<isMessengerUser>true</isMessengerUser>"\
- "</contactInfo>"\
- "</Contact>"
-
-#define MSN_CONTACT_DISPLAYNAME_XML "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\"><contactInfo><displayName>%s</displayName><passportName>%s</passportName><isMessengerUser>true</isMessengerUser></contactInfo></Contact>"
-
-#define MSN_ADD_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>ContactSave</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABContactAdd xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><contacts>%s</contacts><options><EnableAllowListManagement>true</EnableAllowListManagement></options></ABContactAdd></soap:Body></soap:Envelope>"
+#define MSN_CONTACT_LIVE_PENDING_XML \
+ "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<contactInfo>"\
+ "<contactType>LivePending</contactType>"\
+ "<passportName>%s</passportName>"\
+ "<isMessengerUser>true</isMessengerUser>"\
+ "</contactInfo>"\
+ "</Contact>"
+
+#define MSN_CONTACT_XML \
+ "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<contactInfo>"\
+ "<passportName>%s</passportName>"\
+ "<isSmtp>false</isSmtp>"\
+ "<isMessengerUser>true</isMessengerUser>"\
+ "</contactInfo>"\
+ "</Contact>"
+
+#define MSN_CONTACT_DISPLAYNAME_XML \
+ "<Contact xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<contactInfo>"\
+ "<displayName>%s</displayName>"\
+ "<passportName>%s</passportName>"\
+ "<isMessengerUser>true</isMessengerUser>"\
+ "</contactInfo>"\
+ "</Contact>"
+
+#define MSN_ADD_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
+"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+ "<soap:Header>"\
+ "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
+ "<IsMigration>false</IsMigration>"\
+ "<PartnerScenario>ContactSave</PartnerScenario>"\
+ "</ABApplicationHeader>"\
+ "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
+ "</ABAuthHeader>"\
+ "</soap:Header>"\
+ "<soap:Body>"\
+ "<ABContactAdd xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<abId>00000000-0000-0000-0000-000000000000</abId>"\
+ "<contacts>%s</contacts>"\
+ "<options>"\
+ "<EnableAllowListManagement>true</EnableAllowListManagement>"\
+ "</options>"\
+ "</ABContactAdd>"\
+ "</soap:Body>"\
+"</soap:Envelope>"
/* Add a contact to a group */
#define MSN_ADD_CONTACT_GROUP_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupContactAdd"
#define MSN_ADD_CONTACT_GROUP_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
-"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
"<soap:Header>"\
"<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
@@ -185,6 +248,7 @@
"</ABApplicationHeader>"\
"<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
"</ABAuthHeader>"\
"</soap:Header>"\
"<soap:Body>"\
@@ -207,17 +271,72 @@
/* Delete a contact from the Contact List */
#define MSN_CONTACT_DEL_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactDelete"
#define MSN_CONTACT_ID_XML "<Contact><contactId>%s</contactId></Contact>"
-#define MSN_DEL_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>Timer</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABContactDelete xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><contacts>%s</contacts></ABContactDelete></soap:Body></soap:Envelope>"
+#define MSN_DEL_CONTACT_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
+"<soap:Envelope"\
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+ "<soap:Header>"\
+ "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
+ "<IsMigration>false</IsMigration>"\
+ "<PartnerScenario>Timer</PartnerScenario>"\
+ "</ABApplicationHeader>"\
+ "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
+ "</ABAuthHeader>"\
+ "</soap:Header>"\
+ "<soap:Body>"\
+ "<ABContactDelete xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<abId>00000000-0000-0000-0000-000000000000</abId>"\
+ "<contacts>%s</contacts>"\
+ "</ABContactDelete>"\
+ "</soap:Body>"\
+"</soap:Envelope>"
/* Remove a contact from a group */
#define MSN_CONTACT_DEL_GROUP_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupContactDelete"
-#define MSN_CONTACT_DEL_GROUP_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>Timer</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABGroupContactDelete xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><contacts>%s</contacts><groupFilter><groupIds><guid>%s</guid></groupIds></groupFilter></ABGroupContactDelete></soap:Body></soap:Envelope>"
+#define MSN_CONTACT_DEL_GROUP_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
+"<soap:Envelope"\
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+ "<soap:Header>"\
+ "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
+ "<IsMigration>false</IsMigration>"\
+ "<PartnerScenario>Timer</PartnerScenario>"\
+ "</ABApplicationHeader>"\
+ "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
+ "</ABAuthHeader>"\
+ "</soap:Header>"\
+ "<soap:Body>"\
+ "<ABGroupContactDelete xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<abId>00000000-0000-0000-0000-000000000000</abId>"\
+ "<contacts>%s</contacts>"\
+ "<groupFilter>"\
+ "<groupIds>"\
+ "<guid>%s</guid>"\
+ "</groupIds>"\
+ "</groupFilter>"\
+ "</ABGroupContactDelete>"\
+ "</soap:Body>"\
+"</soap:Envelope>"
/* Update Contact Nickname */
#define MSN_CONTACT_UPDATE_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABContactUpdate"
#define MSN_CONTACT_UPDATE_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
-"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+"<soap:Envelope"\
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
"<soap:Header>"\
"<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
@@ -226,6 +345,7 @@
"</ABApplicationHeader>"\
"<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
"</ABAuthHeader>"\
"</soap:Header>"\
"<soap:Body>"\
@@ -255,22 +375,28 @@
#define MSN_ADD_MEMBER_TO_LIST_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/AddMember"
#define MSN_DELETE_MEMBER_FROM_LIST_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/DeleteMember"
-#define MSN_MEMBER_PASSPORT_XML "<Member xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"PassportMember\">"\
- "<Type>Passport</Type>"\
- "<State>Accepted</State>"\
- "<PassportName>%s</PassportName>"\
- "</Member>"
+#define MSN_MEMBER_PASSPORT_XML \
+ "<Member xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"PassportMember\">"\
+ "<Type>Passport</Type>"\
+ "<State>Accepted</State>"\
+ "<PassportName>%s</PassportName>"\
+ "</Member>"
-#define MSN_MEMBER_MEMBERSHIPID_XML "<Member xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"PassportMember\">"\
- "<Type>Passport</Type>"\
- "<MembershipId>%u</MembershipId>"\
- "<State>Accepted</State>"\
- "</Member>"
+#define MSN_MEMBER_MEMBERSHIPID_XML \
+ "<Member xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:type=\"PassportMember\">"\
+ "<Type>Passport</Type>"\
+ "<MembershipId>%u</MembershipId>"\
+ "<State>Accepted</State>"\
+ "</Member>"
/* first delete contact from allow list */
#define MSN_CONTACT_DELECT_FROM_LIST_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
-"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+"<soap:Envelope"\
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
"<soap:Header>"\
"<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
@@ -279,6 +405,7 @@
"</ABApplicationHeader>"\
"<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
"</ABAuthHeader>"\
"</soap:Header>"\
"<soap:Body>"\
@@ -301,7 +428,11 @@
"</soap:Envelope>"
#define MSN_CONTACT_ADD_TO_LIST_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
-"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+"<soap:Envelope"\
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
"<soap:Header>"\
"<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
@@ -310,6 +441,7 @@
"</ABApplicationHeader>"\
"<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
"<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
"</ABAuthHeader>"\
"</soap:Header>"\
"<soap:Body>"\
@@ -339,15 +471,111 @@
/* add a group */
#define MSN_GROUP_ADD_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupAdd"
-#define MSN_GROUP_ADD_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>GroupSave</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABGroupAdd xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><groupAddOptions><fRenameOnMsgrConflict>false</fRenameOnMsgrConflict></groupAddOptions><groupInfo><GroupInfo><name>%s</name><groupType>C8529CE2-6EAD-434d-881F-341E17DB3FF8</groupType><fMessenger>false</fMessenger><annotations><Annotation><Name>MSN.IM.Display</Name><Value>1</Value></Annotation></annotations></GroupInfo></groupInfo></ABGroupAdd></soap:Body></soap:Envelope>"
+#define MSN_GROUP_ADD_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
+"<soap:Envelope"\
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+ "<soap:Header>"\
+ "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
+ "<IsMigration>false</IsMigration>"\
+ "<PartnerScenario>GroupSave</PartnerScenario>"\
+ "</ABApplicationHeader>"\
+ "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
+ "</ABAuthHeader>"\
+ "</soap:Header>"\
+ "<soap:Body>"\
+ "<ABGroupAdd xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<abId>00000000-0000-0000-0000-000000000000</abId>"\
+ "<groupAddOptions>"\
+ "<fRenameOnMsgrConflict>false</fRenameOnMsgrConflict>"\
+ "</groupAddOptions>"\
+ "<groupInfo>"\
+ "<GroupInfo>"\
+ "<name>%s</name>"\
+ "<groupType>C8529CE2-6EAD-434d-881F-341E17DB3FF8</groupType>"\
+ "<fMessenger>false</fMessenger>"\
+ "<annotations>"\
+ "<Annotation>"\
+ "<Name>MSN.IM.Display</Name>"\
+ "<Value>1</Value>"\
+ "</Annotation>"\
+ "</annotations>"\
+ "</GroupInfo>"\
+ "</groupInfo>"\
+ "</ABGroupAdd>"\
+ "</soap:Body>"\
+"</soap:Envelope>"
/* delete a group */
#define MSN_GROUP_DEL_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupDelete"
-#define MSN_GROUP_DEL_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>Timer</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABGroupDelete xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><groupFilter><groupIds><guid>%s</guid></groupIds></groupFilter></ABGroupDelete></soap:Body></soap:Envelope>"
+#define MSN_GROUP_DEL_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
+"<soap:Envelope"\
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+ "<soap:Header>"\
+ "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
+ "<IsMigration>false</IsMigration>"\
+ "<PartnerScenario>Timer</PartnerScenario>"\
+ "</ABApplicationHeader>"\
+ "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
+ "</ABAuthHeader>"\
+ "</soap:Header>"\
+ "<soap:Body>"\
+ "<ABGroupDelete xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<abId>00000000-0000-0000-0000-000000000000</abId>"\
+ "<groupFilter>"\
+ "<groupIds>"\
+ "<guid>%s</guid>"\
+ "</groupIds>"\
+ "</groupFilter>"\
+ "</ABGroupDelete>"\
+ "</soap:Body>"\
+"</soap:Envelope>"
/* change a group's name */
#define MSN_GROUP_RENAME_SOAP_ACTION "http://www.msn.com/webservices/AddressBook/ABGroupUpdate"
-#define MSN_GROUP_RENAME_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><soap:Header><ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId><IsMigration>false</IsMigration><PartnerScenario>Timer</PartnerScenario></ABApplicationHeader><ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\"><ManagedGroupRequest>false</ManagedGroupRequest></ABAuthHeader></soap:Header><soap:Body><ABGroupUpdate xmlns=\"http://www.msn.com/webservices/AddressBook\"><abId>00000000-0000-0000-0000-000000000000</abId><groups><Group><groupId>%s</groupId><groupInfo><name>%s</name></groupInfo><propertiesChanged>GroupName </propertiesChanged></Group></groups></ABGroupUpdate></soap:Body></soap:Envelope>"
+#define MSN_GROUP_RENAME_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
+"<soap:Envelope"\
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"\
+ "<soap:Header>"\
+ "<ABApplicationHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<ApplicationId>09607671-1C32-421F-A6A6-CBFAA51AB5F4</ApplicationId>"\
+ "<IsMigration>false</IsMigration>"\
+ "<PartnerScenario>Timer</PartnerScenario>"\
+ "</ABApplicationHeader>"\
+ "<ABAuthHeader xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<ManagedGroupRequest>false</ManagedGroupRequest>"\
+ "<TicketToken>%s</TicketToken>"\
+ "</ABAuthHeader>"\
+ "</soap:Header>"\
+ "<soap:Body>"\
+ "<ABGroupUpdate xmlns=\"http://www.msn.com/webservices/AddressBook\">"\
+ "<abId>00000000-0000-0000-0000-000000000000</abId>"\
+ "<groups>"\
+ "<Group>"\
+ "<groupId>%s</groupId>"\
+ "<groupInfo>"\
+ "<name>%s</name>"\
+ "</groupInfo>"\
+ "<propertiesChanged>GroupName </propertiesChanged>"\
+ "</Group>"\
+ "</groups>"\
+ "</ABGroupUpdate>"\
+ "</soap:Body>"\
+"</soap:Envelope>"
typedef enum
{
diff --git a/libpurple/protocols/msn/msn.h b/libpurple/protocols/msn/msn.h
index fb587e0eb2..0bddcc08d3 100644
--- a/libpurple/protocols/msn/msn.h
+++ b/libpurple/protocols/msn/msn.h
@@ -66,12 +66,10 @@
/* Windows Live Messenger Server*/
#define WLM_SERVER "muser.messenger.hotmail.com"
#define WLM_PORT 1863
-#define WLM_PROT_VER 13
-/*This MSNP14 Support chat with Yahoo Messenger*/
-#define WLM_YAHOO_PROT_VER 14
+#define WLM_PROT_VER 15
-#define WLM_MAX_PROTOCOL 14
-#define WLM_MIN_PROTOCOL 13
+#define WLM_MAX_PROTOCOL 15
+#define WLM_MIN_PROTOCOL 15
#define MSN_TYPING_RECV_TIMEOUT 6
#define MSN_TYPING_SEND_TIMEOUT 4
diff --git a/libpurple/protocols/msn/msnutils.c b/libpurple/protocols/msn/msnutils.c
index 5bfdd605df..d3fd3fb13d 100644
--- a/libpurple/protocols/msn/msnutils.c
+++ b/libpurple/protocols/msn/msnutils.c
@@ -513,8 +513,8 @@ msn_handle_chl(char *input, char *output)
{
PurpleCipher *cipher;
PurpleCipherContext *context;
- char *productKey = MSNP13_WLM_PRODUCT_KEY,
- *productID = MSNP13_WLM_PRODUCT_ID,
+ char *productKey = MSNP15_WLM_PRODUCT_KEY,
+ *productID = MSNP15_WLM_PRODUCT_ID,
*hexChars = "0123456789abcdef",
buf[BUFSIZE];
unsigned char md5Hash[16], *newHash;
diff --git a/libpurple/protocols/msn/nexus.c b/libpurple/protocols/msn/nexus.c
index 58d553ac7f..40400dd3ca 100644
--- a/libpurple/protocols/msn/nexus.c
+++ b/libpurple/protocols/msn/nexus.c
@@ -26,7 +26,24 @@
#include "nexus.h"
#include "notification.h"
-#undef NEXUS_LOGIN_TWN
+
+/**************************************************************************
+ * Valid Ticket Tokens
+ **************************************************************************/
+
+#define SSO_VALID_TICKET_DOMAIN 0
+#define SSO_VALID_TICKET_POLICY 1
+static char *ticket_domains[][2] = {
+ /* http://msnpiki.msnfanatic.com/index.php/MSNP15:SSO */
+ /* {"Domain", "Policy Ref URI"}, Purpose */
+ {"messengerclear.live.com", NULL}, /* Authentication for messenger. */
+ {"messenger.msn.com", "?id=507"}, /* Messenger website authentication. */
+ {"contacts.msn.com", "MBI"}, /* Authentication for the Contact server. */
+ {"messengersecure.live.com", "MBI_SSL"}, /* Used for messenger.live.com */
+ {"spaces.live.com", "MBI"}, /* Authentication for the Windows Live Spaces */
+ {"livecontacts.live.com", "MBI"}, /* Live Contacts API, a simplified version of the Contacts SOAP service */
+ {"storage.live.com", "MBI"}, /* Storage REST API */
+};
/**************************************************************************
* Main
@@ -36,12 +53,17 @@ MsnNexus *
msn_nexus_new(MsnSession *session)
{
MsnNexus *nexus;
+ int i;
nexus = g_new0(MsnNexus, 1);
nexus->session = session;
- nexus->challenge_data = g_hash_table_new_full(g_str_hash,
- g_str_equal, g_free, g_free);
+ nexus->token_len = sizeof(ticket_domains) / sizeof(char *[2]);
+ nexus->tokens = g_malloc(sizeof(MsnTicketToken) * nexus->token_len);
+
+ for (i = 0; i < nexus->token_len; i++)
+ nexus->tokens[i].token = g_hash_table_new_full(g_str_hash, g_str_equal,
+ g_free, g_free);
return nexus;
}
@@ -49,47 +71,198 @@ msn_nexus_new(MsnSession *session)
void
msn_nexus_destroy(MsnNexus *nexus)
{
- if (nexus->challenge_data != NULL)
- g_hash_table_destroy(nexus->challenge_data);
+ int i;
+ for (i = 0; i < nexus->token_len; i++) {
+ g_hash_table_destroy(nexus->tokens[i].token);
+ g_free(nexus->tokens[i].secret);
+ }
+ g_free(nexus->tokens);
+ g_free(nexus->policy);
+ g_free(nexus->nonce);
g_free(nexus);
}
/**************************************************************************
+ * RPS/SSO Authentication
+ **************************************************************************/
+
+static char *
+sha1_hmac(const char *key, int key_len, const char *message, int msg_len)
+{
+ PurpleCipherContext *context;
+ char *result;
+ gboolean ret;
+
+ context = purple_cipher_context_new_by_name("hmac", NULL);
+ purple_cipher_context_set_option(context, "hash", "sha1");
+ purple_cipher_context_set_key_with_len(context, (guchar *)key, key_len);
+
+ purple_cipher_context_append(context, (guchar *)message, msg_len);
+ result = g_malloc(20);
+ ret = purple_cipher_context_digest(context, 20, (guchar *)result, NULL);
+
+ purple_cipher_context_destroy(context);
+
+ return result;
+}
+
+static char *
+rps_create_key(const char *key, int key_len, const char *data, size_t data_len)
+{
+ char *hash1, *hash2, *hash3, *hash4;
+ char *result;
+
+ hash1 = sha1_hmac(key, key_len, data, data_len);
+ hash1 = g_realloc(hash1, 20 + data_len);
+ memcpy(hash1 + 20, data, data_len);
+ hash2 = sha1_hmac(key, key_len, hash1, 20 + data_len);
+
+ hash3 = sha1_hmac(key, key_len, hash1, 20);
+
+ hash3 = g_realloc(hash3, 20 + data_len);
+ memcpy(hash3 + 20, data, data_len);
+ hash4 = sha1_hmac(key, key_len, hash3, 20 + data_len);
+
+ result = g_malloc(24);
+ memcpy(result, hash2, 20);
+ memcpy(result + 20, hash4, 4);
+
+ g_free(hash1);
+ g_free(hash2);
+ g_free(hash3);
+ g_free(hash4);
+
+ return result;
+}
+
+static char *
+des3_cbc(const char *key, const char *iv, const char *data, int len)
+{
+ PurpleCipherContext *des3;
+ char *out;
+ size_t outlen;
+
+ des3 = purple_cipher_context_new_by_name("des3", NULL);
+ purple_cipher_context_set_key(des3, (guchar *)key);
+ purple_cipher_context_set_batch_mode(des3, PURPLE_CIPHER_BATCH_MODE_CBC);
+ purple_cipher_context_set_iv(des3, (guchar *)iv, 8);
+
+ out = g_malloc(len);
+ purple_cipher_context_encrypt(des3, (guchar *)data, len, (guchar *)out, &outlen);
+
+ purple_cipher_context_destroy(des3);
+
+ return out;
+}
+
+#define CRYPT_MODE_CBC 1
+#define CIPHER_TRIPLE_DES 0x6603
+#define HASH_SHA1 0x8004
+static char *
+msn_rps_encrypt(MsnNexus *nexus)
+{
+ MsnUsrKey *usr_key;
+ const char *magic1 = "WS-SecureConversationSESSION KEY HASH";
+ const char *magic2 = "WS-SecureConversationSESSION KEY ENCRYPTION";
+ size_t len;
+ char *hash;
+ char *key1, *key2, *key3;
+ gsize key1_len;
+ char *nonce_fixed;
+ char *cipher;
+ char *response;
+
+ usr_key = g_malloc(sizeof(MsnUsrKey));
+ usr_key->size = GUINT32_TO_LE(28);
+ usr_key->crypt_mode = GUINT32_TO_LE(CRYPT_MODE_CBC);
+ usr_key->cipher_type = GUINT32_TO_LE(CIPHER_TRIPLE_DES);
+ usr_key->hash_type = GUINT32_TO_LE(HASH_SHA1);
+ usr_key->iv_len = GUINT32_TO_LE(8);
+ usr_key->hash_len = GUINT32_TO_LE(20);
+ usr_key->cipher_len = GUINT32_TO_LE(72);
+
+ key1 = (char *)purple_base64_decode((const char *)nexus->tokens[MSN_AUTH_MESSENGER].secret, &key1_len);
+ len = strlen(magic1);
+ key2 = rps_create_key(key1, key1_len, magic1, len);
+ len = strlen(magic2);
+ key3 = rps_create_key(key1, key1_len, magic2, len);
+
+ usr_key->iv[0] = 0x46; //rand() % 256;
+ usr_key->iv[1] = 0xC4;
+ usr_key->iv[2] = 0x14;
+ usr_key->iv[3] = 0x9F;
+ usr_key->iv[4] = 0xFF;
+ usr_key->iv[5] = 0xFC;
+ usr_key->iv[6] = 0x91;
+ usr_key->iv[7] = 0x61;
+
+ len = strlen(nexus->nonce);
+ hash = sha1_hmac(key2, 24, nexus->nonce, len);
+
+ /* We need to pad this to 72 bytes, apparently */
+ nonce_fixed = g_malloc(len + 8);
+ memcpy(nonce_fixed, nexus->nonce, len);
+ memset(nonce_fixed + len, 0x08, 8);
+ cipher = des3_cbc(key3, usr_key->iv, nonce_fixed, len + 8);
+ g_free(nonce_fixed);
+
+ memcpy(usr_key->hash, hash, 20);
+ memcpy(usr_key->cipher, cipher, 72);
+
+ g_free(key1);
+ g_free(key2);
+ g_free(key3);
+ g_free(hash);
+ g_free(cipher);
+
+ response = purple_base64_encode((guchar *)usr_key, sizeof(MsnUsrKey));
+
+ g_free(usr_key);
+
+ return response;
+}
+
+/**************************************************************************
* Login
**************************************************************************/
-static void
-nexus_got_response_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data)
+static gboolean
+nexus_parse_response(MsnNexus *nexus, xmlnode *xml)
{
- MsnNexus *nexus = data;
- MsnSession *session = nexus->session;
xmlnode *node;
+ gboolean result = FALSE;
- if (resp == NULL) {
- msn_session_set_error(session, MSN_ERROR_SERVCONN, _("Windows Live ID authentication:Unable to connect"));
- return;
- }
+ node = msn_soap_xml_get(xml, "Body/RequestSecurityTokenResponseCollection/RequestSecurityTokenResponse");
- node = msn_soap_xml_get(resp->xml, "Body/"
- "RequestSecurityTokenResponseCollection/RequestSecurityTokenResponse");
+ if (node)
+ node = node->next; /* The first one is not useful */
+ else
+ return FALSE;
for (; node; node = node->next) {
- xmlnode *token = msn_soap_xml_get(node,
- "RequestedSecurityToken/BinarySecurityToken");
+ xmlnode *token = msn_soap_xml_get(node, "RequestedSecurityToken/BinarySecurityToken");
+ xmlnode *secret = msn_soap_xml_get(node, "RequestedProofToken/BinarySecret");
+ xmlnode *expires = msn_soap_xml_get(node, "LifeTime/Expires");
if (token) {
char *token_str = xmlnode_get_data(token);
+ const char *id_str = xmlnode_get_attrib(token, "Id");
char **elems, **cur, **tokens;
- char *msn_twn_t, *msn_twn_p, *cert_str;
+ int id;
if (token_str == NULL) continue;
+ if (id_str == NULL) continue;
+
+ id = atol(id_str + 7) - 1; /* 'Compact#' or 'PPToken#' */
+ if (id >= nexus->token_len)
+ continue; /* Where did this come from? */
elems = g_strsplit(token_str, "&", 0);
for (cur = elems; *cur != NULL; cur++){
tokens = g_strsplit(*cur, "=", 2);
- g_hash_table_insert(nexus->challenge_data, tokens[0], tokens[1]);
+ g_hash_table_insert(nexus->tokens[id].token, tokens[0], tokens[1]);
/* Don't free each of the tokens, only the array. */
g_free(tokens);
}
@@ -97,33 +270,55 @@ nexus_got_response_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data)
g_free(token_str);
g_strfreev(elems);
- msn_twn_t = g_hash_table_lookup(nexus->challenge_data, "t");
- msn_twn_p = g_hash_table_lookup(nexus->challenge_data, "p");
+ if (secret)
+ nexus->tokens[id].secret = g_strdup(xmlnode_get_data(secret));
+ else
+ nexus->tokens[id].secret = NULL;
- /*setup the t and p parameter for session*/
- if (session->passport_info.t != NULL){
- g_free(session->passport_info.t);
- }
- session->passport_info.t = g_strdup(msn_twn_t);
+ /* Yay for MS using ISO-8601 */
+ nexus->tokens[id].expiry = purple_str_to_time(xmlnode_get_data(expires),
+ FALSE, NULL, NULL, NULL);
- if (session->passport_info.p != NULL)
- g_free(session->passport_info.p);
- session->passport_info.p = g_strdup(msn_twn_p);
+ purple_debug_info("msnp15", "Updated ticket for domain '%s'\n",
+ ticket_domains[id][SSO_VALID_TICKET_DOMAIN]);
+ result = TRUE;
+ }
+ }
- cert_str = g_strdup_printf("t=%s&p=%s",msn_twn_t,msn_twn_p);
- msn_got_login_params(session, cert_str);
+ return result;
+}
- purple_debug_info("MSN Nexus","Close nexus connection!\n");
- g_free(cert_str);
- msn_nexus_destroy(nexus);
- session->nexus = NULL;
+static void
+nexus_got_response_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data)
+{
+ MsnNexus *nexus = data;
+ MsnSession *session = nexus->session;
+ char *msn_twn_t, *msn_twn_p, *ticket;
+ char *response;
- return;
- }
+ if (resp == NULL) {
+ msn_session_set_error(session, MSN_ERROR_SERVCONN, _("Windows Live ID authentication:Unable to connect"));
+ return;
}
- /* we must have failed! */
- msn_session_set_error(session, MSN_ERROR_AUTH, _("Windows Live ID authentication: cannot find authenticate token in server response"));
+ if (!nexus_parse_response(nexus, resp->xml)) {
+ msn_session_set_error(session, MSN_ERROR_SERVCONN, _("Windows Live ID authentication:Invalid response"));
+ return;
+ }
+
+ /*setup the t and p parameter for session*/
+ msn_twn_t = g_hash_table_lookup(nexus->tokens[MSN_AUTH_MESSENGER].token, "t");
+ msn_twn_p = g_hash_table_lookup(nexus->tokens[MSN_AUTH_MESSENGER].token, "p");
+ g_free(session->passport_info.t);
+ session->passport_info.t = g_strdup(msn_twn_t);
+ g_free(session->passport_info.p);
+ session->passport_info.p = g_strdup(msn_twn_p);
+
+ ticket = g_strdup_printf("t=%s&p=%s", msn_twn_t, msn_twn_p);
+ response = msn_rps_encrypt(nexus);
+ msn_got_login_params(session, ticket, response);
+ g_free(ticket);
+ g_free(response);
}
/*when connect, do the SOAP Style windows Live ID authentication */
@@ -131,92 +326,118 @@ void
msn_nexus_connect(MsnNexus *nexus)
{
MsnSession *session = nexus->session;
- char *ru,*lc,*id,*tw,*ct,*kpp,*kv,*ver,*rn,*tpf;
- char *fs0,*fs;
char *username, *password;
- char *tail;
-#ifdef NEXUS_LOGIN_TWN
- char *challenge_str;
-#else
- char *rst1_str,*rst2_str,*rst3_str;
-#endif
+ GString *domains;
+ char *request;
+ int i;
MsnSoapMessage *soap;
- purple_debug_info("MSN Nexus","Starting Windows Live ID authentication\n");
msn_session_set_login_step(session, MSN_LOGIN_STEP_GET_COOKIE);
- /*prepare the Windows Live ID authentication token*/
username = g_strdup(purple_account_get_username(session->account));
password = g_strndup(purple_connection_get_password(session->account->gc), 16);
- lc = (char *)g_hash_table_lookup(nexus->challenge_data, "lc");
- id = (char *)g_hash_table_lookup(nexus->challenge_data, "id");
- tw = (char *)g_hash_table_lookup(nexus->challenge_data, "tw");
- fs0= (char *)g_hash_table_lookup(nexus->challenge_data, "fs");
- ru = (char *)g_hash_table_lookup(nexus->challenge_data, "ru");
- ct = (char *)g_hash_table_lookup(nexus->challenge_data, "ct");
- kpp= (char *)g_hash_table_lookup(nexus->challenge_data, "kpp");
- kv = (char *)g_hash_table_lookup(nexus->challenge_data, "kv");
- ver= (char *)g_hash_table_lookup(nexus->challenge_data, "ver");
- rn = (char *)g_hash_table_lookup(nexus->challenge_data, "rn");
- tpf= (char *)g_hash_table_lookup(nexus->challenge_data, "tpf");
-
- /*
- * add some fail-safe code to avoid windows Purple Crash bug #1540454
- * If any of these string is NULL, will return Authentication Fail!
- * for when windows g_strdup_printf() implementation get NULL point,It crashed!
- */
- if(!(lc && id && tw && ru && ct && kpp && kv && ver && tpf)){
- purple_debug_error("MSN Nexus","WLM Authenticate Key Error!\n");
- msn_session_set_error(session, MSN_ERROR_AUTH, _("Windows Live ID authentication Failed"));
- g_free(username);
- g_free(password);
- msn_nexus_destroy(nexus);
- session->nexus = NULL;
- return;
+ purple_debug_info("msnp15", "Logging on %s, with policy '%s', nonce '%s'\n",
+ username, nexus->policy, nexus->nonce);
+
+ domains = g_string_new(NULL);
+ for (i = 0; i < nexus->token_len; i++) {
+ g_string_append_printf(domains, MSN_SSO_RST_TEMPLATE,
+ i+1,
+ ticket_domains[i][SSO_VALID_TICKET_DOMAIN],
+ ticket_domains[i][SSO_VALID_TICKET_POLICY] != NULL ?
+ ticket_domains[i][SSO_VALID_TICKET_POLICY] :
+ nexus->policy);
}
- /*
- * in old MSN NS server's "USR TWN S" return,didn't include fs string
- * so we use a default "1" for fs.
- */
- if(fs0){
- fs = g_strdup(fs0);
- }else{
- fs = g_strdup("1");
- }
+ request = g_strdup_printf(MSN_SSO_TEMPLATE, username, password, domains->str);
+ g_free(username);
+ g_free(password);
+ g_string_free(domains, TRUE);
+
+ soap = msn_soap_message_new(NULL, xmlnode_from_str(request, -1));
+ g_free(request);
+ msn_soap_message_send(session, soap, MSN_SSO_SERVER, SSO_POST_URL,
+ nexus_got_response_cb, nexus);
+}
+
+static void
+nexus_got_update_cb(MsnSoapMessage *req, MsnSoapMessage *resp, gpointer data)
+{
+ MsnNexus *nexus = data;
+
+ nexus_parse_response(nexus, resp->xml);
+}
+
+static void
+msn_nexus_update_token(MsnNexus *nexus, int id)
+{
+ MsnSession *session = nexus->session;
+ char *username, *password;
+ char *domain;
+ char *request;
-#ifdef NEXUS_LOGIN_TWN
- challenge_str = g_strdup_printf(
- "lc=%s&amp;id=%s&amp;tw=%s&amp;fs=%s&amp;ru=%s&amp;ct=%s&amp;kpp=%s&amp;kv=%s&amp;ver=%s&amp;rn=%s&amp;tpf=%s\r\n",
- lc,id,tw,fs,ru,ct,kpp,kv,ver,rn,tpf
- );
-
- /*build the SOAP windows Live ID XML body */
- tail = g_strdup_printf(TWN_ENVELOP_TEMPLATE, username, password, challenge_str);
- g_free(challenge_str);
-#else
- rst1_str = g_strdup_printf(
- "id=%s&amp;tw=%s&amp;fs=%s&amp;kpp=%s&amp;kv=%s&amp;ver=%s&amp;rn=%s",
- id,tw,fs,kpp,kv,ver,rn
- );
- rst2_str = g_strdup_printf(
- "fs=%s&amp;id=%s&amp;kv=%s&amp;rn=%s&amp;tw=%s&amp;ver=%s",
- fs,id,kv,rn,tw,ver
- );
- rst3_str = g_strdup_printf("id=%s",id);
- tail = g_strdup_printf(TWN_LIVE_ENVELOP_TEMPLATE,username,password,rst1_str,rst2_str,rst3_str);
- g_free(rst1_str);
- g_free(rst2_str);
- g_free(rst3_str);
-#endif
- g_free(fs);
+ MsnSoapMessage *soap;
+
+ username = g_strdup(purple_account_get_username(session->account));
+ password = g_strndup(purple_connection_get_password(session->account->gc), 16);
+
+ purple_debug_info("msnp15", "Updating ticket for user '%s' on domain '%s'\n",
+ username, ticket_domains[id][SSO_VALID_TICKET_DOMAIN]);
+
+ /* TODO: This really assumes if we send RSTn, the server responds with
+ Compactn, even if there is no RST(n-1). This needs checking.
+ */
+ domain = g_strdup_printf(MSN_SSO_RST_TEMPLATE,
+ id,
+ ticket_domains[id][SSO_VALID_TICKET_DOMAIN],
+ ticket_domains[id][SSO_VALID_TICKET_POLICY] != NULL ?
+ ticket_domains[id][SSO_VALID_TICKET_POLICY] :
+ nexus->policy);
+
+ request = g_strdup_printf(MSN_SSO_TEMPLATE, username, password, domain);
+ g_free(username);
g_free(password);
+ g_free(domain);
- soap = msn_soap_message_new(NULL, xmlnode_from_str(tail, -1));
- g_free(tail);
- msn_soap_message_send(nexus->session, soap, MSN_TWN_SERVER, TWN_POST_URL,
- nexus_got_response_cb, nexus);
+ soap = msn_soap_message_new(NULL, xmlnode_from_str(request, -1));
+ g_free(request);
+ msn_soap_message_send(session, soap, MSN_SSO_SERVER, SSO_POST_URL,
+ nexus_got_update_cb, nexus);
}
+GHashTable *
+msn_nexus_get_token(MsnNexus *nexus, MsnAuthDomains id)
+{
+ g_return_val_if_fail(nexus != NULL, NULL);
+ g_return_val_if_fail(id < nexus->token_len, NULL);
+
+ if (time(NULL) > nexus->tokens[id].expiry)
+ msn_nexus_update_token(nexus, id);
+
+ return nexus->tokens[id].token;
+}
+
+const char *
+msn_nexus_get_token_str(MsnNexus *nexus, MsnAuthDomains id)
+{
+ static char buf[1024];
+ GHashTable *token = msn_nexus_get_token(nexus, id);
+ const char *msn_t;
+ const char *msn_p;
+ gint ret;
+
+ g_return_val_if_fail(token != NULL, NULL);
+
+ msn_t = g_hash_table_lookup(token, "t");
+ msn_p = g_hash_table_lookup(token, "p");
+
+ g_return_val_if_fail(msn_t != NULL, NULL);
+ g_return_val_if_fail(msn_p != NULL, NULL);
+
+ ret = g_snprintf(buf, sizeof(buf) - 1, "t=%s&amp;p=%s", msn_t, msn_p);
+ g_return_val_if_fail(ret != -1, NULL);
+
+ return buf;
+}
diff --git a/libpurple/protocols/msn/nexus.h b/libpurple/protocols/msn/nexus.h
index 02bccaf854..757f9dcef5 100644
--- a/libpurple/protocols/msn/nexus.h
+++ b/libpurple/protocols/msn/nexus.h
@@ -26,125 +26,115 @@
#include "soap.h"
-/*#define MSN_TWN_SERVER "loginnet.passport.com"*/
-#define MSN_TWN_SERVER "login.live.com"
+/* Index into ticket_tokens in nexus.c Keep updated! */
+typedef enum
+{
+ MSN_AUTH_MESSENGER = 0,
+ MSN_AUTH_MESSENGER_WEB = 1,
+ MSN_AUTH_CONTACTS = 2,
+ MSN_AUTH_LIVE_SECURE = 3,
+ MSN_AUTH_SPACES = 4,
+ MSN_AUTH_LIVE_CONTACTS = 5,
+ MSN_AUTH_STORAGE = 6
+} MsnAuthDomains;
-#define TWN_START_TOKEN "<wsse:BinarySecurityToken Id=\"PPToken1\">"
-#define TWN_END_TOKEN "</wsse:BinarySecurityToken>"
+#define MSN_SSO_SERVER "login.live.com"
+#define SSO_POST_URL "/RST.srf"
-#define TWN_POST_URL "/RST.srf"
-#define TWN_ENVELOP_TEMPLATE "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"\
- "<Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsse=\"http://schemas.xmlsoap.org/ws/2003/06/secext\" xmlns:saml=\"urn:oasis:names:tc:SAML:1.0:assertion\" xmlns:wsp=\"http://schemas.xmlsoap.org/ws/2002/12/policy\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/03/addressing\" xmlns:wssc=\"http://schemas.xmlsoap.org/ws/2004/04/sc\" xmlns:wst=\"http://schemas.xmlsoap.org/ws/2004/04/trust\">"\
- "<Header>"\
- "<ps:AuthInfo xmlns:ps=\"http://schemas.microsoft.com/Passport/SoapServices/PPCRL\" Id=\"PPAuthInfo\">"\
- "<ps:HostingApp>{3:B}</ps:HostingApp>"\
- "<ps:BinaryVersion>4</ps:BinaryVersion>"\
- "<ps:UIVersion>1</ps:UIVersion>"\
- "<ps:Cookies></ps:Cookies>"\
- "<ps:RequestParams>AQAAAAIAAABsYwQAAAAzMDg0</ps:RequestParams>"\
- "</ps:AuthInfo>"\
- "<wsse:Security>"\
- "<wsse:UsernameToken Id=\"user\">"\
- "<wsse:Username>%s</wsse:Username>"\
- "<wsse:Password>%s</wsse:Password>"\
- "</wsse:UsernameToken>"\
- "</wsse:Security>"\
- "</Header>"\
- "<Body>"\
- "<ps:RequestMultipleSecurityTokens xmlns:ps=\"http://schemas.microsoft.com/Passport/SoapServices/PPCRL\" Id=\"RSTS\">"\
- "<wst:RequestSecurityToken Id=\"RST0\">"\
- "<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>"\
- "<wsp:AppliesTo>"\
- "<wsa:EndpointReference>"\
- "<wsa:Address>http://Passport.NET/tb</wsa:Address>"\
- "</wsa:EndpointReference>"\
- "</wsp:AppliesTo>"\
- "</wst:RequestSecurityToken>"\
- "<wst:RequestSecurityToken Id=\"RST1\">"\
- "<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>"\
- "<wsp:AppliesTo>"\
- "<wsa:EndpointReference>"\
- "<wsa:Address>messenger.msn.com</wsa:Address>"\
- "</wsa:EndpointReference>"\
- "</wsp:AppliesTo>"\
- "<wsse:PolicyReference URI=\"?%s\">"\
- "</wsse:PolicyReference>"\
- "</wst:RequestSecurityToken>"\
- "</ps:RequestMultipleSecurityTokens>"\
- "</Body>"\
- "</Envelope>"
+#define MSN_SSO_RST_TEMPLATE \
+"<wst:RequestSecurityToken Id=\"RST%d\">"\
+ "<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>"\
+ "<wsp:AppliesTo>"\
+ "<wsa:EndpointReference>"\
+ "<wsa:Address>%s</wsa:Address>"\
+ "</wsa:EndpointReference>"\
+ "</wsp:AppliesTo>"\
+ "<wsse:PolicyReference URI=\"%s\"></wsse:PolicyReference>"\
+"</wst:RequestSecurityToken>"
-#define TWN_LIVE_START_TOKEN "<wsse:BinarySecurityToken Id=\"PPToken1\">"
-#define TWN_LIVE_END_TOKEN "</wsse:BinarySecurityToken>"
-#define TWN_LIVE_ENVELOP_TEMPLATE "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"\
-"<Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:wsse=\"http://schemas.xmlsoap.org/ws/2003/06/secext\" xmlns:saml=\"urn:oasis:names:tc:SAML:1.0:assertion\" xmlns:wsp=\"http://schemas.xmlsoap.org/ws/2002/12/policy\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/03/addressing\" xmlns:wssc=\"http://schemas.xmlsoap.org/ws/2004/04/sc\" xmlns:wst=\"http://schemas.xmlsoap.org/ws/2004/04/trust\">"\
- "<Header>"\
- "<ps:AuthInfo xmlns:ps=\"http://schemas.microsoft.com/Passport/SoapServices/PPCRL\" Id=\"PPAuthInfo\">"\
- "<ps:HostingApp>{7108E71A-9926-4FCB-BCC9-9A9D3F32E423}</ps:HostingApp>"\
- "<ps:BinaryVersion>4</ps:BinaryVersion>"\
- "<ps:UIVersion>1</ps:UIVersion>"\
- "<ps:Cookies></ps:Cookies>"\
- "<ps:RequestParams>AQAAAAIAAABsYwQAAAAyMDUy</ps:RequestParams>"\
- "</ps:AuthInfo>"\
- "<wsse:Security>"\
- "<wsse:UsernameToken Id=\"user\">"\
- "<wsse:Username>%s</wsse:Username>"\
- "<wsse:Password>%s</wsse:Password>"\
- "</wsse:UsernameToken>"\
- "</wsse:Security>"\
- "</Header>"\
- "<Body>"\
- "<ps:RequestMultipleSecurityTokens xmlns:ps=\"http://schemas.microsoft.com/Passport/SoapServices/PPCRL\" Id=\"RSTS\">"\
- "<wst:RequestSecurityToken Id=\"RST0\">"\
- "<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>"\
- "<wsp:AppliesTo>"\
- "<wsa:EndpointReference>"\
- "<wsa:Address>http://Passport.NET/tb</wsa:Address>"\
- "</wsa:EndpointReference>"\
- "</wsp:AppliesTo>"\
- "</wst:RequestSecurityToken>"\
- "<wst:RequestSecurityToken Id=\"RST1\">"\
- "<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>"\
- "<wsp:AppliesTo>"\
- "<wsa:EndpointReference>"\
- "<wsa:Address>messenger.msn.com</wsa:Address>"\
- "</wsa:EndpointReference>"\
- "</wsp:AppliesTo>"\
- "<wsse:PolicyReference URI=\"?%s\"></wsse:PolicyReference>"\
- "</wst:RequestSecurityToken>"\
- "<wst:RequestSecurityToken Id=\"RST2\">"\
- "<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>"\
- "<wsp:AppliesTo>"\
- "<wsa:EndpointReference>"\
- "<wsa:Address>contacts.msn.com</wsa:Address>"\
- "</wsa:EndpointReference>"\
- "</wsp:AppliesTo>"\
- "<wsse:PolicyReference URI=\"?%s\"></wsse:PolicyReference>"\
- " </wst:RequestSecurityToken>"\
- "<wst:RequestSecurityToken Id=\"RST3\">"\
- "<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>"\
- "<wsp:AppliesTo>"\
- "<wsa:EndpointReference>"\
- "<wsa:Address>voice.messenger.msn.com</wsa:Address>"\
- "</wsa:EndpointReference>"\
- " </wsp:AppliesTo>"\
- "<wsse:PolicyReference URI=\"?%s\"></wsse:PolicyReference>"\
- "</wst:RequestSecurityToken>"\
- "</ps:RequestMultipleSecurityTokens>"\
- "</Body>"\
+#define MSN_SSO_TEMPLATE "<?xml version='1.0' encoding='utf-8'?>"\
+"<Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\""\
+ " xmlns:wsse=\"http://schemas.xmlsoap.org/ws/2003/06/secext\""\
+ " xmlns:saml=\"urn:oasis:names:tc:SAML:1.0:assertion\""\
+ " xmlns:wsp=\"http://schemas.xmlsoap.org/ws/2002/12/policy\""\
+ " xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\""\
+ " xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2004/03/addressing\""\
+ " xmlns:wssc=\"http://schemas.xmlsoap.org/ws/2004/04/sc\""\
+ " xmlns:wst=\"http://schemas.xmlsoap.org/ws/2004/04/trust\">"\
+ "<Header>"\
+ "<ps:AuthInfo"\
+ " xmlns:ps=\"http://schemas.microsoft.com/Passport/SoapServices/PPCRL\""\
+ " Id=\"PPAuthInfo\">"\
+ "<ps:HostingApp>{7108E71A-9926-4FCB-BCC9-9A9D3F32E423}</ps:HostingApp>"\
+ "<ps:BinaryVersion>4</ps:BinaryVersion>"\
+ "<ps:UIVersion>1</ps:UIVersion>"\
+ "<ps:Cookies></ps:Cookies>"\
+ "<ps:RequestParams>AQAAAAIAAABsYwQAAAAxMDMz</ps:RequestParams>"\
+ "</ps:AuthInfo>"\
+ "<wsse:Security>"\
+ "<wsse:UsernameToken Id=\"user\">"\
+ "<wsse:Username>%s</wsse:Username>"\
+ "<wsse:Password>%s</wsse:Password>"\
+ "</wsse:UsernameToken>"\
+ "</wsse:Security>"\
+ "</Header>"\
+ "<Body>"\
+ "<ps:RequestMultipleSecurityTokens"\
+ " xmlns:ps=\"http://schemas.microsoft.com/Passport/SoapServices/PPCRL\""\
+ " Id=\"RSTS\">"\
+ "<wst:RequestSecurityToken Id=\"RST0\">"\
+ "<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>"\
+ "<wsp:AppliesTo>"\
+ "<wsa:EndpointReference>"\
+ "<wsa:Address>http://Passport.NET/tb</wsa:Address>"\
+ "</wsa:EndpointReference>"\
+ "</wsp:AppliesTo>"\
+ "</wst:RequestSecurityToken>"\
+ "%s" /* Other RSTn tokens */\
+ "</ps:RequestMultipleSecurityTokens>"\
+ "</Body>"\
"</Envelope>"
+typedef struct _MsnUsrKey MsnUsrKey;
+struct _MsnUsrKey
+{
+ int size; // 28. Does not count data
+ int crypt_mode; // CRYPT_MODE_CBC (1)
+ int cipher_type; // TripleDES (0x6603)
+ int hash_type; // SHA1 (0x8004)
+ int iv_len; // 8
+ int hash_len; // 20
+ int cipher_len; // 72
+ // Data
+ char iv[8];
+ char hash[20];
+ char cipher[72];
+};
+
+typedef struct _MsnTicketToken MsnTicketToken;
+struct _MsnTicketToken {
+ GHashTable *token;
+ char *secret;
+ time_t expiry;
+};
+
typedef struct _MsnNexus MsnNexus;
struct _MsnNexus
{
MsnSession *session;
- char * challenge_data_str;
- GHashTable *challenge_data;
+ char *policy;
+ char *nonce;
+
+ MsnTicketToken *tokens;
+ int token_len;
};
void msn_nexus_connect(MsnNexus *nexus);
MsnNexus *msn_nexus_new(MsnSession *session);
void msn_nexus_destroy(MsnNexus *nexus);
+GHashTable *msn_nexus_get_token(MsnNexus *session, MsnAuthDomains id);
+const char *msn_nexus_get_token_str(MsnNexus *session, MsnAuthDomains id);
#endif /* _MSN_NEXUS_H_ */
+
diff --git a/libpurple/protocols/msn/notification.c b/libpurple/protocols/msn/notification.c
index 80a24a017f..5b3de268a6 100644
--- a/libpurple/protocols/msn/notification.c
+++ b/libpurple/protocols/msn/notification.c
@@ -204,7 +204,7 @@ group_error_helper(MsnSession *session, const char *msg, const char *group_id, i
**************************************************************************/
void
-msn_got_login_params(MsnSession *session, const char *login_params)
+msn_got_login_params(MsnSession *session, const char *ticket, const char *response)
{
MsnCmdProc *cmdproc;
@@ -212,7 +212,7 @@ msn_got_login_params(MsnSession *session, const char *login_params)
msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH_END);
- msn_cmdproc_send(cmdproc, "USR", "TWN S %s", login_params);
+ msn_cmdproc_send(cmdproc, "USR", "SSO S %s %s", ticket, response);
}
static void
@@ -221,8 +221,8 @@ cvr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
PurpleAccount *account;
account = cmdproc->session->account;
- msn_cmdproc_send(cmdproc, "USR", "TWN I %s",
- purple_account_get_username(account));
+
+ msn_cmdproc_send(cmdproc, "USR", "SSO I %s", purple_account_get_username(account));
}
static void
@@ -248,32 +248,14 @@ usr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
// msn_cmdproc_send(cmdproc, "SYN", "%s", "0");
//TODO we should use SOAP contact to fetch contact list
}
- else if (!g_ascii_strcasecmp(cmd->params[1], "TWN"))
+ else if (!g_ascii_strcasecmp(cmd->params[1], "SSO"))
{
- /* Passport authentication */
- char **elems, **cur, **tokens;
+ /* RPS authentication */
session->nexus = msn_nexus_new(session);
- /* Parse the challenge data. */
- session->nexus->challenge_data_str = g_strdup(cmd->params[3]);
- elems = g_strsplit(cmd->params[3], ",", 0);
-
- for (cur = elems; *cur != NULL; cur++)
- {
- tokens = g_strsplit(*cur, "=", 2);
- if(tokens[0] && tokens[1])
- {
- purple_debug_info("MSNP14","challenge %p,key:%s,value:%s\n",
- session->nexus->challenge_data,tokens[0],tokens[1]);
- g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]);
- /* Don't free each of the tokens, only the array. */
- g_free(tokens);
- } else
- g_strfreev(tokens);
- }
-
- g_strfreev(elems);
+ session->nexus->policy = g_strdup(cmd->params[3]);
+ session->nexus->nonce = g_strdup(cmd->params[4]);
msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH_START);
@@ -343,7 +325,8 @@ ver_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
*/
msn_cmdproc_send(cmdproc, "CVR",
// "0x0409 winnt 5.1 i386 MSG80BETA 8.0.0689 msmsgs %s",
- "0x0804 winnt 5.1 i386 MSNMSGR 8.0.0792 msmsgs %s",
+// "0x0804 winnt 5.1 i386 MSNMSGR 8.0.0792 msmsgs %s",
+ "0x0409 winnt 5.1 i386 MSNMSGR 8.5.1288.816 msmsgs %s",
purple_account_get_username(account));
}
@@ -550,7 +533,7 @@ chl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
context = purple_cipher_context_new(cipher, NULL);
purple_cipher_context_append(context, (const guchar *)cmd->params[1],
strlen(cmd->params[1]));
- challenge_resp = MSNP13_WLM_PRODUCT_KEY;
+ challenge_resp = MSNP15_WLM_PRODUCT_KEY;
purple_cipher_context_append(context, (const guchar *)challenge_resp,
strlen(challenge_resp));
@@ -565,7 +548,7 @@ chl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
msn_handle_chl(cmd->params[1], buf);
#endif
// purple_debug_info("MSNP14","<<challenge:{%s}:{%s}\n",cmd->params[1],buf);
- trans = msn_transaction_new(cmdproc, "QRY", "%s 32", MSNP13_WLM_PRODUCT_ID);
+ trans = msn_transaction_new(cmdproc, "QRY", "%s 32", MSNP15_WLM_PRODUCT_ID);
msn_transaction_set_payload(trans, buf, 32);
diff --git a/libpurple/protocols/msn/notification.h b/libpurple/protocols/msn/notification.h
index 8ec9589330..d28064b14d 100644
--- a/libpurple/protocols/msn/notification.h
+++ b/libpurple/protocols/msn/notification.h
@@ -25,6 +25,11 @@
#define _MSN_NOTIFICATION_H_
/*MSN protocol challenge info*/
+
+/*MSNP15 challenge: WLM 8.5.1288.816*/
+#define MSNP15_WLM_PRODUCT_KEY "ILTXC!4IXB5FB*PX"
+#define MSNP15_WLM_PRODUCT_ID "PROD0119GSJUC$18"
+
/*MSNP13 challenge*/
#define MSNP13_WLM_PRODUCT_KEY "O4BG@C7BWLYQX?5G"
#define MSNP13_WLM_PRODUCT_ID "PROD01065C%ZFN6F"
@@ -76,6 +81,6 @@ void msn_notification_dump_contact(MsnSession *session);
*/
void msn_notification_close(MsnNotification *notification);
-void msn_got_login_params(MsnSession *session, const char *login_params);
+void msn_got_login_params(MsnSession *session, const char *ticket, const char *response);
#endif /* _MSN_NOTIFICATION_H_ */
diff --git a/libpurple/protocols/msn/oim.c b/libpurple/protocols/msn/oim.c
index 5b90f1f6f9..5a4ef3b404 100644
--- a/libpurple/protocols/msn/oim.c
+++ b/libpurple/protocols/msn/oim.c
@@ -217,7 +217,7 @@ void
msn_oim_send_msg(MsnOim *oim)
{
MsnOimSendReq *oim_request;
- char *soap_body,*mspauth;
+ char *soap_body;
char *msg_body;
g_return_if_fail(oim != NULL);
@@ -225,16 +225,12 @@ msn_oim_send_msg(MsnOim *oim)
g_return_if_fail(oim_request != NULL);
purple_debug_info("MSNP14","sending OIM: %s\n", oim_request->oim_msg);
- mspauth = g_strdup_printf("t=%s&amp;p=%s",
- oim->session->passport_info.t,
- oim->session->passport_info.p
- );
/* if we got the challenge lock key, we compute it
* else we go for the SOAP fault and resend it.
*/
if(oim->challenge == NULL){
- purple_debug_info("MSNP14","no lock key challenge,wait for SOAP Fault and Resend\n");
+ purple_debug_info("MSNP14","no lock key challenge, wait for SOAP Fault and Resend\n");
}
msg_body = msn_oim_msg_to_str(oim, oim_request->oim_msg);
@@ -242,8 +238,8 @@ msn_oim_send_msg(MsnOim *oim)
oim_request->from_member,
oim_request->friendname,
oim_request->to_member,
- mspauth,
- MSNP13_WLM_PRODUCT_ID,
+ msn_nexus_get_token_str(oim->session->nexus, MSN_AUTH_LIVE_SECURE),
+ MSNP15_WLM_PRODUCT_ID,
oim->challenge ? oim->challenge : "",
oim->send_seq,
msg_body);
@@ -258,7 +254,6 @@ msn_oim_send_msg(MsnOim *oim)
oim->send_seq++;
}
- g_free(mspauth);
g_free(msg_body);
g_free(soap_body);
}
@@ -472,7 +467,7 @@ msn_parse_oim_msg(MsnOim *oim,const char *xmlmsg)
xmlnode *iu_node;
MsnSession *session = oim->session;
- purple_debug_info("MSNP14:OIM", "%s", xmlmsg);
+ purple_debug_info("MSNP14:OIM", "%s\n", xmlmsg);
node = xmlnode_from_str(xmlmsg, -1);
if (strcmp(node->name, "MD") != 0) {
diff --git a/libpurple/protocols/msn/oim.h b/libpurple/protocols/msn/oim.h
index e15463baf9..9903e4395d 100644
--- a/libpurple/protocols/msn/oim.h
+++ b/libpurple/protocols/msn/oim.h
@@ -77,11 +77,11 @@
#define MSN_OIM_SEND_HOST "ows.messenger.msn.com"
#define MSN_OIM_SEND_URL "/OimWS/oim.asmx"
-#define MSN_OIM_SEND_SOAP_ACTION "http://messenger.msn.com/ws/2004/09/oim/Store"
+#define MSN_OIM_SEND_SOAP_ACTION "http://messenger.live.com/ws/2006/09/oim/Store2"
#define MSN_OIM_SEND_TEMPLATE "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\
"<soap:Header>"\
- "<From memberName=\"%s\" friendlyName=\"%s\" xml:lang=\"en-US\" proxy=\"MSNMSGR\" xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\" msnpVer=\"MSNP14\" buildVer=\"8.0.0792\"/>"\
+ "<From memberName=\"%s\" friendlyName=\"%s\" xml:lang=\"en-US\" proxy=\"MSNMSGR\" xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\" msnpVer=\"MSNP15\" buildVer=\"8.1.0178\"/>"\
"<To memberName=\"%s\" xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\"/>"\
"<Ticket passport=\"%s\" appid=\"%s\" lockkey=\"%s\" xmlns=\"http://messenger.msn.com/ws/2004/09/oim/\"/>"\
"<Sequence xmlns=\"http://schemas.xmlsoap.org/ws/2003/03/rm\">"\
diff --git a/libpurple/protocols/msn/session.c b/libpurple/protocols/msn/session.c
index 8a9c1be9b6..e71fdf8cf4 100644
--- a/libpurple/protocols/msn/session.c
+++ b/libpurple/protocols/msn/session.c
@@ -45,8 +45,6 @@ msn_session_new(PurpleAccount *account)
purple_account_get_username(account), NULL);
session->oim = msn_oim_new(session);
- /*if you want to chat with Yahoo Messenger*/
- //session->protocol_ver = WLM_YAHOO_PROT_VER;
session->protocol_ver = WLM_PROT_VER;
session->conv_seq = 1;
diff --git a/libpurple/protocols/msn/soap.c b/libpurple/protocols/msn/soap.c
index 840864024e..aa0a977c1b 100644
--- a/libpurple/protocols/msn/soap.c
+++ b/libpurple/protocols/msn/soap.c
@@ -835,7 +835,6 @@ msn_soap_post_request(MsnSoapConn *soapconn, MsnSoapReq *request)
"POST %s HTTP/1.1\r\n"
"SOAPAction: %s\r\n"
"Content-Type:text/xml; charset=utf-8\r\n"
- "Cookie: MSPAuth=%s\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"
"Accept: */*\r\n"
"Host: %s\r\n"
@@ -845,7 +844,6 @@ msn_soap_post_request(MsnSoapConn *soapconn, MsnSoapReq *request)
"%s",
request->login_path,
request->soap_action,
- soapconn->session->passport_info.mspauth,
request->login_host,
strlen(request->body),
request->body
diff --git a/libpurple/protocols/msn/soap2.c b/libpurple/protocols/msn/soap2.c
index 850d21604f..2234f9dd31 100644
--- a/libpurple/protocols/msn/soap2.c
+++ b/libpurple/protocols/msn/soap2.c
@@ -464,22 +464,15 @@ msn_soap_connection_run(gpointer data)
int len = -1;
char *body = xmlnode_to_str(req->message->xml, &len);
GSList *iter;
- char *authstr = NULL;
g_queue_pop_head(conn->queue);
conn->buf = g_string_new("");
- if (conn->session->passport_info.mspauth)
- authstr = g_strdup_printf("Cookie: MSPAuth=%s\r\n",
- conn->session->passport_info.mspauth);
-
-
g_string_append_printf(conn->buf,
"POST %s HTTP/1.1\r\n"
"SOAPAction: %s\r\n"
"Content-Type:text/xml; charset=utf-8\r\n"
- "%s"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"
"Accept: */*\r\n"
"Host: %s\r\n"
@@ -487,7 +480,7 @@ msn_soap_connection_run(gpointer data)
"Connection: Keep-Alive\r\n"
"Cache-Control: no-cache\r\n",
req->path, req->message->action ? req->message->action : "",
- authstr ? authstr : "", conn->host, len);
+ conn->host, len);
for (iter = req->message->headers; iter; iter = iter->next) {
g_string_append(conn->buf, (char *)iter->data);
@@ -506,7 +499,6 @@ msn_soap_connection_run(gpointer data)
PURPLE_INPUT_WRITE, msn_soap_write_cb, conn);
msn_soap_write_cb(conn, conn->ssl->fd, PURPLE_INPUT_WRITE);
- g_free(authstr);
g_free(body);
}
}