--- Begin Message ---
Package: release.debian.org
Severity: normal
X-Debbugs-Cc: [email protected], Debian Qt/KDE Maintainers
<[email protected]>
Control: affects -1 + src:kscreenlocker
User: [email protected]
Usertags: unblock
Dear Release Team,
please unblock package kscreenlocker.
[ Reason ]
It contains the following changes:
* New upstream release (6.3.5).
* Relax inter-plasma versioned dependency constraint so we can upload
only 6.3.5 packages that have actual code changes.
* Backport upstream commits:
- Sync password input between screens in multi-monitor setups.
(kde#433563)
- Correctly use PAM configuration for login timeout instead of hardcoded
value. (kde#489898)
- Fix hard freeze under wayland when triggering sleep inhibition in some
situations like starting a video in firefox. (kde#501073)
* Fix unwanted lockcreen messages due to missing PAM configurations to
handle fingerprint sensors and smartcards. (Closes: #1089081)
[ Tests ]
- Tested lock screen and user switch, suspend and resume in various
screen configurations.
- Upstream test suite passes in sbuild.
[ Risks ]
Only backport of upstream commits that apply cleanly. Further fixes can
easily be backported or the changes reverted.
[ Checklist ]
[x] all changes are documented in the d/changelog
[x] I reviewed all changes and I approve them
[x] attach debdiff against the package in testing
Thanks!
unblock kscreenlocker/6.3.5-1
diff -Nru kscreenlocker-6.3.4/CMakeLists.txt kscreenlocker-6.3.5/CMakeLists.txt
--- kscreenlocker-6.3.4/CMakeLists.txt 2025-04-02 05:36:23.000000000 +0200
+++ kscreenlocker-6.3.5/CMakeLists.txt 2025-05-06 19:57:16.000000000 +0200
@@ -2,10 +2,10 @@
project(kscreenlocker)
set(CMAKE_C_STANDARD 99)
-set(PROJECT_VERSION "6.3.4")
+set(PROJECT_VERSION "6.3.5")
set(PROJECT_VERSION_MAJOR 6)
-set(PROJECT_DEP_VERSION "6.3.4")
+set(PROJECT_DEP_VERSION "6.3.5")
set(QT_MIN_VERSION "6.7.0")
set(KF6_MIN_VERSION "6.10.0")
diff -Nru kscreenlocker-6.3.4/debian/changelog
kscreenlocker-6.3.5/debian/changelog
--- kscreenlocker-6.3.4/debian/changelog 2025-04-03 01:02:14.000000000
+0200
+++ kscreenlocker-6.3.5/debian/changelog 2025-05-19 00:58:41.000000000
+0200
@@ -1,3 +1,21 @@
+kscreenlocker (6.3.5-1) unstable; urgency=medium
+
+ [ Aurélien COUDERC ]
+ * New upstream release (6.3.5).
+ * Relax inter-plasma versioned dependency constraint so we can upload
+ only 6.3.5 packages that have actual code changes.
+ * Backport upstream commits:
+ - Sync password input between screens in multi-monitor setups.
+ (kde#433563)
+ - Correctly use PAM configuration for login timeout instead of hardcoded
+ value. (kde#489898)
+ - Fix hard freeze under wayland when triggering sleep inhibition in some
+ situations like starting a video in firefox. (kde#501073)
+ * Fix unwanted lockcreen messages due to missing PAM configurations to
+ handle fingerprint sensors and smartcards. (Closes: #1089081)
+
+ -- Aurélien COUDERC <[email protected]> Mon, 19 May 2025 00:58:41 +0200
+
kscreenlocker (6.3.4-1) unstable; urgency=medium
[ Pino Toscano ]
diff -Nru kscreenlocker-6.3.4/debian/control kscreenlocker-6.3.5/debian/control
--- kscreenlocker-6.3.4/debian/control 2025-04-03 00:08:49.000000000 +0200
+++ kscreenlocker-6.3.5/debian/control 2025-05-19 00:58:41.000000000 +0200
@@ -88,6 +88,10 @@
Pre-Depends: psmisc,
Depends: ${misc:Depends}, ${shlibs:Depends},
Recommends: kde-config-screenlocker,
+Suggests: libpam-fprintd,
+ libpam-kwallet5,
+ libpam-sss,
+ libpam-pkcs11,
Breaks: libkscreenlocker5,
Replaces: libkscreenlocker5,
Description: Secure lock screen architecture
diff -Nru kscreenlocker-6.3.4/debian/libkscreenlocker6.install
kscreenlocker-6.3.5/debian/libkscreenlocker6.install
--- kscreenlocker-6.3.4/debian/libkscreenlocker6.install 2024-11-26
23:48:59.000000000 +0100
+++ kscreenlocker-6.3.5/debian/libkscreenlocker6.install 2025-05-19
00:58:41.000000000 +0200
@@ -1,3 +1,4 @@
+../pam.d/* usr/lib/pam.d/
usr/lib/*/libKScreenLocker.so.6
usr/lib/*/libKScreenLocker.so.6.*
usr/lib/*/libexec/kscreenlocker_greet
diff -Nru kscreenlocker-6.3.4/debian/pam.d/kde
kscreenlocker-6.3.5/debian/pam.d/kde
--- kscreenlocker-6.3.4/debian/pam.d/kde 1970-01-01 01:00:00.000000000
+0100
+++ kscreenlocker-6.3.5/debian/pam.d/kde 2025-05-19 00:58:41.000000000
+0200
@@ -0,0 +1,26 @@
+#%PAM-1.0
+# Taken from gdm3’s gdm-password
+auth requisite pam_nologin.so
+auth required pam_succeed_if.so user != root quiet_success
+@include common-auth
+auth optional pam_kwallet5.so
+@include common-account
+# SELinux needs to be the first session rule. This ensures that any
+# lingering context has been cleared. Without this it is possible
+# that a module could execute code in the wrong domain.
+session [success=ok ignore=ignore module_unknown=ignore default=bad]
pam_selinux.so close
+session required pam_loginuid.so
+# SELinux needs to intervene at login time to ensure that the process
+# starts in the proper default security context. Only sessions which are
+# intended to run in the user's context should be run after this.
+# pam_selinux.so changes the SELinux context of the used TTY and configures
+# SELinux in order to transition to the user context with the next execve()
+# call.
+session [success=ok ignore=ignore module_unknown=ignore default=bad]
pam_selinux.so open
+session optional pam_keyinit.so force revoke
+session required pam_limits.so
+session required pam_env.so readenv=1
+session required pam_env.so readenv=1 envfile=/etc/default/locale
+@include common-session
+session optional pam_kwallet5.so auto_start
+@include common-password
diff -Nru kscreenlocker-6.3.4/debian/pam.d/kde-fingerprint
kscreenlocker-6.3.5/debian/pam.d/kde-fingerprint
--- kscreenlocker-6.3.4/debian/pam.d/kde-fingerprint 1970-01-01
01:00:00.000000000 +0100
+++ kscreenlocker-6.3.5/debian/pam.d/kde-fingerprint 2025-05-19
00:58:41.000000000 +0200
@@ -0,0 +1,26 @@
+#%PAM-1.0
+# Taken from gdm3’s gdm-fingerprint
+auth requisite pam_nologin.so
+auth required pam_succeed_if.so user != root quiet_success
+auth required pam_fprintd.so
+auth optional pam_kwallet5.so
+@include common-account
+# SELinux needs to be the first session rule. This ensures that any
+# lingering context has been cleared. Without this it is possible
+# that a module could execute code in the wrong domain.
+session [success=ok ignore=ignore module_unknown=ignore default=bad]
pam_selinux.so close
+session required pam_loginuid.so
+# SELinux needs to intervene at login time to ensure that the process
+# starts in the proper default security context. Only sessions which are
+# intended to run in the user's context should be run after this.
+# pam_selinux.so changes the SELinux context of the used TTY and configures
+# SELinux in order to transition to the user context with the next execve()
+# call.
+session [success=ok ignore=ignore module_unknown=ignore default=bad]
pam_selinux.so open
+session optional pam_keyinit.so force revoke
+session required pam_limits.so
+session required pam_env.so readenv=1
+session required pam_env.so readenv=1 envfile=/etc/default/locale
+@include common-session
+session optional pam_kwallet5.so auto_start
+password required pam_fprintd.so
diff -Nru kscreenlocker-6.3.4/debian/pam.d/kde-smartcard
kscreenlocker-6.3.5/debian/pam.d/kde-smartcard
--- kscreenlocker-6.3.4/debian/pam.d/kde-smartcard 1970-01-01
01:00:00.000000000 +0100
+++ kscreenlocker-6.3.5/debian/pam.d/kde-smartcard 2025-05-19
00:58:41.000000000 +0200
@@ -0,0 +1,29 @@
+#%PAM-1.0
+# Adapted from gdm3’s gdm-smartcard-sssd-or-password
+auth [success=ok user_unknown=ignore default=bad] pam_succeed_if.so user !=
root quiet_success
+#auth [success=2 default=ignore] pam_sss.so allow_missing_name try_cert_auth
+auth required pam_sss.so allow_missing_name try_cert_auth
+#auth substack common-auth
+auth requisite pam_nologin.so
+auth optional pam_kwallet5.so
+
+@include common-account
+# SELinux needs to be the first session rule. This ensures that any
+# lingering context has been cleared. Without this it is possible
+# that a module could execute code in the wrong domain.
+session [success=ok ignore=ignore module_unknown=ignore default=bad]
pam_selinux.so close
+session required pam_loginuid.so
+# SELinux needs to intervene at login time to ensure that the process
+# starts in the proper default security context. Only sessions which are
+# intended to run in the user's context should be run after this.
+# pam_selinux.so changes the SELinux context of the used TTY and configures
+# SELinux in order to transition to the user context with the next execve()
+# call.
+session [success=ok ignore=ignore module_unknown=ignore default=bad]
pam_selinux.so open
+session optional pam_keyinit.so force revoke
+session required pam_limits.so
+session required pam_env.so readenv=1
+session required pam_env.so readenv=1 envfile=/etc/default/locale
+@include common-session
+session optional pam_kwallet5.so auto_start
+@include common-password
diff -Nru
kscreenlocker-6.3.4/debian/patches/relax-interplasma-versioned-deps.patch
kscreenlocker-6.3.5/debian/patches/relax-interplasma-versioned-deps.patch
--- kscreenlocker-6.3.4/debian/patches/relax-interplasma-versioned-deps.patch
1970-01-01 01:00:00.000000000 +0100
+++ kscreenlocker-6.3.5/debian/patches/relax-interplasma-versioned-deps.patch
2025-05-08 00:30:22.000000000 +0200
@@ -0,0 +1,11 @@
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -5,7 +5,7 @@
+ set(PROJECT_VERSION "6.3.5")
+ set(PROJECT_VERSION_MAJOR 6)
+
+-set(PROJECT_DEP_VERSION "6.3.5")
++set(PROJECT_DEP_VERSION "6.3.4")
+ set(QT_MIN_VERSION "6.7.0")
+ set(KF6_MIN_VERSION "6.10.0")
+
diff -Nru kscreenlocker-6.3.4/debian/patches/series
kscreenlocker-6.3.5/debian/patches/series
--- kscreenlocker-6.3.4/debian/patches/series 1970-01-01 01:00:00.000000000
+0100
+++ kscreenlocker-6.3.5/debian/patches/series 2025-05-16 22:53:32.000000000
+0200
@@ -0,0 +1,9 @@
+relax-interplasma-versioned-deps.patch
+# Sync password input between screens in multi-monitor setups.
+upstream_99702e2d_greeter-sync-password-across-screens.patch
+upstream_1d175e50_greeter-remove-obselete-shareEvent.patch
+upstream_081efa76_greeter-Add-loginFailedDelayStarted-event.patch
+# Fix hard freeze under wayland when triggering sleep inhibition in some
situations like starting a video in firefox. (kde#501073)
+upstream_da9cca9d_Port-the-ScreenSaver-interface-from-sync-calls-to-powerdevil.patch
+upstream_29378c61_Bump-C-version-to-23.patch
+upstream_ad8d2273_Use-std-expected-to-clean-up-PowerInhibitor.patch
diff -Nru
kscreenlocker-6.3.4/debian/patches/upstream_081efa76_greeter-Add-loginFailedDelayStarted-event.patch
kscreenlocker-6.3.5/debian/patches/upstream_081efa76_greeter-Add-loginFailedDelayStarted-event.patch
---
kscreenlocker-6.3.4/debian/patches/upstream_081efa76_greeter-Add-loginFailedDelayStarted-event.patch
1970-01-01 01:00:00.000000000 +0100
+++
kscreenlocker-6.3.5/debian/patches/upstream_081efa76_greeter-Add-loginFailedDelayStarted-event.patch
2025-05-16 22:53:07.000000000 +0200
@@ -0,0 +1,136 @@
+From 081efa761f175ab87965771eef9629279164afee Mon Sep 17 00:00:00 2001
+From: Akash Suresh <[email protected]>
+Date: Sun, 2 Mar 2025 18:57:31 +0530
+Subject: [PATCH] greeter: Add loginFailedDelayStarted event
+
+- Add a loginFailedDelayStarted to track when we know that the login failed,
but control is still with PAM.
+- This event can replace the falsely named "graceLockTimer" in the lockscreen.
+- Required for https://bugs.kde.org/show_bug.cgi?id=407473
+
+BUG: 489898
+---
+ greeter/pamauthenticator.cpp | 25 ++++++++++++++++++++-----
+ greeter/pamauthenticator.h | 1 +
+ greeter/pamauthenticators.cpp | 10 ++++++++++
+ greeter/pamauthenticators.h | 1 +
+ 4 files changed, 32 insertions(+), 5 deletions(-)
+
+diff --git a/greeter/pamauthenticator.cpp b/greeter/pamauthenticator.cpp
+index ef43989b..077831d7 100644
+--- a/greeter/pamauthenticator.cpp
++++ b/greeter/pamauthenticator.cpp
+@@ -9,6 +9,7 @@
+ #include <QDebug>
+ #include <QEventLoop>
+ #include <QMetaMethod>
++#include <QThread>
+ #include <security/pam_appl.h>
+
+ #include "kscreenlocker_greet_logging.h"
+@@ -30,6 +31,7 @@ Q_SIGNALS:
+ void infoMessage(const QString &msg);
+ void errorMessage(const QString &msg);
+ void failed();
++ void loginFailedDelayStarted(const uint uSecDelay);
+ void succeeded();
+ void unavailabilityChanged(bool unavailable);
+ void inAuthenticateChanged(bool inAuthenticate);
+@@ -188,9 +190,19 @@ void PamWorker::authenticate()
+
+ static void fail_delay(int retval, unsigned usec_delay, void *appdata_ptr)
+ {
+- Q_UNUSED(retval);
+- Q_UNUSED(usec_delay);
+- Q_UNUSED(appdata_ptr);
++ auto* worker = reinterpret_cast< PamWorker* >(appdata_ptr); // Refer the
pam_conv (@sa m_conv) structure for info on appdata_ptr
++ if (!worker) {
++ qCFatal(KSCREENLOCKER_GREET) << "[PAM worker] appdata_ptr not
convertible to a valid PamWorker! Cannot apply fail delay";
++ return;
++ }
++ if (retval == PAM_SUCCESS) {
++ qCDebug(KSCREENLOCKER_GREET) << "[PAM worker] Fail delay function was
called, but authentication result was a success!";
++ return;
++ }
++ Q_EMIT worker->loginFailedDelayStarted(usec_delay);
++ if (usec_delay > 0u) {
++ QThread::usleep(usec_delay); // This calls nanosleep as of Qt 6.8. It
also handles EINTR (restarts the sleep with the remainder duration when
interrupted), but not EFAULT or EINVAL.
++ }
+ }
+
+ void PamWorker::start(const QString &service, const QString &user)
+@@ -202,8 +214,10 @@ void PamWorker::start(const QString &service, const
QString &user)
+ m_result = pam_start(qPrintable(service), qPrintable(user), &m_conv,
&m_handle);
+
+ // get errors quicker
+-#ifdef PAM_FAIL_DELAY
+- pam_set_item(m_handle, PAM_FAIL_DELAY, (void *)fail_delay);
++#if defined(HAVE_PAM_FAIL_DELAY)
++ pam_set_item(m_handle, PAM_FAIL_DELAY, reinterpret_cast< void*
>(fail_delay));
++#else
++ Q_UNUSED(fail_delay);
+ #endif
+
+ if (m_result != PAM_SUCCESS) {
+@@ -268,6 +282,7 @@ PamAuthenticator::PamAuthenticator(const QString &service,
const QString &user,
+ // Failed is not a persistent state. When a view provides authentication
that will either result in failure or success,
+ // failure simply means that the prompt is getting delayed.
+ connect(d, &PamWorker::failed, this, &PamAuthenticator::failed);
++ connect(d, &PamWorker::loginFailedDelayStarted, this,
&PamAuthenticator::loginFailedDelayStarted);
+
+ m_thread.start();
+ init(service, user);
+diff --git a/greeter/pamauthenticator.h b/greeter/pamauthenticator.h
+index aa3ecb68..914f22ab 100644
+--- a/greeter/pamauthenticator.h
++++ b/greeter/pamauthenticator.h
+@@ -65,6 +65,7 @@ Q_SIGNALS:
+ void succeeded();
+ void failed();
+ void availableChanged();
++ void loginFailedDelayStarted(const uint uSecDelay);
+
+ public Q_SLOTS:
+ void tryUnlock();
+diff --git a/greeter/pamauthenticators.cpp b/greeter/pamauthenticators.cpp
+index b84d4eb1..e9e925a8 100644
+--- a/greeter/pamauthenticators.cpp
++++ b/greeter/pamauthenticators.cpp
+@@ -53,6 +53,11 @@
PamAuthenticators::PamAuthenticators(std::unique_ptr<PamAuthenticator> &&interac
+ d->cancelNoninteractive();
+ Q_EMIT
failed(PamAuthenticator::NoninteractiveAuthenticatorType::None,
d->interactive.get());
+ });
++ connect(d->interactive.get(), &PamAuthenticator::loginFailedDelayStarted,
this, [this](const uint uSecDelay) noexcept -> void {
++ qCDebug(KSCREENLOCKER_GREET) << "PamAuthenticators: Delay started on
login failure for interactive authenticator" <<
qUtf8Printable(d->interactive->service())
++ << "duration:" << uSecDelay;
++ Q_EMIT
loginFailedDelayStarted(PamAuthenticator::NoninteractiveAuthenticatorType::None,
d->interactive.get(), uSecDelay);
++ });
+ for (auto &&noninteractive : d->noninteractive) {
+ connect(noninteractive.get(), &PamAuthenticator::succeeded, this,
[this, &noninteractive] {
+ qCDebug(KSCREENLOCKER_GREET) << "PamAuthenticators: Success from
non-interactive authenticator" << qUtf8Printable(noninteractive->service());
+@@ -68,6 +73,11 @@
PamAuthenticators::PamAuthenticators(std::unique_ptr<PamAuthenticator> &&interac
+ qCDebug(KSCREENLOCKER_GREET) << "PamAuthenticators:
Non-interactive authenticator" << qUtf8Printable(noninteractive->service()) <<
"failed";
+ Q_EMIT failed(noninteractive->authenticatorType(),
noninteractive.get());
+ });
++ connect(noninteractive.get(),
&PamAuthenticator::loginFailedDelayStarted, this, [this, &noninteractive](const
uint uSecDelay) noexcept -> void {
++ qCDebug(KSCREENLOCKER_GREET) << "PamAuthenticators: Delay started
on login failure for non-interactive authenticator" <<
qUtf8Printable(noninteractive->service())
++ << "duration:" << uSecDelay;
++ Q_EMIT
loginFailedDelayStarted(noninteractive->authenticatorType(),
noninteractive.get(), uSecDelay);
++ });
+ connect(noninteractive.get(), &PamAuthenticator::infoMessage, this,
[this, &noninteractive]() {
+ if (!d->hadPrompt) {
+ d->hadPrompt = true;
+diff --git a/greeter/pamauthenticators.h b/greeter/pamauthenticators.h
+index 9184e7e8..14221b75 100644
+--- a/greeter/pamauthenticators.h
++++ b/greeter/pamauthenticators.h
+@@ -77,6 +77,7 @@ public:
+ Q_SIGNAL void failed(PamAuthenticator::NoninteractiveAuthenticatorTypes
what, PamAuthenticator *authenticator);
+ Q_SIGNAL void
noninteractiveError(PamAuthenticator::NoninteractiveAuthenticatorTypes what,
PamAuthenticator *authenticator);
+ Q_SIGNAL void
noninteractiveInfo(PamAuthenticator::NoninteractiveAuthenticatorTypes what,
PamAuthenticator *authenticator);
++ Q_SIGNAL void
loginFailedDelayStarted(PamAuthenticator::NoninteractiveAuthenticatorTypes
what, PamAuthenticator *authenticator, const uint uSecDelay);
+
+ void setGraceLocked(bool b);
+
+--
+GitLab
+
diff -Nru
kscreenlocker-6.3.4/debian/patches/upstream_1d175e50_greeter-remove-obselete-shareEvent.patch
kscreenlocker-6.3.5/debian/patches/upstream_1d175e50_greeter-remove-obselete-shareEvent.patch
---
kscreenlocker-6.3.4/debian/patches/upstream_1d175e50_greeter-remove-obselete-shareEvent.patch
1970-01-01 01:00:00.000000000 +0100
+++
kscreenlocker-6.3.5/debian/patches/upstream_1d175e50_greeter-remove-obselete-shareEvent.patch
2025-05-16 22:53:07.000000000 +0200
@@ -0,0 +1,82 @@
+From 1d175e50b05d0873c0f94031c1e196b2be195bb3 Mon Sep 17 00:00:00 2001
+From: Yifan Zhu <[email protected]>
+Date: Fri, 10 Jan 2025 11:30:40 -0800
+Subject: [PATCH] greeter: remove obselete shareEvent
+
+shareEvent used to sync passwords across multiple screens. This has been
+reported to be broken since 5.21, and has been superseded by better
+method of syncing passwords.
+
+CCBUG: 433563
+---
+ greeter/greeterapp.cpp | 30 ------------------------------
+ greeter/greeterapp.h | 1 -
+ 2 files changed, 31 deletions(-)
+
+diff --git a/greeter/greeterapp.cpp b/greeter/greeterapp.cpp
+index fc24323a..7b2b1a18 100644
+--- a/greeter/greeterapp.cpp
++++ b/greeter/greeterapp.cpp
+@@ -612,12 +612,10 @@ bool UnlockApp::eventFilter(QObject *obj, QEvent *event)
+ }
+
+ if (event->type() == QEvent::KeyPress) { // react if saver is visible
+- shareEvent(event, qobject_cast<PlasmaQuick::QuickViewSharedEngine
*>(obj));
+ return false; // we don't care
+ } else if (event->type() == QEvent::KeyRelease) { // conditionally reshow
the saver
+ QKeyEvent *ke = static_cast<QKeyEvent *>(event);
+ if (ke->key() != Qt::Key_Escape) {
+- shareEvent(event, qobject_cast<PlasmaQuick::QuickViewSharedEngine
*>(obj));
+ return false; // irrelevant
+ } else if (!m_testing) { // don't turn screen off in testing mode.
+ auto dpms = new KScreen::Dpms(this);
+@@ -638,34 +636,6 @@ bool UnlockApp::eventFilter(QObject *obj, QEvent *event)
+ return false;
+ }
+
+-/*
+- * This function forwards an event from one greeter window to all others
+- * It's used to have the keyboard operate on all greeter windows (on every
screen)
+- * at once so that the user gets visual feedback on the screen he's looking
at -
+- * even if the focus is actually on a powered off screen.
+- */
+-
+-void UnlockApp::shareEvent(QEvent *e, PlasmaQuick::QuickViewSharedEngine
*from)
+-{
+- // from can be NULL any time (because the parameter is passed as
qobject_cast)
+- // m_views.contains(from) is atm. supposed to be true but required if any
further
+- // QQuickView are added (which are not part of m_views)
+- // this makes "from" an optimization (nullptr check aversion)
+- if (from && m_views.contains(from)) {
+- // NOTICE any recursion in the event sharing will prevent
authentication on multiscreen setups!
+- // Any change in regarded event processing shall be tested thoroughly!
+- removeEventFilter(this); // prevent recursion!
+- const bool accepted = e->isAccepted(); // store state
+- for (PlasmaQuick::QuickViewSharedEngine *view :
std::as_const(m_views)) {
+- if (view != from) {
+- QCoreApplication::sendEvent(view, e);
+- e->setAccepted(accepted);
+- }
+- }
+- installEventFilter(this);
+- }
+-}
+-
+ void UnlockApp::setGraceTime(int milliseconds)
+ {
+ m_graceTime = milliseconds;
+diff --git a/greeter/greeterapp.h b/greeter/greeterapp.h
+index 7e138469..b636640e 100644
+--- a/greeter/greeterapp.h
++++ b/greeter/greeterapp.h
+@@ -75,7 +75,6 @@ private Q_SLOTS:
+
+ private:
+ void initialize();
+- void shareEvent(QEvent *e, PlasmaQuick::QuickViewSharedEngine *from);
+ PlasmaQuick::SharedQmlEngine
*loadWallpaperPlugin(PlasmaQuick::QuickViewSharedEngine *view);
+ void setWallpaperItemProperties(PlasmaQuick::SharedQmlEngine
*wallpaperObject, PlasmaQuick::QuickViewSharedEngine *view);
+ void screenGeometryChanged(QScreen *screen, const QRect &geo);
+--
+GitLab
+
diff -Nru
kscreenlocker-6.3.4/debian/patches/upstream_29378c61_Bump-C-version-to-23.patch
kscreenlocker-6.3.5/debian/patches/upstream_29378c61_Bump-C-version-to-23.patch
---
kscreenlocker-6.3.4/debian/patches/upstream_29378c61_Bump-C-version-to-23.patch
1970-01-01 01:00:00.000000000 +0100
+++
kscreenlocker-6.3.5/debian/patches/upstream_29378c61_Bump-C-version-to-23.patch
2025-05-16 22:53:32.000000000 +0200
@@ -0,0 +1,26 @@
+From 29378c617913600a913f4bcaca500aab4fb449e8 Mon Sep 17 00:00:00 2001
+From: Vlad Zahorodnii <[email protected]>
+Date: Wed, 23 Apr 2025 11:16:56 +0300
+Subject: [PATCH] Bump C++ version to 23
+
+So it's possible to use std::expected.
+---
+ CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index c82a28e6..dee6b70c 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -9,7 +9,7 @@ set(PROJECT_DEP_VERSION "6.2.90")
+ set(QT_MIN_VERSION "6.7.0")
+ set(KF6_MIN_VERSION "6.10.0")
+
+-set(CMAKE_CXX_STANDARD 20)
++set(CMAKE_CXX_STANDARD 23)
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+ find_package(ECM ${KF6_MIN_VERSION} REQUIRED NO_MODULE)
+--
+GitLab
+
diff -Nru
kscreenlocker-6.3.4/debian/patches/upstream_99702e2d_greeter-sync-password-across-screens.patch
kscreenlocker-6.3.5/debian/patches/upstream_99702e2d_greeter-sync-password-across-screens.patch
---
kscreenlocker-6.3.4/debian/patches/upstream_99702e2d_greeter-sync-password-across-screens.patch
1970-01-01 01:00:00.000000000 +0100
+++
kscreenlocker-6.3.5/debian/patches/upstream_99702e2d_greeter-sync-password-across-screens.patch
2025-05-16 22:52:47.000000000 +0200
@@ -0,0 +1,94 @@
+From 99702e2def21cba69439a754690d6a47251816df Mon Sep 17 00:00:00 2001
+From: Yifan Zhu <[email protected]>
+Date: Fri, 10 Jan 2025 11:23:40 -0800
+Subject: [PATCH] greeter: sync password across screens
+
+Create PasswordSync Singleton to explicitly sync password on different
+screens.
+
+Test plan:
+- use multiscreen setup
+- break lock screen theme, lock screen and verify fallback theme is used
+- type on one password box, verify password is synced to other screen
+- make deletions and insertions in other screen, and verify changes are
+ synced back
+
+CCBUG: 433563
+---
+ greeter/fallbacktheme.qrc | 2 ++
+ greeter/fallbacktheme/Greeter.qml | 12 +++++++++++-
+ greeter/fallbacktheme/PasswordSync.qml | 13 +++++++++++++
+ greeter/fallbacktheme/qmldir | 4 ++++
+ 4 files changed, 30 insertions(+), 1 deletion(-)
+ create mode 100644 greeter/fallbacktheme/PasswordSync.qml
+ create mode 100644 greeter/fallbacktheme/qmldir
+
+diff --git a/greeter/fallbacktheme.qrc b/greeter/fallbacktheme.qrc
+index 58740eaa..150816bc 100644
+--- a/greeter/fallbacktheme.qrc
++++ b/greeter/fallbacktheme.qrc
+@@ -2,5 +2,7 @@
+ <qresource>
+ <file>fallbacktheme/LockScreen.qml</file>
+ <file>fallbacktheme/Greeter.qml</file>
++ <file>fallbacktheme/PasswordSync.qml</file>
++ <file>fallbacktheme/qmldir</file>
+ </qresource>
+ </RCC>
+diff --git a/greeter/fallbacktheme/Greeter.qml
b/greeter/fallbacktheme/Greeter.qml
+index e4683931..17715e22 100644
+--- a/greeter/fallbacktheme/Greeter.qml
++++ b/greeter/fallbacktheme/Greeter.qml
+@@ -80,9 +80,19 @@ Item {
+ Layout.alignment: Qt.AlignHCenter
+ implicitWidth: Kirigami.Units.gridUnit * 15
+ enabled: !authenticator.busy
++ text: PasswordSync.password
+ Keys.onEnterPressed: authenticator.startAuthenticating()
+ Keys.onReturnPressed: authenticator.startAuthenticating()
+- Keys.onEscapePressed: password.text = ""
++ Keys.onEscapePressed: {
++ password.text = ""
++ password.text = Qt.binding(() => PasswordSync.password)
++ }
++ }
++
++ Binding {
++ target: PasswordSync
++ property: "password"
++ value: password.text
+ }
+
+ PlasmaComponents3.Label {
+diff --git a/greeter/fallbacktheme/PasswordSync.qml
b/greeter/fallbacktheme/PasswordSync.qml
+new file mode 100644
+index 00000000..8a1eb983
+--- /dev/null
++++ b/greeter/fallbacktheme/PasswordSync.qml
+@@ -0,0 +1,13 @@
++/*
++ SPDX-FileCopyrightText: 2025 Yifan Zhu <[email protected]>
++
++ SPDX-License-Identifier: GPL-2.0-or-later
++*/
++
++pragma Singleton
++
++import QtQuick 2.15
++
++QtObject {
++ property string password
++}
+diff --git a/greeter/fallbacktheme/qmldir b/greeter/fallbacktheme/qmldir
+new file mode 100644
+index 00000000..759d12d5
+--- /dev/null
++++ b/greeter/fallbacktheme/qmldir
+@@ -0,0 +1,4 @@
++# SPDX-FileCopyrightText: 2025 Yifan Zhu <[email protected]>
++# SPDX-License-Identifier: GPL-2.0-or-later
++
++singleton PasswordSync 1.0 PasswordSync.qml
+--
+GitLab
+
diff -Nru
kscreenlocker-6.3.4/debian/patches/upstream_ad8d2273_Use-std-expected-to-clean-up-PowerInhibitor.patch
kscreenlocker-6.3.5/debian/patches/upstream_ad8d2273_Use-std-expected-to-clean-up-PowerInhibitor.patch
---
kscreenlocker-6.3.4/debian/patches/upstream_ad8d2273_Use-std-expected-to-clean-up-PowerInhibitor.patch
1970-01-01 01:00:00.000000000 +0100
+++
kscreenlocker-6.3.5/debian/patches/upstream_ad8d2273_Use-std-expected-to-clean-up-PowerInhibitor.patch
2025-05-16 22:53:32.000000000 +0200
@@ -0,0 +1,88 @@
+From ad8d2273b9169564c95acbe58e7a78da37e14a2d Mon Sep 17 00:00:00 2001
+From: Vlad Zahorodnii <[email protected]>
+Date: Wed, 23 Apr 2025 11:25:35 +0300
+Subject: [PATCH] Use std::expected to clean up PowerInhibitor
+
+---
+ interface.cpp | 23 +++++++++--------------
+ interface.h | 5 +++--
+ 2 files changed, 12 insertions(+), 16 deletions(-)
+
+diff --git a/interface.cpp b/interface.cpp
+index 2b73b677..e4a83f01 100644
+--- a/interface.cpp
++++ b/interface.cpp
+@@ -38,10 +38,7 @@ PowerInhibitor::~PowerInhibitor()
+ void PowerInhibitor::release()
+ {
+ m_released = true;
+- // TODO: See how to clean up this code.
+- if (m_failed) {
+- deleteLater();
+- } else if (m_cookie) {
++ if (m_cookie.has_value()) {
+ uninhibit();
+ }
+ }
+@@ -60,27 +57,25 @@ void PowerInhibitor::inhibit(const QString
&applicationName, const QString &reas
+
+ if (!reply.isValid()) {
+ qCWarning(KSCREENLOCKER) <<
"org.kde.Solid.PowerManagement.PolicyAgent.AddInhibition failed:" <<
reply.error();
+- m_failed = true;
++ m_cookie = std::unexpected(reply.error());
+ } else {
+ m_cookie = reply.value();
+ }
+
+ if (m_released) {
+- if (m_failed) {
+- deleteLater();
+- } else {
+- uninhibit();
+- }
++ uninhibit();
+ }
+ });
+ }
+
+ void PowerInhibitor::uninhibit()
+ {
+- OrgKdeSolidPowerManagementPolicyAgentInterface
policyAgent(QStringLiteral("org.kde.Solid.PowerManagement.PolicyAgent"),
+-
QStringLiteral("/org/kde/Solid/PowerManagement/PolicyAgent"),
+-
QDBusConnection::sessionBus());
+- policyAgent.ReleaseInhibition(m_cookie.value());
++ if (const auto &result = m_cookie.value()) {
++ OrgKdeSolidPowerManagementPolicyAgentInterface
policyAgent(QStringLiteral("org.kde.Solid.PowerManagement.PolicyAgent"),
++
QStringLiteral("/org/kde/Solid/PowerManagement/PolicyAgent"),
++
QDBusConnection::sessionBus());
++ policyAgent.ReleaseInhibition(result.value());
++ }
+
+ deleteLater();
+ }
+diff --git a/interface.h b/interface.h
+index fac7842a..21447810 100644
+--- a/interface.h
++++ b/interface.h
+@@ -10,6 +10,8 @@ SPDX-License-Identifier: GPL-2.0-or-later
+ #include <QDBusMessage>
+ #include <QObject>
+
++#include <expected>
++
+ class QDBusServiceWatcher;
+
+ namespace ScreenLocker
+@@ -29,8 +31,7 @@ private:
+ void inhibit(const QString &applicationName, const QString &reason);
+ void uninhibit();
+
+- std::optional<uint> m_cookie;
+- bool m_failed = false;
++ std::optional<std::expected<uint, QDBusError>> m_cookie;
+ bool m_released = false;
+ };
+
+--
+GitLab
+
diff -Nru
kscreenlocker-6.3.4/debian/patches/upstream_da9cca9d_Port-the-ScreenSaver-interface-from-sync-calls-to-powerdevil.patch
kscreenlocker-6.3.5/debian/patches/upstream_da9cca9d_Port-the-ScreenSaver-interface-from-sync-calls-to-powerdevil.patch
---
kscreenlocker-6.3.4/debian/patches/upstream_da9cca9d_Port-the-ScreenSaver-interface-from-sync-calls-to-powerdevil.patch
1970-01-01 01:00:00.000000000 +0100
+++
kscreenlocker-6.3.5/debian/patches/upstream_da9cca9d_Port-the-ScreenSaver-interface-from-sync-calls-to-powerdevil.patch
2025-05-16 22:53:07.000000000 +0200
@@ -0,0 +1,171 @@
+From da9cca9d8f386e52e5d9b001bf48ab977ff735ed Mon Sep 17 00:00:00 2001
+From: Vlad Zahorodnii <[email protected]>
+Date: Wed, 23 Apr 2025 11:00:42 +0300
+Subject: [PATCH] Port the ScreenSaver interface from sync calls to powerdevil
+
+If powerdevil doesn't respond, kwin_wayland can experience a hard
+freeze. This change ports the powerdevil inhibition part away from
+sync calls to async calls to prevent the hard freeze.
+---
+ interface.cpp | 75 ++++++++++++++++++++++++++++++++++++++++++---------
+ interface.h | 22 ++++++++++++++-
+ 2 files changed, 84 insertions(+), 13 deletions(-)
+
+diff --git a/interface.cpp b/interface.cpp
+index bef7bd52..2b73b677 100644
+--- a/interface.cpp
++++ b/interface.cpp
+@@ -5,6 +5,7 @@ SPDX-FileCopyrightText: 2011 Martin Gräßlin
<[email protected]>
+ SPDX-License-Identifier: GPL-2.0-or-later
+ */
+ #include "interface.h"
++#include "kscreenlocker_logging.h"
+ #include "kscreensaveradaptor.h"
+ #include "ksldapp.h"
+ #include "powerdevilpolicyagent.h"
+@@ -16,6 +17,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
+ // Qt
+ #include <QDBusConnection>
+ #include <QDBusContext>
++#include <QDBusPendingCallWatcher>
+ #include <QDBusReply>
+ #include <QDBusServiceWatcher>
+ #include <QRandomGenerator>
+@@ -24,6 +26,65 @@ namespace ScreenLocker
+ {
+ const uint ChangeScreenSettings = 4;
+
++PowerInhibitor::PowerInhibitor(const QString &applicationName, const QString
&reason)
++{
++ inhibit(applicationName, reason);
++}
++
++PowerInhibitor::~PowerInhibitor()
++{
++}
++
++void PowerInhibitor::release()
++{
++ m_released = true;
++ // TODO: See how to clean up this code.
++ if (m_failed) {
++ deleteLater();
++ } else if (m_cookie) {
++ uninhibit();
++ }
++}
++
++void PowerInhibitor::inhibit(const QString &applicationName, const QString
&reason)
++{
++ OrgKdeSolidPowerManagementPolicyAgentInterface
policyAgent(QStringLiteral("org.kde.Solid.PowerManagement.PolicyAgent"),
++
QStringLiteral("/org/kde/Solid/PowerManagement/PolicyAgent"),
++
QDBusConnection::sessionBus());
++ QDBusPendingReply<uint> reply =
policyAgent.AddInhibition(ChangeScreenSettings, applicationName, reason);
++
++ auto watcher = new QDBusPendingCallWatcher(reply, this);
++ connect(watcher, &QDBusPendingCallWatcher::finished, this, [this,
watcher]() {
++ QDBusPendingReply<uint> reply = *watcher;
++ watcher->deleteLater();
++
++ if (!reply.isValid()) {
++ qCWarning(KSCREENLOCKER) <<
"org.kde.Solid.PowerManagement.PolicyAgent.AddInhibition failed:" <<
reply.error();
++ m_failed = true;
++ } else {
++ m_cookie = reply.value();
++ }
++
++ if (m_released) {
++ if (m_failed) {
++ deleteLater();
++ } else {
++ uninhibit();
++ }
++ }
++ });
++}
++
++void PowerInhibitor::uninhibit()
++{
++ OrgKdeSolidPowerManagementPolicyAgentInterface
policyAgent(QStringLiteral("org.kde.Solid.PowerManagement.PolicyAgent"),
++
QStringLiteral("/org/kde/Solid/PowerManagement/PolicyAgent"),
++
QDBusConnection::sessionBus());
++ policyAgent.ReleaseInhibition(m_cookie.value());
++
++ deleteLater();
++}
++
+ Interface::Interface(KSldApp *parent)
+ : QObject(parent)
+ , m_daemon(parent)
+@@ -112,15 +173,10 @@ bool Interface::SetActive(bool state)
+
+ uint Interface::Inhibit(const QString &application_name, const QString
&reason_for_inhibit)
+ {
+- OrgKdeSolidPowerManagementPolicyAgentInterface
policyAgent(QStringLiteral("org.kde.Solid.PowerManagement.PolicyAgent"),
+-
QStringLiteral("/org/kde/Solid/PowerManagement/PolicyAgent"),
+-
QDBusConnection::sessionBus());
+- QDBusReply<uint> reply = policyAgent.AddInhibition(ChangeScreenSettings,
application_name, reason_for_inhibit);
+-
+ InhibitRequest sr;
+ sr.cookie = m_next_cookie++;
+ sr.dbusid = message().service();
+- sr.powerdevilcookie = reply.isValid() ? reply : 0;
++ sr.powerInhibitor = new PowerInhibitor(application_name,
reason_for_inhibit);
+ m_requests.append(sr);
+ m_serviceWatcher->addWatchedService(sr.dbusid);
+ KSldApp::self()->inhibit();
+@@ -132,12 +188,7 @@ void Interface::UnInhibit(uint cookie)
+ QMutableListIterator<InhibitRequest> it(m_requests);
+ while (it.hasNext()) {
+ if (it.next().cookie == cookie) {
+- if (uint powerdevilcookie = it.value().powerdevilcookie) {
+- OrgKdeSolidPowerManagementPolicyAgentInterface
policyAgent(QStringLiteral("org.kde.Solid.PowerManagement.PolicyAgent"),
+-
QStringLiteral("/org/kde/Solid/PowerManagement/PolicyAgent"),
+-
QDBusConnection::sessionBus());
+- policyAgent.ReleaseInhibition(powerdevilcookie);
+- }
++ it.value().powerInhibitor->release();
+ it.remove();
+ KSldApp::self()->uninhibit();
+ break;
+diff --git a/interface.h b/interface.h
+index 489b404e..fac7842a 100644
+--- a/interface.h
++++ b/interface.h
+@@ -14,12 +14,32 @@ class QDBusServiceWatcher;
+
+ namespace ScreenLocker
+ {
++
++class PowerInhibitor : public QObject
++{
++ Q_OBJECT
++
++public:
++ PowerInhibitor(const QString &applicationName, const QString &reason);
++ void release();
++
++private:
++ ~PowerInhibitor() override;
++
++ void inhibit(const QString &applicationName, const QString &reason);
++ void uninhibit();
++
++ std::optional<uint> m_cookie;
++ bool m_failed = false;
++ bool m_released = false;
++};
++
+ class InhibitRequest
+ {
+ public:
+ QString dbusid;
+ uint cookie;
+- uint powerdevilcookie;
++ PowerInhibitor *powerInhibitor = nullptr;
+ };
+
+ class KSldApp;
+--
+GitLab
+
diff -Nru kscreenlocker-6.3.4/kcm/kcm_screenlocker.json
kscreenlocker-6.3.5/kcm/kcm_screenlocker.json
--- kscreenlocker-6.3.4/kcm/kcm_screenlocker.json 2025-04-02
05:36:23.000000000 +0200
+++ kscreenlocker-6.3.5/kcm/kcm_screenlocker.json 2025-05-06
19:57:16.000000000 +0200
@@ -118,7 +118,7 @@
"X-KDE-Keywords[es]": "bloquear,continuar,salvapantallas,bloqueo de
pantalla,bloqueo,contraseña,dormir,cerrar tapa,bloquear automáticamente,aspecto
del bloqueo de pantalla,tema de bloqueo de pantalla,fondo del bloqueo de
pantalla,pantalla de bloqueo,bloquear,bloquear pantalla",
"X-KDE-Keywords[eu]":
"giltzatu,berrekin,pantaila-babeslea,pantaila-giltzatua,giltzatzea,blokeoa,blokeatzea,pasahitza,lokartu,tapa
ixtea,automatikoki giltzatu,pantaila giltzatuaren itxura,pantaila giltzatuaren
gaia,pantaila giltzatuaren horma-papera,pantaila giltzatua,giltzatu pantaila",
"X-KDE-Keywords[fi]":
"lukitus,jatka,näytönsäästäjä,näyttölukko,estä,esto,salasana,valmiustila,sulje
kansi,lukitse automaattisesti,näytönlukituksen ulkoasu,näytönlukituksen
teema,näytönlukituksen tausta,taustakuva,lukitusnäyttö",
- "X-KDE-Keywords[fr]": "verrouiller, continuer, économiseur d'écran,
verrouillage, bloquer, blocage, mot de passe, veille, basculer l'écran,
verrouillage automatique, apparence de l'écran de verrouillage, thème de
l'écran de verrouillage, fond d'écran de verrouillage, écran de verrouillage,
verouillage de l'écran",
+ "X-KDE-Keywords[fr]": "verrouiller, continuer, économiseur d'écran,
verrouillage, bloquer, blocage, mot de passe, veille, basculer l'écran,
verrouillage automatique, apparence de l'écran de verrouillage, thème de
l'écran de verrouillage, fond d'écran de verrouillage, écran de verrouillage,
verrouillage de l'écran",
"X-KDE-Keywords[gl]":
"lock,bloquear,bloqueo,resume,continuar,screensaver,salvapantallas,screenlock,bloqueo
de
pantalla,locking,block,blocking,password,contrasinal,sleep,durmir,suspender,hibernar,close
lid,pechar a tapa,pechar a pantalla,lock automatically,bloquear
automaticamente,screen lock appearance,aparencia do bloqueo de pantalla,screen
lock theme,tema de bloqueo de pantalla,screen lock wallpaper,fondo do bloqueo
de pantalla,lockscreen,pantalla de bloqueo,lock screen",
"X-KDE-Keywords[he]": "נעילה,המשך,שומר מסך,נעילת מסך,מסך
נעילה,נעילה,חסימה,חסום,סיסמה,שינה,סגירת מסך,נעילה אוטומטית,מראה מסך נעילה,ערכת
עיצוב מסך נעילה,תמונת רקע למסך נעילה,ערכת נושא מסך נעילה",
"X-KDE-Keywords[hu]":
"zárolás,feloldás,képernyőkímélő,képernyőzár,zárolás,blokk,blokkolás,jelszó,alvó
mód,fedél lecsukása,automatikus zárolás,záróképernyő megjelenése,záróképernyő
téma,záróképernyő háttérkép,zárolóképernyő",
diff -Nru kscreenlocker-6.3.4/po/ko/kscreenlocker.po
kscreenlocker-6.3.5/po/ko/kscreenlocker.po
--- kscreenlocker-6.3.4/po/ko/kscreenlocker.po 2025-04-02 05:36:23.000000000
+0200
+++ kscreenlocker-6.3.5/po/ko/kscreenlocker.po 2025-05-06 19:57:16.000000000
+0200
@@ -1,6 +1,6 @@
# Copyright (C) YEAR This_file_is_part_of_KDE
# This file is distributed under the same license as the PACKAGE package.
-# Shinjo Park <[email protected]>, 2012, 2014, 2015, 2017, 2018, 2020, 2021,
2022, 2023.
+# SPDX-FileCopyrightText: 2012, 2014, 2015, 2017, 2018, 2020, 2021, 2022,
2023, 2025 Shinjo Park <[email protected]>
#
msgid ""
msgstr ""
@@ -15,7 +15,7 @@
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Lokalize 22.12.3\n"
+"X-Generator: Lokalize 23.08.5\n"
#: abstractlocker.cpp:43
#, kde-format
--- End Message ---