diff options
Diffstat (limited to 'src/oauth/qoauth1.cpp')
-rw-r--r-- | src/oauth/qoauth1.cpp | 95 |
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 ¶meters, 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 ¶meters, + 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 ¶meters, } } +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} |