kylin-nm/plugins/proxy/proxy.cpp

1397 lines
49 KiB
C++
Raw Normal View History

2022-09-24 17:08:28 +08:00
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* Copyright (C) 2019 Tianjin KYLIN Information Technology 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 2 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, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "proxy.h"
#include "aptproxydialog.h"
#include "aptinfo.h"
//#include "utils.h"
#include <QDebug>
#include <QRegExpValidator>
#include <QApplication>
#include <QTranslator>
#define PROXY_SCHEMA "org.gnome.system.proxy"
#define PROXY_MODE_KEY "mode"
#define PROXY_AUTOCONFIG_URL_KEY "autoconfig-url"
#define IGNORE_HOSTS_KEY "ignore-hosts"
#define HTTP_PROXY_SCHEMA "org.gnome.system.proxy.http"
#define HTTP_USE_AUTH_KEY "use-authentication"
#define HTTP_AUTH_USER_KEY "authentication-user"
#define HTTP_AUTH_PASSWD_KEY "authentication-password"
#define HTTPS_PROXY_SCHEMA "org.gnome.system.proxy.https"
#define FTP_PROXY_SCHEMA "org.gnome.system.proxy.ftp"
#define SOCKS_PROXY_SCHEMA "org.gnome.system.proxy.socks"
#define PROXY_HOST_KEY "host"
#define PROXY_PORT_KEY "port"
2023-04-06 14:09:59 +08:00
#define THEME_SCHAME "org.ukui.style"
2022-09-24 17:08:28 +08:00
#define FRAME_LAYOUT_MARGINS 16,0,16,0
#define FRAME_LAYOUT_SPACING 8
#define LABEL_WIDTH 136
2023-04-06 14:09:59 +08:00
#define LINE_EDIT_HEIGHT 36
2022-09-24 17:08:28 +08:00
Proxy::Proxy() : mFirstLoad(true)
{
qDBusRegisterMetaType<QMap<QString, QStringList>>();
qDBusRegisterMetaType<QStringList>();
QTranslator* translator = new QTranslator(this);
translator->load("/usr/share/kylin-nm/proxy/" + QLocale::system().name());
QApplication::installTranslator(translator);
pluginName = tr("Proxy");
pluginType = NETWORK;
}
Proxy::~Proxy()
{
if (!mFirstLoad) {
2023-04-06 14:09:59 +08:00
plugin_leave();
delete m_appProxyDbus;
2022-09-24 17:08:28 +08:00
}
}
QString Proxy::plugini18nName() {
return pluginName;
}
int Proxy::pluginTypes() {
return pluginType;
}
QWidget *Proxy::pluginUi() {
if (mFirstLoad) {
mFirstLoad = false;
pluginWidget = new QWidget;
pluginWidget->setAttribute(Qt::WA_DeleteOnClose);
initUi(pluginWidget);
retranslateUi();
mfileWatch_1 = new QFileSystemWatcher(this);
mfileWatch_2 = new QFileSystemWatcher(this);
QString dir_1("/etc/apt/apt.conf.d");
QString dir_2("/etc/profile.d");
mfileWatch_1->addPath(dir_1);
mfileWatch_2->addPath(dir_2);
const QByteArray id(PROXY_SCHEMA);
const QByteArray idd(HTTP_PROXY_SCHEMA);
const QByteArray iddd(HTTPS_PROXY_SCHEMA);
const QByteArray iid(FTP_PROXY_SCHEMA);
const QByteArray iiid(SOCKS_PROXY_SCHEMA);
const QByteArray iVd(APT_PROXY_SCHEMA);
initSearchText();
setupComponent();
if (QGSettings::isSchemaInstalled(id) && QGSettings::isSchemaInstalled(idd) &&
QGSettings::isSchemaInstalled(iddd) && QGSettings::isSchemaInstalled(iid) &&
QGSettings::isSchemaInstalled(iiid) && QGSettings::isSchemaInstalled(iVd)){
isExistSettings = true;
proxysettings = new QGSettings(id,QByteArray(),this);
httpsettings = new QGSettings(idd,QByteArray(),this);
securesettings = new QGSettings(iddd,QByteArray(),this);
ftpsettings = new QGSettings(iid,QByteArray(),this);
sockssettings = new QGSettings(iiid,QByteArray(),this);
setupConnect();
initProxyModeStatus();
initAutoProxyStatus();
initManualProxyStatus();
initIgnoreHostStatus();
initDbus();
initAppProxyStatus();
} else {
qCritical() << "Xml needed by Proxy is not installed";
}
}
return pluginWidget;
}
void Proxy::plugin_leave()
{
if (isExistSettings) {
if (proxysettings->get(PROXY_MODE_KEY) == "manual") {
if ((httpsettings->get(PROXY_HOST_KEY).toString().isEmpty() || httpsettings->get(PROXY_PORT_KEY).toInt() == 0)
&& (securesettings->get(PROXY_HOST_KEY).toString().isEmpty() || securesettings->get(PROXY_PORT_KEY).toInt() == 0)
&& (ftpsettings->get(PROXY_HOST_KEY).toString().isEmpty() || ftpsettings->get(PROXY_PORT_KEY).toInt() == 0)
&& (sockssettings->get(PROXY_HOST_KEY).toString().isEmpty() || sockssettings->get(PROXY_PORT_KEY).toInt() == 0)) {
proxysettings->set(PROXY_MODE_KEY,"auto");
mManualBtn->setChecked(false);
mAutoBtn->setChecked(true);
_setSensitivity();
}
}
}
}
const QString Proxy::name() const {
return QStringLiteral("Proxy");
}
bool Proxy::isShowOnHomePage() const
{
return true;
}
QIcon Proxy::icon() const
{
return QIcon::fromTheme("ukui-network-agent-symbolic");
}
2023-04-06 14:09:59 +08:00
QString Proxy::translationPath() const
{
return "/usr/share/kylin-nm/proxy/%1.ts";
}
2022-09-24 17:08:28 +08:00
bool Proxy::isEnable() const
{
return true;
}
void Proxy::initUi(QWidget *widget)
{
QVBoxLayout *mverticalLayout = new QVBoxLayout(widget);
mverticalLayout->setSpacing(8);
mverticalLayout->setContentsMargins(0, 0, 0, 0);
mProxyBtnGroup = new QButtonGroup(this);
mProxyBtnGroup->setExclusive (false); // 防止互斥
mTitleLabel = new TitleLabel(widget);
mProxyFrame = new QFrame(widget);
mProxyFrame->setMinimumSize(QSize(550, 0));
mProxyFrame->setMaximumSize(QSize(16777215, 16777215));
mProxyFrame->setFrameShape(QFrame::Box);
QVBoxLayout *Lyt = new QVBoxLayout(mProxyFrame);
Lyt->setContentsMargins(0, 0, 0, 0);
Lyt->setSpacing(0);
mEnableFrame = new QFrame(mProxyFrame);
setFrame_Noframe(mEnableFrame);
QHBoxLayout *enableLyt = new QHBoxLayout(mEnableFrame);
enableLyt->setContentsMargins(16, 0, 16, 0);
QLabel *enableLabel = new QLabel(tr("Start using"), mEnableFrame);
mEnableBtn = new KSwitchButton(mEnableFrame);
enableLyt->addWidget(enableLabel);
enableLyt->addStretch();
enableLyt->addWidget(mEnableBtn);
line_8 = setLine(mProxyFrame);
mSelectFrame = new QFrame(mProxyFrame);
setFrame_Noframe(mSelectFrame);
QHBoxLayout *selectLyt = new QHBoxLayout(mSelectFrame);
selectLyt->setContentsMargins(16, 0, 16, 0);
selectLyt->setSpacing(4);
QLabel *selectLabel = new QLabel(tr("Proxy mode"), mSelectFrame);
selectLabel->setFixedWidth(148);
mAutoBtn = new QRadioButton(mSelectFrame);
mProxyBtnGroup->addButton(mAutoBtn);
QLabel *autoLabel = new QLabel(tr("Auto"), mSelectFrame);
mManualBtn = new QRadioButton(mSelectFrame);
mProxyBtnGroup->addButton(mManualBtn);
QLabel *manualLabel = new QLabel(tr("Manual"), mSelectFrame);
selectLyt->addWidget(selectLabel);
selectLyt->addWidget(mAutoBtn);
selectLyt->addWidget(autoLabel);
selectLyt->addSpacing(100);
selectLyt->addWidget(mManualBtn);
selectLyt->addWidget(manualLabel);
selectLyt->addStretch();
line_1 = setLine(mProxyFrame);
mUrlFrame = new QFrame(mProxyFrame);
setFrame_Noframe(mUrlFrame);
QHBoxLayout *mUrlLayout = new QHBoxLayout(mUrlFrame);
mUrlLayout->setContentsMargins(16, 0, 16, 0);
mUrlLayout->setSpacing(8);
mUrlLabel = new QLabel(mUrlFrame);
mUrlLabel->setFixedWidth(136);
mUrlLineEdit = new QLineEdit(mUrlFrame);
2023-04-06 14:09:59 +08:00
mUrlLineEdit->setFixedHeight(36);
2022-09-24 17:08:28 +08:00
mUrlLayout->addWidget(mUrlLabel);
mUrlLayout->addWidget(mUrlLineEdit);
line_2 = setLine(mProxyFrame);
mHTTPFrame = new QFrame(mProxyFrame);
setFrame_Noframe(mHTTPFrame);
QHBoxLayout *mHTTPLayout_1 = new QHBoxLayout(mHTTPFrame);
mHTTPLayout_1->setSpacing(8);
mHTTPLayout_1->setContentsMargins(16, 0, 16, 0);
mHTTPLabel = new QLabel(mHTTPFrame);
mHTTPLabel->setFixedWidth(136);
mHTTPPortLabel = new QLabel(mHTTPFrame);
mHTTPPortLabel->setFixedWidth(100);
mHTTPPortLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
mHTTPLineEdit_1 = new QLineEdit(mHTTPFrame);
mHTTPLineEdit_1->resize(300, 36);
mHTTPLineEdit_2 = new QLineEdit(mHTTPFrame);
2023-04-06 14:09:59 +08:00
mHTTPLineEdit_2->setFixedHeight(36);
2022-09-24 17:08:28 +08:00
mHTTPLineEdit_2->setValidator(new QRegExpValidator(QRegExp("[0-9]*") , this));
mHTTPLayout_1->addWidget(mHTTPLabel);
mHTTPLayout_1->addWidget(mHTTPLineEdit_1);
mHTTPLayout_1->addWidget(mHTTPPortLabel);
mHTTPLayout_1->addWidget(mHTTPLineEdit_2);
line_3 = setLine(mProxyFrame);
mHTTPSFrame = new QFrame(mProxyFrame);
setFrame_Noframe(mHTTPSFrame);
QHBoxLayout *mHTTPSLayout = new QHBoxLayout(mHTTPSFrame);
mHTTPSLayout->setSpacing(8);
mHTTPSLayout->setContentsMargins(16, 0, 16, 0);
mHTTPSLabel = new QLabel(mHTTPSFrame);
mHTTPSLabel->setFixedWidth(136);
mHTTPSPortLabel = new QLabel(mHTTPSFrame);
mHTTPSPortLabel->setFixedWidth(100);
mHTTPSPortLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
mHTTPSLineEdit_1 = new QLineEdit(mHTTPSFrame);
mHTTPSLineEdit_1->resize(300, 36);
mHTTPSLineEdit_2 = new QLineEdit(mHTTPSFrame);
2023-04-06 14:09:59 +08:00
mHTTPSLineEdit_2->setFixedHeight(36);
2022-09-24 17:08:28 +08:00
mHTTPSLineEdit_2->setValidator(new QRegExpValidator(QRegExp("[0-9]*") , this));
mHTTPSLayout->addWidget(mHTTPSLabel);
mHTTPSLayout->addWidget(mHTTPSLineEdit_1);
mHTTPSLayout->addWidget(mHTTPSPortLabel);
mHTTPSLayout->addWidget(mHTTPSLineEdit_2);
line_4 = setLine(mProxyFrame);
mFTPFrame = new QFrame(mProxyFrame);
setFrame_Noframe(mFTPFrame);
QHBoxLayout *mFTPLayout = new QHBoxLayout(mFTPFrame);
mFTPLayout->setSpacing(8);
mFTPLayout->setContentsMargins(16, 0, 16, 0);
mFTPLabel = new QLabel(mFTPFrame);
mFTPLabel->setFixedWidth(136);
mFTPPortLabel = new QLabel(mFTPFrame);
mFTPPortLabel->setFixedWidth(100);
mFTPPortLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
mFTPLineEdit_1 = new QLineEdit(mFTPFrame);
mFTPLineEdit_1->resize(300, 36);
mFTPLineEdit_2 = new QLineEdit(mFTPFrame);
2023-04-06 14:09:59 +08:00
mFTPLineEdit_2->setFixedHeight(36);
2022-09-24 17:08:28 +08:00
mFTPLineEdit_2->setValidator(new QRegExpValidator(QRegExp("[0-9]*") , this));
mFTPLayout->addWidget(mFTPLabel);
mFTPLayout->addWidget(mFTPLineEdit_1);
mFTPLayout->addWidget(mFTPPortLabel);
mFTPLayout->addWidget(mFTPLineEdit_2);
line_5 = setLine(mProxyFrame);
mSOCKSFrame = new QFrame(mProxyFrame);
setFrame_Noframe(mSOCKSFrame);
QHBoxLayout *mSOCKSLayout = new QHBoxLayout(mSOCKSFrame);
mSOCKSLayout->setSpacing(8);
mSOCKSLayout->setContentsMargins(16, 0, 16, 0);
mSOCKSLabel = new QLabel(mSOCKSFrame);
mSOCKSLabel->setFixedWidth(136);
mSOCKSPortLabel = new QLabel(mSOCKSFrame);
mSOCKSPortLabel->setFixedWidth(100);
mSOCKSPortLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
mSOCKSLineEdit_1 = new QLineEdit(mSOCKSFrame);
mSOCKSLineEdit_1->resize(300, 36);
mSOCKSLineEdit_2 = new QLineEdit(mSOCKSFrame);
2023-04-06 14:09:59 +08:00
mSOCKSLineEdit_2->setFixedHeight(36);
2022-09-24 17:08:28 +08:00
mSOCKSLineEdit_2->setValidator(new QRegExpValidator(QRegExp("[0-9]*") , this));
mSOCKSLayout->addWidget(mSOCKSLabel);
mSOCKSLayout->addWidget(mSOCKSLineEdit_1);
mSOCKSLayout->addWidget(mSOCKSPortLabel);
mSOCKSLayout->addWidget(mSOCKSLineEdit_2);
line_6 = setLine(mProxyFrame);
mIgnoreFrame = new QFrame(mProxyFrame);
mIgnoreFrame->setMinimumSize(QSize(550, 0));
mIgnoreFrame->setMaximumSize(QSize(16777215, 16777215));
mIgnoreFrame->setFrameShape(QFrame::NoFrame);
QVBoxLayout *mIgnoreLayout = new QVBoxLayout(mIgnoreFrame);
mIgnoreLayout->setSpacing(10);
mIgnoreLayout->setContentsMargins(16, 0, 16, 24);
mIgnoreLabel = new QLabel(mIgnoreFrame);
mIgnoreLabel->setFixedHeight(36);
mIgnoreLineEdit = new QTextEdit(mIgnoreFrame);
mIgnoreLineEdit->setFixedHeight(120);
mIgnoreLineEdit->setStyleSheet("border-radius:6px;background-color: palette(button)");
mIgnoreLayout->addWidget(mIgnoreLabel);
mIgnoreLayout->addWidget(mIgnoreLineEdit);
Lyt->addWidget(mEnableFrame);
Lyt->addWidget(line_8);
Lyt->addWidget(mSelectFrame);
Lyt->addWidget(line_1);
Lyt->addWidget(mUrlFrame);
Lyt->addWidget(line_2);
Lyt->addWidget(mHTTPFrame);
Lyt->addWidget(line_3);
Lyt->addWidget(mHTTPSFrame);
Lyt->addWidget(line_4);
Lyt->addWidget(mFTPFrame);
Lyt->addWidget(line_5);
Lyt->addWidget(mSOCKSFrame);
Lyt->addWidget(line_6);
Lyt->addWidget(mIgnoreFrame);
//应用代理模块
m_appProxyLabel = new TitleLabel(widget);
m_appProxyLabel->setText(tr("Application Proxy")); //应用代理
setAppProxyFrameUi(widget);
setAppListFrameUi(widget);
//APT代理模块
mAptProxyLabel = new TitleLabel(widget);
mAPTFrame = new QFrame(widget);
mAPTFrame->setMinimumSize(QSize(550, 0));
mAPTFrame->setMaximumSize(QSize(16777215, 16777215));
mAPTFrame->setFrameShape(QFrame::Box);
QVBoxLayout *AptLayout = new QVBoxLayout(mAPTFrame);
AptLayout->setContentsMargins(0, 0, 0, 0);
AptLayout->setSpacing(0);
mAPTFrame_1 = new QFrame(mAPTFrame);
setFrame_Noframe(mAPTFrame_1);
QHBoxLayout *mAptLayout_1 = new QHBoxLayout(mAPTFrame_1);
mAptLayout_1->setContentsMargins(16, 0, 16, 0);
mAptLayout_1->setSpacing(8);
mAptLabel = new QLabel(mAPTFrame_1);
mAptLabel->setFixedWidth(200);
mAptBtn = new KSwitchButton(mAPTFrame_1);
mAptLayout_1->addWidget(mAptLabel);
mAptLayout_1->addStretch();
mAptLayout_1->addWidget(mAptBtn);
mAPTFrame_2 = new QFrame(mAPTFrame);
setFrame_Noframe(mAPTFrame_2);
QHBoxLayout *mAptLayout_2 = new QHBoxLayout(mAPTFrame_2);
mAptLayout_2->setContentsMargins(16, 0, 16, 0);
mAptLayout_2->setSpacing(8);
mAPTHostLabel_1 = new QLabel(mAPTFrame_2);
mAPTHostLabel_2 = new QLabel(mAPTFrame_2);
mAPTPortLabel_1 = new QLabel(mAPTFrame_2);
mAPTPortLabel_2 = new QLabel(mAPTFrame_2);
mEditBtn = new QPushButton(mAPTFrame_2);
mEditBtn->setFixedWidth(80);
mAptLayout_2->addWidget(mAPTHostLabel_1);
mAptLayout_2->addWidget(mAPTHostLabel_2);
mAptLayout_2->addSpacing(100);
mAptLayout_2->addWidget(mAPTPortLabel_1);
mAptLayout_2->addWidget(mAPTPortLabel_2);
mAptLayout_2->addStretch();
mAptLayout_2->addWidget(mEditBtn,Qt::AlignRight);
line_7 = setLine(mAPTFrame);
AptLayout->addWidget(mAPTFrame_1);
AptLayout->addWidget(line_7);
AptLayout->addWidget(mAPTFrame_2);
mverticalLayout->addWidget(mTitleLabel);
mverticalLayout->addWidget(mProxyFrame);
mverticalLayout->addSpacing(32);
mverticalLayout->addWidget(m_appProxyLabel);
mverticalLayout->addWidget(m_appProxyFrame);
mverticalLayout->addSpacing(4);
mverticalLayout->addWidget(m_appListFrame);
mverticalLayout->addSpacing(32);
mverticalLayout->addWidget(mAptProxyLabel);
mverticalLayout->addWidget(mAPTFrame);
mverticalLayout->addStretch();
}
void Proxy::initSearchText() {
}
void Proxy::retranslateUi()
{
mTitleLabel->setText(tr("System Proxy"));
//~ contents_path /Proxy/Auto url
mUrlLabel->setText(tr("Auto url"));
//~ contents_path /Proxy/Http Proxy
mHTTPLabel->setText(tr("Http Proxy"));
//~ contents_path /Proxy/Https Proxy
mHTTPSLabel->setText(tr("Https Proxy"));
//~ contents_path /Proxy/Ftp Proxy
mFTPLabel->setText(tr("Ftp Proxy"));
//~ contents_path /Proxy/Socks Proxy
mSOCKSLabel->setText(tr("Socks Proxy"));
mHTTPPortLabel->setText(tr("Port"));
mHTTPSPortLabel->setText(tr("Port"));
mFTPPortLabel->setText(tr("Port"));
mSOCKSPortLabel->setText(tr("Port"));
mIgnoreLabel->setText(tr("List of ignored hosts. more than one entry, please separate with english semicolon(;)"));
//~ contents_path /Proxy/Apt Proxy
mAptProxyLabel->setText(tr("Apt Proxy"));
mAptLabel->setText(tr("Open"));
mAPTHostLabel_1->setText(tr("Server Address : "));
mAPTPortLabel_1->setText(tr("Port : "));
mEditBtn->setText(tr("Edit"));
}
void Proxy::setupComponent(){
//QLineEdit 设置数据
GSData httpHostData;
httpHostData.schema = HTTP_PROXY_SCHEMA;
httpHostData.key = PROXY_HOST_KEY;
mHTTPLineEdit_1->setProperty("gData", QVariant::fromValue(httpHostData));
GSData httpsHostData;
httpsHostData.schema = HTTPS_PROXY_SCHEMA;
httpsHostData.key = PROXY_HOST_KEY;
mHTTPSLineEdit_1->setProperty("gData", QVariant::fromValue(httpsHostData));
GSData ftpHostData;
ftpHostData.schema = FTP_PROXY_SCHEMA;
ftpHostData.key = PROXY_HOST_KEY;
mFTPLineEdit_1->setProperty("gData", QVariant::fromValue(ftpHostData));
GSData socksHostData;
socksHostData.schema = SOCKS_PROXY_SCHEMA;
socksHostData.key = PROXY_HOST_KEY;
mSOCKSLineEdit_1->setProperty("gData", QVariant::fromValue(socksHostData));
GSData httpPortData;
httpPortData.schema = HTTP_PROXY_SCHEMA;
httpPortData.key = PROXY_PORT_KEY;
mHTTPLineEdit_2->setProperty("gData", QVariant::fromValue(httpPortData));
GSData httpsPortData;
httpsPortData.schema = HTTPS_PROXY_SCHEMA;
httpsPortData.key = PROXY_PORT_KEY;
mHTTPSLineEdit_2->setProperty("gData", QVariant::fromValue(httpsPortData));
GSData ftpPortData;
ftpPortData.schema = FTP_PROXY_SCHEMA;
ftpPortData.key = PROXY_PORT_KEY;
mFTPLineEdit_2->setProperty("gData", QVariant::fromValue(ftpPortData));
GSData socksPortData;
socksPortData.schema = SOCKS_PROXY_SCHEMA;
socksPortData.key = PROXY_PORT_KEY;
mSOCKSLineEdit_2->setProperty("gData", QVariant::fromValue(socksPortData));
}
void Proxy::setupConnect(){
connect(mEnableBtn, &KSwitchButton::stateChanged, this ,[=](bool checked) {
mSelectFrame->setVisible(checked);
line_8->setVisible(checked);
mAutoBtn->setChecked(checked);
mManualBtn->setChecked(false);
qDebug()<<mManualBtn->isChecked();
proxysettings->set(PROXY_MODE_KEY, checked ? "auto" : "none");
_setSensitivity();
});
connect(mEditBtn ,&QPushButton::clicked, this, &Proxy::setAptProxySlot);
connect(mProxyBtnGroup, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked), [=](QAbstractButton * eBtn){
if (eBtn == mAutoBtn) {
mManualBtn->setChecked(false);
proxysettings->set(PROXY_MODE_KEY,"auto");
} else if (eBtn == mManualBtn){
mAutoBtn->setChecked(false);
proxysettings->set(PROXY_MODE_KEY,"manual");
}
_setSensitivity();
});
connect(mUrlLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){proxysettings->set(PROXY_AUTOCONFIG_URL_KEY, QVariant(txt));});
connect(mHTTPLineEdit_1, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(mHTTPSLineEdit_1, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(mFTPLineEdit_1, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(mSOCKSLineEdit_1, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(mHTTPLineEdit_2, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(mHTTPSLineEdit_2, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(mFTPLineEdit_2, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(mSOCKSLineEdit_2, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(mIgnoreLineEdit, &QTextEdit::textChanged, this, [=](){
QString text = mIgnoreLineEdit->toPlainText();
QStringList hostStringList = text.split(";");
proxysettings->set(IGNORE_HOSTS_KEY, QVariant(hostStringList));
});
connect(mAptBtn , &KSwitchButton::stateChanged, this ,[=](bool checked){
if (checked) {
emit mEditBtn->click();
} else { // 关闭APT代理删除对应的配置文件
if (QString(qgetenv("http_proxy").data()).isEmpty()) {
line_7->hide();
mAPTFrame_2->hide();
setAptProxy("" ,0 ,false);
} else {
QMessageBox *mReboot = new QMessageBox(pluginWidget->topLevelWidget());
mReboot->setIcon(QMessageBox::Warning);
mReboot->setText(tr("The apt proxy has been turned off and needs to be restarted to take effect"));
QPushButton *laterbtn = mReboot->addButton(tr("Reboot Later"), QMessageBox::RejectRole);
QPushButton *nowbtn = mReboot->addButton(tr("Reboot Now"), QMessageBox::AcceptRole);
mReboot->exec();
if (mReboot->clickedButton() == nowbtn) { //选择了立即重启,一秒后系统会重启
line_7->hide();
mAPTFrame_2->hide();
setAptProxy("" ,0 ,false);
sleep(1);
reboot();
} else { //选择了稍后重启,删掉对应文件,但删不了已生效的环境变量
line_7->hide();
mAPTFrame_2->hide();
setAptProxy("" ,0 ,false);
}
}
}
});
}
void Proxy::initProxyModeStatus(){
int mode = _getCurrentProxyMode();
QHash<QString, QVariant> mAptinfo = getAptProxy();
mAutoBtn->blockSignals(true);
mManualBtn->blockSignals(true);
mAptBtn->blockSignals(true);
mEnableBtn->blockSignals(true);
if (mode == AUTO){
mEnableBtn->setChecked(true);
mAutoBtn->setChecked(true);
} else if (mode == MANUAL){
mEnableBtn->setChecked(true);
mManualBtn->setChecked(true);
} else{
mEnableBtn->setChecked(false);
mAutoBtn->setChecked(false);
mManualBtn->setChecked(false);
mSelectFrame->setVisible(false);
line_8->setVisible(false);
}
if (QFile::exists("/etc/apt/ota_version")) {
mAPTFrame->hide();
mAptProxyLabel->hide();
} else {
if (mAptinfo["open"].toBool()) {
mAptBtn->setChecked(true);
mAPTHostLabel_2->setText(mAptinfo["ip"].toString());
mAPTPortLabel_2->setText(mAptinfo["port"].toString());
} else {
mAptBtn->setChecked(false);
line_7->setVisible(false);
mAPTFrame_2->setVisible(false);
}
}
mAutoBtn->blockSignals(false);
mManualBtn->blockSignals(false);
mAptBtn->blockSignals(false);
mEnableBtn->blockSignals(false);
_setSensitivity();
}
void Proxy::initAutoProxyStatus(){
mUrlLineEdit->blockSignals(true);
//设置当前url
QString urlString = proxysettings->get(PROXY_AUTOCONFIG_URL_KEY).toString();
mUrlLineEdit->setText(urlString);
mUrlLineEdit->blockSignals(false);
}
void Proxy::initManualProxyStatus(){
//信号阻塞
mHTTPLineEdit_1->blockSignals(true);
mHTTPSLineEdit_1->blockSignals(true);
mFTPLineEdit_1->blockSignals(true);
mSOCKSLineEdit_1->blockSignals(true);
mHTTPLineEdit_2->blockSignals(true);
mHTTPSLineEdit_2->blockSignals(true);
mFTPLineEdit_2->blockSignals(true);
mSOCKSLineEdit_2->blockSignals(true);
//HTTP
QString httphost = httpsettings->get(PROXY_HOST_KEY).toString();
mHTTPLineEdit_1->setText(httphost);
int httpport = httpsettings->get(PROXY_PORT_KEY).toInt();
mHTTPLineEdit_2->setText(QString::number(httpport));
//HTTPS
QString httpshost = securesettings->get(PROXY_HOST_KEY).toString();
mHTTPSLineEdit_1->setText(httpshost);
int httpsport = securesettings->get(PROXY_PORT_KEY).toInt();
mHTTPSLineEdit_2->setText(QString::number(httpsport));
//FTP
QString ftphost = ftpsettings->get(PROXY_HOST_KEY).toString();
mFTPLineEdit_1->setText(ftphost);
int ftppost = ftpsettings->get(PROXY_PORT_KEY).toInt();
mFTPLineEdit_2->setText(QString::number(ftppost));
//SOCKS
QString sockshost = sockssettings->get(PROXY_HOST_KEY).toString();
mSOCKSLineEdit_1->setText(sockshost);
int socksport = sockssettings->get(PROXY_PORT_KEY).toInt();
mSOCKSLineEdit_2->setText(QString::number(socksport));
//解除信号阻塞
mHTTPLineEdit_1->blockSignals(false);
mHTTPSLineEdit_1->blockSignals(false);
mFTPLineEdit_1->blockSignals(false);
mSOCKSLineEdit_1->blockSignals(false);
mHTTPLineEdit_2->blockSignals(false);
mHTTPSLineEdit_2->blockSignals(false);
mFTPLineEdit_2->blockSignals(false);
mSOCKSLineEdit_2->blockSignals(false);
}
void Proxy::initIgnoreHostStatus(){
mIgnoreLineEdit->blockSignals(true);
//设置当前ignore host
QStringList ignorehost = proxysettings->get(IGNORE_HOSTS_KEY).toStringList();
mIgnoreLineEdit->setPlainText(ignorehost.join(";"));
mIgnoreLineEdit->blockSignals(false);
}
void Proxy::initDbus()
{
m_appProxyDbus = new QDBusInterface("org.ukui.SettingsDaemon",
"/org/ukui/SettingsDaemon/AppProxy",
"org.ukui.SettingsDaemon.AppProxy",
QDBusConnection::sessionBus());
2023-04-06 14:09:59 +08:00
if(!m_appProxyDbus->isValid()) {
qWarning() << qPrintable(QDBusConnection::sessionBus().lastError().message());
}
2022-09-24 17:08:28 +08:00
}
void Proxy::initAppProxyStatus()
{
bool state = getAppProxyState();
m_appEnableBtn->setChecked(state);
onappProxyEnableChanged(state);
appProxyInfoPadding();
// m_cancelBtn->setEnabled(false);
// m_saveBtn->setEnabled(false);
appListPadding();
}
int Proxy::_getCurrentProxyMode(){
GSettings * proxygsettings;
proxygsettings = g_settings_new(PROXY_SCHEMA);
int mode = g_settings_get_enum(proxygsettings, PROXY_MODE_KEY);
g_object_unref(proxygsettings);
return mode;
}
void Proxy::_setSensitivity(){
//自动配置代理界面敏感性
bool autoChecked = mAutoBtn->isChecked();
mUrlFrame->setVisible(autoChecked);
line_1->setVisible(autoChecked);
//手动配置代理界面敏感性
bool manualChecked = mManualBtn->isChecked();
mHTTPFrame->setVisible(manualChecked);
mHTTPSFrame->setVisible(manualChecked);
mFTPFrame->setVisible(manualChecked);
mSOCKSFrame->setVisible(manualChecked);
mIgnoreFrame->setVisible(manualChecked);
line_2->setVisible(manualChecked);
line_3->setVisible(manualChecked);
line_4->setVisible(manualChecked);
line_5->setVisible(manualChecked);
line_6->setVisible(manualChecked);
}
void Proxy::setAptProxy(QString host, QString port, bool status)
{
QDBusInterface *mAptproxyDbus = new QDBusInterface("com.control.center.qt.systemdbus",
"/",
"com.control.center.interface",
QDBusConnection::systemBus());
2023-04-06 14:09:59 +08:00
if (mAptproxyDbus->isValid()) {
2022-09-24 17:08:28 +08:00
QDBusReply<bool> reply = mAptproxyDbus->call("setaptproxy", host, port , status);
2023-04-06 14:09:59 +08:00
}
delete mAptproxyDbus;
mAptproxyDbus = nullptr;
2022-09-24 17:08:28 +08:00
}
QHash<QString, QVariant> Proxy::getAptProxy()
{
QHash<QString, QVariant> mAptInfo;
QDBusInterface *mAptproxyDbus = new QDBusInterface("com.control.center.qt.systemdbus",
"/",
"com.control.center.interface",
QDBusConnection::systemBus());
if (mAptproxyDbus->isValid()) {
QDBusMessage result = mAptproxyDbus->call("getaptproxy");
QList<QVariant> outArgs = result.arguments();
QVariant first = outArgs.at(0);
QDBusArgument dbvFirst = first.value<QDBusArgument>();
QVariant vFirst = dbvFirst.asVariant();
const QDBusArgument &dbusArgs = vFirst.value<QDBusArgument>();
QVector<AptInfo> aptinfo;
dbusArgs.beginArray();
while (!dbusArgs.atEnd()) {
AptInfo info;
dbusArgs >> info;
aptinfo.push_back(info);
}
dbusArgs.endArray();
for (AptInfo it : aptinfo) {
mAptInfo.insert(it.arg, it.out.variant());
}
}
2023-04-06 14:09:59 +08:00
delete mAptproxyDbus;
mAptproxyDbus = nullptr;
2022-09-24 17:08:28 +08:00
return mAptInfo;
}
void Proxy::setAptInfo()
{
QMessageBox *mReboot = new QMessageBox(pluginWidget->topLevelWidget());
mReboot->setIcon(QMessageBox::Warning);
mReboot->setText(tr("The system needs to be restarted to set the Apt proxy, whether to reboot"));
QPushButton *laterbtn = mReboot->addButton(tr("Reboot Later"), QMessageBox::RejectRole);
QPushButton *nowbtn = mReboot->addButton(tr("Reboot Now"), QMessageBox::AcceptRole);
mReboot->exec();
if (mReboot->clickedButton() == nowbtn) { //选择了立即重启,一秒后系统会重启
sleep(1);
reboot();
} else { //选择了稍后重启或点击了关闭按钮,配置文件已写入,但是/etc/profile.d目录下新增的脚本文件未执行
line_7->show();
mAPTFrame_2->show();
mAPTHostLabel_2->setText(getAptProxy()["ip"].toString());
mAPTPortLabel_2->setText(getAptProxy()["port"].toString());
}
}
void Proxy::reboot()
{
QDBusInterface *rebootDbus = new QDBusInterface("org.gnome.SessionManager",
"/org/gnome/SessionManager",
"org.gnome.SessionManager",
QDBusConnection::sessionBus());
2023-04-06 14:09:59 +08:00
if (rebootDbus->isValid()) {
rebootDbus->call("reboot");
}
2022-09-24 17:08:28 +08:00
delete rebootDbus;
rebootDbus = nullptr;
}
void Proxy::setFrame_Noframe(QFrame *frame)
{
frame->setMinimumSize(QSize(550, 60));
frame->setMaximumSize(QSize(16777215, 60));
frame->setFrameShape(QFrame::NoFrame);
}
QFrame *Proxy::setLine(QFrame *frame)
{
QFrame *line = new QFrame(frame);
line->setMinimumSize(QSize(0, 1));
line->setMaximumSize(QSize(16777215, 1));
line->setLineWidth(0);
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
return line;
}
bool Proxy::getAppProxyState()
{
bool state = true;
2023-04-06 14:09:59 +08:00
if(m_appProxyDbus == nullptr || !m_appProxyDbus->isValid()) {
2022-09-24 17:08:28 +08:00
qWarning ()<< "init AppProxy dbus error";
2023-04-06 14:09:59 +08:00
return false;
2022-09-24 17:08:28 +08:00
}
//获取应用代理开启状态
qDebug() << "call QDBusInterface getProxyStateDbus";
2022-09-26 17:31:00 +08:00
QDBusReply<bool> reply = m_appProxyDbus->call("getProxyStateDbus");
2022-10-13 11:41:56 +08:00
if (!reply.isValid()) {
2022-10-13 13:59:14 +08:00
return false;
2022-10-13 11:41:56 +08:00
}
2022-09-26 17:31:00 +08:00
state = reply;
2022-10-13 11:41:56 +08:00
2022-09-24 17:08:28 +08:00
return state;
}
void Proxy::setAppProxyState(bool state)
{
2023-04-06 14:09:59 +08:00
if(m_appProxyDbus == nullptr || !m_appProxyDbus->isValid()) {
2022-09-24 17:08:28 +08:00
qWarning ()<< "init AppProxy dbus error";
return;
}
//设置应用代理开启状态
qDebug() << "call QDBusInterface setProxyStateDbus" << state;
2022-09-26 17:31:00 +08:00
m_appProxyDbus->call("setProxyStateDbus", state);
2022-09-24 17:08:28 +08:00
}
QStringList Proxy::getAppProxyConf()
{
QStringList info;
info.clear();
QDBusInterface dbusInterface("org.ukui.SettingsDaemon",
"/org/ukui/SettingsDaemon/AppProxy",
"org.ukui.SettingsDaemon.AppProxy",
QDBusConnection::sessionBus());
if(!dbusInterface.isValid()) {
qWarning ()<< "init AppProxy dbus error";
2023-04-06 14:09:59 +08:00
return info;
2022-09-24 17:08:28 +08:00
}
//获取应用代理配置信息
qDebug() << "call QDBusInterface getProxyConfig";
QDBusReply<QStringList> reply = dbusInterface.call("getProxyConfig");
2022-10-13 11:41:56 +08:00
if (!reply.isValid()) {
qWarning ()<< "Return empty app proxy information, getProxyConfig reply is invalid";
return info;
}
2022-09-24 17:08:28 +08:00
info = reply.value();
if (info.isEmpty()) {
qWarning() << "getAppProxyConf reply is empty";
}
return info;
}
void Proxy::setAppProxyConf(QStringList list)
{
2023-04-06 14:09:59 +08:00
//AppProxyConf 必填项数量为3
2022-09-24 17:08:28 +08:00
if (list.count() < 3) {
return;
}
2023-04-06 14:09:59 +08:00
if(m_appProxyDbus == nullptr || !m_appProxyDbus->isValid()) {
2022-09-24 17:08:28 +08:00
qWarning ()<< "init AppProxy dbus error";
return;
}
//写入应用代理配置信息
qDebug() << "call QDBusInterface setProxyConfig";
m_appProxyDbus->call("setProxyConfig", list);
}
QMap<QString, QStringList> Proxy::getAppListProxy()
{
QMap<QString, QStringList> appList;
appList.clear();
2022-10-13 11:41:56 +08:00
QDBusInterface dbusInterface("org.ukui.SettingsDaemon",
2022-09-24 17:08:28 +08:00
"/org/ukui/SettingsDaemon/AppProxy",
"org.ukui.SettingsDaemon.AppProxy",
QDBusConnection::sessionBus());
2022-10-13 11:41:56 +08:00
if(!dbusInterface.isValid()) {
2022-09-24 17:08:28 +08:00
qWarning ()<< "init AppProxy dbus error";
2022-10-13 11:41:56 +08:00
return appList;
2022-09-24 17:08:28 +08:00
}
//获取可以配置应用代理的应用信息
qDebug() << "call QDBusInterface getAppProxy";
2022-10-13 11:41:56 +08:00
QDBusReply<QMap<QString, QStringList>> reply = dbusInterface.call("getAppProxy");
if (!reply.isValid()) {
qWarning ()<< "Return empty app list, getAppProxy reply is invalid";
return appList;
}
2022-09-24 17:08:28 +08:00
appList = reply.value();
if (appList.isEmpty()) {
qWarning() << "getAppProxy reply appList is empty";
}
return appList;
}
#if 0
bool Proxy::checkIsChanged(QStringList info)
{
bool isChanged = false;
info = getAppProxyConf();
if (info.value(0) != m_proxyTypeComboBox->currentText()
|| info.value(1) != m_ipAddressLineEdit->text()
|| info.value(2) != m_portLineEdit->text()
|| info.value(3) != m_userNameLineEdit->text()
|| info.value(4) != m_pwdLineEdit->text()) {
isChanged = true; //如果在代理界面相关信息已修改则返回true
}
return isChanged;
}
#endif
void Proxy::setAppProxyFrameUi(QWidget *widget)
{
//应用代理模块
m_appProxyFrame = new QFrame(widget);
m_appProxyFrame->setMinimumSize(QSize(550, 0));
m_appProxyFrame->setMaximumSize(QSize(16777215, 16777215));
m_appProxyFrame->setFrameShape(QFrame::Box);
QVBoxLayout *appProxyLayout = new QVBoxLayout(m_appProxyFrame);
appProxyLayout->setContentsMargins(0, 0, 0, 0);
appProxyLayout->setSpacing(0);
//开启ui布局
m_appEnableFrame = new QFrame(m_appProxyFrame);
setFrame_Noframe(m_appEnableFrame);
m_appEnableLabel = new QLabel(tr("Open"), m_appEnableFrame);
m_appEnableBtn = new KSwitchButton(m_appEnableFrame);
m_appEnableBtn->setCheckable(true);
QHBoxLayout *appEnableLayout = new QHBoxLayout(m_appEnableFrame);
appEnableLayout->setContentsMargins(FRAME_LAYOUT_MARGINS);
appEnableLayout->addWidget(m_appEnableLabel);
appEnableLayout->addStretch();
appEnableLayout->addWidget(m_appEnableBtn);
//代理类型ui布局
m_proxyTypeFrame = new QFrame(m_appProxyFrame);
setFrame_Noframe(m_proxyTypeFrame);
m_proxyTypeLabel = new QLabel(tr("Proxy type"), m_proxyTypeFrame);
m_proxyTypeLabel->setFixedWidth(LABEL_WIDTH);
m_proxyTypeComboBox = new QComboBox(m_proxyTypeFrame);
QHBoxLayout *proxyTypeLayout = new QHBoxLayout(m_proxyTypeFrame);
proxyTypeLayout->setContentsMargins(FRAME_LAYOUT_MARGINS);
proxyTypeLayout->setSpacing(FRAME_LAYOUT_SPACING);
proxyTypeLayout->addWidget(m_proxyTypeLabel);
proxyTypeLayout->addWidget(m_proxyTypeComboBox);
m_proxyTypeComboBox->addItem("http"); //http
m_proxyTypeComboBox->addItem("socks4"); //socks4
m_proxyTypeComboBox->addItem("socks5"); //socks4
2022-09-24 17:08:28 +08:00
//IP地址ui布局
m_ipAddressFrame = new QFrame(m_appProxyFrame);
m_ipAddressFrame->setMinimumSize(QSize(550, 60));
2023-04-06 14:09:59 +08:00
m_ipAddressFrame->setMaximumSize(QSize(16777215, 88));
2022-09-24 17:08:28 +08:00
m_ipAddressFrame->setFrameShape(QFrame::NoFrame);
m_ipAddressLabel = new QLabel(tr("IP address"), m_ipAddressFrame);
m_ipAddressLabel->setFixedWidth(LABEL_WIDTH);
m_ipHintsLabel = new QLabel(m_ipAddressFrame);
m_ipHintsLabel->setContentsMargins(8, 0, 0, 0);
m_ipAddressLineEdit = new QLineEdit(m_ipAddressFrame);
2023-04-06 14:09:59 +08:00
m_ipAddressLineEdit->setFixedHeight(LINE_EDIT_HEIGHT);
2022-09-24 17:08:28 +08:00
m_ipAddressLineEdit->setPlaceholderText(tr("Required")); //必填
2023-04-06 14:09:59 +08:00
QWidget *ipInputWidget = new QWidget(m_ipAddressFrame);
QVBoxLayout *ipVLayout = new QVBoxLayout(ipInputWidget);
ipVLayout->setContentsMargins(0, 0, 0, 0);
ipVLayout->setSpacing(3);
ipVLayout->addWidget(m_ipAddressLineEdit);
ipVLayout->addWidget(m_ipHintsLabel);
QFormLayout *ipAddressLayout = new QFormLayout(m_ipAddressFrame);
ipAddressLayout->setContentsMargins(16, 12, 16, 12);
ipAddressLayout->setSpacing(FRAME_LAYOUT_SPACING);
ipAddressLayout->addRow(m_ipAddressLabel, ipInputWidget);
2022-09-24 17:08:28 +08:00
// IP的正则格式限制
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");
m_ipAddressLineEdit->setValidator(new QRegExpValidator(rx, this));
//无效的IP地址提示
QPalette hintTextColor;
hintTextColor.setColor(QPalette::WindowText, Qt::red);
m_ipHintsLabel->setPalette(hintTextColor);
m_ipHintsLabel->setText(tr("Invalid IP Address"));
m_ipHintsLabel->hide();
//端口ui布局
m_portFrame = new QFrame(m_appProxyFrame);
setFrame_Noframe(m_portFrame);
m_portLabel = new QLabel(tr("Port"), m_portFrame);
m_portLabel->setFixedWidth(LABEL_WIDTH);
m_portLineEdit = new QLineEdit(m_portFrame);
m_portLineEdit->setPlaceholderText(tr("Required")); //必填
m_portLineEdit->setValidator(new QRegExpValidator(QRegExp("[0-9]*") , this));
QHBoxLayout *portLayout = new QHBoxLayout(m_portFrame);
portLayout->setContentsMargins(FRAME_LAYOUT_MARGINS);
portLayout->setSpacing(FRAME_LAYOUT_SPACING);
portLayout->addWidget(m_portLabel);
portLayout->addWidget(m_portLineEdit);
//用户名ui布局
m_userNameFrame = new QFrame(m_appProxyFrame);
setFrame_Noframe(m_userNameFrame);
m_userNameLabel = new QLabel(tr("Username"), m_userNameFrame);
m_userNameLabel->setFixedWidth(LABEL_WIDTH);
m_userNameLineEdit = new QLineEdit(m_userNameFrame);
m_userNameLineEdit->setPlaceholderText(tr("Optional")); //选填
QHBoxLayout *userNameLayout = new QHBoxLayout(m_userNameFrame);
userNameLayout->setContentsMargins(FRAME_LAYOUT_MARGINS);
userNameLayout->setSpacing(FRAME_LAYOUT_SPACING);
userNameLayout->addWidget(m_userNameLabel);
userNameLayout->addWidget(m_userNameLineEdit);
//密码ui布局
m_pwdFrame = new QFrame(m_appProxyFrame);
setFrame_Noframe(m_pwdFrame);
m_pwdLabel = new QLabel(tr("Password"), m_pwdFrame);
m_pwdLabel->setFixedWidth(LABEL_WIDTH);
m_pwdLineEdit = new KPasswordEdit(m_pwdFrame);
m_pwdLineEdit->setClearButtonEnabled(false);
QString str = tr("Optional");
m_pwdLineEdit->setPlaceholderText(str); //选填
QHBoxLayout *pwdLayout = new QHBoxLayout(m_pwdFrame);
pwdLayout->setContentsMargins(FRAME_LAYOUT_MARGINS);
pwdLayout->setSpacing(FRAME_LAYOUT_SPACING);
pwdLayout->addWidget(m_pwdLabel);
pwdLayout->addWidget(m_pwdLineEdit);
QRegExp rxPwd("^[A-Za-z0-9`~!@#$%^&*()_-+=<>,.\\\/]+$");
QRegExpValidator *latitude = new QRegExpValidator(rxPwd, this);
m_pwdLineEdit->setValidator(latitude);
#if 0
//按钮ui布局
m_appBtnFrame = new QFrame(m_appProxyFrame);
setFrame_Noframe(m_appBtnFrame);
m_cancelBtn = new QPushButton(m_appBtnFrame);
m_saveBtn = new QPushButton(m_appBtnFrame);
m_cancelBtn->setText(tr("Cancel"));
m_saveBtn->setText(tr("Save"));
QHBoxLayout *btnLayout = new QHBoxLayout(m_appBtnFrame);
btnLayout->setContentsMargins(FRAME_LAYOUT_MARGINS);
btnLayout->setSpacing(16);
btnLayout->addStretch();
btnLayout->addWidget(m_cancelBtn);
btnLayout->addWidget(m_saveBtn);
#endif
//分隔线
m_appLine1 = setLine(m_appProxyFrame);
m_appLine2 = setLine(m_appProxyFrame);
m_appLine3 = setLine(m_appProxyFrame);
m_appLine4 = setLine(m_appProxyFrame);
m_appLine5 = setLine(m_appProxyFrame);
appProxyLayout->addWidget(m_appEnableFrame);
appProxyLayout->addWidget(m_appLine1);
appProxyLayout->addWidget(m_proxyTypeFrame);
appProxyLayout->addWidget(m_appLine2);
appProxyLayout->addWidget(m_ipAddressFrame);
appProxyLayout->addWidget(m_appLine3);
appProxyLayout->addWidget(m_portFrame);
appProxyLayout->addWidget(m_appLine4);
appProxyLayout->addWidget(m_userNameFrame);
appProxyLayout->addWidget(m_appLine5);
appProxyLayout->addWidget(m_pwdFrame);
// appProxyLayout->addWidget(line5);
// appProxyLayout->addWidget(m_appBtnFrame);
connect(m_appEnableBtn, &KSwitchButton::stateChanged, this, &Proxy::onappProxyEnableChanged);
connect(m_appEnableBtn, &KSwitchButton::stateChanged, this, &Proxy::setAppProxyState);
connect(m_proxyTypeComboBox, SIGNAL(currentTextChanged(QString)), this, SLOT(onAppProxyConfChanged()));
connect(m_ipAddressLineEdit, SIGNAL(textChanged(QString)), this, SLOT(onipEditStateChanged()));
connect(m_ipAddressLineEdit, SIGNAL(textChanged(QString)), this, SLOT(onAppProxyConfChanged()));
connect(m_portLineEdit, SIGNAL(textChanged(QString)), this, SLOT(onAppProxyConfChanged()));
connect(m_userNameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(onAppProxyConfChanged()));
connect(m_pwdLineEdit, SIGNAL(textChanged(QString)), this, SLOT(onAppProxyConfChanged()));
connect(m_ipAddressLineEdit, SIGNAL(textChanged(QString)), this, SLOT(onAppProxyConfChanged()));
connect(m_proxyTypeComboBox, SIGNAL(currentTextChanged(QString)), this, SLOT(onAppProxyConfEditFinished()));
connect(m_ipAddressLineEdit, SIGNAL(editingFinished()), this, SLOT(onAppProxyConfEditFinished()));
connect(m_portLineEdit, SIGNAL(editingFinished()), this, SLOT(onAppProxyConfEditFinished()));
connect(m_userNameLineEdit, SIGNAL(editingFinished()), this, SLOT(onAppProxyConfEditFinished()));
connect(m_pwdLineEdit, SIGNAL(editingFinished()), this, SLOT(onAppProxyConfEditFinished()));
// connect(m_cancelBtn, SIGNAL(clicked()), this, SLOT(onCancelBtnClicked()));
// connect(m_saveBtn, SIGNAL(clicked()), this, SLOT(onSaveBtnClicked()));
}
void Proxy::setAppListFrameUi(QWidget *widget)
{
//应用列表
m_appListFrame = new QFrame(widget);
m_appListFrame->setMinimumSize(QSize(550, 0));
m_appListFrame->setMaximumSize(QSize(16777215, 336));
m_appListFrame->setFrameShape(QFrame::Box);
QVBoxLayout *appListLayout = new QVBoxLayout(m_appListFrame);
appListLayout->setContentsMargins(16, 23, 16, 16);
appListLayout->setSpacing(16);
m_allowAppProxyLabel = new QLabel(m_appListFrame);
m_allowAppProxyLabel->setText(tr("The following applications are allowed to use this configuration:")); //允许以下应用使用该配置:
m_appListWidget = new QListWidget(m_appListFrame);
m_appListWidget->setMinimumHeight(240);
m_appListWidget->setFocusPolicy(Qt::FocusPolicy::NoFocus);
m_appListWidget->setFrameShape(QFrame::Shape::Panel);
appListLayout->addWidget(m_allowAppProxyLabel);
appListLayout->addWidget(m_appListWidget);
2023-04-06 14:09:59 +08:00
onPaletteChanged();
const QByteArray style_id(THEME_SCHAME);
if (QGSettings::isSchemaInstalled(style_id)) {
QGSettings * styleGsettings = new QGSettings(style_id, QByteArray(), this);
connect(styleGsettings, &QGSettings::changed, this, [=](QString key){
if ("styleName" == key) {
onPaletteChanged();
}
});
}
2022-09-24 17:08:28 +08:00
}
void Proxy::appProxyInfoPadding()
{
QStringList proxyInfo;
proxyInfo.clear();
proxyInfo = getAppProxyConf();
m_proxyTypeComboBox->setCurrentText(proxyInfo.value(0));
m_ipAddressLineEdit->setText(proxyInfo.value(1));
m_portLineEdit->setText(proxyInfo.value(2));
m_userNameLineEdit->setText(proxyInfo.value(3));
m_pwdLineEdit->setText(proxyInfo.value(4));
}
void Proxy::appListPadding()
{
QMap<QString, QStringList> appList ;
appList.clear();
appList = getAppListProxy(); //获取应用代理配置
//遍历应用列表
for (auto index : appList.keys()) {
QStringList appInfo = appList.value(index);
QVariant isChecked = appInfo.value(2);
bool flag = isChecked.toBool();
AppListWidget *appWidget = new AppListWidget(index, m_appListWidget);
appWidget->setAppName(appInfo.value(0));
appWidget->setAppIcon(QIcon::fromTheme(appInfo.value(1)).pixmap(24, 24));
appWidget->setAppChecked(flag);
QListWidgetItem *appListWidgetItem = new QListWidgetItem(m_appListWidget);
appListWidgetItem->setSizeHint(QSize(m_appListWidget->width(),36));
appListWidgetItem->setFlags(Qt::NoItemFlags);
m_appListWidget->addItem(appListWidgetItem);
m_appListWidget->setItemWidget(appListWidgetItem, appWidget);
}
}
bool Proxy::getipEditState(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;
}
void Proxy::onipEditStateChanged()
{
if (!getipEditState(m_ipAddressLineEdit->text())) {
2023-04-06 14:09:59 +08:00
m_ipAddressFrame->setFixedHeight(88);
2022-09-24 17:08:28 +08:00
m_ipHintsLabel->show();
} else {
m_ipHintsLabel->hide();
m_ipAddressFrame->setFixedHeight(60);
}
}
void Proxy::onAppProxyConfChanged()
{
if (!getipEditState(m_ipAddressLineEdit->text()) || m_portLineEdit->text().isEmpty()) {
return;
}
if (m_ipAddressLineEdit->text().isEmpty()) {
return;
} else {
m_appProxyInfo.clear();
m_appProxyInfo.append(m_proxyTypeComboBox->currentText());
m_appProxyInfo.append(m_ipAddressLineEdit->text());
m_appProxyInfo.append(m_portLineEdit->text());
if (!m_userNameLineEdit->text().isEmpty() && !m_pwdLineEdit->text().isEmpty()) {
m_appProxyInfo.append(m_userNameLineEdit->text());
m_appProxyInfo.append(m_pwdLineEdit->text());
} else {
m_appProxyInfo.append("");
m_appProxyInfo.append("");
}
}
}
void Proxy::onAppProxyConfEditFinished()
{
if (!m_ipAddressLineEdit->hasFocus() && !m_portLineEdit->hasFocus()) {
setAppProxyConf(m_appProxyInfo);
}
}
2023-04-06 14:09:59 +08:00
void Proxy::onPaletteChanged()
{
QPalette mpal(m_appListWidget->palette());
mpal.setColor(QPalette::Base, qApp->palette().base().color());
mpal.setColor(QPalette::AlternateBase, qApp->palette().alternateBase().color());
m_appListWidget->setBackgroundRole(QPalette::Base);
m_appListWidget->setAlternatingRowColors(true);
m_appListWidget->setPalette(mpal);
}
2022-09-24 17:08:28 +08:00
void Proxy::onappProxyEnableChanged(bool enable)
{
m_proxyTypeFrame->setVisible(enable);
m_ipAddressFrame->setVisible(enable);
m_portFrame->setVisible(enable);
m_userNameFrame->setVisible(enable);
m_pwdFrame->setVisible(enable);
m_appListFrame->setVisible(enable);
m_appLine1->setVisible(enable);
m_appLine2->setVisible(enable);
m_appLine3->setVisible(enable);
m_appLine4->setVisible(enable);
m_appLine5->setVisible(enable);
}
#if 0
void Proxy::onCancelBtnClicked()
{
appProxyInfoPadding();
}
void Proxy::onSaveBtnClicked()
{
if (!checkIsChanged(m_appProxyInfo)) {
return;
} else {
QStringList conf;
conf.clear();
conf.append(m_proxyTypeComboBox->currentText());
conf.append(m_ipAddressLineEdit->text());
conf.append(m_portLineEdit->text());
conf.append(m_userNameLineEdit->text());
conf.append(m_pwdLineEdit->text());
setAppProxyConf(conf);
}
}
void Proxy::setBtnEnable()
{
m_cancelBtn->setEnabled(true);
if (getipEditState(m_ipAddressLineEdit->text()) && !m_portLineEdit->text().isEmpty()) {
if (!m_ipAddressLineEdit->text().isEmpty()) {
m_saveBtn->setEnabled(true);
}
} else {
m_saveBtn->setEnabled(false);
}
}
#endif
void Proxy::setAptProxySlot()
{
mAptBtn->blockSignals(true);
QHash<QString, QVariant> preaptinfo = getAptProxy();
bool prestatus = preaptinfo["open"].toBool();
AptProxyDialog *mwindow = new AptProxyDialog(pluginWidget);
mwindow->exec();
if (getAptProxy()["open"].toBool() && !prestatus) { // open值为true用户点击了确定按钮进行配置文件的写入提示用户重启系统
setAptInfo();
}
if (getAptProxy()["open"].toBool() && prestatus) {
if (getAptProxy()["ip"].toString() == preaptinfo["ip"].toString() && getAptProxy()["port"].toString() == preaptinfo["port"].toString() && prestatus){ //点击了编辑按钮且在设置IP和端口号的弹窗中点击了取消或者关闭按钮
line_7->show();
mAPTFrame_2->show();
} else {
setAptInfo();
}
}
if(!getAptProxy()["open"].toBool() && !prestatus){ // 点击了APT开关按钮但是在设置IP和端口号的弹窗中点击了取消或者关闭按钮
mAptBtn->setChecked(false);
}
mAptBtn->blockSignals(false);
}
void Proxy::manualProxyTextChanged(QString txt){
//获取被修改控件
QObject * pobject = this->sender();
QLineEdit * who = dynamic_cast<QLineEdit *>(pobject);
//获取控件保存的用户数据
GSData currentData = who->property("gData").value<GSData>();
QString schema = currentData.schema;
qDebug()<<schema;
QString key = currentData.key;
//构建临时QGSettings
const QByteArray id = schema.toUtf8();
const QByteArray iidd(id.data());
QGSettings * setting = new QGSettings(iidd);
setting->set(key, QVariant(txt));
delete setting;
setting = nullptr;
}