diff --git a/QtOAuth/private/qabstractoauth_p.h b/QtOAuth/private/qabstractoauth_p.h index b3ce8cd09941be0ad7a0f6585a096f2666e0b83a..233f3887d06375971c161e00d5604109595dd44f 100644 --- a/QtOAuth/private/qabstractoauth_p.h +++ b/QtOAuth/private/qabstractoauth_p.h @@ -77,15 +77,16 @@ public: QAbstractOAuthPrivate(QNetworkAccessManager *manager); ~QAbstractOAuthPrivate(); + QNetworkAccessManager *networkAccessManager(); void setStatus(QAbstractOAuth::Status status); QUrl authorizationUrl; QVariantMap extraTokens; - QAbstractOAuth::Status status; + QAbstractOAuth::Status status = QAbstractOAuth::Status::NotAuthenticated; QNetworkAccessManager::Operation operation; QScopedPointer replyHandler; QScopedPointer defaultReplyHandler; - QNetworkAccessManager *networkAccessManager; + QPointer networkAccessManagerPointer; QAbstractOAuth::ModifyParametersFunction modifyParametersFunction; static QUrlQuery createQuery(const QVariantMap ¶meters); diff --git a/QtOAuth/qabstractoauth.cpp b/QtOAuth/qabstractoauth.cpp index 6701bd62dddd7790053750ccdd07fc94c601bed8..4b0226dd4ab1cdd1ef70aff003072e058964f5da 100644 --- a/QtOAuth/qabstractoauth.cpp +++ b/QtOAuth/qabstractoauth.cpp @@ -58,10 +58,9 @@ QT_BEGIN_NAMESPACE Q_DECLARE_METATYPE(QAbstractOAuth::Error) QAbstractOAuthPrivate::QAbstractOAuthPrivate(QNetworkAccessManager *manager) - : status(QAbstractOAuth::Status::NotAuthenticated), - replyHandler(nullptr), + : replyHandler(nullptr), defaultReplyHandler(new QOAuthOobReplyHandler), - networkAccessManager(manager) + networkAccessManagerPointer(manager) { Q_ASSERT(manager); } @@ -69,6 +68,14 @@ QAbstractOAuthPrivate::QAbstractOAuthPrivate(QNetworkAccessManager *manager) QAbstractOAuthPrivate::~QAbstractOAuthPrivate() {} +QNetworkAccessManager *QAbstractOAuthPrivate::networkAccessManager() +{ + Q_Q(QAbstractOAuth); + if (!networkAccessManagerPointer) + networkAccessManagerPointer = new QNetworkAccessManager(q); + return networkAccessManagerPointer.data(); +} + void QAbstractOAuthPrivate::setStatus(QAbstractOAuth::Status newStatus) { Q_Q(QAbstractOAuth); @@ -104,6 +111,22 @@ QAbstractOAuth::QAbstractOAuth(QAbstractOAuthPrivate &dd, QObject *parent) QAbstractOAuth::~QAbstractOAuth() {} +QNetworkAccessManager *QAbstractOAuth::networkAccessManager() const +{ + Q_D(const QAbstractOAuth); + return d->networkAccessManagerPointer.data(); +} + +void QAbstractOAuth::setNetworkAccessManager(QNetworkAccessManager *networkAccessManager) +{ + Q_D(QAbstractOAuth); + if (networkAccessManager != d->networkAccessManagerPointer) { + if (d->networkAccessManagerPointer && d->networkAccessManagerPointer->parent() == this) + delete d->networkAccessManagerPointer.data(); + d->networkAccessManagerPointer = networkAccessManager; + } +} + QAbstractOAuth::Status QAbstractOAuth::status() const { Q_D(const QAbstractOAuth); diff --git a/QtOAuth/qabstractoauth.h b/QtOAuth/qabstractoauth.h index 82f69c65a5bbbf55d7304c048eea42a95c56b690..0a3e829ebaa1f4eadc9e31031951436e479b3617 100644 --- a/QtOAuth/qabstractoauth.h +++ b/QtOAuth/qabstractoauth.h @@ -106,6 +106,9 @@ public: virtual ~QAbstractOAuth(); + QNetworkAccessManager *networkAccessManager() const; + void setNetworkAccessManager(QNetworkAccessManager *networkAccessManager); + Status status() const; // Resource Owner Authorization: https://tools.ietf.org/html/rfc5849#section-2.2 diff --git a/QtOAuth/qabstractoauth2.cpp b/QtOAuth/qabstractoauth2.cpp index b5ec14cbe1813249537c00b40758d66e1c300177..bf0a132f792cbc94ad022c0db3792ab4c2bc0ad8 100644 --- a/QtOAuth/qabstractoauth2.cpp +++ b/QtOAuth/qabstractoauth2.cpp @@ -125,7 +125,7 @@ QNetworkReply *QAbstractOAuth2::get(const QNetworkRequest &req, const QVariantMa const QString bearer = d->bearerFormat.arg(d->token.key); request.setRawHeader("Authorization", bearer.toUtf8()); - return d->networkAccessManager->get(request); + return d->networkAccessManager()->get(request); } QNetworkReply *QAbstractOAuth2::post(const QNetworkRequest &req, const QVariantMap ¶meters) @@ -146,7 +146,7 @@ QNetworkReply *QAbstractOAuth2::post(const QNetworkRequest &req, const QVariantM const QString bearer = d->bearerFormat.arg(d->token.key); request.setRawHeader("Authorization", bearer.toUtf8()); - return d->networkAccessManager->post(request, QByteArray()); + return d->networkAccessManager()->post(request, QByteArray()); } QString QAbstractOAuth2::scope() const diff --git a/QtOAuth/qoauth1.cpp b/QtOAuth/qoauth1.cpp index 5a33805a2ad525dfd0c283e8debb6daaad2f3f9a..cfec0d7365961b85bd4e94aff0da77055e88792b 100644 --- a/QtOAuth/qoauth1.cpp +++ b/QtOAuth/qoauth1.cpp @@ -74,10 +74,10 @@ const QString String::oauthVersion = QStringLiteral("oauth_version"); static auto networkReplyErrorFunctionPointer = static_cast(&QNetworkReply::error); -QOAuth1Private::QOAuth1Private(QNetworkAccessManager *manager) - : QAbstractOAuthPrivate(manager) +QOAuth1Private::QOAuth1Private(QNetworkAccessManager *networkAccessManager) + : QAbstractOAuthPrivate(networkAccessManager) { - Q_ASSERT(manager); + Q_ASSERT(networkAccessManager); qRegisterMetaType("QOAuth1::Credential"); qRegisterMetaType("QNetworkReply::NetworkError"); } @@ -196,7 +196,7 @@ QNetworkReply *QOAuth1Private::requestToken(QNetworkAccessManager::Operation ope Q_Q(QOAuth1); typedef OAuth1KeyString Key; - Q_ASSERT(networkAccessManager); + Q_ASSERT(networkAccessManager()); Q_ASSERT(operation == QNetworkAccessManager::GetOperation || operation == QNetworkAccessManager::PostOperation); @@ -222,14 +222,14 @@ QNetworkReply *QOAuth1Private::requestToken(QNetworkAccessManager::Operation ope url.setQuery(QOAuth1Private::createQuery(parameters)); request.setUrl(url); } - reply = networkAccessManager->get(request); + reply = networkAccessManager()->get(request); } else if (operation == QNetworkAccessManager::PostOperation) { QUrlQuery query = QOAuth1Private::createQuery(parameters); const QByteArray data = query.toString(QUrl::PrettyDecoded).toUtf8(); request.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/x-www-form-urlencoded")); - reply = networkAccessManager->post(request, data); + reply = networkAccessManager()->post(request, data); } connect(reply, networkReplyErrorFunctionPointer, this, &QOAuth1Private::_q_onTokenRequestError); @@ -390,13 +390,13 @@ QNetworkReply *QOAuth1::get(const QNetworkRequest &req, const QVariantMap ¶m allParameters.unite(parameters); setup(&request, parameters, QNetworkAccessManager::GetOperation); - return d->networkAccessManager->get(request); + return d->networkAccessManager()->get(request); } QNetworkReply *QOAuth1::post(const QNetworkRequest &req, const QVariantMap ¶meters) { Q_D(QOAuth1); - if (!d->networkAccessManager) { + if (!d->networkAccessManager()) { qCritical("QNetworkAccessManager not available"); return nullptr; } @@ -410,7 +410,7 @@ QNetworkReply *QOAuth1::post(const QNetworkRequest &req, const QVariantMap ¶ for (auto it = parameters.begin(), end = parameters.end(); it != end; ++it) query.addQueryItem(it.key(), it.value().toString()); QString data = query.toString(QUrl::FullyEncoded); - return d->networkAccessManager->post(request, data.toUtf8()); + return d->networkAccessManager()->post(request, data.toUtf8()); } QNetworkReply *QOAuth1::requestTemporaryCredentials(QNetworkAccessManager::Operation operation, @@ -418,7 +418,7 @@ QNetworkReply *QOAuth1::requestTemporaryCredentials(QNetworkAccessManager::Opera const QVariantMap ¶meters) { Q_D(QOAuth1); - if (Q_UNLIKELY(!d->networkAccessManager)) { + if (Q_UNLIKELY(!d->networkAccessManager())) { qCritical("QNetworkAccessManager not available"); return nullptr; } @@ -441,7 +441,7 @@ QNetworkReply *QOAuth1::requestTokenCredentials(QNetworkAccessManager::Operation const QVariantMap ¶meters) { Q_D(QOAuth1); - if (!d->networkAccessManager) { + if (!d->networkAccessManager()) { qCritical("QNetworkAccessManager not available"); return nullptr; } diff --git a/QtOAuth/qoauth2authorizationcodeflow.cpp b/QtOAuth/qoauth2authorizationcodeflow.cpp index 6699dd99e3bb3d68200a0f1b60915e704ff0354d..33e9eca19130520fd88b0dd9ef1a79f454b28c9d 100644 --- a/QtOAuth/qoauth2authorizationcodeflow.cpp +++ b/QtOAuth/qoauth2authorizationcodeflow.cpp @@ -160,8 +160,6 @@ QOAuth2AuthorizationCodeFlow::QOAuth2AuthorizationCodeFlow(QNetworkAccessManager QObject *parent) : QAbstractOAuth2(*new QOAuth2AuthorizationCodeFlowPrivate(manager, port), parent) { - Q_D(QOAuth2AuthorizationCodeFlow); - d->networkAccessManager = manager; } QOAuth2AuthorizationCodeFlow::QOAuth2AuthorizationCodeFlow(const QString &consumerKey, @@ -171,7 +169,6 @@ QOAuth2AuthorizationCodeFlow::QOAuth2AuthorizationCodeFlow(const QString &consum : QAbstractOAuth2(*new QOAuth2AuthorizationCodeFlowPrivate(manager, port), parent) { Q_D(QOAuth2AuthorizationCodeFlow); - d->networkAccessManager = manager; d->consumer = consumerKey; } @@ -196,7 +193,6 @@ QOAuth2AuthorizationCodeFlow::QOAuth2AuthorizationCodeFlow(const QString &consum : QAbstractOAuth2(*new QOAuth2AuthorizationCodeFlowPrivate(manager, port), parent) { Q_D(QOAuth2AuthorizationCodeFlow); - d->networkAccessManager = manager; d->authorizationUrl = authenticateUrl; d->accessTokenUrl = accessTokenUrl; d->consumer = consumerKey; @@ -289,10 +285,11 @@ void QOAuth2AuthorizationCodeFlow::requestAccessToken(const QString &code) QStringLiteral("application/x-www-form-urlencoded")); const auto data = query.toString(QUrl::FullyEncoded); - d->accessTokenReply = d->networkAccessManager->post(request, data.toUtf8()); - QObjectPrivate::connect(d->networkAccessManager, &QNetworkAccessManager::finished, + d->accessTokenReply = d->networkAccessManager()->post(request, data.toUtf8()); + QObjectPrivate::connect(d->networkAccessManager(), &QNetworkAccessManager::finished, d, &QOAuth2AuthorizationCodeFlowPrivate::accessTokenRequestFinished); - QObjectPrivate::connect(d->networkAccessManager, &QNetworkAccessManager::authenticationRequired, + QObjectPrivate::connect(d->networkAccessManager(), + &QNetworkAccessManager::authenticationRequired, d, &QOAuth2AuthorizationCodeFlowPrivate::authenticate, Qt::UniqueConnection); } diff --git a/QtOAuth/qoauth2implicitgrantflow.cpp b/QtOAuth/qoauth2implicitgrantflow.cpp index c91eafb9782b1ac1b8f1f1509b644c32d1c435ed..3f607b496d07c78bb3dec92f8d35864e8d8c1084 100644 --- a/QtOAuth/qoauth2implicitgrantflow.cpp +++ b/QtOAuth/qoauth2implicitgrantflow.cpp @@ -63,8 +63,6 @@ QOAuth2ImplicitGrantFlow::QOAuth2ImplicitGrantFlow(QNetworkAccessManager *manage QObject *parent) : QAbstractOAuth2(*new QOAuth2ImplicitGrantFlowPrivate(manager), parent) { - Q_D(QOAuth2ImplicitGrantFlow); - d->networkAccessManager = manager; } QOAuth2ImplicitGrantFlow::QOAuth2ImplicitGrantFlow(const QString &consumerToken, @@ -73,7 +71,6 @@ QOAuth2ImplicitGrantFlow::QOAuth2ImplicitGrantFlow(const QString &consumerToken, : QAbstractOAuth2(*new QOAuth2ImplicitGrantFlowPrivate(manager), parent) { Q_D(QOAuth2ImplicitGrantFlow); - d->networkAccessManager = manager; d->consumer = consumerToken; }