summaryrefslogtreecommitdiffstats
path: root/src/oauth/qoauth1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/oauth/qoauth1.cpp')
-rw-r--r--src/oauth/qoauth1.cpp95
1 files changed, 80 insertions, 15 deletions
diff --git a/src/oauth/qoauth1.cpp b/src/oauth/qoauth1.cpp
index 9713a30..efc7712 100644
--- a/src/oauth/qoauth1.cpp
+++ b/src/oauth/qoauth1.cpp
@@ -243,12 +243,29 @@ QByteArray QOAuth1Private::generateSignature(const QVariantMap &parameters,
const QUrl &url,
QNetworkAccessManager::Operation operation) const
{
- const QOAuth1Signature signature(url,
- clientIdentifierSharedKey,
- tokenSecret,
- static_cast<QOAuth1Signature::HttpRequestMethod>(operation),
- parameters);
+ QOAuth1Signature signature(url,
+ clientIdentifierSharedKey,
+ tokenSecret,
+ static_cast<QOAuth1Signature::HttpRequestMethod>(operation),
+ parameters);
+ return formatSignature(signature);
+}
+
+QByteArray QOAuth1Private::generateSignature(const QVariantMap &parameters,
+ const QUrl &url,
+ const QByteArray &verb) const
+{
+ QOAuth1Signature signature(url,
+ clientIdentifierSharedKey,
+ tokenSecret,
+ QOAuth1Signature::HttpRequestMethod::Custom,
+ parameters);
+ signature.setCustomMethodString(verb);
+ return formatSignature(signature);
+}
+QByteArray QOAuth1Private::formatSignature(const QOAuth1Signature &signature) const
+{
switch (signatureMethod) {
case QOAuth1::SignatureMethod::Hmac_Sha1:
return signature.hmacSha1().toBase64();
@@ -260,6 +277,38 @@ QByteArray QOAuth1Private::generateSignature(const QVariantMap &parameters,
}
}
+QVariantMap QOAuth1Private::createOAuthBaseParams() const
+{
+ QVariantMap oauthParams;
+
+ const auto currentDateTime = QDateTime::currentDateTimeUtc();
+
+ oauthParams.insert(Key::oauthConsumerKey, clientIdentifier);
+ oauthParams.insert(Key::oauthVersion, QStringLiteral("1.0"));
+ oauthParams.insert(Key::oauthToken, token);
+ oauthParams.insert(Key::oauthSignatureMethod, signatureMethodString());
+ oauthParams.insert(Key::oauthNonce, QOAuth1::nonce());
+ oauthParams.insert(Key::oauthTimestamp, QString::number(currentDateTime.toTime_t()));
+
+ return oauthParams;
+}
+
+void QOAuth1Private::prepareRequestImpl(QNetworkRequest *request,
+ const QByteArray &verb,
+ const QByteArray &body)
+{
+ Q_Q(QOAuth1);
+ QVariantMap signingParams;
+ if (verb == "POST" &&
+ request->header(QNetworkRequest::ContentTypeHeader).toByteArray()
+ == "application/x-www-form-urlencoded") {
+ QUrlQuery query(QString::fromUtf8(body));
+ for (const auto &item : query.queryItems(QUrl::FullyDecoded))
+ signingParams.insert(item.first, item.second);
+ }
+ q->setup(request, signingParams, verb);
+}
+
void QOAuth1Private::_q_onTokenRequestError(QNetworkReply::NetworkError error)
{
Q_Q(QOAuth1);
@@ -701,6 +750,8 @@ QNetworkReply *QOAuth1::requestTokenCredentials(QNetworkAccessManager::Operation
/*!
Signs the \a request using \a signingParameters and \a operation.
+
+ \overload
*/
void QOAuth1::setup(QNetworkRequest *request,
const QVariantMap &signingParameters,
@@ -708,16 +759,7 @@ void QOAuth1::setup(QNetworkRequest *request,
{
Q_D(const QOAuth1);
- QVariantMap oauthParams;
-
- const auto currentDateTime = QDateTime::currentDateTimeUtc();
-
- oauthParams.insert(Key::oauthConsumerKey, d->clientIdentifier);
- oauthParams.insert(Key::oauthVersion, QStringLiteral("1.0"));
- oauthParams.insert(Key::oauthToken, d->token);
- oauthParams.insert(Key::oauthSignatureMethod, d->signatureMethodString());
- oauthParams.insert(Key::oauthNonce, QOAuth1::nonce());
- oauthParams.insert(Key::oauthTimestamp, QString::number(currentDateTime.toTime_t()));
+ auto oauthParams = d->createOAuthBaseParams();
// Add signature parameter
{
@@ -747,6 +789,29 @@ void QOAuth1::setup(QNetworkRequest *request,
}
/*!
+ \since 5.13
+
+ Signs the \a request using \a signingParameters and \a operationVerb.
+
+ \overload
+*/
+void QOAuth1::setup(QNetworkRequest *request, const QVariantMap &signingParameters, const QByteArray &operationVerb)
+{
+ Q_D(const QOAuth1);
+
+ auto oauthParams = d->createOAuthBaseParams();
+
+ // Add signature parameter
+ {
+ const auto parameters = QVariantMap(oauthParams).unite(signingParameters);
+ const auto signature = d->generateSignature(parameters, request->url(), operationVerb);
+ oauthParams.insert(Key::oauthSignature, signature);
+ }
+
+ request->setRawHeader("Authorization", generateAuthorizationHeader(oauthParams));
+}
+
+/*!
Generates a nonce.
\b {See also}: \l {https://tools.ietf.org/html/rfc5849#section-3.3}