diff options
-rw-r--r-- | CMakeLists.txt | 4 | ||||
-rw-r--r-- | MultiMC.cpp | 10 | ||||
-rw-r--r-- | gui/dialogs/AccountListDialog.h | 2 | ||||
-rw-r--r-- | gui/dialogs/AccountSelectDialog.h | 2 | ||||
-rw-r--r-- | logic/OneSixInstance.cpp | 2 | ||||
-rw-r--r-- | logic/OneSixVersion.cpp | 2 | ||||
-rw-r--r-- | logic/auth/MojangAccount.cpp | 32 | ||||
-rw-r--r-- | logic/auth/MojangAccount.h | 6 | ||||
-rw-r--r-- | logic/auth/MojangAccountList.cpp (renamed from logic/lists/MojangAccountList.cpp) | 4 | ||||
-rw-r--r-- | logic/auth/MojangAccountList.h (renamed from logic/lists/MojangAccountList.h) | 0 | ||||
-rw-r--r-- | logic/auth/flows/AuthenticateTask.cpp | 12 | ||||
-rw-r--r-- | logic/auth/flows/RefreshTask.cpp | 1 |
12 files changed, 58 insertions, 19 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index c92b3f07..8d590754 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -305,6 +305,8 @@ logic/net/PasteUpload.h logic/net/PasteUpload.cpp # Yggdrasil login stuff +logic/auth/MojangAccountList.h +logic/auth/MojangAccountList.cpp logic/auth/MojangAccount.h logic/auth/MojangAccount.cpp logic/auth/YggdrasilTask.h @@ -367,8 +369,6 @@ logic/lists/ForgeVersionList.h logic/lists/ForgeVersionList.cpp logic/lists/JavaVersionList.h logic/lists/JavaVersionList.cpp -logic/lists/MojangAccountList.h -logic/lists/MojangAccountList.cpp # misc model/view logic/EnabledItemFilter.h diff --git a/MultiMC.cpp b/MultiMC.cpp index 6c88a6be..2c9e74dd 100644 --- a/MultiMC.cpp +++ b/MultiMC.cpp @@ -12,7 +12,7 @@ #include "gui/MainWindow.h" #include "gui/dialogs/VersionSelectDialog.h" #include "logic/lists/InstanceList.h" -#include "logic/lists/MojangAccountList.h" +#include "logic/auth/MojangAccountList.h" #include "logic/lists/IconList.h" #include "logic/lists/LwjglVersionList.h" #include "logic/lists/MinecraftVersionList.h" @@ -78,11 +78,13 @@ MultiMC::MultiMC(int &argc, char **argv) : QApplication(argc, argv), parser.addShortOpt("quietupdate", 'U'); parser.addDocumentation("quietupdate", "doesn't restart MultiMC after installing updates"); + // WARNING: disabled until further notice + /* // --launch parser.addOption("launch"); parser.addShortOpt("launch", 'l'); parser.addDocumentation("launch", "tries to launch the given instance", "<inst>"); - +*/ // parse the arguments try { @@ -212,6 +214,8 @@ MultiMC::MultiMC(int &argc, char **argv) : QApplication(argc, argv), m_qnam.reset(new QNetworkAccessManager(this)); // launch instance, if that's what should be done + // WARNING: disabled until further notice + /* if (!args["launch"].isNull()) { if (InstanceLauncher(args["launch"].toString()).launch()) @@ -220,7 +224,7 @@ MultiMC::MultiMC(int &argc, char **argv) : QApplication(argc, argv), m_status = MultiMC::Failed; return; } - +*/ m_status = MultiMC::Initialized; } diff --git a/gui/dialogs/AccountListDialog.h b/gui/dialogs/AccountListDialog.h index 84ff8e0e..fe0c8773 100644 --- a/gui/dialogs/AccountListDialog.h +++ b/gui/dialogs/AccountListDialog.h @@ -19,7 +19,7 @@ #include <memory> -#include "logic/lists/MojangAccountList.h" +#include "logic/auth/MojangAccountList.h" namespace Ui { diff --git a/gui/dialogs/AccountSelectDialog.h b/gui/dialogs/AccountSelectDialog.h index a539e7e9..6007253d 100644 --- a/gui/dialogs/AccountSelectDialog.h +++ b/gui/dialogs/AccountSelectDialog.h @@ -19,7 +19,7 @@ #include <memory> -#include "logic/lists/MojangAccountList.h" +#include "logic/auth/MojangAccountList.h" namespace Ui { diff --git a/logic/OneSixInstance.cpp b/logic/OneSixInstance.cpp index b8d85ff5..337830a2 100644 --- a/logic/OneSixInstance.cpp +++ b/logic/OneSixInstance.cpp @@ -154,7 +154,7 @@ QStringList OneSixInstance::processMinecraftArgs(MojangAccountPtr account) token_mapping["game_assets"] = reconstructAssets(d->version).absolutePath(); //TODO: this is something new and not even fully implemented in the vanilla launcher. token_mapping["user_properties"] = "{ }"; - + token_mapping["user_type"] = account->currentProfile()->legacy ? "legacy" : "mojang"; // 1.7.3+ assets tokens token_mapping["assets_root"] = absAssetsDir; token_mapping["assets_index_name"] = version->assets; diff --git a/logic/OneSixVersion.cpp b/logic/OneSixVersion.cpp index e586402b..8ae685f0 100644 --- a/logic/OneSixVersion.cpp +++ b/logic/OneSixVersion.cpp @@ -165,7 +165,7 @@ std::shared_ptr<OneSixVersion> OneSixVersion::fromJson(QJsonObject root) root.value("minimumLauncherVersion").toDouble(); // ADD MORE HERE :D - if (launcher_ver > 0 && launcher_ver <= 12) + if (launcher_ver > 0 && launcher_ver <= 13) return fromJsonV4(root, readVersion); else { diff --git a/logic/auth/MojangAccount.cpp b/logic/auth/MojangAccount.cpp index b1acfb25..185c735c 100644 --- a/logic/auth/MojangAccount.cpp +++ b/logic/auth/MojangAccount.cpp @@ -23,6 +23,7 @@ #include <QJsonObject> #include <QJsonArray> #include <QRegExp> +#include <QStringList> #include <logger/QsLog.h> @@ -52,15 +53,30 @@ MojangAccountPtr MojangAccount::loadFromJson(const QJsonObject &object) QJsonObject profileObject = profileVal.toObject(); QString id = profileObject.value("id").toString(""); QString name = profileObject.value("name").toString(""); + bool legacy = profileObject.value("legacy").toBool(false); if (id.isEmpty() || name.isEmpty()) { QLOG_WARN() << "Unable to load a profile because it was missing an ID or a name."; continue; } - profiles.append({id, name}); + profiles.append({id, name, legacy}); } MojangAccountPtr account(new MojangAccount()); + if(object.value("user").isObject()) + { + User u; + QJsonObject userStructure = object.value("user").toObject(); + u.id = userStructure.value("id").toString(); + QJsonObject propMap = userStructure.value("properties").toObject(); + for(auto key: propMap.keys()) + { + auto values = propMap.operator[](key).toArray(); + for(auto value: values) + u.properties.insert(key, value.toString()); + } + account->m_user = u; + } account->m_username = username; account->m_clientToken = clientToken; account->m_accessToken = accessToken; @@ -95,10 +111,24 @@ QJsonObject MojangAccount::saveToJson() const QJsonObject profileObj; profileObj.insert("id", profile.id); profileObj.insert("name", profile.name); + profileObj.insert("legacy", profile.legacy); profileArray.append(profileObj); } json.insert("profiles", profileArray); + QJsonObject userStructure; + { + userStructure.insert("id", m_user.id); + QJsonObject userAttrs; + for(auto key: m_user.properties.keys()) + { + auto array = QJsonArray::fromStringList(m_user.properties.values(key)); + userAttrs.insert(key, array); + } + userStructure.insert("properties", userAttrs); + } + json.insert("user", userStructure); + if (m_currentProfile != -1) json.insert("activeProfile", currentProfile()->id); diff --git a/logic/auth/MojangAccount.h b/logic/auth/MojangAccount.h index 95f777ce..9eecbc4f 100644 --- a/logic/auth/MojangAccount.h +++ b/logic/auth/MojangAccount.h @@ -20,6 +20,7 @@ #include <QList> #include <QJsonObject> #include <QPair> +#include <QMap> #include <memory> @@ -41,14 +42,13 @@ struct AccountProfile { QString id; QString name; + bool legacy; }; struct User { QString id; - // pair of key:value - // we don't know if the keys:value mapping is 1:1, so a list is used. - QList<QPair<QString, QString>> properties; + QMultiMap<QString,QString> properties; }; enum AccountStatus diff --git a/logic/lists/MojangAccountList.cpp b/logic/auth/MojangAccountList.cpp index defa5d8c..0d13cd34 100644 --- a/logic/lists/MojangAccountList.cpp +++ b/logic/auth/MojangAccountList.cpp @@ -13,7 +13,7 @@ * limitations under the License. */ -#include "logic/lists/MojangAccountList.h" +#include "logic/auth/MojangAccountList.h" #include <QIODevice> #include <QFile> @@ -27,7 +27,7 @@ #include "logic/auth/MojangAccount.h" -#define ACCOUNT_LIST_FORMAT_VERSION 1 +#define ACCOUNT_LIST_FORMAT_VERSION 2 MojangAccountList::MojangAccountList(QObject *parent) : QAbstractListModel(parent) { diff --git a/logic/lists/MojangAccountList.h b/logic/auth/MojangAccountList.h index b3301bf6..b3301bf6 100644 --- a/logic/lists/MojangAccountList.h +++ b/logic/auth/MojangAccountList.h diff --git a/logic/auth/flows/AuthenticateTask.cpp b/logic/auth/flows/AuthenticateTask.cpp index 966548ec..d8e5b624 100644 --- a/logic/auth/flows/AuthenticateTask.cpp +++ b/logic/auth/flows/AuthenticateTask.cpp @@ -76,7 +76,7 @@ bool AuthenticateTask::processResponse(QJsonObject responseData) // Read the response data. We need to get the client token, access token, and the selected // profile. QLOG_DEBUG() << "Processing authentication response."; - + QLOG_DEBUG() << responseData; // If we already have a client token, make sure the one the server gave us matches our // existing one. QLOG_DEBUG() << "Getting client token."; @@ -123,6 +123,7 @@ bool AuthenticateTask::processResponse(QJsonObject responseData) // Profiles are easy, we just need their ID and name. QString id = profile.value("id").toString(""); QString name = profile.value("name").toString(""); + bool legacy = profile.value("legacy").toBool(false); if (id.isEmpty() || name.isEmpty()) { @@ -134,7 +135,7 @@ bool AuthenticateTask::processResponse(QJsonObject responseData) } // Now, add a new AccountProfile entry to the list. - loadedProfiles.append({id, name}); + loadedProfiles.append({id, name, legacy}); } // Put the list of profiles we loaded into the MojangAccount object. m_account->m_profiles = loadedProfiles; @@ -166,10 +167,11 @@ bool AuthenticateTask::processResponse(QJsonObject responseData) // is it a good idea to log this? if (responseData.contains("user")) { + User u; auto obj = responseData.value("user").toObject(); - auto userId = obj.value("id").toString(); + u.id = obj.value("id").toString(); + QLOG_DEBUG() << "User ID: " << u.id ; auto propArray = obj.value("properties").toArray(); - QLOG_DEBUG() << "User ID: " << userId; QLOG_DEBUG() << "User Properties: "; for (auto prop : propArray) { @@ -177,7 +179,9 @@ bool AuthenticateTask::processResponse(QJsonObject responseData) auto name = propTuple.value("name").toString(); auto value = propTuple.value("value").toString(); QLOG_DEBUG() << name << " : " << value; + u.properties.insert(name, value); } + m_account->m_user = u; } // We've made it through the minefield of possible errors. Return true to indicate that diff --git a/logic/auth/flows/RefreshTask.cpp b/logic/auth/flows/RefreshTask.cpp index bd38eb10..d0ecf06e 100644 --- a/logic/auth/flows/RefreshTask.cpp +++ b/logic/auth/flows/RefreshTask.cpp @@ -67,6 +67,7 @@ bool RefreshTask::processResponse(QJsonObject responseData) // profile. QLOG_DEBUG() << "Processing authentication response."; + QLOG_DEBUG() << responseData; // If we already have a client token, make sure the one the server gave us matches our // existing one. QString clientToken = responseData.value("clientToken").toString(""); |