From d522ad6ac4178897123df076c7a969724b378531 Mon Sep 17 00:00:00 2001 From: max Date: Mon, 1 Nov 2021 20:30:25 +0300 Subject: [PATCH] Fix account saves, start fixing local --- launcher/AuthServer.cpp | 35 ++++++++++++++++++- launcher/Launcher.cpp | 12 +++---- launcher/minecraft/auth/AccountData.cpp | 9 +++-- launcher/minecraft/auth/AuthProviders.cpp | 4 ++- launcher/minecraft/auth/AuthProviders.h | 3 +- launcher/minecraft/auth/MinecraftAccount.cpp | 1 + .../auth/providers/BaseAuthProvider.h | 16 +++++---- .../auth/providers/DummyAuthProvider.h | 12 ++++++- 8 files changed, 71 insertions(+), 21 deletions(-) diff --git a/launcher/AuthServer.cpp b/launcher/AuthServer.cpp index d225617c..0cbf642f 100644 --- a/launcher/AuthServer.cpp +++ b/launcher/AuthServer.cpp @@ -1,7 +1,10 @@ #include "AuthServer.h" +#include #include #include +#include +#include AuthServer::AuthServer(QObject *parent) : QObject(parent) { @@ -48,8 +51,37 @@ void AuthServer::newConnection() { responseStatusCode = 204; } + else if (requestPath == "/auth/authenticate") + { + QString body = rawRequest.mid(rawRequest.indexOf("\r\n\r\n") + 4); + auto doc = QJsonDocument::fromJson(body.toUtf8()); + auto json = doc.object(); + QString clientToken = json.value("clientToken").toString(); + QString username = json.value("username").toString(); + + QString profile = ((QString)"{\"id\":\"%1\",\"name\":\"%2\"}").arg(clientToken, username); + + responseStatusCode = 200; + responseBody = ((QString)"{\"accessToken\":\"%1\",\"clientToken\":\"%2\",\"availableProfiles\":[%3], \"selectedProfile\": %3}").arg(username, clientToken, profile); + } + else if (requestPath == "/auth/refresh") + { + qDebug() << "Request process222"; + QString body = rawRequest.mid(rawRequest.indexOf("\r\n\r\n") + 4); + auto doc = QJsonDocument::fromJson(body.toUtf8()); + auto json = doc.object(); + QString clientToken = json.value("clientToken").toString(); + QString username = json.value("accessToken").toString(); + + + QString profile = ((QString) "{\"id\":\"%1\",\"name\":\"%2\"}").arg(clientToken, username); + + responseStatusCode = 200; + responseBody = ((QString) "{\"accessToken\":\"%1\",\"clientToken\":\"%2\",\"availableProfiles\":[%3], \"selectedProfile\": %3}").arg(username, clientToken, profile); + } else { + qDebug() << "Request failed" << requestPath; responseBody = "Not found"; responseStatusCode = 404; } @@ -66,7 +98,8 @@ void AuthServer::newConnection() { responseHeaders << ((QString) "Content-Length: %1").arg(responseBody.length()); } - + qDebug() << responseBody; + tcpSocket->write(((QString) "HTTP/1.1 %1 %2\r\nConnection: keep-alive\r\n").arg(responseStatusCode).arg(responseStatusText).toUtf8()); tcpSocket->write(responseHeaders.join("\r\n").toUtf8()); tcpSocket->write("\r\n\r\n"); diff --git a/launcher/Launcher.cpp b/launcher/Launcher.cpp index d3cc811f..2a2b38b7 100644 --- a/launcher/Launcher.cpp +++ b/launcher/Launcher.cpp @@ -791,9 +791,14 @@ Launcher::Launcher(int &argc, char **argv) : QApplication(argc, argv) qDebug() << "<> Instances loaded."; } + { + m_authserver.reset(new AuthServer(this)); + qDebug() << "<> Auth server started."; + } + // load auth providers { - AuthProviders::load(); + AuthProviders::load(m_authserver); } // and accounts @@ -838,11 +843,6 @@ Launcher::Launcher(int &argc, char **argv) : QApplication(argc, argv) m_mcedit.reset(new MCEditTool(m_settings)); } - { - m_authserver.reset(new AuthServer(this)); - qDebug() << "<> Auth server started."; - } - connect(this, &Launcher::aboutToQuit, [this](){ if(m_instances) { diff --git a/launcher/minecraft/auth/AccountData.cpp b/launcher/minecraft/auth/AccountData.cpp index 5c6de9df..0f56d524 100644 --- a/launcher/minecraft/auth/AccountData.cpp +++ b/launcher/minecraft/auth/AccountData.cpp @@ -1,4 +1,5 @@ #include "AccountData.h" +#include "AuthProviders.h" #include #include #include @@ -283,11 +284,9 @@ bool AccountData::resumeStateFromV3(QJsonObject data) { auto typeS = typeV.toString(); if(typeS == "MSA") { type = AccountType::MSA; - } else if (typeS == "Mojang") { - type = AccountType::Mojang; } else { - qWarning() << "Failed to parse account data: type is not recognized."; - return false; + type = AccountType::Mojang; + provider = AuthProviders::lookup(typeS); } if(type == AccountType::Mojang) { @@ -313,7 +312,7 @@ bool AccountData::resumeStateFromV3(QJsonObject data) { QJsonObject AccountData::saveState() const { QJsonObject output; if(type == AccountType::Mojang) { - output["type"] = "Mojang"; + output["type"] = provider->id(); if(legacy) { output["legacy"] = true; } diff --git a/launcher/minecraft/auth/AuthProviders.cpp b/launcher/minecraft/auth/AuthProviders.cpp index ee1432a9..8753dfd2 100644 --- a/launcher/minecraft/auth/AuthProviders.cpp +++ b/launcher/minecraft/auth/AuthProviders.cpp @@ -2,18 +2,20 @@ #include "providers/ElybyAuthProvider.h" #include "providers/DummyAuthProvider.h" #include "providers/MojangAuthProvider.h" +#include "../../AuthServer.h" #define REGISTER_AUTH_PROVIDER(Provider) \ { \ AuthProviderPtr provider(new Provider()); \ m_providers.insert(provider->id(), provider); \ + provider->setAuthServer(authserver); \ } namespace AuthProviders { QMap m_providers; - void load() + void load(std::shared_ptr authserver) { REGISTER_AUTH_PROVIDER(ElybyAuthProvider); REGISTER_AUTH_PROVIDER(DummyAuthProvider); diff --git a/launcher/minecraft/auth/AuthProviders.h b/launcher/minecraft/auth/AuthProviders.h index c51c0591..a81c20a3 100644 --- a/launcher/minecraft/auth/AuthProviders.h +++ b/launcher/minecraft/auth/AuthProviders.h @@ -8,6 +8,7 @@ #include #include "providers/BaseAuthProvider.h" +#include "../../AuthServer.h" /*! * \brief Namespace for auth providers. @@ -15,7 +16,7 @@ */ namespace AuthProviders { - void load(); + void load(std::shared_ptr authServer); AuthProviderPtr lookup(QString id); QList getAll(); } diff --git a/launcher/minecraft/auth/MinecraftAccount.cpp b/launcher/minecraft/auth/MinecraftAccount.cpp index 2d76f9ac..9f883402 100644 --- a/launcher/minecraft/auth/MinecraftAccount.cpp +++ b/launcher/minecraft/auth/MinecraftAccount.cpp @@ -197,6 +197,7 @@ std::shared_ptr MinecraftAccount::refresh(AuthSessionPtr session) { m_currentTask.reset(new MSASilent(&data)); } else { + qDebug() << "Account dfdf"; m_currentTask.reset(new MojangRefresh(&data)); } m_currentTask->assignSession(session); diff --git a/launcher/minecraft/auth/providers/BaseAuthProvider.h b/launcher/minecraft/auth/providers/BaseAuthProvider.h index 393402a9..7ac0b02c 100644 --- a/launcher/minecraft/auth/providers/BaseAuthProvider.h +++ b/launcher/minecraft/auth/providers/BaseAuthProvider.h @@ -6,6 +6,7 @@ #include #include #include +#include "../../../AuthServer.h" class BaseAuthProvider; typedef std::shared_ptr AuthProviderPtr; @@ -37,12 +38,6 @@ public: return "Base"; }; - // Use dummy auth on login instead of calling endpoint - virtual bool dummyAuth() - { - return false; - }; - // Endpoint for authlib injector (use empty if authlib injector isn't required) virtual QString injectorEndpoint() { @@ -72,4 +67,13 @@ public: { return false; } + + bool setAuthServer(std::shared_ptr authServer) + { + m_authServer = authServer; + return true; + } + +protected: + std::shared_ptr m_authServer; }; diff --git a/launcher/minecraft/auth/providers/DummyAuthProvider.h b/launcher/minecraft/auth/providers/DummyAuthProvider.h index 32e8e034..0f09db05 100644 --- a/launcher/minecraft/auth/providers/DummyAuthProvider.h +++ b/launcher/minecraft/auth/providers/DummyAuthProvider.h @@ -31,6 +31,16 @@ public: QString injectorEndpoint() { - return "http://localhost:%1"; + return ((QString)"http://localhost:%1").arg(m_authServer->port()); }; + + QString authEndpoint() + { + return ((QString) "http://localhost:%1/auth/").arg(m_authServer->port()); + }; + + virtual bool useYggdrasil() + { + return true; + } };