Log SSL errors, give common solutions
This commit is contained in:
		| @@ -865,6 +865,8 @@ void MainWindow::doLaunch() | |||||||
| 	if (!account.get()) | 	if (!account.get()) | ||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
|  | 	QString failReason = tr("Your account is currently not logged in. Please enter " | ||||||
|  | 							"your password to log in again."); | ||||||
| 	// do the login. if the account has an access token, try to refresh it first. | 	// do the login. if the account has an access token, try to refresh it first. | ||||||
| 	if (account->accountStatus() != NotVerified) | 	if (account->accountStatus() != NotVerified) | ||||||
| 	{ | 	{ | ||||||
| @@ -879,13 +881,28 @@ void MainWindow::doLaunch() | |||||||
| 		{ | 		{ | ||||||
| 			updateInstance(m_selectedInstance, account); | 			updateInstance(m_selectedInstance, account); | ||||||
| 		} | 		} | ||||||
| 		// revert from online to verified. | 		else | ||||||
|  | 		{ | ||||||
|  | 			if (!task->successful()) | ||||||
|  | 			{ | ||||||
|  | 				failReason = task->failReason(); | ||||||
|  | 			} | ||||||
|  | 			if (loginWithPassword(account, failReason)) | ||||||
|  | 				updateInstance(m_selectedInstance, account); | ||||||
|  | 		} | ||||||
|  | 		// in any case, revert from online to verified. | ||||||
|  | 		account->downgrade(); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		if (loginWithPassword(account, failReason)) | ||||||
|  | 		{ | ||||||
|  | 			updateInstance(m_selectedInstance, account); | ||||||
|  | 			account->downgrade(); | ||||||
|  | 		} | ||||||
|  | 		// in any case, revert from online to verified. | ||||||
| 		account->downgrade(); | 		account->downgrade(); | ||||||
| 		return; |  | ||||||
| 	} | 	} | ||||||
| 	if (loginWithPassword(account, tr("Your account is currently not logged in. Please enter " |  | ||||||
| 									  "your password to log in again."))) |  | ||||||
| 		updateInstance(m_selectedInstance, account); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| bool MainWindow::loginWithPassword(MojangAccountPtr account, const QString &errorMsg) | bool MainWindow::loginWithPassword(MojangAccountPtr account, const QString &errorMsg) | ||||||
|   | |||||||
| @@ -15,6 +15,8 @@ | |||||||
|  |  | ||||||
| #include "EditAccountDialog.h" | #include "EditAccountDialog.h" | ||||||
| #include "ui_EditAccountDialog.h" | #include "ui_EditAccountDialog.h" | ||||||
|  | #include <QDesktopServices> | ||||||
|  | #include <QUrl> | ||||||
|  |  | ||||||
| EditAccountDialog::EditAccountDialog(const QString &text, QWidget *parent, int flags) | EditAccountDialog::EditAccountDialog(const QString &text, QWidget *parent, int flags) | ||||||
| 	: QDialog(parent), ui(new Ui::EditAccountDialog) | 	: QDialog(parent), ui(new Ui::EditAccountDialog) | ||||||
| @@ -33,6 +35,11 @@ EditAccountDialog::~EditAccountDialog() | |||||||
| 	delete ui; | 	delete ui; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void EditAccountDialog::on_label_linkActivated(const QString &link) | ||||||
|  | { | ||||||
|  | 	QDesktopServices::openUrl(QUrl(link)); | ||||||
|  | } | ||||||
|  |  | ||||||
| QString EditAccountDialog::username() const | QString EditAccountDialog::username() const | ||||||
| { | { | ||||||
| 	return ui->userTextBox->text(); | 	return ui->userTextBox->text(); | ||||||
|   | |||||||
| @@ -52,6 +52,9 @@ public: | |||||||
| 		PasswordField, | 		PasswordField, | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|  | private slots: | ||||||
|  |   void on_label_linkActivated(const QString &link); | ||||||
|  |  | ||||||
| private: | private: | ||||||
| 	Ui::EditAccountDialog *ui; | 	Ui::EditAccountDialog *ui; | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -19,6 +19,12 @@ | |||||||
|      <property name="text"> |      <property name="text"> | ||||||
|       <string>Message label placeholder.</string> |       <string>Message label placeholder.</string> | ||||||
|      </property> |      </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> |     </widget> | ||||||
|    </item> |    </item> | ||||||
|    <item> |    <item> | ||||||
|   | |||||||
| @@ -48,6 +48,7 @@ void YggdrasilTask::executeTask() | |||||||
| 	connect(m_netReply, &QNetworkReply::finished, this, &YggdrasilTask::processReply); | 	connect(m_netReply, &QNetworkReply::finished, this, &YggdrasilTask::processReply); | ||||||
| 	connect(m_netReply, &QNetworkReply::uploadProgress, this, &YggdrasilTask::refreshTimers); | 	connect(m_netReply, &QNetworkReply::uploadProgress, this, &YggdrasilTask::refreshTimers); | ||||||
| 	connect(m_netReply, &QNetworkReply::downloadProgress, this, &YggdrasilTask::refreshTimers); | 	connect(m_netReply, &QNetworkReply::downloadProgress, this, &YggdrasilTask::refreshTimers); | ||||||
|  | 	connect(m_netReply, &QNetworkReply::sslErrors, this, &YggdrasilTask::sslErrors); | ||||||
| 	timeout_keeper.setSingleShot(true); | 	timeout_keeper.setSingleShot(true); | ||||||
| 	timeout_keeper.start(timeout_max); | 	timeout_keeper.start(timeout_max); | ||||||
| 	counter.setSingleShot(false); | 	counter.setSingleShot(false); | ||||||
| @@ -75,10 +76,33 @@ void YggdrasilTask::abort() | |||||||
| 	m_netReply->abort(); | 	m_netReply->abort(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void YggdrasilTask::sslErrors(QList<QSslError> errors) | ||||||
|  | { | ||||||
|  | 	int i = 1; | ||||||
|  | 	for(auto error: errors) | ||||||
|  | 	{ | ||||||
|  | 		QLOG_ERROR() << "LOGIN SSL Error #" << i << " : " << error.errorString(); | ||||||
|  | 		auto cert = error.certificate(); | ||||||
|  | 		QLOG_ERROR() << "Certificate in question:\n" << cert.toText(); | ||||||
|  | 		i++; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| void YggdrasilTask::processReply() | void YggdrasilTask::processReply() | ||||||
| { | { | ||||||
| 	setStatus(getStateMessage(STATE_PROCESSING_RESPONSE)); | 	setStatus(getStateMessage(STATE_PROCESSING_RESPONSE)); | ||||||
|  |  | ||||||
|  | 	if (m_netReply->error() == QNetworkReply::SslHandshakeFailedError) | ||||||
|  | 	{ | ||||||
|  | 		emitFailed(tr("<b>SSL Handshake failed.</b><br/>There might be a few causes for it:<br/>" | ||||||
|  | 					  "<ul>" | ||||||
|  | 					  "<li>You use Windows XP and need to <a href=\"http://www.microsoft.com/en-us/download/details.aspx?id=38918\">update your root certificates</a></li>" | ||||||
|  | 					  "<li>Some device on your network is interfering with SSL traffic. In that case, you have bigger worries than Minecraft not starting.</li>" | ||||||
|  | 					  "<li>Possibly something else. Check the MultiMC log file for details</li>" | ||||||
|  | 					  "</ul>")); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// any network errors lead to offline mode right now | 	// any network errors lead to offline mode right now | ||||||
| 	if (m_netReply->error() >= QNetworkReply::ConnectionRefusedError && | 	if (m_netReply->error() >= QNetworkReply::ConnectionRefusedError && | ||||||
| 		m_netReply->error() <= QNetworkReply::UnknownNetworkError) | 		m_netReply->error() <= QNetworkReply::UnknownNetworkError) | ||||||
|   | |||||||
| @@ -20,6 +20,7 @@ | |||||||
| #include <QString> | #include <QString> | ||||||
| #include <QJsonObject> | #include <QJsonObject> | ||||||
| #include <QTimer> | #include <QTimer> | ||||||
|  | #include <qsslerror.h> | ||||||
|  |  | ||||||
| #include "logic/auth/MojangAccount.h" | #include "logic/auth/MojangAccount.h" | ||||||
|  |  | ||||||
| @@ -99,6 +100,7 @@ slots: | |||||||
| 	void processReply(); | 	void processReply(); | ||||||
| 	void refreshTimers(qint64, qint64); | 	void refreshTimers(qint64, qint64); | ||||||
| 	void heartbeat(); | 	void heartbeat(); | ||||||
|  | 	void sslErrors(QList<QSslError>); | ||||||
|  |  | ||||||
| public | public | ||||||
| slots: | slots: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user