File indexing completed on 2024-04-28 05:50:06

0001 /*
0002  * SPDX-License-Identifier: GPL-3.0-or-later
0003  * SPDX-FileCopyrightText: 2020 Johan Ouwerkerk <jm.ouwerkerk@gmail.com>
0004  */
0005 #ifndef ACCOUNTS_ACTIONS_P_H
0006 #define ACCOUNTS_ACTIONS_P_H
0007 
0008 #include "account.h"
0009 
0010 #include <QObject>
0011 #include <QDateTime>
0012 #include <QSet>
0013 #include <QSettings>
0014 #include <QString>
0015 #include <QUuid>
0016 #include <QVector>
0017 
0018 #include <functional>
0019 #include <optional>
0020 
0021 #include "../secrets/secrets.h"
0022 #include "keys.h"
0023 
0024 namespace accounts
0025 {
0026     class AccountJob: public QObject // clazy:exclude=ctor-missing-parent-argument
0027     {
0028         Q_OBJECT
0029     public:
0030         explicit AccountJob();
0031         virtual ~AccountJob();
0032     public Q_SLOTS:
0033         virtual void run(void);
0034     Q_SIGNALS:
0035         void finished(void);
0036     };
0037 
0038     class Null: public AccountJob // clazy:exclude=ctor-missing-parent-argument
0039     {
0040         Q_OBJECT
0041     public:
0042         explicit Null();
0043         void run(void) override;
0044     };
0045 
0046     class RequestAccountPassword: public AccountJob // clazy:exclude=ctor-missing-parent-argument
0047     {
0048         Q_OBJECT
0049     public:
0050         explicit RequestAccountPassword(const SettingsProvider &settings, AccountSecret *secret);
0051         void run(void) override;
0052     private Q_SLOTS:
0053         void fail(void);
0054         void unlock(void);
0055         void finish(void);
0056     Q_SIGNALS:
0057         void unlocked(void);
0058         void failed(void);
0059     private:
0060         const SettingsProvider m_settings;
0061         AccountSecret * const m_secret;
0062     private:
0063         bool m_failed;
0064         bool m_succeeded;
0065     };
0066 
0067     class LoadAccounts: public AccountJob // clazy:exclude=ctor-missing-parent-argument
0068     {
0069         Q_OBJECT
0070     public:
0071         explicit LoadAccounts(const SettingsProvider &settings, const AccountSecret *secret,
0072                               const std::function<qint64(void)> &clock = &QDateTime::currentMSecsSinceEpoch);
0073         void run(void) override;
0074     Q_SIGNALS:
0075         void foundHotp(const QUuid id, const QString name, const QString issuer,
0076                        const QByteArray secret, const QByteArray nonce, uint tokenLength,
0077                        quint64 counter, bool fixedTruncation, uint offset, bool checksum);
0078         void foundTotp(const QUuid id, const QString name, const QString issuer,
0079                        const QByteArray secret, const QByteArray nonce, uint tokenLength,
0080                        uint timeStep, const QDateTime epoch, accounts::Account::Hash hash);
0081         void failedToLoadAllAccounts(void);
0082     private:
0083         const SettingsProvider m_settings;
0084         const AccountSecret * const m_secret;
0085         const std::function<qint64(void)> m_clock;
0086     };
0087 
0088     class DeleteAccounts: public AccountJob // clazy:exclude=ctor-missing-parent-argument
0089     {
0090         Q_OBJECT
0091     public:
0092         explicit DeleteAccounts(const SettingsProvider &settings, const QSet<QUuid> &ids);
0093         void run(void) override;
0094     Q_SIGNALS:
0095         void invalid(void);
0096     private:
0097         const SettingsProvider m_settings;
0098         const QSet<QUuid> m_ids;
0099     };
0100 
0101     class SaveHotp: public AccountJob // clazy:exclude=ctor-missing-parent-argument
0102     {
0103         Q_OBJECT
0104     public:
0105         explicit SaveHotp(const SettingsProvider &settings,
0106                           const QUuid id, const QString &accountName, const QString &issuer,
0107                           const secrets::EncryptedSecret &secret, uint tokenLength,
0108                           quint64 counter, const std::optional<uint> offset, bool checksum);
0109         void run(void) override;
0110     Q_SIGNALS:
0111         void invalid(void);
0112         void saved(const QUuid id, const QString accountName, const QString issuer,
0113                    const QByteArray secret, const QByteArray nonce, uint tokenLength,
0114                    quint64 counter, bool fixedTruncation, uint offset, bool checksum);
0115     private:
0116         const SettingsProvider m_settings;
0117         const QUuid m_id;
0118         const QString m_accountName;
0119         const QString m_issuer;
0120         const secrets::EncryptedSecret m_secret;
0121         const uint m_tokenLength;
0122         const quint64 m_counter;
0123         const std::optional<uint> m_offset;
0124         const bool m_checksum;
0125     };
0126 
0127     class SaveTotp: public AccountJob // clazy:exclude=ctor-missing-parent-argument
0128     {
0129         Q_OBJECT
0130     public:
0131         explicit SaveTotp(const SettingsProvider &settings,
0132                           const QUuid id, const QString &accountName, const QString &issuer,
0133                           const secrets::EncryptedSecret &secret, uint tokenLength,
0134                           uint timeStep, const QDateTime &epoch, Account::Hash hash,
0135                           const std::function<qint64(void)> &clock = &QDateTime::currentMSecsSinceEpoch);
0136         void run(void) override;
0137     Q_SIGNALS:
0138         void invalid(void);
0139         void saved(const QUuid id, const QString accountName, const QString issuer,
0140                    const QByteArray secret, const QByteArray nonce, uint tokenLength,
0141                    uint timeStep, const QDateTime epoch, accounts::Account::Hash hash);
0142     private:
0143         const SettingsProvider m_settings;
0144         const QUuid m_id;
0145         const QString m_accountName;
0146         const QString m_issuer;
0147         const secrets::EncryptedSecret m_secret;
0148         const uint m_tokenLength;
0149         const uint m_timeStep;
0150         const QDateTime m_epoch;
0151         const Account::Hash m_hash;
0152         const std::function<qint64(void)> m_clock;
0153     };
0154 
0155     class ComputeTotp: public AccountJob // clazy:exclude=ctor-missing-parent-argument
0156     {
0157         Q_OBJECT
0158     public:
0159         explicit ComputeTotp(const AccountSecret *secret,
0160                              const secrets::EncryptedSecret &tokenSecret, uint tokenLength,
0161                              const QDateTime &epoch, uint timeStep, const Account::Hash hash,
0162                              const std::function<qint64(void)> &clock = &QDateTime::currentMSecsSinceEpoch);
0163         void run(void) override;
0164     Q_SIGNALS:
0165         void otp(const QString otp, const QString nextOtp, const QDateTime validFrom, const QDateTime validUntil);
0166     private:
0167         const AccountSecret * const m_secret;
0168         const secrets::EncryptedSecret m_tokenSecret;
0169         const uint m_tokenLength;
0170         const QDateTime m_epoch;
0171         const uint m_timeStep;
0172         const Account::Hash m_hash;
0173         const std::function<qint64(void)> m_clock;
0174     };
0175 
0176     class ComputeHotp: public AccountJob // clazy:exclude=ctor-missing-parent-argument
0177     {
0178         Q_OBJECT
0179     public:
0180         explicit ComputeHotp(const AccountSecret *secret,
0181                              const secrets::EncryptedSecret &tokenSecret, uint tokenLength,
0182                              quint64 counter, const std::optional<uint> offset, bool checksum);
0183         void run(void) override;
0184     Q_SIGNALS:
0185         void otp(const QString otp, const QString nextOtp, const quint64 nextCounter);
0186     private:
0187         const AccountSecret * const m_secret;
0188         const secrets::EncryptedSecret m_tokenSecret;
0189         const uint m_tokenLength;
0190         const quint64 m_counter;
0191         const std::optional<uint> m_offset;
0192         const bool m_checksum;
0193     };
0194 
0195     class Dispatcher: public QObject
0196     {
0197         Q_OBJECT
0198     public:
0199         explicit Dispatcher(QThread *thread, QObject *parent = nullptr);
0200         bool empty(void) const;
0201         void queueAndProceed(AccountJob *job, const std::function<void(void)> &setup_callbacks);
0202     Q_SIGNALS:
0203         void dispatch(void);
0204     private Q_SLOTS:
0205         void next(void);
0206     private:
0207         void dispatchNext(void);
0208     private:
0209         QThread * const m_thread;
0210     private:
0211         AccountJob *m_current;
0212         QVector<AccountJob*> m_pending;
0213     };
0214 }
0215 
0216 #endif