summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorLoren Burkholder <computersemiexpert@outlook.com>2023-06-28 17:00:34 -0400
committerLoren Burkholder <computersemiexpert@outlook.com>2023-07-06 08:35:37 -0400
commitfedc178827c5648b0ccbdd2cd08dcebc920ac416 (patch)
tree7c6c59b60899d8c7a321bea8fe44c7d04f79040f /src
parentRemove unneeded forward declaration (diff)
downloadnheko-fedc178827c5648b0ccbdd2cd08dcebc920ac416.tar.xz
Port the reCAPTCHA dialog to QML
Diffstat (limited to 'src')
-rw-r--r--src/ReCaptcha.cpp28
-rw-r--r--src/ReCaptcha.h32
-rw-r--r--src/dialogs/ReCaptcha.cpp74
-rw-r--r--src/dialogs/ReCaptcha.h29
-rw-r--r--src/ui/UIA.cpp28
-rw-r--r--src/ui/UIA.h5
6 files changed, 74 insertions, 122 deletions
diff --git a/src/ReCaptcha.cpp b/src/ReCaptcha.cpp
new file mode 100644
index 00000000..ffd202f5
--- /dev/null
+++ b/src/ReCaptcha.cpp
@@ -0,0 +1,28 @@
+// SPDX-FileCopyrightText: Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "ReCaptcha.h"
+
+#include <QDesktopServices>
+#include <QUrl>
+
+#include "MatrixClient.h"
+
+ReCaptcha::ReCaptcha(const QString &session, const QString &context, QObject *parent)
+    : QObject{parent},
+      m_session{session},
+      m_context{context}
+{
+}
+
+void ReCaptcha::openReCaptcha()
+{
+    const auto url = QString("https://%1:%2/_matrix/client/r0/auth/m.login.recaptcha/"
+                             "fallback/web?session=%3")
+                       .arg(QString::fromStdString(http::client()->server()))
+                       .arg(http::client()->port())
+                       .arg(m_session);
+
+    QDesktopServices::openUrl(url);
+}
diff --git a/src/ReCaptcha.h b/src/ReCaptcha.h
new file mode 100644
index 00000000..84d65478
--- /dev/null
+++ b/src/ReCaptcha.h
@@ -0,0 +1,32 @@
+// SPDX-FileCopyrightText: Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include <QQmlEngine>
+
+class ReCaptcha : public QObject
+{
+    Q_OBJECT
+    QML_ELEMENT
+    QML_UNCREATABLE("")
+
+    Q_PROPERTY(QString context MEMBER m_context CONSTANT)
+    Q_PROPERTY(QString session MEMBER m_session CONSTANT)
+
+public:
+    ReCaptcha(const QString &session, const QString &context, QObject *parent = nullptr);
+
+    Q_INVOKABLE void openReCaptcha();
+    Q_INVOKABLE void confirm() { emit confirmation(); }
+    Q_INVOKABLE void cancel() { emit cancelled(); }
+
+signals:
+    void confirmation();
+    void cancelled();
+
+private:
+    QString m_session;
+    QString m_context;
+};
diff --git a/src/dialogs/ReCaptcha.cpp b/src/dialogs/ReCaptcha.cpp
deleted file mode 100644
index 2abf7c07..00000000
--- a/src/dialogs/ReCaptcha.cpp
+++ /dev/null
@@ -1,74 +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/ReCaptcha.h"
-
-#include "Config.h"
-#include "MatrixClient.h"
-
-using namespace dialogs;
-
-ReCaptcha::ReCaptcha(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->setContentsMargins(0, 0, 0, 0);
-    buttonLayout->setSpacing(8);
-
-    openCaptchaBtn_ = new QPushButton(tr("Open reCAPTCHA"), this);
-    cancelBtn_      = new QPushButton(tr("Cancel"), this);
-    confirmBtn_     = new QPushButton(tr("Confirm"), this);
-    confirmBtn_->setDefault(true);
-
-    buttonLayout->addStretch(1);
-    buttonLayout->addWidget(openCaptchaBtn_);
-    buttonLayout->addWidget(cancelBtn_);
-    buttonLayout->addWidget(confirmBtn_);
-
-    QFont font;
-    font.setPointSizeF(font.pointSizeF() * conf::modals::LABEL_MEDIUM_SIZE_RATIO);
-
-    auto label = new QLabel(tr("Solve the reCAPTCHA and press the confirm button"), this);
-    label->setFont(font);
-
-    layout->addWidget(label);
-    layout->addLayout(buttonLayout);
-
-    connect(openCaptchaBtn_, &QPushButton::clicked, [session]() {
-        const auto url = QString("https://%1:%2/_matrix/client/r0/auth/m.login.recaptcha/"
-                                 "fallback/web?session=%3")
-                           .arg(QString::fromStdString(http::client()->server()))
-                           .arg(http::client()->port())
-                           .arg(session);
-
-        QDesktopServices::openUrl(url);
-    });
-
-    connect(confirmBtn_, &QPushButton::clicked, this, [this]() {
-        emit confirmation();
-        close();
-    });
-    connect(cancelBtn_, &QPushButton::clicked, this, [this]() {
-        emit cancel();
-        close();
-    });
-}
diff --git a/src/dialogs/ReCaptcha.h b/src/dialogs/ReCaptcha.h
deleted file mode 100644
index 53c7453e..00000000
--- a/src/dialogs/ReCaptcha.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// SPDX-FileCopyrightText: Nheko Contributors
-//
-// SPDX-License-Identifier: GPL-3.0-or-later
-
-#pragma once
-
-#include <QWidget>
-
-class QPushButton;
-
-namespace dialogs {
-
-class ReCaptcha final : public QWidget
-{
-    Q_OBJECT
-
-public:
-    ReCaptcha(const QString &session, QWidget *parent = nullptr);
-
-signals:
-    void confirmation();
-    void cancel();
-
-private:
-    QPushButton *openCaptchaBtn_;
-    QPushButton *confirmBtn_;
-    QPushButton *cancelBtn_;
-};
-} // dialogs
diff --git a/src/ui/UIA.cpp b/src/ui/UIA.cpp
index 2b6b059a..ba35df9b 100644
--- a/src/ui/UIA.cpp
+++ b/src/ui/UIA.cpp
@@ -14,12 +14,12 @@
 #include "Logging.h"
 #include "MatrixClient.h"
 #include "dialogs/FallbackAuth.h"
-#include "dialogs/ReCaptcha.h"
+#include "ReCaptcha.h"
 
 UIA *
 UIA::instance()
 {
-    static UIA uia;
+    static UIA uia{nullptr};
     return &uia;
 }
 
@@ -99,24 +99,16 @@ UIA::genericHandler(QString context)
             } else if (current_stage == mtx::user_interactive::auth_types::msisdn) {
                 emit phoneNumber();
             } else if (current_stage == mtx::user_interactive::auth_types::recaptcha) {
-                auto captchaDialog =
-                  new dialogs::ReCaptcha(QString::fromStdString(u.session), nullptr);
-                captchaDialog->setWindowTitle(context);
-
-                connect(
-                  captchaDialog, &dialogs::ReCaptcha::confirmation, this, [captchaDialog, h, u]() {
-                      captchaDialog->close();
-                      captchaDialog->deleteLater();
-                      h.next(mtx::user_interactive::Auth{u.session,
-                                                         mtx::user_interactive::auth::Fallback{}});
-                  });
-
-                connect(captchaDialog, &dialogs::ReCaptcha::cancel, this, [this]() {
+                auto captcha = new ReCaptcha(QString::fromStdString(u.session), context, nullptr);
+                QQmlEngine::setObjectOwnership(captcha, QQmlEngine::JavaScriptOwnership);
+                connect(captcha, &ReCaptcha::confirmation, this, [h, u]() {
+                    h.next(mtx::user_interactive::Auth{u.session,
+                                                       mtx::user_interactive::auth::Fallback{}});
+                });
+                connect(captcha, &ReCaptcha::cancelled, this, [this]() {
                     emit error(tr("Registration aborted"));
                 });
-
-                QTimer::singleShot(0, this, [captchaDialog]() { captchaDialog->show(); });
-
+                emit reCaptcha(captcha);
             } else if (current_stage == mtx::user_interactive::auth_types::dummy) {
                 h.next(
                   mtx::user_interactive::Auth{u.session, mtx::user_interactive::auth::Dummy{}});
diff --git a/src/ui/UIA.h b/src/ui/UIA.h
index 414cb804..5b5eb9f4 100644
--- a/src/ui/UIA.h
+++ b/src/ui/UIA.h
@@ -9,6 +9,8 @@
 
 #include <mtxclient/http/client.hpp>
 
+#include "ReCaptcha.h"
+
 class UIA final : public QObject
 {
     Q_OBJECT
@@ -39,7 +41,7 @@ public:
         return instance();
     }
 
-    UIA(QObject *parent = nullptr)
+    UIA(QObject *parent)
       : QObject(parent)
     {
     }
@@ -59,6 +61,7 @@ signals:
     void password();
     void email();
     void phoneNumber();
+    void reCaptcha(ReCaptcha *recaptcha);
 
     void confirm3pidToken();
     void prompt3pidToken();