mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 11:00:48 +03:00
Merge pull request #1523 from Nheko-Reborn/qmlFallbackAuth
QML the fallback auth dialog
This commit is contained in:
commit
ff079f6b6a
9 changed files with 149 additions and 124 deletions
|
@ -350,10 +350,6 @@ configure_file(cmake/nheko.h config/nheko.h)
|
||||||
# Declare source and header files.
|
# Declare source and header files.
|
||||||
#
|
#
|
||||||
set(SRC_FILES
|
set(SRC_FILES
|
||||||
# Dialogs
|
|
||||||
src/dialogs/FallbackAuth.cpp
|
|
||||||
src/dialogs/FallbackAuth.h
|
|
||||||
|
|
||||||
# Emoji
|
# Emoji
|
||||||
src/emoji/Provider.cpp
|
src/emoji/Provider.cpp
|
||||||
src/emoji/Provider.h
|
src/emoji/Provider.h
|
||||||
|
@ -463,6 +459,8 @@ set(SRC_FILES
|
||||||
src/Config.h
|
src/Config.h
|
||||||
src/EventAccessors.cpp
|
src/EventAccessors.cpp
|
||||||
src/EventAccessors.h
|
src/EventAccessors.h
|
||||||
|
src/FallbackAuth.cpp
|
||||||
|
src/FallbackAuth.h
|
||||||
src/ImagePackListModel.cpp
|
src/ImagePackListModel.cpp
|
||||||
src/ImagePackListModel.h
|
src/ImagePackListModel.h
|
||||||
src/InviteesModel.cpp
|
src/InviteesModel.cpp
|
||||||
|
@ -757,6 +755,7 @@ set(QML_SOURCES
|
||||||
resources/qml/dialogs/ConfirmJoinRoomDialog.qml
|
resources/qml/dialogs/ConfirmJoinRoomDialog.qml
|
||||||
resources/qml/dialogs/CreateDirect.qml
|
resources/qml/dialogs/CreateDirect.qml
|
||||||
resources/qml/dialogs/CreateRoom.qml
|
resources/qml/dialogs/CreateRoom.qml
|
||||||
|
resources/qml/dialogs/FallbackAuthDialog.qml
|
||||||
resources/qml/dialogs/HiddenEventsDialog.qml
|
resources/qml/dialogs/HiddenEventsDialog.qml
|
||||||
resources/qml/dialogs/EventExpirationDialog.qml
|
resources/qml/dialogs/EventExpirationDialog.qml
|
||||||
resources/qml/dialogs/ImageOverlay.qml
|
resources/qml/dialogs/ImageOverlay.qml
|
||||||
|
|
|
@ -385,6 +385,18 @@ Pane {
|
||||||
console.error("Failed to create component: " + component.errorString());
|
console.error("Failed to create component: " + component.errorString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function onFallbackAuth(fallback) {
|
||||||
|
var component = Qt.createComponent("qrc:/resources/qml/dialogs/FallbackAuthDialog.qml");
|
||||||
|
if (component.status == Component.Ready) {
|
||||||
|
var dialog = component.createObject(timelineRoot, {
|
||||||
|
"fallback": fallback
|
||||||
|
});
|
||||||
|
dialog.show();
|
||||||
|
destroyOnClose(dialog);
|
||||||
|
} else {
|
||||||
|
console.error("Failed to create component: " + component.errorString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
target: UIA
|
target: UIA
|
||||||
}
|
}
|
||||||
|
|
63
resources/qml/dialogs/FallbackAuthDialog.qml
Normal file
63
resources/qml/dialogs/FallbackAuthDialog.qml
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
// SPDX-FileCopyrightText: Nheko Contributors
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import im.nheko
|
||||||
|
|
||||||
|
ApplicationWindow {
|
||||||
|
id: fallbackRoot
|
||||||
|
|
||||||
|
required property FallbackAuth fallback
|
||||||
|
|
||||||
|
function accept() {
|
||||||
|
fallback.confirm();
|
||||||
|
fallbackRoot.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
function reject() {
|
||||||
|
fallback.cancel();
|
||||||
|
fallbackRoot.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
color: palette.window
|
||||||
|
title: qsTr("Fallback authentication")
|
||||||
|
flags: Qt.Tool | Qt.WindowStaysOnTopHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
|
||||||
|
height: msg.implicitHeight + footer.implicitHeight
|
||||||
|
width: Math.max(msg.implicitWidth, footer.implicitWidth)
|
||||||
|
|
||||||
|
Shortcut {
|
||||||
|
sequence: StandardKey.Cancel
|
||||||
|
onActivated: fallbackRoot.reject()
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: msg
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
padding: 8
|
||||||
|
text: qsTr("Open the fallback, follow the steps, and confirm after completing them.")
|
||||||
|
}
|
||||||
|
|
||||||
|
footer: DialogButtonBox {
|
||||||
|
onAccepted: fallbackRoot.accept()
|
||||||
|
onRejected: fallbackRoot.reject()
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: qsTr("Open Fallback in Browser")
|
||||||
|
onClicked: fallback.openFallbackAuth()
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: qsTr("Cancel")
|
||||||
|
DialogButtonBox.buttonRole: DialogButtonBox.RejectRole
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: qsTr("Confirm")
|
||||||
|
DialogButtonBox.buttonRole: DialogButtonBox.AcceptRole
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
29
src/FallbackAuth.cpp
Normal file
29
src/FallbackAuth.cpp
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// SPDX-FileCopyrightText: Nheko Contributors
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#include "FallbackAuth.h"
|
||||||
|
|
||||||
|
#include <QDesktopServices>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
|
#include "MatrixClient.h"
|
||||||
|
|
||||||
|
FallbackAuth::FallbackAuth(const QString &session, const QString &authType, QObject *parent)
|
||||||
|
: QObject{parent}
|
||||||
|
, m_session{session}
|
||||||
|
, m_authType{authType}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FallbackAuth::openFallbackAuth()
|
||||||
|
{
|
||||||
|
const auto url = QString("https://%1:%2/_matrix/client/r0/auth/%4/"
|
||||||
|
"fallback/web?session=%3")
|
||||||
|
.arg(QString::fromStdString(http::client()->server()))
|
||||||
|
.arg(http::client()->port())
|
||||||
|
.arg(m_session, m_authType);
|
||||||
|
|
||||||
|
QDesktopServices::openUrl(url);
|
||||||
|
}
|
32
src/FallbackAuth.h
Normal file
32
src/FallbackAuth.h
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
// SPDX-FileCopyrightText: Nheko Contributors
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QQmlEngine>
|
||||||
|
|
||||||
|
class FallbackAuth : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
QML_ELEMENT
|
||||||
|
QML_UNCREATABLE("")
|
||||||
|
|
||||||
|
Q_PROPERTY(QString authType MEMBER m_authType CONSTANT)
|
||||||
|
Q_PROPERTY(QString session MEMBER m_session CONSTANT)
|
||||||
|
|
||||||
|
public:
|
||||||
|
FallbackAuth(const QString &session, const QString &authType, QObject *parent = nullptr);
|
||||||
|
|
||||||
|
Q_INVOKABLE void openFallbackAuth();
|
||||||
|
Q_INVOKABLE void confirm() { emit confirmation(); }
|
||||||
|
Q_INVOKABLE void cancel() { emit cancelled(); }
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void confirmation();
|
||||||
|
void cancelled();
|
||||||
|
|
||||||
|
private:
|
||||||
|
const QString m_session;
|
||||||
|
const QString m_authType;
|
||||||
|
};
|
|
@ -1,75 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: Nheko Contributors
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#include <QDesktopServices>
|
|
||||||
#include <QLabel>
|
|
||||||
#include <QPushButton>
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QVBoxLayout>
|
|
||||||
|
|
||||||
#include "dialogs/FallbackAuth.h"
|
|
||||||
|
|
||||||
#include "Config.h"
|
|
||||||
#include "MatrixClient.h"
|
|
||||||
|
|
||||||
using namespace dialogs;
|
|
||||||
|
|
||||||
FallbackAuth::FallbackAuth(const QString &authType, const QString &session, QWidget *parent)
|
|
||||||
: QWidget(parent)
|
|
||||||
{
|
|
||||||
setAutoFillBackground(true);
|
|
||||||
setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint);
|
|
||||||
setWindowModality(Qt::WindowModal);
|
|
||||||
setAttribute(Qt::WA_DeleteOnClose, true);
|
|
||||||
|
|
||||||
auto layout = new QVBoxLayout(this);
|
|
||||||
layout->setSpacing(conf::modals::WIDGET_SPACING);
|
|
||||||
layout->setContentsMargins(conf::modals::WIDGET_MARGIN,
|
|
||||||
conf::modals::WIDGET_MARGIN,
|
|
||||||
conf::modals::WIDGET_MARGIN,
|
|
||||||
conf::modals::WIDGET_MARGIN);
|
|
||||||
|
|
||||||
auto buttonLayout = new QHBoxLayout();
|
|
||||||
buttonLayout->setSpacing(8);
|
|
||||||
buttonLayout->setContentsMargins(0, 0, 0, 0);
|
|
||||||
|
|
||||||
openBtn_ = new QPushButton(tr("Open Fallback in Browser"), this);
|
|
||||||
cancelBtn_ = new QPushButton(tr("Cancel"), this);
|
|
||||||
confirmBtn_ = new QPushButton(tr("Confirm"), this);
|
|
||||||
confirmBtn_->setDefault(true);
|
|
||||||
|
|
||||||
buttonLayout->addStretch(1);
|
|
||||||
buttonLayout->addWidget(openBtn_);
|
|
||||||
buttonLayout->addWidget(cancelBtn_);
|
|
||||||
buttonLayout->addWidget(confirmBtn_);
|
|
||||||
|
|
||||||
QFont font;
|
|
||||||
font.setPointSizeF(font.pointSizeF() * conf::modals::LABEL_MEDIUM_SIZE_RATIO);
|
|
||||||
|
|
||||||
auto label = new QLabel(
|
|
||||||
tr("Open the fallback, follow the steps, and confirm after completing them."), this);
|
|
||||||
label->setFont(font);
|
|
||||||
|
|
||||||
layout->addWidget(label);
|
|
||||||
layout->addLayout(buttonLayout);
|
|
||||||
|
|
||||||
connect(openBtn_, &QPushButton::clicked, [session, authType]() {
|
|
||||||
const auto url = QString("https://%1:%2/_matrix/client/r0/auth/%4/"
|
|
||||||
"fallback/web?session=%3")
|
|
||||||
.arg(QString::fromStdString(http::client()->server()))
|
|
||||||
.arg(http::client()->port())
|
|
||||||
.arg(session, authType);
|
|
||||||
|
|
||||||
QDesktopServices::openUrl(url);
|
|
||||||
});
|
|
||||||
|
|
||||||
connect(confirmBtn_, &QPushButton::clicked, this, [this]() {
|
|
||||||
emit confirmation();
|
|
||||||
emit close();
|
|
||||||
});
|
|
||||||
connect(cancelBtn_, &QPushButton::clicked, this, [this]() {
|
|
||||||
emit cancel();
|
|
||||||
emit close();
|
|
||||||
});
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: Nheko Contributors
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
class QPushButton;
|
|
||||||
class QLabel;
|
|
||||||
|
|
||||||
namespace dialogs {
|
|
||||||
|
|
||||||
class FallbackAuth final : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
FallbackAuth(const QString &authType, const QString &session, QWidget *parent = nullptr);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void confirmation();
|
|
||||||
void cancel();
|
|
||||||
|
|
||||||
private:
|
|
||||||
QPushButton *openBtn_;
|
|
||||||
QPushButton *confirmBtn_;
|
|
||||||
QPushButton *cancelBtn_;
|
|
||||||
};
|
|
||||||
} // dialogs
|
|
|
@ -13,8 +13,6 @@
|
||||||
|
|
||||||
#include "Logging.h"
|
#include "Logging.h"
|
||||||
#include "MatrixClient.h"
|
#include "MatrixClient.h"
|
||||||
#include "ReCaptcha.h"
|
|
||||||
#include "dialogs/FallbackAuth.h"
|
|
||||||
|
|
||||||
UIA *
|
UIA *
|
||||||
UIA::instance()
|
UIA::instance()
|
||||||
|
@ -132,23 +130,18 @@ UIA::genericHandler(QString context)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// use fallback
|
// use fallback
|
||||||
auto dialog = new dialogs::FallbackAuth(QString::fromStdString(current_stage),
|
auto fallback = new FallbackAuth(QString::fromStdString(u.session),
|
||||||
QString::fromStdString(u.session),
|
QString::fromStdString(current_stage),
|
||||||
nullptr);
|
nullptr);
|
||||||
dialog->setWindowTitle(context);
|
QQmlEngine::setObjectOwnership(fallback, QQmlEngine::JavaScriptOwnership);
|
||||||
|
connect(fallback, &FallbackAuth::confirmation, this, [h, u]() {
|
||||||
connect(dialog, &dialogs::FallbackAuth::confirmation, this, [h, u, dialog]() {
|
|
||||||
dialog->close();
|
|
||||||
dialog->deleteLater();
|
|
||||||
h.next(mtx::user_interactive::Auth{u.session,
|
h.next(mtx::user_interactive::Auth{u.session,
|
||||||
mtx::user_interactive::auth::Fallback{}});
|
mtx::user_interactive::auth::Fallback{}});
|
||||||
});
|
});
|
||||||
|
connect(fallback, &FallbackAuth::cancelled, this, [this]() {
|
||||||
connect(dialog, &dialogs::FallbackAuth::cancel, this, [this]() {
|
|
||||||
emit error(tr("Registration aborted"));
|
emit error(tr("Registration aborted"));
|
||||||
});
|
});
|
||||||
|
emit fallbackAuth(fallback);
|
||||||
dialog->show();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include <mtxclient/http/client.hpp>
|
#include <mtxclient/http/client.hpp>
|
||||||
|
|
||||||
|
#include "FallbackAuth.h"
|
||||||
#include "ReCaptcha.h"
|
#include "ReCaptcha.h"
|
||||||
|
|
||||||
class UIA final : public QObject
|
class UIA final : public QObject
|
||||||
|
@ -62,6 +63,7 @@ signals:
|
||||||
void email();
|
void email();
|
||||||
void phoneNumber();
|
void phoneNumber();
|
||||||
void reCaptcha(ReCaptcha *recaptcha);
|
void reCaptcha(ReCaptcha *recaptcha);
|
||||||
|
void fallbackAuth(FallbackAuth *fallback);
|
||||||
|
|
||||||
void confirm3pidToken();
|
void confirm3pidToken();
|
||||||
void prompt3pidToken();
|
void prompt3pidToken();
|
||||||
|
|
Loading…
Reference in a new issue