2023-04-21 10:03:57 +08:00
|
|
|
/*
|
|
|
|
*
|
|
|
|
* 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/>.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*/
|
2023-04-10 17:38:17 +08:00
|
|
|
#include "vpnaddpage.h"
|
|
|
|
#include <QDebug>
|
|
|
|
#include "vpnconfigpage.h"
|
|
|
|
|
2023-04-11 20:52:01 +08:00
|
|
|
#define VPNADDPAGE_SIZE 520,272
|
|
|
|
#define MAINLAYOUT_MARGINS 24, 16, 24, 24
|
|
|
|
#define MAINLAYOUT_SPACE 24
|
|
|
|
#define NULL_MARGINS 0,0,0,0
|
|
|
|
#define NULL_SPACE 0
|
|
|
|
#define VPNADDPAGE_NAME_MAX_LENGTH 32
|
|
|
|
#define VPNADDPAGE_LABLE_FIXEDWIDTH 112
|
|
|
|
#define VPNADDPAGE_COMBOBOX_FIXEDWIDTH 360
|
|
|
|
#define VPNADDPAGE_INPUTBOX_FIXEDWIDTH 360
|
|
|
|
|
|
|
|
|
2023-04-10 17:38:17 +08:00
|
|
|
vpnAddPage::vpnAddPage(QWidget *parent) : QWidget(parent)
|
|
|
|
{
|
|
|
|
m_vpnConnOperation = new KyVpnConnectOperation(this);
|
|
|
|
initWindow();
|
|
|
|
initUI();
|
|
|
|
initConnection();
|
|
|
|
centerToScreen();
|
|
|
|
}
|
|
|
|
|
|
|
|
void vpnAddPage::centerToScreen()
|
|
|
|
{
|
|
|
|
QDesktopWidget* m = QApplication::desktop();
|
|
|
|
QRect desk_rect = m->screenGeometry(m->screenNumber(QCursor::pos()));
|
|
|
|
int desk_x = desk_rect.width();
|
|
|
|
int desk_y = desk_rect.height();
|
|
|
|
int x = this->width();
|
|
|
|
int y = this->height();
|
|
|
|
this->move(desk_x / 2 - x / 2 + desk_rect.left(), desk_y / 2 - y / 2 + desk_rect.top());
|
|
|
|
}
|
|
|
|
|
|
|
|
void vpnAddPage::initWindow()
|
|
|
|
{
|
|
|
|
this->setFixedSize(VPNADDPAGE_SIZE);
|
|
|
|
this->setWindowTitle(tr("create VPN"));
|
|
|
|
this->setWindowFlag(Qt::WindowMinMaxButtonsHint,false);
|
|
|
|
this->setAttribute(Qt::WA_DeleteOnClose);
|
|
|
|
}
|
|
|
|
|
|
|
|
void vpnAddPage::initUI()
|
|
|
|
{
|
|
|
|
QVBoxLayout *mainLayout = new QVBoxLayout(this);
|
2023-04-11 20:52:01 +08:00
|
|
|
mainLayout->setContentsMargins(MAINLAYOUT_MARGINS);
|
|
|
|
mainLayout->setSpacing(MAINLAYOUT_SPACE);
|
2023-04-10 17:38:17 +08:00
|
|
|
|
|
|
|
initVpnTypeFrame();
|
|
|
|
initVpnNameFrame();
|
|
|
|
initVpnServerFrame();
|
|
|
|
initButtonFrame();
|
|
|
|
onSetConfimBtnEnable();
|
|
|
|
|
|
|
|
mainLayout->addWidget(m_vpnTypeFrame);
|
|
|
|
mainLayout->addWidget(m_vpnNameFrame);
|
|
|
|
mainLayout->addWidget(m_vpnServerFrame);
|
|
|
|
mainLayout->addStretch();
|
|
|
|
mainLayout->addWidget(m_buttonFrame);
|
|
|
|
this->setLayout(mainLayout);
|
|
|
|
}
|
|
|
|
|
|
|
|
void vpnAddPage::initVpnTypeFrame()
|
|
|
|
{
|
|
|
|
m_vpnTypeFrame = new QFrame(this);
|
|
|
|
m_vpnTypeFrame->setFrameShape(QFrame::Shape::NoFrame);
|
|
|
|
|
|
|
|
QHBoxLayout *typeLayout = new QHBoxLayout(m_vpnTypeFrame);
|
2023-04-11 20:52:01 +08:00
|
|
|
typeLayout->setContentsMargins(NULL_MARGINS);
|
|
|
|
typeLayout->setSpacing(NULL_SPACE);
|
2023-04-10 17:38:17 +08:00
|
|
|
|
|
|
|
QLabel *vpnTypeLabel = new QLabel(tr("VPN Type"), this);
|
|
|
|
vpnTypeLabel->setFixedWidth(VPNADDPAGE_LABLE_FIXEDWIDTH);
|
|
|
|
|
|
|
|
m_vpnTypeComboBox = new QComboBox(this);
|
|
|
|
m_vpnTypeComboBox->setInsertPolicy(QComboBox::NoInsert);
|
|
|
|
m_vpnTypeComboBox->setFixedWidth(VPNADDPAGE_COMBOBOX_FIXEDWIDTH);
|
|
|
|
m_vpnTypeComboBox->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed);
|
|
|
|
|
|
|
|
m_vpnTypeComboBox->addItem("L2TP", L2TP);
|
|
|
|
m_vpnTypeComboBox->addItem("open VPN", OPEN_VPN);
|
|
|
|
m_vpnTypeComboBox->addItem("PPTP", PPTP);
|
|
|
|
m_vpnTypeComboBox->addItem("strong-swan", STRONG_SWAN);
|
|
|
|
|
|
|
|
|
|
|
|
typeLayout->addWidget(vpnTypeLabel);
|
|
|
|
typeLayout->addWidget(m_vpnTypeComboBox);
|
|
|
|
m_vpnTypeFrame->setLayout(typeLayout);
|
|
|
|
}
|
|
|
|
|
|
|
|
void vpnAddPage::initVpnNameFrame()
|
|
|
|
{
|
|
|
|
m_vpnNameFrame = new QFrame(this);
|
|
|
|
m_vpnNameFrame->setFrameShape(QFrame::Shape::NoFrame);
|
|
|
|
|
|
|
|
QHBoxLayout *nameLayout = new QHBoxLayout(m_vpnNameFrame);
|
2023-04-11 20:52:01 +08:00
|
|
|
nameLayout->setContentsMargins(NULL_MARGINS);
|
|
|
|
nameLayout->setSpacing(NULL_SPACE);
|
2023-04-10 17:38:17 +08:00
|
|
|
|
|
|
|
QLabel *vpnNameLabel = new QLabel(tr("VPN Name"), this);
|
|
|
|
vpnNameLabel->setFixedWidth(VPNADDPAGE_LABLE_FIXEDWIDTH);
|
|
|
|
|
|
|
|
m_vpnNameLineEdit = new QLineEdit(this);
|
|
|
|
m_vpnNameLineEdit->setFixedWidth(VPNADDPAGE_INPUTBOX_FIXEDWIDTH);
|
|
|
|
m_vpnNameLineEdit->setMaxLength(VPNADDPAGE_NAME_MAX_LENGTH);
|
|
|
|
m_vpnNameLineEdit->setPlaceholderText(tr("Required")); //必填
|
|
|
|
|
|
|
|
nameLayout->addWidget(vpnNameLabel);
|
|
|
|
nameLayout->addWidget(m_vpnNameLineEdit);
|
|
|
|
m_vpnNameFrame->setLayout(nameLayout);
|
|
|
|
}
|
|
|
|
|
|
|
|
void vpnAddPage::initVpnServerFrame()
|
|
|
|
{
|
|
|
|
m_vpnServerFrame = new QFrame(this);
|
|
|
|
m_vpnServerFrame->setFrameShape(QFrame::Shape::NoFrame);
|
|
|
|
|
|
|
|
QHBoxLayout *serverLayout = new QHBoxLayout(m_vpnServerFrame);
|
2023-04-11 20:52:01 +08:00
|
|
|
serverLayout->setContentsMargins(NULL_MARGINS);
|
|
|
|
serverLayout->setSpacing(NULL_SPACE);
|
2023-04-10 17:38:17 +08:00
|
|
|
|
|
|
|
QLabel *vpnServerLabel = new QLabel(tr("VPN Server"), this);
|
|
|
|
vpnServerLabel->setFixedWidth(VPNADDPAGE_LABLE_FIXEDWIDTH);
|
|
|
|
|
|
|
|
m_vpnServerLineEdit = new QLineEdit(this);
|
|
|
|
m_vpnServerLineEdit->setFixedWidth(VPNADDPAGE_INPUTBOX_FIXEDWIDTH);
|
|
|
|
m_vpnServerLineEdit->setPlaceholderText(tr("Required")); //必填
|
|
|
|
|
|
|
|
serverLayout->addWidget(vpnServerLabel);
|
|
|
|
serverLayout->addWidget(m_vpnServerLineEdit);
|
|
|
|
m_vpnServerFrame->setLayout(serverLayout);
|
|
|
|
|
|
|
|
// 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_vpnServerLineEdit->setValidator(ipExpVal);
|
|
|
|
}
|
|
|
|
|
|
|
|
void vpnAddPage::initButtonFrame()
|
|
|
|
{
|
|
|
|
m_buttonFrame = new QFrame(this);
|
|
|
|
|
|
|
|
QHBoxLayout *buttonLayout = new QHBoxLayout(m_buttonFrame);
|
2023-04-11 20:52:01 +08:00
|
|
|
buttonLayout->setContentsMargins(NULL_MARGINS);
|
|
|
|
buttonLayout->setSpacing(NULL_SPACE);
|
2023-04-10 17:38:17 +08:00
|
|
|
|
|
|
|
m_autoConnectBox = new QCheckBox(this);
|
2023-04-11 20:52:01 +08:00
|
|
|
m_autoConnectBox->setText(tr("Auto Connection"));
|
2023-04-10 17:38:17 +08:00
|
|
|
m_confimBtn = new QPushButton(this);
|
|
|
|
m_confimBtn->setText(tr("Confirm"));
|
|
|
|
m_cancelBtn = new QPushButton(this);
|
|
|
|
m_cancelBtn->setText(tr("Cancel"));
|
|
|
|
|
2023-04-11 20:52:01 +08:00
|
|
|
buttonLayout->addWidget(m_autoConnectBox);
|
2023-04-10 17:38:17 +08:00
|
|
|
buttonLayout->addStretch();
|
|
|
|
buttonLayout->addWidget(m_cancelBtn);
|
2023-04-11 20:52:01 +08:00
|
|
|
buttonLayout->addSpacing(16);
|
2023-04-10 17:38:17 +08:00
|
|
|
buttonLayout->addWidget(m_confimBtn);
|
|
|
|
m_buttonFrame->setLayout(buttonLayout);
|
|
|
|
}
|
|
|
|
|
|
|
|
void vpnAddPage::initConnection()
|
|
|
|
{
|
|
|
|
if (m_vpnNameLineEdit != nullptr) {
|
|
|
|
connect(m_vpnNameLineEdit, &QLineEdit::textChanged, this, &vpnAddPage::onSetConfimBtnEnable);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_vpnServerLineEdit != nullptr) {
|
|
|
|
connect(m_vpnServerLineEdit, &QLineEdit::textChanged, this, &vpnAddPage::onSetConfimBtnEnable);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_cancelBtn != nullptr) {
|
|
|
|
connect(m_cancelBtn, &QPushButton::clicked, [&] () {this->close();});
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_confimBtn != nullptr) {
|
|
|
|
connect(m_confimBtn, &QPushButton::clicked, this, &vpnAddPage::onConfimBtnClicked);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool vpnAddPage::checkConfimBtnIsEnabled()
|
|
|
|
{
|
|
|
|
if (m_vpnNameLineEdit->text().isEmpty()) {
|
|
|
|
qDebug() << "ipv4address empty or invalid";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_vpnServerLineEdit->text().isEmpty()) {
|
|
|
|
qDebug() << "ipv4 netMask empty or invalid";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void vpnAddPage::onSetConfimBtnEnable()
|
|
|
|
{
|
|
|
|
m_confimBtn->setEnabled(checkConfimBtnIsEnabled());
|
|
|
|
}
|
|
|
|
|
|
|
|
void vpnAddPage::onConfimBtnClicked()
|
|
|
|
{
|
|
|
|
//新建有线连接
|
|
|
|
qDebug() << "Confirm create vpn connect";
|
|
|
|
if (!createVpnConnect()) {
|
|
|
|
// setNetdetailSomeEnable(true);
|
|
|
|
// return;
|
|
|
|
}
|
|
|
|
close();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool vpnAddPage::createVpnConnect()
|
|
|
|
{
|
|
|
|
KyVpnConfig vpnSetting;
|
|
|
|
QString connectName = m_vpnNameLineEdit->text();
|
|
|
|
vpnSetting.m_gateway = m_vpnServerLineEdit->text();
|
|
|
|
vpnSetting.setConnectName(connectName);
|
|
|
|
vpnSetting.m_vpnName = connectName;
|
|
|
|
vpnSetting.m_isAutoConnect = m_autoConnectBox->isChecked();
|
|
|
|
vpnSetting.m_vpnType = (KyVpnType)m_vpnTypeComboBox->currentData().toInt();
|
|
|
|
|
|
|
|
m_vpnConnOperation->createVpnConnect(vpnSetting);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
vpnAddPage::~vpnAddPage()
|
|
|
|
{
|
|
|
|
Q_EMIT this->closed();
|
|
|
|
}
|
2023-04-11 20:52:01 +08:00
|
|
|
|
|
|
|
void vpnAddPage::paintEvent(QPaintEvent *event)
|
|
|
|
{
|
|
|
|
QPalette pal = qApp->palette();
|
|
|
|
QPainter painter(this);
|
|
|
|
painter.setBrush(pal.color(QPalette::Base));
|
|
|
|
painter.drawRect(this->rect());
|
|
|
|
painter.fillRect(rect(), QBrush(pal.color(QPalette::Base)));
|
|
|
|
|
|
|
|
return QWidget::paintEvent(event);
|
|
|
|
}
|