diff options
author | Mårten Nordheim <[email protected]> | 2023-10-16 12:31:55 +0200 |
---|---|---|
committer | Mårten Nordheim <[email protected]> | 2023-10-16 17:42:36 +0200 |
commit | 9f49af182f3be4a6f6c87266db0c14409de08ba0 (patch) | |
tree | edb72ee8e53e971b8f1ff9f54f57650724a075f3 | |
parent | c04576cd7cdac15576dc78f43ba47d6af5e54c71 (diff) |
QNetworkInfo[NetworkManager]: Mark invalid if unconnected
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.
Pick-to: 6.5
Fixes: QTBUG-117490
Change-Id: I3c5ebb492f9ca4dfdf4353d77705ba993279eb69
Reviewed-by: Ilya Fedin <[email protected]>
Reviewed-by: Edward Welbourne <[email protected]>
(cherry picked from commit fe653b70ae271da9a110d627da4ad2609a1fb8db)
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 4c0ea14151c..e0ea0086e0a 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<QVariantMap> 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<QString,QVariant>,QList<QString>))); } 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<QDBusObjectPath> primaryConnectionDevicePath() const; QVariantMap propertyMap; + bool validDBusConnection = true; }; class PropertiesDBusInterface : public QDBusAbstractInterface |