kylin-nm/src-vpn/frontend/vpndetails/vpnconfigpage.cpp

1075 lines
40 KiB
C++

/*
*
* Copyright (C) 2023, KylinSoft Co., Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*
*/
#include "vpnconfigpage.h"
#include <QApplication>
#include <QFileDialog>
#define NO_LAYOUT_MARGINS 0, 0, 0, 0
#define NO_SPACE 0
#define HLAYOUT_SPACING 16
#define VLAYOUT_SPACING 24
#define LEFT_LABEL_WIDTH 100
#define PIN_MAX_LENGTH 10
#define PWD_OPTION_THISUSER_INDEX 0
#define PWD_OPTION_ALLUSERS_INDEX 1
#define PWD_OPTION_ASKEVERYTIME_INDEX 2
#define PWD_OPTION_NOTREQUIRED_INDEX 3
#define LOG_FLAG "[VPN ConfigPage]"
VpnConfigPage::VpnConfigPage(QWidget *parent) : QFrame(parent)
{
initUI();
initConnect();
onVpnTypeComboxIndexChanged();
}
VpnType VpnConfigPage::getVpnType()
{
return VpnType(m_vpnTypeComboBox->currentData().toInt());
}
void VpnConfigPage::setVpnConfigInfo(const KyVpnConfig &vpnInfo)
{
m_vpnNameEdit->setText(vpnInfo.m_vpnName);
m_serverAddressEdit->setText(vpnInfo.m_gateway);
m_vpnTypeComboBox->setCurrentIndex(vpnInfo.m_vpnType);
onVpnTypeComboxIndexChanged();
switch (vpnInfo.m_vpnType) {
case KYVPNTYPE_L2TP:
setL2tpConfigInfo(vpnInfo);
break;
case KYVPNTYPE_PPTP:
setPptpConfigInfo(vpnInfo);
break;
case KYVPNTYPE_OPENVPN:
setOpenVpnConfigInfo(vpnInfo);
break;
case KYVPNTYPE_STRONGSWAN:
setSSwanVpnConfigInfo(vpnInfo);
break;
default:
qDebug() << LOG_FLAG << "Unknow VPN Type" << vpnInfo.m_vpnType;
break;
}
}
bool VpnConfigPage::checkIsChanged(const KyVpnConfig &vpnInfo)
{
bool isChanged = false;
int currentVpnType = m_vpnTypeComboBox->currentData().toInt();
if (vpnInfo.m_vpnType != currentVpnType
|| vpnInfo.m_vpnName != m_vpnNameEdit->text()
|| vpnInfo.m_gateway != m_serverAddressEdit->text()) {
isChanged = true;
}
switch (currentVpnType) {
case L2TP:
if (checkL2tpIsChanged(vpnInfo)) {
isChanged = true;
}
break;
case PPTP:
if (checkPptpIsChanged(vpnInfo)) {
isChanged = true;
}
break;
case OPEN_VPN:
if (checkOpenVpnIsChanged(vpnInfo)) {
isChanged = true;
}
break;
case STRONG_SWAN:
if (checkStrongSwanIsChanged(vpnInfo)) {
isChanged = true;
}
default:
break;
}
return isChanged;
}
void VpnConfigPage::updateVpnConfigInfo(KyVpnConfig &vpnInfo)
{
vpnInfo.m_vpnType = (KyVpnType)m_vpnTypeComboBox->currentData().toInt();
vpnInfo.m_vpnName = m_vpnNameEdit->text();
vpnInfo.m_gateway = m_serverAddressEdit->text();
switch (m_vpnTypeComboBox->currentData().toInt()) {
case L2TP:
updateL2tpConfigInfo(vpnInfo);
break;
case OPEN_VPN:
updateOpenVpnConfigInfo(vpnInfo);
break;
case PPTP:
updatePptpConfigInfo(vpnInfo);
break;
case STRONG_SWAN:
updateSSwanVpnConfigInfo(vpnInfo);
break;
default:
break;
}
}
void VpnConfigPage::initUI()
{
/**********控件**********/
//公有
m_vpnTypeLabel = new QLabel(this);
m_vpnNameLabel = new QLabel(this);
m_serverAddressLabel = new FixLabel(this);
m_vpnTypeComboBox = new QComboBox(this);
m_vpnNameEdit = new QLineEdit(this);
m_serverAddressEdit = new QLineEdit(this);
//认证方式 Authentication Mode
m_authModeLabel = new FixLabel(this);
m_authModeComboBox = new QComboBox(this);
//证书 私钥
m_caCertLabel = new FixLabel(this);
m_userCertLabel = new FixLabel(this);
m_privateKeyLabel = new FixLabel(this);
m_privateKeyPwdLabel = new FixLabel(this);
m_pwdOptionLabel = new FixLabel(this);
m_caCertPathEdit = new QLineEdit(this);
m_userCertPathEdit = new QLineEdit(this);
m_privateKeyEdit = new QLineEdit(this);
m_privateKeyPwdEdit = new KPasswordEdit(this);
m_pwdOptionCombox = new QComboBox(this);
m_caCertButton = new QPushButton(this);
m_userCertButton = new QPushButton(this);
m_privateKeyButton = new QPushButton(this);
//静态密钥
m_staticKeyLabel = new QLabel(this);
m_keyDirectionLabel = new FixLabel(this);
m_noticesLabel = new QLabel(this);
m_localIpLabel = new QLabel(this);
m_remoteIpLabel = new QLabel(this);
m_staticKeyPathEdit = new QLineEdit(this);
m_staticKeyButton = new QPushButton(this);
m_keyDirectionCombox = new QComboBox(this);
m_localIpEdit = new QLineEdit(this);
m_remoteIpEdit = new QLineEdit(this);
//智能卡 PIN码
m_pinLabel = new QLabel(this);
m_pinEdit = new QLineEdit(this);
//密码
m_usernameLabel = new FixLabel(this);
m_userPwdLabel = new QLabel(this);
m_userPwdOptionLabel = new FixLabel(this);
m_usernameEdit = new QLineEdit(this);
m_userPwdEdit = new KPasswordEdit(this);
m_userPwdOptionCombox = new QComboBox(this);
//L2TP PPTP公有
m_ntDomainLabel = new QLabel(this);
m_ntDomainEdit = new QLineEdit(this);
/**********布局**********/
m_vpnCommunalFrame = new QFrame(this);
m_authModeFrame = new QFrame(this);
m_caCertFrame = new QFrame(this);
m_userCertFrame = new QFrame(this);
m_staticKeysFrame = new QFrame(this);
m_pinFrame = new QFrame(this);
m_PrivateKeysFrame = new QFrame(this);
m_usersFrame = new QFrame(this);
m_userPwdOpFrame = new QFrame(this);
m_ntFrame = new QFrame(this);
//布局
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->setContentsMargins(NO_LAYOUT_MARGINS);
mainLayout->setSpacing(VLAYOUT_SPACING);
mainLayout->addWidget(m_vpnCommunalFrame);
mainLayout->addWidget(m_authModeFrame);
mainLayout->addWidget(m_caCertFrame);
mainLayout->addWidget(m_userCertFrame);
mainLayout->addWidget(m_staticKeysFrame);
mainLayout->addWidget(m_pinFrame);
mainLayout->addWidget(m_PrivateKeysFrame);
mainLayout->addWidget(m_usersFrame);
mainLayout->addWidget(m_userPwdOpFrame);
mainLayout->addWidget(m_ntFrame);
mainLayout->addSpacing(3);
mainLayout->addStretch();
QGridLayout *vpnCommLayout = new QGridLayout(m_vpnCommunalFrame);
vpnCommLayout->setContentsMargins(NO_LAYOUT_MARGINS);
vpnCommLayout->setHorizontalSpacing(HLAYOUT_SPACING);
vpnCommLayout->setVerticalSpacing(VLAYOUT_SPACING);
vpnCommLayout->addWidget(m_vpnTypeLabel, 0, 0);
vpnCommLayout->addWidget(m_vpnNameLabel, 1, 0);
vpnCommLayout->addWidget(m_serverAddressLabel, 2, 0);
vpnCommLayout->addWidget(m_vpnTypeComboBox, 0, 1);
vpnCommLayout->addWidget(m_vpnNameEdit, 1, 1);
vpnCommLayout->addWidget(m_serverAddressEdit, 2, 1);
m_vpnTypeLabel->setFixedWidth(LEFT_LABEL_WIDTH);
m_vpnNameLabel->setFixedWidth(LEFT_LABEL_WIDTH);
m_serverAddressLabel->setFixedWidth(LEFT_LABEL_WIDTH);
QHBoxLayout *authMdLayout = new QHBoxLayout(m_authModeFrame);
authMdLayout->setContentsMargins(NO_LAYOUT_MARGINS);
authMdLayout->setSpacing(HLAYOUT_SPACING);
authMdLayout->addWidget(m_authModeLabel);
authMdLayout->addWidget(m_authModeComboBox);
m_authModeLabel->setFixedWidth(LEFT_LABEL_WIDTH);
QHBoxLayout *caCertLayout = new QHBoxLayout(m_caCertFrame);
caCertLayout->setContentsMargins(NO_LAYOUT_MARGINS);
caCertLayout->setSpacing(HLAYOUT_SPACING);
caCertLayout->addWidget(m_caCertLabel);
caCertLayout->addWidget(m_caCertPathEdit);
caCertLayout->addWidget(m_caCertButton);
m_caCertLabel->setFixedWidth(LEFT_LABEL_WIDTH);
QHBoxLayout *userLayout = new QHBoxLayout(m_userCertFrame);
userLayout->setContentsMargins(NO_LAYOUT_MARGINS);
userLayout->setSpacing(HLAYOUT_SPACING);
userLayout->addWidget(m_userCertLabel);
userLayout->addWidget(m_userCertPathEdit);
userLayout->addWidget(m_userCertButton);
m_userCertLabel->setFixedWidth(LEFT_LABEL_WIDTH);
QGridLayout *staticKeyLayout = new QGridLayout(m_staticKeysFrame);
staticKeyLayout->setContentsMargins(NO_LAYOUT_MARGINS);
staticKeyLayout->setHorizontalSpacing(HLAYOUT_SPACING);
staticKeyLayout->setVerticalSpacing(VLAYOUT_SPACING);
staticKeyLayout->addWidget(m_staticKeyLabel, 0, 0);
staticKeyLayout->addWidget(m_staticKeyPathEdit, 0, 1);
staticKeyLayout->addWidget(m_staticKeyButton, 0, 2);
staticKeyLayout->addWidget(m_keyDirectionLabel, 1, 0);
staticKeyLayout->addWidget(m_keyDirectionCombox, 1, 1, 1, 2);
staticKeyLayout->addWidget(m_noticesLabel, 2, 0, 2, 3);
staticKeyLayout->addWidget(m_localIpLabel, 4, 0);
staticKeyLayout->addWidget(m_localIpEdit, 4, 1, 1, 2);
staticKeyLayout->addWidget(m_remoteIpLabel, 5, 0);
staticKeyLayout->addWidget(m_remoteIpEdit, 5, 1, 1, 2);
m_staticKeyLabel->setFixedWidth(LEFT_LABEL_WIDTH);
m_keyDirectionLabel->setFixedWidth(LEFT_LABEL_WIDTH);
m_localIpLabel->setFixedWidth(LEFT_LABEL_WIDTH);
m_remoteIpLabel->setFixedWidth(LEFT_LABEL_WIDTH);
QHBoxLayout *pinLayout = new QHBoxLayout(m_pinFrame);
pinLayout->setContentsMargins(NO_LAYOUT_MARGINS);
pinLayout->setSpacing(HLAYOUT_SPACING);
pinLayout->addWidget(m_pinLabel);
pinLayout->addWidget(m_pinEdit);
m_pinLabel->setFixedWidth(LEFT_LABEL_WIDTH);
QGridLayout *privateKeysLayout = new QGridLayout(m_PrivateKeysFrame);
privateKeysLayout->setContentsMargins(NO_LAYOUT_MARGINS);
privateKeysLayout->setHorizontalSpacing(HLAYOUT_SPACING);
privateKeysLayout->setVerticalSpacing(VLAYOUT_SPACING);
privateKeysLayout->addWidget(m_privateKeyLabel, 0, 0);
privateKeysLayout->addWidget(m_privateKeyPwdLabel, 1, 0);
privateKeysLayout->addWidget(m_pwdOptionLabel, 2, 0);
privateKeysLayout->addWidget(m_privateKeyEdit, 0, 1);
privateKeysLayout->addWidget(m_privateKeyButton, 0, 2);
privateKeysLayout->addWidget(m_privateKeyPwdEdit, 1, 1, 1, 2);
privateKeysLayout->addWidget(m_pwdOptionCombox, 2, 1, 1, 2);
m_privateKeyLabel->setFixedWidth(LEFT_LABEL_WIDTH);
m_privateKeyPwdLabel->setFixedWidth(LEFT_LABEL_WIDTH);
m_pwdOptionLabel->setFixedWidth(LEFT_LABEL_WIDTH);
QGridLayout *usersLayout = new QGridLayout(m_usersFrame);
usersLayout->setContentsMargins(NO_LAYOUT_MARGINS);
usersLayout->setHorizontalSpacing(HLAYOUT_SPACING);
usersLayout->setVerticalSpacing(VLAYOUT_SPACING);
usersLayout->addWidget(m_usernameLabel, 0, 0);
usersLayout->addWidget(m_usernameEdit, 0, 1);
usersLayout->addWidget(m_userPwdLabel, 1, 0);
usersLayout->addWidget(m_userPwdEdit, 1, 1);
m_usernameLabel->setFixedWidth(LEFT_LABEL_WIDTH);
m_userPwdLabel->setFixedWidth(LEFT_LABEL_WIDTH);
QHBoxLayout *userPwdOLayout = new QHBoxLayout(m_userPwdOpFrame);
userPwdOLayout->setContentsMargins(NO_LAYOUT_MARGINS);
userPwdOLayout->setSpacing(HLAYOUT_SPACING);
userPwdOLayout->addWidget(m_userPwdOptionLabel);
userPwdOLayout->addWidget(m_userPwdOptionCombox);
m_userPwdOptionLabel->setFixedWidth(LEFT_LABEL_WIDTH);
QHBoxLayout *ntLayout = new QHBoxLayout(m_ntFrame);
ntLayout->setContentsMargins(NO_LAYOUT_MARGINS);
ntLayout->setSpacing(HLAYOUT_SPACING);
ntLayout->addWidget(m_ntDomainLabel);
ntLayout->addWidget(m_ntDomainEdit);
m_ntDomainLabel->setFixedWidth(LEFT_LABEL_WIDTH);
/**********控件显示**********/
m_vpnTypeLabel->setText(tr("Type")); //类型
m_vpnNameLabel->setText(tr("Name")); //名称
m_staticKeyLabel->setText(tr("Static Key")); //静态密钥
m_localIpLabel->setText(tr("Local IP")); //本地IP地址
m_remoteIpLabel->setText(tr("Remote IP")); //远程IP地址
m_pinLabel->setText(tr("PIN Code")); //PIN码
m_userPwdLabel->setText(tr("Password")); //密码
m_ntDomainLabel->setText(tr("NT Domain")); //NT域
m_serverAddressLabel->setLabelText(tr("Server Address")); //服务器地址
m_authModeLabel->setLabelText(tr("Authentication Mode")); //认证方式
m_caCertLabel->setLabelText(tr("CA Certificate")); //CA证书
m_userCertLabel->setLabelText(tr("User Certificate")); //用户证书
m_keyDirectionLabel->setLabelText(tr("Key Direction")); //密钥方向
m_privateKeyLabel->setLabelText(tr("Private Key")); //私钥
m_privateKeyPwdLabel->setLabelText(tr("Private Key Password")); //私有密钥密码
m_pwdOptionLabel->setLabelText(tr("Password Options")); //密码选项
m_usernameLabel->setLabelText(tr("Username")); //用户名
m_userPwdOptionLabel->setLabelText(tr("Password Options")); //密码选项
m_noticesLabel->setWordWrap(true);
m_noticesLabel->setText(tr("Notice:\nIf key direction is used, it must be opposite to the VPN side used. "
"If '1' is used, the connection must use '0'. "
"If you are not sure which value to use, please contact your system administrator."));
QPalette pal;
pal.setColor(QPalette::WindowText, qApp->palette().color(QPalette::Mid));
m_noticesLabel->setPalette(pal);
m_caCertButton->setText(tr("Choose")); //选择
m_userCertButton->setText(tr("Choose"));
m_staticKeyButton->setText(tr("Choose"));
m_privateKeyButton->setText(tr("Choose"));
m_vpnTypeComboBox->addItem("L2TP", L2TP);
m_vpnTypeComboBox->addItem("open VPN", OPEN_VPN);
m_vpnTypeComboBox->addItem("PPTP", PPTP);
m_vpnTypeComboBox->addItem("strong-swan", STRONG_SWAN);
m_keyDirectionCombox->addItem(tr("None"), KEY_DIRECTION_NONE);
m_keyDirectionCombox->addItem("0", KEY_DIRECTION_ZERO);
m_keyDirectionCombox->addItem("1", KEY_DIRECTION_ONE);
m_pwdOptionCombox->addItem(tr("Save password only for this user"), KYPASSWD_FORTHISUSER); //仅对当前用户保存密码
m_pwdOptionCombox->addItem(tr("Save password for all users"), KYPASSWD_FORALLUSER); //为所有用户保存密码
m_pwdOptionCombox->addItem(tr("Ask password every time"), KYPASSWD_ASKEVERYTIME); //每次都询问
m_pwdOptionCombox->addItem(tr("Don't require a password"), KYPASSWD_ISNOTREQUIRED);//不需要密码
m_pwdOptionCombox->setCurrentIndex(PWD_OPTION_ASKEVERYTIME_INDEX);
m_userPwdOptionCombox->addItem(tr("Save password only for this user"), KYPASSWD_FORTHISUSER);
m_userPwdOptionCombox->addItem(tr("Save password for all users"), KYPASSWD_FORALLUSER);
m_userPwdOptionCombox->addItem(tr("Ask password every time"), KYPASSWD_ASKEVERYTIME);
m_userPwdOptionCombox->addItem(tr("Don't require a password"), KYPASSWD_ISNOTREQUIRED);
m_userPwdOptionCombox->setCurrentIndex(PWD_OPTION_ASKEVERYTIME_INDEX);
m_vpnNameEdit->setPlaceholderText(tr("Required")); //必填
m_serverAddressEdit->setPlaceholderText(tr("Required"));
m_privateKeyPwdEdit->setClearButtonEnabled(false);
m_userPwdEdit->setClearButtonEnabled(false);
//控件输入格式限制
QRegExp rxNumber("^[0-9]+$");
m_pinEdit->setValidator(new QRegExpValidator(rxNumber, this));
m_pinEdit->setMaxLength(PIN_MAX_LENGTH);
// IP的正则格式限制
QRegExp rxIp("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b");
QRegExpValidator *ipExpVal = new QRegExpValidator(rxIp, this);
m_serverAddressEdit->setValidator(ipExpVal);
m_localIpEdit->setValidator(ipExpVal);
m_remoteIpEdit->setValidator(ipExpVal);
}
void VpnConfigPage::initConnect()
{
connect(m_vpnTypeComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &VpnConfigPage::onVpnTypeComboxIndexChanged);
connect(m_authModeComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &VpnConfigPage::onAuthModeComboxIndexChanged);
connect(m_vpnNameEdit, &QLineEdit::textChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_serverAddressEdit, &QLineEdit::textChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_caCertPathEdit, &QLineEdit::textChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_userCertPathEdit, &QLineEdit::textChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_privateKeyEdit, &QLineEdit::textChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_staticKeyPathEdit, &QLineEdit::textChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_localIpEdit, &QLineEdit::textChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_remoteIpEdit, &QLineEdit::textChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_pinEdit, &QLineEdit::textChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_usernameEdit, &QLineEdit::textChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_ntDomainEdit, &QLineEdit::textChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_vpnTypeComboBox, &QComboBox::currentTextChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_authModeComboBox, &QComboBox::currentTextChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_pwdOptionCombox, &QComboBox::currentTextChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_userPwdOptionCombox, &QComboBox::currentTextChanged, this, &VpnConfigPage::setEnableOfConfirmBtn);
connect(m_caCertButton, &QPushButton::clicked, this, &VpnConfigPage::onCaCertButtonClicked);
connect(m_userCertButton, &QPushButton::clicked, this, &VpnConfigPage::onUserCertButtonClicked);
connect(m_staticKeyButton, &QPushButton::clicked, this, &VpnConfigPage::onStaticKeyButtonClicked);
connect(m_privateKeyButton, &QPushButton::clicked, this, &VpnConfigPage::onPrivateKeyButtonClicked);
}
void VpnConfigPage::showL2tpPwd()
{
m_vpnCommunalFrame->setHidden(false);
m_authModeFrame->setHidden(false);
m_usersFrame->setHidden(false);
m_userPwdOpFrame->setHidden(false);
m_ntFrame->setHidden(false);
m_PrivateKeysFrame->setHidden(true);
m_caCertFrame->setHidden(true);
m_userCertFrame->setHidden(true);
m_staticKeysFrame->setHidden(true);
m_pinFrame->setHidden(true);
}
void VpnConfigPage::showPptpPwd()
{
m_vpnCommunalFrame->setHidden(false);
m_usersFrame->setHidden(false);
m_userPwdOpFrame->setHidden(false);
m_ntFrame->setHidden(false);
m_authModeFrame->setHidden(true);
m_PrivateKeysFrame->setHidden(true);
m_caCertFrame->setHidden(true);
m_userCertFrame->setHidden(true);
m_staticKeysFrame->setHidden(true);
m_pinFrame->setHidden(true);
}
void VpnConfigPage::showOpenVpnTls()
{
m_vpnCommunalFrame->setHidden(false);
m_authModeFrame->setHidden(false);
m_PrivateKeysFrame->setHidden(false);
m_caCertFrame->setHidden(false);
m_userCertFrame->setHidden(false);
m_staticKeysFrame->setHidden(true);
m_pinFrame->setHidden(true);
m_usersFrame->setHidden(true);
m_userPwdOpFrame->setHidden(true);
m_ntFrame->setHidden(true);
}
void VpnConfigPage::showOpenVpnPwd()
{
m_vpnCommunalFrame->setHidden(false);
m_authModeFrame->setHidden(false);
m_caCertFrame->setHidden(false);
m_usersFrame->setHidden(false);
m_userPwdOpFrame->setHidden(false);
m_userCertFrame->setHidden(true);
m_PrivateKeysFrame->setHidden(true);
m_staticKeysFrame->setHidden(true);
m_pinFrame->setHidden(true);
m_ntFrame->setHidden(true);
}
void VpnConfigPage::showOpenVpnPwdTls()
{
m_vpnCommunalFrame->setHidden(false);
m_authModeFrame->setHidden(false);
m_caCertFrame->setHidden(false);
m_userCertFrame->setHidden(false);
m_PrivateKeysFrame->setHidden(false);
m_usersFrame->setHidden(false);
m_userPwdOpFrame->setHidden(false);
m_staticKeysFrame->setHidden(true);
m_pinFrame->setHidden(true);
m_ntFrame->setHidden(true);
}
void VpnConfigPage::showOpenVpnStaticKey()
{
m_vpnCommunalFrame->setHidden(false);
m_authModeFrame->setHidden(false);
m_staticKeysFrame->setHidden(false);
m_caCertFrame->setHidden(true);
m_userCertFrame->setHidden(true);
m_PrivateKeysFrame->setHidden(true);
m_usersFrame->setHidden(true);
m_userPwdOpFrame->setHidden(true);
m_pinFrame->setHidden(true);
m_ntFrame->setHidden(true);
}
void VpnConfigPage::showSswanCertPrivteKey()
{
m_vpnCommunalFrame->setHidden(false);
m_authModeFrame->setHidden(false);
m_userCertFrame->setHidden(false);
m_PrivateKeysFrame->setHidden(false);
m_caCertFrame->setHidden(true);
m_usersFrame->setHidden(true);
m_userPwdOpFrame->setHidden(true);
m_staticKeysFrame->setHidden(true);
m_pinFrame->setHidden(true);
m_ntFrame->setHidden(true);
}
void VpnConfigPage::showSswanCertSsh()
{
m_vpnCommunalFrame->setHidden(false);
m_authModeFrame->setHidden(false);
m_userCertFrame->setHidden(false);
m_caCertFrame->setHidden(true);
m_PrivateKeysFrame->setHidden(true);
m_usersFrame->setHidden(true);
m_userPwdOpFrame->setHidden(true);
m_staticKeysFrame->setHidden(true);
m_pinFrame->setHidden(true);
m_ntFrame->setHidden(true);
}
void VpnConfigPage::showSswanSmartCard()
{
m_vpnCommunalFrame->setHidden(false);
m_authModeFrame->setHidden(false);
m_pinFrame->setHidden(false);
m_caCertFrame->setHidden(true);
m_userCertFrame->setHidden(true);
m_PrivateKeysFrame->setHidden(true);
m_usersFrame->setHidden(true);
m_userPwdOpFrame->setHidden(true);
m_staticKeysFrame->setHidden(true);
m_ntFrame->setHidden(true);
}
void VpnConfigPage::showSswanEap()
{
m_vpnCommunalFrame->setHidden(false);
m_authModeFrame->setHidden(false);
m_usersFrame->setHidden(false);
m_caCertFrame->setHidden(true);
m_userCertFrame->setHidden(true);
m_PrivateKeysFrame->setHidden(true);
m_userPwdOpFrame->setHidden(true);
m_staticKeysFrame->setHidden(true);
m_pinFrame->setHidden(true);
m_ntFrame->setHidden(true);
}
bool VpnConfigPage::getTextEditState(QString text)
{
if (text.isEmpty()) {
return true;
}
QRegExp rx("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b");
bool match = false;
match = rx.exactMatch(text);
return match;
}
bool VpnConfigPage::checkConfirmBtnIsEnabled()
{
if (m_vpnNameEdit->text().isEmpty()) {
qDebug() << LOG_FLAG << "VPN name empty or invalid";
return false;
}
if (m_serverAddressEdit->text().isEmpty() || !getTextEditState(m_serverAddressEdit->text())) {
qDebug() << LOG_FLAG << "VPN server address empty or invalid";
return false;
}
int currentAuthMethod = m_authModeComboBox->currentData().toInt();
switch (currentAuthMethod) {
case KYAUTH_PASSWD:
case KYAUTH_EAP:
if (m_usernameEdit->text().isEmpty() && !m_userPwdEdit->text().isEmpty()) {
return false;
}
if (m_vpnTypeComboBox->currentData().toInt() == OPEN_VPN && m_caCertPathEdit->text().isEmpty()) {
return false;
}
break;
case KYAUTH_CERTIFICATE:
if (m_caCertPathEdit->text().isEmpty() || m_userCertPathEdit->text().isEmpty()
|| m_privateKeyEdit->text().isEmpty()) {
return false;
}
break;
case KYAUTH_CERTIFICATEANDPASSWD:
if (m_caCertPathEdit->text().isEmpty() || m_userCertPathEdit->text().isEmpty()
|| m_privateKeyEdit->text().isEmpty()) {
return false;
}
if (m_usernameEdit->text().isEmpty() && !m_userPwdEdit->text().isEmpty()) {
return false;
}
break;
case KYAUTH_STATICPASSWD:
if (m_staticKeyPathEdit->text().isEmpty()) {
return false;
}
break;
default:
break;
}
return true;
}
void VpnConfigPage::setPwdAuthInfo(const QString &username, const QString &userPwd, const KyPasswdPolicy &userPwdPolicy)
{
m_usernameEdit->setText(username);
m_userPwdEdit->setText(userPwd);
if (userPwdPolicy == KYPASSWD_ISNOTREQUIRED) {
m_userPwdOptionCombox->setCurrentIndex(PWD_OPTION_NOTREQUIRED_INDEX);
} else {
m_userPwdOptionCombox->setCurrentIndex(userPwdPolicy);
}
}
void VpnConfigPage::setCaCertAuthInfo(const QString &caCertificate)
{
m_caCertPathEdit->setText(caCertificate);
}
void VpnConfigPage::setKeyAuthInfo(const QString &userCert, const QString &privateKey,
const QString &privateKeyPwd, const KyPasswdPolicy &privatePwdPolicy)
{
m_userCertPathEdit->setText(userCert);
m_privateKeyEdit->setText(privateKey);
m_privateKeyPwdEdit->setText(privateKeyPwd);
if (privatePwdPolicy == KYPASSWD_ISNOTREQUIRED) {
m_userPwdOptionCombox->setCurrentIndex(PWD_OPTION_NOTREQUIRED_INDEX);
} else {
m_userPwdOptionCombox->setCurrentIndex(privatePwdPolicy);
}
}
void VpnConfigPage::setStaticKeyAuthInfo(const QString &staticKey, const QString &vpnKeyDirection,
const QString &localIp, const QString &remoteIp)
{
m_staticKeyPathEdit->setText(staticKey);
m_localIpEdit->setText(localIp);
m_remoteIpEdit->setText(remoteIp);
if (vpnKeyDirection == KEY_DIRECTION_ZERO) {
m_keyDirectionCombox->setCurrentIndex(KEY_DIRECTION_ZERO_INDEX);
} else if (vpnKeyDirection == KEY_DIRECTION_ONE) {
m_keyDirectionCombox->setCurrentIndex(KEY_DIRECTION_ONE_INDEX);
} else {
m_keyDirectionCombox->setCurrentIndex(KEY_DIRECTION_NONE_INDEX);
}
}
void VpnConfigPage::setAgentAuthInfo(const QString &userCert)
{
m_userCertPathEdit->setText(userCert);
}
void VpnConfigPage::setSmartCardAuthInfo(const QString &pin)
{
m_pinEdit->setText(pin);
}
void VpnConfigPage::setEapAuthInfo(const QString &username, const QString &userPwd)
{
m_usernameEdit->setText(username);
m_userPwdEdit->setText(userPwd);
}
void VpnConfigPage::setNtDomain(const QString &ntDomain)
{
m_ntDomainEdit->setText(ntDomain);
}
void VpnConfigPage::setL2tpConfigInfo(const KyVpnConfig &vpnInfo)
{
if (vpnInfo.m_authMethod == KyAuthMethod::KYAUTH_PASSWD) {
m_authModeComboBox->setCurrentIndex(KYAUTH_PASSWD);
setPwdAuthInfo(vpnInfo.m_userName, vpnInfo.m_userPasswd, vpnInfo.m_passwdPolicy);
setNtDomain(vpnInfo.m_ntDomain);
}
}
void VpnConfigPage::setPptpConfigInfo(const KyVpnConfig &vpnInfo)
{
m_authModeComboBox->clear();
setPwdAuthInfo(vpnInfo.m_userName, vpnInfo.m_userPasswd, vpnInfo.m_passwdPolicy);
setNtDomain(vpnInfo.m_ntDomain);
}
void VpnConfigPage::setOpenVpnConfigInfo(const KyVpnConfig &vpnInfo)
{
if (vpnInfo.m_authMethod == KyAuthMethod::KYAUTH_PASSWD) {
m_authModeComboBox->setCurrentIndex(PASSWD_INDEX);
setCaCertAuthInfo(vpnInfo.m_caCertificate);
setPwdAuthInfo(vpnInfo.m_userName, vpnInfo.m_userPasswd, vpnInfo.m_passwdPolicy);
} else if (vpnInfo.m_authMethod == KyAuthMethod::KYAUTH_CERTIFICATE) {
m_authModeComboBox->setCurrentIndex(CERTIFICATE_INDEX);
setCaCertAuthInfo(vpnInfo.m_caCertificate);
setKeyAuthInfo(vpnInfo.m_userCertificate, vpnInfo.m_userKey,
vpnInfo.m_privatePasswd, vpnInfo.m_privatePasswdPolicy);
} else if (vpnInfo.m_authMethod == KyAuthMethod::KYAUTH_STATICPASSWD) {
m_authModeComboBox->setCurrentIndex(STATICPASSWD_INDEX);
setStaticKeyAuthInfo(vpnInfo.m_staticKey, vpnInfo.m_vpnKeyDir,
vpnInfo.m_localAddress, vpnInfo.m_remoteAddress);
} else if (vpnInfo.m_authMethod == KyAuthMethod::KYAUTH_CERTIFICATEANDPASSWD) {
m_authModeComboBox->setCurrentIndex(CERTIFICATEANDPASSWD_INDEX);
setCaCertAuthInfo(vpnInfo.m_caCertificate);
setKeyAuthInfo(vpnInfo.m_userCertificate, vpnInfo.m_userKey,
vpnInfo.m_privatePasswd, vpnInfo.m_privatePasswdPolicy);
setPwdAuthInfo(vpnInfo.m_userName, vpnInfo.m_userPasswd, vpnInfo.m_passwdPolicy);
}
}
void VpnConfigPage::setSSwanVpnConfigInfo(const KyVpnConfig &vpnInfo)
{
if (vpnInfo.m_authMethod == KyAuthMethod::KYAUTH_KEY) {
m_authModeComboBox->setCurrentIndex(KEY_INDEX);
setCaCertAuthInfo(vpnInfo.m_caCertificate);
setKeyAuthInfo(vpnInfo.m_userCertificate, vpnInfo.m_userKey,
vpnInfo.m_privatePasswd, vpnInfo.m_privatePasswdPolicy);
} else if (vpnInfo.m_authMethod == KyAuthMethod::KYAUTH_AGENT) {
m_authModeComboBox->setCurrentIndex(AGENT_INDEX);
setAgentAuthInfo(vpnInfo.m_userCertificate);
} else if (vpnInfo.m_authMethod == KyAuthMethod::KYAUTH_SMARTCARD) {
m_authModeComboBox->setCurrentIndex(SMARTCARD_INDEX);
setSmartCardAuthInfo(vpnInfo.m_pinId);
} else if (vpnInfo.m_authMethod == KyAuthMethod::KYAUTH_EAP) {
m_authModeComboBox->setCurrentIndex(EAP_INDEX);
setEapAuthInfo(vpnInfo.m_userName, vpnInfo.m_userPasswd);
}
}
void VpnConfigPage::updateL2tpConfigInfo(KyVpnConfig &vpnInfo)
{
vpnInfo.m_authMethod = (KyAuthMethod)m_authModeComboBox->currentData().toInt();
vpnInfo.m_ntDomain = m_ntDomainEdit->text();
vpnInfo.m_userName = m_usernameEdit->text();
vpnInfo.m_userPasswd = m_userPwdEdit->text();
vpnInfo.m_passwdPolicy = (KyPasswdPolicy)m_userPwdOptionCombox->currentData().toInt();
}
void VpnConfigPage::updatePptpConfigInfo(KyVpnConfig &vpnInfo)
{
vpnInfo.m_ntDomain = m_ntDomainEdit->text();
vpnInfo.m_userName = m_usernameEdit->text();
vpnInfo.m_userPasswd = m_userPwdEdit->text();
vpnInfo.m_passwdPolicy = (KyPasswdPolicy)m_userPwdOptionCombox->currentData().toInt();
}
void VpnConfigPage::updateOpenVpnConfigInfo(KyVpnConfig &vpnInfo)
{
vpnInfo.m_authMethod = (KyAuthMethod)m_authModeComboBox->currentData().toInt();
if (vpnInfo.m_authMethod == KYAUTH_CERTIFICATE || vpnInfo.m_authMethod == KYAUTH_CERTIFICATEANDPASSWD) {
vpnInfo.m_caCertificate = m_caCertPathEdit->text();
vpnInfo.m_userCertificate = m_userCertPathEdit->text();
vpnInfo.m_userKey = m_privateKeyEdit->text();
vpnInfo.m_privatePasswd = m_privateKeyPwdEdit->text();
vpnInfo.m_privatePasswdPolicy = (KyPasswdPolicy)m_pwdOptionCombox->currentData().toInt();
}
if (vpnInfo.m_authMethod == KYAUTH_CERTIFICATEANDPASSWD || vpnInfo.m_authMethod == KYAUTH_PASSWD) {
vpnInfo.m_userName = m_usernameEdit->text();
vpnInfo.m_userPasswd = m_userPwdEdit->text();
vpnInfo.m_passwdPolicy = (KyPasswdPolicy)m_userPwdOptionCombox->currentData().toInt();
vpnInfo.m_caCertificate = m_caCertPathEdit->text();
}
if (vpnInfo.m_authMethod == KYAUTH_STATICPASSWD) {
vpnInfo.m_staticKey = m_staticKeyPathEdit->text();
vpnInfo.m_vpnKeyDir = m_keyDirectionCombox->currentData().toString();
vpnInfo.m_localAddress = m_localIpEdit->text();
vpnInfo.m_remoteAddress = m_remoteIpEdit->text();
}
}
void VpnConfigPage::updateSSwanVpnConfigInfo(KyVpnConfig &vpnInfo)
{
vpnInfo.m_authMethod = (KyAuthMethod)m_authModeComboBox->currentData().toInt();
if (vpnInfo.m_authMethod == KYAUTH_KEY) {
vpnInfo.m_caCertificate = m_caCertPathEdit->text();
vpnInfo.m_userCertificate = m_userCertPathEdit->text();
vpnInfo.m_userKey = m_privateKeyEdit->text();
vpnInfo.m_privatePasswd = m_privateKeyPwdEdit->text();
vpnInfo.m_privatePasswdPolicy = (KyPasswdPolicy)m_pwdOptionCombox->currentData().toInt();
} else if (vpnInfo.m_authMethod == KYAUTH_AGENT) {
vpnInfo.m_userCertificate = m_userCertPathEdit->text();
} else if (vpnInfo.m_authMethod == KYAUTH_SMARTCARD) {
vpnInfo.m_pinId = m_pinEdit->text();
} else if (vpnInfo.m_authMethod == KYAUTH_EAP) {
vpnInfo.m_userName = m_usernameEdit->text();
vpnInfo.m_userPasswd = m_userPwdEdit->text();
}
}
void VpnConfigPage::onVpnTypeComboxIndexChanged()
{
switch (m_vpnTypeComboBox->currentData().toInt()) {
case L2TP:
m_authModeComboBox->clear();
m_authModeComboBox->addItem(tr("Password"), KYAUTH_PASSWD);
onAuthModeComboxIndexChanged();
break;
case OPEN_VPN:
m_authModeComboBox->clear();
m_authModeComboBox->addItem(tr("Certificate(TLS)"), KYAUTH_CERTIFICATE);
m_authModeComboBox->addItem(tr("Static key"), KYAUTH_STATICPASSWD);
m_authModeComboBox->addItem(tr("Password"), KYAUTH_PASSWD);
m_authModeComboBox->addItem(tr("Password and certificate(TLS)"), KYAUTH_CERTIFICATEANDPASSWD);
onAuthModeComboxIndexChanged();
break;
case PPTP:
m_authModeComboBox->clear();
showPptpPwd();
break;
case STRONG_SWAN:
m_authModeComboBox->clear();
m_authModeComboBox->addItem(tr("Certificate/Private key"), KYAUTH_KEY);
m_authModeComboBox->addItem(tr("Certificate/ssh-agent"), KYAUTH_AGENT);
m_authModeComboBox->addItem(tr("Smart card"), KYAUTH_SMARTCARD);
m_authModeComboBox->addItem("EAP", KYAUTH_EAP);
onAuthModeComboxIndexChanged();
break;
default:
break;
}
Q_EMIT vpnTypeChanged(VpnType(m_vpnTypeComboBox->currentData().toInt()));
}
void VpnConfigPage::onAuthModeComboxIndexChanged()
{
switch (m_authModeComboBox->currentData().toInt()) {
case KYAUTH_PASSWD:
if (m_vpnTypeComboBox->currentData().toInt() == L2TP) {
showL2tpPwd();
} else if (m_vpnTypeComboBox->currentData().toInt() == OPEN_VPN) {
showOpenVpnPwd();
}
break;
case KYAUTH_KEY:
showSswanCertPrivteKey();
break;
case KYAUTH_AGENT:
showSswanCertSsh();
break;
case KYAUTH_SMARTCARD:
showSswanSmartCard();
break;
case KYAUTH_EAP:
showSswanEap();
break;
case KYAUTH_CERTIFICATE:
showOpenVpnTls();
break;
case KYAUTH_CERTIFICATEANDPASSWD:
showOpenVpnPwdTls();
break;
case KYAUTH_STATICPASSWD:
showOpenVpnStaticKey();
break;
default:
qDebug() << LOG_FLAG << "Unknow VPN auth mothod";
break;
}
}
void VpnConfigPage::setEnableOfConfirmBtn()
{
Q_EMIT setConfigPageState(checkConfirmBtnIsEnabled());
}
void VpnConfigPage::onPrivateKeyButtonClicked()
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Choose a private key"),
"recent:///",
tr("Key Files (*.key *.pem *.der *.p12 *.pfx)"));
if (!fileName.isNull()) {
m_privateKeyEdit->blockSignals(true);
m_privateKeyEdit->setText(fileName);
m_privateKeyEdit->blockSignals(false);
}
}
void VpnConfigPage::onCaCertButtonClicked()
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Choose a CA certificate"),
"recent:///",
tr("CA Files (*.pem *.der *.p12 *.crt *.cer *.pfx)"));
if (!fileName.isNull()) {
m_caCertPathEdit->blockSignals(true);
m_caCertPathEdit->setText(fileName);
m_caCertPathEdit->blockSignals(false);
}
}
void VpnConfigPage::onUserCertButtonClicked()
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Choose a User certificate"),
"recent:///",
tr("CA Files (*.pem *.der *.p12 *.crt *.cer *.pfx)"));
if (!fileName.isNull()) {
m_userCertPathEdit->blockSignals(true);
m_userCertPathEdit->setText(fileName);
m_userCertPathEdit->blockSignals(false);
}
}
void VpnConfigPage::onStaticKeyButtonClicked()
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Choose a Static key"),
"recent:///",
tr("Key Files (*.key *.pem *.der *.p12 *.pfx)"));
if (!fileName.isNull()) {
m_staticKeyPathEdit->blockSignals(true);
m_staticKeyPathEdit->setText(fileName);
m_staticKeyPathEdit->blockSignals(false);
}
}
bool VpnConfigPage::checkL2tpIsChanged(const KyVpnConfig &vpnInfo)
{
bool isChanged = false;
if (vpnInfo.m_ntDomain != m_ntDomainEdit->text()
|| vpnInfo.m_userName != m_usernameEdit->text()
|| vpnInfo.m_userPasswd != m_userPwdEdit->text()
|| vpnInfo.m_passwdPolicy != m_userPwdOptionCombox->currentData().toInt()) {
isChanged = true;
}
return isChanged;
}
bool VpnConfigPage::checkPptpIsChanged(const KyVpnConfig &vpnInfo)
{
bool isChanged = false;
if (vpnInfo.m_ntDomain != m_ntDomainEdit->text()
|| vpnInfo.m_userName != m_usernameEdit->text()
|| vpnInfo.m_userPasswd != m_userPwdEdit->text()
|| vpnInfo.m_passwdPolicy != m_userPwdOptionCombox->currentData().toInt()) {
isChanged = true;
}
return isChanged;
}
bool VpnConfigPage::checkOpenVpnIsChanged(const KyVpnConfig &vpnInfo)
{
bool isChanged = false;
int currentAuthMethod = m_authModeComboBox->currentData().toInt();
if (vpnInfo.m_authMethod != currentAuthMethod) {
isChanged = true;
}
if (currentAuthMethod == KYAUTH_PASSWD || currentAuthMethod == KYAUTH_CERTIFICATEANDPASSWD) {
if (vpnInfo.m_userName != m_usernameEdit->text()
|| vpnInfo.m_userPasswd != m_userPwdEdit->text()
|| vpnInfo.m_passwdPolicy != m_userPwdOptionCombox->currentData().toInt()
|| vpnInfo.m_caCertificate != m_caCertPathEdit->text()) {
isChanged = true;
}
}
if (currentAuthMethod == KYAUTH_CERTIFICATEANDPASSWD || currentAuthMethod == KYAUTH_CERTIFICATE) {
if (vpnInfo.m_caCertificate != m_caCertPathEdit->text()
|| vpnInfo.m_userCertificate != m_userCertPathEdit->text()
|| vpnInfo.m_userKey != m_privateKeyEdit->text()
|| vpnInfo.m_privatePasswd != m_privateKeyPwdEdit->text()
|| vpnInfo.m_privatePasswdPolicy != m_pwdOptionCombox->currentData().toInt()) {
isChanged = true;
}
}
if (currentAuthMethod == KYAUTH_STATICPASSWD) {
if (vpnInfo.m_staticKey != m_staticKeyPathEdit->text()
|| vpnInfo.m_vpnKeyDir != m_keyDirectionCombox->currentData().toString()
|| vpnInfo.m_localAddress != m_localIpEdit->text()
|| vpnInfo.m_remoteAddress != m_localIpEdit->text()) {
isChanged = true;
}
}
return isChanged;
}
bool VpnConfigPage::checkStrongSwanIsChanged(const KyVpnConfig &vpnInfo)
{
bool isChanged = false;
int currentAuthMethod = m_authModeComboBox->currentData().toInt();
if (vpnInfo.m_authMethod != currentAuthMethod) {
isChanged = true;
}
if (currentAuthMethod == KYAUTH_KEY) {
if (vpnInfo.m_caCertificate != m_caCertPathEdit->text()
|| vpnInfo.m_userCertificate != m_userCertPathEdit->text()
|| vpnInfo.m_userKey != m_privateKeyEdit->text()
|| vpnInfo.m_privatePasswd != m_privateKeyPwdEdit->text()
|| vpnInfo.m_privatePasswdPolicy != m_pwdOptionCombox->currentData().toInt()) {
isChanged = true;
}
}else if (currentAuthMethod == KYAUTH_AGENT) {
if (vpnInfo.m_userCertificate != m_userCertPathEdit->text()) {
isChanged = true;
}
} else if (currentAuthMethod == KYAUTH_SMARTCARD) {
if (vpnInfo.m_pinId != m_pinEdit->text()) {
isChanged = true;
}
} else if (currentAuthMethod == KYAUTH_EAP) {
if (vpnInfo.m_userName != m_usernameEdit->text() || vpnInfo.m_userPasswd != m_userPwdEdit->text()) {
isChanged = true;
}
}
return isChanged;
}