diff --git a/3rdparty/o2/src/o2skydrive.cpp b/3rdparty/o2/src/o2skydrive.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c8607d4c5eab477880f8640ece37f88a4af42bf8 --- /dev/null +++ b/3rdparty/o2/src/o2skydrive.cpp @@ -0,0 +1,121 @@ +#include +#include +#include +#include +#include +#if QT_VERSION >= 0x050000 +#include +#endif + +#include "o2skydrive.h" +#include "o2globals.h" + +#define trace() if (1) qDebug() +// define trace() if (0) qDebug() + +O2Skydrive::O2Skydrive(QObject *parent): O2(parent) { + setRequestUrl("https://login.live.com/oauth20_authorize.srf"); + setTokenUrl("https://login.live.com/oauth20_token.srf"); + setRefreshTokenUrl("https://login.live.com/oauth20_token.srf"); +} + +void O2Skydrive::link() { + trace() << "O2::link"; + if (linked()) { + trace() << "Linked already"; + return; + } + + redirectUri_ = QString("https://login.live.com/oauth20_desktop.srf"); + + // Assemble intial authentication URL + QList > parameters; + parameters.append(qMakePair(QString(O2_OAUTH2_RESPONSE_TYPE), (grantFlow_ == GrantFlowAuthorizationCode) ? QString(O2_OAUTH2_CODE) : QString(O2_OAUTH2_TOKEN))); + parameters.append(qMakePair(QString(O2_OAUTH2_CLIENT_ID), clientId_)); + parameters.append(qMakePair(QString(O2_OAUTH2_REDIRECT_URI), redirectUri_)); + parameters.append(qMakePair(QString(O2_OAUTH2_SCOPE), scope_)); + + // Show authentication URL with a web browser + QUrl url(requestUrl_); +#if QT_VERSION < 0x050000 + url.setQueryItems(parameters); +#else + QUrlQuery query(url); + query.setQueryItems(parameters); + url.setQuery(query); +#endif + emit openBrowser(url); +} + +void O2Skydrive::redirected(const QUrl &url) { + trace() << "O2::redirected" << url; + + emit closeBrowser(); + + if (grantFlow_ == GrantFlowAuthorizationCode) { + // Get access code + QString urlCode; +#if QT_VERSION < 0x050000 + urlCode = url.queryItemValue(O2_OAUTH2_CODE); +#else + QUrlQuery query(url); + urlCode = query.queryItemValue(O2_OAUTH2_CODE); +#endif + if (urlCode.isEmpty()) { + trace() << " Code not received"; + emit linkingFailed(); + return; + } + setCode(urlCode); + + // Exchange access code for access/refresh tokens + QNetworkRequest tokenRequest(tokenUrl_); + tokenRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); + QMap parameters; + parameters.insert(O2_OAUTH2_CODE, code()); + parameters.insert(O2_OAUTH2_CLIENT_ID, clientId_); + parameters.insert(O2_OAUTH2_CLIENT_SECRET, clientSecret_); + parameters.insert(O2_OAUTH2_REDIRECT_URI, redirectUri_); + parameters.insert(O2_OAUTH2_GRANT_TYPE, O2_AUTHORIZATION_CODE); + QByteArray data = buildRequestBody(parameters); + QNetworkReply *tokenReply = manager_->post(tokenRequest, data); + 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); + } else { + // Get access token + QString urlToken = ""; + QString urlRefreshToken = ""; + int urlExpiresIn = 0; + + QStringList parts = url.toString().split("#"); + if (parts.length() > 1) { + foreach (QString item, parts[1].split("&")) { + int index = item.indexOf("="); + if (index == -1) { + continue; + } + QString key = item.left(index); + QString value = item.mid(index + 1); + trace() << "" << key; + if (key == O2_OAUTH2_ACCESS_TOKEN) { + urlToken = value; + } else if (key == O2_OAUTH2_EXPIRES_IN) { + urlExpiresIn = value.toInt(); + } else if (key == O2_OAUTH2_REFRESH_TOKEN) { + urlRefreshToken = value; + } + } + } + + setToken(urlToken); + setRefreshToken(urlRefreshToken); + setExpires(QDateTime::currentMSecsSinceEpoch() / 1000 + urlExpiresIn); + if (urlToken.isEmpty()) { + emit linkingFailed(); + } else { + emit linkedChanged(); + emit linkingSucceeded(); + } + } +}