Merge pull request #877 from Scrumplex/refactor-offline-accounts

This commit is contained in:
Sefa Eyeoglu 2022-07-23 13:54:36 +02:00 committed by GitHub
commit c65f5f7728
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 127 additions and 20 deletions

View File

@ -117,6 +117,7 @@ set(NET_SOURCES
net/NetAction.h net/NetAction.h
net/NetJob.cpp net/NetJob.cpp
net/NetJob.h net/NetJob.h
net/NetUtils.h
net/PasteUpload.cpp net/PasteUpload.cpp
net/PasteUpload.h net/PasteUpload.h
net/Sink.h net/Sink.h

View File

@ -5,6 +5,7 @@
#include "minecraft/auth/AuthRequest.h" #include "minecraft/auth/AuthRequest.h"
#include "minecraft/auth/Parsers.h" #include "minecraft/auth/Parsers.h"
#include "minecraft/auth/AccountTask.h" #include "minecraft/auth/AccountTask.h"
#include "net/NetUtils.h"
LauncherLoginStep::LauncherLoginStep(AccountData* data) : AuthStep(data) { LauncherLoginStep::LauncherLoginStep(AccountData* data) : AuthStep(data) {
@ -58,10 +59,18 @@ void LauncherLoginStep::onRequestDone(
#ifndef NDEBUG #ifndef NDEBUG
qDebug() << data; qDebug() << data;
#endif #endif
emit finished( if (Net::isApplicationError(error)) {
AccountTaskState::STATE_FAILED_SOFT, emit finished(
tr("Failed to get Minecraft access token: %1").arg(requestor->errorString_) AccountTaskState::STATE_FAILED_SOFT,
); tr("Failed to get Minecraft access token: %1").arg(requestor->errorString_)
);
}
else {
emit finished(
AccountTaskState::STATE_OFFLINE,
tr("Failed to get Minecraft access token: %1").arg(requestor->errorString_)
);
}
return; return;
} }

View File

@ -4,6 +4,7 @@
#include "minecraft/auth/AuthRequest.h" #include "minecraft/auth/AuthRequest.h"
#include "minecraft/auth/Parsers.h" #include "minecraft/auth/Parsers.h"
#include "net/NetUtils.h"
MinecraftProfileStep::MinecraftProfileStep(AccountData* data) : AuthStep(data) { MinecraftProfileStep::MinecraftProfileStep(AccountData* data) : AuthStep(data) {
@ -64,10 +65,18 @@ void MinecraftProfileStep::onRequestDone(
qWarning() << " Response:"; qWarning() << " Response:";
qWarning() << QString::fromUtf8(data); qWarning() << QString::fromUtf8(data);
emit finished( if (Net::isApplicationError(error)) {
AccountTaskState::STATE_FAILED_SOFT, emit finished(
tr("Minecraft Java profile acquisition failed.") AccountTaskState::STATE_FAILED_SOFT,
); tr("Minecraft Java profile acquisition failed: %1").arg(requestor->errorString_)
);
}
else {
emit finished(
AccountTaskState::STATE_OFFLINE,
tr("Minecraft Java profile acquisition failed: %1").arg(requestor->errorString_)
);
}
return; return;
} }
if(!Parsers::parseMinecraftProfile(data, m_data->minecraftProfile)) { if(!Parsers::parseMinecraftProfile(data, m_data->minecraftProfile)) {

View File

@ -4,6 +4,7 @@
#include "minecraft/auth/AuthRequest.h" #include "minecraft/auth/AuthRequest.h"
#include "minecraft/auth/Parsers.h" #include "minecraft/auth/Parsers.h"
#include "net/NetUtils.h"
MinecraftProfileStepMojang::MinecraftProfileStepMojang(AccountData* data) : AuthStep(data) { MinecraftProfileStepMojang::MinecraftProfileStepMojang(AccountData* data) : AuthStep(data) {
@ -67,10 +68,18 @@ void MinecraftProfileStepMojang::onRequestDone(
qWarning() << " Response:"; qWarning() << " Response:";
qWarning() << QString::fromUtf8(data); qWarning() << QString::fromUtf8(data);
emit finished( if (Net::isApplicationError(error)) {
AccountTaskState::STATE_FAILED_SOFT, emit finished(
tr("Minecraft Java profile acquisition failed.") AccountTaskState::STATE_FAILED_SOFT,
); tr("Minecraft Java profile acquisition failed: %1").arg(requestor->errorString_)
);
}
else {
emit finished(
AccountTaskState::STATE_OFFLINE,
tr("Minecraft Java profile acquisition failed: %1").arg(requestor->errorString_)
);
}
return; return;
} }
if(!Parsers::parseMinecraftProfileMojang(data, m_data->minecraftProfile)) { if(!Parsers::parseMinecraftProfileMojang(data, m_data->minecraftProfile)) {

View File

@ -6,6 +6,7 @@
#include "minecraft/auth/AuthRequest.h" #include "minecraft/auth/AuthRequest.h"
#include "minecraft/auth/Parsers.h" #include "minecraft/auth/Parsers.h"
#include "net/NetUtils.h"
XboxAuthorizationStep::XboxAuthorizationStep(AccountData* data, Katabasis::Token *token, QString relyingParty, QString authorizationKind): XboxAuthorizationStep::XboxAuthorizationStep(AccountData* data, Katabasis::Token *token, QString relyingParty, QString authorizationKind):
AuthStep(data), AuthStep(data),
@ -62,10 +63,24 @@ void XboxAuthorizationStep::onRequestDone(
#endif #endif
if (error != QNetworkReply::NoError) { if (error != QNetworkReply::NoError) {
qWarning() << "Reply error:" << error; qWarning() << "Reply error:" << error;
if(!processSTSError(error, data, headers)) { if (Net::isApplicationError(error)) {
if(!processSTSError(error, data, headers)) {
emit finished(
AccountTaskState::STATE_FAILED_SOFT,
tr("Failed to get authorization for %1 services. Error %2.").arg(m_authorizationKind, error)
);
}
else {
emit finished(
AccountTaskState::STATE_FAILED_SOFT,
tr("Unknown STS error for %1 services: %2").arg(m_authorizationKind, requestor->errorString_)
);
}
}
else {
emit finished( emit finished(
AccountTaskState::STATE_FAILED_SOFT, AccountTaskState::STATE_OFFLINE,
tr("Failed to get authorization for %1 services. Error %2.").arg(m_authorizationKind, error) tr("Failed to get authorization for %1 services: %2").arg(m_authorizationKind, requestor->errorString_)
); );
} }
return; return;

View File

@ -6,6 +6,7 @@
#include "minecraft/auth/AuthRequest.h" #include "minecraft/auth/AuthRequest.h"
#include "minecraft/auth/Parsers.h" #include "minecraft/auth/Parsers.h"
#include "net/NetUtils.h"
XboxProfileStep::XboxProfileStep(AccountData* data) : AuthStep(data) { XboxProfileStep::XboxProfileStep(AccountData* data) : AuthStep(data) {
@ -58,10 +59,18 @@ void XboxProfileStep::onRequestDone(
#ifndef NDEBUG #ifndef NDEBUG
qDebug() << data; qDebug() << data;
#endif #endif
finished( if (Net::isApplicationError(error)) {
AccountTaskState::STATE_FAILED_SOFT, emit finished(
tr("Failed to retrieve the Xbox profile.") AccountTaskState::STATE_FAILED_SOFT,
); tr("Failed to retrieve the Xbox profile: %1").arg(requestor->errorString_)
);
}
else {
emit finished(
AccountTaskState::STATE_OFFLINE,
tr("Failed to retrieve the Xbox profile: %1").arg(requestor->errorString_)
);
}
return; return;
} }

View File

@ -4,6 +4,7 @@
#include "minecraft/auth/AuthRequest.h" #include "minecraft/auth/AuthRequest.h"
#include "minecraft/auth/Parsers.h" #include "minecraft/auth/Parsers.h"
#include "net/NetUtils.h"
XboxUserStep::XboxUserStep(AccountData* data) : AuthStep(data) { XboxUserStep::XboxUserStep(AccountData* data) : AuthStep(data) {
@ -53,7 +54,17 @@ void XboxUserStep::onRequestDone(
if (error != QNetworkReply::NoError) { if (error != QNetworkReply::NoError) {
qWarning() << "Reply error:" << error; qWarning() << "Reply error:" << error;
emit finished(AccountTaskState::STATE_FAILED_SOFT, tr("XBox user authentication failed.")); if (Net::isApplicationError(error)) {
emit finished(AccountTaskState::STATE_FAILED_SOFT,
tr("XBox user authentication failed: %1").arg(requestor->errorString_)
);
}
else {
emit finished(
AccountTaskState::STATE_OFFLINE,
tr("XBox user authentication failed: %1").arg(requestor->errorString_)
);
}
return; return;
} }

44
launcher/net/NetUtils.h Normal file
View File

@ -0,0 +1,44 @@
// SPDX-License-Identifier: GPL-3.0-only
/*
* PolyMC - Minecraft Launcher
* Copyright (c) 2022 Sefa Eyeoglu <contact@scrumplex.net>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
#include <QNetworkReply>
#include <QSet>
namespace Net {
inline bool isApplicationError(QNetworkReply::NetworkError x) {
// Mainly taken from https://github.com/qt/qtbase/blob/dev/src/network/access/qhttpthreaddelegate.cpp
static QSet<QNetworkReply::NetworkError> errors = {
QNetworkReply::ProtocolInvalidOperationError,
QNetworkReply::AuthenticationRequiredError,
QNetworkReply::ContentAccessDenied,
QNetworkReply::ContentNotFoundError,
QNetworkReply::ContentOperationNotPermittedError,
QNetworkReply::ProxyAuthenticationRequiredError,
QNetworkReply::ContentConflictError,
QNetworkReply::ContentGoneError,
QNetworkReply::InternalServerError,
QNetworkReply::OperationNotImplementedError,
QNetworkReply::ServiceUnavailableError,
QNetworkReply::UnknownServerError,
QNetworkReply::UnknownContentError
};
return errors.contains(x);
}
} // namespace Net