File indexing completed on 2024-04-28 16:45:13

0001 /*
0002     SPDX-FileCopyrightText: 2020 David Edmundson <davidedmundson@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #pragma once
0008 
0009 #include <QObject>
0010 #include <QThread>
0011 
0012 class PamWorker;
0013 
0014 class PamAuthenticator : public QObject
0015 {
0016     Q_OBJECT
0017 
0018     Q_PROPERTY(bool busy READ isBusy NOTIFY busyChanged)
0019 
0020     Q_PROPERTY(QString prompt READ getPrompt NOTIFY prompt)
0021     Q_PROPERTY(QString promptForSecret READ getPromptForSecret NOTIFY promptForSecret)
0022 
0023     Q_PROPERTY(QString infoMessage READ getInfoMessage NOTIFY infoMessage)
0024     Q_PROPERTY(QString errorMessage READ getErrorMessage NOTIFY errorMessage)
0025 
0026     Q_PROPERTY(bool unlocked READ isUnlocked NOTIFY succeeded)
0027 
0028 public:
0029     PamAuthenticator(const QString &service, const QString &user, QObject *parent = nullptr);
0030     ~PamAuthenticator();
0031 
0032     bool isBusy() const;
0033     bool isUnlocked() const;
0034 
0035     // Get prefix to de-duplicate from their signals.
0036     QString getPrompt() const;
0037     QString getPromptForSecret() const;
0038     QString getInfoMessage() const;
0039     QString getErrorMessage() const;
0040 
0041 Q_SIGNALS:
0042     void busyChanged();
0043     void promptForSecret(const QString &msg);
0044     void prompt(const QString &msg);
0045     void infoMessage(const QString &msg);
0046     void errorMessage(const QString &msg);
0047     void succeeded();
0048     void failed();
0049 
0050 public Q_SLOTS:
0051     void tryUnlock();
0052     void respond(const QByteArray &response);
0053     void cancel();
0054 
0055 protected:
0056     void init(const QString &service, const QString &user);
0057     void connectNotify(const QMetaMethod &signal) override;
0058 
0059 private:
0060     void setBusy(bool busy);
0061 
0062     const std::vector<std::pair<QMetaMethod, const QString &>> m_signalsToMembers;
0063     // NOTE Don't forget to reset in cancel as necessary
0064     QString m_prompt;
0065     QString m_promptForSecret;
0066     QString m_errorMessage;
0067     QString m_infoMessage;
0068     bool m_busy = false;
0069     bool m_unlocked = false;
0070     QThread m_thread;
0071     PamWorker *d;
0072 };