69 lines
2.5 KiB
Diff
69 lines
2.5 KiB
Diff
From: Anton Partanen
|
|
Subject: [PATCH] Retry transient unavailability for fingerprint only
|
|
|
|
Other non-interactive authenticators, notably smartcards, also use
|
|
PAM_AUTHINFO_UNAVAIL to report that no credential is present. Restrict the
|
|
retry behavior to fingerprint authenticators so absent smartcards remain
|
|
unavailable instead of repeatedly flashing in the UI.
|
|
---
|
|
greeter/pamauthenticator.cpp | 12 +++++++-----
|
|
1 file changed, 7 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/greeter/pamauthenticator.cpp b/greeter/pamauthenticator.cpp
|
|
index bb2521f..e27e61c 100644
|
|
--- a/greeter/pamauthenticator.cpp
|
|
+++ b/greeter/pamauthenticator.cpp
|
|
@@ -27,7 +27,7 @@ class PamWorker : public QObject
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
- PamWorker();
|
|
+ explicit PamWorker(bool retryOnAuthInfoUnavailable);
|
|
~PamWorker() override;
|
|
Q_DISABLE_COPY_MOVE(PamWorker)
|
|
void start(const QString &service, const QString &user);
|
|
@@ -52,6 +52,7 @@ private:
|
|
bool m_unavailable = false;
|
|
bool m_inAuthenticate = false;
|
|
std::chrono::steady_clock::time_point m_nextAttemptAllowedTime;
|
|
+ const bool m_retryOnAuthInfoUnavailable;
|
|
int m_result = -1;
|
|
QString m_service;
|
|
};
|
|
@@ -163,10 +164,11 @@ int PamWorker::converse(int n, const struct pam_message **msg, struct pam_respons
|
|
return PAM_SUCCESS;
|
|
}
|
|
|
|
-PamWorker::PamWorker()
|
|
+PamWorker::PamWorker(bool retryOnAuthInfoUnavailable)
|
|
: QObject(nullptr)
|
|
, m_conv({&PamWorker::converse, this})
|
|
, m_nextAttemptAllowedTime(std::chrono::steady_clock::now())
|
|
+ , m_retryOnAuthInfoUnavailable(retryOnAuthInfoUnavailable)
|
|
{
|
|
}
|
|
|
|
@@ -176,9 +178,9 @@ void PamWorker::authenticate()
|
|
pam_setcred(m_handle, PAM_REFRESH_CRED);
|
|
/* ignore errors on refresh credentials. If this did not work we use the old ones. */
|
|
Q_EMIT succeeded();
|
|
- } else if (rc == PAM_AUTHINFO_UNAVAIL) {
|
|
+ } else if (rc == PAM_AUTHINFO_UNAVAIL && m_retryOnAuthInfoUnavailable) {
|
|
Q_EMIT failed();
|
|
- } else if (rc == PAM_MODULE_UNKNOWN) {
|
|
+ } else if (rc == PAM_AUTHINFO_UNAVAIL || rc == PAM_MODULE_UNKNOWN) {
|
|
m_unavailable = true;
|
|
Q_EMIT unavailabilityChanged(m_unavailable);
|
|
} else {
|
|
@@ -268,7 +271,7 @@ PamAuthenticator::PamAuthenticator(const QString &service, const QString &user, N
|
|
})
|
|
, m_service(service)
|
|
, m_authenticatorType(types)
|
|
- , d(new PamWorker)
|
|
+ , d(new PamWorker(types.testFlag(NoninteractiveAuthenticatorType::Fingerprint)))
|
|
{
|
|
d->moveToThread(&m_thread);
|
|
|
|
--
|
|
2.51.0
|