From 9e6de9e8ef77c791230d9bc932911874b52f8fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Mon, 16 Oct 2023 12:31:55 +0200 Subject: [PATCH] QNetworkInfo[NetworkManager]: Mark invalid if unconnected MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On some configs (e.g. using Snap) the NetworkManager service is not available without some manifest or similar. In this case, the _interface_ we have is still valid but we can't connect to the service. So we need to mark the interface as invalid in this case, so that we can avoid trying to use this plugin. Fixes: QTBUG-117490 Change-Id: I3c5ebb492f9ca4dfdf4353d77705ba993279eb69 Reviewed-by: Ilya Fedin Reviewed-by: Edward Welbourne (cherry picked from commit fe653b70ae271da9a110d627da4ad2609a1fb8db) (cherry picked from commit 9f49af182f3be4a6f6c87266db0c14409de08ba0) Reviewed-by: MÃ¥rten Nordheim --- .../qnetworkmanagernetworkinformationbackend.cpp | 2 ++ .../networkmanager/qnetworkmanagerservice.cpp | 14 ++++++++------ .../networkmanager/qnetworkmanagerservice.h | 3 +++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/plugins/networkinformation/networkmanager/qnetworkmanagernetworkinformationbackend.cpp b/src/plugins/networkinformation/networkmanager/qnetworkmanagernetworkinformationbackend.cpp index 6ee84e06f8d..2d0d602ba0a 100644 --- a/src/plugins/networkinformation/networkmanager/qnetworkmanagernetworkinformationbackend.cpp +++ b/src/plugins/networkinformation/networkmanager/qnetworkmanagernetworkinformationbackend.cpp @@ -167,6 +167,8 @@ private: QNetworkManagerNetworkInformationBackend::QNetworkManagerNetworkInformationBackend() { + if (!iface.isValid()) + return; auto updateReachability = [this](QNetworkManagerInterface::NMState newState) { setReachability(reachabilityFromNMState(newState)); }; diff --git a/src/plugins/networkinformation/networkmanager/qnetworkmanagerservice.cpp b/src/plugins/networkinformation/networkmanager/qnetworkmanagerservice.cpp index 3a64c1892ca..30cfffbe9de 100644 --- a/src/plugins/networkinformation/networkmanager/qnetworkmanagerservice.cpp +++ b/src/plugins/networkinformation/networkmanager/qnetworkmanagerservice.cpp @@ -41,7 +41,7 @@ bool QNetworkManagerInterfaceBase::networkManagerAvailable() QNetworkManagerInterface::QNetworkManagerInterface(QObject *parent) : QNetworkManagerInterfaceBase(parent) { - if (!isValid()) + if (!QDBusAbstractInterface::isValid()) return; PropertiesDBusInterface managerPropertiesInterface( @@ -51,13 +51,15 @@ QNetworkManagerInterface::QNetworkManagerInterface(QObject *parent) argumentList << NM_DBUS_INTERFACE ""_L1; QDBusPendingReply propsReply = managerPropertiesInterface.callWithArgumentList( QDBus::Block, "GetAll"_L1, argumentList); - if (!propsReply.isError()) { - propertyMap = propsReply.value(); - } else { - qWarning() << "propsReply" << propsReply.error().message(); + if (propsReply.isError()) { + validDBusConnection = false; + if (auto error = propsReply.error(); error.type() != QDBusError::AccessDenied) + qWarning() << "Failed to query NetworkManager properties:" << error.message(); + return; } + propertyMap = propsReply.value(); - QDBusConnection::systemBus().connect(NM_DBUS_SERVICE ""_L1, NM_DBUS_PATH ""_L1, + validDBusConnection = QDBusConnection::systemBus().connect(NM_DBUS_SERVICE ""_L1, NM_DBUS_PATH ""_L1, DBUS_PROPERTIES_INTERFACE""_L1, "PropertiesChanged"_L1, this, SLOT(setProperties(QString, QMap, QList))); } diff --git a/src/plugins/networkinformation/networkmanager/qnetworkmanagerservice.h b/src/plugins/networkinformation/networkmanager/qnetworkmanagerservice.h index 9ca862d3988..c58a18d9bb0 100644 --- a/src/plugins/networkinformation/networkmanager/qnetworkmanagerservice.h +++ b/src/plugins/networkinformation/networkmanager/qnetworkmanagerservice.h @@ -136,6 +136,8 @@ public: NMDeviceType deviceType() const; NMMetered meteredState() const; + bool isValid() const { return QDBusAbstractInterface::isValid() && validDBusConnection; } + Q_SIGNALS: void stateChanged(NMState); void connectivityChanged(NMConnectivityState); @@ -155,6 +157,7 @@ private: std::optional primaryConnectionDevicePath() const; QVariantMap propertyMap; + bool validDBusConnection = true; }; class PropertiesDBusInterface : public QDBusAbstractInterface