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

0001 /*
0002     SPDX-FileCopyrightText: 2017 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 "fortisslvpnwidget.h"
0008 #include "ui_fortisslvpn.h"
0009 #include "ui_fortisslvpnadvanced.h"
0010 
0011 #include "nm-fortisslvpn-service.h"
0012 
0013 #include <NetworkManagerQt/Setting>
0014 
0015 #include <QDialog>
0016 #include <QDialogButtonBox>
0017 
0018 class FortisslvpnWidgetPrivate
0019 {
0020 public:
0021     Ui::FortisslvpnWidget ui;
0022     Ui::FortisslvpnAdvancedWidget advUi;
0023     NetworkManager::VpnSetting::Ptr setting;
0024     QDialog *advancedDlg = nullptr;
0025     QWidget *advancedWid = nullptr;
0026 };
0027 
0028 FortisslvpnWidget::FortisslvpnWidget(const NetworkManager::VpnSetting::Ptr &setting, QWidget *parent, Qt::WindowFlags f)
0029     : SettingWidget(setting, parent, f)
0030     , d_ptr(new FortisslvpnWidgetPrivate)
0031 {
0032     Q_D(FortisslvpnWidget);
0033 
0034     d->setting = setting;
0035 
0036     d->ui.setupUi(this);
0037 
0038     d->ui.password->setPasswordOptionsEnabled(true);
0039     d->ui.password->setPasswordNotRequiredEnabled(true);
0040 
0041     // Connect for setting check
0042     watchChangedSetting();
0043 
0044     // Connect for validity check
0045     connect(d->ui.gateway, &QLineEdit::textChanged, this, &FortisslvpnWidget::slotWidgetChanged);
0046 
0047     // Advanced configuration
0048     connect(d->ui.advancedButton, &QPushButton::clicked, this, &FortisslvpnWidget::showAdvanced);
0049 
0050     d->advancedDlg = new QDialog(this);
0051     d->advancedWid = new QWidget(this);
0052     d->advUi.setupUi(d->advancedWid);
0053     auto layout = new QVBoxLayout(d->advancedDlg);
0054     layout->addWidget(d->advancedWid);
0055     d->advancedDlg->setLayout(layout);
0056     auto buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, d->advancedDlg);
0057     connect(buttons, &QDialogButtonBox::accepted, d->advancedDlg, &QDialog::accept);
0058     connect(buttons, &QDialogButtonBox::rejected, d->advancedDlg, &QDialog::reject);
0059     layout->addWidget(buttons);
0060     KAcceleratorManager::manage(this);
0061 
0062     // Remove these from setting check:
0063     // Just popping up the advancedDlg changes nothing
0064     disconnect(d->ui.advancedButton, &QPushButton::clicked, this, &SettingWidget::settingChanged);
0065     // But the accept button does
0066     connect(buttons, &QDialogButtonBox::accepted, this, &SettingWidget::settingChanged);
0067 
0068     if (setting && !setting->isNull()) {
0069         loadConfig(setting);
0070     }
0071 }
0072 
0073 FortisslvpnWidget::~FortisslvpnWidget()
0074 {
0075     delete d_ptr;
0076 }
0077 
0078 void FortisslvpnWidget::loadConfig(const NetworkManager::Setting::Ptr &setting)
0079 {
0080     Q_D(FortisslvpnWidget);
0081 
0082     const NMStringMap data = d->setting->data();
0083 
0084     const QString gateway = data.value(NM_FORTISSLVPN_KEY_GATEWAY);
0085     if (!gateway.isEmpty()) {
0086         d->ui.gateway->setText(gateway);
0087     }
0088 
0089     const QString username = data.value(NM_FORTISSLVPN_KEY_USER);
0090     if (!username.isEmpty()) {
0091         d->ui.username->setText(username);
0092     }
0093 
0094     const NetworkManager::Setting::SecretFlags passwordFlag =
0095         static_cast<NetworkManager::Setting::SecretFlags>(data.value(NM_FORTISSLVPN_KEY_PASSWORD "-flags").toInt());
0096     if (passwordFlag == NetworkManager::Setting::None) {
0097         d->ui.password->setPasswordOption(PasswordField::StoreForAllUsers);
0098     } else if (passwordFlag == NetworkManager::Setting::AgentOwned) {
0099         d->ui.password->setPasswordOption(PasswordField::StoreForUser);
0100     } else if (passwordFlag == NetworkManager::Setting::NotSaved) {
0101         d->ui.password->setPasswordOption(PasswordField::AlwaysAsk);
0102     } else {
0103         d->ui.password->setPasswordOption(PasswordField::NotRequired);
0104     }
0105 
0106     const QString caCert = data.value(NM_FORTISSLVPN_KEY_CA);
0107     if (!caCert.isEmpty()) {
0108         d->ui.caCert->setText(caCert);
0109     }
0110 
0111     const QString userCert = data.value(NM_FORTISSLVPN_KEY_CERT);
0112     if (!userCert.isEmpty()) {
0113         d->ui.userCert->setText(userCert);
0114     }
0115 
0116     const QString userKey = data.value(NM_FORTISSLVPN_KEY_KEY);
0117     if (!userKey.isEmpty()) {
0118         d->ui.userKey->setText(userKey);
0119     }
0120 
0121     // From advanced dialog
0122     const QString trustedCert = data.value(NM_FORTISSLVPN_KEY_TRUSTED_CERT);
0123     if (!trustedCert.isEmpty()) {
0124         d->advUi.trustedCert->setText(trustedCert);
0125     }
0126 
0127     if (!data.value(NM_FORTISSLVPN_KEY_OTP "-flags").isEmpty()) {
0128         const NetworkManager::Setting::SecretFlags otpFlag =
0129             static_cast<NetworkManager::Setting::SecretFlags>(data.value(NM_FORTISSLVPN_KEY_OTP "-flags").toInt());
0130         if (otpFlag & NetworkManager::Setting::NotSaved) {
0131             d->advUi.otp->setChecked(true);
0132         }
0133     }
0134 
0135     if (!data.value(NM_FORTISSLVPN_KEY_2FA "-flags").isEmpty()) {
0136         const NetworkManager::Setting::SecretFlags tfaFlag =
0137             static_cast<NetworkManager::Setting::SecretFlags>(data.value(NM_FORTISSLVPN_KEY_2FA "-flags").toInt());
0138         if (tfaFlag & NetworkManager::Setting::AgentOwned) {
0139             d->advUi.tfa->setChecked(true);
0140         }
0141     }
0142 
0143     const QString realm = data.value(NM_FORTISSLVPN_KEY_REALM);
0144     if (!realm.isEmpty()) {
0145         d->advUi.realm->setText(realm);
0146     }
0147 
0148     loadSecrets(setting);
0149 }
0150 
0151 void FortisslvpnWidget::loadSecrets(const NetworkManager::Setting::Ptr &setting)
0152 {
0153     Q_D(FortisslvpnWidget);
0154 
0155     NetworkManager::VpnSetting::Ptr vpnSetting = setting.staticCast<NetworkManager::VpnSetting>();
0156 
0157     if (vpnSetting) {
0158         const NMStringMap secrets = vpnSetting->secrets();
0159 
0160         const QString password = secrets.value(NM_FORTISSLVPN_KEY_PASSWORD);
0161         if (!password.isEmpty()) {
0162             d->ui.password->setText(password);
0163         }
0164     }
0165 }
0166 
0167 QVariantMap FortisslvpnWidget::setting() const
0168 {
0169     Q_D(const FortisslvpnWidget);
0170 
0171     NetworkManager::VpnSetting setting;
0172     setting.setServiceType(QLatin1String(NM_DBUS_SERVICE_FORTISSLVPN));
0173     NMStringMap data;
0174     NMStringMap secrets;
0175 
0176     data.insert(NM_FORTISSLVPN_KEY_GATEWAY, d->ui.gateway->text());
0177 
0178     if (!d->ui.username->text().isEmpty()) {
0179         data.insert(NM_FORTISSLVPN_KEY_USER, d->ui.username->text());
0180     }
0181 
0182     if (!d->ui.password->text().isEmpty()) {
0183         secrets.insert(NM_FORTISSLVPN_KEY_PASSWORD, d->ui.password->text());
0184     }
0185 
0186     if (d->ui.password->passwordOption() == PasswordField::StoreForAllUsers) {
0187         data.insert(NM_FORTISSLVPN_KEY_PASSWORD "-flags", QString::number(NetworkManager::Setting::None));
0188     } else if (d->ui.password->passwordOption() == PasswordField::StoreForUser) {
0189         data.insert(NM_FORTISSLVPN_KEY_PASSWORD "-flags", QString::number(NetworkManager::Setting::AgentOwned));
0190     } else if (d->ui.password->passwordOption() == PasswordField::AlwaysAsk) {
0191         data.insert(NM_FORTISSLVPN_KEY_PASSWORD "-flags", QString::number(NetworkManager::Setting::NotSaved));
0192     } else {
0193         data.insert(NM_FORTISSLVPN_KEY_PASSWORD "-flags", QString::number(NetworkManager::Setting::NotRequired));
0194     }
0195 
0196     if (!d->ui.caCert->url().isEmpty()) {
0197         data.insert(NM_FORTISSLVPN_KEY_CA, d->ui.caCert->url().toLocalFile());
0198     }
0199 
0200     if (!d->ui.userCert->url().isEmpty()) {
0201         data.insert(NM_FORTISSLVPN_KEY_CERT, d->ui.userCert->url().toLocalFile());
0202     }
0203 
0204     if (!d->ui.userKey->url().isEmpty()) {
0205         data.insert(NM_FORTISSLVPN_KEY_KEY, d->ui.userKey->url().toLocalFile());
0206     }
0207 
0208     // From advanced
0209     if (!d->advUi.trustedCert->text().isEmpty()) {
0210         data.insert(NM_FORTISSLVPN_KEY_TRUSTED_CERT, d->advUi.trustedCert->text());
0211     }
0212 
0213     if (d->advUi.otp->isChecked()) {
0214         data.insert(QLatin1String(NM_FORTISSLVPN_KEY_OTP "-flags"), QString::number(NetworkManager::Setting::NotSaved));
0215     } else {
0216         data.insert(QLatin1String(NM_FORTISSLVPN_KEY_OTP "-flags"), QString::number(NetworkManager::Setting::None));
0217     }
0218 
0219     if (d->advUi.tfa->isChecked()) {
0220         data.insert(QLatin1String(NM_FORTISSLVPN_KEY_2FA "-flags"), QString::number(NetworkManager::Setting::AgentOwned));
0221         data.insert(QLatin1String(NM_FORTISSLVPN_KEY_OTP "-flags"), QString::number(NetworkManager::Setting::None));
0222     }
0223 
0224     if (!d->advUi.realm->text().isEmpty()) {
0225         data.insert(NM_FORTISSLVPN_KEY_REALM, d->advUi.realm->text());
0226     }
0227 
0228     setting.setData(data);
0229     setting.setSecrets(secrets);
0230 
0231     return setting.toMap();
0232 }
0233 
0234 void FortisslvpnWidget::showAdvanced()
0235 {
0236     Q_D(FortisslvpnWidget);
0237 
0238     d->advancedDlg->show();
0239 }
0240 
0241 bool FortisslvpnWidget::isValid() const
0242 {
0243     Q_D(const FortisslvpnWidget);
0244 
0245     return !d->ui.gateway->text().isEmpty();
0246 }