summaryrefslogtreecommitdiffstats
path: root/src/LoginPage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/LoginPage.cpp')
-rw-r--r--src/LoginPage.cpp113
1 files changed, 90 insertions, 23 deletions
diff --git a/src/LoginPage.cpp b/src/LoginPage.cpp
index 6d96419a..4c3999ec 100644
--- a/src/LoginPage.cpp
+++ b/src/LoginPage.cpp
@@ -15,28 +15,35 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <QDesktopServices>
#include <QPainter>
#include <QStyleOption>
#include <mtx/identifiers.hpp>
+#include <mtx/requests.hpp>
#include <mtx/responses/login.hpp>
#include "Config.h"
#include "Logging.h"
#include "LoginPage.h"
#include "MatrixClient.h"
+#include "SSOHandler.h"
#include "ui/FlatButton.h"
#include "ui/LoadingIndicator.h"
#include "ui/OverlayModal.h"
#include "ui/RaisedButton.h"
#include "ui/TextField.h"
+Q_DECLARE_METATYPE(LoginPage::LoginMethod)
+
using namespace mtx::identifiers;
LoginPage::LoginPage(QWidget *parent)
: QWidget(parent)
, inferredServerAddress_()
{
+ qRegisterMetaType<LoginPage::LoginMethod>("LoginPage::LoginMethod");
+
top_layout_ = new QVBoxLayout();
top_bar_layout_ = new QHBoxLayout();
@@ -226,7 +233,8 @@ LoginPage::onMatrixIdEntered()
emit versionErrorCb(tr("Autodiscovery failed. Unknown error when "
"requesting .well-known."));
nhlog::net()->error("Autodiscovery failed. Unknown error when "
- "requesting .well-known.");
+ "requesting .well-known. {}",
+ err->status_code);
return;
}
@@ -263,7 +271,16 @@ LoginPage::checkHomeserverVersion()
return;
}
- emit versionOkCb();
+ http::client()->get_login(
+ [this](mtx::responses::LoginFlows flows, mtx::http::RequestErr err) {
+ if (err || flows.flows.empty())
+ emit versionOkCb(LoginMethod::Password);
+
+ if (flows.flows[0].type == mtx::user_interactive::auth_types::sso)
+ emit versionOkCb(LoginMethod::SSO);
+ else
+ emit versionOkCb(LoginMethod::Password);
+ });
});
}
@@ -294,12 +311,22 @@ LoginPage::versionError(const QString &error)
}
void
-LoginPage::versionOk()
+LoginPage::versionOk(LoginMethod loginMethod)
{
+ this->loginMethod = loginMethod;
+
serverLayout_->removeWidget(spinner_);
matrixidLayout_->removeWidget(spinner_);
spinner_->stop();
+ if (loginMethod == LoginMethod::SSO) {
+ password_input_->hide();
+ login_button_->setText(tr("SSO LOGIN"));
+ } else {
+ password_input_->show();
+ login_button_->setText(tr("LOGIN"));
+ }
+
if (serverInput_->isVisible())
serverInput_->hide();
}
@@ -317,29 +344,68 @@ LoginPage::onLoginButtonClicked()
return loginError("You have entered an invalid Matrix ID e.g @joe:matrix.org");
}
- if (password_input_->text().isEmpty())
- return loginError(tr("Empty password"));
+ if (loginMethod == LoginMethod::Password) {
+ if (password_input_->text().isEmpty())
+ return loginError(tr("Empty password"));
+
+ http::client()->login(
+ user.localpart(),
+ password_input_->text().toStdString(),
+ deviceName_->text().trimmed().isEmpty() ? initialDeviceName()
+ : deviceName_->text().toStdString(),
+ [this](const mtx::responses::Login &res, mtx::http::RequestErr err) {
+ if (err) {
+ emit loginError(QString::fromStdString(err->matrix_error.error));
+ emit errorOccurred();
+ return;
+ }
- http::client()->login(
- user.localpart(),
- password_input_->text().toStdString(),
- deviceName_->text().trimmed().isEmpty() ? initialDeviceName()
- : deviceName_->text().toStdString(),
- [this](const mtx::responses::Login &res, mtx::http::RequestErr err) {
- if (err) {
- emit loginError(QString::fromStdString(err->matrix_error.error));
- emit errorOccurred();
- return;
- }
+ if (res.well_known) {
+ http::client()->set_server(res.well_known->homeserver.base_url);
+ nhlog::net()->info("Login requested to user server: " +
+ res.well_known->homeserver.base_url);
+ }
- if (res.well_known) {
- http::client()->set_server(res.well_known->homeserver.base_url);
- nhlog::net()->info("Login requested to user server: " +
- res.well_known->homeserver.base_url);
- }
+ emit loginOk(res);
+ });
+ } else {
+ auto sso = new SSOHandler();
+ connect(sso, &SSOHandler::ssoSuccess, this, [this, sso](std::string token) {
+ mtx::requests::Login req{};
+ req.token = token;
+ req.type = mtx::user_interactive::auth_types::token;
+ req.device_id = deviceName_->text().trimmed().isEmpty()
+ ? initialDeviceName()
+ : deviceName_->text().toStdString();
+ http::client()->login(
+ req, [this](const mtx::responses::Login &res, mtx::http::RequestErr err) {
+ if (err) {
+ emit loginError(
+ QString::fromStdString(err->matrix_error.error));
+ emit errorOccurred();
+ return;
+ }
+
+ if (res.well_known) {
+ http::client()->set_server(
+ res.well_known->homeserver.base_url);
+ nhlog::net()->info("Login requested to user server: " +
+ res.well_known->homeserver.base_url);
+ }
+
+ emit loginOk(res);
+ });
+ sso->deleteLater();
+ });
+ connect(sso, &SSOHandler::ssoFailed, this, [this, sso]() {
+ emit loginError(tr("SSO login failed"));
+ emit errorOccurred();
+ sso->deleteLater();
+ });
- emit loginOk(res);
- });
+ QDesktopServices::openUrl(
+ QString::fromStdString(http::client()->login_sso_redirect(sso->url())));
+ }
emit loggingIn();
}
@@ -349,6 +415,7 @@ LoginPage::reset()
{
matrixid_input_->clear();
password_input_->clear();
+ password_input_->show();
serverInput_->clear();
spinner_->stop();