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