From 5a6ba7de23fc669680f7272fdb4f1f51f22cd87e Mon Sep 17 00:00:00 2001 From: selsta Date: Mon, 1 Jun 2026 13:47:24 +0200 Subject: [PATCH] P2PoolManager: add proxy support --- pages/Mining.qml | 2 ++ pages/settings/SettingsLayout.qml | 2 +- src/p2pool/P2PoolManager.cpp | 57 +++++++++++++++++++++++++++---- src/p2pool/P2PoolManager.h | 6 ++++ 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/pages/Mining.qml b/pages/Mining.qml index 85bd4d0a39..733db581fc 100644 --- a/pages/Mining.qml +++ b/pages/Mining.qml @@ -309,6 +309,7 @@ Rectangle { confirmationDialog.cancelText = qsTr("No") + translationManager.emptyString; confirmationDialog.okText = qsTr("Yes") + translationManager.emptyString; confirmationDialog.onAcceptedCallback = function() { + p2poolManager.proxyAddress = persistentSettings.getProxyAddress(); p2poolManager.download(); statusMessageText.text = "Downloading P2Pool..."; statusMessage.visible = true @@ -652,6 +653,7 @@ allArgs = allArgs.filter( ( el ) => !defaultArgs.includes( el.split(" ")[0] ) ) chain = "nano" } var p2poolArgs = persistentSettings.p2poolFlags; + p2poolManager.proxyAddress = persistentSettings.getProxyAddress(); var success = p2poolManager.start(p2poolArgs, address, chain, threads); if (success) { diff --git a/pages/settings/SettingsLayout.qml b/pages/settings/SettingsLayout.qml index e73355ae88..cbf66cb5ed 100644 --- a/pages/settings/SettingsLayout.qml +++ b/pages/settings/SettingsLayout.qml @@ -275,7 +275,7 @@ Rectangle { } text: qsTr("Socks5 proxy (%1%2)") .arg(appWindow.walletMode >= 2 ? qsTr("remote node connections, ") : "") - .arg(qsTr("updates downloading, fetching price sources")) + translationManager.emptyString + .arg(qsTr("updates downloading, fetching price sources, P2Pool")) + translationManager.emptyString } MoneroComponents.RemoteNodeEdit { diff --git a/src/p2pool/P2PoolManager.cpp b/src/p2pool/P2PoolManager.cpp index cf1af558c9..3f806f8533 100644 --- a/src/p2pool/P2PoolManager.cpp +++ b/src/p2pool/P2PoolManager.cpp @@ -27,7 +27,7 @@ // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "P2PoolManager.h" -#include "net/http_client.h" +#include "net/http.h" #include "common/util.h" #include "main/oshelper.h" #include "qt/utils.h" @@ -72,11 +72,26 @@ void P2PoolManager::download() { validHash = "a358489a4b1a6addfcc86ff235a0ce50210899f5e3a6dc93ce0eb69e0d181564"; #endif QFile file(fileName); - epee::net_utils::http::http_simple_client http_client; + net::http::client http_client; + QString proxyAddress; + { + QMutexLocker locker(&m_proxyMutex); + proxyAddress = m_proxyAddress; + } + + if (!proxyAddress.isEmpty() && !http_client.set_proxy(proxyAddress.toStdString())) { + qCritical() << "Failed to set p2pool download proxy address" << proxyAddress; + emit p2poolDownloadFailure(ConnectionIssue); + return; + } + const epee::net_utils::http::http_response_info* response = NULL; std::string userAgent = randomUserAgent().toStdString(); std::chrono::milliseconds timeout = std::chrono::seconds(10); - http_client.set_server(url.host().toStdString(), "443", {}); + const epee::net_utils::ssl_options_t sslOptions{ + epee::net_utils::ssl_support_t::e_ssl_support_enabled + }; + http_client.set_server(url.host().toStdString(), "443", {}, sslOptions); bool success = http_client.invoke_get(url.path().toStdString(), timeout, {}, std::addressof(response), {{"User-Agent", userAgent}}); if (success && response->m_response_code == 404) { emit p2poolDownloadFailure(BinaryNotAvailable); @@ -86,9 +101,11 @@ void P2PoolManager::download() { for (std::pair i : fields) { if (i.first == "Location") { url = QString::fromStdString(i.second); - http_client.set_server(url.host().toStdString(), "443", {}); - std::string query = url.query(QUrl::FullyEncoded).toStdString(); - std::string path = url.path().toStdString() + "?" + query; + http_client.set_server(url.host().toStdString(), "443", {}, sslOptions); + std::string path = url.path().toStdString(); + if (url.hasQuery()) { + path += "?" + url.query(QUrl::FullyEncoded).toStdString(); + } http_client.wipe_response(); success = http_client.invoke_get(path, timeout, {}, std::addressof(response), {{"User-Agent", userAgent}}); } @@ -196,6 +213,15 @@ bool P2PoolManager::start(const QString &flags, const QString &address, const QS arguments << "--wallet" << address; } + { + QMutexLocker locker(&m_proxyMutex); + if (!m_proxyAddress.isEmpty()) { + if (!arguments.contains("--socks5")) { + arguments << "--socks5" << m_proxyAddress; + } + } + } + qDebug() << "starting p2pool " + m_p2pool; qDebug() << "With command line arguments " << arguments; @@ -220,6 +246,25 @@ bool P2PoolManager::start(const QString &flags, const QString &address, const QS return true; } +QString P2PoolManager::proxyAddress() const +{ + QMutexLocker locker(&m_proxyMutex); + return m_proxyAddress; +} + +void P2PoolManager::setProxyAddress(QString address) +{ + { + QMutexLocker locker(&m_proxyMutex); + if (m_proxyAddress == address) { + return; + } + m_proxyAddress = address; + } + + emit proxyAddressChanged(); +} + void P2PoolManager::exit() { qDebug("P2PoolManager: exit()"); diff --git a/src/p2pool/P2PoolManager.h b/src/p2pool/P2PoolManager.h index b9eecf0e7c..087c6e706c 100644 --- a/src/p2pool/P2PoolManager.h +++ b/src/p2pool/P2PoolManager.h @@ -41,6 +41,7 @@ class P2PoolManager : public QObject { Q_OBJECT + Q_PROPERTY(QString proxyAddress READ proxyAddress WRITE setProxyAddress NOTIFY proxyAddressChanged) public: explicit P2PoolManager(QObject *parent = 0); @@ -63,17 +64,22 @@ class P2PoolManager : public QObject private: bool running(NetworkType::Type nettype) const; + QString proxyAddress() const; + void setProxyAddress(QString address); signals: void p2poolStartFailure() const; void p2poolStatus(bool isMining, int hashrate) const; void p2poolDownloadFailure(int errorCode) const; void p2poolDownloadSuccess() const; + void proxyAddressChanged() const; private: std::unique_ptr m_p2poold; QMutex m_p2poolMutex; QString m_p2pool; QString m_p2poolPath; + QString m_proxyAddress; + mutable QMutex m_proxyMutex; bool started = false; mutable FutureScheduler m_scheduler;