Bug#1033995: qtbase-opensource-src: Fix accessibility of qt5 applications run as root

Samuel Thibault sthibault at debian.org
Thu Apr 6 00:57:25 BST 2023


Source: qtbase-opensource-src
Version: 5.15.8+dfsg-3
Severity: important
Tags: patch upstream
Forwarded: https://bugreports.qt.io/browse/QTBUG-43674

Hello,

Currently, qt5 applications, when run in sudo, are not accessible to
screen readers. This is because the accessibility layer does not manage
to connect to the accessibility bus to export the application content:

https://bugreports.qt.io/browse/QTBUG-43674

Most of the support was merged into qt5, but there is a little fix
missing, that was missed by upstream. I have attached the fix, it is
very simple: the ordering in QSpiAccessibleBridge::QSpiAccessibleBridge
used to be

- new DBusConnection() creates the dbusConnection object
  - the DBusConnection::DBusConnection constructor connects to the atspi
    bus
- connect the enabledChanged signal

and this patch changes it to:

- new DBusConnection() creates the dbusConnection object
- connect the enabledChanged signal
- the DBusConnection::init method connects to the atspi bus

This is needed in the root case because since in that case it
cannot access the user session dbus, it uses a synchronous method,
in which case the enabledChanged signal is emitted from the
DBusConnection::DBusConnection constructor, and thus lost forever since
it was not connected yet at that time. So we need to connect the signal
before connecting to the atspi bus (and get the enabledChanged event).


This is particularly important because the calamares installer is based
on qt5 and runs as root, and it currently is completely inaccessible to
blind users, and this fix makes it possible for blind users to use it.


I have confirmed that this fixes the issue for bookworm, would it be
possible to upload to unstable? I'll then handle requesting the unblock
from the release team.

Samuel

-- System Information:
Debian Release: 12.0
  APT prefers testing
  APT policy: (990, 'testing'), (500, 'unstable-debug'), (500, 'testing-debug'), (500, 'stable-security'), (500, 'stable-debug'), (500, 'proposed-updates-debug'), (500, 'proposed-updates'), (500, 'oldstable-proposed-updates'), (500, 'oldoldstable'), (500, 'buildd-unstable'), (500, 'unstable'), (500, 'stable'), (500, 'oldstable'), (1, 'experimental-debug'), (1, 'buildd-experimental'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386, arm64

Kernel: Linux 6.2.0 (SMP w/8 CPU threads; PREEMPT)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
-------------- next part --------------
From: Frederik Gladhorn <frederik.gladhorn at qt.io>
Date: Tue, 12 Sep 2017 09:22:30 +0000 (+0200)
Subject: Fix accessibility on XCB when running as root
X-Git-Url: https://codereview.qt-project.org/gitweb?p=qt%2Fqtbase.git;a=commitdiff_plain;h=4ee3703ffaf063047285247016ee9e5c07ef3b53;hp=689606de91faecf91f1f92e8d355789d9be62d2f
Forwarded: https://bugreports.qt.io/browse/QTBUG-43674

Fix accessibility on XCB when running as root

Accessibility actually works when running applications as root, but we
would never properly connect, since the enabledChanged signal would be
emitted from the constructor in this case.
Only applications running as root would be affected, because all other
applications would go through the asynchronous pattern of getting the
bus address from dbus instead.
Since running apps as root won't let them access the session bus, the
xatom is the way to go.

[ChangeLog][QtGui][Accessibility] On XCB applications running as root are
now accessible.

Task-number: QTBUG-43674
Change-Id: I82cdc35f00693a8366dfcdab2f2c3c6dc5f5b783
---

---
 src/platformsupport/linuxaccessibility/bridge.cpp         |    1 +
 src/platformsupport/linuxaccessibility/dbusconnection.cpp |    8 ++++++++
 src/platformsupport/linuxaccessibility/dbusconnection_p.h |    1 +
 3 files changed, 10 insertions(+)

--- a/src/platformsupport/linuxaccessibility/bridge.cpp
+++ b/src/platformsupport/linuxaccessibility/bridge.cpp
@@ -65,6 +65,7 @@ QSpiAccessibleBridge::QSpiAccessibleBrid
 {
     dbusConnection = new DBusConnection();
     connect(dbusConnection, SIGNAL(enabledChanged(bool)), this, SLOT(enabledChanged(bool)));
+    dbusConnection->init();
 }
 
 void QSpiAccessibleBridge::enabledChanged(bool enabled)
--- a/src/platformsupport/linuxaccessibility/dbusconnection.cpp
+++ b/src/platformsupport/linuxaccessibility/dbusconnection.cpp
@@ -69,6 +69,14 @@ QT_BEGIN_NAMESPACE
 DBusConnection::DBusConnection(QObject *parent)
     : QObject(parent), m_a11yConnection(QString()), m_enabled(false)
 {
+}
+
+/**
+    \internal
+    Connect to the accessibility dbus service.
+*/
+void DBusConnection::init()
+{
     // Start monitoring if "org.a11y.Bus" is registered as DBus service.
     QDBusConnection c = QDBusConnection::sessionBus();
     if (!c.isConnected()) {
--- a/src/platformsupport/linuxaccessibility/dbusconnection_p.h
+++ b/src/platformsupport/linuxaccessibility/dbusconnection_p.h
@@ -67,6 +67,7 @@ class DBusConnection : public QObject
 public:
     DBusConnection(QObject *parent = nullptr);
     QDBusConnection connection() const;
+    void init();
     bool isEnabled() const { return m_enabled; }
 
 Q_SIGNALS:


More information about the Pkg-a11y-devel mailing list