Fix login with SSO and Password supported

This commit is contained in:
Nicolas Werner 2021-02-19 15:48:43 +01:00
parent 99efe2f06b
commit ebd12a6f33
2 changed files with 35 additions and 23 deletions

View File

@ -147,16 +147,23 @@ LoginPage::LoginPage(QWidget *parent)
error_matrixid_label_->hide(); error_matrixid_label_->hide();
button_layout_ = new QHBoxLayout(); button_layout_ = new QHBoxLayout();
button_layout_->setSpacing(0); button_layout_->setSpacing(20);
button_layout_->setContentsMargins(0, 0, 0, 30); button_layout_->setContentsMargins(0, 0, 0, 30);
login_button_ = new RaisedButton(tr("LOGIN"), this); login_button_ = new RaisedButton(tr("LOGIN"), this);
login_button_->setMinimumSize(350, 65); login_button_->setMinimumSize(150, 65);
login_button_->setFontSize(20); login_button_->setFontSize(20);
login_button_->setCornerRadius(3); login_button_->setCornerRadius(3);
sso_login_button_ = new RaisedButton(tr("SSO LOGIN"), this);
sso_login_button_->setMinimumSize(150, 65);
sso_login_button_->setFontSize(20);
sso_login_button_->setCornerRadius(3);
sso_login_button_->setVisible(false);
button_layout_->addStretch(1); button_layout_->addStretch(1);
button_layout_->addWidget(login_button_); button_layout_->addWidget(login_button_);
button_layout_->addWidget(sso_login_button_);
button_layout_->addStretch(1); button_layout_->addStretch(1);
error_label_ = new QLabel(this); error_label_ = new QLabel(this);
@ -179,7 +186,12 @@ LoginPage::LoginPage(QWidget *parent)
this, &LoginPage::versionErrorCb, this, &LoginPage::versionError, Qt::QueuedConnection); this, &LoginPage::versionErrorCb, this, &LoginPage::versionError, Qt::QueuedConnection);
connect(back_button_, SIGNAL(clicked()), this, SLOT(onBackButtonClicked())); connect(back_button_, SIGNAL(clicked()), this, SLOT(onBackButtonClicked()));
connect(login_button_, SIGNAL(clicked()), this, SLOT(onLoginButtonClicked())); connect(login_button_, &RaisedButton::clicked, this, [this]() {
onLoginButtonClicked(passwordSupported ? LoginMethod::Password : LoginMethod::SSO);
});
connect(sso_login_button_, &RaisedButton::clicked, this, [this]() {
onLoginButtonClicked(LoginMethod::SSO);
});
connect(matrixid_input_, SIGNAL(returnPressed()), login_button_, SLOT(click())); connect(matrixid_input_, SIGNAL(returnPressed()), login_button_, SLOT(click()));
connect(password_input_, SIGNAL(returnPressed()), login_button_, SLOT(click())); connect(password_input_, SIGNAL(returnPressed()), login_button_, SLOT(click()));
connect(deviceName_, SIGNAL(returnPressed()), login_button_, SLOT(click())); connect(deviceName_, SIGNAL(returnPressed()), login_button_, SLOT(click()));
@ -314,16 +326,19 @@ LoginPage::checkHomeserverVersion()
http::client()->get_login( http::client()->get_login(
[this](mtx::responses::LoginFlows flows, mtx::http::RequestErr err) { [this](mtx::responses::LoginFlows flows, mtx::http::RequestErr err) {
if (err || flows.flows.empty()) if (err || flows.flows.empty())
emit versionOkCb(LoginMethod::Password); emit versionOkCb(true, false);
LoginMethod loginMethod_ = LoginMethod::Password; bool ssoSupported_ = false;
bool passwordSupported_ = false;
for (const auto &flow : flows.flows) { for (const auto &flow : flows.flows) {
if (flow.type == mtx::user_interactive::auth_types::sso) { if (flow.type == mtx::user_interactive::auth_types::sso) {
loginMethod_ = LoginMethod::SSO; ssoSupported_ = true;
break; } else if (flow.type ==
mtx::user_interactive::auth_types::password) {
passwordSupported_ = true;
} }
} }
emit versionOkCb(loginMethod_); emit versionOkCb(passwordSupported_, ssoSupported_);
}); });
}); });
} }
@ -355,28 +370,24 @@ LoginPage::versionError(const QString &error)
} }
void void
LoginPage::versionOk(LoginMethod loginMethod_) LoginPage::versionOk(bool passwordSupported_, bool ssoSupported_)
{ {
this->loginMethod = loginMethod_; passwordSupported = passwordSupported_;
ssoSupported = ssoSupported_;
serverLayout_->removeWidget(spinner_); serverLayout_->removeWidget(spinner_);
matrixidLayout_->removeWidget(spinner_); matrixidLayout_->removeWidget(spinner_);
spinner_->stop(); spinner_->stop();
if (loginMethod == LoginMethod::SSO) { sso_login_button_->setVisible(ssoSupported);
password_input_->hide(); login_button_->setVisible(passwordSupported);
login_button_->setText(tr("SSO LOGIN"));
} else {
password_input_->show();
login_button_->setText(tr("LOGIN"));
}
if (serverInput_->isVisible()) if (serverInput_->isVisible())
serverInput_->hide(); serverInput_->hide();
} }
void void
LoginPage::onLoginButtonClicked() LoginPage::onLoginButtonClicked(LoginMethod loginMethod)
{ {
error_label_->setText(""); error_label_->setText("");

View File

@ -56,7 +56,7 @@ signals:
//! Used to trigger the corresponding slot outside of the main thread. //! Used to trigger the corresponding slot outside of the main thread.
void versionErrorCb(const QString &err); void versionErrorCb(const QString &err);
void versionOkCb(LoginPage::LoginMethod method); void versionOkCb(bool passwordSupported, bool ssoSupported);
void loginOk(const mtx::responses::Login &res); void loginOk(const mtx::responses::Login &res);
@ -73,7 +73,7 @@ private slots:
void onBackButtonClicked(); void onBackButtonClicked();
// Callback for the login button. // Callback for the login button.
void onLoginButtonClicked(); void onLoginButtonClicked(LoginMethod loginMethod);
// Callback for probing the server found in the mxid // Callback for probing the server found in the mxid
void onMatrixIdEntered(); void onMatrixIdEntered();
@ -84,7 +84,7 @@ private slots:
// Callback for errors produced during server probing // Callback for errors produced during server probing
void versionError(const QString &error_message); void versionError(const QString &error_message);
// Callback for successful server probing // Callback for successful server probing
void versionOk(LoginPage::LoginMethod method); void versionOk(bool passwordSupported, bool ssoSupported);
private: private:
void checkHomeserverVersion(); void checkHomeserverVersion();
@ -120,7 +120,7 @@ private:
QString inferredServerAddress_; QString inferredServerAddress_;
FlatButton *back_button_; FlatButton *back_button_;
RaisedButton *login_button_; RaisedButton *login_button_, *sso_login_button_;
QWidget *form_widget_; QWidget *form_widget_;
QHBoxLayout *form_wrapper_; QHBoxLayout *form_wrapper_;
@ -130,5 +130,6 @@ private:
TextField *password_input_; TextField *password_input_;
TextField *deviceName_; TextField *deviceName_;
TextField *serverInput_; TextField *serverInput_;
LoginMethod loginMethod = LoginMethod::Password; bool passwordSupported = true;
bool ssoSupported = false;
}; };