File indexing completed on 2024-04-21 04:00:01

0001 /*
0002     SPDX-FileCopyrightText: 2012-2013 Jan Grulich <jgrulich@redhat.com>
0003     SPDX-FileCopyrightText: 2013 Daniel Nicoletti <dantti12@gmail.com>
0004     SPDX-FileCopyrightText: 2023 Volker Krause <vkrause@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "connectionsettings.h"
0010 #include "connectionsettings_p.h"
0011 
0012 #include "adslsetting.h"
0013 #include "bluetoothsetting.h"
0014 #include "bondsetting.h"
0015 #include "bridgeportsetting.h"
0016 #include "bridgesetting.h"
0017 #include "cdmasetting.h"
0018 #include "gsmsetting.h"
0019 #include "infinibandsetting.h"
0020 #include "iptunnelsetting.h"
0021 #include "ipv4setting.h"
0022 #include "ipv6setting.h"
0023 #include "olpcmeshsetting.h"
0024 #include "pppoesetting.h"
0025 #include "pppsetting.h"
0026 #include "security8021xsetting.h"
0027 #include "serialsetting.h"
0028 #include "tunsetting.h"
0029 #include "vlansetting.h"
0030 #include "vpnsetting.h"
0031 #include "wimaxsetting.h"
0032 #include "wiredsetting.h"
0033 #include "wireguardsetting.h"
0034 #include "wirelesssecuritysetting.h"
0035 #include "wirelesssetting.h"
0036 
0037 #undef signals
0038 
0039 #if !NM_CHECK_VERSION(1, 6, 0)
0040 #define NM_SETTING_CONNECTION_AUTOCONNECT_RETRIES "autoconnect-retries"
0041 #endif
0042 
0043 #if !NM_CHECK_VERSION(1, 12, 0)
0044 #define NM_SETTING_CONNECTION_MDNS "mdns"
0045 #endif
0046 
0047 #if !NM_CHECK_VERSION(1, 16, 0)
0048 #define NM_SETTING_WIREGUARD_SETTING_NAME "wireguard"
0049 #endif
0050 
0051 #include "genericsetting.h"
0052 #include "teamsetting.h"
0053 
0054 #include <QUuid>
0055 
0056 namespace NetworkManager
0057 {
0058 extern bool checkVersion(const int x, const int y, const int z);
0059 }
0060 
0061 NetworkManager::ConnectionSettingsPrivate::ConnectionSettingsPrivate(ConnectionSettings *q)
0062     : name(NM_SETTING_CONNECTION_SETTING_NAME)
0063     , uuid(QUuid().toString())
0064     , type(ConnectionSettings::Wired)
0065     , autoconnect(true)
0066     , readOnly(false)
0067     , gatewayPingTimeout(0)
0068     , autoconnectPriority(0)
0069     , autoconnectRetries(-1)
0070     , autoconnectSlaves(ConnectionSettings::SlavesDefault)
0071     , lldp(ConnectionSettings::LldpDefault)
0072     , metered(ConnectionSettings::MeteredUnknown)
0073     , mdns(ConnectionSettings::MdnsDefault)
0074     , q_ptr(q)
0075 {
0076 }
0077 
0078 void NetworkManager::ConnectionSettingsPrivate::addSetting(const NetworkManager::Setting::Ptr &setting)
0079 {
0080     settings.push_back(setting);
0081 }
0082 
0083 void NetworkManager::ConnectionSettingsPrivate::clearSettings()
0084 {
0085     settings.clear();
0086 }
0087 
0088 void NetworkManager::ConnectionSettingsPrivate::initSettings(NMBluetoothCapabilities bt_cap)
0089 {
0090     clearSettings();
0091 
0092     switch (type) {
0093     case ConnectionSettings::Adsl:
0094         addSetting(Setting::Ptr(new AdslSetting()));
0095         addSetting(Setting::Ptr(new Ipv4Setting()));
0096         addSetting(Setting::Ptr(new Ipv6Setting()));
0097         break;
0098     case ConnectionSettings::Bond:
0099         addSetting(Setting::Ptr(new BondSetting()));
0100         addSetting(Setting::Ptr(new Ipv4Setting()));
0101         addSetting(Setting::Ptr(new Ipv6Setting()));
0102         break;
0103     case ConnectionSettings::Bluetooth:
0104         addSetting(Setting::Ptr(new BluetoothSetting()));
0105         addSetting(Setting::Ptr(new Ipv4Setting()));
0106         // addSetting(Setting::Ptr(new Ipv6Setting()));
0107         if (bt_cap == NM_BT_CAPABILITY_DUN) {
0108             addSetting(Setting::Ptr(new GsmSetting()));
0109             addSetting(Setting::Ptr(new PppSetting()));
0110             addSetting(Setting::Ptr(new SerialSetting()));
0111         }
0112         break;
0113     case ConnectionSettings::Bridge:
0114         addSetting(Setting::Ptr(new BridgeSetting()));
0115         addSetting(Setting::Ptr(new Ipv4Setting()));
0116         addSetting(Setting::Ptr(new Ipv6Setting()));
0117         break;
0118     case ConnectionSettings::Cdma:
0119         addSetting(Setting::Ptr(new CdmaSetting()));
0120         addSetting(Setting::Ptr(new Ipv4Setting()));
0121         if (NetworkManager::checkVersion(1, 0, 0)) {
0122             addSetting(Setting::Ptr(new Ipv6Setting()));
0123         }
0124         addSetting(Setting::Ptr(new PppSetting()));
0125         break;
0126     case ConnectionSettings::Gsm:
0127         addSetting(Setting::Ptr(new GsmSetting()));
0128         addSetting(Setting::Ptr(new Ipv4Setting()));
0129         if (NetworkManager::checkVersion(1, 0, 0)) {
0130             addSetting(Setting::Ptr(new Ipv6Setting()));
0131         }
0132         addSetting(Setting::Ptr(new PppSetting()));
0133         break;
0134     case ConnectionSettings::Infiniband:
0135         addSetting(Setting::Ptr(new InfinibandSetting()));
0136         addSetting(Setting::Ptr(new Ipv4Setting()));
0137         addSetting(Setting::Ptr(new Ipv6Setting()));
0138         break;
0139     case ConnectionSettings::OLPCMesh:
0140         addSetting(Setting::Ptr(new Ipv4Setting()));
0141         addSetting(Setting::Ptr(new Ipv6Setting()));
0142         addSetting(Setting::Ptr(new OlpcMeshSetting()));
0143         break;
0144     case ConnectionSettings::Pppoe:
0145         addSetting(Setting::Ptr(new Ipv4Setting()));
0146         // addSetting(new Ipv6Setting()));
0147         addSetting(Setting::Ptr(new PppSetting()));
0148         addSetting(Setting::Ptr(new PppoeSetting()));
0149         addSetting(Setting::Ptr(new WiredSetting()));
0150         break;
0151     case ConnectionSettings::Vlan:
0152         addSetting(Setting::Ptr(new Ipv4Setting()));
0153         addSetting(Setting::Ptr(new Ipv6Setting()));
0154         addSetting(Setting::Ptr(new VlanSetting()));
0155         break;
0156     case ConnectionSettings::Vpn:
0157         addSetting(Setting::Ptr(new Ipv4Setting()));
0158         addSetting(Setting::Ptr(new Ipv6Setting()));
0159         addSetting(Setting::Ptr(new VpnSetting()));
0160         break;
0161     case ConnectionSettings::Wimax:
0162         addSetting(Setting::Ptr(new Ipv4Setting()));
0163         addSetting(Setting::Ptr(new Ipv6Setting()));
0164         addSetting(Setting::Ptr(new WimaxSetting()));
0165         break;
0166     case ConnectionSettings::Wired:
0167         addSetting(Setting::Ptr(new Ipv4Setting()));
0168         addSetting(Setting::Ptr(new Ipv6Setting()));
0169         addSetting(Setting::Ptr(new Security8021xSetting()));
0170         addSetting(Setting::Ptr(new WiredSetting()));
0171         break;
0172     case ConnectionSettings::Wireless:
0173         addSetting(Setting::Ptr(new Ipv4Setting()));
0174         addSetting(Setting::Ptr(new Ipv6Setting()));
0175         addSetting(Setting::Ptr(new Security8021xSetting()));
0176         addSetting(Setting::Ptr(new WirelessSetting()));
0177         addSetting(Setting::Ptr(new WirelessSecuritySetting()));
0178         break;
0179     case ConnectionSettings::Team:
0180         addSetting(Setting::Ptr(new TeamSetting()));
0181         addSetting(Setting::Ptr(new Ipv4Setting()));
0182         addSetting(Setting::Ptr(new Ipv6Setting()));
0183         break;
0184     case ConnectionSettings::Generic:
0185         addSetting(Setting::Ptr(new GenericSetting()));
0186         addSetting(Setting::Ptr(new Ipv4Setting()));
0187         addSetting(Setting::Ptr(new Ipv6Setting()));
0188         break;
0189     case ConnectionSettings::Tun:
0190         addSetting(Setting::Ptr(new TunSetting()));
0191         addSetting(Setting::Ptr(new Ipv4Setting()));
0192         addSetting(Setting::Ptr(new Ipv6Setting()));
0193         break;
0194     case ConnectionSettings::IpTunnel:
0195         addSetting(Setting::Ptr(new IpTunnelSetting()));
0196         addSetting(Setting::Ptr(new Ipv4Setting()));
0197         addSetting(Setting::Ptr(new Ipv6Setting()));
0198         break;
0199     case ConnectionSettings::WireGuard:
0200         addSetting(Setting::Ptr(new WireGuardSetting()));
0201         addSetting(Setting::Ptr(new Ipv4Setting()));
0202         addSetting(Setting::Ptr(new Ipv6Setting()));
0203         break;
0204     case ConnectionSettings::Unknown:
0205     default:
0206         break;
0207     }
0208 }
0209 
0210 void NetworkManager::ConnectionSettingsPrivate::initSettings(const NetworkManager::ConnectionSettings::Ptr &connectionSettings)
0211 {
0212     Q_Q(ConnectionSettings);
0213 
0214     clearSettings();
0215 
0216     switch (type) {
0217     case ConnectionSettings::Adsl:
0218         addSetting(connectionSettings->setting(Setting::Adsl));
0219         addSetting(connectionSettings->setting(Setting::Ipv4));
0220         addSetting(connectionSettings->setting(Setting::Ipv6));
0221         break;
0222     case ConnectionSettings::Bond:
0223         addSetting(connectionSettings->setting(Setting::Bond));
0224         addSetting(connectionSettings->setting(Setting::Ipv4));
0225         addSetting(connectionSettings->setting(Setting::Ipv6));
0226         break;
0227     case ConnectionSettings::Bluetooth:
0228         addSetting(connectionSettings->setting(Setting::Bluetooth));
0229         addSetting(connectionSettings->setting(Setting::Ipv4));
0230         if (NetworkManager::checkVersion(1, 0, 0)) {
0231             addSetting(connectionSettings->setting(Setting::Ipv6));
0232         }
0233         if (q->setting(Setting::Gsm) && q->setting(Setting::Ppp) && q->setting(Setting::Serial)) {
0234             addSetting(connectionSettings->setting(Setting::Gsm));
0235             addSetting(connectionSettings->setting(Setting::Ppp));
0236             addSetting(connectionSettings->setting(Setting::Serial));
0237         }
0238         break;
0239     case ConnectionSettings::Bridge:
0240         addSetting(connectionSettings->setting(Setting::Bridge));
0241         addSetting(connectionSettings->setting(Setting::Ipv4));
0242         addSetting(connectionSettings->setting(Setting::Ipv6));
0243         break;
0244     case ConnectionSettings::Cdma:
0245         addSetting(connectionSettings->setting(Setting::Cdma));
0246         addSetting(connectionSettings->setting(Setting::Ipv4));
0247         if (NetworkManager::checkVersion(1, 0, 0)) {
0248             addSetting(connectionSettings->setting(Setting::Ipv6));
0249         }
0250         addSetting(connectionSettings->setting(Setting::Ppp));
0251         break;
0252     case ConnectionSettings::Gsm:
0253         addSetting(connectionSettings->setting(Setting::Gsm));
0254         addSetting(connectionSettings->setting(Setting::Ipv4));
0255         if (NetworkManager::checkVersion(1, 0, 0)) {
0256             addSetting(connectionSettings->setting(Setting::Ipv6));
0257         }
0258         addSetting(connectionSettings->setting(Setting::Ppp));
0259         break;
0260     case ConnectionSettings::Infiniband:
0261         addSetting(connectionSettings->setting(Setting::Infiniband));
0262         addSetting(connectionSettings->setting(Setting::Ipv4));
0263         addSetting(connectionSettings->setting(Setting::Ipv6));
0264         break;
0265     case ConnectionSettings::OLPCMesh:
0266         addSetting(connectionSettings->setting(Setting::Ipv4));
0267         addSetting(connectionSettings->setting(Setting::Ipv6));
0268         addSetting(connectionSettings->setting(Setting::OlpcMesh));
0269         break;
0270     case ConnectionSettings::Pppoe:
0271         addSetting(connectionSettings->setting(Setting::Ipv4));
0272         // addSetting(Ipv6Setting(connectionSettings->setting(Setting::Ipv6));
0273         addSetting(connectionSettings->setting(Setting::Ppp));
0274         addSetting(connectionSettings->setting(Setting::Pppoe));
0275         addSetting(connectionSettings->setting(Setting::Wired));
0276         break;
0277     case ConnectionSettings::Vlan:
0278         addSetting(connectionSettings->setting(Setting::Ipv4));
0279         addSetting(connectionSettings->setting(Setting::Ipv6));
0280         addSetting(connectionSettings->setting(Setting::Vlan));
0281         break;
0282     case ConnectionSettings::Vpn:
0283         addSetting(connectionSettings->setting(Setting::Ipv4));
0284         addSetting(connectionSettings->setting(Setting::Ipv6));
0285         addSetting(connectionSettings->setting(Setting::Vpn));
0286         break;
0287     case ConnectionSettings::Wimax:
0288         addSetting(connectionSettings->setting(Setting::Ipv4));
0289         addSetting(connectionSettings->setting(Setting::Ipv6));
0290         addSetting(connectionSettings->setting(Setting::Wimax));
0291         break;
0292     case ConnectionSettings::Wired:
0293         addSetting(connectionSettings->setting(Setting::Ipv4));
0294         addSetting(connectionSettings->setting(Setting::Ipv6));
0295         addSetting(connectionSettings->setting(Setting::Security8021x));
0296         addSetting(connectionSettings->setting(Setting::Wired));
0297         break;
0298     case ConnectionSettings::Wireless:
0299         addSetting(connectionSettings->setting(Setting::Ipv4));
0300         addSetting(connectionSettings->setting(Setting::Ipv6));
0301         addSetting(connectionSettings->setting(Setting::Security8021x));
0302         addSetting(connectionSettings->setting(Setting::Wireless));
0303         addSetting(connectionSettings->setting(Setting::WirelessSecurity));
0304         break;
0305     case ConnectionSettings::Team:
0306         addSetting(connectionSettings->setting(Setting::Team));
0307         addSetting(connectionSettings->setting(Setting::Ipv4));
0308         addSetting(connectionSettings->setting(Setting::Ipv6));
0309         break;
0310     case ConnectionSettings::Generic:
0311         addSetting(connectionSettings->setting(Setting::Generic));
0312         addSetting(connectionSettings->setting(Setting::Ipv4));
0313         addSetting(connectionSettings->setting(Setting::Ipv6));
0314         break;
0315     case ConnectionSettings::Tun:
0316         addSetting(connectionSettings->setting(Setting::Tun));
0317         addSetting(connectionSettings->setting(Setting::Ipv4));
0318         addSetting(connectionSettings->setting(Setting::Ipv6));
0319         break;
0320     case ConnectionSettings::IpTunnel:
0321         addSetting(connectionSettings->setting(Setting::IpTunnel));
0322         addSetting(connectionSettings->setting(Setting::Ipv4));
0323         addSetting(connectionSettings->setting(Setting::Ipv6));
0324         break;
0325     case ConnectionSettings::WireGuard:
0326         addSetting(connectionSettings->setting(Setting::WireGuard));
0327         addSetting(connectionSettings->setting(Setting::Ipv4));
0328         addSetting(connectionSettings->setting(Setting::Ipv6));
0329         break;
0330     case ConnectionSettings::Unknown:
0331     default:
0332         break;
0333     }
0334 }
0335 
0336 NetworkManager::ConnectionSettings::ConnectionType NetworkManager::ConnectionSettings::typeFromString(const QString &typeString)
0337 {
0338     ConnectionSettings::ConnectionType type = Wired;
0339 
0340     if (typeString == QLatin1String(NM_SETTING_ADSL_SETTING_NAME)) {
0341         type = Adsl;
0342     } else if (typeString == QLatin1String(NM_SETTING_BLUETOOTH_SETTING_NAME)) {
0343         type = Bluetooth;
0344     } else if (typeString == QLatin1String(NM_SETTING_BOND_SETTING_NAME)) {
0345         type = Bond;
0346     } else if (typeString == QLatin1String(NM_SETTING_BRIDGE_SETTING_NAME)) {
0347         type = Bridge;
0348     } else if (typeString == QLatin1String(NM_SETTING_CDMA_SETTING_NAME)) {
0349         type = Cdma;
0350     } else if (typeString == QLatin1String(NM_SETTING_GSM_SETTING_NAME)) {
0351         type = Gsm;
0352     } else if (typeString == QLatin1String(NM_SETTING_INFINIBAND_SETTING_NAME)) {
0353         type = Infiniband;
0354     } else if (typeString == QLatin1String(NM_SETTING_OLPC_MESH_SETTING_NAME)) {
0355         type = OLPCMesh;
0356     } else if (typeString == QLatin1String(NM_SETTING_PPPOE_SETTING_NAME)) {
0357         type = Pppoe;
0358     } else if (typeString == QLatin1String(NM_SETTING_VLAN_SETTING_NAME)) {
0359         type = Vlan;
0360     } else if (typeString == QLatin1String(NM_SETTING_VPN_SETTING_NAME)) {
0361         type = Vpn;
0362     } else if (typeString == QLatin1String(NM_SETTING_WIMAX_SETTING_NAME)) {
0363         type = Wimax;
0364     } else if (typeString == QLatin1String(NM_SETTING_WIRED_SETTING_NAME)) {
0365         type = Wired;
0366     } else if (typeString == QLatin1String(NM_SETTING_WIRELESS_SETTING_NAME)) {
0367         type = Wireless;
0368     } else if (typeString == QLatin1String(NM_SETTING_TEAM_SETTING_NAME)) {
0369         type = Team;
0370     } else if (typeString == QLatin1String(NM_SETTING_GENERIC_SETTING_NAME)) {
0371         type = Generic;
0372     } else if (typeString == QLatin1String(NM_SETTING_TUN_SETTING_NAME)) {
0373         type = Tun;
0374     } else if (typeString == QLatin1String(NM_SETTING_IP_TUNNEL_SETTING_NAME)) {
0375         type = IpTunnel;
0376     } else if (typeString == QLatin1String(NM_SETTING_WIREGUARD_SETTING_NAME)) {
0377         type = WireGuard;
0378     }
0379 
0380     return type;
0381 }
0382 
0383 QString NetworkManager::ConnectionSettings::typeAsString(NetworkManager::ConnectionSettings::ConnectionType type)
0384 {
0385     QString typeString;
0386 
0387     switch (type) {
0388     case Adsl:
0389         typeString = QLatin1String(NM_SETTING_ADSL_SETTING_NAME);
0390         break;
0391     case Bond:
0392         typeString = QLatin1String(NM_SETTING_BOND_SETTING_NAME);
0393         break;
0394     case Bluetooth:
0395         typeString = QLatin1String(NM_SETTING_BLUETOOTH_SETTING_NAME);
0396         break;
0397     case Bridge:
0398         typeString = QLatin1String(NM_SETTING_BRIDGE_SETTING_NAME);
0399         break;
0400     case Cdma:
0401         typeString = QLatin1String(NM_SETTING_CDMA_SETTING_NAME);
0402         break;
0403     case Gsm:
0404         typeString = QLatin1String(NM_SETTING_GSM_SETTING_NAME);
0405         break;
0406     case Infiniband:
0407         typeString = QLatin1String(NM_SETTING_INFINIBAND_SETTING_NAME);
0408         break;
0409     case OLPCMesh:
0410         typeString = QLatin1String(NM_SETTING_OLPC_MESH_SETTING_NAME);
0411         break;
0412     case Pppoe:
0413         typeString = QLatin1String(NM_SETTING_PPPOE_SETTING_NAME);
0414         break;
0415     case Vlan:
0416         typeString = QLatin1String(NM_SETTING_VLAN_SETTING_NAME);
0417         break;
0418     case Vpn:
0419         typeString = QLatin1String(NM_SETTING_VPN_SETTING_NAME);
0420         break;
0421     case Wimax:
0422         typeString = QLatin1String(NM_SETTING_WIMAX_SETTING_NAME);
0423         break;
0424     case Wired:
0425         typeString = QLatin1String(NM_SETTING_WIRED_SETTING_NAME);
0426         break;
0427     case Wireless:
0428         typeString = QLatin1String(NM_SETTING_WIRELESS_SETTING_NAME);
0429         break;
0430     case Team:
0431         typeString = QLatin1String(NM_SETTING_TEAM_SETTING_NAME);
0432         break;
0433     case Generic:
0434         typeString = QLatin1String(NM_SETTING_GENERIC_SETTING_NAME);
0435         break;
0436     case Tun:
0437         typeString = QLatin1String(NM_SETTING_TUN_SETTING_NAME);
0438         break;
0439     case IpTunnel:
0440         typeString = QLatin1String(NM_SETTING_IP_TUNNEL_SETTING_NAME);
0441         break;
0442     case WireGuard:
0443         typeString = QLatin1String(NM_SETTING_WIREGUARD_SETTING_NAME);
0444         break;
0445     default:
0446         break;
0447     };
0448 
0449     return typeString;
0450 }
0451 
0452 QString NetworkManager::ConnectionSettings::createNewUuid()
0453 {
0454     return QUuid::createUuid().toString().mid(1, QUuid::createUuid().toString().length() - 2);
0455 }
0456 
0457 NetworkManager::ConnectionSettings::ConnectionSettings()
0458     : d_ptr(new ConnectionSettingsPrivate(this))
0459 {
0460 }
0461 
0462 NetworkManager::ConnectionSettings::ConnectionSettings(NetworkManager::ConnectionSettings::ConnectionType type, NMBluetoothCapabilities bt_cap)
0463     : d_ptr(new ConnectionSettingsPrivate(this))
0464 {
0465     setConnectionType(type, bt_cap);
0466 }
0467 
0468 NetworkManager::ConnectionSettings::ConnectionSettings(const NetworkManager::ConnectionSettings::Ptr &other)
0469     : d_ptr(new ConnectionSettingsPrivate(this))
0470 {
0471     Q_D(ConnectionSettings);
0472 
0473     setId(other->id());
0474     setUuid(other->uuid());
0475     setInterfaceName(other->interfaceName());
0476     setConnectionType(other->connectionType());
0477     setPermissions(other->permissions());
0478     setAutoconnect(other->autoconnect());
0479     setAutoconnectPriority(other->autoconnectPriority());
0480     setTimestamp(other->timestamp());
0481     setReadOnly(other->readOnly());
0482     setZone(other->zone());
0483     setMaster(other->master());
0484     setSlaveType(other->slaveType());
0485     setGatewayPingTimeout(other->gatewayPingTimeout());
0486     setAutoconnectRetries(other->autoconnectRetries());
0487     setAutoconnectSlaves(other->autoconnectSlaves());
0488     setLldp(other->lldp());
0489     setMetered(other->metered());
0490     setMdns(other->mdns());
0491     setStableId(other->stableId());
0492 
0493     d->initSettings(other);
0494 }
0495 
0496 NetworkManager::ConnectionSettings::ConnectionSettings(const NMVariantMapMap &map)
0497     : d_ptr(new ConnectionSettingsPrivate(this))
0498 {
0499     fromMap(map);
0500 }
0501 
0502 NetworkManager::ConnectionSettings::~ConnectionSettings()
0503 {
0504     d_ptr->clearSettings();
0505 
0506     delete d_ptr;
0507 }
0508 
0509 void NetworkManager::ConnectionSettings::fromMap(const NMVariantMapMap &map)
0510 {
0511     QVariantMap connectionSettings = map.value(QLatin1String(NM_SETTING_CONNECTION_SETTING_NAME));
0512 
0513     setId(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_ID)).toString());
0514     setUuid(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_UUID)).toString());
0515     setConnectionType(typeFromString(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_TYPE)).toString()));
0516 
0517     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_INTERFACE_NAME))) {
0518         setInterfaceName(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_INTERFACE_NAME)).toString());
0519     }
0520     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_PERMISSIONS))) {
0521         const QStringList permissions = connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_PERMISSIONS)).toStringList();
0522         for (const QString &permission : permissions) {
0523             const QStringList split = permission.split(QLatin1Char(':'), Qt::KeepEmptyParts);
0524             addToPermissions(split.at(1), split.at(2));
0525         }
0526     }
0527 
0528     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_AUTOCONNECT))) {
0529         setAutoconnect(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_AUTOCONNECT)).toBool());
0530     }
0531 
0532     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY))) {
0533         setAutoconnectPriority(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY)).toInt());
0534     }
0535 
0536     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_TIMESTAMP))) {
0537         const int timestamp = connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_TIMESTAMP)).toInt();
0538         setTimestamp(QDateTime::fromSecsSinceEpoch(timestamp));
0539     }
0540 
0541     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_READ_ONLY))) {
0542         setReadOnly(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_READ_ONLY)).toBool());
0543     }
0544 
0545     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_ZONE))) {
0546         setZone(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_ZONE)).toString());
0547     }
0548 
0549     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_MASTER))) {
0550         setMaster(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_MASTER)).toString());
0551     }
0552 
0553     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_SLAVE_TYPE))) {
0554         setSlaveType(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_SLAVE_TYPE)).toString());
0555     }
0556 
0557     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_SECONDARIES))) {
0558         setSecondaries(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_SECONDARIES)).toStringList());
0559     }
0560 
0561     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT))) {
0562         setGatewayPingTimeout(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT)).toUInt());
0563     }
0564 
0565     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_AUTOCONNECT_RETRIES))) {
0566         setAutoconnectRetries(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_AUTOCONNECT_RETRIES)).toInt());
0567     }
0568 
0569     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES))) {
0570         setAutoconnectSlaves(
0571             (NetworkManager::ConnectionSettings::AutoconnectSlaves)connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES)).toInt());
0572     }
0573 
0574     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_LLDP))) {
0575         setLldp((NetworkManager::ConnectionSettings::Lldp)connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_LLDP)).toInt());
0576     }
0577 
0578     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_METERED))) {
0579         setMetered((NetworkManager::ConnectionSettings::Metered)connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_METERED)).toInt());
0580     }
0581 
0582     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_MDNS))) {
0583         setMdns((NetworkManager::ConnectionSettings::Mdns)connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_MDNS)).toInt());
0584     }
0585 
0586     if (connectionSettings.contains(QLatin1String(NM_SETTING_CONNECTION_STABLE_ID))) {
0587         setStableId(connectionSettings.value(QLatin1String(NM_SETTING_CONNECTION_STABLE_ID)).toString());
0588     }
0589 
0590     const auto settingsList = settings();
0591     for (const Setting::Ptr &setting : settingsList) {
0592         if (map.contains(setting->name())) {
0593             setting->fromMap(map.value(setting->name()));
0594             setting->setInitialized(true);
0595         } else {
0596             setting->setInitialized(false);
0597         }
0598     }
0599 }
0600 
0601 static struct {
0602     const char *name;
0603     NetworkManager::Security8021xSetting::EapMethod method;
0604 } constexpr const eap_methods[] = {
0605     {"PEAP", NetworkManager::Security8021xSetting::EapMethodPeap},
0606     {"PWD", NetworkManager::Security8021xSetting::EapMethodPwd},
0607     {"TLS", NetworkManager::Security8021xSetting::EapMethodTls},
0608     {"TTLS", NetworkManager::Security8021xSetting::EapMethodTtls},
0609 };
0610 
0611 static struct {
0612     const char *name;
0613     NetworkManager::Security8021xSetting::AuthMethod method;
0614 } constexpr const auth_methods[] = {
0615     {"GTC", NetworkManager::Security8021xSetting::AuthMethodGtc},
0616     {"MSCHAP", NetworkManager::Security8021xSetting::AuthMethodMschap},
0617     {"MSCHAPV2", NetworkManager::Security8021xSetting::AuthMethodMschapv2},
0618     {"PAP", NetworkManager::Security8021xSetting::AuthMethodPap},
0619 };
0620 
0621 void NetworkManager::ConnectionSettings::fromMeCard(const QVariantMap &map)
0622 {
0623     const auto ssid = map.value(QLatin1String("S")).toString();
0624     setId(ssid);
0625 
0626     auto wifiSetting = setting(Setting::Wireless).dynamicCast<WirelessSetting>();
0627     wifiSetting->setInitialized(true);
0628     wifiSetting->setSsid(ssid.toUtf8());
0629 
0630     auto wifiSecurity = setting(Setting::WirelessSecurity).dynamicCast<WirelessSecuritySetting>();
0631     const auto securityType = map.value(QLatin1String("T")).toString();
0632 
0633     if (!securityType.isEmpty() && securityType != QLatin1String("nopass")) {
0634         wifiSecurity->setInitialized(true);
0635     }
0636 
0637     if (securityType == QLatin1String("WPA") || securityType == QLatin1String("WEP")) {
0638         wifiSecurity->setKeyMgmt(NetworkManager::WirelessSecuritySetting::WpaPsk);
0639         wifiSecurity->setPsk(map.value(QLatin1String("P")).toString());
0640         wifiSecurity->setPskFlags(NetworkManager::Setting::AgentOwned);
0641     } else if (securityType == QLatin1String("WPA2-EAP")) {
0642         wifiSecurity->setKeyMgmt(NetworkManager::WirelessSecuritySetting::WpaEap);
0643         auto sec8021x = setting(Setting::Security8021x).dynamicCast<Security8021xSetting>();
0644         sec8021x->setAnonymousIdentity(map.value(QLatin1String("A")).toString());
0645         sec8021x->setIdentity(map.value(QLatin1String("I")).toString());
0646         sec8021x->setPassword(map.value(QLatin1String("P")).toString());
0647 
0648         const auto eapMethod = map.value(QLatin1String("E")).toString();
0649         for (const auto &method : eap_methods) {
0650             if (eapMethod == QLatin1String(method.name)) {
0651                 sec8021x->setEapMethods({method.method});
0652                 break;
0653             }
0654         }
0655         const auto phase2AuthMethod = map.value(QLatin1String("PH2")).toString();
0656         for (const auto &method : auth_methods) {
0657             if (phase2AuthMethod == QLatin1String(method.name)) {
0658                 sec8021x->setPhase2AuthMethod(method.method);
0659                 break;
0660             }
0661         }
0662     }
0663 }
0664 
0665 NMVariantMapMap NetworkManager::ConnectionSettings::toMap() const
0666 {
0667     NMVariantMapMap result;
0668     QVariantMap connectionSetting;
0669 
0670     if (!id().isEmpty()) {
0671         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_ID), id());
0672     }
0673 
0674     if (!uuid().isEmpty()) {
0675         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_UUID), uuid());
0676     }
0677 
0678     if (connectionType()) {
0679         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_TYPE), typeAsString(connectionType()));
0680     }
0681 
0682     if (!interfaceName().isEmpty()) {
0683         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_INTERFACE_NAME), interfaceName());
0684     }
0685 
0686     if (!permissions().isEmpty()) {
0687         QStringList perm;
0688         QHash<QString, QString> perms = permissions();
0689         QHash<QString, QString>::const_iterator it = perms.constBegin();
0690         while (it != perms.constEnd()) {
0691             const QString tmp = "user:" + it.key() + ':' + it.value();
0692             perm << tmp;
0693             ++it;
0694         }
0695 
0696         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_PERMISSIONS), perm);
0697     }
0698 
0699     if (!autoconnect()) {
0700         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_AUTOCONNECT), autoconnect());
0701     }
0702 
0703     if (autoconnectPriority()) {
0704         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY), autoconnectPriority());
0705     }
0706 
0707     if (timestamp().isValid()) {
0708         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_TIMESTAMP), timestamp().toSecsSinceEpoch());
0709     }
0710 
0711     if (readOnly()) {
0712         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_READ_ONLY), readOnly());
0713     }
0714 
0715     if (!zone().isEmpty()) {
0716         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_ZONE), zone());
0717     }
0718 
0719     if (!master().isEmpty()) {
0720         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_MASTER), master());
0721     }
0722 
0723     if (!slaveType().isEmpty()) {
0724         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_SLAVE_TYPE), slaveType());
0725     }
0726 
0727     if (!secondaries().isEmpty()) {
0728         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_SECONDARIES), secondaries());
0729     }
0730 
0731     if (gatewayPingTimeout()) {
0732         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT), gatewayPingTimeout());
0733     }
0734 
0735     if (autoconnectRetries() >= 0) {
0736         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_AUTOCONNECT_RETRIES), autoconnectRetries());
0737     }
0738 
0739     connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES), autoconnectSlaves());
0740     connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_LLDP), lldp());
0741     connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_METERED), metered());
0742 
0743     if (mdns() != MdnsDefault) {
0744         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_MDNS), mdns());
0745     }
0746 
0747     if (!stableId().isEmpty()) {
0748         connectionSetting.insert(QLatin1String(NM_SETTING_CONNECTION_STABLE_ID), stableId());
0749     }
0750 
0751     result.insert(QLatin1String(NM_SETTING_CONNECTION_SETTING_NAME), connectionSetting);
0752 
0753     const auto settingsList = settings();
0754     for (const Setting::Ptr &setting : settingsList) {
0755         QVariantMap map = setting->toMap();
0756         if (!setting->isNull()) {
0757             result.insert(setting->name(), map);
0758         }
0759     }
0760     return result;
0761 }
0762 
0763 QString NetworkManager::ConnectionSettings::name() const
0764 {
0765     Q_D(const ConnectionSettings);
0766 
0767     return d->name;
0768 }
0769 
0770 void NetworkManager::ConnectionSettings::setId(const QString &id)
0771 {
0772     Q_D(ConnectionSettings);
0773 
0774     d->id = id;
0775 }
0776 
0777 QString NetworkManager::ConnectionSettings::id() const
0778 {
0779     Q_D(const ConnectionSettings);
0780 
0781     return d->id;
0782 }
0783 
0784 void NetworkManager::ConnectionSettings::setUuid(const QString &uuid)
0785 {
0786     Q_D(ConnectionSettings);
0787 
0788     d->uuid = uuid;
0789 }
0790 
0791 QString NetworkManager::ConnectionSettings::uuid() const
0792 {
0793     Q_D(const ConnectionSettings);
0794 
0795     return d->uuid;
0796 }
0797 
0798 void NetworkManager::ConnectionSettings::setInterfaceName(const QString &interfaceName)
0799 {
0800     Q_D(ConnectionSettings);
0801 
0802     d->interfaceName = interfaceName;
0803 }
0804 
0805 QString NetworkManager::ConnectionSettings::interfaceName() const
0806 {
0807     Q_D(const ConnectionSettings);
0808 
0809     return d->interfaceName;
0810 }
0811 
0812 void NetworkManager::ConnectionSettings::setConnectionType(NetworkManager::ConnectionSettings::ConnectionType type, NMBluetoothCapabilities bt_cap)
0813 {
0814     Q_D(ConnectionSettings);
0815 
0816     d->type = type;
0817     d->initSettings(bt_cap);
0818 }
0819 
0820 NetworkManager::ConnectionSettings::ConnectionType NetworkManager::ConnectionSettings::connectionType() const
0821 {
0822     Q_D(const ConnectionSettings);
0823 
0824     return d->type;
0825 }
0826 
0827 void NetworkManager::ConnectionSettings::addToPermissions(const QString &user, const QString &type)
0828 {
0829     Q_D(ConnectionSettings);
0830 
0831     d->permissions.insert(user, type);
0832 }
0833 
0834 void NetworkManager::ConnectionSettings::setPermissions(const QHash<QString, QString> &perm)
0835 {
0836     Q_D(ConnectionSettings);
0837 
0838     d->permissions = perm;
0839 }
0840 
0841 QHash<QString, QString> NetworkManager::ConnectionSettings::permissions() const
0842 {
0843     Q_D(const ConnectionSettings);
0844 
0845     return d->permissions;
0846 }
0847 
0848 void NetworkManager::ConnectionSettings::setAutoconnect(bool autoconnect)
0849 {
0850     Q_D(ConnectionSettings);
0851 
0852     d->autoconnect = autoconnect;
0853 }
0854 
0855 bool NetworkManager::ConnectionSettings::autoconnect() const
0856 {
0857     Q_D(const ConnectionSettings);
0858 
0859     return d->autoconnect;
0860 }
0861 
0862 void NetworkManager::ConnectionSettings::setAutoconnectPriority(int priority)
0863 {
0864     Q_D(ConnectionSettings);
0865 
0866     d->autoconnectPriority = priority;
0867 }
0868 
0869 int NetworkManager::ConnectionSettings::autoconnectPriority() const
0870 {
0871     Q_D(const ConnectionSettings);
0872 
0873     return d->autoconnectPriority;
0874 }
0875 
0876 void NetworkManager::ConnectionSettings::setTimestamp(const QDateTime &timestamp)
0877 {
0878     Q_D(ConnectionSettings);
0879 
0880     d->timestamp = timestamp;
0881 }
0882 
0883 QDateTime NetworkManager::ConnectionSettings::timestamp() const
0884 {
0885     Q_D(const ConnectionSettings);
0886 
0887     return d->timestamp;
0888 }
0889 
0890 void NetworkManager::ConnectionSettings::setReadOnly(bool readonly)
0891 {
0892     Q_D(ConnectionSettings);
0893 
0894     d->readOnly = readonly;
0895 }
0896 
0897 bool NetworkManager::ConnectionSettings::readOnly() const
0898 {
0899     Q_D(const ConnectionSettings);
0900 
0901     return d->readOnly;
0902 }
0903 
0904 void NetworkManager::ConnectionSettings::setZone(const QString &zone)
0905 {
0906     Q_D(ConnectionSettings);
0907 
0908     d->zone = zone;
0909 }
0910 
0911 QString NetworkManager::ConnectionSettings::zone() const
0912 {
0913     Q_D(const ConnectionSettings);
0914 
0915     return d->zone;
0916 }
0917 
0918 bool NetworkManager::ConnectionSettings::isSlave() const
0919 {
0920     Q_D(const ConnectionSettings);
0921 
0922     return !d->master.isEmpty() && !d->slaveType.isEmpty();
0923 }
0924 
0925 void NetworkManager::ConnectionSettings::setMaster(const QString &master)
0926 {
0927     Q_D(ConnectionSettings);
0928 
0929     d->master = master;
0930 }
0931 
0932 QString NetworkManager::ConnectionSettings::master() const
0933 {
0934     Q_D(const ConnectionSettings);
0935 
0936     return d->master;
0937 }
0938 
0939 void NetworkManager::ConnectionSettings::setSlaveType(const QString &type)
0940 {
0941     Q_D(ConnectionSettings);
0942 
0943     d->slaveType = type;
0944 }
0945 
0946 QString NetworkManager::ConnectionSettings::slaveType() const
0947 {
0948     Q_D(const ConnectionSettings);
0949 
0950     return d->slaveType;
0951 }
0952 
0953 void NetworkManager::ConnectionSettings::setSecondaries(const QStringList &secondaries)
0954 {
0955     Q_D(ConnectionSettings);
0956 
0957     d->secondaries = secondaries;
0958 }
0959 
0960 QStringList NetworkManager::ConnectionSettings::secondaries() const
0961 {
0962     Q_D(const ConnectionSettings);
0963 
0964     return d->secondaries;
0965 }
0966 
0967 void NetworkManager::ConnectionSettings::setGatewayPingTimeout(quint32 timeout)
0968 {
0969     Q_D(ConnectionSettings);
0970 
0971     d->gatewayPingTimeout = timeout;
0972 }
0973 
0974 quint32 NetworkManager::ConnectionSettings::gatewayPingTimeout() const
0975 {
0976     Q_D(const ConnectionSettings);
0977 
0978     return d->gatewayPingTimeout;
0979 }
0980 
0981 int NetworkManager::ConnectionSettings::autoconnectRetries() const
0982 {
0983     Q_D(const ConnectionSettings);
0984 
0985     return d->autoconnectRetries;
0986 }
0987 
0988 void NetworkManager::ConnectionSettings::setAutoconnectRetries(int retries)
0989 {
0990     Q_D(ConnectionSettings);
0991 
0992     d->autoconnectRetries = retries;
0993 }
0994 
0995 NetworkManager::ConnectionSettings::AutoconnectSlaves NetworkManager::ConnectionSettings::autoconnectSlaves() const
0996 {
0997     Q_D(const ConnectionSettings);
0998 
0999     return d->autoconnectSlaves;
1000 }
1001 
1002 void NetworkManager::ConnectionSettings::setAutoconnectSlaves(NetworkManager::ConnectionSettings::AutoconnectSlaves autoconnectSlaves)
1003 {
1004     Q_D(ConnectionSettings);
1005 
1006     d->autoconnectSlaves = autoconnectSlaves;
1007 }
1008 
1009 NetworkManager::ConnectionSettings::Lldp NetworkManager::ConnectionSettings::lldp() const
1010 {
1011     Q_D(const ConnectionSettings);
1012 
1013     return d->lldp;
1014 }
1015 
1016 void NetworkManager::ConnectionSettings::setLldp(NetworkManager::ConnectionSettings::Lldp lldp)
1017 {
1018     Q_D(ConnectionSettings);
1019 
1020     d->lldp = lldp;
1021 }
1022 
1023 NetworkManager::ConnectionSettings::Metered NetworkManager::ConnectionSettings::metered() const
1024 {
1025     Q_D(const ConnectionSettings);
1026 
1027     return d->metered;
1028 }
1029 
1030 void NetworkManager::ConnectionSettings::setMetered(NetworkManager::ConnectionSettings::Metered metered)
1031 {
1032     Q_D(ConnectionSettings);
1033 
1034     d->metered = metered;
1035 }
1036 
1037 NetworkManager::ConnectionSettings::Mdns NetworkManager::ConnectionSettings::mdns() const
1038 {
1039     Q_D(const ConnectionSettings);
1040 
1041     return d->mdns;
1042 }
1043 
1044 void NetworkManager::ConnectionSettings::setMdns(NetworkManager::ConnectionSettings::Mdns mdns)
1045 {
1046     Q_D(ConnectionSettings);
1047 
1048     d->mdns = mdns;
1049 }
1050 
1051 QString NetworkManager::ConnectionSettings::stableId() const
1052 {
1053     Q_D(const ConnectionSettings);
1054 
1055     return d->stableId;
1056 }
1057 
1058 void NetworkManager::ConnectionSettings::setStableId(const QString &stableId)
1059 {
1060     Q_D(ConnectionSettings);
1061 
1062     d->stableId = stableId;
1063 }
1064 
1065 NetworkManager::Setting::Ptr NetworkManager::ConnectionSettings::setting(Setting::SettingType type) const
1066 {
1067     const auto settingsList = settings();
1068     for (const Setting::Ptr &setting : settingsList) {
1069         if (setting->type() == type) {
1070             return setting;
1071         }
1072     }
1073 
1074     return Setting::Ptr();
1075 }
1076 
1077 NetworkManager::Setting::Ptr NetworkManager::ConnectionSettings::setting(const QString &type) const
1078 {
1079     return setting(Setting::typeFromString(type));
1080 }
1081 
1082 NetworkManager::Setting::List NetworkManager::ConnectionSettings::settings() const
1083 {
1084     Q_D(const ConnectionSettings);
1085 
1086     return d->settings;
1087 }
1088 
1089 QDebug NetworkManager::operator<<(QDebug dbg, const NetworkManager::ConnectionSettings &setting)
1090 {
1091     dbg.nospace() << "CONNECTION SETTINGS\n";
1092     dbg.nospace() << "===================\n";
1093 
1094     dbg.nospace() << NM_SETTING_CONNECTION_ID << ": " << setting.id() << '\n';
1095     dbg.nospace() << NM_SETTING_CONNECTION_UUID << ": " << setting.uuid() << '\n';
1096     dbg.nospace() << NM_SETTING_CONNECTION_INTERFACE_NAME << ": " << setting.interfaceName() << '\n';
1097     dbg.nospace() << NM_SETTING_CONNECTION_TYPE << ": " << setting.typeAsString(setting.connectionType()) << '\n';
1098     dbg.nospace() << NM_SETTING_CONNECTION_PERMISSIONS << ": " << setting.permissions() << '\n';
1099     dbg.nospace() << NM_SETTING_CONNECTION_AUTOCONNECT << ": " << setting.autoconnect() << '\n';
1100     dbg.nospace() << NM_SETTING_CONNECTION_AUTOCONNECT_PRIORITY << ": " << setting.autoconnectPriority() << '\n';
1101     dbg.nospace() << NM_SETTING_CONNECTION_TIMESTAMP << ": " << setting.timestamp().toSecsSinceEpoch() << '\n';
1102     dbg.nospace() << NM_SETTING_CONNECTION_READ_ONLY << ": " << setting.readOnly() << '\n';
1103     dbg.nospace() << NM_SETTING_CONNECTION_ZONE << ": " << setting.zone() << '\n';
1104     dbg.nospace() << NM_SETTING_CONNECTION_MASTER << ": " << setting.master() << '\n';
1105     dbg.nospace() << NM_SETTING_CONNECTION_SLAVE_TYPE << ": " << setting.slaveType() << '\n';
1106     dbg.nospace() << NM_SETTING_CONNECTION_SECONDARIES << ": " << setting.secondaries() << '\n';
1107     dbg.nospace() << NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT << ": " << setting.gatewayPingTimeout() << '\n';
1108     dbg.nospace() << NM_SETTING_CONNECTION_AUTOCONNECT_RETRIES << ": " << setting.autoconnectRetries() << '\n';
1109     dbg.nospace() << NM_SETTING_CONNECTION_AUTOCONNECT_SLAVES << ": " << setting.autoconnectSlaves() << '\n';
1110     dbg.nospace() << NM_SETTING_CONNECTION_LLDP << ": " << setting.lldp() << '\n';
1111     dbg.nospace() << NM_SETTING_CONNECTION_METERED << ": " << setting.metered() << '\n';
1112     dbg.nospace() << NM_SETTING_CONNECTION_MDNS << ": " << setting.mdns() << '\n';
1113     dbg.nospace() << NM_SETTING_CONNECTION_STABLE_ID << ": " << setting.stableId() << '\n';
1114     dbg.nospace() << "===================\n";
1115     const auto settingsList = setting.settings();
1116     for (const Setting::Ptr &settingPtr : settingsList) {
1117         dbg.nospace() << settingPtr->typeAsString(settingPtr->type()).toUpper() << " SETTINGS\n";
1118         dbg.nospace() << "---------------------------\n";
1119         switch (settingPtr->type()) {
1120         case Setting::Adsl:
1121             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::AdslSetting>().data());
1122             break;
1123         case Setting::Bond:
1124             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::BondSetting>().data());
1125             break;
1126         case Setting::Bluetooth:
1127             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::BluetoothSetting>().data());
1128             break;
1129         case Setting::Bridge:
1130             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::BridgeSetting>().data());
1131             break;
1132         case Setting::BridgePort:
1133             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::BridgePortSetting>().data());
1134             break;
1135         case Setting::Cdma:
1136             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::CdmaSetting>().data());
1137             break;
1138         case Setting::Gsm:
1139             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::GsmSetting>().data());
1140             break;
1141         case Setting::Infiniband:
1142             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::InfinibandSetting>().data());
1143             break;
1144         case Setting::Ipv4:
1145             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::Ipv4Setting>().data());
1146             break;
1147         case Setting::Ipv6:
1148             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::Ipv6Setting>().data());
1149             break;
1150         case Setting::OlpcMesh:
1151             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::OlpcMeshSetting>().data());
1152             break;
1153         case Setting::Ppp:
1154             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::PppSetting>().data());
1155             break;
1156         case Setting::Pppoe:
1157             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::PppoeSetting>().data());
1158             break;
1159         case Setting::Security8021x:
1160             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::Security8021xSetting>().data());
1161             break;
1162         case Setting::Serial:
1163             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::SerialSetting>().data());
1164             break;
1165         case Setting::Vlan:
1166             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::VlanSetting>().data());
1167             break;
1168         case Setting::Vpn:
1169             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::VpnSetting>().data());
1170             break;
1171         case Setting::Wimax:
1172             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::WimaxSetting>().data());
1173             break;
1174         case Setting::Wired:
1175             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::WiredSetting>().data());
1176             break;
1177         case Setting::Wireless:
1178             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::WirelessSetting>().data());
1179             break;
1180         case Setting::WirelessSecurity:
1181             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::WirelessSecuritySetting>().data());
1182             break;
1183         case Setting::Team:
1184             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::TeamSetting>().data());
1185             break;
1186         case Setting::Tun:
1187             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::TunSetting>().data());
1188             break;
1189         case Setting::IpTunnel:
1190             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::IpTunnelSetting>().data());
1191             break;
1192         case Setting::WireGuard:
1193             dbg.nospace() << *(settingPtr.staticCast<NetworkManager::WireGuardSetting>().data());
1194             break;
1195         default:
1196             dbg.nospace() << *settingPtr.data();
1197         }
1198 
1199         dbg.nospace() << '\n';
1200     }
1201     return dbg.maybeSpace();
1202 }