mirror of
https://github.com/qgis/QGIS.git
synced 2025-03-01 00:46:20 -05:00
120 lines
3.8 KiB
C++
120 lines
3.8 KiB
C++
#include <QNetworkAccessManager>
|
|
#include <QNetworkRequest>
|
|
#include <QNetworkReply>
|
|
#include <QDesktopServices>
|
|
#include <QMetaEnum>
|
|
#include <QDebug>
|
|
|
|
#include "fbdemo.h"
|
|
#include "o0globals.h"
|
|
#include "o0settingsstore.h"
|
|
|
|
const char FB_APP_KEY[] = "227896037359072";
|
|
const char FB_APP_SECRET[] = "3d35b063872579cf7213e09e76b65ceb";
|
|
|
|
const char FB_REQUEST_URL[] = "https://www.facebook.com/dialog/oauth";
|
|
const char FB_DEBUG_TOKEN[] = "https://graph.facebook.com/me?fields=id&access_token=%1";
|
|
|
|
const int localPort = 8888;
|
|
|
|
#define QENUM_NAME(o,e,v) (o::staticMetaObject.enumerator(o::staticMetaObject.indexOfEnumerator(#e)).valueToKey((v)))
|
|
#define GRANTFLOW_STR(v) QString(QENUM_NAME(O2, GrantFlow, v))
|
|
|
|
FBDemo::FBDemo(QObject *parent) :
|
|
QObject(parent) {
|
|
o2Facebook_ = new O2Facebook(this);
|
|
|
|
o2Facebook_->setClientId(FB_APP_KEY);
|
|
o2Facebook_->setClientSecret(FB_APP_SECRET);
|
|
o2Facebook_->setLocalPort(localPort);
|
|
o2Facebook_->setRequestUrl(FB_REQUEST_URL); // Use the desktop login UI
|
|
|
|
// Create a store object for writing the received tokens
|
|
O0SettingsStore *store = new O0SettingsStore(O2_ENCRYPTION_KEY);
|
|
store->setGroupKey("facebook");
|
|
o2Facebook_->setStore(store);
|
|
|
|
connect(o2Facebook_, SIGNAL(linkedChanged()), this, SLOT(onLinkedChanged()));
|
|
connect(o2Facebook_, SIGNAL(linkingFailed()), this, SIGNAL(linkingFailed()));
|
|
connect(o2Facebook_, SIGNAL(linkingSucceeded()), this, SLOT(onLinkingSucceeded()));
|
|
connect(o2Facebook_, SIGNAL(openBrowser(QUrl)), this, SLOT(onOpenBrowser(QUrl)));
|
|
connect(o2Facebook_, SIGNAL(closeBrowser()), this, SLOT(onCloseBrowser()));
|
|
}
|
|
|
|
void FBDemo::doOAuth(O2::GrantFlow grantFlowType) {
|
|
qDebug() << "Starting OAuth 2 with grant flow type" << GRANTFLOW_STR(grantFlowType) << "...";
|
|
o2Facebook_->setGrantFlow(grantFlowType);
|
|
o2Facebook_->unlink();
|
|
o2Facebook_->link();
|
|
}
|
|
|
|
void FBDemo::validateToken() {
|
|
if (!o2Facebook_->linked()) {
|
|
qWarning() << "ERROR: Application is not linked!";
|
|
emit linkingFailed();
|
|
return;
|
|
}
|
|
|
|
QString accessToken = o2Facebook_->token();
|
|
QString debugUrlStr = QString(FB_DEBUG_TOKEN).arg(accessToken);
|
|
QNetworkRequest request = QNetworkRequest(QUrl(debugUrlStr));
|
|
QNetworkAccessManager *mgr = new QNetworkAccessManager(this);
|
|
QNetworkReply *reply = mgr->get(request);
|
|
connect(reply, SIGNAL(finished()), this, SLOT(onFinished()));
|
|
qDebug() << "Validating user token. Please wait...";
|
|
}
|
|
|
|
void FBDemo::onOpenBrowser(const QUrl &url) {
|
|
QDesktopServices::openUrl(url);
|
|
}
|
|
|
|
void FBDemo::onCloseBrowser() {
|
|
}
|
|
|
|
void FBDemo::onLinkedChanged() {
|
|
qDebug() << "Link changed!";
|
|
}
|
|
|
|
void FBDemo::onLinkingSucceeded() {
|
|
O2Facebook *o1t = qobject_cast<O2Facebook *>(sender());
|
|
if (!o1t->linked()) {
|
|
return;
|
|
}
|
|
QVariantMap extraTokens = o1t->extraTokens();
|
|
if (!extraTokens.isEmpty()) {
|
|
emit extraTokensReady(extraTokens);
|
|
qDebug() << "Extra tokens in response:";
|
|
foreach (QString key, extraTokens.keys()) {
|
|
qDebug() << "\t" << key << ":" << (extraTokens.value(key).toString().left(3) + "...");
|
|
}
|
|
}
|
|
emit linkingSucceeded();
|
|
}
|
|
|
|
void FBDemo::onFinished() {
|
|
QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
|
|
if (!reply) {
|
|
qWarning() << "NULL reply!";
|
|
emit linkingFailed();
|
|
return;
|
|
}
|
|
|
|
reply->deleteLater();
|
|
if (reply->error() != QNetworkReply::NoError) {
|
|
qWarning() << "Reply error:" << reply->error();
|
|
qWarning() << "Reason:" << reply->errorString();
|
|
emit linkingFailed();
|
|
return;
|
|
}
|
|
|
|
QByteArray replyData = reply->readAll();
|
|
bool valid = !replyData.contains("error");
|
|
if (valid) {
|
|
qDebug() << "Token is valid";
|
|
emit linkingSucceeded();
|
|
} else {
|
|
qDebug() << "Token is invalid";
|
|
emit linkingFailed();
|
|
}
|
|
}
|