aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaturneric <[email protected]>2023-03-30 17:13:52 +0000
committerSaturneric <[email protected]>2023-03-30 17:13:52 +0000
commitd2ff4d0ad8144702ef7b5945f531aff0c4e51101 (patch)
treeddb8e78dbe2ab69b295318cfa3df46f4ac513647
parentfeat: update ui of general settings (diff)
downloadGpgFrontend-d2ff4d0ad8144702ef7b5945f531aff0c4e51101.tar.gz
GpgFrontend-d2ff4d0ad8144702ef7b5945f531aff0c4e51101.zip
fix: solve issues in proxy configure
-rw-r--r--src/ui/GpgFrontendUIInit.cpp57
-rw-r--r--src/ui/dialog/settings/SettingsNetwork.cpp45
-rw-r--r--src/ui/thread/ProxyConnectionTestTask.cpp74
-rw-r--r--src/ui/thread/ProxyConnectionTestTask.h (renamed from src/ui/thread/ProxyConnectionTestThread.h)16
-rw-r--r--src/ui/thread/ProxyConnectionTestThread.cpp58
5 files changed, 163 insertions, 87 deletions
diff --git a/src/ui/GpgFrontendUIInit.cpp b/src/ui/GpgFrontendUIInit.cpp
index 6e41f81f..d363f886 100644
--- a/src/ui/GpgFrontendUIInit.cpp
+++ b/src/ui/GpgFrontendUIInit.cpp
@@ -71,6 +71,63 @@ void InitGpgFrontendUI(QApplication* app) {
// init common utils
CommonUtils::GetInstance();
+ // application proxy configure
+
+ auto& settings = GlobalSettingStation::GetInstance().GetUISettings();
+ bool proxy_enable = false;
+ try {
+ proxy_enable = settings.lookup("proxy.enable");
+ } catch (...) {
+ SPDLOG_ERROR("setting operation error: proxy_enable");
+ }
+ SPDLOG_DEBUG("loading proxy configure, proxy_enable: {}", proxy_enable);
+
+ // if enable proxy for application
+ if (proxy_enable) {
+ try {
+ std::string proxy_type = settings.lookup("proxy.proxy_type");
+ std::string proxy_host = settings.lookup("proxy.proxy_host");
+ int proxy_port = settings.lookup("proxy.port");
+ std::string proxy_username = settings.lookup("proxy.username");
+ std::string proxy_password = settings.lookup("proxy.password");
+
+ SPDLOG_DEBUG("proxy settings: type {}, host {}, port: {}", proxy_type,
+ proxy_host, proxy_port);
+
+ QNetworkProxy::ProxyType proxy_type_qt = QNetworkProxy::NoProxy;
+ if (proxy_type == "HTTP") {
+ proxy_type_qt = QNetworkProxy::HttpProxy;
+ } else if (proxy_type == "Socks5") {
+ proxy_type_qt = QNetworkProxy::Socks5Proxy;
+ } else {
+ proxy_type_qt = QNetworkProxy::DefaultProxy;
+ }
+
+ // create proxy object and apply settings
+ QNetworkProxy proxy;
+ if (proxy_type_qt != QNetworkProxy::DefaultProxy) {
+ proxy.setType(proxy_type_qt);
+ proxy.setHostName(QString::fromStdString(proxy_host));
+ proxy.setPort(proxy_port);
+ if (!proxy_username.empty())
+ proxy.setUser(QString::fromStdString(proxy_username));
+ if (!proxy_password.empty())
+ proxy.setPassword(QString::fromStdString(proxy_password));
+ } else {
+ proxy.setType(proxy_type_qt);
+ }
+ QNetworkProxy::setApplicationProxy(proxy);
+
+ } catch (...) {
+ SPDLOG_ERROR("setting operation error: proxy setings");
+ // no proxy by default
+ QNetworkProxy::setApplicationProxy(QNetworkProxy::NoProxy);
+ }
+ } else {
+ // no proxy by default
+ QNetworkProxy::setApplicationProxy(QNetworkProxy::NoProxy);
+ }
+
// create the thread to load the gpg context
auto* init_ctx_task = new Thread::CtxCheckTask();
diff --git a/src/ui/dialog/settings/SettingsNetwork.cpp b/src/ui/dialog/settings/SettingsNetwork.cpp
index fe3d450e..855cafbf 100644
--- a/src/ui/dialog/settings/SettingsNetwork.cpp
+++ b/src/ui/dialog/settings/SettingsNetwork.cpp
@@ -29,7 +29,7 @@
#include "SettingsNetwork.h"
#include "core/function/GlobalSettingStation.h"
-#include "ui/thread/ProxyConnectionTestThread.h"
+#include "ui/thread/ProxyConnectionTestTask.h"
#include "ui_NetworkSettings.h"
GpgFrontend::UI::NetworkTab::NetworkTab(QWidget *parent)
@@ -148,6 +148,8 @@ void GpgFrontend::UI::NetworkTab::SetSettings() {
} catch (...) {
SPDLOG_ERROR("setting operation error: prohibit_update_checking");
}
+
+ switch_ui_proxy_type(ui_->proxyTypeComboBox->currentText());
}
void GpgFrontend::UI::NetworkTab::ApplySettings() {
@@ -232,9 +234,9 @@ void GpgFrontend::UI::NetworkTab::slot_test_proxy_connection_result() {
tr("Server Url"), QLineEdit::Normal,
"https://", &ok);
if (ok && !url.isEmpty()) {
- auto thread = new ProxyConnectionTestThread(url, 800, this);
- connect(thread,
- &GpgFrontend::UI::ProxyConnectionTestThread::
+ auto task = new ProxyConnectionTestTask(url, 800);
+ connect(task,
+ &GpgFrontend::UI::ProxyConnectionTestTask::
SignalProxyConnectionTestResult,
this, [=](const QString &result) {
if (result == "Reachable") {
@@ -248,7 +250,6 @@ void GpgFrontend::UI::NetworkTab::slot_test_proxy_connection_result() {
"proxy server. Proxy settings may be invalid."));
}
});
- connect(thread, &QThread::finished, thread, &QThread::deleteLater);
// Waiting Dialog
auto *waiting_dialog = new QProgressDialog(this);
@@ -261,43 +262,43 @@ void GpgFrontend::UI::NetworkTab::slot_test_proxy_connection_result() {
waiting_dialog_label->setWordWrap(true);
waiting_dialog->setLabel(waiting_dialog_label);
waiting_dialog->resize(420, 120);
- connect(thread, &QThread::finished, [=]() {
- waiting_dialog->finished(0);
+ connect(task, &Thread::Task::SignalTaskEnd, [=]() {
+ waiting_dialog->close();
waiting_dialog->deleteLater();
});
- connect(waiting_dialog, &QProgressDialog::canceled, [=]() {
- SPDLOG_DEBUG("cancel clicked");
- if (thread->isRunning()) thread->terminate();
- });
// Show Waiting Dialog
waiting_dialog->show();
waiting_dialog->setFocus();
- thread->start();
+ Thread::TaskRunnerGetter::GetInstance()
+ .GetTaskRunner(Thread::TaskRunnerGetter::kTaskRunnerType_Network)
+ ->PostTask(task);
+
QEventLoop loop;
- connect(thread, &QThread::finished, &loop, &QEventLoop::quit);
+ connect(task, &Thread::Task::SignalTaskEnd, &loop, &QEventLoop::quit);
+ connect(waiting_dialog, &QProgressDialog::canceled, &loop,
+ &QEventLoop::quit);
loop.exec();
}
}
void GpgFrontend::UI::NetworkTab::apply_proxy_settings() {
// apply settings
- QNetworkProxy _proxy;
+ QNetworkProxy proxy;
if (ui_->enableProxyCheckBox->isChecked() &&
proxy_type_ != QNetworkProxy::DefaultProxy) {
- _proxy.setType(proxy_type_);
- _proxy.setHostName(ui_->proxyServerAddressEdit->text());
- _proxy.setPort(ui_->portSpin->value());
+ proxy.setType(proxy_type_);
+ proxy.setHostName(ui_->proxyServerAddressEdit->text());
+ proxy.setPort(ui_->portSpin->value());
if (!ui_->usernameEdit->text().isEmpty()) {
- _proxy.setUser(ui_->usernameEdit->text());
- _proxy.setPassword(ui_->passwordEdit->text());
+ proxy.setUser(ui_->usernameEdit->text());
+ proxy.setPassword(ui_->passwordEdit->text());
}
} else {
- _proxy.setType(proxy_type_);
+ proxy.setType(proxy_type_);
}
-
- QNetworkProxy::setApplicationProxy(_proxy);
+ QNetworkProxy::setApplicationProxy(proxy);
}
void GpgFrontend::UI::NetworkTab::switch_ui_enabled(bool enabled) {
diff --git a/src/ui/thread/ProxyConnectionTestTask.cpp b/src/ui/thread/ProxyConnectionTestTask.cpp
new file mode 100644
index 00000000..c7d623d7
--- /dev/null
+++ b/src/ui/thread/ProxyConnectionTestTask.cpp
@@ -0,0 +1,74 @@
+/**
+ * Copyright (C) 2021 Saturneric
+ *
+ * This file is part of GpgFrontend.
+ *
+ * GpgFrontend 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.
+ *
+ * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * The initial version of the source code is inherited from
+ * the gpg4usb project, which is under GPL-3.0-or-later.
+ *
+ * The source code version of this software was modified and released
+ * by Saturneric<[email protected]><[email protected]> starting on May 12, 2021.
+ *
+ */
+
+#include "ProxyConnectionTestTask.h"
+
+GpgFrontend::UI::ProxyConnectionTestTask::ProxyConnectionTestTask(QString url,
+ int timeout)
+ : Task("proxy_connection_test_task"),
+ url_(std::move(url)),
+ timeout_(timeout),
+ network_manager_(new QNetworkAccessManager(this)) {}
+
+void GpgFrontend::UI::ProxyConnectionTestTask::run() {
+ SetFinishAfterRun(false);
+
+ auto* network_reply = network_manager_->get(QNetworkRequest{url_});
+ auto* timer = new QTimer(this);
+
+ connect(network_reply, &QNetworkReply::finished, this,
+ [this, network_reply]() {
+ SPDLOG_DEBUG("key server domain reply: {} received",
+ url_.toStdString());
+ this->slot_process_network_reply(network_reply);
+ });
+
+ connect(timer, &QTimer::timeout, this, [this, network_reply]() {
+ SPDLOG_DEBUG("timeout for key server: {}", url_.toStdString());
+ if (network_reply->isRunning()) {
+ network_reply->abort();
+ this->slot_process_network_reply(network_reply);
+ }
+ });
+
+ timer->start(timeout_);
+}
+
+void GpgFrontend::UI::ProxyConnectionTestTask::slot_process_network_reply(
+ QNetworkReply* reply) {
+ auto buffer = reply->readAll();
+ SPDLOG_DEBUG("key server domain reply: {}, buffer size: {}",
+ url_.toStdString(), buffer.size());
+
+ if (reply->error() == QNetworkReply::NoError && !buffer.isEmpty()) {
+ result_ = "Reachable";
+ } else {
+ result_ = "Not Reachable";
+ }
+
+ emit SignalProxyConnectionTestResult(result_);
+ emit SignalTaskRunnableEnd(0);
+}
diff --git a/src/ui/thread/ProxyConnectionTestThread.h b/src/ui/thread/ProxyConnectionTestTask.h
index 70757e03..38e78ae4 100644
--- a/src/ui/thread/ProxyConnectionTestThread.h
+++ b/src/ui/thread/ProxyConnectionTestTask.h
@@ -39,7 +39,7 @@ namespace GpgFrontend::UI {
* @brief
*
*/
-class ProxyConnectionTestThread : public QThread {
+class ProxyConnectionTestTask : public Thread::Task {
Q_OBJECT
public:
/**
@@ -49,9 +49,7 @@ class ProxyConnectionTestThread : public QThread {
* @param timeout
* @param parent
*/
- explicit ProxyConnectionTestThread(QString url, int timeout,
- QWidget* parent = nullptr)
- : QThread(parent), url_(std::move(url)), timeout_(timeout) {}
+ explicit ProxyConnectionTestTask(QString url, int timeout);
signals:
/**
@@ -68,10 +66,14 @@ class ProxyConnectionTestThread : public QThread {
*/
void run() override;
+ private slots:
+ void slot_process_network_reply(QNetworkReply* reply);
+
private:
- QString url_; ///<
- QString result_; ///<
- int timeout_ = 500; ///<
+ QString url_; ///<
+ QString result_; ///<
+ int timeout_ = 500; ///<
+ QNetworkAccessManager* network_manager_; ///<
};
} // namespace GpgFrontend::UI
diff --git a/src/ui/thread/ProxyConnectionTestThread.cpp b/src/ui/thread/ProxyConnectionTestThread.cpp
deleted file mode 100644
index 8b113453..00000000
--- a/src/ui/thread/ProxyConnectionTestThread.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Copyright (C) 2021 Saturneric
- *
- * This file is part of GpgFrontend.
- *
- * GpgFrontend 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.
- *
- * GpgFrontend 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 GpgFrontend. If not, see <https://www.gnu.org/licenses/>.
- *
- * The initial version of the source code is inherited from
- * the gpg4usb project, which is under GPL-3.0-or-later.
- *
- * The source code version of this software was modified and released
- * by Saturneric<[email protected]><[email protected]> starting on May 12, 2021.
- *
- */
-
-#include "ProxyConnectionTestThread.h"
-
-void GpgFrontend::UI::ProxyConnectionTestThread::run() {
- QNetworkProxyQuery npq({QUrl(url_)});
- auto proxies_list = QNetworkProxyFactory::systemProxyForQuery(npq);
-
- if (proxies_list.isEmpty()) {
- SPDLOG_DEBUG("no proxy applied");
- } else {
- SPDLOG_DEBUG("proxies list hostname: {}",
- proxies_list.front().hostName().toStdString());
- }
-
- SPDLOG_DEBUG("proxies list size: {}", proxies_list.size());
-
- auto manager = std::make_unique<QNetworkAccessManager>(nullptr);
- QNetworkRequest url_request;
- url_request.setUrl(QUrl(url_));
- auto _reply = manager->get(url_request);
-
- while (_reply->isRunning()) QApplication::processEvents();
- auto _buffer = _reply->readAll();
- if (_reply->error() == QNetworkReply::NoError && !_buffer.isEmpty()) {
- result_ = "Reachable";
- } else {
- result_ = "Not Reachable";
- }
-
- _reply->deleteLater();
-
- emit SignalProxyConnectionTestResult(result_);
-}