File indexing completed on 2024-04-14 03:57:45

0001 /*
0002     SPDX-FileCopyrightText: 2011 Ilia Kats <ilia-kats@gmx.net>
0003     SPDX-FileCopyrightText: 2013 Jan Grulich <jgrulich@redhat.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006 */
0007 
0008 #include "connection.h"
0009 #include "device.h"
0010 #include "nmdebug.h"
0011 #include "settings.h"
0012 #include "vpnconnection_p.h"
0013 
0014 NetworkManager::VpnConnectionPrivate::VpnConnectionPrivate(const QString &path, VpnConnection *q)
0015     : ActiveConnectionPrivate(path, q)
0016 #ifdef NMQT_STATIC
0017     , iface(NetworkManagerPrivate::DBUS_SERVICE, path, QDBusConnection::sessionBus())
0018 #else
0019     , iface(NetworkManagerPrivate::DBUS_SERVICE, path, QDBusConnection::systemBus())
0020 #endif
0021     , q_ptr(q)
0022 {
0023 }
0024 
0025 NetworkManager::VpnConnection::State NetworkManager::VpnConnectionPrivate::convertVpnConnectionState(uint state)
0026 {
0027     return static_cast<NetworkManager::VpnConnection::State>(state);
0028 }
0029 
0030 NetworkManager::VpnConnection::StateChangeReason NetworkManager::VpnConnectionPrivate::convertVpnConnectionStateReason(uint reason)
0031 {
0032     return static_cast<NetworkManager::VpnConnection::StateChangeReason>(reason);
0033 }
0034 
0035 NetworkManager::VpnConnection::VpnConnection(const QString &path, QObject *parent)
0036     : ActiveConnection(*new VpnConnectionPrivate(path, this), parent)
0037 {
0038     Q_D(VpnConnection);
0039 
0040     QDBusConnection::systemBus().connect(NetworkManagerPrivate::DBUS_SERVICE,
0041                                          d->path,
0042                                          NetworkManagerPrivate::FDO_DBUS_PROPERTIES,
0043                                          QLatin1String("PropertiesChanged"),
0044                                          d,
0045                                          SLOT(dbusPropertiesChanged(QString, QVariantMap, QStringList)));
0046     connect(&d->iface, &OrgFreedesktopNetworkManagerVPNConnectionInterface::VpnStateChanged, d, &VpnConnectionPrivate::vpnStateChanged);
0047 
0048     // We need to get ActiveConnection's properties, because by default every ActiveConnection
0049     // is basically a VpnConnection
0050     QVariantMap initialProperties =
0051         NetworkManagerPrivate::retrieveInitialProperties(OrgFreedesktopNetworkManagerConnectionActiveInterface::staticInterfaceName(), path);
0052     if (!initialProperties.isEmpty()) {
0053         d->propertiesChanged(initialProperties);
0054     }
0055 
0056     // Try to retrieve VPN specific properties if this is a VPN connection
0057     if (vpn()) {
0058         // Get all VpnConnection's properties at once
0059         QVariantMap initialProperties = NetworkManagerPrivate::retrieveInitialProperties(d->iface.staticInterfaceName(), path);
0060         if (!initialProperties.isEmpty()) {
0061             d->propertiesChanged(initialProperties);
0062         }
0063     }
0064 }
0065 
0066 NetworkManager::VpnConnection::~VpnConnection()
0067 {
0068 }
0069 
0070 QString NetworkManager::VpnConnection::banner() const
0071 {
0072     Q_D(const VpnConnection);
0073     // return d->banner; // FIXME NM doesn't Q_EMIT the Banner property change
0074     return d->iface.banner();
0075 }
0076 
0077 NetworkManager::VpnConnection::State NetworkManager::VpnConnection::state() const
0078 {
0079     Q_D(const VpnConnection);
0080     return d->state;
0081 }
0082 
0083 void NetworkManager::VpnConnectionPrivate::dbusPropertiesChanged(const QString &interfaceName,
0084                                                                  const QVariantMap &properties,
0085                                                                  const QStringList &invalidatedProperties)
0086 {
0087     Q_UNUSED(invalidatedProperties);
0088 
0089     if (interfaceName == QLatin1String("org.freedesktop.NetworkManager.VPN.Connection")) {
0090         propertiesChanged(properties);
0091     } else {
0092         ActiveConnectionPrivate::propertiesChanged(properties);
0093     }
0094 }
0095 
0096 void NetworkManager::VpnConnectionPrivate::propertyChanged(const QString &property, const QVariant &value)
0097 {
0098     Q_Q(VpnConnection);
0099 
0100     if (property == QLatin1String("Banner")) {
0101         banner = value.toString();
0102         Q_EMIT q->bannerChanged(banner);
0103     } else if (property == QLatin1String("VpnState")) {
0104         // Do not notify about changed VpnState twice, because there is also signal VpnStateChanged() from NetworkManager
0105         state = NetworkManager::VpnConnectionPrivate::convertVpnConnectionState(value.toUInt());
0106         // NetworkManager::VpnConnection::StateChangeReason reason =
0107         // NetworkManager::VpnConnectionPrivate::convertVpnConnectionStateReason(properties.key("Reason").toUInt()); Q_EMIT stateChanged(d->state, reason);
0108     } else {
0109         ActiveConnectionPrivate::propertyChanged(property, value);
0110     }
0111 }
0112 
0113 void NetworkManager::VpnConnectionPrivate::vpnStateChanged(uint newState, uint reason)
0114 {
0115     Q_Q(VpnConnection);
0116     Q_UNUSED(reason);
0117 
0118     state = NetworkManager::VpnConnectionPrivate::convertVpnConnectionState(newState);
0119     NetworkManager::VpnConnection::StateChangeReason stateChangeReason = NetworkManager::VpnConnectionPrivate::convertVpnConnectionStateReason(reason);
0120     Q_EMIT q->stateChanged(state, stateChangeReason);
0121 }
0122 
0123 NetworkManager::VpnConnection::operator VpnConnection *()
0124 {
0125     Q_D(VpnConnection);
0126     if (d->vpn) {
0127         return this;
0128     } else {
0129         return nullptr;
0130     }
0131 }
0132 
0133 #include "moc_vpnconnection.cpp"
0134 #include "moc_vpnconnection_p.cpp"