Fix account saves, start fixing local

This commit is contained in:
max
2021-11-01 20:30:25 +03:00
parent 44c64a20c2
commit d522ad6ac4
8 changed files with 71 additions and 21 deletions

View File

@@ -1,7 +1,10 @@
#include "AuthServer.h" #include "AuthServer.h"
#include <QThread>
#include <QDebug> #include <QDebug>
#include <QTcpSocket> #include <QTcpSocket>
#include <QJsonDocument>
#include <QJsonObject>
AuthServer::AuthServer(QObject *parent) : QObject(parent) AuthServer::AuthServer(QObject *parent) : QObject(parent)
{ {
@@ -48,8 +51,37 @@ void AuthServer::newConnection()
{ {
responseStatusCode = 204; 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 else
{ {
qDebug() << "Request failed" << requestPath;
responseBody = "Not found"; responseBody = "Not found";
responseStatusCode = 404; responseStatusCode = 404;
} }
@@ -66,7 +98,8 @@ void AuthServer::newConnection()
{ {
responseHeaders << ((QString) "Content-Length: %1").arg(responseBody.length()); 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(((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(responseHeaders.join("\r\n").toUtf8());
tcpSocket->write("\r\n\r\n"); tcpSocket->write("\r\n\r\n");

View File

@@ -791,9 +791,14 @@ Launcher::Launcher(int &argc, char **argv) : QApplication(argc, argv)
qDebug() << "<> Instances loaded."; qDebug() << "<> Instances loaded.";
} }
{
m_authserver.reset(new AuthServer(this));
qDebug() << "<> Auth server started.";
}
// load auth providers // load auth providers
{ {
AuthProviders::load(); AuthProviders::load(m_authserver);
} }
// and accounts // and accounts
@@ -838,11 +843,6 @@ Launcher::Launcher(int &argc, char **argv) : QApplication(argc, argv)
m_mcedit.reset(new MCEditTool(m_settings)); m_mcedit.reset(new MCEditTool(m_settings));
} }
{
m_authserver.reset(new AuthServer(this));
qDebug() << "<> Auth server started.";
}
connect(this, &Launcher::aboutToQuit, [this](){ connect(this, &Launcher::aboutToQuit, [this](){
if(m_instances) if(m_instances)
{ {

View File

@@ -1,4 +1,5 @@
#include "AccountData.h" #include "AccountData.h"
#include "AuthProviders.h"
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QJsonArray> #include <QJsonArray>
@@ -283,11 +284,9 @@ bool AccountData::resumeStateFromV3(QJsonObject data) {
auto typeS = typeV.toString(); auto typeS = typeV.toString();
if(typeS == "MSA") { if(typeS == "MSA") {
type = AccountType::MSA; type = AccountType::MSA;
} else if (typeS == "Mojang") {
type = AccountType::Mojang;
} else { } else {
qWarning() << "Failed to parse account data: type is not recognized."; type = AccountType::Mojang;
return false; provider = AuthProviders::lookup(typeS);
} }
if(type == AccountType::Mojang) { if(type == AccountType::Mojang) {
@@ -313,7 +312,7 @@ bool AccountData::resumeStateFromV3(QJsonObject data) {
QJsonObject AccountData::saveState() const { QJsonObject AccountData::saveState() const {
QJsonObject output; QJsonObject output;
if(type == AccountType::Mojang) { if(type == AccountType::Mojang) {
output["type"] = "Mojang"; output["type"] = provider->id();
if(legacy) { if(legacy) {
output["legacy"] = true; output["legacy"] = true;
} }

View File

@@ -2,18 +2,20 @@
#include "providers/ElybyAuthProvider.h" #include "providers/ElybyAuthProvider.h"
#include "providers/DummyAuthProvider.h" #include "providers/DummyAuthProvider.h"
#include "providers/MojangAuthProvider.h" #include "providers/MojangAuthProvider.h"
#include "../../AuthServer.h"
#define REGISTER_AUTH_PROVIDER(Provider) \ #define REGISTER_AUTH_PROVIDER(Provider) \
{ \ { \
AuthProviderPtr provider(new Provider()); \ AuthProviderPtr provider(new Provider()); \
m_providers.insert(provider->id(), provider); \ m_providers.insert(provider->id(), provider); \
provider->setAuthServer(authserver); \
} }
namespace AuthProviders namespace AuthProviders
{ {
QMap<QString, AuthProviderPtr> m_providers; QMap<QString, AuthProviderPtr> m_providers;
void load() void load(std::shared_ptr<AuthServer> authserver)
{ {
REGISTER_AUTH_PROVIDER(ElybyAuthProvider); REGISTER_AUTH_PROVIDER(ElybyAuthProvider);
REGISTER_AUTH_PROVIDER(DummyAuthProvider); REGISTER_AUTH_PROVIDER(DummyAuthProvider);

View File

@@ -8,6 +8,7 @@
#include <QMap> #include <QMap>
#include "providers/BaseAuthProvider.h" #include "providers/BaseAuthProvider.h"
#include "../../AuthServer.h"
/*! /*!
* \brief Namespace for auth providers. * \brief Namespace for auth providers.
@@ -15,7 +16,7 @@
*/ */
namespace AuthProviders namespace AuthProviders
{ {
void load(); void load(std::shared_ptr<AuthServer> authServer);
AuthProviderPtr lookup(QString id); AuthProviderPtr lookup(QString id);
QList<AuthProviderPtr> getAll(); QList<AuthProviderPtr> getAll();
} }

View File

@@ -197,6 +197,7 @@ std::shared_ptr<AccountTask> MinecraftAccount::refresh(AuthSessionPtr session) {
m_currentTask.reset(new MSASilent(&data)); m_currentTask.reset(new MSASilent(&data));
} }
else { else {
qDebug() << "Account dfdf";
m_currentTask.reset(new MojangRefresh(&data)); m_currentTask.reset(new MojangRefresh(&data));
} }
m_currentTask->assignSession(session); m_currentTask->assignSession(session);

View File

@@ -6,6 +6,7 @@
#include <QSet> #include <QSet>
#include <QProcess> #include <QProcess>
#include <QUrl> #include <QUrl>
#include "../../../AuthServer.h"
class BaseAuthProvider; class BaseAuthProvider;
typedef std::shared_ptr<BaseAuthProvider> AuthProviderPtr; typedef std::shared_ptr<BaseAuthProvider> AuthProviderPtr;
@@ -37,12 +38,6 @@ public:
return "Base"; 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) // Endpoint for authlib injector (use empty if authlib injector isn't required)
virtual QString injectorEndpoint() virtual QString injectorEndpoint()
{ {
@@ -72,4 +67,13 @@ public:
{ {
return false; return false;
} }
bool setAuthServer(std::shared_ptr<AuthServer> authServer)
{
m_authServer = authServer;
return true;
}
protected:
std::shared_ptr<AuthServer> m_authServer;
}; };

View File

@@ -31,6 +31,16 @@ public:
QString injectorEndpoint() 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;
}
}; };