forked from pipacs/o2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patho2skydrive.cpp
125 lines (112 loc) · 4.4 KB
/
o2skydrive.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <QDebug>
#include <QDateTime>
#include <QMap>
#include <QString>
#include <QStringList>
#if QT_VERSION >= 0x050000
#include <QUrlQuery>
#endif
#include "o2skydrive.h"
#include "o0globals.h"
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() {
qDebug() << "O2Skydrive::link";
if (linked()) {
qDebug() << "O2kydrive::link: Linked already";
return;
}
setLinked(false);
setToken("");
setTokenSecret("");
setExtraTokens(QVariantMap());
setRefreshToken(QString());
setExpires(0);
redirectUri_ = QString("https://login.live.com/oauth20_desktop.srf");
// Assemble intial authentication URL
QList<QPair<QString, QString> > parameters;
parameters.append(qMakePair(QString(O2_OAUTH2_RESPONSE_TYPE), (grantFlow_ == GrantFlowAuthorizationCode) ? QString(O2_OAUTH2_GRANT_TYPE_CODE) : QString(O2_OAUTH2_GRANT_TYPE_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
Q_EMIT openBrowser(url);
}
void O2Skydrive::redirected(const QUrl &url) {
qDebug() << "O2Skydrive::redirected" << url;
Q_EMIT closeBrowser();
if (grantFlow_ == GrantFlowAuthorizationCode) {
// Get access code
QString urlCode;
#if QT_VERSION < 0x050000
urlCode = url.queryItemValue(O2_OAUTH2_GRANT_TYPE_CODE);
#else
QUrlQuery query(url);
urlCode = query.queryItemValue(O2_OAUTH2_GRANT_TYPE_CODE);
#endif
if (urlCode.isEmpty()) {
qDebug() << "O2Skydrive::redirected: Code not received";
Q_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<QString, QString> parameters;
parameters.insert(O2_OAUTH2_GRANT_TYPE_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);
qDebug() << "O2Skydrive::redirected: Got" << 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()) {
Q_EMIT linkingFailed();
} else {
setLinked(true);
Q_EMIT linkingSucceeded();
}
}
}