diff options
author | Saturneric <[email protected]> | 2023-03-30 17:13:52 +0000 |
---|---|---|
committer | Saturneric <[email protected]> | 2023-03-30 17:13:52 +0000 |
commit | d2ff4d0ad8144702ef7b5945f531aff0c4e51101 (patch) | |
tree | ddb8e78dbe2ab69b295318cfa3df46f4ac513647 | |
parent | feat: update ui of general settings (diff) | |
download | GpgFrontend-d2ff4d0ad8144702ef7b5945f531aff0c4e51101.tar.gz GpgFrontend-d2ff4d0ad8144702ef7b5945f531aff0c4e51101.zip |
fix: solve issues in proxy configure
-rw-r--r-- | src/ui/GpgFrontendUIInit.cpp | 57 | ||||
-rw-r--r-- | src/ui/dialog/settings/SettingsNetwork.cpp | 45 | ||||
-rw-r--r-- | src/ui/thread/ProxyConnectionTestTask.cpp | 74 | ||||
-rw-r--r-- | src/ui/thread/ProxyConnectionTestTask.h (renamed from src/ui/thread/ProxyConnectionTestThread.h) | 16 | ||||
-rw-r--r-- | src/ui/thread/ProxyConnectionTestThread.cpp | 58 |
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_); -} |