diff --git a/launcher/minecraft/auth/flows/AuthContext.cpp b/launcher/minecraft/auth/flows/AuthContext.cpp index ecd7e310..ed8acd40 100644 --- a/launcher/minecraft/auth/flows/AuthContext.cpp +++ b/launcher/minecraft/auth/flows/AuthContext.cpp @@ -156,9 +156,7 @@ void AuthContext::doUserAuth() { QNetworkRequest request = QNetworkRequest(QUrl("https://user.auth.xboxlive.com/user/authenticate")); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); request.setRawHeader("Accept", "application/json"); - auto *requestor = new Katabasis::Requestor(mgr, m_oauth2, this); - requestor->setAddAccessTokenInQuery(false); - + auto *requestor = new Requestor(mgr, m_oauth2, this); connect(requestor, &Requestor::finished, this, &AuthContext::onUserAuthDone); requestor->post(request, xbox_auth_data.toUtf8()); qDebug() << "First layer of XBox auth ... commencing."; @@ -338,8 +336,6 @@ void AuthContext::doSTSAuthMinecraft() { request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); request.setRawHeader("Accept", "application/json"); Requestor *requestor = new Requestor(mgr, m_oauth2, this); - requestor->setAddAccessTokenInQuery(false); - connect(requestor, &Requestor::finished, this, &AuthContext::onSTSAuthMinecraftDone); requestor->post(request, xbox_auth_data.toUtf8()); qDebug() << "Getting Minecraft services STS token..."; @@ -394,8 +390,6 @@ void AuthContext::doSTSAuthGeneric() { request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); request.setRawHeader("Accept", "application/json"); Requestor *requestor = new Requestor(mgr, m_oauth2, this); - requestor->setAddAccessTokenInQuery(false); - connect(requestor, &Requestor::finished, this, &AuthContext::onSTSAuthGenericDone); requestor->post(request, xbox_auth_data.toUtf8()); qDebug() << "Getting generic STS token..."; @@ -444,8 +438,6 @@ void AuthContext::doMinecraftAuth() { request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); request.setRawHeader("Accept", "application/json"); Requestor *requestor = new Requestor(mgr, m_oauth2, this); - requestor->setAddAccessTokenInQuery(false); - connect(requestor, &Requestor::finished, this, &AuthContext::onMinecraftAuthDone); requestor->post(request, data.toUtf8()); qDebug() << "Getting Minecraft access token..."; @@ -538,8 +530,6 @@ void AuthContext::doXBoxProfile() { request.setRawHeader("x-xbl-contract-version", "3"); request.setRawHeader("Authorization", QString("XBL3.0 x=%1;%2").arg(m_data->userToken.extra["uhs"].toString(), m_data->xboxApiToken.token).toUtf8()); Requestor *requestor = new Requestor(mgr, m_oauth2, this); - requestor->setAddAccessTokenInQuery(false); - connect(requestor, &Requestor::finished, this, &AuthContext::onXBoxProfileDone); requestor->get(request); qDebug() << "Getting Xbox profile..."; @@ -675,8 +665,6 @@ void AuthContext::doMinecraftProfile() { request.setRawHeader("Authorization", QString("Bearer %1").arg(m_data->yggdrasilToken.token).toUtf8()); Requestor *requestor = new Requestor(mgr, m_oauth2, this); - requestor->setAddAccessTokenInQuery(false); - connect(requestor, &Requestor::finished, this, &AuthContext::onMinecraftProfileDone); requestor->get(request); } @@ -710,7 +698,6 @@ void AuthContext::doGetSkin() { auto url = QUrl(m_data->minecraftProfile.skin.url); QNetworkRequest request = QNetworkRequest(url); Requestor *requestor = new Requestor(mgr, m_oauth2, this); - requestor->setAddAccessTokenInQuery(false); connect(requestor, &Requestor::finished, this, &AuthContext::onSkinDone); requestor->get(request); } diff --git a/launcher/pages/global/AccountListPage.cpp b/launcher/pages/global/AccountListPage.cpp index 286bbeec..d71b942e 100644 --- a/launcher/pages/global/AccountListPage.cpp +++ b/launcher/pages/global/AccountListPage.cpp @@ -73,7 +73,7 @@ AccountListPage::AccountListPage(QWidget *parent) // Xbox authentication won't work without a client identifier, so disable the button // if the build didn't specify one (GH-4012) if (BuildConfig.MSA_CLIENT_ID.isEmpty()) { - ui->actionAddMicrosoft->setEnabled(false); + ui->actionAddMicrosoft->setVisible(false); } } diff --git a/libraries/katabasis/include/katabasis/Requestor.h b/libraries/katabasis/include/katabasis/Requestor.h index 4bc0256a..de8016cb 100644 --- a/libraries/katabasis/include/katabasis/Requestor.h +++ b/libraries/katabasis/include/katabasis/Requestor.h @@ -20,47 +20,11 @@ class Requestor: public QObject { public: explicit Requestor(QNetworkAccessManager *manager, OAuth2 *authenticator, QObject *parent = 0); ~Requestor(); - - - /// Some services require the access token to be sent as a Authentication HTTP header - /// and refuse requests with the access token in the query. - /// This function allows to use or ignore the access token in the query. - /// The default value of `true` means that the query will contain the access token. - /// By setting the value to false, the query will not contain the access token. - /// See: - /// https://tools.ietf.org/html/draft-ietf-oauth-v2-bearer-16#section-4.3 - /// https://tools.ietf.org/html/rfc6750#section-2.3 - - void setAddAccessTokenInQuery(bool value); - - /// Some services require the access token to be sent as a Authentication HTTP header. - /// This is the case for Twitch and Mixer. - /// When the access token expires and is refreshed, O2Requestor::retry() needs to update the Authentication HTTP header. - /// In order to do so, O2Requestor needs to know the format of the Authentication HTTP header. - void setAccessTokenInAuthenticationHTTPHeaderFormat(const QString &value); public slots: - /// Make a GET request. - /// @return Request ID or -1 if there are too many requests in the queue. int get(const QNetworkRequest &req, int timeout = 60*1000); - - /// Make a POST request. - /// @return Request ID or -1 if there are too many requests in the queue. int post(const QNetworkRequest &req, const QByteArray &data, int timeout = 60*1000); - int post(const QNetworkRequest &req, QHttpMultiPart* data, int timeout = 60*1000); - /// Make a PUT request. - /// @return Request ID or -1 if there are too many requests in the queue. - int put(const QNetworkRequest &req, const QByteArray &data, int timeout = 60*1000); - int put(const QNetworkRequest &req, QHttpMultiPart* data, int timeout = 60*1000); - - /// Make a HEAD request. - /// @return Request ID or -1 if there are too many requests in the queue. - int head(const QNetworkRequest &req, int timeout = 60*1000); - - /// Make a custom request. - /// @return Request ID or -1 if there are too many requests in the queue. - int customRequest(const QNetworkRequest &req, const QByteArray &verb, const QByteArray &data, int timeout = 60*1000); signals: @@ -103,7 +67,6 @@ protected: OAuth2 *authenticator_; QNetworkRequest request_; QByteArray data_; - QHttpMultiPart* multipartData_; QNetworkReply *reply_; Status status_; int id_; @@ -111,9 +74,6 @@ protected: QUrl url_; ReplyList timedReplies_; QNetworkReply::NetworkError error_; - bool addAccessTokenInQuery_; - QString accessTokenInAuthenticationHTTPHeaderFormat_; - bool rawData_; }; } diff --git a/libraries/katabasis/src/Requestor.cpp b/libraries/katabasis/src/Requestor.cpp index 917f2c07..53d77925 100644 --- a/libraries/katabasis/src/Requestor.cpp +++ b/libraries/katabasis/src/Requestor.cpp @@ -11,35 +11,27 @@ namespace Katabasis { -Requestor::Requestor(QNetworkAccessManager *manager, OAuth2 *authenticator, QObject *parent): QObject(parent), reply_(NULL), status_(Idle), addAccessTokenInQuery_(true), rawData_(false) { +Requestor::Requestor(QNetworkAccessManager *manager, OAuth2 *authenticator, QObject *parent): QObject(parent), reply_(NULL), status_(Idle) { manager_ = manager; authenticator_ = authenticator; if (authenticator) { timedReplies_.setIgnoreSslErrors(authenticator->ignoreSslErrors()); } qRegisterMetaType("QNetworkReply::NetworkError"); - connect(authenticator, &OAuth2::refreshFinished, this, &Requestor::onRefreshFinished, Qt::QueuedConnection); + connect(authenticator, &OAuth2::refreshFinished, this, &Requestor::onRefreshFinished); } Requestor::~Requestor() { } -void Requestor::setAddAccessTokenInQuery(bool value) { - addAccessTokenInQuery_ = value; -} - -void Requestor::setAccessTokenInAuthenticationHTTPHeaderFormat(const QString &value) { - accessTokenInAuthenticationHTTPHeaderFormat_ = value; -} - int Requestor::get(const QNetworkRequest &req, int timeout/* = 60*1000*/) { if (-1 == setup(req, QNetworkAccessManager::GetOperation)) { return -1; } reply_ = manager_->get(request_); timedReplies_.add(new Reply(reply_, timeout)); - connect(reply_, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onRequestError(QNetworkReply::NetworkError)), Qt::QueuedConnection); - connect(reply_, SIGNAL(finished()), this, SLOT(onRequestFinished()), Qt::QueuedConnection); + connect(reply_, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onRequestError(QNetworkReply::NetworkError))); + connect(reply_, SIGNAL(finished()), this, SLOT(onRequestFinished())); connect(reply_, &QNetworkReply::sslErrors, this, &Requestor::onSslErrors); return id_; } @@ -48,99 +40,16 @@ int Requestor::post(const QNetworkRequest &req, const QByteArray &data, int time if (-1 == setup(req, QNetworkAccessManager::PostOperation)) { return -1; } - rawData_ = true; data_ = data; reply_ = manager_->post(request_, data_); timedReplies_.add(new Reply(reply_, timeout)); - connect(reply_, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onRequestError(QNetworkReply::NetworkError)), Qt::QueuedConnection); - connect(reply_, SIGNAL(finished()), this, SLOT(onRequestFinished()), Qt::QueuedConnection); + connect(reply_, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onRequestError(QNetworkReply::NetworkError))); + connect(reply_, SIGNAL(finished()), this, SLOT(onRequestFinished())); connect(reply_, &QNetworkReply::sslErrors, this, &Requestor::onSslErrors); connect(reply_, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(onUploadProgress(qint64,qint64))); return id_; } -int Requestor::post(const QNetworkRequest & req, QHttpMultiPart* data, int timeout/* = 60*1000*/) -{ - if (-1 == setup(req, QNetworkAccessManager::PostOperation)) { - return -1; - } - rawData_ = false; - multipartData_ = data; - reply_ = manager_->post(request_, multipartData_); - multipartData_->setParent(reply_); - timedReplies_.add(new Reply(reply_, timeout)); - connect(reply_, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onRequestError(QNetworkReply::NetworkError)), Qt::QueuedConnection); - connect(reply_, SIGNAL(finished()), this, SLOT(onRequestFinished()), Qt::QueuedConnection); - connect(reply_, &QNetworkReply::sslErrors, this, &Requestor::onSslErrors); - connect(reply_, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(onUploadProgress(qint64,qint64))); - return id_; -} - -int Requestor::put(const QNetworkRequest &req, const QByteArray &data, int timeout/* = 60*1000*/) { - if (-1 == setup(req, QNetworkAccessManager::PutOperation)) { - return -1; - } - rawData_ = true; - data_ = data; - reply_ = manager_->put(request_, data_); - timedReplies_.add(new Reply(reply_, timeout)); - connect(reply_, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onRequestError(QNetworkReply::NetworkError)), Qt::QueuedConnection); - connect(reply_, SIGNAL(finished()), this, SLOT(onRequestFinished()), Qt::QueuedConnection); - connect(reply_, &QNetworkReply::sslErrors, this, &Requestor::onSslErrors); - connect(reply_, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(onUploadProgress(qint64,qint64))); - return id_; -} - -int Requestor::put(const QNetworkRequest & req, QHttpMultiPart* data, int timeout/* = 60*1000*/) -{ - if (-1 == setup(req, QNetworkAccessManager::PutOperation)) { - return -1; - } - rawData_ = false; - multipartData_ = data; - reply_ = manager_->put(request_, multipartData_); - multipartData_->setParent(reply_); - timedReplies_.add(new Reply(reply_, timeout)); - connect(reply_, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onRequestError(QNetworkReply::NetworkError)), Qt::QueuedConnection); - connect(reply_, SIGNAL(finished()), this, SLOT(onRequestFinished()), Qt::QueuedConnection); - connect(reply_, &QNetworkReply::sslErrors, this, &Requestor::onSslErrors); - connect(reply_, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(onUploadProgress(qint64,qint64))); - return id_; -} - -int Requestor::customRequest(const QNetworkRequest &req, const QByteArray &verb, const QByteArray &data, int timeout/* = 60*1000*/) -{ - (void)timeout; - - if (-1 == setup(req, QNetworkAccessManager::CustomOperation, verb)) { - return -1; - } - data_ = data; - QBuffer * buffer = new QBuffer; - buffer->setData(data_); - reply_ = manager_->sendCustomRequest(request_, verb, buffer); - buffer->setParent(reply_); - timedReplies_.add(new Reply(reply_)); - connect(reply_, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onRequestError(QNetworkReply::NetworkError)), Qt::QueuedConnection); - connect(reply_, SIGNAL(finished()), this, SLOT(onRequestFinished()), Qt::QueuedConnection); - connect(reply_, &QNetworkReply::sslErrors, this, &Requestor::onSslErrors); - connect(reply_, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(onUploadProgress(qint64,qint64))); - return id_; -} - -int Requestor::head(const QNetworkRequest &req, int timeout/* = 60*1000*/) -{ - if (-1 == setup(req, QNetworkAccessManager::HeadOperation)) { - return -1; - } - reply_ = manager_->head(request_); - timedReplies_.add(new Reply(reply_, timeout)); - connect(reply_, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onRequestError(QNetworkReply::NetworkError)), Qt::QueuedConnection); - connect(reply_, SIGNAL(finished()), this, SLOT(onRequestFinished()), Qt::QueuedConnection); - connect(reply_, &QNetworkReply::sslErrors, this, &Requestor::onSslErrors); - return id_; -} - void Requestor::onRefreshFinished(QNetworkReply::NetworkError error) { if (status_ != Requesting) { qWarning() << "O2Requestor::onRefreshFinished: No pending request"; @@ -227,19 +136,8 @@ int Requestor::setup(const QNetworkRequest &req, QNetworkAccessManager::Operatio url_ = req.url(); QUrl url = url_; - if (addAccessTokenInQuery_) { - QUrlQuery query(url); - query.addQueryItem(OAUTH2_ACCESS_TOKEN, authenticator_->token()); - url.setQuery(query); - } - request_.setUrl(url); - // If the service require the access token to be sent as a Authentication HTTP header, we add the access token. - if (!accessTokenInAuthenticationHTTPHeaderFormat_.isEmpty()) { - request_.setRawHeader(HTTP_AUTHORIZATION_HEADER, accessTokenInAuthenticationHTTPHeaderFormat_.arg(authenticator_->token()).toLatin1()); - } - if (!verb.isEmpty()) { request_.setRawHeader(HTTP_HTTP_HEADER, verb); } @@ -273,40 +171,15 @@ void Requestor::retry() { reply_->disconnect(this); reply_->deleteLater(); QUrl url = url_; - if (addAccessTokenInQuery_) { - QUrlQuery query(url); - query.addQueryItem(OAUTH2_ACCESS_TOKEN, authenticator_->token()); - url.setQuery(query); - } request_.setUrl(url); - // If the service require the access token to be sent as a Authentication HTTP header, - // we update the access token when retrying. - if(!accessTokenInAuthenticationHTTPHeaderFormat_.isEmpty()) { - request_.setRawHeader(HTTP_AUTHORIZATION_HEADER, accessTokenInAuthenticationHTTPHeaderFormat_.arg(authenticator_->token()).toLatin1()); - } - status_ = ReRequesting; switch (operation_) { case QNetworkAccessManager::GetOperation: reply_ = manager_->get(request_); break; case QNetworkAccessManager::PostOperation: - reply_ = rawData_ ? manager_->post(request_, data_) : manager_->post(request_, multipartData_); - break; - case QNetworkAccessManager::CustomOperation: - { - QBuffer * buffer = new QBuffer; - buffer->setData(data_); - reply_ = manager_->sendCustomRequest(request_, request_.rawHeader(HTTP_HTTP_HEADER), buffer); - buffer->setParent(reply_); - } - break; - case QNetworkAccessManager::PutOperation: - reply_ = rawData_ ? manager_->post(request_, data_) : manager_->put(request_, multipartData_); - break; - case QNetworkAccessManager::HeadOperation: - reply_ = manager_->head(request_); + reply_ = manager_->post(request_, data_); break; default: assert(!"Unspecified operation for request");