Skip to content

Commit 575a0ea

Browse files
committed
refactor: move service validation to MnNetInfo, run during setting
1 parent 7e415d5 commit 575a0ea

File tree

4 files changed

+65
-26
lines changed

4 files changed

+65
-26
lines changed

src/evo/deterministicmns.cpp

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,29 +1180,15 @@ void CDeterministicMNManager::CleanupCache(int nHeight)
11801180
template <typename ProTx>
11811181
static bool CheckService(const ProTx& proTx, TxValidationState& state)
11821182
{
1183-
const auto addr{proTx.netInfo.GetPrimary()};
1184-
if (!addr.IsValid()) {
1185-
return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-protx-ipaddr");
1186-
}
1187-
if (Params().RequireRoutableExternalIP() && !addr.IsRoutable()) {
1188-
return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-protx-ipaddr");
1189-
}
1190-
1191-
// TODO: use real args here
1192-
static int mainnetDefaultPort = CreateChainParams(ArgsManager{}, CBaseChainParams::MAIN)->GetDefaultPort();
1193-
if (Params().NetworkIDString() == CBaseChainParams::MAIN) {
1194-
if (addr.GetPort() != mainnetDefaultPort) {
1195-
return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-protx-ipaddr-port");
1196-
}
1197-
} else if (addr.GetPort() == mainnetDefaultPort) {
1198-
return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-protx-ipaddr-port");
1199-
}
1200-
1201-
if (!addr.IsIPv4()) {
1202-
return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-protx-ipaddr");
1203-
}
1204-
1205-
return true;
1183+
switch (proTx.netInfo.Validate()) {
1184+
case NetInfoStatus::BadInput:
1185+
return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-protx-netinfo");
1186+
case NetInfoStatus::BadPort:
1187+
return state.Invalid(TxValidationResult::TX_BAD_SPECIAL, "bad-protx-netinfo-port");
1188+
case NetInfoStatus::Success:
1189+
return true;
1190+
} // no default case, so the compiler can warn about missing cases
1191+
assert(false);
12061192
}
12071193

12081194
template <typename ProTx>

src/evo/netinfo.cpp

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,54 @@
77
#include <chainparams.h>
88
#include <netbase.h>
99
#include <span.h>
10+
#include <util/system.h>
11+
12+
namespace {
13+
static std::unique_ptr<const CChainParams> g_main_params{nullptr};
14+
15+
bool IsNodeOnMainnet() { return Params().NetworkIDString() == CBaseChainParams::MAIN; }
16+
const CChainParams& MainParams()
17+
{
18+
// TODO: use real args here
19+
if (!g_main_params) g_main_params = CreateChainParams(ArgsManager{}, CBaseChainParams::MAIN);
20+
return *g_main_params;
21+
}
22+
} // anonymous namespace
23+
24+
NetInfoStatus MnNetInfo::ValidateService(const CService& service)
25+
{
26+
if (!service.IsValid()) {
27+
return NetInfoStatus::BadInput;
28+
}
29+
if (!service.IsIPv4()) {
30+
return NetInfoStatus::BadInput;
31+
}
32+
if (Params().RequireRoutableExternalIP() && !service.IsRoutable()) {
33+
return NetInfoStatus::BadInput;
34+
}
35+
36+
const auto default_port_main = MainParams().GetDefaultPort();
37+
if (IsNodeOnMainnet() && service.GetPort() != default_port_main) {
38+
// Must use mainnet port on mainnet
39+
return NetInfoStatus::BadPort;
40+
} else if (service.GetPort() == default_port_main) {
41+
// Using mainnet port prohibited outside of mainnet
42+
return NetInfoStatus::BadPort;
43+
}
44+
45+
return NetInfoStatus::Success;
46+
}
1047

1148
NetInfoStatus MnNetInfo::AddEntry(const std::string& input)
1249
{
1350
if (auto service = Lookup(input, /*portDefault=*/Params().GetDefaultPort(), /*fAllowLookup=*/false);
1451
service.has_value()) {
15-
m_addr = service.value();
16-
ASSERT_IF_DEBUG(m_addr != CService());
17-
return NetInfoStatus::Success;
52+
const auto ret = ValidateService(service.value());
53+
if (ret == NetInfoStatus::Success) {
54+
m_addr = service.value();
55+
ASSERT_IF_DEBUG(m_addr != CService());
56+
}
57+
return ret;
1858
}
1959
return NetInfoStatus::BadInput;
2060
}

src/evo/netinfo.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class CService;
1212

1313
enum NetInfoStatus : uint8_t {
1414
BadInput,
15+
BadPort,
1516
Success
1617
};
1718

@@ -20,6 +21,8 @@ constexpr std::string_view NISToString(const NetInfoStatus code)
2021
switch (code) {
2122
case NetInfoStatus::BadInput:
2223
return "invalid address";
24+
case NetInfoStatus::BadPort:
25+
return "invalid port";
2326
case NetInfoStatus::Success:
2427
return "success";
2528
} // no default case, so the compiler can warn about missing cases
@@ -31,6 +34,9 @@ class MnNetInfo
3134
private:
3235
CService m_addr{};
3336

37+
private:
38+
static NetInfoStatus ValidateService(const CService& service);
39+
3440
public:
3541
MnNetInfo() = default;
3642
~MnNetInfo() = default;
@@ -47,6 +53,7 @@ class MnNetInfo
4753

4854
const CService& GetPrimary() const { return m_addr; }
4955
bool IsEmpty() const { return *this == MnNetInfo(); }
56+
NetInfoStatus Validate() const { return ValidateService(m_addr); }
5057

5158
void Clear() { m_addr = CService(); }
5259
};

src/test/evo_netinfo_tests.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,14 @@ const std::vector<std::pair</*input=*/std::string, /*expected_ret=*/NetInfoStatu
1616
{"1.1.1.1:8888", NetInfoStatus::Success},
1717
// Address specified, port should default to default P2P core
1818
{"1.1.1.1", NetInfoStatus::Success},
19+
// Mainnet P2P port on non-mainnet
20+
{"1.1.1.1:9999", NetInfoStatus::BadPort},
21+
// Valid IPv4 formatting but invalid IPv4 address
22+
{"0.0.0.0:8888", NetInfoStatus::BadInput},
1923
// Port greater than uint16_t max
2024
{"1.1.1.1:99999", NetInfoStatus::BadInput},
25+
// Only IPv4 allowed
26+
{"[2606:4700:4700::1111]:8888", NetInfoStatus::BadInput},
2127
// Domains are not allowed
2228
{"example.com:8888", NetInfoStatus::BadInput},
2329
// Incorrect IPv4 address

0 commit comments

Comments
 (0)