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 "vpncwidget.h"
0008 #include "nm-vpnc-service.h"
0009 #include "ui_vpnc.h"
0010 
0011 #include <QUrl>
0012 
0013 #include <QDBusMetaType>
0014 
0015 VpncWidget::VpncWidget(const NetworkManager::VpnSetting::Ptr &setting, QWidget *parent, Qt::WindowFlags f)
0016     : SettingWidget(setting, parent, f)
0017     , m_ui(new Ui::VpncWidget)
0018     , m_setting(setting)
0019 {
0020     qDBusRegisterMetaType<NMStringMap>();
0021 
0022     m_ui->setupUi(this);
0023 
0024     m_ui->groupPassword->setPasswordOptionsEnabled(true);
0025     m_ui->groupPassword->setPasswordNotRequiredEnabled(true);
0026     m_ui->userPassword->setPasswordOptionsEnabled(true);
0027     m_ui->userPassword->setPasswordNotRequiredEnabled(true);
0028 
0029     connect(m_ui->btnAdvanced, &QPushButton::clicked, this, &VpncWidget::showAdvanced);
0030 
0031     // Connect for setting check
0032     watchChangedSetting();
0033 
0034     // Connect for validity check
0035     connect(m_ui->gateway, &QLineEdit::textChanged, this, &VpncWidget::slotWidgetChanged);
0036 
0037     KAcceleratorManager::manage(this);
0038 
0039     m_advancedWidget = new VpncAdvancedWidget(m_setting, this);
0040     NMStringMap advData = m_advancedWidget->setting();
0041     if (!advData.isEmpty()) {
0042         if (m_tmpSetting.isNull()) {
0043             m_tmpSetting = NetworkManager::VpnSetting::Ptr(new NetworkManager::VpnSetting);
0044         }
0045         m_tmpSetting->setData(advData);
0046     }
0047 
0048     if (setting && !setting->isNull()) {
0049         loadConfig(setting);
0050     }
0051 }
0052 
0053 VpncWidget::~VpncWidget()
0054 {
0055     m_tmpSetting.clear();
0056     m_advancedWidget->deleteLater();
0057     delete m_ui;
0058 }
0059 
0060 void VpncWidget::loadConfig(const NetworkManager::Setting::Ptr &setting)
0061 {
0062     Q_UNUSED(setting);
0063 
0064     const NMStringMap data = m_setting->data();
0065 
0066     const QString gateway = data.value(NM_VPNC_KEY_GATEWAY);
0067     if (!gateway.isEmpty()) {
0068         m_ui->gateway->setText(gateway);
0069     }
0070 
0071     const QString user = data.value(NM_VPNC_KEY_XAUTH_USER);
0072     if (!user.isEmpty()) {
0073         m_ui->user->setText(user);
0074     }
0075 
0076     const NetworkManager::Setting::SecretFlags userPassType =
0077         static_cast<NetworkManager::Setting::SecretFlags>(data.value(NM_VPNC_KEY_XAUTH_PASSWORD "-flags").toInt());
0078     if (userPassType.testFlag(NetworkManager::Setting::None)) {
0079         m_ui->userPassword->setPasswordOption(PasswordField::StoreForAllUsers);
0080     } else if (userPassType.testFlag(NetworkManager::Setting::AgentOwned)) {
0081         m_ui->userPassword->setPasswordOption(PasswordField::StoreForUser);
0082     } else if (userPassType.testFlag(NetworkManager::Setting::NotSaved)) {
0083         m_ui->userPassword->setPasswordOption(PasswordField::AlwaysAsk);
0084     } else {
0085         m_ui->userPassword->setPasswordOption(PasswordField::NotRequired);
0086     }
0087 
0088     const QString groupName = data.value(NM_VPNC_KEY_ID);
0089     if (!groupName.isEmpty()) {
0090         m_ui->group->setText(groupName);
0091     }
0092 
0093     const NetworkManager::Setting::SecretFlags groupPassType =
0094         static_cast<NetworkManager::Setting::SecretFlags>(data.value(NM_VPNC_KEY_SECRET "-flags").toInt());
0095     if (groupPassType.testFlag(NetworkManager::Setting::None)) {
0096         m_ui->groupPassword->setPasswordOption(PasswordField::StoreForAllUsers);
0097     } else if (groupPassType.testFlag(NetworkManager::Setting::AgentOwned)) {
0098         m_ui->groupPassword->setPasswordOption(PasswordField::StoreForUser);
0099     } else if (groupPassType.testFlag(NetworkManager::Setting::NotSaved)) {
0100         m_ui->groupPassword->setPasswordOption(PasswordField::AlwaysAsk);
0101     } else {
0102         m_ui->groupPassword->setPasswordOption(PasswordField::NotRequired);
0103     }
0104 
0105     if (data.value(NM_VPNC_KEY_AUTHMODE) == QLatin1String("hybrid")) {
0106         m_ui->useHybridAuth->setChecked(true);
0107         m_ui->caFile->setUrl(QUrl::fromLocalFile(data.value(NM_VPNC_KEY_CA_FILE)));
0108     }
0109 
0110     loadSecrets(setting);
0111 }
0112 
0113 void VpncWidget::loadSecrets(const NetworkManager::Setting::Ptr &setting)
0114 {
0115     NetworkManager::VpnSetting::Ptr vpnSetting = setting.staticCast<NetworkManager::VpnSetting>();
0116 
0117     if (vpnSetting) {
0118         const NMStringMap secrets = vpnSetting->secrets();
0119 
0120         const QString userPassword = secrets.value(NM_VPNC_KEY_XAUTH_PASSWORD);
0121         if (!userPassword.isEmpty()) {
0122             m_ui->userPassword->setText(userPassword);
0123         }
0124 
0125         const QString groupPassword = secrets.value(NM_VPNC_KEY_SECRET);
0126         if (!groupPassword.isEmpty()) {
0127             m_ui->groupPassword->setText(groupPassword);
0128         }
0129     }
0130 }
0131 
0132 QVariantMap VpncWidget::setting() const
0133 {
0134     NetworkManager::VpnSetting setting;
0135     setting.setServiceType(QLatin1String(NM_DBUS_SERVICE_VPNC));
0136     NMStringMap data;
0137     NMStringMap secrets;
0138 
0139     if (!m_tmpSetting.isNull()) {
0140         data = m_tmpSetting->data();
0141     }
0142 
0143     if (!m_ui->gateway->text().isEmpty()) {
0144         data.insert(NM_VPNC_KEY_GATEWAY, m_ui->gateway->text());
0145     }
0146 
0147     if (!m_ui->user->text().isEmpty()) {
0148         data.insert(NM_VPNC_KEY_XAUTH_USER, m_ui->user->text());
0149     }
0150 
0151     if (m_ui->userPassword->isEnabled() && !m_ui->userPassword->text().isEmpty()) {
0152         secrets.insert(NM_VPNC_KEY_XAUTH_PASSWORD, m_ui->userPassword->text());
0153     }
0154 
0155     if (m_ui->userPassword->passwordOption() == PasswordField::StoreForAllUsers) {
0156         data.insert(NM_VPNC_KEY_XAUTH_PASSWORD "-flags", QString::number(NetworkManager::Setting::None));
0157     } else if (m_ui->userPassword->passwordOption() == PasswordField::StoreForUser) {
0158         data.insert(NM_VPNC_KEY_XAUTH_PASSWORD "-flags", QString::number(NetworkManager::Setting::AgentOwned));
0159     } else if (m_ui->userPassword->passwordOption() == PasswordField::AlwaysAsk) { // SettingWidget::EnumPasswordStorageType::Store
0160         data.insert(NM_VPNC_KEY_XAUTH_PASSWORD "-flags", QString::number(NetworkManager::Setting::NotSaved));
0161     } else {
0162         data.insert(NM_VPNC_KEY_XAUTH_PASSWORD "-flags", QString::number(NetworkManager::Setting::NotRequired));
0163     }
0164 
0165     if (!m_ui->group->text().isEmpty()) {
0166         data.insert(NM_VPNC_KEY_ID, m_ui->group->text());
0167     }
0168 
0169     if (m_ui->groupPassword->isEnabled() && !m_ui->groupPassword->text().isEmpty()) {
0170         secrets.insert(NM_VPNC_KEY_SECRET, m_ui->groupPassword->text());
0171     }
0172 
0173     if (m_ui->groupPassword->passwordOption() == PasswordField::StoreForAllUsers) {
0174         data.insert(NM_VPNC_KEY_SECRET "-flags", QString::number(NetworkManager::Setting::None));
0175     } else if (m_ui->groupPassword->passwordOption() == PasswordField::StoreForUser) {
0176         data.insert(NM_VPNC_KEY_SECRET "-flags", QString::number(NetworkManager::Setting::AgentOwned));
0177     } else if (m_ui->groupPassword->passwordOption() == PasswordField::AlwaysAsk) { // SettingWidget::EnumPasswordStorageType::Store
0178         data.insert(NM_VPNC_KEY_SECRET "-flags", QString::number(NetworkManager::Setting::NotSaved));
0179     } else {
0180         data.insert(NM_VPNC_KEY_SECRET "-flags", QString::number(NetworkManager::Setting::NotRequired));
0181     }
0182 
0183     if (m_ui->useHybridAuth->isChecked() && m_ui->caFile->url().isValid()) {
0184         data.insert(NM_VPNC_KEY_AUTHMODE, "hybrid");
0185         data.insert(NM_VPNC_KEY_CA_FILE, m_ui->caFile->url().toLocalFile());
0186     }
0187 
0188     setting.setData(data);
0189     setting.setSecrets(secrets);
0190     return setting.toMap();
0191 }
0192 
0193 void VpncWidget::userPasswordTypeChanged(int index)
0194 {
0195     m_ui->userPassword->setEnabled(index == SettingWidget::EnumPasswordStorageType::Store);
0196 }
0197 
0198 void VpncWidget::groupPasswordTypeChanged(int index)
0199 {
0200     m_ui->groupPassword->setEnabled(index == SettingWidget::EnumPasswordStorageType::Store);
0201 }
0202 
0203 void VpncWidget::showAdvanced()
0204 {
0205     m_advancedWidget->loadConfig(m_tmpSetting);
0206     connect(m_advancedWidget.data(), &VpncAdvancedWidget::accepted, [this]() {
0207         NMStringMap advData = m_advancedWidget->setting();
0208         if (!advData.isEmpty()) {
0209             m_tmpSetting->setData(advData);
0210         }
0211     });
0212     m_advancedWidget->setModal(true);
0213     m_advancedWidget->show();
0214 }
0215 
0216 bool VpncWidget::isValid() const
0217 {
0218     return !m_ui->gateway->text().isEmpty();
0219 }