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 }