summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2022-03-06 19:51:17 +0100
committerNicolas Werner <nicolas.werner@hotmail.de>2022-03-06 19:51:17 +0100
commit9482ac4e7acd23b1873450be977c50526677b1a3 (patch)
treef0c6a134491b33b3f7e2a7d6e095f381c8edbf17 /src
parentMobile message input (#962) (diff)
downloadnheko-9482ac4e7acd23b1873450be977c50526677b1a3.tar.xz
Allow explicit selection of SSO method
fixes #975
Diffstat (limited to 'src')
-rw-r--r--src/LoginPage.cpp65
-rw-r--r--src/LoginPage.h27
2 files changed, 72 insertions, 20 deletions
diff --git a/src/LoginPage.cpp b/src/LoginPage.cpp

index 6bed446e..cdc2262f 100644 --- a/src/LoginPage.cpp +++ b/src/LoginPage.cpp
@@ -19,6 +19,7 @@ #include "UserSettingsPage.h" Q_DECLARE_METATYPE(LoginPage::LoginMethod) +Q_DECLARE_METATYPE(SSOProvider) using namespace mtx::identifiers; @@ -28,6 +29,7 @@ LoginPage::LoginPage(QObject *parent) { [[maybe_unused]] static auto ignored = qRegisterMetaType<LoginPage::LoginMethod>("LoginPage::LoginMethod"); + [[maybe_unused]] static auto ignored2 = qRegisterMetaType<SSOProvider>(); connect(this, &LoginPage::versionOkCb, this, &LoginPage::versionOk, Qt::QueuedConnection); connect(this, &LoginPage::versionErrorCb, this, &LoginPage::versionError, Qt::QueuedConnection); @@ -166,22 +168,47 @@ LoginPage::checkHomeserverVersion() return; } - http::client()->get_login( - [this](mtx::responses::LoginFlows flows, mtx::http::RequestErr err) { - if (err || flows.flows.empty()) - emit versionOkCb(true, false); + http::client()->get_login([this](mtx::responses::LoginFlows flows, + mtx::http::RequestErr err) { + if (err || flows.flows.empty()) + emit versionOkCb(true, false, {}); - bool ssoSupported = false; - bool passwordSupported = false; - for (const auto &flow : flows.flows) { - if (flow.type == mtx::user_interactive::auth_types::sso) { - ssoSupported = true; - } else if (flow.type == mtx::user_interactive::auth_types::password) { - passwordSupported = true; - } - } - emit versionOkCb(passwordSupported, ssoSupported); - }); + QVariantList idps; + bool ssoSupported = false; + bool passwordSupported = false; + for (const auto &flow : flows.flows) { + if (flow.type == mtx::user_interactive::auth_types::sso) { + ssoSupported = true; + + for (const auto &idp : flow.identity_providers) { + SSOProvider prov; + if (idp.brand == "apple") + prov.name_ = tr("Sign in with Apple"); + else if (idp.brand == "facebook") + prov.name_ = tr("Continue with Facebook"); + else if (idp.brand == "google") + prov.name_ = tr("Sign in with Google"); + else if (idp.brand == "twitter") + prov.name_ = tr("Sign in with Twitter"); + else + prov.name_ = tr("Login using %1").arg(QString::fromStdString(idp.name)); + + prov.avatarUrl_ = QString::fromStdString(idp.icon); + prov.id_ = QString::fromStdString(idp.id); + idps.push_back(QVariant::fromValue(prov)); + } + + if (flow.identity_providers.empty()) { + SSOProvider prov; + prov.name_ = tr("SSO LOGIN"); + idps.push_back(QVariant::fromValue(prov)); + } + } else if (flow.type == mtx::user_interactive::auth_types::password) { + passwordSupported = true; + } + } + emit versionOkCb(passwordSupported, ssoSupported, idps); + }); }); } @@ -198,10 +225,11 @@ LoginPage::versionError(const QString &error) } void -LoginPage::versionOk(bool passwordSupported, bool ssoSupported) +LoginPage::versionOk(bool passwordSupported, bool ssoSupported, QVariantList idps) { passwordSupported_ = passwordSupported; ssoSupported_ = ssoSupported; + identityProviders_ = idps; lookingUpHs_ = false; homeserverValid_ = true; @@ -287,8 +315,9 @@ LoginPage::onLoginButtonClicked(LoginMethod loginMethod, sso->deleteLater(); }); - QDesktopServices::openUrl( - QString::fromStdString(http::client()->login_sso_redirect(sso->url()))); + // password doubles as the idp id for SSO login + QDesktopServices::openUrl(QString::fromStdString( + http::client()->login_sso_redirect(sso->url(), password.toStdString()))); } loggingIn_ = true; diff --git a/src/LoginPage.h b/src/LoginPage.h
index 9a1b9653..47896fda 100644 --- a/src/LoginPage.h +++ b/src/LoginPage.h
@@ -7,6 +7,7 @@ #pragma once #include <QObject> +#include <QVariantList> namespace mtx { namespace responses { @@ -14,6 +15,23 @@ struct Login; } } +struct SSOProvider +{ + Q_GADGET + Q_PROPERTY(QString avatarUrl READ avatarUrl CONSTANT) + Q_PROPERTY(QString name READ name CONSTANT) + Q_PROPERTY(QString id READ id CONSTANT) + +public: + [[nodiscard]] QString avatarUrl() const { return avatarUrl_; } + [[nodiscard]] QString name() const { return name_.toHtmlEscaped(); } + [[nodiscard]] QString id() const { return id_; } + + QString avatarUrl_; + QString name_; + QString id_; +}; + class LoginPage : public QObject { Q_OBJECT @@ -30,6 +48,8 @@ class LoginPage : public QObject Q_PROPERTY(bool ssoSupported READ ssoSupported NOTIFY versionLookedUp) Q_PROPERTY(bool homeserverNeeded READ homeserverNeeded NOTIFY versionLookedUp) + Q_PROPERTY(QVariantList identityProviders READ identityProviders NOTIFY versionLookedUp) + public: enum class LoginMethod { @@ -51,6 +71,7 @@ public: bool ssoSupported() const { return ssoSupported_; } bool homeserverNeeded() const { return homeserverNeeded_; } bool homeserverValid() const { return homeserverValid_; } + QVariantList identityProviders() const { return identityProviders_; } QString homeserver() { return homeserver_; } QString mxid() { return mxid_; } @@ -89,7 +110,7 @@ signals: //! Used to trigger the corresponding slot outside of the main thread. void versionErrorCb(const QString &err); - void versionOkCb(bool passwordSupported, bool ssoSupported); + void versionOkCb(bool passwordSupported, bool ssoSupported, QVariantList identityProviders); void loginOk(const mtx::responses::Login &res); @@ -116,7 +137,7 @@ public slots: // Callback for errors produced during server probing void versionError(const QString &error_message); // Callback for successful server probing - void versionOk(bool passwordSupported, bool ssoSupported); + void versionOk(bool passwordSupported, bool ssoSupported, QVariantList identityProviders); private: void checkHomeserverVersion(); @@ -137,6 +158,8 @@ private: QString mxidError_; QString error_; + QVariantList identityProviders_; + bool passwordSupported_ = true; bool ssoSupported_ = false;