Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

net: remove SOCKS4 support from core and GUI #2385

Merged
merged 2 commits into from
Nov 20, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 11 additions & 15 deletions src/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -467,9 +467,7 @@ void SetupServerArgs()
" a peer may be inactive before the connection to it is dropped. (minimum: 1, default:"
" 45)",
ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::CONNECTION);
argsman.AddArg("-proxy=<ip:port>", "Connect through socks proxy", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-socks=<n>", "Select the version of socks proxy to use (4-5, default: 5)",
ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-proxy=<ip:port>", "Connect through SOCKS5 proxy", ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-tor=<ip:port>", "Use proxy to reach Tor onion services (default: same as -proxy)",
ArgsManager::ALLOW_ANY, OptionsCategory::CONNECTION);
argsman.AddArg("-dns", "Allow DNS lookups for -addnode, -seednode and -connect",
Expand Down Expand Up @@ -883,6 +881,10 @@ bool AppInit2(ThreadHandlerPtr threads)
fDaemon = gArgs.GetBoolArg("-daemon");
#endif

// Check for -socks - as this is a privacy risk to continue, exit here
if (gArgs.IsArgSet("-socks"))
return InitError(_("Error: Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported."));

if (fDaemon)
fServer = true;
else
Expand Down Expand Up @@ -1055,11 +1057,6 @@ bool AppInit2(ThreadHandlerPtr threads)

// ********************************************************* Step 6: network initialization

int nSocksVersion = gArgs.GetArg("-socks", 5);

if (nSocksVersion != 4 && nSocksVersion != 5)
return InitError(strprintf(_("Unknown -socks proxy version requested: %i"), nSocksVersion));

if (gArgs.GetArgs("-onlynet").size()) {
std::set<enum Network> nets;
for (auto const& snet : gArgs.GetArgs("-onlynet"))
Expand All @@ -1084,12 +1081,11 @@ bool AppInit2(ThreadHandlerPtr threads)
return InitError(strprintf(_("Invalid -proxy address: '%s'"), gArgs.GetArg("-proxy", "")));

if (!IsLimited(NET_IPV4))
SetProxy(NET_IPV4, addrProxy, nSocksVersion);
if (nSocksVersion > 4) {
if (!IsLimited(NET_IPV6))
SetProxy(NET_IPV6, addrProxy, nSocksVersion);
SetNameProxy(addrProxy, nSocksVersion);
}
SetProxy(NET_IPV4, addrProxy);
if (!IsLimited(NET_IPV6))
SetProxy(NET_IPV6, addrProxy);
SetNameProxy(addrProxy);

fProxy = true;
}

Expand All @@ -1102,7 +1098,7 @@ bool AppInit2(ThreadHandlerPtr threads)
addrOnion = CService(gArgs.GetArg("-tor", ""), 9050);
if (!addrOnion.IsValid())
return InitError(strprintf(_("Invalid -tor address: '%s'"), gArgs.GetArg("-tor", "")));
SetProxy(NET_TOR, addrOnion, 5);
SetProxy(NET_TOR, addrOnion);
SetReachable(NET_TOR, true);
}

Expand Down
117 changes: 26 additions & 91 deletions src/netbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ using namespace std;

// Settings
static proxyType proxyInfo[NET_MAX];
static proxyType nameproxyInfo;
static CService nameProxy;
static CCriticalSection cs_proxyInfos;
int nConnectTimeout = 5000;
bool fNameLookup = false;
Expand Down Expand Up @@ -168,50 +168,6 @@ bool LookupSubNet(const char* pszName, CSubNet& ret)
return false;
}

bool static Socks4(const CService &addrDest, SOCKET& hSocket)
{
LogPrintf("SOCKS4 connecting %s", addrDest.ToString());
if (!addrDest.IsIPv4())
{
closesocket(hSocket);
return error("Proxy destination is not IPv4");
}
char pszSocks4IP[] = "\4\1\0\0\0\0\0\0user";
struct sockaddr_in addr;
socklen_t len = sizeof(addr);
if (!addrDest.GetSockAddr((struct sockaddr*)&addr, &len) || addr.sin_family != AF_INET)
{
closesocket(hSocket);
return error("Cannot get proxy destination address");
}
memcpy(pszSocks4IP + 2, &addr.sin_port, 2);
memcpy(pszSocks4IP + 4, &addr.sin_addr, 4);
char* pszSocks4 = pszSocks4IP;
int nSize = sizeof(pszSocks4IP);

int ret = send(hSocket, pszSocks4, nSize, MSG_NOSIGNAL);
if (ret != nSize)
{
closesocket(hSocket);
return error("Error sending to proxy");
}
char pchRet[8];
if (recv(hSocket, pchRet, 8, 0) != 8)
{
closesocket(hSocket);
return error("Error reading proxy response");
}
if (pchRet[1] != 0x5a)
{
closesocket(hSocket);
if (pchRet[1] != 0x5b)
LogPrintf("ERROR: Proxy returned error %d", pchRet[1]);
return false;
}
LogPrintf("SOCKS4 connected %s", addrDest.ToString());
return true;
}

bool static Socks5(string strDest, int port, SOCKET& hSocket)
{
LogPrintf("SOCKS5 connecting %s", strDest);
Expand Down Expand Up @@ -424,53 +380,49 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe
return true;
}

bool SetProxy(enum Network net, CService addrProxy, int nSocksVersion) {
bool SetProxy(enum Network net, CService addrProxy) {
assert(net >= 0 && net < NET_MAX);
if (nSocksVersion != 0 && nSocksVersion != 4 && nSocksVersion != 5)
return false;
if (nSocksVersion != 0 && !addrProxy.IsValid())
if (!addrProxy.IsValid())
return false;
LOCK(cs_proxyInfos);
proxyInfo[net] = std::make_pair(addrProxy, nSocksVersion);
proxyInfo[net] = addrProxy;
return true;
}

bool GetProxy(enum Network net, proxyType &proxyInfoOut) {
assert(net >= 0 && net < NET_MAX);
LOCK(cs_proxyInfos);
if (!proxyInfo[net].second)
if (!proxyInfo[net].IsValid())
return false;
proxyInfoOut = proxyInfo[net];
return true;
}

bool SetNameProxy(CService addrProxy, int nSocksVersion) {
if (nSocksVersion != 0 && nSocksVersion != 5)
return false;
if (nSocksVersion != 0 && !addrProxy.IsValid())
bool SetNameProxy(CService addrProxy) {
if (!addrProxy.IsValid())
return false;
LOCK(cs_proxyInfos);
nameproxyInfo = std::make_pair(addrProxy, nSocksVersion);
nameProxy = addrProxy;
return true;
}

bool GetNameProxy(proxyType &nameproxyInfoOut) {
bool GetNameProxy(CService &nameProxyOut) {
LOCK(cs_proxyInfos);
if (!nameproxyInfo.second)
if(!nameProxy.IsValid())
return false;
nameproxyInfoOut = nameproxyInfo;
nameProxyOut = nameProxy;
return true;
}

bool HaveNameProxy() {
LOCK(cs_proxyInfos);
return nameproxyInfo.second != 0;
return nameProxy.IsValid();
}

bool IsProxy(const CNetAddr &addr) {
LOCK(cs_proxyInfos);
for (int i = 0; i < NET_MAX; i++) {
if (proxyInfo[i].second && (addr == (CNetAddr)proxyInfo[i].first))
if (addr == (CNetAddr)proxyInfo[i])
return true;
}
return false;
Expand All @@ -480,30 +432,19 @@ bool ConnectSocket(const CService &addrDest, SOCKET& hSocketRet, int nTimeout)
{
proxyType proxy;

// no proxy needed
// no proxy needed (none set for target network)
if (!GetProxy(addrDest.GetNetwork(), proxy))
return ConnectSocketDirectly(addrDest, hSocketRet, nTimeout);

SOCKET hSocket = INVALID_SOCKET;

// first connect to proxy server
if (!ConnectSocketDirectly(proxy.first, hSocket, nTimeout))
if (!ConnectSocketDirectly(proxy, hSocket, nTimeout))
return false;

// do socks negotiation
switch (proxy.second) {
case 4:
if (!Socks4(addrDest, hSocket))
return false;
break;
case 5:
if (!Socks5(addrDest.ToStringIP(), addrDest.GetPort(), hSocket))
return false;
break;
default:
closesocket(hSocket);
if (!Socks5(addrDest.ToStringIP(), addrDest.GetPort(), hSocket))
return false;
}

hSocketRet = hSocket;
return true;
Expand All @@ -517,30 +458,24 @@ bool ConnectSocketByName(CService &addr, SOCKET& hSocketRet, const char *pszDest

SOCKET hSocket = INVALID_SOCKET;

proxyType nameproxy;
GetNameProxy(nameproxy);
CService nameProxy;
GetNameProxy(nameProxy);

CService addrResolved(CNetAddr(strDest, fNameLookup && !nameproxy.second), port);
CService addrResolved(CNetAddr(strDest, fNameLookup && !HaveNameProxy()), port);
if (addrResolved.IsValid()) {
addr = addrResolved;
return ConnectSocket(addr, hSocketRet, nTimeout);
}
addr = CService("0.0.0.0:0");
if (!nameproxy.second)

if (!HaveNameProxy())
return false;
if (!ConnectSocketDirectly(nameproxy.first, hSocket, nTimeout))
// first connect to name proxy server
if (!ConnectSocketDirectly(nameProxy, hSocket, nTimeout))
return false;
// do socks negotiation
if (!Socks5(strDest, (unsigned short)port, hSocket))
return false;

switch(nameproxy.second) {
default:
case 4:
closesocket(hSocket);
return false;
case 5:
if (!Socks5(strDest, port, hSocket))
return false;
break;
}

hSocketRet = hSocket;
return true;
Expand Down
6 changes: 3 additions & 3 deletions src/netbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,13 +174,13 @@ class CService : public CNetAddr
}
};

typedef std::pair<CService, int> proxyType;
typedef CService proxyType;

enum Network ParseNetwork(std::string net);
bool SetProxy(enum Network net, CService addrProxy, int nSocksVersion = 5);
bool SetProxy(enum Network net, CService addrProxy);
bool GetProxy(enum Network net, proxyType &proxyInfoOut);
bool IsProxy(const CNetAddr &addr);
bool SetNameProxy(CService addrProxy, int nSocksVersion = 5);
bool SetNameProxy(CService addrProxy);
bool HaveNameProxy();
bool LookupHost(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions = 0, bool fAllowLookup = true);
bool Lookup(const char *pszName, CService& addr, int portDefault = 0, bool fAllowLookup = true);
Expand Down
2 changes: 1 addition & 1 deletion src/qt/diagnosticsdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -629,7 +629,7 @@ void DiagnosticsDialog::TCPFailed(QAbstractSocket::SocketError socket_error)

tooltip += tr("Your network may be using a proxy server to communicate to public IP addresses on the Internet, and "
"the wallet is not configured properly to use it. Please check the proxy settings under Options -> "
"Network -> Connect through SOCKS proxy.");
"Network -> Connect through SOCKS5 proxy.");

break;

Expand Down
24 changes: 2 additions & 22 deletions src/qt/forms/optionsdialog.ui
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,10 @@
<item>
<widget class="QCheckBox" name="connectSocks">
<property name="toolTip">
<string>Connect to the Gridcoin network through a SOCKS proxy (e.g. when connecting through Tor).</string>
<string>Connect to the Gridcoin network through a SOCKS5 proxy (e.g. when connecting through Tor).</string>
</property>
<property name="text">
<string>&amp;Connect through SOCKS proxy:</string>
<string>&amp;Connect through SOCKS5 proxy:</string>
</property>
</widget>
</item>
Expand Down Expand Up @@ -204,26 +204,6 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="socksVersionLabel">
<property name="text">
<string>SOCKS &amp;Version:</string>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="buddy">
<cstring>socksVersion</cstring>
</property>
</widget>
</item>
<item>
<widget class="QValueComboBox" name="socksVersion">
<property name="toolTip">
<string>SOCKS version of the proxy (e.g. 5)</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_Network">
<property name="orientation">
Expand Down
7 changes: 0 additions & 7 deletions src/qt/optionsdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,8 @@ OptionsDialog::OptionsDialog(QWidget* parent)
ui->proxyPort->setEnabled(false);
ui->proxyPort->setValidator(new QIntValidator(1, 65535, this));

ui->socksVersion->setEnabled(false);
ui->socksVersion->addItem("5", 5);
ui->socksVersion->addItem("4", 4);
ui->socksVersion->setCurrentIndex(0);

connect(ui->connectSocks, &QPushButton::toggled, ui->proxyIp, &QWidget::setEnabled);
connect(ui->connectSocks, &QPushButton::toggled, ui->proxyPort, &QWidget::setEnabled);
connect(ui->connectSocks, &QPushButton::toggled, ui->socksVersion, &QWidget::setEnabled);
connect(ui->connectSocks, &QPushButton::clicked, this, &OptionsDialog::showRestartWarning_Proxy);

ui->proxyIp->installEventFilter(this);
Expand Down Expand Up @@ -175,7 +169,6 @@ void OptionsDialog::setMapper()
mapper->addMapping(ui->connectSocks, OptionsModel::ProxyUse);
mapper->addMapping(ui->proxyIp, OptionsModel::ProxyIP);
mapper->addMapping(ui->proxyPort, OptionsModel::ProxyPort);
mapper->addMapping(ui->socksVersion, OptionsModel::ProxySocksVersion);

/* Staking */
mapper->addMapping(ui->enableStaking, OptionsModel::EnableStaking);
Expand Down
Loading