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

0001 /*
0002     SPDX-FileCopyrightText: 2013 Jan Grulich <jgrulich@redhat.com>
0003     SPDX-FileCopyrightText: 2020 Douglas Kosovic <doug@uq.edu.au>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006 */
0007 
0008 #include "l2tppppwidget.h"
0009 #include "nm-l2tp-service.h"
0010 #include "ui_l2tpppp.h"
0011 
0012 #include <KAcceleratorManager>
0013 #include <KLocalizedString>
0014 
0015 L2tpPPPWidget::L2tpPPPWidget(const NetworkManager::VpnSetting::Ptr &setting, QWidget *parent, bool need_peer_eap)
0016     : QDialog(parent)
0017     , m_ui(new Ui::L2tpPppWidget)
0018     , m_need_peer_eap(need_peer_eap)
0019 {
0020     m_ui->setupUi(this);
0021 
0022     setWindowTitle(i18n("L2TP PPP Options"));
0023 
0024     KAcceleratorManager::manage(this);
0025 
0026     loadConfig(setting);
0027 }
0028 
0029 L2tpPPPWidget::~L2tpPPPWidget()
0030 {
0031     delete m_ui;
0032 }
0033 
0034 void L2tpPPPWidget::loadConfig(const NetworkManager::VpnSetting::Ptr &setting)
0035 {
0036     const QString yesString = QLatin1String("yes");
0037 
0038     // General settings
0039     const NMStringMap dataMap = setting->data();
0040 
0041     if (m_need_peer_eap) {
0042         m_ui->grp_authenfication->setVisible(false);
0043         resize(width(), sizeHint().height());
0044     } else {
0045         // Authentication options
0046         const bool refuse_pap = (dataMap[NM_L2TP_KEY_REFUSE_PAP] == yesString);
0047         const bool refuse_chap = (dataMap[NM_L2TP_KEY_REFUSE_CHAP] == yesString);
0048         const bool refuse_mschap = (dataMap[NM_L2TP_KEY_REFUSE_MSCHAP] == yesString);
0049         const bool refuse_mschapv2 = (dataMap[NM_L2TP_KEY_REFUSE_MSCHAPV2] == yesString);
0050         const bool refuse_eap = (dataMap[NM_L2TP_KEY_REFUSE_EAP] == yesString);
0051 
0052         QListWidgetItem *item = nullptr;
0053         item = m_ui->listWidget->item(0); // PAP
0054         item->setCheckState(refuse_pap ? Qt::Unchecked : Qt::Checked);
0055         item = m_ui->listWidget->item(1); // CHAP
0056         item->setCheckState(refuse_chap ? Qt::Unchecked : Qt::Checked);
0057         item = m_ui->listWidget->item(2); // MSCHAP
0058         item->setCheckState(refuse_mschap ? Qt::Unchecked : Qt::Checked);
0059         item = m_ui->listWidget->item(3); // MSCHAPv2
0060         item->setCheckState(refuse_mschapv2 ? Qt::Unchecked : Qt::Checked);
0061         item = m_ui->listWidget->item(4); // EAP
0062         item->setCheckState(refuse_eap ? Qt::Unchecked : Qt::Checked);
0063     }
0064 
0065     // Cryptography and compression
0066     const bool mppe = (dataMap[NM_L2TP_KEY_REQUIRE_MPPE] == yesString);
0067     const bool mppe40 = (dataMap[NM_L2TP_KEY_REQUIRE_MPPE_40] == yesString);
0068     const bool mppe128 = (dataMap[NM_L2TP_KEY_REQUIRE_MPPE_128] == yesString);
0069     const bool mppe_stateful = (dataMap[NM_L2TP_KEY_MPPE_STATEFUL] == yesString);
0070 
0071     if (mppe || mppe40 || mppe128) { // If MPPE is use
0072         m_ui->gbMPPE->setChecked(mppe || mppe40 || mppe128);
0073         if (mppe128) {
0074             m_ui->cbMPPECrypto->setCurrentIndex(1); // 128 bit
0075         } else if (mppe40) {
0076             m_ui->cbMPPECrypto->setCurrentIndex(2); // 40 bit
0077         } else {
0078             m_ui->cbMPPECrypto->setCurrentIndex(0); // Any
0079         }
0080         m_ui->cbstatefulEncryption->setChecked(mppe_stateful);
0081     }
0082 
0083     const bool nobsd = (dataMap[NM_L2TP_KEY_NOBSDCOMP] == yesString);
0084     m_ui->cbBSD->setChecked(!nobsd);
0085 
0086     const bool nodeflate = (dataMap[NM_L2TP_KEY_NODEFLATE] == yesString);
0087     m_ui->cbdeflate->setChecked(!nodeflate);
0088 
0089     const bool novjcomp = (dataMap[NM_L2TP_KEY_NO_VJ_COMP] == yesString);
0090     m_ui->cbTCPheaders->setChecked(!novjcomp);
0091 
0092     const bool nopcomp = (dataMap[NM_L2TP_KEY_NO_PCOMP] == yesString);
0093     m_ui->cbCompressionNegotiation->setChecked(!nopcomp);
0094 
0095     const bool noaccomp = (dataMap[NM_L2TP_KEY_NO_ACCOMP] == yesString);
0096     m_ui->cbAddressControlCompression->setChecked(!noaccomp);
0097 
0098     // Echo
0099     const int lcp_echo_interval = QString(dataMap[NM_L2TP_KEY_LCP_ECHO_INTERVAL]).toInt();
0100     m_ui->cbsendEcho->setChecked(lcp_echo_interval > 0);
0101 
0102     if (dataMap.contains(QLatin1String(NM_L2TP_KEY_MTU))) {
0103         m_ui->sbMTU->setValue(QString(dataMap[NM_L2TP_KEY_MTU]).toInt());
0104     }
0105 
0106     if (dataMap.contains(QLatin1String(NM_L2TP_KEY_MTU))) {
0107         m_ui->sbMRU->setValue(QString(dataMap[NM_L2TP_KEY_MRU]).toInt());
0108     }
0109 }
0110 
0111 NMStringMap L2tpPPPWidget::setting() const
0112 {
0113     NMStringMap result;
0114     const QString yesString = QLatin1String("yes");
0115 
0116     if (!m_need_peer_eap) {
0117         QListWidgetItem *item = nullptr;
0118         item = m_ui->listWidget->item(0); // PAP
0119         if (item->checkState() == Qt::Unchecked) {
0120             result.insert(NM_L2TP_KEY_REFUSE_PAP, yesString);
0121         }
0122         item = m_ui->listWidget->item(1); // CHAP
0123         if (item->checkState() == Qt::Unchecked) {
0124             result.insert(NM_L2TP_KEY_REFUSE_CHAP, yesString);
0125         }
0126         item = m_ui->listWidget->item(2); // MSCHAP
0127         if (item->checkState() == Qt::Unchecked) {
0128             result.insert(NM_L2TP_KEY_REFUSE_MSCHAP, yesString);
0129         }
0130         item = m_ui->listWidget->item(3); // MSCHAPv2
0131         if (item->checkState() == Qt::Unchecked) {
0132             result.insert(NM_L2TP_KEY_REFUSE_MSCHAPV2, yesString);
0133         }
0134         item = m_ui->listWidget->item(4); // EAP
0135         if (item->checkState() == Qt::Unchecked) {
0136             result.insert(NM_L2TP_KEY_REFUSE_EAP, yesString);
0137         }
0138     }
0139 
0140     // Cryptography and compression
0141     if (m_ui->gbMPPE->isChecked()) {
0142         int index = m_ui->cbMPPECrypto->currentIndex();
0143 
0144         switch (index) {
0145         case 0: // "Any"
0146             result.insert(NM_L2TP_KEY_REQUIRE_MPPE, yesString);
0147             break;
0148         case 1: // "128 bit"
0149             result.insert(NM_L2TP_KEY_REQUIRE_MPPE_128, yesString);
0150             break;
0151         case 2: // "40 bit"
0152             result.insert(NM_L2TP_KEY_REQUIRE_MPPE_40, yesString);
0153             break;
0154         }
0155 
0156         if (m_ui->cbstatefulEncryption->isChecked()) {
0157             result.insert(NM_L2TP_KEY_MPPE_STATEFUL, yesString);
0158         }
0159     }
0160 
0161     if (!m_ui->cbBSD->isChecked()) {
0162         result.insert(NM_L2TP_KEY_NOBSDCOMP, yesString);
0163     }
0164     if (!m_ui->cbdeflate->isChecked()) {
0165         result.insert(NM_L2TP_KEY_NODEFLATE, yesString);
0166     }
0167 
0168     if (!m_ui->cbTCPheaders->isChecked()) {
0169         result.insert(NM_L2TP_KEY_NO_VJ_COMP, yesString);
0170     }
0171 
0172     if (!m_ui->cbCompressionNegotiation->isChecked()) {
0173         result.insert(NM_L2TP_KEY_NO_PCOMP, yesString);
0174     }
0175 
0176     if (!m_ui->cbAddressControlCompression->isChecked()) {
0177         result.insert(NM_L2TP_KEY_NO_ACCOMP, yesString);
0178     }
0179 
0180     // Echo
0181     if (m_ui->cbsendEcho->isChecked()) {
0182         result.insert(NM_L2TP_KEY_LCP_ECHO_FAILURE, "5");
0183         result.insert(NM_L2TP_KEY_LCP_ECHO_INTERVAL, "30");
0184     }
0185 
0186     if (m_ui->sbMTU->value() != 0) {
0187         result.insert(NM_L2TP_KEY_MTU, QString::number(m_ui->sbMTU->value()));
0188     }
0189 
0190     if (m_ui->sbMRU->value() != 0) {
0191         result.insert(NM_L2TP_KEY_MRU, QString::number(m_ui->sbMRU->value()));
0192     }
0193 
0194     return result;
0195 }