File indexing completed on 2024-05-05 16:58:51

0001 // SPDX-FileCopyrightText: 2020 Tobias Fella <tobias.fella@kde.org>
0002 // SPDX-License-Identifier: GPL-2.0-or-later
0003 
0004 #pragma once
0005 
0006 #include <QObject>
0007 #include <QUrl>
0008 
0009 namespace Quotient
0010 {
0011 class Connection;
0012 }
0013 
0014 /**
0015  * @class Login
0016  *
0017  * A helper class for logging into a Matrix account.
0018  */
0019 class Login : public QObject
0020 {
0021     Q_OBJECT
0022 
0023     /**
0024      * @brief Whether the home server for the account is reachable.
0025      */
0026     Q_PROPERTY(bool homeserverReachable READ homeserverReachable NOTIFY homeserverReachableChanged)
0027 
0028     /**
0029      * @brief Whether the connection to the home server is being tested.
0030      *
0031      * True if NeoChat is trying to resolve the home server, false if not started
0032      * or complete.
0033      */
0034     Q_PROPERTY(bool testing READ testing NOTIFY testingChanged)
0035 
0036     /**
0037      * @brief The Matrix ID of the account that is being logged into.
0038      */
0039     Q_PROPERTY(QString matrixId READ matrixId WRITE setMatrixId NOTIFY matrixIdChanged)
0040 
0041     /**
0042      * @brief The password entered by the user to login to the account.
0043      */
0044     Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged)
0045 
0046     /**
0047      * @brief The device name to assign to this session.
0048      */
0049     Q_PROPERTY(QString deviceName READ deviceName WRITE setDeviceName NOTIFY deviceNameChanged)
0050 
0051     /**
0052      * @brief Whether the home server of the account supports single sign on login.
0053      */
0054     Q_PROPERTY(bool supportsSso READ supportsSso NOTIFY loginFlowsChanged STORED false)
0055 
0056     /**
0057      * @brief Whether the home server of the account supports password login.
0058      */
0059     Q_PROPERTY(bool supportsPassword READ supportsPassword NOTIFY loginFlowsChanged STORED false)
0060 
0061     /**
0062      * @brief The URL for the single sign on session.
0063      */
0064     Q_PROPERTY(QUrl ssoUrl READ ssoUrl NOTIFY ssoUrlChanged)
0065 
0066     /**
0067      * @brief Whether login process is ongoing.
0068      */
0069     Q_PROPERTY(bool isLoggingIn READ isLoggingIn NOTIFY isLoggingInChanged)
0070 
0071     /**
0072      * @brief Whether login has successfully completed.
0073      */
0074     Q_PROPERTY(bool isLoggedIn READ isLoggedIn NOTIFY isLoggedInChanged)
0075 
0076 public:
0077     explicit Login(QObject *parent = nullptr);
0078 
0079     Q_INVOKABLE void init();
0080 
0081     bool homeserverReachable() const;
0082 
0083     QString matrixId() const;
0084     void setMatrixId(const QString &matrixId);
0085 
0086     QString password() const;
0087     void setPassword(const QString &password);
0088 
0089     QString deviceName() const;
0090     void setDeviceName(const QString &deviceName);
0091 
0092     bool supportsPassword() const;
0093     bool supportsSso() const;
0094 
0095     bool testing() const;
0096 
0097     QUrl ssoUrl() const;
0098 
0099     bool isLoggingIn() const;
0100 
0101     bool isLoggedIn() const;
0102 
0103     Q_INVOKABLE void login();
0104     Q_INVOKABLE void loginWithSso();
0105 
0106 Q_SIGNALS:
0107     void homeserverReachableChanged();
0108     void testHomeserverFinished();
0109     void matrixIdChanged();
0110     void passwordChanged();
0111     void deviceNameChanged();
0112     void loginFlowsChanged();
0113     void ssoUrlChanged();
0114     void connected();
0115     void errorOccured(const QString &message);
0116     void testingChanged();
0117     void isLoggingInChanged();
0118     void isLoggedInChanged();
0119 
0120 private:
0121     void setHomeserverReachable(bool reachable);
0122 
0123     bool m_homeserverReachable;
0124     QString m_matrixId;
0125     QString m_password;
0126     QString m_deviceName;
0127     bool m_supportsSso = false;
0128     bool m_supportsPassword = false;
0129     Quotient::Connection *m_connection = nullptr;
0130     QUrl m_ssoUrl;
0131     bool m_testing = false;
0132     bool m_isLoggingIn = false;
0133     bool m_isLoggedIn = false;
0134 };