diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml index 3f5404b19..c6ea6a132 100644 --- a/resources/desktop/com.github.rssguard.appdata.xml +++ b/resources/desktop/com.github.rssguard.appdata.xml @@ -26,7 +26,7 @@ https://github.com/sponsors/martinrotter - + none diff --git a/src/librssguard/network-web/oauth2service.cpp b/src/librssguard/network-web/oauth2service.cpp index 24963890f..54ae163a3 100644 --- a/src/librssguard/network-web/oauth2service.cpp +++ b/src/librssguard/network-web/oauth2service.cpp @@ -56,6 +56,7 @@ OAuth2Service::OAuth2Service(const QString& auth_url, const QString& token_url, m_clientSecret = client_secret; m_clientSecretId = m_clientSecretSecret = QString(); m_scope = scope; + m_useHttpBasicAuthWithClientData = false; connect(&m_networkManager, &QNetworkAccessManager::finished, this, &OAuth2Service::tokenRequestFinished); connect(m_redirectionHandler, &OAuthHttpHandler::authGranted, [this](const QString& auth_code, const QString& id) { @@ -130,6 +131,14 @@ void OAuth2Service::timerEvent(QTimerEvent* event) { QObject::timerEvent(event); } +bool OAuth2Service::useHttpBasicAuthWithClientData() const { + return m_useHttpBasicAuthWithClientData; +} + +void OAuth2Service::setUseHttpBasicAuthWithClientData(bool use_auth) { + m_useHttpBasicAuthWithClientData = use_auth; +} + QString OAuth2Service::clientSecretSecret() const { return m_clientSecretSecret; } @@ -155,10 +164,16 @@ void OAuth2Service::setId(const QString& id) { } void OAuth2Service::retrieveAccessToken(const QString& auth_code) { - QNetworkRequest networkRequest; + QNetworkRequest network_request; - networkRequest.setUrl(m_tokenUrl); - networkRequest.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/x-www-form-urlencoded"); + network_request.setUrl(m_tokenUrl); + network_request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/x-www-form-urlencoded"); + + if (m_useHttpBasicAuthWithClientData) { + auto basic_auth = NetworkFactory::generateBasicAuthHeader(properClientId(), properClientSecret()); + + network_request.setRawHeader(basic_auth.first, basic_auth.second); + } QString content = QString("client_id=%1&" "client_secret=%2&" @@ -171,15 +186,21 @@ void OAuth2Service::retrieveAccessToken(const QString& auth_code) { m_redirectionHandler->listenAddressPort()); qDebugNN << LOGSEC_OAUTH << "Posting data for access token retrieval:" << QUOTE_W_SPACE_DOT(content); - m_networkManager.post(networkRequest, content.toUtf8()); + m_networkManager.post(network_request, content.toUtf8()); } void OAuth2Service::refreshAccessToken(const QString& refresh_token) { auto real_refresh_token = refresh_token.isEmpty() ? refreshToken() : refresh_token; - QNetworkRequest networkRequest; + QNetworkRequest network_request; - networkRequest.setUrl(m_tokenUrl); - networkRequest.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/x-www-form-urlencoded"); + network_request.setUrl(m_tokenUrl); + network_request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/x-www-form-urlencoded"); + + if (m_useHttpBasicAuthWithClientData) { + auto basic_auth = NetworkFactory::generateBasicAuthHeader(properClientId(), properClientSecret()); + + network_request.setRawHeader(basic_auth.first, basic_auth.second); + } QString content = QString("client_id=%1&" "client_secret=%2&" @@ -196,7 +217,7 @@ void OAuth2Service::refreshAccessToken(const QString& refresh_token) { { true, false, true }); qDebugNN << LOGSEC_OAUTH << "Posting data for access token refreshing:" << QUOTE_W_SPACE_DOT(content); - m_networkManager.post(networkRequest, content.toUtf8()); + m_networkManager.post(network_request, content.toUtf8()); } void OAuth2Service::tokenRequestFinished(QNetworkReply* network_reply) { @@ -380,6 +401,7 @@ void OAuth2Service::retrieveAuthCode() { "response_type=code&" "state=%4&" "prompt=consent&" + "duration=permanent&" "access_type=offline").arg(properClientId(), m_scope, m_redirectionHandler->listenAddressPort(), diff --git a/src/librssguard/network-web/oauth2service.h b/src/librssguard/network-web/oauth2service.h index 06a891fa3..5a75ef796 100644 --- a/src/librssguard/network-web/oauth2service.h +++ b/src/librssguard/network-web/oauth2service.h @@ -81,6 +81,9 @@ class OAuth2Service : public QObject { QString clientSecretSecret() const; void setClientSecretSecret(const QString& client_secret_secret); + bool useHttpBasicAuthWithClientData() const; + void setUseHttpBasicAuthWithClientData(bool use_auth); + signals: void tokensRetrieved(QString access_token, QString refresh_token, int expires_in); void tokensRetrieveError(QString error, QString error_description); @@ -129,6 +132,7 @@ class OAuth2Service : public QObject { QUrl m_tokenUrl; QString m_authUrl; QString m_scope; + bool m_useHttpBasicAuthWithClientData; SilentNetworkAccessManager m_networkManager; OAuthHttpHandler* m_redirectionHandler; std::function m_functorOnLogin;