From 9482ac4e7acd23b1873450be977c50526677b1a3 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sun, 6 Mar 2022 19:51:17 +0100 Subject: Allow explicit selection of SSO method fixes #975 --- src/LoginPage.cpp | 67 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 19 deletions(-) (limited to 'src/LoginPage.cpp') 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"); + [[maybe_unused]] static auto ignored2 = qRegisterMetaType(); 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); - - 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); - }); + http::client()->get_login([this](mtx::responses::LoginFlows flows, + mtx::http::RequestErr err) { + if (err || flows.flows.empty()) + emit versionOkCb(true, false, {}); + + 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; -- cgit 1.5.1 From ac1d6782547223bbd58137cc84ea331477f2438d Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 7 Mar 2022 05:26:12 +0100 Subject: Fix server switching to https after bootstrap fixes #878 --- CMakeLists.txt | 2 +- io.github.NhekoReborn.Nheko.yaml | 2 +- resources/qml/Root.qml | 3 ++- src/LoginPage.cpp | 6 ++++-- src/MainWindow.cpp | 3 +-- 5 files changed, 9 insertions(+), 7 deletions(-) (limited to 'src/LoginPage.cpp') diff --git a/CMakeLists.txt b/CMakeLists.txt index d350e71a..81d13be5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -405,7 +405,7 @@ if(USE_BUNDLED_MTXCLIENT) FetchContent_Declare( MatrixClient GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git - GIT_TAG e1b75074b501d2d3e0100d1170b3edef8a00799c + GIT_TAG a3fec0ae53762a8a482cde50c9709671bcf0548d ) set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "") set(BUILD_LIB_TESTS OFF CACHE INTERNAL "") diff --git a/io.github.NhekoReborn.Nheko.yaml b/io.github.NhekoReborn.Nheko.yaml index 31248a28..84743987 100644 --- a/io.github.NhekoReborn.Nheko.yaml +++ b/io.github.NhekoReborn.Nheko.yaml @@ -189,7 +189,7 @@ modules: buildsystem: cmake-ninja name: mtxclient sources: - - commit: e1b75074b501d2d3e0100d1170b3edef8a00799c + - commit: a3fec0ae53762a8a482cde50c9709671bcf0548d #tag: v0.6.2 type: git url: https://github.com/Nheko-Reborn/mtxclient.git diff --git a/resources/qml/Root.qml b/resources/qml/Root.qml index 14e6770b..c8c05a3e 100644 --- a/resources/qml/Root.qml +++ b/resources/qml/Root.qml @@ -222,7 +222,8 @@ Pane { } function destroyOnClose(obj) { - obj.closing.connect(() => obj.destroy()); + if (obj.closing != undefined) obj.closing.connect(() => obj.destroy()); + else if (obj.closed != undefined) obj.closed.connect(() => obj.destroy()); } function destroyOnClosed(obj) { diff --git a/src/LoginPage.cpp b/src/LoginPage.cpp index cdc2262f..6a83376c 100644 --- a/src/LoginPage.cpp +++ b/src/LoginPage.cpp @@ -163,6 +163,8 @@ LoginPage::checkHomeserverVersion() return; } + nhlog::net()->error("Error requesting versions: {}", *err); + emit versionErrorCb( tr("An unknown error occured. Make sure the homeserver domain is valid.")); return; @@ -276,7 +278,7 @@ LoginPage::onLoginButtonClicked(LoginMethod loginMethod, if (res.well_known) { http::client()->set_server(res.well_known->homeserver.base_url); - nhlog::net()->info("Login requested to user server: " + + nhlog::net()->info("Login requested to use server: " + res.well_known->homeserver.base_url); } @@ -301,7 +303,7 @@ LoginPage::onLoginButtonClicked(LoginMethod loginMethod, if (res.well_known) { http::client()->set_server(res.well_known->homeserver.base_url); - nhlog::net()->info("Login requested to user server: " + + nhlog::net()->info("Login requested to use server: " + res.well_known->homeserver.base_url); } diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index f3893998..73e556f7 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -338,8 +338,7 @@ MainWindow::showChatPage() { auto userid = QString::fromStdString(http::client()->user_id().to_string()); auto device_id = QString::fromStdString(http::client()->device_id()); - auto homeserver = QString::fromStdString(http::client()->server() + ":" + - std::to_string(http::client()->port())); + auto homeserver = QString::fromStdString(http::client()->server_url()); auto token = QString::fromStdString(http::client()->access_token()); userSettings_.data()->setUserId(userid); -- cgit 1.5.1