File indexing completed on 2024-05-05 17:42:56

0001 /*
0002     SPDX-FileCopyrightText: 2013 Lukas Tinkl <ltinkl@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 "vpncadvancedwidget.h"
0008 #include "nm-vpnc-service.h"
0009 #include "ui_vpncadvanced.h"
0010 
0011 #include <KAcceleratorManager>
0012 #include <KLocalizedString>
0013 
0014 VpncAdvancedWidget::VpncAdvancedWidget(const NetworkManager::VpnSetting::Ptr &setting, QWidget *parent)
0015     : QDialog(parent)
0016     , m_ui(new Ui::VpncAdvancedWidget)
0017 {
0018     m_ui->setupUi(this);
0019 
0020     setWindowTitle(i18n("Advanced VPNC properties"));
0021 
0022     // vendor
0023     m_ui->vendor->addItem(i18nc("VPNC vendor name", "Cisco"), NM_VPNC_VENDOR_CISCO);
0024     m_ui->vendor->addItem(i18nc("VPNC vendor name", "Netscreen"), NM_VPNC_VENDOR_NETSCREEN);
0025 
0026     // encryption
0027     m_ui->encryption->addItem(i18nc("VPNC encryption method", "Secure (default)"));
0028     m_ui->encryption->addItem(i18nc("VPNC encryption method", "Weak (DES encryption, use with caution)"), NM_VPNC_KEY_SINGLE_DES);
0029     m_ui->encryption->addItem(i18nc("VPNC encryption method", "None (completely insecure)"), NM_VPNC_KEY_NO_ENCRYPTION);
0030 
0031     // NAT traversal
0032     m_ui->nat->addItem(i18nc("NAT traversal method", "NAT-T when available (default)"), NM_VPNC_NATT_MODE_NATT);
0033     m_ui->nat->addItem(i18nc("NAT traversal method", "NAT-T always"), NM_VPNC_NATT_MODE_NATT_ALWAYS);
0034     m_ui->nat->addItem(i18nc("NAT traversal method", "Cisco UDP"), NM_VPNC_NATT_MODE_CISCO);
0035     m_ui->nat->addItem(i18nc("NAT traversal method", "Disabled"), NM_VPNC_NATT_MODE_NONE);
0036 
0037     // IKE DH group
0038     m_ui->dhGroup->addItem(i18nc("IKE DH group", "DH Group 1"), NM_VPNC_DHGROUP_DH1);
0039     m_ui->dhGroup->addItem(i18nc("IKE DH group", "DH Group 2 (default)"), NM_VPNC_DHGROUP_DH2);
0040     m_ui->dhGroup->addItem(i18nc("IKE DH group", "DH Group 5"), NM_VPNC_DHGROUP_DH5);
0041 
0042     // PFS
0043     m_ui->pfs->addItem(i18nc("Perfect Forward Secrecy", "Server (default)"), NM_VPNC_PFS_SERVER);
0044     m_ui->pfs->addItem(i18nc("Perfect Forward Secrecy", "None"), NM_VPNC_PFS_NOPFS);
0045     m_ui->pfs->addItem(i18nc("Perfect Forward Secrecy", "DH Group 1"), NM_VPNC_PFS_DH1);
0046     m_ui->pfs->addItem(i18nc("Perfect Forward Secrecy", "DH Group 2"), NM_VPNC_PFS_DH2);
0047     m_ui->pfs->addItem(i18nc("Perfect Forward Secrecy", "DH Group 5"), NM_VPNC_PFS_DH5);
0048 
0049     loadConfig(setting);
0050 
0051     KAcceleratorManager::manage(this);
0052 }
0053 
0054 VpncAdvancedWidget::~VpncAdvancedWidget()
0055 {
0056     delete m_ui;
0057 }
0058 
0059 void VpncAdvancedWidget::loadConfig(const NetworkManager::VpnSetting::Ptr &setting)
0060 {
0061     m_ui->domain->setText(setting->data().value(NM_VPNC_KEY_DOMAIN));
0062 
0063     const QString vendor = setting->data().value(NM_VPNC_KEY_VENDOR);
0064     if (!vendor.isEmpty()) {
0065         m_ui->vendor->setCurrentIndex(m_ui->vendor->findData(vendor));
0066     }
0067 
0068     if (setting->data().value(NM_VPNC_KEY_SINGLE_DES) == "yes") {
0069         m_ui->encryption->setCurrentIndex(m_ui->encryption->findData(NM_VPNC_KEY_SINGLE_DES));
0070     } else if (setting->data().value(NM_VPNC_KEY_NO_ENCRYPTION) == "yes") {
0071         m_ui->encryption->setCurrentIndex(m_ui->encryption->findData(NM_VPNC_KEY_NO_ENCRYPTION));
0072     }
0073 
0074     const QString nat = setting->data().value(NM_VPNC_KEY_NAT_TRAVERSAL_MODE);
0075     if (!nat.isEmpty()) {
0076         m_ui->nat->setCurrentIndex(m_ui->nat->findData(nat));
0077     }
0078 
0079     const QString dhGroup = setting->data().value(NM_VPNC_KEY_DHGROUP);
0080     if (!dhGroup.isEmpty()) {
0081         m_ui->dhGroup->setCurrentIndex(m_ui->dhGroup->findData(dhGroup));
0082     } else {
0083         m_ui->dhGroup->setCurrentIndex(m_ui->dhGroup->findData(NM_VPNC_DHGROUP_DH2)); // default
0084     }
0085 
0086     const QString pfs = setting->data().value(NM_VPNC_KEY_PERFECT_FORWARD);
0087     if (!pfs.isEmpty()) {
0088         m_ui->pfs->setCurrentIndex(m_ui->pfs->findData(pfs));
0089     }
0090 
0091     bool ok = false;
0092 
0093     const QString localport = setting->data().value(NM_VPNC_KEY_LOCAL_PORT);
0094     if (!localport.isEmpty()) {
0095         const uint localportNum = localport.toUInt(&ok);
0096         if (ok && localportNum <= 65535) {
0097             m_ui->localport->setValue(localportNum);
0098         }
0099     }
0100 
0101     const uint dpd = setting->data().value(NM_VPNC_KEY_DPD_IDLE_TIMEOUT).toUInt(&ok);
0102     m_ui->deadPeer->setChecked(ok && dpd == 0);
0103 }
0104 
0105 NMStringMap VpncAdvancedWidget::setting() const
0106 {
0107     NMStringMap result;
0108     if (!m_ui->domain->text().isEmpty()) {
0109         result.insert(NM_VPNC_KEY_DOMAIN, m_ui->domain->text());
0110     }
0111 
0112     result.insert(NM_VPNC_KEY_VENDOR, m_ui->vendor->currentData().toString());
0113 
0114     const QString encData = m_ui->encryption->currentData().toString();
0115     if (!encData.isEmpty()) {
0116         if (encData == NM_VPNC_KEY_SINGLE_DES) {
0117             result.insert(NM_VPNC_KEY_SINGLE_DES, "yes");
0118         } else if (encData == NM_VPNC_KEY_NO_ENCRYPTION) {
0119             result.insert(NM_VPNC_KEY_NO_ENCRYPTION, "yes");
0120         }
0121     }
0122 
0123     result.insert(NM_VPNC_KEY_NAT_TRAVERSAL_MODE, m_ui->nat->currentData().toString());
0124     result.insert(NM_VPNC_KEY_DHGROUP, m_ui->dhGroup->currentData().toString());
0125     result.insert(NM_VPNC_KEY_PERFECT_FORWARD, m_ui->pfs->currentData().toString());
0126     result.insert(NM_VPNC_KEY_LOCAL_PORT, QString::number(m_ui->localport->value()));
0127 
0128     if (m_ui->deadPeer->isChecked()) {
0129         result.insert(NM_VPNC_KEY_DPD_IDLE_TIMEOUT, "0");
0130     }
0131 
0132     return result;
0133 }