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 }