From f56ecff8837a2d3292d7d0b1dbbb8c0f0194247a Mon Sep 17 00:00:00 2001 From: neru Date: Tue, 12 May 2026 18:32:45 -0300 Subject: [PATCH] feat: add ProxyConfigurator --- src/test/configurator.cpp | 89 +++++++++++++++++++++++++++++++++++++++ src/test/configurator.h | 16 +++++++ 2 files changed, 105 insertions(+) create mode 100644 src/test/configurator.cpp create mode 100644 src/test/configurator.h diff --git a/src/test/configurator.cpp b/src/test/configurator.cpp new file mode 100644 index 0000000..6dadb34 --- /dev/null +++ b/src/test/configurator.cpp @@ -0,0 +1,89 @@ +#include "configurator.h" +#include "cout-sink.h" + +#include + +#include + +ProxyConfigurator::ProxyConfigurator() +{ + _log = new seallib::Logger("ProxyConfigurator"); + _log->addSink(std::make_shared()); + + _log->verbose("ProxyConfigurator instantiated"); +} + +ProxyConfigurator::~ProxyConfigurator() +{ + delete _log; +} + +#ifdef _WIN32 + #include + #include +bool ProxyConfigurator::setProxy(const char* ip, unsigned short port) +{ + std::string proxyAddr = std::format("{}:{}", ip, port); + + INTERNET_PER_CONN_OPTION_LIST list; + INTERNET_PER_CONN_OPTION options[3]; + + ZeroMemory(&list, sizeof(list)); + ZeroMemory(options, sizeof(options)); + + options[0].Value.dwValue = PROXY_TYPE_PROXY | PROXY_TYPE_DIRECT; + + options[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + options[1].Value.pszValue = const_cast(proxyAddr.c_str()); + + options[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS; + options[2].Value.pszValue = (char*)""; + list.dwOptionCount = 3; + + list.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST); + list.pszConnection = NULL; + list.pOptions = options; + + if (!InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, sizeof(list))) + { + _log->error("Failed to set proxy options - error: {}", GetLastError()); + return false; + } + + InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0); + InternetSetOption(NULL, INTERNET_OPTION_REFRESH, NULL, 0); + + _log->info("Set proxy to {}:{}", ip, port); + + return true; +} + +bool ProxyConfigurator::clearProxy() +{ + INTERNET_PER_CONN_OPTION_LIST list; + INTERNET_PER_CONN_OPTION options[3]; + + ZeroMemory(&list, sizeof(list)); + ZeroMemory(options, sizeof(options)); + + options[0].dwOption = INTERNET_PER_CONN_FLAGS; + options[0].Value.dwValue = PROXY_TYPE_DIRECT; + + list.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST); + list.pszConnection = NULL; + list.pOptions = options; + + if (!InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, sizeof(list))) + { + _log->error("Failed to clear proxy - error: {}", GetLastError()); + return false; + } + + InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0); + InternetSetOption(NULL, INTERNET_OPTION_REFRESH, NULL, 0); + + _log->info("Cleared proxy settings"); + + return false; +} +#endif diff --git a/src/test/configurator.h b/src/test/configurator.h new file mode 100644 index 0000000..8bf430d --- /dev/null +++ b/src/test/configurator.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +class ProxyConfigurator +{ + public: + ProxyConfigurator(); + ~ProxyConfigurator(); + + bool setProxy(const char* ip, unsigned short port); + bool clearProxy(); + + private: + seallib::Logger* _log; +};