Chat-O-Matic/libs/libmsn/soap.cpp

2583 lines
123 KiB
C++
Raw Normal View History

/*
* soap.cpp
* libmsn
*
* Crated by Tiago Salem Herrmann on 08/2007.
* Copyright (c) 2007 Tiago Salem Herrmann. All rights reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <notificationserver.h>
#include <errorcodes.h>
#include <externals.h>
#include <md5.h>
#include <util.h>
#include <soap.h>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string.h>
#include "xmlParser.h"
namespace MSN {
std::map<int,std::string> Soap::actionDomains;
std::map<int,std::string> Soap::actionPOSTURLs;
std::map<int,std::string> Soap::actionURLs;
Soap::Soap(NotificationServerConnection & _myNotificationServer) :
Connection(),
notificationServer(_myNotificationServer)
{
fillURLs();
}
Soap::Soap(NotificationServerConnection & _myNotificationServer, std::vector<sitesToAuth> _sitesToAuthList) :
Connection(),
notificationServer(_myNotificationServer),
sitesToAuthList(_sitesToAuthList)
{
fillURLs();
}
void Soap::requestSoapAction(soapAction action,std::string xml_body, std::string &xml_response)
{
this->action = action;
std::string full_msg;
full_msg.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
full_msg.append(this->request_body);
std::string http_header("POST "+actionPOSTURLs[action]+" HTTP/1.1\r\n");
if(action != AUTH)
{
http_header.append("SOAPAction: "+actionURLs[action]+"\r\n");
}
http_header.append(
"Accept: */*\r\n"
"Content-Type: text/xml; charset=utf-8\r\n"
"Cache-Control: no-cache\r\n"
"Proxy-Connection: Keep-Alive\r\n"
"Connection: Keep-Alive\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; Windows Live Messenger 8.1.0178)\r\n"
"Host: "+actionDomains[action]+"\r\n"
"Content-Length: " +toStr(full_msg.length()) +"\r\n\r\n"
);
if ((this->sock = this->myNotificationServer()->externalCallbacks.connectToServer(actionDomains[action], 443, &this->connected, true)) == NULL)
{
this->myNotificationServer()->externalCallbacks.showError(this, "Could not connect to server");
return;
}
this->myNotificationServer()->externalCallbacks.registerSocket(this->sock, 0, 1, true);
if (this->connected)
this->socketConnectionCompleted();
std::ostringstream buf_;
buf_ << http_header << full_msg;
if(this->write(buf_) != buf_.str().size())
return;
this->myNotificationServer()->addSoapConnection(this);
}
void Soap::setMBI(std::string MBI)
{
this->mbi = MBI;
for(unsigned int d=0; d< sitesToAuthList.size(); d++)
{
// we just receive this MBI at connection time
if(sitesToAuthList[d].url=="messengerclear.live.com")
sitesToAuthList[d].URI=MBI;
}
}
void Soap::fillURLs()
{
sitesToAuth sta;
actionDomains[AUTH] = "login.live.com";
actionDomains[GET_LISTS] = "by5.omega.contacts.msn.com";
actionDomains[GET_ADDRESS_BOOK] = "by5.omega.contacts.msn.com";
actionDomains[ADD_CONTACT_TO_LIST] = "by5.omega.contacts.msn.com";
actionDomains[DEL_CONTACT_FROM_LIST] = "by5.omega.contacts.msn.com";
actionDomains[DEL_CONTACT_FROM_ADDRESSBOOK] = "by5.omega.contacts.msn.com";
actionDomains[ADD_CONTACT_TO_ADDRESSBOOK] = "by5.omega.contacts.msn.com";
actionDomains[DISABLE_CONTACT_ON_ADDRESSBOOK] = "by5.omega.contacts.msn.com";
actionDomains[ENABLE_CONTACT_ON_ADDRESSBOOK] = "by5.omega.contacts.msn.com";
actionDomains[ADD_GROUP] = "by5.omega.contacts.msn.com";
actionDomains[DEL_GROUP] = "by5.omega.contacts.msn.com";
actionDomains[RENAME_GROUP] = "by5.omega.contacts.msn.com";
actionDomains[BLOCK_CONTACT] = "";
actionDomains[UNBLOCK_CONTACT] = "";
actionDomains[ADD_CONTACT_TO_GROUP] = "by5.omega.contacts.msn.com";
actionDomains[DEL_CONTACT_FROM_GROUP] ="by5.omega.contacts.msn.com";
actionDomains[UPDATE_GROUP] = "";
actionDomains[GENERATE_LOCKKEY] = "ows.messenger.msn.com";
actionDomains[RETRIEVE_OIM_MAIL_DATA] = "rsi.hotmail.com";
actionDomains[RETRIEVE_OIM] = "rsi.hotmail.com";
actionDomains[DELETE_OIM] = "rsi.hotmail.com";
actionDomains[SEND_OIM] = "ows.messenger.msn.com";
actionDomains[CHANGE_DISPLAYNAME] = "by5.omega.contacts.msn.com";
actionPOSTURLs[AUTH] = "/RST.srf";
actionPOSTURLs[GET_LISTS] = "/abservice/SharingService.asmx";
actionPOSTURLs[GET_ADDRESS_BOOK] = "/abservice/abservice.asmx";
actionPOSTURLs[ADD_CONTACT_TO_LIST] = "/abservice/SharingService.asmx";
actionPOSTURLs[DEL_CONTACT_FROM_LIST] = "/abservice/SharingService.asmx";
actionPOSTURLs[DEL_CONTACT_FROM_ADDRESSBOOK] = "/abservice/abservice.asmx";
actionPOSTURLs[ADD_CONTACT_TO_ADDRESSBOOK] = "/abservice/abservice.asmx";
actionPOSTURLs[DISABLE_CONTACT_ON_ADDRESSBOOK] = "/abservice/abservice.asmx";
actionPOSTURLs[ENABLE_CONTACT_ON_ADDRESSBOOK] = "/abservice/abservice.asmx";
actionPOSTURLs[ADD_GROUP] = "/abservice/abservice.asmx";
actionPOSTURLs[DEL_GROUP] = "/abservice/abservice.asmx";
actionPOSTURLs[RENAME_GROUP] = "/abservice/abservice.asmx";
actionPOSTURLs[BLOCK_CONTACT] = "";
actionPOSTURLs[UNBLOCK_CONTACT] = "";
actionPOSTURLs[ADD_CONTACT_TO_GROUP] = "/abservice/abservice.asmx";
actionPOSTURLs[DEL_CONTACT_FROM_GROUP] ="/abservice/abservice.asmx";
actionPOSTURLs[UPDATE_GROUP] = "";
actionPOSTURLs[GENERATE_LOCKKEY] = "/OimWS/oim.asmx";
actionPOSTURLs[RETRIEVE_OIM_MAIL_DATA] = "/rsi/rsi.asmx";
actionPOSTURLs[RETRIEVE_OIM] = "/rsi/rsi.asmx";
actionPOSTURLs[DELETE_OIM] = "/rsi/rsi.asmx";
actionPOSTURLs[SEND_OIM] = "/OimWS/oim.asmx";
actionPOSTURLs[CHANGE_DISPLAYNAME] = "/abservice/abservice.asmx";
actionURLs[AUTH] = '\0';
actionURLs[GET_LISTS] = "http://www.msn.com/webservices/AddressBook/FindMembership";
actionURLs[GET_ADDRESS_BOOK] = "http://www.msn.com/webservices/AddressBook/ABFindAll";
actionURLs[ADD_CONTACT_TO_LIST] = "http://www.msn.com/webservices/AddressBook/AddMember";
actionURLs[DEL_CONTACT_FROM_LIST] = "http://www.msn.com/webservices/AddressBook/DeleteMember";
actionURLs[DEL_CONTACT_FROM_ADDRESSBOOK] = "http://www.msn.com/webservices/AddressBook/ABContactDelete";
actionURLs[ADD_CONTACT_TO_ADDRESSBOOK] = "http://www.msn.com/webservices/AddressBook/ABContactAdd";
actionURLs[DISABLE_CONTACT_ON_ADDRESSBOOK] = "http://www.msn.com/webservices/AddressBook/ABContactUpdate";
actionURLs[ENABLE_CONTACT_ON_ADDRESSBOOK] = "http://www.msn.com/webservices/AddressBook/ABContactUpdate";
actionURLs[DEL_CONTACT_FROM_LIST] = "http://www.msn.com/webservices/AddressBook/DeleteMember";
actionURLs[ADD_GROUP] = "http://www.msn.com/webservices/AddressBook/ABGroupAdd";
actionURLs[DEL_GROUP] = "http://www.msn.com/webservices/AddressBook/ABGroupDelete";
actionURLs[RENAME_GROUP] = "http://www.msn.com/webservices/AddressBook/ABGroupUpdate";
actionURLs[BLOCK_CONTACT] = "";
actionURLs[UNBLOCK_CONTACT] = "";
actionURLs[ADD_CONTACT_TO_GROUP] = "http://www.msn.com/webservices/AddressBook/ABGroupContactAdd";
actionURLs[DEL_CONTACT_FROM_GROUP] ="http://www.msn.com/webservices/AddressBook/ABGroupContactDelete";
actionURLs[UPDATE_GROUP] = "";
actionURLs[GENERATE_LOCKKEY] = "http://messenger.live.com/ws/2006/09/oim/Store2";
actionURLs[RETRIEVE_OIM_MAIL_DATA] = "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMetadata";
actionURLs[RETRIEVE_OIM] = "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMessage";
actionURLs[DELETE_OIM] = "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/DeleteMessages";
actionURLs[SEND_OIM] = "http://messenger.live.com/ws/2006/09/oim/Store2";
actionURLs[CHANGE_DISPLAYNAME] = "http://www.msn.com/webservices/AddressBook/ABContactUpdate";
sta.url = "http://Passport.NET/tb";
sitesToAuthList.push_back(sta);
sta.url = "messengerclear.live.com";
sta.URI = ""; // this is filled later.
sitesToAuthList.push_back(sta);
sta.url = "messenger.msn.com";
sta.URI = "?id=507";
sitesToAuthList.push_back(sta);
sta.url = "contacts.msn.com";
sta.URI = "MBI";
sitesToAuthList.push_back(sta);
sta.url = "messengersecure.live.com";
sta.URI = "MBI_SSL";
sitesToAuthList.push_back(sta);
sta.url = "spaces.live.com";
sta.URI = "MBI";
sitesToAuthList.push_back(sta);
sta.url = "storage.msn.com";
sta.URI = "MBI";
sitesToAuthList.push_back(sta);
}
void Soap::getTickets(std::string Passport, std::string password, std::string policy)
{
this->passport = Passport;
this->password = password;
this->policy = policy;
XMLNode temp; //to general use
XMLNode envelope = XMLNode::createXMLTopNode("Envelope");
envelope.addAttribute("xmlns", "http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:wsse", "http://schemas.xmlsoap.org/ws/2003/06/secext");
envelope.addAttribute("xmlns:saml", "urn:oasis:names:tc:SAML:1.0:assertion");
envelope.addAttribute("xmlns:wsp", "http://schemas.xmlsoap.org/ws/2002/12/policy");
envelope.addAttribute("xmlns:wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
envelope.addAttribute("xmlns:wsa", "http://schemas.xmlsoap.org/ws/2004/03/addressing");
envelope.addAttribute("xmlns:wssc","http://schemas.xmlsoap.org/ws/2004/04/sc");
envelope.addAttribute("xmlns:wst","http://schemas.xmlsoap.org/ws/2004/04/trust");
XMLNode header = XMLNode::createXMLTopNode("Header");
XMLNode authinfo = XMLNode::createXMLTopNode("ps:AuthInfo");
authinfo.addAttribute("xmlns:ps","http://schemas.microsoft.com/Passport/SoapServices/PPCRL");
authinfo.addAttribute("Id","PPAuthInfo");
temp = XMLNode::createXMLTopNode("ps:HostingApp");
temp.addText("{7108E71A-9926-4FCB-BCC9-9A9D3F32E423}");
authinfo.addChild(temp);
temp = XMLNode::createXMLTopNode("ps:BinaryVersion");
temp.addText("4");
authinfo.addChild(temp);
temp = XMLNode::createXMLTopNode("ps:UIVersion");
temp.addText("1");
authinfo.addChild(temp);
temp = XMLNode::createXMLTopNode("ps:Cookies");
temp.addText("");
authinfo.addChild(temp);
temp = XMLNode::createXMLTopNode("ps:RequestParams");
temp.addText("AQAAAAIAAABsYwQAAAAxMDMz");
authinfo.addChild(temp);
header.addChild(authinfo);
XMLNode security = XMLNode::createXMLTopNode("wsse:Security");
XMLNode username = XMLNode::createXMLTopNode("wsse:UsernameToken");
username.addAttribute("Id","user");
temp = XMLNode::createXMLTopNode("wsse:Username");
temp.addText( Passport.c_str() );
username.addChild(temp);
temp = XMLNode::createXMLTopNode( "wsse:Password" );
temp.addText( password.c_str() );
username.addChild(temp);
security.addChild(username);
header.addChild(security);
envelope.addChild( header );
// BODY
XMLNode body = XMLNode::createXMLTopNode( "Body" );
XMLNode multipletokens = XMLNode::createXMLTopNode( "ps:RequestMultipleSecurityTokens" );
multipletokens.addAttribute("xmlns:ps","http://schemas.microsoft.com/Passport/SoapServices/PPCRL");
multipletokens.addAttribute("Id","RSTS");
XMLNode securitytoken;
XMLNode endpr;
XMLNode address;
// request tokens for each site
for (unsigned int i=0; i<sitesToAuthList.size(); i++)
{
securitytoken = XMLNode::createXMLTopNode("wst:RequestSecurityToken");
std::string RST = "RST";
RST=RST+toStr(i);
securitytoken.addAttribute("Id", RST.c_str() );
temp = XMLNode::createXMLTopNode( "wst:RequestType" );
temp.addText( "http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue" );
securitytoken.addChild(temp);
temp = XMLNode::createXMLTopNode( "wsp:AppliesTo" );
endpr = XMLNode::createXMLTopNode("wsa:EndpointReference");
address = XMLNode::createXMLTopNode("wsa:Address");
address.addText( sitesToAuthList[i].url.c_str() );
endpr.addChild(address);
temp.addChild(endpr);
securitytoken.addChild(temp);
if(!sitesToAuthList[i].URI.empty())
{
XMLNode policyref = XMLNode::createXMLTopNode("wsse:PolicyReference");
policyref.addAttribute("URI", sitesToAuthList[i].URI.c_str());
policyref.addText( "" );
securitytoken.addChild(policyref);
}
multipletokens.addChild(securitytoken);
}
body.addChild(multipletokens);
envelope.addChild( body );
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(AUTH, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseGetTicketsResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString( response.c_str() );
if(http_response_code == "301")
{
Soap *soapConnection = manageSoapRedirect(response1, AUTH);
soapConnection->getTickets(this->passport, this->password, this->policy);
return;
}
// get the header information from the DOM
XMLNode tokens = response1.getChildNode("S:Envelope").getChildNode("S:Body").getChildNode("wst:RequestSecurityTokenResponseCollection");
const char *reason = response1.getChildNode("S:Envelope").getChildNode("S:Fault").getChildNode("faultcode").getText();
if(reason)
{
std::string reason1(reason);
if(reason1 == "wsse:FailedAuthentication")
{
this->myNotificationServer()->externalCallbacks.showError(this, "Wrong Password");
this->myNotificationServer()->removeSoapConnection(this);
this->myNotificationServer()->disconnect();
return;
}
if(reason1 == "psf:Redirect")
{
const char *newurl = response1.getChildNode("S:Envelope").getChildNode("S:Fault").getChildNode("psf:redirectUrl").getText();
Soap *soapConnection = new Soap(notificationServer);
std::string newurl1(newurl);
std::vector<std::string> a = splitString(newurl1, "/");
std::string newdomain = splitString(a[1], "/")[0];
soapConnection->actionDomains[AUTH] = newdomain;
std::vector<std::string> postpath = splitString(newurl1, newdomain);
soapConnection->actionPOSTURLs[AUTH] = postpath[1];
soapConnection->setMBI(mbi);
soapConnection->getTickets(passport,password,policy);
return;
}
}
int nItems = tokens.nChildNode("wst:RequestSecurityTokenResponse");
// fill sitesToAuthList the strucutre with tokens and binary secrets
for(int site=0; site< nItems; site++)
{
XMLNode a = tokens.getChildNode("wst:RequestSecurityTokenResponse",site);
const char *reason = a.getChildNode("S:Fault").getChildNode("faultcode").getText();
if(reason)
{
std::string reason1(reason);
if(reason1 == "wsse:FailedAuthentication")
{
const char *reasonString = a.getChildNode("S:Fault").getChildNode("faultstring").getText();
std::string reasonString1 = (reasonString) ? reasonString : "Authentication Failed";
this->myNotificationServer()->externalCallbacks.showError(this, reasonString1);
this->myNotificationServer()->removeSoapConnection(this);
this->myNotificationServer()->disconnect();
return;
}
}
const char *token1 = a.getChildNode("wst:RequestedProofToken").getChildNode("wst:BinarySecret").getText();
if(token1)
{
std::string c(token1);
sitesToAuthList[site].BinarySecret = c;
}
const char *token2 = a.getChildNode("wst:RequestedSecurityToken").getChildNode("wsse:BinarySecurityToken").getText();
if(token2)
{
std::string b(token2);
sitesToAuthList[site].BinarySecurityToken = b;
}
}
this->myNotificationServer()->gotTickets(*this, sitesToAuthList);
}
void Soap::enableContactOnAddressBook(std::string contactId, std::string passport, std::string myDisplayName)
{
this->contactId = contactId;
this->tempPassport = passport;
this->myDisplayName = myDisplayName;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soapenc","http://schemas.xmlsoap.org/soap/encoding/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode abapphdr = XMLNode::createXMLTopNode("ABApplicationHeader");
abapphdr.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode("ApplicationId");
appid.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode("IsMigration");
ismigration.addText("false") ;
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode("PartnerScenario");
scenario.addText ("ContactSave");
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode( "ManagedGroupRequest" );
ManagedGroupRequest.addText( "false" );
XMLNode TicketToken = XMLNode::createXMLTopNode( "TicketToken" );
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode ABContactUpdate = XMLNode::createXMLTopNode( "ABContactUpdate" );
ABContactUpdate.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode abId = XMLNode::createXMLTopNode( "abId" );
abId.addText( "00000000-0000-0000-0000-000000000000" );
ABContactUpdate.addChild(abId);
XMLNode contacts = XMLNode::createXMLTopNode( "contacts" );
XMLNode Contact = XMLNode::createXMLTopNode( "Contact" );
Contact.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode contactId1 = XMLNode::createXMLTopNode( "contactId" );
contactId1.addText(contactId.c_str());
XMLNode contactInfo = XMLNode::createXMLTopNode( "contactInfo" );
XMLNode displayName = XMLNode::createXMLTopNode( "displayName" );
displayName.addText(passport.c_str());
XMLNode isMessengerUser = XMLNode::createXMLTopNode( "isMessengerUser" );
isMessengerUser.addText("true");
XMLNode MessengerMemberInfo = XMLNode::createXMLTopNode( "MessengerMemberInfo" );
XMLNode DisplayName = XMLNode::createXMLTopNode( "DisplayName" );
DisplayName.addText(myDisplayName.c_str());
MessengerMemberInfo.addChild(DisplayName);
contactInfo.addChild(displayName);
contactInfo.addChild(isMessengerUser);
contactInfo.addChild(MessengerMemberInfo);
XMLNode propertiesChanged = XMLNode::createXMLTopNode( "propertiesChanged" );
propertiesChanged.addText("DisplayName IsMessengerUser MessengerMemberInfo");
Contact.addChild(contactId1);
Contact.addChild(contactInfo);
Contact.addChild(propertiesChanged);
contacts.addChild(Contact);
ABContactUpdate.addChild(contacts);
body.addChild(ABContactUpdate);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(ENABLE_CONTACT_ON_ADDRESSBOOK, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseEnableContactOnAddressBookResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, ENABLE_CONTACT_ON_ADDRESSBOOK);
soapConnection->enableContactOnAddressBook(this->contactId, this->tempPassport, this->myDisplayName);
return;
}
XMLNode version = response1.getChildNode("soap:Envelope").getChildNode("soap:Header").getChildNode("ServiceHeader").getChildNode("Version");
const char *ver = version.getText();
if(ver)
{
std::string newVersion(ver);
this->myNotificationServer()->gotEnableContactOnAddressBookConfirmation(*this, true, newVersion, this->contactId, this->tempPassport);
}
else
{
this->myNotificationServer()->gotEnableContactOnAddressBookConfirmation(*this, false, "", this->contactId, this->tempPassport);
}
response1.deleteNodeContent();
}
void Soap::delContactFromAddressBook(std::string contactId, std::string passport)
{
this->contactId = contactId;
this->tempPassport = passport;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soapenc","http://schemas.xmlsoap.org/soap/encoding/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode abapphdr = XMLNode::createXMLTopNode("ABApplicationHeader");
abapphdr.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode("ApplicationId");
appid.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode("IsMigration");
ismigration.addText("false") ;
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode("PartnerScenario");
scenario.addText ("Timer");
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode( "ManagedGroupRequest" );
ManagedGroupRequest.addText( "false" );
XMLNode TicketToken = XMLNode::createXMLTopNode( "TicketToken" );
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode ABContactDelete = XMLNode::createXMLTopNode( "ABContactDelete" );
ABContactDelete.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode abId = XMLNode::createXMLTopNode( "abId" );
abId.addText( "00000000-0000-0000-0000-000000000000" );
ABContactDelete.addChild(abId);
XMLNode contacts = XMLNode::createXMLTopNode( "contacts" );
XMLNode Contact = XMLNode::createXMLTopNode( "Contact" );
XMLNode contactId1 = XMLNode::createXMLTopNode( "contactId" );
contactId1.addText(contactId.c_str());
Contact.addChild(contactId1);
contacts.addChild(Contact);
ABContactDelete.addChild(contacts);
body.addChild(ABContactDelete);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(DEL_CONTACT_FROM_ADDRESSBOOK, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseDelContactFromAddressBookResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, DEL_CONTACT_FROM_ADDRESSBOOK);
soapConnection->delContactFromAddressBook(this->contactId, this->tempPassport);
return;
}
XMLNode version = response1.getChildNode("soap:Envelope").getChildNode("soap:Header").getChildNode("ServiceHeader").getChildNode("Version");
const char *ver = version.getText();
if(ver)
{
std::string newVersion(ver);
this->myNotificationServer()->gotDelContactFromAddressBookConfirmation(*this, true, newVersion, this->contactId, this->tempPassport);
}
else
{
this->myNotificationServer()->gotDelContactFromAddressBookConfirmation(*this, false, "", this->contactId, this->tempPassport);
}
response1.deleteNodeContent();
}
void Soap::disableContactFromAddressBook(std::string contactId, std::string passport)
{
this->contactId = contactId;
this->tempPassport = passport;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soapenc","http://schemas.xmlsoap.org/soap/encoding/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode abapphdr = XMLNode::createXMLTopNode("ABApplicationHeader");
abapphdr.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode("ApplicationId");
appid.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode("IsMigration");
ismigration.addText("false") ;
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode("PartnerScenario");
scenario.addText ("Timer");
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode( "ManagedGroupRequest" );
ManagedGroupRequest.addText( "false" );
XMLNode TicketToken = XMLNode::createXMLTopNode( "TicketToken" );
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode ABContactUpdate = XMLNode::createXMLTopNode( "ABContactUpdate" );
ABContactUpdate.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode abId = XMLNode::createXMLTopNode( "abId" );
abId.addText( "00000000-0000-0000-0000-000000000000" );
ABContactUpdate.addChild(abId);
XMLNode contacts = XMLNode::createXMLTopNode( "contacts" );
XMLNode Contact = XMLNode::createXMLTopNode( "Contact" );
Contact.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode contactId1 = XMLNode::createXMLTopNode( "contactId" );
contactId1.addText(contactId.c_str());
XMLNode contactInfo = XMLNode::createXMLTopNode( "contactInfo" );
XMLNode displayName = XMLNode::createXMLTopNode( "displayName" );
XMLNode isMessengerUser = XMLNode::createXMLTopNode( "isMessengerUser" );
isMessengerUser.addText("false");
contactInfo.addChild(displayName);
contactInfo.addChild(isMessengerUser);
XMLNode propertiesChanged = XMLNode::createXMLTopNode( "propertiesChanged" );
propertiesChanged.addText("DisplayName IsMessengerUser");
Contact.addChild(contactId1);
Contact.addChild(contactInfo);
Contact.addChild(propertiesChanged);
contacts.addChild(Contact);
ABContactUpdate.addChild(contacts);
body.addChild(ABContactUpdate);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(DISABLE_CONTACT_ON_ADDRESSBOOK, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseDisableContactFromAddressBookResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, DISABLE_CONTACT_ON_ADDRESSBOOK);
soapConnection->disableContactFromAddressBook(this->contactId, this->tempPassport);
return;
}
XMLNode version = response1.getChildNode("soap:Envelope").getChildNode("soap:Header").getChildNode("ServiceHeader").getChildNode("Version");
const char *ver = version.getText();
if(ver)
{
std::string newVersion(ver);
this->myNotificationServer()->gotDisableContactOnAddressBookConfirmation(*this, true, newVersion, this->contactId, this->tempPassport);
}
else
{
this->myNotificationServer()->gotDisableContactOnAddressBookConfirmation(*this, false, "", this->contactId, this->tempPassport);
}
response1.deleteNodeContent();
}
void Soap::addContactToAddressBook(std::string passport, std::string displayName)
{
this->tempPassport = passport;
this->tempDisplayName = displayName;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soapenc","http://schemas.xmlsoap.org/soap/encoding/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode abapphdr = XMLNode::createXMLTopNode("ABApplicationHeader");
abapphdr.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode("ApplicationId");
appid.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode("IsMigration");
ismigration.addText("false") ;
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode("PartnerScenario");
scenario.addText ("ContactSave");
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode( "ManagedGroupRequest" );
ManagedGroupRequest.addText( "false" );
XMLNode TicketToken = XMLNode::createXMLTopNode( "TicketToken" );
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode ABContactAdd = XMLNode::createXMLTopNode( "ABContactAdd" );
ABContactAdd.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode abId = XMLNode::createXMLTopNode( "abId" );
abId.addText( "00000000-0000-0000-0000-000000000000" );
ABContactAdd.addChild(abId);
XMLNode contacts = XMLNode::createXMLTopNode( "contacts" );
XMLNode Contact = XMLNode::createXMLTopNode( "Contact" );
Contact.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode contactInfo = XMLNode::createXMLTopNode( "contactInfo" );
XMLNode contactType = XMLNode::createXMLTopNode( "contactType" );
contactType.addText("Regular");
XMLNode passportName = XMLNode::createXMLTopNode( "passportName" );
passportName.addText(passport.c_str());
XMLNode isMessengerUser = XMLNode::createXMLTopNode( "isMessengerUser" );
isMessengerUser.addText("true");
XMLNode MessengerMemberInfo = XMLNode::createXMLTopNode( "MessengerMemberInfo" );
XMLNode DisplayName = XMLNode::createXMLTopNode( "DisplayName" );
DisplayName.addText(displayName.c_str());
MessengerMemberInfo.addChild(DisplayName);
contactInfo.addChild(contactType);
contactInfo.addChild(passportName);
contactInfo.addChild(isMessengerUser);
contactInfo.addChild(MessengerMemberInfo);
Contact.addChild(contactInfo);
contacts.addChild(Contact);
ABContactAdd.addChild(contacts);
XMLNode options = XMLNode::createXMLTopNode( "options" );
XMLNode EnableAllowListManagement = XMLNode::createXMLTopNode( "EnableAllowListManagement" );
EnableAllowListManagement.addText("true");
options.addChild(EnableAllowListManagement);
ABContactAdd.addChild(options);
body.addChild(ABContactAdd);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(ADD_CONTACT_TO_ADDRESSBOOK, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseAddContactToAddressBookResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, ADD_CONTACT_TO_ADDRESSBOOK);
soapConnection->addContactToAddressBook(this->tempPassport, this->tempDisplayName);
return;
}
XMLNode version = response1.getChildNode("soap:Envelope").getChildNode("soap:Header").getChildNode("ServiceHeader").getChildNode("Version");
const char *ver = version.getText();
if(ver)
{
const char *guid = response1.getChildNode("soap:Envelope").getChildNode("soap:Body").getChildNode("ABContactAddResponse").getChildNode("ABContactAddResult").getChildNode("guid").getText();
if(guid)
{
std::string newVersion(ver);
std::string newGuid(guid);
this->myNotificationServer()->gotAddContactToAddressBookConfirmation(*this, true, newVersion, this->tempPassport, this->tempDisplayName, newGuid);
}
}
else
{
this->myNotificationServer()->gotAddContactToAddressBookConfirmation(*this, false, "", this->tempPassport, this->tempDisplayName, "");
}
response1.deleteNodeContent();
}
void Soap::addContactToGroup(std::string groupId, std::string contactId)
{
this->groupId = groupId;
this->contactId = contactId;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soapenc","http://schemas.xmlsoap.org/soap/encoding/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode abapphdr = XMLNode::createXMLTopNode("ABApplicationHeader");
abapphdr.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode("ApplicationId");
appid.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode("IsMigration");
ismigration.addText("false") ;
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode("PartnerScenario");
scenario.addText ("GroupSave");
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode( "ManagedGroupRequest" );
ManagedGroupRequest.addText( "false" );
XMLNode TicketToken = XMLNode::createXMLTopNode( "TicketToken" );
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode ABGroupContactAdd = XMLNode::createXMLTopNode( "ABGroupContactAdd" );
ABGroupContactAdd.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode abId = XMLNode::createXMLTopNode( "abId" );
abId.addText( "00000000-0000-0000-0000-000000000000" );
ABGroupContactAdd.addChild(abId);
XMLNode groupFilter = XMLNode::createXMLTopNode( "groupFilter" );
XMLNode groupIds = XMLNode::createXMLTopNode( "groupIds" );
XMLNode guid = XMLNode::createXMLTopNode( "guid" );
guid.addText(groupId.c_str());
groupIds.addChild(guid);
groupFilter.addChild(groupIds);
ABGroupContactAdd.addChild(groupFilter);
XMLNode contacts = XMLNode::createXMLTopNode( "contacts" );
XMLNode Contact = XMLNode::createXMLTopNode( "Contact" );
XMLNode contactId1 = XMLNode::createXMLTopNode( "contactId" );
contactId1.addText(contactId.c_str());
Contact.addChild(contactId1);
contacts.addChild(Contact);
ABGroupContactAdd.addChild(contacts);
body.addChild(ABGroupContactAdd);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(ADD_CONTACT_TO_GROUP, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseAddContactToGroupResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, ADD_CONTACT_TO_GROUP);
soapConnection->addContactToGroup(this->groupId, this->contactId);
return;
}
XMLNode version = response1.getChildNode("soap:Envelope").getChildNode("soap:Header").getChildNode("ServiceHeader").getChildNode("Version");
const char *ver = version.getText();
if(ver)
{
std::string newVersion(ver);
this->myNotificationServer()->gotAddContactToGroupConfirmation(*this, true, newVersion, this->groupId, this->contactId);
}
else
{
this->myNotificationServer()->gotAddContactToGroupConfirmation(*this, false, "", this->groupId, this->contactId);
}
response1.deleteNodeContent();
}
void Soap::addGroup(std::string groupName)
{
this->groupName = groupName;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soapenc","http://schemas.xmlsoap.org/soap/encoding/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode abapphdr = XMLNode::createXMLTopNode("ABApplicationHeader");
abapphdr.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode("ApplicationId");
appid.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode("IsMigration");
ismigration.addText("false") ;
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode("PartnerScenario");
scenario.addText ("GroupSave");
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode( "ManagedGroupRequest" );
ManagedGroupRequest.addText( "false" );
XMLNode TicketToken = XMLNode::createXMLTopNode( "TicketToken" );
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode ABGroupAdd = XMLNode::createXMLTopNode( "ABGroupAdd" );
ABGroupAdd.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode abId = XMLNode::createXMLTopNode( "abId" );
abId.addText( "00000000-0000-0000-0000-000000000000" );
ABGroupAdd.addChild(abId);
XMLNode groupAddOptions = XMLNode::createXMLTopNode( "groupAddOptions" );
XMLNode fRenameOnMsgrConflict = XMLNode::createXMLTopNode( "fRenameOnMsgrConflict" );
fRenameOnMsgrConflict.addText("false");
groupAddOptions.addChild(fRenameOnMsgrConflict);
ABGroupAdd.addChild(groupAddOptions);
XMLNode groupInfo = XMLNode::createXMLTopNode( "groupInfo" );
XMLNode GroupInfo = XMLNode::createXMLTopNode( "GroupInfo" );
XMLNode name = XMLNode::createXMLTopNode( "name" );
name.addText(groupName.c_str());
GroupInfo.addChild(name);
XMLNode groupType = XMLNode::createXMLTopNode( "groupType" );
groupType.addText("C8529CE2-6EAD-434d-881F-341E17DB3FF8");
GroupInfo.addChild(groupType);
XMLNode fMessenger = XMLNode::createXMLTopNode( "fMessenger" );
fMessenger.addText("false");
GroupInfo.addChild(fMessenger);
XMLNode annotations = XMLNode::createXMLTopNode( "annotations" );
XMLNode Annotation = XMLNode::createXMLTopNode( "Annotation" );
XMLNode Name = XMLNode::createXMLTopNode( "Name" );
Name.addText("MSN.IM.Display");
XMLNode Value = XMLNode::createXMLTopNode( "Value" );
Value.addText("1");
Annotation.addChild(Name);
Annotation.addChild(Value);
annotations.addChild(Annotation);
GroupInfo.addChild(annotations);
groupInfo.addChild(GroupInfo);
ABGroupAdd.addChild(groupInfo);
body.addChild(ABGroupAdd);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(ADD_GROUP, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseAddGroupResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, ADD_GROUP);
soapConnection->addGroup(this->groupName);
return;
}
XMLNode version = response1.getChildNode("soap:Envelope").getChildNode("soap:Header").getChildNode("ServiceHeader").getChildNode("Version");
const char *ver = version.getText();
if(ver)
{
const char *guid = response1.getChildNode("soap:Envelope").getChildNode("soap:Body").getChildNode("ABGroupAddResponse").getChildNode("ABGroupAddResult").getChildNode("guid").getText();
if(guid)
{
std::string newVersion(ver);
std::string newGuid(guid);
this->myNotificationServer()->gotAddGroupConfirmation(*this, true, newVersion, this->groupName, newGuid);
}
}
else
{
this->myNotificationServer()->gotAddGroupConfirmation(*this, false, "", this->groupName, "");
}
response1.deleteNodeContent();
}
void Soap::delGroup(std::string groupId)
{
this->groupId = groupId;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soapenc","http://schemas.xmlsoap.org/soap/encoding/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode abapphdr = XMLNode::createXMLTopNode("ABApplicationHeader");
abapphdr.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode("ApplicationId");
appid.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode("IsMigration");
ismigration.addText("false") ;
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode("PartnerScenario");
scenario.addText ("GroupSave");
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode( "ManagedGroupRequest" );
ManagedGroupRequest.addText( "false" );
XMLNode TicketToken = XMLNode::createXMLTopNode( "TicketToken" );
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode ABGroupDelete = XMLNode::createXMLTopNode( "ABGroupDelete" );
ABGroupDelete.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode abId = XMLNode::createXMLTopNode( "abId" );
abId.addText( "00000000-0000-0000-0000-000000000000" );
ABGroupDelete.addChild(abId);
XMLNode groupFilter = XMLNode::createXMLTopNode( "groupFilter" );
XMLNode groupIds = XMLNode::createXMLTopNode( "groupIds" );
XMLNode guid = XMLNode::createXMLTopNode( "guid" );
guid.addText(groupId.c_str());
groupIds.addChild(guid);
groupFilter.addChild(groupIds);
ABGroupDelete.addChild(groupFilter);
body.addChild(ABGroupDelete);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(DEL_GROUP, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseDelGroupResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, DEL_GROUP);
soapConnection->delGroup(this->groupId);
return;
}
XMLNode version = response1.getChildNode("soap:Envelope").getChildNode("soap:Header").getChildNode("ServiceHeader").getChildNode("Version");
const char *ver = version.getText();
if(ver)
{
std::string newVersion(ver);
this->myNotificationServer()->gotDelGroupConfirmation(*this, true, newVersion, this->groupId);
}
else
{
this->myNotificationServer()->gotDelGroupConfirmation(*this, false, "", this->groupId);
}
response1.deleteNodeContent();
}
void Soap::renameGroup(std::string groupId, std::string newGroupName)
{
this->groupId = groupId;
this->groupName = newGroupName;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soapenc","http://schemas.xmlsoap.org/soap/encoding/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode abapphdr = XMLNode::createXMLTopNode("ABApplicationHeader");
abapphdr.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode("ApplicationId");
appid.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode("IsMigration");
ismigration.addText("false") ;
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode("PartnerScenario");
scenario.addText ("GroupSave");
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode( "ManagedGroupRequest" );
ManagedGroupRequest.addText( "false" );
XMLNode TicketToken = XMLNode::createXMLTopNode( "TicketToken" );
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode ABGroupUpdate = XMLNode::createXMLTopNode( "ABGroupUpdate" );
ABGroupUpdate.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode abId = XMLNode::createXMLTopNode( "abId" );
abId.addText( "00000000-0000-0000-0000-000000000000" );
ABGroupUpdate.addChild(abId);
XMLNode groups = XMLNode::createXMLTopNode( "groups" );
XMLNode Group = XMLNode::createXMLTopNode( "Group" );
XMLNode groupId1 = XMLNode::createXMLTopNode( "groupId" );
groupId1.addText(groupId.c_str());
XMLNode groupInfo = XMLNode::createXMLTopNode( "groupInfo" );
XMLNode name = XMLNode::createXMLTopNode( "name" );
name.addText(newGroupName.c_str());
groupInfo.addChild(name);
XMLNode propertiesChanged = XMLNode::createXMLTopNode( "propertiesChanged" );
propertiesChanged.addText("GroupName");
Group.addChild(groupId1);
Group.addChild(groupInfo);
Group.addChild(propertiesChanged);
groups.addChild(Group);
ABGroupUpdate.addChild(groups);
body.addChild(ABGroupUpdate);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(RENAME_GROUP, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseRenameGroupResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, RENAME_GROUP);
soapConnection->renameGroup(this->groupId, this->groupName);
return;
}
XMLNode version = response1.getChildNode("soap:Envelope").getChildNode("soap:Header").getChildNode("ServiceHeader").getChildNode("Version");
const char *ver = version.getText();
if(ver)
{
std::string newVersion(ver);
this->myNotificationServer()->gotRenameGroupConfirmation(*this, true, newVersion, this->groupName, this->groupId);
}
else
{
this->myNotificationServer()->gotRenameGroupConfirmation(*this, false, "", this->groupName, this->groupId);
}
response1.deleteNodeContent();
}
void Soap::delContactFromGroup(std::string groupId, std::string contactId)
{
this->groupId = groupId;
this->contactId = contactId;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soapenc","http://schemas.xmlsoap.org/soap/encoding/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode abapphdr = XMLNode::createXMLTopNode("ABApplicationHeader");
abapphdr.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode("ApplicationId");
appid.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode("IsMigration");
ismigration.addText("false") ;
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode("PartnerScenario");
scenario.addText ("GroupSave");
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode( "ManagedGroupRequest" );
ManagedGroupRequest.addText( "false" );
XMLNode TicketToken = XMLNode::createXMLTopNode( "TicketToken" );
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode ABGroupContactDelete = XMLNode::createXMLTopNode( "ABGroupContactDelete" );
ABGroupContactDelete.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode abId = XMLNode::createXMLTopNode( "abId" );
abId.addText( "00000000-0000-0000-0000-000000000000" );
ABGroupContactDelete.addChild(abId);
XMLNode contacts = XMLNode::createXMLTopNode( "contacts" );
XMLNode Contact = XMLNode::createXMLTopNode( "Contact" );
XMLNode contactId1 = XMLNode::createXMLTopNode( "contactId" );
contactId1.addText(contactId.c_str());
Contact.addChild(contactId1);
contacts.addChild(Contact);
ABGroupContactDelete.addChild(contacts);
XMLNode groupFilter = XMLNode::createXMLTopNode( "groupFilter" );
XMLNode groupIds = XMLNode::createXMLTopNode( "groupIds" );
XMLNode guid = XMLNode::createXMLTopNode( "guid" );
guid.addText(groupId.c_str());
groupIds.addChild(guid);
groupFilter.addChild(groupIds);
ABGroupContactDelete.addChild(groupFilter);
body.addChild(ABGroupContactDelete);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(DEL_CONTACT_FROM_GROUP, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseDelContactFromGroupResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, DEL_CONTACT_FROM_GROUP);
soapConnection->delContactFromGroup(this->groupId, this->contactId);
return;
}
XMLNode version = response1.getChildNode("soap:Envelope").getChildNode("soap:Header").getChildNode("ServiceHeader").getChildNode("Version");
const char *ver = version.getText();
if(ver)
{
std::string newVersion(ver);
this->myNotificationServer()->gotDelContactFromGroupConfirmation(*this, true, newVersion, this->groupId, this->contactId);
}
else
{
this->myNotificationServer()->gotDelContactFromGroupConfirmation(*this, false, "", this->groupId, this->contactId);
}
response1.deleteNodeContent();
}
void Soap::addContactToList(MSN::Passport passport, MSN::ContactList list)
{
this->tempPassport = passport;
this->tempList = list;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soapenc","http://schemas.xmlsoap.org/soap/encoding/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode abapphdr = XMLNode::createXMLTopNode("ABApplicationHeader");
abapphdr.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode("ApplicationId");
appid.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode("IsMigration");
ismigration.addText("false") ;
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode("PartnerScenario");
scenario.addText ("ContactSave");
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode( "ManagedGroupRequest" );
ManagedGroupRequest.addText( "false" );
XMLNode TicketToken = XMLNode::createXMLTopNode( "TicketToken" );
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode AddMember = XMLNode::createXMLTopNode( "AddMember" );
AddMember.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode serviceHandle = XMLNode::createXMLTopNode( "serviceHandle" );
XMLNode Id = XMLNode::createXMLTopNode( "Id" );
Id.addText( "0" );
XMLNode Type = XMLNode::createXMLTopNode( "Type" );
Type.addText( "Messenger" );
XMLNode ForeignId = XMLNode::createXMLTopNode( "ForeignId" );
ForeignId.addText( "" );
serviceHandle.addChild(Id);
serviceHandle.addChild(Type);
serviceHandle.addChild(ForeignId);
AddMember.addChild(serviceHandle);
XMLNode memberships = XMLNode::createXMLTopNode( "memberships" );
XMLNode Membership = XMLNode::createXMLTopNode( "Membership" );
XMLNode MemberRole = XMLNode::createXMLTopNode( "MemberRole" );
switch(list)
{
case LST_AL:
MemberRole.addText("Allow");
break;
case LST_BL:
MemberRole.addText("Block");
break;
case LST_RL:
MemberRole.addText("Reverse");
break;
default:
return; // TODO - raise an error
}
XMLNode Members = XMLNode::createXMLTopNode( "Members" );
XMLNode Member = XMLNode::createXMLTopNode( "Member" );
Member.addAttribute("xsi:type","PassportMember");
Member.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
XMLNode Type2 = XMLNode::createXMLTopNode("Type");
Type2.addText("Passport");
XMLNode State = XMLNode::createXMLTopNode("State");
State.addText("Accepted");
XMLNode PassportName = XMLNode::createXMLTopNode("PassportName");
PassportName.addText(passport.c_str());
Member.addChild(Type2);
Member.addChild(State);
Member.addChild(PassportName);
Members.addChild(Member);
Membership.addChild(MemberRole);
Membership.addChild(Members);
memberships.addChild(Membership);
AddMember.addChild(memberships);
body.addChild(AddMember);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(ADD_CONTACT_TO_LIST, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseAddContactToListResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301")
{
Soap *soapConnection = manageSoapRedirect(response1, ADD_CONTACT_TO_LIST);
soapConnection->addContactToList(this->tempPassport, this->tempList);
return;
}
XMLNode version = response1.getChildNode("soap:Envelope").getChildNode("soap:Header").getChildNode("ServiceHeader").getChildNode("Version");
const char *ver = version.getText();
if(ver)
{
std::string newVersion(ver);
this->myNotificationServer()->gotAddContactToListConfirmation(*this, true, newVersion, this->tempPassport, this->tempList);
}
else
{
this->myNotificationServer()->gotAddContactToListConfirmation(*this, false, "", this->tempPassport, this->tempList);
}
response1.deleteNodeContent();
}
void Soap::removeContactFromList(MSN::Passport passport, MSN::ContactList list)
{
this->tempPassport = passport;
this->tempList = list;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soapenc","http://schemas.xmlsoap.org/soap/encoding/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode abapphdr = XMLNode::createXMLTopNode("ABApplicationHeader");
abapphdr.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode("ApplicationId");
appid.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode("IsMigration");
ismigration.addText("false") ;
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode("PartnerScenario");
scenario.addText ("ContactSave");
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode( "ManagedGroupRequest" );
ManagedGroupRequest.addText( "false" );
XMLNode TicketToken = XMLNode::createXMLTopNode( "TicketToken" );
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode DeleteMember = XMLNode::createXMLTopNode( "DeleteMember" );
DeleteMember.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode serviceHandle = XMLNode::createXMLTopNode( "serviceHandle" );
XMLNode Id = XMLNode::createXMLTopNode( "Id" );
Id.addText( "0" );
XMLNode Type = XMLNode::createXMLTopNode( "Type" );
Type.addText( "Messenger" );
XMLNode ForeignId = XMLNode::createXMLTopNode( "ForeignId" );
Type.addText( "" );
serviceHandle.addChild(Id);
serviceHandle.addChild(Type);
serviceHandle.addChild(ForeignId);
DeleteMember.addChild(serviceHandle);
XMLNode memberships = XMLNode::createXMLTopNode( "memberships" );
XMLNode Membership = XMLNode::createXMLTopNode( "Membership" );
XMLNode MemberRole = XMLNode::createXMLTopNode( "MemberRole" );
switch(list)
{
case LST_AL:
MemberRole.addText("Allow");
break;
case LST_BL:
MemberRole.addText("Block");
break;
case LST_PL:
MemberRole.addText("Pending");
break;
default:
return; // TODO - raise an error
}
XMLNode Members = XMLNode::createXMLTopNode( "Members" );
XMLNode Member = XMLNode::createXMLTopNode( "Member" );
Member.addAttribute("xsi:type","PassportMember");
Member.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
XMLNode Type2 = XMLNode::createXMLTopNode("Type");
Type2.addText("Passport");
XMLNode State = XMLNode::createXMLTopNode("State");
State.addText("Accepted");
XMLNode PassportName = XMLNode::createXMLTopNode("PassportName");
PassportName.addText(passport.c_str());
Member.addChild(Type2);
Member.addChild(State);
Member.addChild(PassportName);
Members.addChild(Member);
Membership.addChild(MemberRole);
Membership.addChild(Members);
memberships.addChild(Membership);
DeleteMember.addChild(memberships);
body.addChild(DeleteMember);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(DEL_CONTACT_FROM_LIST, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseRemoveContactFromListResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301")
{
Soap *soapConnection = manageSoapRedirect(response1, DEL_CONTACT_FROM_LIST);
soapConnection->removeContactFromList(this->tempPassport, this->tempList);
return;
}
XMLNode version = response1.getChildNode("soap:Envelope").getChildNode("soap:Header").getChildNode("ServiceHeader").getChildNode("Version");
const char *ver = version.getText();
if(ver)
{
std::string newVersion(ver);
this->myNotificationServer()->gotDelContactFromListConfirmation(*this, true, newVersion, this->tempPassport, this->tempList);
}
else
{
this->myNotificationServer()->gotDelContactFromListConfirmation(*this, false, "", this->tempPassport, this->tempList);
}
response1.deleteNodeContent();
}
void Soap::getLists(ListSyncInfo *data)
{
// info is used to to fill the lists with memebers
this->listInfo = data;
XMLNode envelope = XMLNode::createXMLTopNode( "soap:Envelope" );
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
XMLNode header = XMLNode::createXMLTopNode( "soap:Header" );
header.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
XMLNode abapphdr = XMLNode::createXMLTopNode( "ABApplicationHeader" );
abapphdr.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode( "ApplicationId" );
appid.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
appid.addText( "996CDE1E-AA53-4477-B943-2BE802EA6166" );
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode( "IsMigration" );
ismigration.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
ismigration.addText( "false" ) ;
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode( "PartnerScenario" );
scenario.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
scenario.addText ("Initial" );
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode( "ABAuthHeader" );
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode( "ManagedGroupRequest" );
ManagedGroupRequest.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
ManagedGroupRequest.addText( "false" );
XMLNode TicketToken = XMLNode::createXMLTopNode( "TicketToken" );
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
body.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
XMLNode FindMembership = XMLNode::createXMLTopNode( "FindMembership" );
FindMembership.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode serviceFilter = XMLNode::createXMLTopNode( "serviceFilter" );
XMLNode Types = XMLNode::createXMLTopNode( "Types" );
XMLNode ServiceType = XMLNode::createXMLTopNode( "ServiceType" );
ServiceType.addText( "Messenger" );
Types.addChild(ServiceType);
ServiceType = XMLNode::createXMLTopNode( "ServiceType" );
ServiceType.addText( "Invitation" );
Types.addChild(ServiceType);
ServiceType = XMLNode::createXMLTopNode( "ServiceType" );
ServiceType.addText( "SocialNetwork" );
Types.addChild(ServiceType);
ServiceType = XMLNode::createXMLTopNode( "ServiceType" );
ServiceType.addText( "Space" );
Types.addChild(ServiceType);
ServiceType = XMLNode::createXMLTopNode( "ServiceType" );
ServiceType.addText( "Profile" );
Types.addChild(ServiceType);
serviceFilter.addChild(Types);
if(data->lastChange != "0")
{
XMLNode View = XMLNode::createXMLTopNode( "View" );
View.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
View.addText("Full");
XMLNode deltasOnly = XMLNode::createXMLTopNode( "deltasOnly" );
deltasOnly.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
deltasOnly.addText("true");
XMLNode lastChange = XMLNode::createXMLTopNode( "lastChange" );
lastChange.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
lastChange.addText(data->lastChange.c_str());
FindMembership.addChild(View);
FindMembership.addChild(deltasOnly);
FindMembership.addChild(lastChange);
}
FindMembership.addChild(serviceFilter);
body.addChild(FindMembership);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(GET_LISTS, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseGetListsResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, GET_LISTS);
soapConnection->getLists(this->listInfo);
return;
}
XMLNode Services = response1.getChildNode("soap:Envelope").getChildNode("soap:Body").getChildNode("FindMembershipResponse").getChildNode("FindMembershipResult").getChildNode("Services");
int nServices = Services.nChildNode("Service");
for(int d=0;d<nServices;d++)
{
XMLNode Service = Services.getChildNode("Service", d);
XMLNode Memberships = Service.getChildNode("Memberships");
int nItems = Memberships.nChildNode("Membership");
for(int i=0;i<nItems;i++)
{
XMLNode Membership = Memberships.getChildNode("Membership", i);
std::string MemberRole = Membership.getChildNode("MemberRole").getText();
XMLNode Members = Membership.getChildNode("Members");
int nItems2 = Members.nChildNode("Member");
for(int j=0; j<nItems2;j++)
{
XMLNode Member = Members.getChildNode("Member", j);
// Email type is another network than WLM. Not supported yet
if(Member.nChildNode("Type") &&
Member.getChildNode("Type").getText() == "Email")
continue;
// TODO- verify if xsi:type == "PassportMember" instead
// of presence of PassportName
if(!Member.nChildNode("PassportName"))
continue;
std::string a = Member.getChildNode("PassportName").getText();
transform (a.begin(),a.end(), a.begin(), tolower);
// we cant add this contact or we will receive a 205 error
// see http://trac.adiumx.com/ticket/11126
if(a == "messenger@microsoft.com")
continue;
if(!listInfo->contactList[a])
listInfo->contactList[a]=new Buddy(a);
if(MemberRole == "Allow")
{
listInfo->contactList[a]->lists |= MSN::LST_AL;
}
else if(MemberRole == "Block")
{
listInfo->contactList[a]->lists |= MSN::LST_BL;
}
else if(MemberRole == "Reverse")
{
listInfo->contactList[a]->lists |= MSN::LST_RL;
}
else if(MemberRole == "Pending")
{
listInfo->contactList[a]->lists |= MSN::LST_PL;
}
}
}
}
listInfo->progress |= ListSyncInfo::LST_RL | ListSyncInfo::LST_AL | ListSyncInfo::LST_BL | ListSyncInfo::LST_PL;
response1.deleteNodeContent();
this->myNotificationServer()->gotLists(*this);
}
void Soap::getAddressBook(ListSyncInfo *info)
{
this->listInfo = info;
// info is used to to fill the lists with memebers
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode abapphdr = XMLNode::createXMLTopNode("ABApplicationHeader");
abapphdr.addAttribute("xmlns", "http://www.msn.com/webservices/AddressBook");
XMLNode appid = XMLNode::createXMLTopNode("ApplicationId");
appid.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
abapphdr.addChild(appid);
XMLNode ismigration = XMLNode::createXMLTopNode("IsMigration");
ismigration.addText("false");
abapphdr.addChild(ismigration);
XMLNode scenario = XMLNode::createXMLTopNode("PartnerScenario");
scenario.addText("Initial");
abapphdr.addChild(scenario);
header.addChild(abapphdr);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns", "http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode("ManagedGroupRequest");
ManagedGroupRequest.addText("false");
XMLNode TicketToken = XMLNode::createXMLTopNode("TicketToken");
// TODO - change this - maybe one day the position can be changed
TicketToken.addText( sitesToAuthList[3].BinarySecurityToken.c_str() );
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode("soap:Body");
XMLNode ABFindAll = XMLNode::createXMLTopNode("FindMembership");
ABFindAll.addAttribute("xmlns", "http://www.msn.com/webservices/AddressBook");
XMLNode abId = XMLNode::createXMLTopNode("abId");
abId.addText("00000000-0000-0000-0000-000000000000");
ABFindAll.addChild(abId);
XMLNode abView = XMLNode::createXMLTopNode("abView");
abView.addText("Full");
ABFindAll.addChild(abView);
XMLNode deltasOnly = XMLNode::createXMLTopNode("deltasOnly");
if(info->lastChange != "0")
{
// receive all the list
deltasOnly.addText("true");
}
else
{
// receive only the changes since lastChange
deltasOnly.addText("false");
}
ABFindAll.addChild(deltasOnly);
XMLNode lastChange_ = XMLNode::createXMLTopNode("lastChange");
if(info->lastChange == "0")
{
lastChange_.addText("0001-01-01T00:00:00.0000000-08:00");
}
else
{
lastChange_.addText( info->lastChange.c_str() );
}
ABFindAll.addChild(lastChange_);
body.addChild(ABFindAll);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(GET_ADDRESS_BOOK, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseGetAddressBookResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, GET_ADDRESS_BOOK);
soapConnection->getAddressBook(this->listInfo);
return;
}
XMLNode groups = response1.getChildNode("soap:Envelope").getChildNode("soap:Body").getChildNode("ABFindAllResponse").getChildNode("ABFindAllResult").getChildNode("groups");
int nItems = groups.nChildNode("Group");
for(int i=0;i<nItems;i++)
{
XMLNode thisGroup = groups.getChildNode("Group", i);
std::string groupId = thisGroup.getChildNode("groupId").getText();
std::string groupName = thisGroup.getChildNode("groupInfo").getChildNode("name").getText();
Group g(groupId, groupName);
listInfo->groups[groupId] = g;
}
XMLNode contacts = response1.getChildNode("soap:Envelope").getChildNode("soap:Body").getChildNode("ABFindAllResponse").getChildNode("ABFindAllResult").getChildNode("contacts");
nItems = contacts.nChildNode("Contact");
for(int a=0;a<nItems;a++)
{
XMLNode thisContact = contacts.getChildNode("Contact", a).getChildNode("contactInfo");
std::string contactType(thisContact.getChildNode("contactType").getText());
if(contactType=="Me"){
// Just grab the current Friendly name
std::string displayName;
const char *displayn = thisContact.getChildNode("displayName").getText();
if (displayn)
displayName = displayn;
listInfo->myDisplayName = displayName;
continue;
}
// TODO - grab all the fields
// passportName isn't ever present
std::string passportName;
std::string contactId;
const char *passportName_cstr = thisContact.getChildNode("passportName").getText();
const char *contactId_cstr = contacts.getChildNode("Contact", a).getChildNode("contactId").getText();
if(passportName_cstr)
passportName = passportName_cstr;
else
continue;
if(contactId_cstr)
contactId = contactId_cstr;
else
continue;
if(passportName.empty())
continue;
//
// FIXED 20090823 by José Agustín Terol Sanchis (agus3985@gmail.com):
//
// These attributes couldn't be founded at the server response and
// the method "getText()" will return NULL. This NULL value will
// throw a exception at the std::string constructor that will
// abort the address book parsing and, by the way, the connection
// to the service.
std::string displayName;
const char *displayName_cstr = thisContact.getChildNode("displayName").getText();
if (displayName_cstr)
{
displayName = displayName_cstr;
}
else
{
// We can use the passport name if we haven't received the
// displayName of the current contact instead of ignore it
displayName = passportName;
// continue;
}
std::string isMobileIMEnabled;
const char *isMobileIMEnabled_cstr = thisContact.getChildNode("isMobileIMEnabled").getText();
if (isMobileIMEnabled_cstr)
isMobileIMEnabled = isMobileIMEnabled_cstr;
else
continue; // We could use here a default string such as "false"
std::string isMessengerUser;
const char *isMessengerUser_cstr = thisContact.getChildNode("isMessengerUser").getText();
if (isMessengerUser_cstr)
isMessengerUser = isMessengerUser_cstr;
else
continue; // We could use here a default string such as "true"
std::string contactType1;
const char *contactType1_cstr = thisContact.getChildNode("contactType").getText();
if (contactType1_cstr)
contactType1 = contactType1_cstr;
else
continue; // We could use here a default string such as "Regular"
transform (passportName.begin(), passportName.end(), passportName.begin(), tolower);
// we cant add this contact or we will receive a 205 error
// see http://trac.adiumx.com/ticket/11126
if( passportName == "messenger@microsoft.com")
continue;
if(!listInfo->contactList[passportName])
listInfo->contactList[passportName]=new Buddy(passportName,displayName);
MSN::Buddy *contact = listInfo->contactList[passportName];
contact->properties["contactId"] = contactId;
contact->properties["passportName"] = passportName;
contact->properties["displayName"] = displayName;
contact->properties["isMobileIMEnabled"] = isMobileIMEnabled;
contact->properties["isMessengerUser"] = isMessengerUser;
contact->properties["contactType"] = contactType1;
contact->userName = contact->properties["passportName"];
contact->friendlyName = contact->properties["displayName"];
contact->lists |= MSN::LST_AB;
XMLNode groupIds = thisContact.getChildNode("groupIds");
int nItems2 = groupIds.nChildNode("guid");
for(int b=0;b<nItems2;b++)
{
XMLNode guid = groupIds.getChildNode("guid", b);
std::string groupID(guid.getText());
listInfo->groups[groupID].buddies.push_back(contact);
listInfo->contactList[contact->userName]->groups.push_back(&listInfo->groups[groupID]);
}
}
listInfo->progress |= ListSyncInfo::LST_AB;
std::string lastChange;
const char *clastChange = response1.getChildNode("soap:Envelope").getChildNode("soap:Body").getChildNode("ABFindAllResponse").getChildNode("ABFindAllResult").getChildNode("ab").getChildNode("lastChange").getText();
if(clastChange)
lastChange = clastChange;
else
lastChange = "0";
this->myNotificationServer()->externalCallbacks.gotLatestListSerial(this->myNotificationServer(), lastChange);
response1.deleteNodeContent();
this->myNotificationServer()->gotAddressBook(*this);
}
void Soap::getOIM(std::string id, bool markAsRead)
{
this->oim_id = id;
this->markAsRead = markAsRead;
// index 2 is messenger.msn.com
std::string token = sitesToAuthList[2].BinarySecurityToken;
std::string t = token.substr(token.find("t=") + 2, token.find("&p=")-2);
std::string p = token.substr(token.find("&p=") + 3, -1);
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode PassportCookie = XMLNode::createXMLTopNode("PassportCookie");
PassportCookie.addAttribute("xmlns", "http://www.hotmail.msn.com/ws/2004/09/oim/rsi");
XMLNode t1 = XMLNode::createXMLTopNode("t");
t1.addText(t.c_str());
XMLNode p1 = XMLNode::createXMLTopNode("p");
p1.addText(p.c_str());
PassportCookie.addChild(t1);
PassportCookie.addChild(p1);
header.addChild(PassportCookie);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode("soap:Body");
XMLNode GetMessage = XMLNode::createXMLTopNode("GetMessage");
GetMessage.addAttribute("xmlns", "http://www.hotmail.msn.com/ws/2004/09/oim/rsi");
XMLNode messageId = XMLNode::createXMLTopNode("messageId");
messageId.addText(id.c_str());
XMLNode alsoMarkAsRead = XMLNode::createXMLTopNode("alsoMarkAsRead");
if(markAsRead)
alsoMarkAsRead.addText("true");
else
alsoMarkAsRead.addText("false");
GetMessage.addChild(messageId);
GetMessage.addChild(alsoMarkAsRead);
body.addChild(GetMessage);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(RETRIEVE_OIM, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseGetOIMResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, RETRIEVE_OIM);
soapConnection->getOIM(this->oim_id, this->markAsRead);
return;
}
const char* msg = response1.getChildNode("soap:Envelope").getChildNode("soap:Body").getChildNode("GetMessageResponse").getChildNode("GetMessageResult").getText();
if(msg)
{
std::string message1(msg);
// TODO - extract all the fields. create a struct to carry this data
message1 = message1.substr(message1.find("\r\n\r\n")+4,-1).c_str();
std::vector<std::string> a = splitString(message1, "\r\n");
message1="";
std::vector<std::string>::iterator i = a.begin();
for(;i!=a.end(); i++)
{
message1+=(*i);
}
message1 = b64_decode(message1.c_str());
response1.deleteNodeContent();
// yes, new oim
this->myNotificationServer()->gotOIM(*this, true, this->oim_id, message1);
return;
}
// no oim with this id
this->myNotificationServer()->gotOIM(*this, false, this->oim_id, "");
}
void Soap::deleteOIM(std::string id)
{
this->oim_id=id;
// index 2 is messenger.msn.com
std::string token = sitesToAuthList[2].BinarySecurityToken;
std::string t = token.substr(token.find("t=") + 2, token.find("&p=")-2);
std::string p = token.substr(token.find("&p=") + 3, -1);
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode PassportCookie = XMLNode::createXMLTopNode("PassportCookie");
PassportCookie.addAttribute("xmlns", "http://www.hotmail.msn.com/ws/2004/09/oim/rsi");
XMLNode t1 = XMLNode::createXMLTopNode("t");
t1.addText(t.c_str());
XMLNode p1 = XMLNode::createXMLTopNode("p");
p1.addText(p.c_str());
PassportCookie.addChild(t1);
PassportCookie.addChild(p1);
header.addChild(PassportCookie);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode("soap:Body");
XMLNode DeleteMessages = XMLNode::createXMLTopNode("DeleteMessages");
DeleteMessages.addAttribute("xmlns", "http://www.hotmail.msn.com/ws/2004/09/oim/rsi");
XMLNode messageIds = XMLNode::createXMLTopNode("messageIds");
XMLNode messageId = XMLNode::createXMLTopNode("messageId");
messageId.addText(id.c_str());
messageIds.addChild(messageId);
DeleteMessages.addChild(messageIds);
body.addChild(DeleteMessages);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(DELETE_OIM, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseDeleteOIMResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, DELETE_OIM);
soapConnection->deleteOIM(this->oim_id);
return;
}
if(http_response_code == "200" )
{
this->myNotificationServer()->gotOIMDeleteConfirmation(*this, oim_id, true);
return;
}
this->myNotificationServer()->gotOIMDeleteConfirmation(*this, oim_id, false);
}
void Soap::getMailData()
{
// index 2 is messenger.msn.com
std::string token = sitesToAuthList[2].BinarySecurityToken;
std::string t = token.substr(token.find("t=") + 2, token.find("&p=")-2);
std::string p = token.substr(token.find("&p=") + 3, -1);
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode PassportCookie = XMLNode::createXMLTopNode("PassportCookie");
PassportCookie.addAttribute("xmlns", "http://www.hotmail.msn.com/ws/2004/09/oim/rsi");
XMLNode t1 = XMLNode::createXMLTopNode("t");
t1.addText(t.c_str());
XMLNode p1 = XMLNode::createXMLTopNode("p");
p1.addText(p.c_str());
PassportCookie.addChild(t1);
PassportCookie.addChild(p1);
header.addChild(PassportCookie);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode("soap:Body");
XMLNode GetMetadata = XMLNode::createXMLTopNode("GetMetadata");
GetMetadata.addAttribute("xmlns", "http://www.hotmail.msn.com/ws/2004/09/oim/rsi");
body.addChild(GetMetadata);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(RETRIEVE_OIM_MAIL_DATA, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseGetMailDataResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301")
{
Soap *soapConnection = manageSoapRedirect(response1, RETRIEVE_OIM_MAIL_DATA);
soapConnection->getMailData();
return;
}
// oh my god! xml text as a field of a xml node! I cant believe it!
std::string maildata = response1.getChildNode("soap:Envelope").getChildNode("soap:Body").getChildNode("GetMetadataResponse").getChildNode("MD").createXMLString(false);
if(maildata.empty())
return; // TODO - raise an error
response1.deleteNodeContent();
this->myNotificationServer()->gotSoapMailData(*this, maildata);
}
void Soap::generateLockkey(OIM oim)
{
//almost equal to send oim
this->oim = oim;
// index 4 is messengersecure.live.com
std::string token = sitesToAuthList[4].BinarySecurityToken;
// encoding to the required form
oim.myFname = "=?utf-8?B?" + b64_encode(oim.myFname.c_str(), oim.myFname.length()) + "?=";
// TODO - find an email library to handle this part
std::string b64_message = b64_encode(oim.message.c_str(), oim.message.length());
oim.message="";
for(unsigned int i=0; i<b64_message.length();i++)
{
if( (i%72) == 0 && i != 0 )
{
oim.message.append("\r\n");
oim.message+=b64_message.at(i);
}
else
{
oim.message += b64_message.at(i);
}
}
std::string msg_body("MIME-Version: 1.0\r\n"
"Content-Type: text/plain; charset=UTF-8\r\n"
"Content-Transfer-Encoding: base64\r\n"
"X-OIM-Message-Type: OfflineMessage\r\n"
"X-OIM-Run-Id: "+new_branch()+"\r\n"
"X-OIM-Sequence-Num: 1\r\n\r\n"+
oim.message);
oim.full_msg = msg_body;
this->oim.full_msg = oim.full_msg;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode From = XMLNode::createXMLTopNode("From");
From.addAttribute("memberName", oim.myUsername.c_str());
From.addAttribute("friendlyName", oim.myFname.c_str());
From.addAttribute("xml:lang", "pt-BR");
From.addAttribute("proxy", "MSNMSGR");
From.addAttribute("xmlns", "http://messenger.msn.com/ws/2004/09/oim/");
From.addAttribute("msnpVer", "MSNP15");
From.addAttribute("buildVer", "8.1.0178");
XMLNode To = XMLNode::createXMLTopNode("To");
To.addAttribute("memberName", oim.toUsername.c_str());
To.addAttribute("xmlns", "http://messenger.msn.com/ws/2004/09/oim/");
XMLNode Ticket = XMLNode::createXMLTopNode("Ticket");
Ticket.addAttribute("passport", decodeURL(token).c_str());
Ticket.addAttribute("appid", szClientID);
Ticket.addAttribute("lockkey", "");
Ticket.addAttribute("xmlns", "http://messenger.msn.com/ws/2004/09/oim/");
XMLNode Sequence = XMLNode::createXMLTopNode("Sequence");
Sequence.addAttribute("xmlns", "http://schemas.xmlsoap.org/ws/2003/03/rm");
XMLNode Identifier = XMLNode::createXMLTopNode( "Identifier" );
Identifier.addAttribute("xmlns", "http://schemas.xmlsoap.org/ws/2002/07/utility");
Identifier.addText("http://messenger.msn.com");
XMLNode MessageNumber = XMLNode::createXMLTopNode("MessageNumber");
MessageNumber.addText("1");
Sequence.addChild(Identifier);
Sequence.addChild(MessageNumber);
header.addChild(From);
header.addChild(To);
header.addChild(Ticket);
header.addChild(Sequence);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode MessageType = XMLNode::createXMLTopNode( "MessageType" );
MessageType.addAttribute("xmlns","http://messenger.msn.com/ws/2004/09/oim/");
MessageType.addText("text");
XMLNode Content = XMLNode::createXMLTopNode( "Content" );
Content.addAttribute("xmlns","http://messenger.msn.com/ws/2004/09/oim/");
Content.addText(oim.full_msg.c_str());
body.addChild(MessageType);
body.addChild(Content);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(GENERATE_LOCKKEY, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseGenerateLockkeyResponse(std::string response)
{
OIM oim = this->oim;
// probably we need to generate a new lockkey
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301")
{
Soap *soapConnection = manageSoapRedirect(response1, GENERATE_LOCKKEY);
soapConnection->generateLockkey(this->oim);
return;
}
XMLNode LockKeyChallenge = response1.getChildNode("soap:Envelope").getChildNode("soap:Body").getChildNode("soap:Fault").getChildNode("detail").getChildNode("LockKeyChallenge");
const char * lockkey1 = LockKeyChallenge.getText();
if(!lockkey1)
{
this->myNotificationServer()->gotOIMLockkey(*this, "");
return;
}
std::string lockkey = lockkey1;
char b[33];
memset(&b,0,33);
DoMSNP11Challenge(lockkey.c_str(),b);
std::string new_lockkey(b);
this->lockkey = new_lockkey;
this->myNotificationServer()->gotOIMLockkey(*this, this->lockkey);
}
void Soap::sendOIM(OIM oim, std::string lockkey)
{
this->oim = oim;
this->lockkey = lockkey;
// index 4 is messengersecure.live.com
std::string token = sitesToAuthList[4].BinarySecurityToken;
// encoding to the required form
oim.myFname = "=?utf-8?B?" + b64_encode(oim.myFname.c_str(), oim.myFname.length()) + "?=";
// TODO - find an email library to handle this part
std::string b64_message = b64_encode(oim.message.c_str(), oim.message.length());
oim.message="";
for(unsigned int i=0; i<b64_message.length();i++)
{
if( (i%72) == 0 && i != 0 )
{
oim.message.append("\r\n");
oim.message+=b64_message.at(i);
}
else
{
oim.message += b64_message.at(i);
}
}
std::string msg_body("MIME-Version: 1.0\r\n"
"Content-Type: text/plain; charset=UTF-8\r\n"
"Content-Transfer-Encoding: base64\r\n"
"X-OIM-Message-Type: OfflineMessage\r\n"
"X-OIM-Run-Id: "+new_branch()+"\r\n"
"X-OIM-Sequence-Num: 1\r\n\r\n"+
oim.message);
oim.full_msg = msg_body;
this->oim.full_msg = oim.full_msg;
XMLNode envelope = XMLNode::createXMLTopNode("soap:Envelope");
envelope.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode From = XMLNode::createXMLTopNode("From");
From.addAttribute("memberName", oim.myUsername.c_str());
From.addAttribute("friendlyName", oim.myFname.c_str());
From.addAttribute("xml:lang", "pt-BR");
From.addAttribute("proxy", "MSNMSGR");
From.addAttribute("xmlns", "http://messenger.msn.com/ws/2004/09/oim/");
From.addAttribute("msnpVer", "MSNP15");
From.addAttribute("buildVer", "8.1.0178");
XMLNode To = XMLNode::createXMLTopNode("To");
To.addAttribute("memberName", oim.toUsername.c_str());
To.addAttribute("xmlns", "http://messenger.msn.com/ws/2004/09/oim/");
XMLNode Ticket = XMLNode::createXMLTopNode("Ticket");
Ticket.addAttribute("passport", decodeURL(token).c_str());
Ticket.addAttribute("appid", szClientID);
Ticket.addAttribute("lockkey", lockkey.c_str());
Ticket.addAttribute("xmlns", "http://messenger.msn.com/ws/2004/09/oim/");
XMLNode Sequence = XMLNode::createXMLTopNode("Sequence");
Sequence.addAttribute("xmlns", "http://schemas.xmlsoap.org/ws/2003/03/rm");
XMLNode Identifier = XMLNode::createXMLTopNode( "Identifier" );
Identifier.addAttribute("xmlns", "http://schemas.xmlsoap.org/ws/2002/07/utility");
Identifier.addText("http://messenger.msn.com");
XMLNode MessageNumber = XMLNode::createXMLTopNode("MessageNumber");
MessageNumber.addText("1");
Sequence.addChild(Identifier);
Sequence.addChild(MessageNumber);
header.addChild(From);
header.addChild(To);
header.addChild(Ticket);
header.addChild(Sequence);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode MessageType = XMLNode::createXMLTopNode( "MessageType" );
MessageType.addAttribute("xmlns","http://messenger.msn.com/ws/2004/09/oim/");
MessageType.addText("text");
XMLNode Content = XMLNode::createXMLTopNode( "Content" );
Content.addAttribute("xmlns","http://messenger.msn.com/ws/2004/09/oim/");
Content.addText(oim.full_msg.c_str());
body.addChild(MessageType);
body.addChild(Content);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(SEND_OIM, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseSendOIMResponse(std::string response)
{
OIM oim = this->oim;
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301")
{
Soap *soapConnection = manageSoapRedirect(response1, SEND_OIM);
soapConnection->sendOIM(this->oim, this->lockkey);
return;
}
if(http_response_code == "200" )
{
this->myNotificationServer()->gotOIMSendConfirmation(*this, oim.id, true);
return;
}
this->myNotificationServer()->gotOIMSendConfirmation(*this, oim.id, false);
}
void Soap::changeDisplayName(std::string newDisplayName)
{
this->tempDisplayName = newDisplayName;
XMLNode envelope = XMLNode::createXMLTopNode( "soap:Envelope" );
envelope.addAttribute("xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/");
envelope.addAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
envelope.addAttribute("xmlns:xsd","http://www.w3.org/2001/XMLSchema");
envelope.addAttribute("xmlns:soapenc","http://schemas.xmlsoap.org/soap/encoding/");
XMLNode header = XMLNode::createXMLTopNode("soap:Header");
XMLNode ABApplicationHeader = XMLNode::createXMLTopNode( "ABApplicationHeader" );
ABApplicationHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ApplicationId = XMLNode::createXMLTopNode( "ApplicationId" );
ApplicationId.addText("996CDE1E-AA53-4477-B943-2BE802EA6166");
XMLNode IsMigration = XMLNode::createXMLTopNode("IsMigration");
IsMigration.addText("false");
XMLNode PartnerScenario = XMLNode::createXMLTopNode("PartnerScenario");
PartnerScenario.addText("Timer");
ABApplicationHeader.addChild(ApplicationId);
ABApplicationHeader.addChild(IsMigration);
ABApplicationHeader.addChild(PartnerScenario);
XMLNode ABAuthHeader = XMLNode::createXMLTopNode("ABAuthHeader");
ABAuthHeader.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode ManagedGroupRequest = XMLNode::createXMLTopNode("ManagedGroupRequest");
ManagedGroupRequest.addText("false");
XMLNode TicketToken = XMLNode::createXMLTopNode("TicketToken");
TicketToken.addText(sitesToAuthList[3].BinarySecurityToken.c_str());
ABAuthHeader.addChild(ManagedGroupRequest);
ABAuthHeader.addChild(TicketToken);
header.addChild(ABApplicationHeader);
header.addChild(ABAuthHeader);
envelope.addChild(header);
XMLNode body = XMLNode::createXMLTopNode( "soap:Body" );
XMLNode ABContactUpdate = XMLNode::createXMLTopNode( "ABContactUpdate" );
ABContactUpdate.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode abId = XMLNode::createXMLTopNode( "abId" );
abId.addText("00000000-0000-0000-0000-000000000000");
XMLNode contacts = XMLNode::createXMLTopNode( "contacts" );
XMLNode Contact = XMLNode::createXMLTopNode( "Contact" );
Contact.addAttribute("xmlns","http://www.msn.com/webservices/AddressBook");
XMLNode contactInfo = XMLNode::createXMLTopNode( "contactInfo" );
XMLNode contactType = XMLNode::createXMLTopNode( "contactType" );
contactType.addText("Me");
XMLNode displayName = XMLNode::createXMLTopNode( "displayName" );
displayName.addText(newDisplayName.c_str());
contactInfo.addChild(contactType);
contactInfo.addChild(displayName);
XMLNode propertiesChanged = XMLNode::createXMLTopNode( "propertiesChanged" );
propertiesChanged.addText("DisplayName");
Contact.addChild(contactInfo);
Contact.addChild(propertiesChanged);
contacts.addChild(Contact);
ABContactUpdate.addChild(abId);
ABContactUpdate.addChild(contacts);
body.addChild(ABContactUpdate);
envelope.addChild(body);
std::string xml_response;
char *xml_request = envelope.createXMLString(false);
std::string temp2 = xml_request;
this->request_body = temp2;
requestSoapAction(CHANGE_DISPLAYNAME, xml_request, xml_response);
free(xml_request);
envelope.deleteNodeContent();
}
void Soap::parseChangeDisplayNameResponse(std::string response)
{
XMLNode response1 = XMLNode::parseString(response.c_str());
if(http_response_code == "301" )
{
Soap *soapConnection = manageSoapRedirect(response1, CHANGE_DISPLAYNAME);
soapConnection->changeDisplayName(this->tempDisplayName);
return;
}
if(http_response_code == "200" )
{
this->myNotificationServer()->gotChangeDisplayNameConfirmation(*this, this->tempDisplayName, true);
return;
}
this->myNotificationServer()->gotChangeDisplayNameConfirmation(*this, this->tempDisplayName, false);
}
void Soap::socketConnectionCompleted()
{
Connection::socketConnectionCompleted();
this->myNotificationServer()->externalCallbacks.unregisterSocket(this->sock);
this->myNotificationServer()->externalCallbacks.registerSocket(this->sock, 1, 0, true);
}
void Soap::handleIncomingData()
{
// grab http header
if(this->http_header_response.empty())
{
if (this->readBuffer.find("\r\n\r\n") == std::string::npos )
return;
http_header_response = this->readBuffer.substr(0,this->readBuffer.find("\r\n\r\n") + 4);
Message::Headers headers = Message::Headers(http_header_response);
this->response_length = decimalFromString(headers["Content-Length"]);
this->http_response_code = splitString(http_header_response.substr(0,http_header_response.find("\r\n"))," ")[1];
// drop http from buffer
this->readBuffer = this->readBuffer.substr(this->readBuffer.find("\r\n\r\n") + 4);
}
if(this->readBuffer.length() < this->response_length)
return; // wait for the full response
this->response_body = this->readBuffer;
this->readBuffer.clear();
this->myNotificationServer()->externalCallbacks.unregisterSocket(this->sock);
switch(this->action)
{
case AUTH:
parseGetTicketsResponse(this->response_body);
break;
case GET_LISTS:
parseGetListsResponse(this->response_body);
break;
case GET_ADDRESS_BOOK:
parseGetAddressBookResponse(this->response_body);
break;
case SEND_OIM:
parseSendOIMResponse(this->response_body);
break;
case GENERATE_LOCKKEY:
parseGenerateLockkeyResponse(this->response_body);
break;
case RETRIEVE_OIM:
parseGetOIMResponse(this->response_body);
break;
case DELETE_OIM:
parseDeleteOIMResponse(this->response_body);
break;
case RETRIEVE_OIM_MAIL_DATA:
parseGetMailDataResponse(this->response_body);
break;
case ADD_CONTACT_TO_LIST:
parseAddContactToListResponse(this->response_body);
break;
case DEL_CONTACT_FROM_LIST:
parseRemoveContactFromListResponse(this->response_body);
break;
case CHANGE_DISPLAYNAME:
parseChangeDisplayNameResponse(this->response_body);
break;
case ADD_CONTACT_TO_GROUP:
parseAddContactToGroupResponse(this->response_body);
break;
case DEL_CONTACT_FROM_GROUP:
parseDelContactFromGroupResponse(this->response_body);
break;
case ADD_GROUP:
parseAddGroupResponse(this->response_body);
break;
case DEL_GROUP:
parseDelGroupResponse(this->response_body);
break;
case RENAME_GROUP:
parseRenameGroupResponse(this->response_body);
break;
case DISABLE_CONTACT_ON_ADDRESSBOOK:
parseDisableContactFromAddressBookResponse(this->response_body);
break;
case ENABLE_CONTACT_ON_ADDRESSBOOK:
parseEnableContactOnAddressBookResponse(this->response_body);
break;
case ADD_CONTACT_TO_ADDRESSBOOK:
parseAddContactToAddressBookResponse(this->response_body);
break;
case DEL_CONTACT_FROM_ADDRESSBOOK:
parseDelContactFromAddressBookResponse(this->response_body);
break;
}
delete this;
}
Soap* Soap::manageSoapRedirect(XMLNode response1, soapAction action)
{
Soap *soapConnection = new Soap(notificationServer, sitesToAuthList);
Message::Headers headers = Message::Headers(http_header_response);
std::string newdomain;
std::string location = headers["Location"];
const char *preferredHostName = response1.getChildNode("soap:Envelope").getChildNode("soap:Header").getChildNode("ServiceHeader").getChildNode("PreferredHostName").getText();
if(preferredHostName)
{
std::string newdomain(preferredHostName);
soapConnection->actionDomains[action] = newdomain;
}
if (location.size())
{
std::string newurl1(location);
std::vector<std::string> a = splitString(newurl1, "/");
std::string newdomain = splitString(a[1], "/")[0];
soapConnection->actionDomains[action] = newdomain;
std::vector<std::string> postpath = splitString(newurl1, newdomain);
soapConnection->actionPOSTURLs[action] = postpath[1];
}
soapConnection->setMBI(mbi);
return soapConnection;
}
void Soap::disconnect()
{
}
Soap::~Soap()
{
Connection::disconnect();
if(this->myNotificationServer()->connectionState() != MSN::NotificationServerConnection::NS_DISCONNECTED)
this->myNotificationServer()->removeSoapConnection(this);
}
}