From bfc9e1e5d598f354dd39e5c2eb51d5e51585359b Mon Sep 17 00:00:00 2001 From: Andrew Date: Thu, 28 Nov 2013 20:45:52 -0600 Subject: Verify access tokens before launching Minecraft Kind of an important thing to do... Heh... --- logic/auth/YggdrasilTask.cpp | 117 +++++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 65 deletions(-) (limited to 'logic/auth/YggdrasilTask.cpp') diff --git a/logic/auth/YggdrasilTask.cpp b/logic/auth/YggdrasilTask.cpp index 39dfb749..31c8fbab 100644 --- a/logic/auth/YggdrasilTask.cpp +++ b/logic/auth/YggdrasilTask.cpp @@ -64,78 +64,65 @@ void YggdrasilTask::processReply(QNetworkReply* reply) // Wrong reply for some reason... return; - // Check for errors. - switch (reply->error()) + if (reply->error() == QNetworkReply::OperationCanceledError) { - case QNetworkReply::NoError: - { - // Try to parse the response regardless of the response code. - // Sometimes the auth server will give more information and an error code. - QJsonParseError jsonError; - QByteArray replyData = reply->readAll(); - QJsonDocument doc = QJsonDocument::fromJson(replyData, &jsonError); + emitFailed("Yggdrasil task cancelled."); + return; + } + else + { + // Try to parse the response regardless of the response code. + // Sometimes the auth server will give more information and an error code. + QJsonParseError jsonError; + QByteArray replyData = reply->readAll(); + QJsonDocument doc = QJsonDocument::fromJson(replyData, &jsonError); - // Check the response code. - int responseCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + // Check the response code. + int responseCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - switch (responseCode) + if (responseCode == 200) + { + // If the response code was 200, then there shouldn't be an error. Make sure anyways. + // Also, sometimes an empty reply indicates success. If there was no data received, + // pass an empty json object to the processResponse function. + if (jsonError.error == QJsonParseError::NoError || replyData.size() == 0) { - case 200: + if (!processResponse(replyData.size() > 0 ? doc.object() : QJsonObject())) { - // If the response code was 200, then there shouldn't be an error. Make sure anyways. - switch (jsonError.error) - { - case QJsonParseError::NoError: - if (!processResponse(doc.object())) - { - YggdrasilTask::Error* err = getError(); - if (err) - emitFailed(err->getErrorMessage()); - else - emitFailed(tr("An unknown error occurred when processing the response from the authentication server.")); - } - else - { - emitSucceeded(); - } - break; - - default: - emitFailed(tr("Failed to parse Yggdrasil JSON response: \"%1\".").arg(jsonError.errorString())); - break; - } - break; + YggdrasilTask::Error* err = getError(); + if (err) + emitFailed(err->getErrorMessage()); + else + emitFailed(tr("An unknown error occurred when processing the response from the authentication server.")); + } + else + { + emitSucceeded(); } - - default: - // If the response code was something else, then Yggdrasil may have given us information about the error. - // If we can parse the response, then get information from it. Otherwise just say there was an unknown error. - switch (jsonError.error) - { - case QJsonParseError::NoError: - // We were able to parse the server's response. Woo! - // Call processError. If a subclass has overridden it then they'll handle their stuff there. - processError(doc.object()); - break; - - default: - // The server didn't say anything regarding the error. Give the user an unknown error. - emitFailed(tr("Login failed: Unknown HTTP code %1 encountered.").arg(responseCode)); - break; - } - break; } - - break; + else + { + emitFailed(tr("Failed to parse Yggdrasil JSON response: %1 at offset %2.").arg(jsonError.errorString()).arg(jsonError.offset)); + } + } + else + { + // If the response code was not 200, then Yggdrasil may have given us information about the error. + // If we can parse the response, then get information from it. Otherwise just say there was an unknown error. + if (jsonError.error == QJsonParseError::NoError) + { + // We were able to parse the server's response. Woo! + // Call processError. If a subclass has overridden it then they'll handle their stuff there. + QLOG_DEBUG() << "The request failed, but the server gave us an error message. Processing error."; + emitFailed(processError(doc.object())); + } + else + { + // The server didn't say anything regarding the error. Give the user an unknown error. + QLOG_DEBUG() << "The request failed and the server gave no error message. Unknown error."; + emitFailed(tr("An unknown error occurred when trying to communicate with the authentication server: %1").arg(reply->errorString())); + } } - - case QNetworkReply::OperationCanceledError: - emitFailed(tr("Login canceled.")); - break; - - default: - emitFailed(tr("An unknown error occurred when trying to communicate with the authentication server.")); - break; } } @@ -145,7 +132,7 @@ QString YggdrasilTask::processError(QJsonObject responseData) QJsonValue msgVal = responseData.value("errorMessage"); QJsonValue causeVal = responseData.value("cause"); - if (errorVal.isString() && msgVal.isString() && causeVal.isString()) + if (errorVal.isString() && msgVal.isString()) { m_error = new Error(errorVal.toString(""), msgVal.toString(""), causeVal.toString("")); return m_error->getDisplayMessage(); -- cgit v1.2.3