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)