File indexing completed on 2024-12-01 08:10:01

0001 /*
0002     SPDX-FileCopyrightText: 2013 Jan Grulich <jgrulich@redhat.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "connectionwidget.h"
0008 #include "advancedpermissionswidget.h"
0009 #include "ui_connectionwidget.h"
0010 
0011 #include <NetworkManagerQt/Connection>
0012 #include <NetworkManagerQt/Settings>
0013 
0014 #include <KAcceleratorManager>
0015 #include <KLocalizedString>
0016 #include <KUser>
0017 #include <QDBusConnection>
0018 #include <QDialog>
0019 #include <QDialogButtonBox>
0020 #include <QVBoxLayout>
0021 
0022 ConnectionWidget::ConnectionWidget(const NetworkManager::ConnectionSettings::Ptr &settings, QWidget *parent, Qt::WindowFlags f)
0023     : QWidget(parent, f)
0024     , m_widget(new Ui::ConnectionWidget)
0025     , m_type(settings->connectionType())
0026     , m_masterUuid(settings->master())
0027     , m_slaveType(settings->slaveType())
0028 {
0029     m_widget->setupUi(this);
0030 
0031     m_widget->firewallZone->addItems(firewallZones());
0032 
0033     // VPN combo
0034     populateVpnConnections();
0035     if (settings->connectionType() == NetworkManager::ConnectionSettings::Vpn) {
0036         m_widget->autoconnectVpn->setEnabled(false);
0037         m_widget->vpnCombobox->setEnabled(false);
0038         m_widget->autoconnect->setEnabled(false);
0039     } else {
0040         m_widget->autoconnectVpn->setEnabled(true);
0041         m_widget->autoconnect->setEnabled(true);
0042     }
0043 
0044     connect(m_widget->autoconnectVpn, &QCheckBox::toggled, this, &ConnectionWidget::autoVpnToggled);
0045 
0046     if (settings) {
0047         loadConfig(settings);
0048     }
0049 
0050     m_tmpSetting.setPermissions(settings->permissions());
0051 
0052     KAcceleratorManager::manage(this);
0053 
0054     connect(m_widget->autoconnect, &QCheckBox::stateChanged, this, &ConnectionWidget::settingChanged);
0055     connect(m_widget->allUsers, &QCheckBox::stateChanged, this, &ConnectionWidget::settingChanged);
0056     connect(m_widget->allUsers, &QCheckBox::stateChanged, this, &ConnectionWidget::allUsersChanged);
0057     connect(m_widget->autoconnectVpn, &QCheckBox::stateChanged, this, &ConnectionWidget::settingChanged);
0058     connect(m_widget->pushButtonPermissions, &QPushButton::clicked, this, &ConnectionWidget::settingChanged);
0059     connect(m_widget->firewallZone, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ConnectionWidget::settingChanged);
0060     connect(m_widget->firewallZone, &QComboBox::currentTextChanged, this, &ConnectionWidget::settingChanged);
0061     connect(m_widget->vpnCombobox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ConnectionWidget::settingChanged);
0062     connect(m_widget->vpnCombobox, &QComboBox::currentTextChanged, this, &ConnectionWidget::settingChanged);
0063     connect(m_widget->prioritySpin, QOverload<int>::of(&QSpinBox::valueChanged), this, &ConnectionWidget::settingChanged);
0064     connect(m_widget->metered, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &ConnectionWidget::settingChanged);
0065 
0066     connect(m_widget->pushButtonPermissions, &QPushButton::clicked, this, &ConnectionWidget::openAdvancedPermissions);
0067 }
0068 
0069 ConnectionWidget::~ConnectionWidget()
0070 {
0071     delete m_widget;
0072 }
0073 
0074 void ConnectionWidget::loadConfig(const NetworkManager::ConnectionSettings::Ptr &settings)
0075 {
0076     if (settings->permissions().isEmpty()) {
0077         m_widget->allUsers->setChecked(true);
0078     } else {
0079         m_widget->allUsers->setChecked(false);
0080     }
0081 
0082     const QString zone = settings->zone();
0083     m_widget->firewallZone->setCurrentIndex(m_widget->firewallZone->findText(zone));
0084 
0085     const QStringList secondaries = settings->secondaries();
0086     const QStringList vpnKeys = vpnConnections().keys();
0087     if (!secondaries.isEmpty() && !vpnKeys.isEmpty()) {
0088         for (const QString &vpnKey : vpnKeys) {
0089             if (secondaries.contains(vpnKey)) {
0090                 m_widget->vpnCombobox->setCurrentIndex(m_widget->vpnCombobox->findData(vpnKey));
0091                 m_widget->autoconnectVpn->setChecked(true);
0092                 break;
0093             }
0094         }
0095     } else {
0096         m_widget->autoconnectVpn->setChecked(false);
0097     }
0098 
0099     m_widget->autoconnect->setChecked(settings->autoconnect());
0100 
0101     if (m_widget->prioritySpin->isEnabled()) {
0102         m_widget->prioritySpin->setValue(settings->autoconnectPriority());
0103     }
0104 
0105     m_widget->metered->setCurrentIndex(settings->metered());
0106 }
0107 
0108 NMVariantMapMap ConnectionWidget::setting() const
0109 {
0110     NetworkManager::ConnectionSettings settings;
0111 
0112     settings.setConnectionType(m_type);
0113     settings.setAutoconnect(m_widget->autoconnect->isChecked());
0114     settings.setMaster(m_masterUuid);
0115     settings.setSlaveType(m_slaveType);
0116 
0117     if (m_widget->allUsers->isChecked()) {
0118         settings.setPermissions(QHash<QString, QString>());
0119     } else {
0120         if (m_tmpSetting.permissions().isEmpty()) {
0121             settings.addToPermissions(KUser().loginName(), QString());
0122         } else {
0123             settings.setPermissions(m_tmpSetting.permissions());
0124         }
0125     }
0126 
0127     if (m_widget->autoconnectVpn->isChecked() && m_widget->vpnCombobox->count() > 0) {
0128         settings.setSecondaries(QStringList() << m_widget->vpnCombobox->itemData(m_widget->vpnCombobox->currentIndex()).toString());
0129     }
0130 
0131     const QString zone = m_widget->firewallZone->currentText();
0132     if (!zone.isEmpty()) {
0133         settings.setZone(zone);
0134     }
0135 
0136     if (m_widget->prioritySpin->isEnabled()) {
0137         settings.setAutoconnectPriority(m_widget->prioritySpin->value());
0138     }
0139 
0140     settings.setMetered(static_cast<NetworkManager::ConnectionSettings::Metered>(m_widget->metered->currentIndex()));
0141 
0142     return settings.toMap();
0143 }
0144 
0145 bool ConnectionWidget::allUsers() const
0146 {
0147     return m_widget->allUsers->isChecked();
0148 }
0149 
0150 void ConnectionWidget::autoVpnToggled(bool on)
0151 {
0152     m_widget->vpnCombobox->setEnabled(on);
0153 }
0154 
0155 void ConnectionWidget::openAdvancedPermissions()
0156 {
0157     QPointer<AdvancedPermissionsWidget> dialog = new AdvancedPermissionsWidget(m_tmpSetting.permissions(), this);
0158     dialog->setWindowTitle(i18nc("@title:window advanced permissions editor", "Advanced Permissions Editor"));
0159     if (dialog->exec() == QDialog::Accepted) {
0160         m_tmpSetting.setPermissions(dialog->currentUsers());
0161     }
0162     delete dialog;
0163 }
0164 
0165 NMStringMap ConnectionWidget::vpnConnections() const
0166 {
0167     NetworkManager::Connection::List list = NetworkManager::listConnections();
0168     NMStringMap result;
0169 
0170     for (const NetworkManager::Connection::Ptr &conn : list) {
0171         NetworkManager::ConnectionSettings::Ptr conSet = conn->settings();
0172         if (conSet->connectionType() == NetworkManager::ConnectionSettings::Vpn //
0173             || conSet->connectionType() == NetworkManager::ConnectionSettings::WireGuard) {
0174             // qCDebug(PLASMA_NM_EDITOR_LOG) << "Found VPN" << conSet->id() << conSet->uuid();
0175             result.insert(conSet->uuid(), conSet->id());
0176         }
0177     }
0178 
0179     return result;
0180 }
0181 
0182 QStringList ConnectionWidget::firewallZones() const
0183 {
0184     QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.fedoraproject.FirewallD1"), //
0185                                                       QStringLiteral("/org/fedoraproject/FirewallD1"),
0186                                                       QStringLiteral("org.fedoraproject.FirewallD1.zone"),
0187                                                       QStringLiteral("getZones"));
0188     QDBusPendingReply<QStringList> reply = QDBusConnection::systemBus().asyncCall(msg);
0189     reply.waitForFinished();
0190     if (reply.isValid())
0191         return reply.value();
0192 
0193     return {};
0194 }
0195 
0196 void ConnectionWidget::populateVpnConnections()
0197 {
0198     QMapIterator<QString, QString> it(vpnConnections());
0199     while (it.hasNext()) {
0200         it.next();
0201         m_widget->vpnCombobox->addItem(it.value(), it.key());
0202     }
0203 }
0204 
0205 #include "moc_connectionwidget.cpp"