File indexing completed on 2024-12-08 04:33:09

0001 /*
0002 
0003  * SPDX-FileCopyrightText: 2020 Alessandro Ambrosano <alessandro.ambrosano@gmail.com>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.0-or-later
0006  *
0007  */
0008 
0009 #pragma once
0010 
0011 #include "ddpapi/ddpmanager.h"
0012 #include "libruqolacore_export.h"
0013 
0014 #include <QJsonObject>
0015 
0016 class LIBRUQOLACORE_EXPORT DDPAuthenticationManager : public DDPManager
0017 {
0018     Q_OBJECT
0019 
0020     enum class Method {
0021         Login,
0022         SendOtp,
0023         Logout,
0024         LogoutCleanUp,
0025     };
0026 
0027     static QString METHOD_LOGIN;
0028     static QString METHOD_SEND_OTP;
0029     static QString METHOD_LOGOUT;
0030     static QString METHOD_LOGOUT_CLEAN_UP;
0031 
0032 public:
0033     // state == LoginOngoing for all the time since the login request until a response
0034     //   comes back, then it may result in
0035     //   - LoggedIn
0036     //   - LoginOtpRequired
0037     //   - LoginFailedInvalidUserOrPassword
0038     //   - GenericError
0039     // state == LoginOtpAuthOngoing since when the otp code is sent to the server until
0040     //  a response comes back, then it may become:
0041     //   - LoggedIn
0042     //   - LoginFailedInvalidOtp
0043     //   - GenericError
0044     // state == LogoutOngoing since the logout request is sent until a response is received,
0045     //   next states could be
0046     //   - LoggedOut
0047     //   - GenericError
0048     // state == LogoutCleanUpOngoing since the clean up request is sent until a response is
0049     //   received, resulting in one of these states:
0050     //   - LoggedOutAndCleanedUp
0051     //   - GenericError
0052     // GenericError is used when the class doesn't know what else to do, and is irreversible
0053     enum LoginStatus {
0054         Connecting,
0055         LoginOngoing,
0056         LoggedIn,
0057         LoginFailedInvalidUserOrPassword,
0058         LoginOtpRequired,
0059         LoginOtpAuthOngoing,
0060         LoginFailedInvalidOtp,
0061         LogoutOngoing,
0062         LoggedOut,
0063         LogoutCleanUpOngoing,
0064         LoggedOutAndCleanedUp,
0065         FailedToLoginPluginProblem,
0066         LoginFailedUserNotActivated,
0067         LoginFailedLoginBlockForIp,
0068         LoginFailedLoginBlockedForUser,
0069         LoginFailedLoginAppNotAllowedToLogin,
0070         GenericError,
0071     };
0072     Q_ENUM(LoginStatus)
0073 
0074     explicit DDPAuthenticationManager(DDPClient *ddpClient, QObject *parent = nullptr);
0075     ~DDPAuthenticationManager() override;
0076 
0077     void login();
0078     void login(const QString &user, const QString &password);
0079     void loginLDAP(const QString &user, const QString &password); // TODO: LDAP options?
0080     void loginOAuth(const QString &credentialToken, const QString &credentialSecret);
0081     void sendOTP(const QString &otp);
0082     void logout();
0083 
0084     void setAuthToken(const QString &authToken);
0085 
0086     [[nodiscard]] QString userId() const;
0087     [[nodiscard]] QString authToken() const;
0088     [[nodiscard]] bool isLoggedIn() const;
0089     [[nodiscard]] bool isLoggedOut() const;
0090     [[nodiscard]] LoginStatus loginStatus() const;
0091     void setLoginStatus(LoginStatus newStatus);
0092 
0093     [[nodiscard]] qint64 tokenExpires() const;
0094 
0095 Q_SIGNALS:
0096     void loginStatusChanged();
0097 
0098 private:
0099     QString mUserId;
0100     QString mAuthToken;
0101     qint64 mTokenExpires;
0102     LoginStatus mLoginStatus = LoggedOut;
0103     // Used when sending OTP
0104     QJsonObject mLastLoginPayload;
0105 
0106     LIBRUQOLACORE_NO_EXPORT void processMethodResponseImpl(int operationId, const QJsonObject &response) override;
0107 
0108     // Authentication doesn't involve any subscriptions
0109     LIBRUQOLACORE_NO_EXPORT void processSubscriptionResultImpl(int subscriptionId, const QJsonObject &result) override
0110     {
0111         Q_UNUSED(subscriptionId)
0112         Q_UNUSED(result)
0113     }
0114 
0115     LIBRUQOLACORE_NO_EXPORT void loginImpl(const QJsonArray &params);
0116     LIBRUQOLACORE_NO_EXPORT void clientConnectedChangedSlot();
0117     [[nodiscard]] LIBRUQOLACORE_NO_EXPORT bool checkGenericError() const;
0118 };