From 8d8549433b2f91f72fba82e004034938da262466 Mon Sep 17 00:00:00 2001 From: Jeremy Lainé Date: Mon, 26 Sep 2011 09:40:51 +0000 Subject: add support for X-FACEBOOK-PLATFORM authentication --- src/QXmppOutgoingClient.cpp | 57 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 9 deletions(-) (limited to 'src/QXmppOutgoingClient.cpp') diff --git a/src/QXmppOutgoingClient.cpp b/src/QXmppOutgoingClient.cpp index 1a52be02..582959f7 100644 --- a/src/QXmppOutgoingClient.cpp +++ b/src/QXmppOutgoingClient.cpp @@ -24,6 +24,7 @@ #include #include +#include #include "QXmppConfiguration.h" #include "QXmppConstants.h" @@ -348,6 +349,9 @@ void QXmppOutgoingClient::handleStanza(const QDomElement &nodeRecv) case QXmppConfiguration::SASLAnonymous: sendData(""); break; + case QXmppConfiguration::SASLXFacebookPlatform: + sendData(""); + break; } } @@ -392,18 +396,29 @@ void QXmppOutgoingClient::handleStanza(const QDomElement &nodeRecv) else if(nodeRecv.tagName() == "challenge") { // TODO: Track which mechanism was used for when other SASL protocols which use challenges are supported - d->saslStep++; - switch (d->saslStep) + QXmppConfiguration::SASLAuthMechanism mechanism = configuration().sASLAuthMechanism(); + switch(mechanism) { - case 1 : - sendAuthDigestMD5ResponseStep1(nodeRecv.text()); + case QXmppConfiguration::SASLDigestMD5: + d->saslStep++; + switch (d->saslStep) + { + case 1 : + sendAuthDigestMD5ResponseStep1(nodeRecv.text()); + break; + case 2 : + sendAuthDigestMD5ResponseStep2(nodeRecv.text()); + break; + default : + warning("Too many authentication steps"); + disconnectFromHost(); + break; + } break; - case 2 : - sendAuthDigestMD5ResponseStep2(nodeRecv.text()); + case QXmppConfiguration::SASLXFacebookPlatform: + sendAuthXFacebookResponse(nodeRecv.text()); break; - default : - warning("Too many authentication steps"); - disconnectFromHost(); + default: break; } } @@ -676,6 +691,30 @@ void QXmppOutgoingClient::sendAuthDigestMD5ResponseStep2(const QString &challeng sendData(""); } +void QXmppOutgoingClient::sendAuthXFacebookResponse(const QString& challenge) +{ + // parse request + QUrl request; + request.setEncodedQuery(QByteArray::fromBase64(challenge.toAscii())); + if (!request.hasQueryItem("method") || !request.hasQueryItem("nonce")) { + warning("sendAuthXFacebookResponse: Invalid input"); + disconnectFromHost(); + return; + } + + // build response + QUrl response; + response.addQueryItem("access_token", configuration().facebookAccessToken()); + response.addQueryItem("api_key", configuration().facebookAppId()); + response.addQueryItem("call_id", 0); + response.addQueryItem("method", request.queryItemValue("method")); + response.addQueryItem("nonce", request.queryItemValue("nonce")); + response.addQueryItem("v", "1.0"); + + sendData("" + + response.encodedQuery().toBase64() + ""); +} + void QXmppOutgoingClient::sendNonSASLAuth(bool plainText) { QXmppNonSASLAuthIq authQuery; -- cgit v1.2.3