File indexing completed on 2024-04-28 16:52:48

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 "libreswanwidget.h"
0008 #include "nm-libreswan-service.h"
0009 #include "ui_libreswan.h"
0010 
0011 #include <NetworkManagerQt/Setting>
0012 
0013 #include <QDBusMetaType>
0014 
0015 LibreswanWidget::LibreswanWidget(const NetworkManager::VpnSetting::Ptr &setting, QWidget *parent, Qt::WindowFlags f)
0016     : SettingWidget(setting, parent, f)
0017     , m_ui(new Ui::LibreswanWidget)
0018     , m_setting(setting)
0019 {
0020     qDBusRegisterMetaType<NMStringMap>();
0021 
0022     m_ui->setupUi(this);
0023 
0024     m_ui->groupPassword->setPasswordOptionsEnabled(true);
0025     m_ui->userPassword->setPasswordOptionsEnabled(true);
0026 
0027     // Connect for setting check
0028     watchChangedSetting();
0029 
0030     // Connect for validity check
0031     connect(m_ui->gateway, &QLineEdit::textChanged, this, &LibreswanWidget::slotWidgetChanged);
0032     connect(m_ui->groupname, &QLineEdit::textChanged, this, &LibreswanWidget::slotWidgetChanged);
0033 
0034     KAcceleratorManager::manage(this);
0035 
0036     if (setting && !setting->isNull()) {
0037         loadConfig(setting);
0038     }
0039 }
0040 
0041 LibreswanWidget::~LibreswanWidget()
0042 {
0043     delete m_ui;
0044 }
0045 
0046 void LibreswanWidget::loadConfig(const NetworkManager::Setting::Ptr &setting)
0047 {
0048     Q_UNUSED(setting);
0049 
0050     const NMStringMap data = m_setting->data();
0051 
0052     const QString gateway = data.value(NM_LIBRESWAN_RIGHT);
0053     if (!gateway.isEmpty()) {
0054         m_ui->gateway->setText(gateway);
0055     }
0056 
0057     const QString groupName = data.value(NM_LIBRESWAN_LEFTID);
0058     if (!groupName.isEmpty()) {
0059         m_ui->groupname->setText(groupName);
0060     }
0061 
0062     const NetworkManager::Setting::SecretFlags groupPasswordFlag =
0063         static_cast<NetworkManager::Setting::SecretFlags>(data.value(NM_LIBRESWAN_PSK_VALUE "-flags").toInt());
0064     if (groupPasswordFlag == NetworkManager::Setting::None) {
0065         m_ui->groupPassword->setPasswordOption(PasswordField::StoreForAllUsers);
0066     } else if (groupPasswordFlag == NetworkManager::Setting::AgentOwned) {
0067         m_ui->groupPassword->setPasswordOption(PasswordField::StoreForUser);
0068     } else {
0069         m_ui->groupPassword->setPasswordOption(PasswordField::AlwaysAsk);
0070     }
0071 
0072     const NetworkManager::Setting::SecretFlags userPasswordFlag =
0073         static_cast<NetworkManager::Setting::SecretFlags>(data.value(NM_LIBRESWAN_XAUTH_PASSWORD "-flags").toInt());
0074     if (userPasswordFlag == NetworkManager::Setting::None) {
0075         m_ui->userPassword->setPasswordOption(PasswordField::StoreForAllUsers);
0076     } else if (userPasswordFlag == NetworkManager::Setting::AgentOwned) {
0077         m_ui->userPassword->setPasswordOption(PasswordField::StoreForUser);
0078     } else {
0079         m_ui->userPassword->setPasswordOption(PasswordField::AlwaysAsk);
0080     }
0081 
0082     const QString username = data.value(NM_LIBRESWAN_LEFTXAUTHUSER);
0083     if (!username.isEmpty()) {
0084         m_ui->username->setText(username);
0085     }
0086 
0087     const QString phase1 = data.value(NM_LIBRESWAN_IKE);
0088     if (!phase1.isEmpty()) {
0089         m_ui->phase1->setText(phase1);
0090     }
0091 
0092     const QString phase2 = data.value(NM_LIBRESWAN_ESP);
0093     if (!phase2.isEmpty()) {
0094         m_ui->phase2->setText(phase2);
0095     }
0096 
0097     const QString domain = data.value(NM_LIBRESWAN_DOMAIN);
0098     if (!domain.isEmpty()) {
0099         m_ui->domain->setText(domain);
0100     }
0101 
0102     loadSecrets(setting);
0103 }
0104 
0105 void LibreswanWidget::loadSecrets(const NetworkManager::Setting::Ptr &setting)
0106 {
0107     NetworkManager::VpnSetting::Ptr vpnSetting = setting.staticCast<NetworkManager::VpnSetting>();
0108 
0109     if (vpnSetting) {
0110         const NMStringMap secrets = vpnSetting->secrets();
0111 
0112         const QString userPassword = secrets.value(NM_LIBRESWAN_XAUTH_PASSWORD);
0113         if (!userPassword.isEmpty()) {
0114             m_ui->userPassword->setText(userPassword);
0115         }
0116 
0117         const QString groupPassword = secrets.value(NM_LIBRESWAN_PSK_VALUE);
0118         if (!groupPassword.isEmpty()) {
0119             m_ui->groupPassword->setText(groupPassword);
0120         }
0121     }
0122 }
0123 
0124 QVariantMap LibreswanWidget::setting() const
0125 {
0126     NetworkManager::VpnSetting setting;
0127     setting.setServiceType(QLatin1String(NM_DBUS_SERVICE_LIBRESWAN));
0128     NMStringMap data;
0129     NMStringMap secrets;
0130 
0131     if (!m_ui->gateway->text().isEmpty()) {
0132         data.insert(NM_LIBRESWAN_RIGHT, m_ui->gateway->text());
0133     }
0134 
0135     if (!m_ui->groupname->text().isEmpty()) {
0136         data.insert(NM_LIBRESWAN_LEFTID, m_ui->groupname->text());
0137     }
0138 
0139     if (!m_ui->userPassword->text().isEmpty()) {
0140         secrets.insert(NM_LIBRESWAN_XAUTH_PASSWORD, m_ui->userPassword->text());
0141     }
0142 
0143     if (m_ui->userPassword->passwordOption() == PasswordField::StoreForAllUsers) {
0144         data.insert(NM_LIBRESWAN_XAUTH_PASSWORD_INPUT_MODES, NM_LIBRESWAN_PW_TYPE_SAVE);
0145         data.insert(NM_LIBRESWAN_XAUTH_PASSWORD "-flags", QString::number(NetworkManager::Setting::None));
0146     } else if (m_ui->userPassword->passwordOption() == PasswordField::StoreForUser) {
0147         data.insert(NM_LIBRESWAN_XAUTH_PASSWORD "-flags", QString::number(NetworkManager::Setting::AgentOwned));
0148     } else {
0149         data.insert(NM_LIBRESWAN_XAUTH_PASSWORD_INPUT_MODES, NM_LIBRESWAN_PW_TYPE_ASK);
0150         data.insert(NM_LIBRESWAN_XAUTH_PASSWORD "-flags", QString::number(NetworkManager::Setting::NotSaved));
0151     }
0152 
0153     if (!m_ui->groupPassword->text().isEmpty()) {
0154         secrets.insert(NM_LIBRESWAN_PSK_VALUE, m_ui->groupPassword->text());
0155     }
0156 
0157     if (m_ui->groupPassword->passwordOption() == PasswordField::StoreForAllUsers) {
0158         data.insert(NM_LIBRESWAN_PSK_INPUT_MODES, NM_LIBRESWAN_PW_TYPE_SAVE);
0159         data.insert(NM_LIBRESWAN_PSK_VALUE "-flags", QString::number(NetworkManager::Setting::None));
0160     } else if (m_ui->groupPassword->passwordOption() == PasswordField::StoreForUser) {
0161         data.insert(NM_LIBRESWAN_PSK_VALUE "-flags", QString::number(NetworkManager::Setting::AgentOwned));
0162     } else {
0163         data.insert(NM_LIBRESWAN_PSK_INPUT_MODES, NM_LIBRESWAN_PW_TYPE_ASK);
0164         data.insert(NM_LIBRESWAN_PSK_VALUE "-flags", QString::number(NetworkManager::Setting::NotSaved));
0165     }
0166 
0167     if (!m_ui->username->text().isEmpty()) {
0168         data.insert(NM_LIBRESWAN_LEFTXAUTHUSER, m_ui->username->text());
0169     }
0170 
0171     if (!m_ui->phase1->text().isEmpty()) {
0172         data.insert(NM_LIBRESWAN_IKE, m_ui->phase1->text());
0173     }
0174 
0175     if (!m_ui->phase2->text().isEmpty()) {
0176         data.insert(NM_LIBRESWAN_ESP, m_ui->phase2->text());
0177     }
0178 
0179     if (!m_ui->domain->text().isEmpty()) {
0180         data.insert(NM_LIBRESWAN_DOMAIN, m_ui->domain->text());
0181     }
0182 
0183     setting.setData(data);
0184     setting.setSecrets(secrets);
0185     return setting.toMap();
0186 }
0187 
0188 bool LibreswanWidget::isValid() const
0189 {
0190     return !m_ui->gateway->text().isEmpty();
0191 }