Compare commits
1 Commits
master
...
work/tobia
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5edb3e5145 |
@@ -9,12 +9,18 @@
|
|||||||
#include <KLocalizedString>
|
#include <KLocalizedString>
|
||||||
|
|
||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
#include <QRandomGenerator>
|
||||||
|
#include <QTcpServer>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
|
#include <QCoroNetworkReply>
|
||||||
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
#include <Quotient/accountregistry.h>
|
#include <Quotient/accountregistry.h>
|
||||||
#include <Quotient/csapi/notifications.h>
|
#include <Quotient/csapi/notifications.h>
|
||||||
|
#include <Quotient/csapi/wellknown.h>
|
||||||
#include <Quotient/qt_connection_util.h>
|
#include <Quotient/qt_connection_util.h>
|
||||||
#include <Quotient/settings.h>
|
#include <Quotient/settings.h>
|
||||||
|
|
||||||
@@ -45,6 +51,7 @@
|
|||||||
bool testMode = false;
|
bool testMode = false;
|
||||||
|
|
||||||
using namespace Quotient;
|
using namespace Quotient;
|
||||||
|
using namespace Qt::Literals::StringLiterals;
|
||||||
|
|
||||||
Controller::Controller(QObject *parent)
|
Controller::Controller(QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
@@ -210,7 +217,12 @@ void Controller::invokeLogin()
|
|||||||
connect(connection, &NeoChatConnection::networkError, this, [this](const QString &error, const QString &, int, int) {
|
connect(connection, &NeoChatConnection::networkError, this, [this](const QString &error, const QString &, int, int) {
|
||||||
Q_EMIT errorOccured(i18n("Network Error: %1", error), {});
|
Q_EMIT errorOccured(i18n("Network Error: %1", error), {});
|
||||||
});
|
});
|
||||||
connection->assumeIdentity(account.userId(), accessToken);
|
|
||||||
|
if (!account.clientId().isEmpty()) {
|
||||||
|
connection->assumeOidcIdentity(account.userId(), accessToken, account.clientId(), account.tokenEndpoint());
|
||||||
|
} else {
|
||||||
|
connection->assumeIdentity(account.userId(), accessToken);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -416,4 +428,22 @@ bool Controller::csSupported() const
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NeoChatConnection *Controller::pendingOidcConnection() const
|
||||||
|
{
|
||||||
|
return m_pendingOidcConnection.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Controller::startOidcLogin(const QString &homeserver)
|
||||||
|
{
|
||||||
|
auto url = QUrl::fromUserInput(homeserver.startsWith(u"https:"_s) ? homeserver : u"https://%1"_s.arg(homeserver));
|
||||||
|
m_pendingOidcConnection = new NeoChatConnection(url, this);
|
||||||
|
Q_EMIT pendingOidcConnectionChanged();
|
||||||
|
m_pendingOidcConnection->startOidcLogin();
|
||||||
|
connect(m_pendingOidcConnection, &Connection::connected, this, [this]() {
|
||||||
|
m_pendingOidcConnection->loadState();
|
||||||
|
addConnection(m_pendingOidcConnection);
|
||||||
|
setActiveConnection(m_pendingOidcConnection);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
#include "moc_controller.cpp"
|
#include "moc_controller.cpp"
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ class Controller : public QObject
|
|||||||
|
|
||||||
Q_PROPERTY(bool csSupported READ csSupported CONSTANT)
|
Q_PROPERTY(bool csSupported READ csSupported CONSTANT)
|
||||||
|
|
||||||
|
Q_PROPERTY(NeoChatConnection *pendingOidcConnection READ pendingOidcConnection NOTIFY pendingOidcConnectionChanged)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* @brief Define the types on inline messages that can be shown.
|
* @brief Define the types on inline messages that can be shown.
|
||||||
@@ -106,8 +108,12 @@ public:
|
|||||||
|
|
||||||
Q_INVOKABLE void removeConnection(const QString &userId);
|
Q_INVOKABLE void removeConnection(const QString &userId);
|
||||||
|
|
||||||
|
Q_INVOKABLE void startOidcLogin(const QString &homeserver);
|
||||||
|
|
||||||
bool csSupported() const;
|
bool csSupported() const;
|
||||||
|
|
||||||
|
NeoChatConnection *pendingOidcConnection() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit Controller(QObject *parent = nullptr);
|
explicit Controller(QObject *parent = nullptr);
|
||||||
|
|
||||||
@@ -119,10 +125,13 @@ private:
|
|||||||
void loadSettings();
|
void loadSettings();
|
||||||
void saveSettings() const;
|
void saveSettings() const;
|
||||||
|
|
||||||
|
QCoro::Task<void> doStartOidcLogin(QString homeserver);
|
||||||
|
|
||||||
Quotient::AccountRegistry m_accountRegistry;
|
Quotient::AccountRegistry m_accountRegistry;
|
||||||
QStringList m_accountsLoading;
|
QStringList m_accountsLoading;
|
||||||
QMap<QString, QPointer<NeoChatConnection>> m_connectionsLoading;
|
QMap<QString, QPointer<NeoChatConnection>> m_connectionsLoading;
|
||||||
QString m_endpoint;
|
QString m_endpoint;
|
||||||
|
QPointer<NeoChatConnection> m_pendingOidcConnection;
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void invokeLogin();
|
void invokeLogin();
|
||||||
@@ -136,4 +145,5 @@ Q_SIGNALS:
|
|||||||
void activeConnectionChanged(NeoChatConnection *connection);
|
void activeConnectionChanged(NeoChatConnection *connection);
|
||||||
void accountsLoadingChanged();
|
void accountsLoadingChanged();
|
||||||
void showMessage(MessageType messageType, const QString &message);
|
void showMessage(MessageType messageType, const QString &message);
|
||||||
|
void pendingOidcConnectionChanged();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -20,4 +20,5 @@ ecm_add_qml_module(login GENERATE_PLUGIN_SOURCE
|
|||||||
Sso.qml
|
Sso.qml
|
||||||
Terms.qml
|
Terms.qml
|
||||||
Username.qml
|
Username.qml
|
||||||
|
Oidc.qml
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -31,4 +31,11 @@ LoginStep {
|
|||||||
text: i18nc("@action:button", "Register")
|
text: i18nc("@action:button", "Register")
|
||||||
onClicked: root.processed("Homeserver")
|
onClicked: root.processed("Homeserver")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FormCard.FormDelegateSeparator {}
|
||||||
|
|
||||||
|
FormCard.FormButtonDelegate {
|
||||||
|
text: i18nc("@action:button", "Login with OIDC")
|
||||||
|
onClicked: root.processed("Oidc")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
74
src/login/Oidc.qml
Normal file
74
src/login/Oidc.qml
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2024 Tobias Fella <tobias.fella@kde.org>
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Layouts
|
||||||
|
|
||||||
|
import org.kde.kirigamiaddons.formcard as FormCard
|
||||||
|
|
||||||
|
import org.kde.neochat
|
||||||
|
|
||||||
|
LoginStep {
|
||||||
|
id: root
|
||||||
|
FormCard.FormTextFieldDelegate {
|
||||||
|
id: homeserver
|
||||||
|
|
||||||
|
visible: !infoLabel.visible
|
||||||
|
label: i18n("Homeserver")
|
||||||
|
text: "synapse-oidc.element.dev"
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: Controller.pendingOidcConnection
|
||||||
|
function onOpenOidcUrl(url: string): void {
|
||||||
|
infoLabel.url = url;
|
||||||
|
infoLabel.visible = true;
|
||||||
|
}
|
||||||
|
function onConnected(): void {
|
||||||
|
root.processed("Loading");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FormCard.FormTextDelegate {
|
||||||
|
id: infoLabel
|
||||||
|
|
||||||
|
property string url: ""
|
||||||
|
visible: false
|
||||||
|
text: i18n("To continue, please open the following link in your web browser: %1", "<br /><br /><a href='" + url + "'>" + url + "</a>")
|
||||||
|
onLinkActivated: url => Qt.openUrlExternally(url)
|
||||||
|
}
|
||||||
|
FormCard.FormDelegateSeparator { above: openLink }
|
||||||
|
|
||||||
|
FormCard.FormButtonDelegate {
|
||||||
|
id: openLink
|
||||||
|
visible: infoLabel.visible
|
||||||
|
text: i18n("Open Authorization Link")
|
||||||
|
icon.name: "document-open"
|
||||||
|
onClicked: Qt.openUrlExternally(infoLabel.url.authorizeUrl)
|
||||||
|
}
|
||||||
|
|
||||||
|
FormCard.FormDelegateSeparator {
|
||||||
|
visible: infoLabel.visible
|
||||||
|
above: openLink
|
||||||
|
below: copyLink
|
||||||
|
}
|
||||||
|
|
||||||
|
FormCard.FormButtonDelegate {
|
||||||
|
id: copyLink
|
||||||
|
|
||||||
|
visible: infoLabel.visible
|
||||||
|
text: i18n("Copy Authorization Link")
|
||||||
|
icon.name: "edit-copy"
|
||||||
|
onClicked: {
|
||||||
|
Clipboard.saveText(infoLabel.url)
|
||||||
|
applicationWindow().showPassiveNotification(i18n("Link copied."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FormCard.FormButtonDelegate {
|
||||||
|
visible: !infoLabel.visible
|
||||||
|
text: i18nc("@action:button", "Log in with OIDC")
|
||||||
|
onClicked: Controller.startOidcLogin(homeserver.text)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include <KLocalizedString>
|
#include <KLocalizedString>
|
||||||
|
|
||||||
|
#include <Quotient/connectiondata.h>
|
||||||
#include <Quotient/csapi/content-repo.h>
|
#include <Quotient/csapi/content-repo.h>
|
||||||
#include <Quotient/csapi/profile.h>
|
#include <Quotient/csapi/profile.h>
|
||||||
#include <Quotient/csapi/versions.h>
|
#include <Quotient/csapi/versions.h>
|
||||||
@@ -148,6 +149,17 @@ void NeoChatConnection::connectSignals()
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
Qt::SingleShotConnection);
|
Qt::SingleShotConnection);
|
||||||
|
|
||||||
|
connect(this, &Connection::refreshTokenChanged, this, [this]() {
|
||||||
|
QKeychain::WritePasswordJob job(qAppName());
|
||||||
|
job.setAutoDelete(true);
|
||||||
|
job.setKey(userId());
|
||||||
|
job.setBinaryData(connectionData()->refreshToken().toLatin1());
|
||||||
|
QEventLoop loop;
|
||||||
|
connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
|
||||||
|
job.start();
|
||||||
|
loop.exec();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
int NeoChatConnection::badgeNotificationCount() const
|
int NeoChatConnection::badgeNotificationCount() const
|
||||||
|
|||||||
@@ -54,6 +54,16 @@ Kirigami.ApplicationWindow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
id: pendingOidcConnections
|
||||||
|
target: Controller.pendingOidcConnection
|
||||||
|
function onConnected() {
|
||||||
|
console.warn("loading rooms")
|
||||||
|
root.load();
|
||||||
|
pendingOidcConnections.enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: root.quitAction
|
target: root.quitAction
|
||||||
function onTriggered() {
|
function onTriggered() {
|
||||||
|
|||||||
Reference in New Issue
Block a user