Files
fedora-tools/plasma-fingerprint-workaround/kscreenlocker/patches/0004-retry-transient-unavailability-for-fingerprint-only.patch
T

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