File indexing completed on 2024-04-14 05:21:18

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     Q_PROPERTY(bool available READ isAvailable NOTIFY availableChanged)
0020     Q_PROPERTY(NoninteractiveAuthenticatorTypes authenticatorType READ authenticatorType CONSTANT)
0021 
0022     Q_PROPERTY(QString prompt READ getPrompt NOTIFY prompt)
0023     Q_PROPERTY(QString promptForSecret READ getPromptForSecret NOTIFY promptForSecret)
0024 
0025     Q_PROPERTY(QString infoMessage READ getInfoMessage NOTIFY infoMessage)
0026     Q_PROPERTY(QString errorMessage READ getErrorMessage NOTIFY errorMessage)
0027 
0028     Q_PROPERTY(bool unlocked READ isUnlocked NOTIFY succeeded)
0029 
0030 public:
0031     enum NoninteractiveAuthenticatorType {
0032         None = 0,
0033         Fingerprint = 1 << 0,
0034         Smartcard = 2 << 0,
0035     };
0036     Q_DECLARE_FLAGS(NoninteractiveAuthenticatorTypes, NoninteractiveAuthenticatorType)
0037     Q_FLAG(NoninteractiveAuthenticatorTypes)
0038 
0039     PamAuthenticator(const QString &service,
0040                      const QString &user,
0041                      NoninteractiveAuthenticatorTypes authenticatorType = NoninteractiveAuthenticatorType::None,
0042                      QObject *parent = nullptr);
0043     ~PamAuthenticator() override;
0044     Q_DISABLE_COPY_MOVE(PamAuthenticator)
0045 
0046     bool isBusy() const;
0047     bool isUnlocked() const;
0048     bool isAvailable() const;
0049     NoninteractiveAuthenticatorTypes authenticatorType() const;
0050 
0051     // Get prefix to de-duplicate from their signals.
0052     QString getPrompt() const;
0053     QString getPromptForSecret() const;
0054     QString getInfoMessage() const;
0055     QString getErrorMessage() const;
0056 
0057     QString service() const;
0058 
0059 Q_SIGNALS:
0060     void busyChanged();
0061     void promptForSecret(const QString &msg);
0062     void prompt(const QString &msg);
0063     void infoMessage(const QString &msg);
0064     void errorMessage(const QString &msg);
0065     void succeeded();
0066     void failed();
0067     void availableChanged();
0068 
0069 public Q_SLOTS:
0070     void tryUnlock();
0071     void respond(const QByteArray &response);
0072     void cancel();
0073 
0074 protected:
0075     void init(const QString &service, const QString &user);
0076 
0077 private:
0078     void setBusy(bool busy);
0079 
0080     const std::vector<std::pair<QMetaMethod, const QString &>> m_signalsToMembers;
0081     // NOTE Don't forget to reset in cancel as necessary
0082     QString m_prompt;
0083     QString m_promptForSecret;
0084     QString m_errorMessage;
0085     QString m_infoMessage;
0086     QString m_service;
0087     bool m_busy = false;
0088     bool m_unlocked = false;
0089     bool m_inAuthentication = false;
0090     bool m_unavailable = false;
0091     NoninteractiveAuthenticatorTypes m_authenticatorType;
0092     QThread m_thread;
0093     PamWorker *d;
0094 };
0095 
0096 Q_DECLARE_OPERATORS_FOR_FLAGS(PamAuthenticator::NoninteractiveAuthenticatorTypes)