File indexing completed on 2024-04-28 04:55:38

0001 /*
0002     This file is part of Choqok, the KDE micro-blogging client
0003 
0004     SPDX-FileCopyrightText: 2017 Andrea Scarpino <scarpino@kde.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0007 */
0008 
0009 #include "twitterapioauth.h"
0010 
0011 #include <QEventLoop>
0012 #include <QNetworkReply>
0013 #include <QOAuth1Signature>
0014 
0015 #include <KIO/AccessManager>
0016 
0017 #include "twitterapiaccount.h"
0018 #include "twitterapidebug.h"
0019 #include "twitterapioauthreplyhandler.h"
0020 
0021 TwitterApiOAuth::TwitterApiOAuth(TwitterApiAccount *account)
0022     : QOAuth1(account), m_replyHandler(nullptr), m_networkAccessManager(nullptr)
0023 {
0024     qCDebug(CHOQOK);
0025 
0026     m_replyHandler = new TwitterApiOAuthReplyHandler(this);
0027     setReplyHandler(m_replyHandler);
0028 
0029     m_networkAccessManager = new KIO::AccessManager(this);
0030     setNetworkAccessManager(m_networkAccessManager);
0031 
0032     setClientIdentifier(QLatin1String(account->oauthConsumerKey()));
0033     setClientSharedSecret(QLatin1String(account->oauthConsumerSecret()));
0034 
0035     setSignatureMethod(SignatureMethod::Hmac_Sha1);
0036 
0037     setTemporaryCredentialsUrl(QUrl(account->host() + QLatin1String("/oauth/request_token")));
0038     setAuthorizationUrl(QUrl(account->host() + QLatin1String("/oauth/authorize")));
0039     setTokenCredentialsUrl(QUrl(account->host() + QLatin1String("/oauth/access_token")));
0040 }
0041 
0042 TwitterApiOAuth::~TwitterApiOAuth()
0043 {
0044     m_replyHandler->deleteLater();
0045     m_networkAccessManager->deleteLater();
0046 }
0047 
0048 QByteArray TwitterApiOAuth::authorizationHeader(const QUrl &requestUrl, QNetworkAccessManager::Operation operation,
0049                                               const QVariantMap &signingParameters)
0050 {
0051     QVariantMap oauthParams;
0052 
0053     const auto currentDateTime = QDateTime::currentDateTimeUtc();
0054 
0055     oauthParams.insert(QStringLiteral("oauth_consumer_key"), clientIdentifier());
0056     oauthParams.insert(QStringLiteral("oauth_version"), QStringLiteral("1.0"));
0057     oauthParams.insert(QStringLiteral("oauth_token"), token());
0058     oauthParams.insert(QStringLiteral("oauth_signature_method"), QStringLiteral("HMAC-SHA1"));
0059     oauthParams.insert(QStringLiteral("oauth_nonce"), QOAuth1::nonce());
0060     oauthParams.insert(QStringLiteral("oauth_timestamp"), QString::number(currentDateTime.toTime_t()));
0061 
0062     // Add signature parameter
0063     {
0064         const auto parameters = QVariantMap(oauthParams).unite(signingParameters);
0065 
0066         const QOAuth1Signature signature(requestUrl, clientSharedSecret(), tokenSecret(),
0067                                          static_cast<QOAuth1Signature::HttpRequestMethod>(operation),
0068                                          parameters);
0069 
0070         oauthParams.insert(QStringLiteral("oauth_signature"), signature.hmacSha1().toBase64());
0071     }
0072 
0073     return generateAuthorizationHeader(oauthParams);
0074 }
0075 
0076 #include "moc_twitterapioauth.cpp"