diff --git a/3rdparty/o2/src/o2facebook.cpp b/3rdparty/o2/src/o2facebook.cpp new file mode 100644 index 0000000000000000000000000000000000000000..43ca0754fcae775cc74ba0faeefffae2e4c53abe --- /dev/null +++ b/3rdparty/o2/src/o2facebook.cpp @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#if QT_VERSION >= 0x050000 +#include +#endif + +#include "o2facebook.h" +#include "o2globals.h" + +static const char *FbEndpoint = "https://graph.facebook.com/oauth/authorize?display=touch"; +static const char *FbTokenUrl = "https://graph.facebook.com/oauth/access_token"; +static const quint16 FbLocalPort = 1965; + +const char FB_EXPIRES_KEY[] = "expires"; + +O2Facebook::O2Facebook(QObject *parent): O2(parent) { + setRequestUrl(FbEndpoint); + setTokenUrl(FbTokenUrl); + setLocalPort(FbLocalPort); +} + +void O2Facebook::onVerificationReceived(const QMap response) { + emit closeBrowser(); + if (response.contains("error")) { + qWarning() << "O2Facebook::onVerificationReceived: Verification failed"; + foreach (QString key, response.keys()) { + qWarning() << "O2Facebook::onVerificationReceived:" << key << response.value(key); + } + emit linkingFailed(); + return; + } + + // Save access code + setCode(response.value(O2_OAUTH2_CODE)); + + // Exchange access code for access/refresh tokens + QUrl url(tokenUrl_); +#if QT_VERSION < 0x050000 + url.addQueryItem(O2_OAUTH2_CLIENT_ID, clientId_); + url.addQueryItem(O2_OAUTH2_CLIENT_SECRET, clientSecret_); + url.addQueryItem(O2_OAUTH2_SCOPE, scope_); + url.addQueryItem(O2_OAUTH2_CODE, code()); + url.addQueryItem(O2_OAUTH2_REDIRECT_URI, redirectUri_); +#else + QUrlQuery query(url); + query.addQueryItem(O2_OAUTH2_CLIENT_ID, clientId_); + query.addQueryItem(O2_OAUTH2_CLIENT_SECRET, clientSecret_); + query.addQueryItem(O2_OAUTH2_SCOPE, scope_); + query.addQueryItem(O2_OAUTH2_CODE, code()); + query.addQueryItem(O2_OAUTH2_REDIRECT_URI, redirectUri_); + url.setQuery(query); +#endif + + QNetworkRequest tokenRequest(url); + QNetworkReply *tokenReply = manager_->get(tokenRequest); + timedReplies_.add(tokenReply); + connect(tokenReply, SIGNAL(finished()), this, SLOT(onTokenReplyFinished()), Qt::QueuedConnection); + connect(tokenReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onTokenReplyError(QNetworkReply::NetworkError)), Qt::QueuedConnection); +} + +void O2Facebook::onTokenReplyFinished() { + QNetworkReply *tokenReply = qobject_cast(sender()); + if (tokenReply->error() == QNetworkReply::NoError) { + + // Process reply + QByteArray replyData = tokenReply->readAll(); + QMap reply; + foreach (QString pair, QString(replyData).split("&")) { + QStringList kv = pair.split("="); + if (kv.length() == 2) { + reply.insert(kv[0], kv[1]); + } + } + + // Interpret reply + setToken(reply.value(O2_OAUTH2_ACCESS_TOKEN, "")); + setExpires(reply.value(FB_EXPIRES_KEY).toInt()); + setRefreshToken(reply.value(O2_OAUTH2_REFRESH_TOKEN, "")); + + timedReplies_.remove(tokenReply); + emit linkedChanged(); + emit tokenChanged(); + emit linkingSucceeded(); + } +} + +void O2Facebook::unlink() { + O2::unlink(); + // FIXME: Delete relevant cookies, too +}