Merge pull request #82 from PolyMC/revert-offline-mode

Revert offline mode support (#81 and #50)
This commit is contained in:
LennyMcLennington 2022-01-17 03:56:27 +00:00 committed by GitHub
commit 2c2c22ccf8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 3 additions and 383 deletions

View File

@ -221,11 +221,7 @@ set(MINECRAFT_SOURCES
minecraft/auth/flows/Mojang.h minecraft/auth/flows/Mojang.h
minecraft/auth/flows/MSA.cpp minecraft/auth/flows/MSA.cpp
minecraft/auth/flows/MSA.h minecraft/auth/flows/MSA.h
minecraft/auth/flows/Offline.cpp
minecraft/auth/flows/Offline.h
minecraft/auth/steps/OfflineStep.cpp
minecraft/auth/steps/OfflineStep.h
minecraft/auth/steps/EntitlementsStep.cpp minecraft/auth/steps/EntitlementsStep.cpp
minecraft/auth/steps/EntitlementsStep.h minecraft/auth/steps/EntitlementsStep.h
minecraft/auth/steps/GetSkinStep.cpp minecraft/auth/steps/GetSkinStep.cpp
@ -773,8 +769,6 @@ SET(LAUNCHER_SOURCES
ui/dialogs/LoginDialog.h ui/dialogs/LoginDialog.h
ui/dialogs/MSALoginDialog.cpp ui/dialogs/MSALoginDialog.cpp
ui/dialogs/MSALoginDialog.h ui/dialogs/MSALoginDialog.h
ui/dialogs/OfflineLoginDialog.cpp
ui/dialogs/OfflineLoginDialog.h
ui/dialogs/NewComponentDialog.cpp ui/dialogs/NewComponentDialog.cpp
ui/dialogs/NewComponentDialog.h ui/dialogs/NewComponentDialog.h
ui/dialogs/NewInstanceDialog.cpp ui/dialogs/NewInstanceDialog.cpp
@ -886,7 +880,6 @@ qt5_wrap_ui(LAUNCHER_UI
ui/dialogs/ExportInstanceDialog.ui ui/dialogs/ExportInstanceDialog.ui
ui/dialogs/IconPickerDialog.ui ui/dialogs/IconPickerDialog.ui
ui/dialogs/MSALoginDialog.ui ui/dialogs/MSALoginDialog.ui
ui/dialogs/OfflineLoginDialog.ui
ui/dialogs/AboutDialog.ui ui/dialogs/AboutDialog.ui
ui/dialogs/LoginDialog.ui ui/dialogs/LoginDialog.ui
ui/dialogs/EditAccountDialog.ui ui/dialogs/EditAccountDialog.ui

View File

@ -116,12 +116,6 @@ void LaunchController::login() {
m_session->wants_online = m_online; m_session->wants_online = m_online;
m_accountToUse->fillSession(m_session); m_accountToUse->fillSession(m_session);
// Launch immediately in true offline mode
if(m_accountToUse->isOffline()) {
launchInstance();
return;
}
switch(m_accountToUse->accountState()) { switch(m_accountToUse->accountState()) {
case AccountState::Offline: { case AccountState::Offline: {
m_session->wants_online = false; m_session->wants_online = false;

View File

@ -314,8 +314,6 @@ bool AccountData::resumeStateFromV3(QJsonObject data) {
type = AccountType::MSA; type = AccountType::MSA;
} else if (typeS == "Mojang") { } else if (typeS == "Mojang") {
type = AccountType::Mojang; type = AccountType::Mojang;
} else if (typeS == "Offline") {
type = AccountType::Offline;
} else { } else {
qWarning() << "Failed to parse account data: type is not recognized."; qWarning() << "Failed to parse account data: type is not recognized.";
return false; return false;
@ -365,9 +363,6 @@ QJsonObject AccountData::saveState() const {
tokenToJSONV3(output, xboxApiToken, "xrp-main"); tokenToJSONV3(output, xboxApiToken, "xrp-main");
tokenToJSONV3(output, mojangservicesToken, "xrp-mc"); tokenToJSONV3(output, mojangservicesToken, "xrp-mc");
} }
else if (type == AccountType::Offline) {
output["type"] = "Offline";
}
tokenToJSONV3(output, yggdrasilToken, "ygg"); tokenToJSONV3(output, yggdrasilToken, "ygg");
profileToJSONV3(output, minecraftProfile, "profile"); profileToJSONV3(output, minecraftProfile, "profile");
@ -376,7 +371,7 @@ QJsonObject AccountData::saveState() const {
} }
QString AccountData::userName() const { QString AccountData::userName() const {
if(type == AccountType::MSA) { if(type != AccountType::Mojang) {
return QString(); return QString();
} }
return yggdrasilToken.extra["userName"].toString(); return yggdrasilToken.extra["userName"].toString();
@ -432,9 +427,6 @@ QString AccountData::accountDisplayString() const {
case AccountType::Mojang: { case AccountType::Mojang: {
return userName(); return userName();
} }
case AccountType::Offline: {
return userName();
}
case AccountType::MSA: { case AccountType::MSA: {
if(xboxApiToken.extra.contains("gtg")) { if(xboxApiToken.extra.contains("gtg")) {
return xboxApiToken.extra["gtg"].toString(); return xboxApiToken.extra["gtg"].toString();

View File

@ -38,8 +38,7 @@ struct MinecraftProfile {
enum class AccountType { enum class AccountType {
MSA, MSA,
Mojang, Mojang
Offline
}; };
enum class AccountState { enum class AccountState {

View File

@ -302,7 +302,7 @@ QVariant AccountList::data(const QModelIndex &index, int role) const
} }
case MigrationColumn: { case MigrationColumn: {
if(account->isMSA() || account->isOffline()) { if(account->isMSA()) {
return tr("N/A", "Can Migrate?"); return tr("N/A", "Can Migrate?");
} }
if (account->canMigrate()) { if (account->canMigrate()) {

View File

@ -30,7 +30,6 @@
#include "flows/MSA.h" #include "flows/MSA.h"
#include "flows/Mojang.h" #include "flows/Mojang.h"
#include "flows/Offline.h"
MinecraftAccount::MinecraftAccount(QObject* parent) : QObject(parent) { MinecraftAccount::MinecraftAccount(QObject* parent) : QObject(parent) {
data.internalId = QUuid::createUuid().toString().remove(QRegExp("[{}-]")); data.internalId = QUuid::createUuid().toString().remove(QRegExp("[{}-]"));
@ -69,23 +68,6 @@ MinecraftAccountPtr MinecraftAccount::createBlankMSA()
return account; return account;
} }
MinecraftAccountPtr MinecraftAccount::createOffline(const QString &username)
{
MinecraftAccountPtr account = new MinecraftAccount();
account->data.type = AccountType::Offline;
account->data.yggdrasilToken.token = "offline";
account->data.yggdrasilToken.validity = Katabasis::Validity::Certain;
account->data.yggdrasilToken.issueInstant = QDateTime::currentDateTimeUtc();
account->data.yggdrasilToken.extra["userName"] = username;
account->data.yggdrasilToken.extra["clientToken"] = QUuid::createUuid().toString().remove(QRegExp("[{}-]"));
account->data.minecraftEntitlement.ownsMinecraft = true;
account->data.minecraftEntitlement.canPlayMinecraft = true;
account->data.minecraftProfile.id = QUuid::createUuid().toString().remove(QRegExp("[{}-]"));
account->data.minecraftProfile.name = username;
account->data.minecraftProfile.validity = Katabasis::Validity::Certain;
return account;
}
QJsonObject MinecraftAccount::saveToJson() const QJsonObject MinecraftAccount::saveToJson() const
{ {
@ -129,16 +111,6 @@ shared_qobject_ptr<AccountTask> MinecraftAccount::loginMSA() {
return m_currentTask; return m_currentTask;
} }
shared_qobject_ptr<AccountTask> MinecraftAccount::loginOffline() {
Q_ASSERT(m_currentTask.get() == nullptr);
m_currentTask.reset(new OfflineLogin(&data));
connect(m_currentTask.get(), SIGNAL(succeeded()), SLOT(authSucceeded()));
connect(m_currentTask.get(), SIGNAL(failed(QString)), SLOT(authFailed(QString)));
emit activityChanged(true);
return m_currentTask;
}
shared_qobject_ptr<AccountTask> MinecraftAccount::refresh() { shared_qobject_ptr<AccountTask> MinecraftAccount::refresh() {
if(m_currentTask) { if(m_currentTask) {
return m_currentTask; return m_currentTask;
@ -147,9 +119,6 @@ shared_qobject_ptr<AccountTask> MinecraftAccount::refresh() {
if(data.type == AccountType::MSA) { if(data.type == AccountType::MSA) {
m_currentTask.reset(new MSASilent(&data)); m_currentTask.reset(new MSASilent(&data));
} }
else if(data.type == AccountType::Offline) {
m_currentTask.reset(new OfflineRefresh(&data));
}
else { else {
m_currentTask.reset(new MojangRefresh(&data)); m_currentTask.reset(new MojangRefresh(&data));
} }

View File

@ -73,8 +73,6 @@ public: /* construction */
static MinecraftAccountPtr createBlankMSA(); static MinecraftAccountPtr createBlankMSA();
static MinecraftAccountPtr createOffline(const QString &username);
static MinecraftAccountPtr loadFromJsonV2(const QJsonObject &json); static MinecraftAccountPtr loadFromJsonV2(const QJsonObject &json);
static MinecraftAccountPtr loadFromJsonV3(const QJsonObject &json); static MinecraftAccountPtr loadFromJsonV3(const QJsonObject &json);
@ -91,8 +89,6 @@ public: /* manipulation */
shared_qobject_ptr<AccountTask> loginMSA(); shared_qobject_ptr<AccountTask> loginMSA();
shared_qobject_ptr<AccountTask> loginOffline();
shared_qobject_ptr<AccountTask> refresh(); shared_qobject_ptr<AccountTask> refresh();
shared_qobject_ptr<AccountTask> currentTask(); shared_qobject_ptr<AccountTask> currentTask();
@ -132,10 +128,6 @@ public: /* queries */
return data.type == AccountType::MSA; return data.type == AccountType::MSA;
} }
bool isOffline() const {
return data.type == AccountType::Offline;
}
bool ownsMinecraft() const { bool ownsMinecraft() const {
return data.minecraftEntitlement.ownsMinecraft; return data.minecraftEntitlement.ownsMinecraft;
} }
@ -157,10 +149,6 @@ public: /* queries */
return "msa"; return "msa";
} }
break; break;
case AccountType::Offline: {
return "offline";
}
break;
default: { default: {
return "unknown"; return "unknown";
} }

View File

@ -1,17 +0,0 @@
#include "Offline.h"
#include "minecraft/auth/steps/OfflineStep.h"
OfflineRefresh::OfflineRefresh(
AccountData *data,
QObject *parent
) : AuthFlow(data, parent) {
m_steps.append(new OfflineStep(m_data));
}
OfflineLogin::OfflineLogin(
AccountData *data,
QObject *parent
) : AuthFlow(data, parent) {
m_steps.append(new OfflineStep(m_data));
}

View File

@ -1,22 +0,0 @@
#pragma once
#include "AuthFlow.h"
class OfflineRefresh : public AuthFlow
{
Q_OBJECT
public:
explicit OfflineRefresh(
AccountData *data,
QObject *parent = 0
);
};
class OfflineLogin : public AuthFlow
{
Q_OBJECT
public:
explicit OfflineLogin(
AccountData *data,
QObject *parent = 0
);
};

View File

@ -1,18 +0,0 @@
#include "OfflineStep.h"
#include "Application.h"
OfflineStep::OfflineStep(AccountData* data) : AuthStep(data) {}
OfflineStep::~OfflineStep() noexcept = default;
QString OfflineStep::describe() {
return tr("Creating offline account.");
}
void OfflineStep::rehydrate() {
// NOOP
}
void OfflineStep::perform() {
emit finished(AccountTaskState::STATE_WORKING, tr("Created offline account."));
}

View File

@ -1,20 +0,0 @@
#pragma once
#include <QObject>
#include "QObjectPtr.h"
#include "minecraft/auth/AuthStep.h"
#include <katabasis/DeviceFlow.h>
class OfflineStep : public AuthStep {
Q_OBJECT
public:
explicit OfflineStep(AccountData *data);
virtual ~OfflineStep() noexcept;
void perform() override;
void rehydrate() override;
QString describe() override;
};

View File

@ -1,98 +0,0 @@
#include "OfflineLoginDialog.h"
#include "ui_OfflineLoginDialog.h"
#include "minecraft/auth/AccountTask.h"
#include <QtWidgets/QPushButton>
OfflineLoginDialog::OfflineLoginDialog(QWidget *parent) : QDialog(parent), ui(new Ui::OfflineLoginDialog)
{
ui->setupUi(this);
ui->progressBar->setVisible(false);
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
}
OfflineLoginDialog::~OfflineLoginDialog()
{
delete ui;
}
// Stage 1: User interaction
void OfflineLoginDialog::accept()
{
setUserInputsEnabled(false);
ui->progressBar->setVisible(true);
// Setup the login task and start it
m_account = MinecraftAccount::createOffline(ui->userTextBox->text());
m_loginTask = m_account->loginOffline();
connect(m_loginTask.get(), &Task::failed, this, &OfflineLoginDialog::onTaskFailed);
connect(m_loginTask.get(), &Task::succeeded, this, &OfflineLoginDialog::onTaskSucceeded);
connect(m_loginTask.get(), &Task::status, this, &OfflineLoginDialog::onTaskStatus);
connect(m_loginTask.get(), &Task::progress, this, &OfflineLoginDialog::onTaskProgress);
m_loginTask->start();
}
void OfflineLoginDialog::setUserInputsEnabled(bool enable)
{
ui->userTextBox->setEnabled(enable);
ui->buttonBox->setEnabled(enable);
}
// Enable the OK button only when the textbox contains something.
void OfflineLoginDialog::on_userTextBox_textEdited(const QString &newText)
{
ui->buttonBox->button(QDialogButtonBox::Ok)
->setEnabled(!newText.isEmpty());
}
void OfflineLoginDialog::onTaskFailed(const QString &reason)
{
// Set message
auto lines = reason.split('\n');
QString processed;
for(auto line: lines) {
if(line.size()) {
processed += "<font color='red'>" + line + "</font><br />";
}
else {
processed += "<br />";
}
}
ui->label->setText(processed);
// Re-enable user-interaction
setUserInputsEnabled(true);
ui->progressBar->setVisible(false);
}
void OfflineLoginDialog::onTaskSucceeded()
{
QDialog::accept();
}
void OfflineLoginDialog::onTaskStatus(const QString &status)
{
ui->label->setText(status);
}
void OfflineLoginDialog::onTaskProgress(qint64 current, qint64 total)
{
ui->progressBar->setMaximum(total);
ui->progressBar->setValue(current);
}
// Public interface
MinecraftAccountPtr OfflineLoginDialog::newAccount(QWidget *parent, QString msg)
{
OfflineLoginDialog dlg(parent);
dlg.ui->label->setText(msg);
if (dlg.exec() == QDialog::Accepted)
{
return dlg.m_account;
}
return 0;
}

View File

@ -1,43 +0,0 @@
#pragma once
#include <QtWidgets/QDialog>
#include <QtCore/QEventLoop>
#include "minecraft/auth/MinecraftAccount.h"
#include "tasks/Task.h"
namespace Ui
{
class OfflineLoginDialog;
}
class OfflineLoginDialog : public QDialog
{
Q_OBJECT
public:
~OfflineLoginDialog();
static MinecraftAccountPtr newAccount(QWidget *parent, QString message);
private:
explicit OfflineLoginDialog(QWidget *parent = 0);
void setUserInputsEnabled(bool enable);
protected
slots:
void accept();
void onTaskFailed(const QString &reason);
void onTaskSucceeded();
void onTaskStatus(const QString &status);
void onTaskProgress(qint64 current, qint64 total);
void on_userTextBox_textEdited(const QString &newText);
private:
Ui::OfflineLoginDialog *ui;
MinecraftAccountPtr m_account;
Task::Ptr m_loginTask;
};

View File

@ -1,67 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>OfflineLoginDialog</class>
<widget class="QDialog" name="OfflineLoginDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>250</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Add Account</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string notr="true">Message label placeholder.</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="userTextBox">
<property name="placeholderText">
<string>Username</string>
</property>
</widget>
</item>
<item>
<widget class="QProgressBar" name="progressBar">
<property name="value">
<number>69</number>
</property>
<property name="textVisible">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -24,7 +24,6 @@
#include "net/NetJob.h" #include "net/NetJob.h"
#include "ui/dialogs/ProgressDialog.h" #include "ui/dialogs/ProgressDialog.h"
#include "ui/dialogs/OfflineLoginDialog.h"
#include "ui/dialogs/LoginDialog.h" #include "ui/dialogs/LoginDialog.h"
#include "ui/dialogs/MSALoginDialog.h" #include "ui/dialogs/MSALoginDialog.h"
#include "ui/dialogs/CustomMessageBox.h" #include "ui/dialogs/CustomMessageBox.h"
@ -154,28 +153,6 @@ void AccountListPage::on_actionAddMicrosoft_triggered()
} }
} }
void AccountListPage::on_actionAddOffline_triggered()
{
MinecraftAccountPtr account = OfflineLoginDialog::newAccount(
this,
tr("Please enter your desired username to add your offline account. <br>"
"<br>"
"It is required by Mojang that you own Minecraft BEFORE you may use offline mode. <br>"
"The PolyMC developers denounce piracy and take NO LIABILITY WHATSOEVER for <br>"
"any illegal activity that may occur in usage of the offline mode feature. <br>"
"<br>"
"By continuing you promise that you own a Minecraft account.")
);
if (account)
{
m_accounts->addAccount(account);
if (m_accounts->count() == 1) {
m_accounts->setDefaultAccount(account);
}
}
}
void AccountListPage::on_actionRemove_triggered() void AccountListPage::on_actionRemove_triggered()
{ {
QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes(); QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes();

View File

@ -62,7 +62,6 @@ public:
public slots: public slots:
void on_actionAddMojang_triggered(); void on_actionAddMojang_triggered();
void on_actionAddMicrosoft_triggered(); void on_actionAddMicrosoft_triggered();
void on_actionAddOffline_triggered();
void on_actionRemove_triggered(); void on_actionRemove_triggered();
void on_actionRefresh_triggered(); void on_actionRefresh_triggered();
void on_actionSetDefault_triggered(); void on_actionSetDefault_triggered();

View File

@ -54,7 +54,6 @@
</attribute> </attribute>
<addaction name="actionAddMicrosoft"/> <addaction name="actionAddMicrosoft"/>
<addaction name="actionAddMojang"/> <addaction name="actionAddMojang"/>
<addaction name="actionAddOffline"/>
<addaction name="actionRefresh"/> <addaction name="actionRefresh"/>
<addaction name="actionRemove"/> <addaction name="actionRemove"/>
<addaction name="actionSetDefault"/> <addaction name="actionSetDefault"/>
@ -104,11 +103,6 @@
<string>Add Microsoft</string> <string>Add Microsoft</string>
</property> </property>
</action> </action>
<action name="actionAddOffline">
<property name="text">
<string>Add Offline</string>
</property>
</action>
<action name="actionRefresh"> <action name="actionRefresh">
<property name="text"> <property name="text">
<string>Refresh</string> <string>Refresh</string>