diff --git a/include/ChatPage.h b/include/ChatPage.h index 1582db06..147ff6b2 100644 --- a/include/ChatPage.h +++ b/include/ChatPage.h @@ -81,6 +81,7 @@ public: QSharedPointer userSettings() { return userSettings_; } QSharedPointer cache() { return cache_; } + void deleteConfigs(); signals: void contentLoaded(); @@ -126,7 +127,6 @@ private: void updateTypingUsers(const QString &roomid, const std::vector &user_ids); void loadStateFromCache(); - void deleteConfigs(); void resetUI(); //! Decides whether or not to hide the group's sidebar. void setGroupViewState(bool isEnabled); diff --git a/include/MatrixClient.h b/include/MatrixClient.h index d16031d3..c60a7e0a 100644 --- a/include/MatrixClient.h +++ b/include/MatrixClient.h @@ -175,6 +175,8 @@ signals: void redactionFailed(const QString &error); void redactionCompleted(const QString &room_id, const QString &event_id); + void invalidToken(); + void syncError(const QString &error); private: QNetworkReply *makeUploadRequest(QSharedPointer iodev); diff --git a/src/MainWindow.cc b/src/MainWindow.cc index c2353a11..404baec5 100644 --- a/src/MainWindow.cc +++ b/src/MainWindow.cc @@ -131,6 +131,11 @@ MainWindow::MainWindow(QWidget *parent) SIGNAL(registerSuccess(QString, QString, QString)), this, SLOT(showChatPage(QString, QString, QString))); + connect(client_.data(), &MatrixClient::invalidToken, this, [this]() { + chat_page_->deleteConfigs(); + showLoginPage(); + login_page_->loginError("Invalid token detected. Please try to login again."); + }); QShortcut *quitShortcut = new QShortcut(QKeySequence::Quit, this); connect(quitShortcut, &QShortcut::activated, this, QApplication::quit); diff --git a/src/MatrixClient.cc b/src/MatrixClient.cc index 5593dbe6..96f8b941 100644 --- a/src/MatrixClient.cc +++ b/src/MatrixClient.cc @@ -309,13 +309,24 @@ MatrixClient::sync() noexcept reply->deleteLater(); int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + auto data = reply->readAll(); if (status == 0 || status >= 400) { - qDebug() << reply->errorString(); - return; - } + try { + mtx::errors::Error res = nlohmann::json::parse(data); - auto data = reply->readAll(); + if (res.errcode == mtx::errors::ErrorCode::M_UNKNOWN_TOKEN) { + emit invalidToken(); + return; + } + + emit syncError(QString::fromStdString(res.error)); + + return; + } catch (const nlohmann::json::exception &e) { + qWarning() << e.what(); + } + } try { mtx::responses::Sync response = nlohmann::json::parse(data);