0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-12 11:19:08 -05:00

Clean up separated ban/discourage interface

This commit is contained in:
Pieter Wuille 2020-06-10 17:11:38 -07:00
parent b691f2df5f
commit 2ad58381ff
13 changed files with 77 additions and 113 deletions

View file

@ -17,13 +17,6 @@ class CSubNet;
class CAddrMan; class CAddrMan;
class CDataStream; class CDataStream;
typedef enum BanReason
{
BanReasonUnknown = 0,
BanReasonNodeMisbehaving = 1,
BanReasonManuallyAdded = 2
} BanReason;
class CBanEntry class CBanEntry
{ {
public: public:
@ -31,7 +24,6 @@ public:
int nVersion; int nVersion;
int64_t nCreateTime; int64_t nCreateTime;
int64_t nBanUntil; int64_t nBanUntil;
uint8_t banReason;
CBanEntry() CBanEntry()
{ {
@ -44,31 +36,17 @@ public:
nCreateTime = nCreateTimeIn; nCreateTime = nCreateTimeIn;
} }
explicit CBanEntry(int64_t n_create_time_in, BanReason ban_reason_in) : CBanEntry(n_create_time_in) SERIALIZE_METHODS(CBanEntry, obj)
{ {
banReason = ban_reason_in; uint8_t ban_reason = 2; //! For backward compatibility
READWRITE(obj.nVersion, obj.nCreateTime, obj.nBanUntil, ban_reason);
} }
SERIALIZE_METHODS(CBanEntry, obj) { READWRITE(obj.nVersion, obj.nCreateTime, obj.nBanUntil, obj.banReason); }
void SetNull() void SetNull()
{ {
nVersion = CBanEntry::CURRENT_VERSION; nVersion = CBanEntry::CURRENT_VERSION;
nCreateTime = 0; nCreateTime = 0;
nBanUntil = 0; nBanUntil = 0;
banReason = BanReasonUnknown;
}
std::string banReasonToString() const
{
switch (banReason) {
case BanReasonNodeMisbehaving:
return "node misbehaving";
case BanReasonManuallyAdded:
return "manually added";
default:
return "unknown";
}
} }
}; };

View file

@ -68,30 +68,16 @@ void BanMan::ClearBanned()
if (m_client_interface) m_client_interface->BannedListChanged(); if (m_client_interface) m_client_interface->BannedListChanged();
} }
int BanMan::IsBannedLevel(CNetAddr net_addr) bool BanMan::IsDiscouraged(const CNetAddr& net_addr)
{ {
// Returns the most severe level of banning that applies to this address.
// 0 - Not banned
// 1 - Automatic misbehavior ban
// 2 - Any other ban
auto current_time = GetTime();
LOCK(m_cs_banned); LOCK(m_cs_banned);
for (const auto& it : m_banned) { return m_discouraged.contains(net_addr.GetAddrBytes());
CSubNet sub_net = it.first;
CBanEntry ban_entry = it.second;
if (current_time < ban_entry.nBanUntil && sub_net.Match(net_addr)) {
return 2;
}
}
return m_discouraged.contains(net_addr.GetAddrBytes()) ? 1 : 0;
} }
bool BanMan::IsBanned(CNetAddr net_addr) bool BanMan::IsBanned(const CNetAddr& net_addr)
{ {
auto current_time = GetTime(); auto current_time = GetTime();
LOCK(m_cs_banned); LOCK(m_cs_banned);
if (m_discouraged.contains(net_addr.GetAddrBytes())) return true;
for (const auto& it : m_banned) { for (const auto& it : m_banned) {
CSubNet sub_net = it.first; CSubNet sub_net = it.first;
CBanEntry ban_entry = it.second; CBanEntry ban_entry = it.second;
@ -103,7 +89,7 @@ bool BanMan::IsBanned(CNetAddr net_addr)
return false; return false;
} }
bool BanMan::IsBanned(CSubNet sub_net) bool BanMan::IsBanned(const CSubNet& sub_net)
{ {
auto current_time = GetTime(); auto current_time = GetTime();
LOCK(m_cs_banned); LOCK(m_cs_banned);
@ -117,21 +103,21 @@ bool BanMan::IsBanned(CSubNet sub_net)
return false; return false;
} }
void BanMan::Ban(const CNetAddr& net_addr, const BanReason& ban_reason, int64_t ban_time_offset, bool since_unix_epoch) void BanMan::Ban(const CNetAddr& net_addr, int64_t ban_time_offset, bool since_unix_epoch)
{ {
if (ban_reason == BanReasonNodeMisbehaving) {
LOCK(m_cs_banned);
m_discouraged.insert(net_addr.GetAddrBytes());
return;
}
CSubNet sub_net(net_addr); CSubNet sub_net(net_addr);
Ban(sub_net, ban_reason, ban_time_offset, since_unix_epoch); Ban(sub_net, ban_time_offset, since_unix_epoch);
} }
void BanMan::Ban(const CSubNet& sub_net, const BanReason& ban_reason, int64_t ban_time_offset, bool since_unix_epoch) void BanMan::Discourage(const CNetAddr& net_addr)
{ {
assert(ban_reason == BanReasonManuallyAdded); LOCK(m_cs_banned);
CBanEntry ban_entry(GetTime(), ban_reason); m_discouraged.insert(net_addr.GetAddrBytes());
}
void BanMan::Ban(const CSubNet& sub_net, int64_t ban_time_offset, bool since_unix_epoch)
{
CBanEntry ban_entry(GetTime());
int64_t normalized_ban_time_offset = ban_time_offset; int64_t normalized_ban_time_offset = ban_time_offset;
bool normalized_since_unix_epoch = since_unix_epoch; bool normalized_since_unix_epoch = since_unix_epoch;
@ -151,8 +137,8 @@ void BanMan::Ban(const CSubNet& sub_net, const BanReason& ban_reason, int64_t ba
} }
if (m_client_interface) m_client_interface->BannedListChanged(); if (m_client_interface) m_client_interface->BannedListChanged();
//store banlist to disk immediately if user requested ban //store banlist to disk immediately
if (ban_reason == BanReasonManuallyAdded) DumpBanlist(); DumpBanlist();
} }
bool BanMan::Unban(const CNetAddr& net_addr) bool BanMan::Unban(const CNetAddr& net_addr)

View file

@ -59,12 +59,20 @@ class BanMan
public: public:
~BanMan(); ~BanMan();
BanMan(fs::path ban_file, CClientUIInterface* client_interface, int64_t default_ban_time); BanMan(fs::path ban_file, CClientUIInterface* client_interface, int64_t default_ban_time);
void Ban(const CNetAddr& net_addr, const BanReason& ban_reason, int64_t ban_time_offset = 0, bool since_unix_epoch = false); void Ban(const CNetAddr& net_addr, int64_t ban_time_offset = 0, bool since_unix_epoch = false);
void Ban(const CSubNet& sub_net, const BanReason& ban_reason, int64_t ban_time_offset = 0, bool since_unix_epoch = false); void Ban(const CSubNet& sub_net, int64_t ban_time_offset = 0, bool since_unix_epoch = false);
void Discourage(const CNetAddr& net_addr);
void ClearBanned(); void ClearBanned();
int IsBannedLevel(CNetAddr net_addr);
bool IsBanned(CNetAddr net_addr); //! Return whether net_addr is banned
bool IsBanned(CSubNet sub_net); bool IsBanned(const CNetAddr& net_addr);
//! Return whether sub_net is exactly banned
bool IsBanned(const CSubNet& sub_net);
//! Return whether net_addr is discouraged.
bool IsDiscouraged(const CNetAddr& net_addr);
bool Unban(const CNetAddr& net_addr); bool Unban(const CNetAddr& net_addr);
bool Unban(const CSubNet& sub_net); bool Unban(const CSubNet& sub_net);
void GetBanned(banmap_t& banmap); void GetBanned(banmap_t& banmap);

View file

@ -146,10 +146,10 @@ public:
} }
return false; return false;
} }
bool ban(const CNetAddr& net_addr, BanReason reason, int64_t ban_time_offset) override bool ban(const CNetAddr& net_addr, int64_t ban_time_offset) override
{ {
if (m_context.banman) { if (m_context.banman) {
m_context.banman->Ban(net_addr, reason, ban_time_offset); m_context.banman->Ban(net_addr, ban_time_offset);
return true; return true;
} }
return false; return false;

View file

@ -122,7 +122,7 @@ public:
virtual bool getBanned(banmap_t& banmap) = 0; virtual bool getBanned(banmap_t& banmap) = 0;
//! Ban node. //! Ban node.
virtual bool ban(const CNetAddr& net_addr, BanReason reason, int64_t ban_time_offset) = 0; virtual bool ban(const CNetAddr& net_addr, int64_t ban_time_offset) = 0;
//! Unban node. //! Unban node.
virtual bool unban(const CSubNet& ip) = 0; virtual bool unban(const CSubNet& ip) = 0;

View file

@ -1010,10 +1010,9 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
// on all platforms. Set it again here just to be sure. // on all platforms. Set it again here just to be sure.
SetSocketNoDelay(hSocket); SetSocketNoDelay(hSocket);
int bannedlevel = m_banman ? m_banman->IsBannedLevel(addr) : 0;
// Don't accept connections from banned peers. // Don't accept connections from banned peers.
if (!NetPermissions::HasFlag(permissionFlags, NetPermissionFlags::PF_NOBAN) && bannedlevel == 2) bool banned = m_banman->IsBanned(addr);
if (!NetPermissions::HasFlag(permissionFlags, NetPermissionFlags::PF_NOBAN) && banned)
{ {
LogPrint(BCLog::NET, "connection from %s dropped (banned)\n", addr.ToString()); LogPrint(BCLog::NET, "connection from %s dropped (banned)\n", addr.ToString());
CloseSocket(hSocket); CloseSocket(hSocket);
@ -1021,7 +1020,8 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
} }
// Only accept connections from discouraged peers if our inbound slots aren't (almost) full. // Only accept connections from discouraged peers if our inbound slots aren't (almost) full.
if (!NetPermissions::HasFlag(permissionFlags, NetPermissionFlags::PF_NOBAN) && nInbound + 1 >= nMaxInbound && bannedlevel >= 1) bool discouraged = m_banman->IsDiscouraged(addr);
if (!NetPermissions::HasFlag(permissionFlags, NetPermissionFlags::PF_NOBAN) && nInbound + 1 >= nMaxInbound && discouraged)
{ {
LogPrint(BCLog::NET, "connection from %s dropped (discouraged)\n", addr.ToString()); LogPrint(BCLog::NET, "connection from %s dropped (discouraged)\n", addr.ToString());
CloseSocket(hSocket); CloseSocket(hSocket);
@ -1051,7 +1051,7 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
pnode->m_permissionFlags = permissionFlags; pnode->m_permissionFlags = permissionFlags;
// If this flag is present, the user probably expect that RPC and QT report it as whitelisted (backward compatibility) // If this flag is present, the user probably expect that RPC and QT report it as whitelisted (backward compatibility)
pnode->m_legacyWhitelisted = legacyWhitelisted; pnode->m_legacyWhitelisted = legacyWhitelisted;
pnode->m_prefer_evict = bannedlevel > 0; pnode->m_prefer_evict = discouraged;
m_msgproc->InitializeNode(pnode); m_msgproc->InitializeNode(pnode);
LogPrint(BCLog::NET, "connection from %s accepted\n", addr.ToString()); LogPrint(BCLog::NET, "connection from %s accepted\n", addr.ToString());
@ -2052,10 +2052,10 @@ void CConnman::OpenNetworkConnection(const CAddress& addrConnect, bool fCountFai
return; return;
} }
if (!pszDest) { if (!pszDest) {
if (IsLocal(addrConnect) || bool banned_or_discouraged = m_banman && (m_banman->IsDiscouraged(addrConnect) || m_banman->IsBanned(addrConnect));
FindNode(static_cast<CNetAddr>(addrConnect)) || (m_banman && m_banman->IsBanned(addrConnect)) || if (IsLocal(addrConnect) || FindNode(static_cast<CNetAddr>(addrConnect)) || banned_or_discouraged || FindNode(addrConnect.ToStringIPPort())) {
FindNode(addrConnect.ToStringIPPort()))
return; return;
}
} else if (FindNode(std::string(pszDest))) } else if (FindNode(std::string(pszDest)))
return; return;

View file

@ -24,7 +24,7 @@ enum NetPermissionFlags
// Always relay transactions from this peer, even if already in mempool // Always relay transactions from this peer, even if already in mempool
// Keep parameter interaction: forcerelay implies relay // Keep parameter interaction: forcerelay implies relay
PF_FORCERELAY = (1U << 2) | PF_RELAY, PF_FORCERELAY = (1U << 2) | PF_RELAY,
// Can't be banned for misbehavior // Can't be banned/disconnected/discouraged for misbehavior
PF_NOBAN = (1U << 4), PF_NOBAN = (1U << 4),
// Can query the mempool // Can query the mempool
PF_MEMPOOL = (1U << 5), PF_MEMPOOL = (1U << 5),

View file

@ -252,8 +252,8 @@ struct CNodeState {
bool fCurrentlyConnected; bool fCurrentlyConnected;
//! Accumulated misbehaviour score for this peer. //! Accumulated misbehaviour score for this peer.
int nMisbehavior; int nMisbehavior;
//! Whether this peer should be disconnected and banned (unless whitelisted). //! Whether this peer should be disconnected and marked as discouraged (unless whitelisted with noban).
bool fShouldBan; bool m_should_discourage;
//! String name of this peer (debugging/logging purposes). //! String name of this peer (debugging/logging purposes).
const std::string name; const std::string name;
//! The best known block we know this peer has announced. //! The best known block we know this peer has announced.
@ -404,7 +404,7 @@ struct CNodeState {
{ {
fCurrentlyConnected = false; fCurrentlyConnected = false;
nMisbehavior = 0; nMisbehavior = 0;
fShouldBan = false; m_should_discourage = false;
pindexBestKnownBlock = nullptr; pindexBestKnownBlock = nullptr;
hashLastUnknownBlock.SetNull(); hashLastUnknownBlock.SetNull();
pindexLastCommonBlock = nullptr; pindexLastCommonBlock = nullptr;
@ -1036,7 +1036,7 @@ void Misbehaving(NodeId pnode, int howmuch, const std::string& message) EXCLUSIV
if (state->nMisbehavior >= banscore && state->nMisbehavior - howmuch < banscore) if (state->nMisbehavior >= banscore && state->nMisbehavior - howmuch < banscore)
{ {
LogPrint(BCLog::NET, "%s: %s peer=%d (%d -> %d) DISCOURAGE THRESHOLD EXCEEDED%s\n", __func__, state->name, pnode, state->nMisbehavior-howmuch, state->nMisbehavior, message_prefixed); LogPrint(BCLog::NET, "%s: %s peer=%d (%d -> %d) DISCOURAGE THRESHOLD EXCEEDED%s\n", __func__, state->name, pnode, state->nMisbehavior-howmuch, state->nMisbehavior, message_prefixed);
state->fShouldBan = true; state->m_should_discourage = true;
} else } else
LogPrint(BCLog::NET, "%s: %s peer=%d (%d -> %d)%s\n", __func__, state->name, pnode, state->nMisbehavior-howmuch, state->nMisbehavior, message_prefixed); LogPrint(BCLog::NET, "%s: %s peer=%d (%d -> %d)%s\n", __func__, state->name, pnode, state->nMisbehavior-howmuch, state->nMisbehavior, message_prefixed);
} }
@ -2476,7 +2476,8 @@ void ProcessMessage(
if (addr.nTime <= 100000000 || addr.nTime > nNow + 10 * 60) if (addr.nTime <= 100000000 || addr.nTime > nNow + 10 * 60)
addr.nTime = nNow - 5 * 24 * 60 * 60; addr.nTime = nNow - 5 * 24 * 60 * 60;
pfrom.AddAddressKnown(addr); pfrom.AddAddressKnown(addr);
if (banman->IsBanned(addr)) continue; // Do not process banned addresses beyond remembering we received them if (banman->IsDiscouraged(addr)) continue; // Do not process banned/discouraged addresses beyond remembering we received them
if (banman->IsBanned(addr)) continue;
bool fReachable = IsReachable(addr); bool fReachable = IsReachable(addr);
if (addr.nTime > nSince && !pfrom.fGetAddr && vAddr.size() <= 10 && addr.IsRoutable()) if (addr.nTime > nSince && !pfrom.fGetAddr && vAddr.size() <= 10 && addr.IsRoutable())
{ {
@ -3329,7 +3330,7 @@ void ProcessMessage(
std::vector<CAddress> vAddr = connman->GetAddresses(); std::vector<CAddress> vAddr = connman->GetAddresses();
FastRandomContext insecure_rand; FastRandomContext insecure_rand;
for (const CAddress &addr : vAddr) { for (const CAddress &addr : vAddr) {
if (!banman->IsBanned(addr)) { if (!banman->IsDiscouraged(addr) && !banman->IsBanned(addr)) {
pfrom.PushAddress(addr, insecure_rand); pfrom.PushAddress(addr, insecure_rand);
} }
} }
@ -3564,26 +3565,26 @@ void ProcessMessage(
return; return;
} }
bool PeerLogicValidation::CheckIfBanned(CNode& pnode) bool PeerLogicValidation::MaybeDiscourageAndDisconnect(CNode& pnode)
{ {
AssertLockHeld(cs_main); AssertLockHeld(cs_main);
CNodeState &state = *State(pnode.GetId()); CNodeState &state = *State(pnode.GetId());
if (state.fShouldBan) { if (state.m_should_discourage) {
state.fShouldBan = false; state.m_should_discourage = false;
if (pnode.HasPermission(PF_NOBAN)) if (pnode.HasPermission(PF_NOBAN)) {
LogPrintf("Warning: not punishing whitelisted peer %s!\n", pnode.addr.ToString()); LogPrintf("Warning: not punishing whitelisted peer %s!\n", pnode.addr.ToString());
else if (pnode.m_manual_connection) } else if (pnode.m_manual_connection) {
LogPrintf("Warning: not punishing manually-connected peer %s!\n", pnode.addr.ToString()); LogPrintf("Warning: not punishing manually-connected peer %s!\n", pnode.addr.ToString());
else if (pnode.addr.IsLocal()) { } else if (pnode.addr.IsLocal()) {
// Disconnect but don't discourage this local node // Disconnect but don't discourage this local node
LogPrintf("Warning: disconnecting but not discouraging local peer %s!\n", pnode.addr.ToString()); LogPrintf("Warning: disconnecting but not discouraging local peer %s!\n", pnode.addr.ToString());
pnode.fDisconnect = true; pnode.fDisconnect = true;
} else { } else {
// Disconnect and ban all nodes sharing the address // Disconnect and discourage all nodes sharing the address
LogPrintf("Disconnecting and discouraging peer %s!\n", pnode.addr.ToString()); LogPrintf("Disconnecting and discouraging peer %s!\n", pnode.addr.ToString());
if (m_banman) { if (m_banman) {
m_banman->Ban(pnode.addr, BanReasonNodeMisbehaving); m_banman->Discourage(pnode.addr);
} }
connman->DisconnectNode(pnode.addr); connman->DisconnectNode(pnode.addr);
} }
@ -3683,7 +3684,7 @@ bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& inter
} }
LOCK(cs_main); LOCK(cs_main);
CheckIfBanned(*pfrom); MaybeDiscourageAndDisconnect(*pfrom);
return fMoreWork; return fMoreWork;
} }
@ -3886,7 +3887,7 @@ bool PeerLogicValidation::SendMessages(CNode* pto)
if (!lockMain) if (!lockMain)
return true; return true;
if (CheckIfBanned(*pto)) return true; if (MaybeDiscourageAndDisconnect(*pto)) return true;
CNodeState &state = *State(pto->GetId()); CNodeState &state = *State(pto->GetId());

View file

@ -31,7 +31,7 @@ private:
ChainstateManager& m_chainman; ChainstateManager& m_chainman;
CTxMemPool& m_mempool; CTxMemPool& m_mempool;
bool CheckIfBanned(CNode& pnode) EXCLUSIVE_LOCKS_REQUIRED(cs_main); bool MaybeDiscourageAndDisconnect(CNode& pnode) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
public: public:
PeerLogicValidation(CConnman* connman, BanMan* banman, CScheduler& scheduler, ChainstateManager& chainman, CTxMemPool& pool); PeerLogicValidation(CConnman* connman, BanMan* banman, CScheduler& scheduler, ChainstateManager& chainman, CTxMemPool& pool);

View file

@ -1218,7 +1218,7 @@ void RPCConsole::banSelectedNode(int bantime)
// Find possible nodes, ban it and clear the selected node // Find possible nodes, ban it and clear the selected node
const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow); const CNodeCombinedStats *stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow);
if (stats) { if (stats) {
m_node.ban(stats->nodeStats.addr, BanReasonManuallyAdded, bantime); m_node.ban(stats->nodeStats.addr, bantime);
m_node.disconnectByAddress(stats->nodeStats.addr); m_node.disconnectByAddress(stats->nodeStats.addr);
} }
} }

View file

@ -601,8 +601,7 @@ static UniValue setban(const JSONRPCRequest& request)
if (strCommand == "add") if (strCommand == "add")
{ {
if ((isSubnet && node.banman->IsBanned(subNet)) || if (isSubnet ? node.banman->IsBanned(subNet) : node.banman->IsBanned(netAddr)) {
(!isSubnet && node.banman->IsBannedLevel(netAddr) == BanReasonManuallyAdded)) {
throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: IP/Subnet already banned"); throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: IP/Subnet already banned");
} }
@ -615,12 +614,12 @@ static UniValue setban(const JSONRPCRequest& request)
absolute = true; absolute = true;
if (isSubnet) { if (isSubnet) {
node.banman->Ban(subNet, BanReasonManuallyAdded, banTime, absolute); node.banman->Ban(subNet, banTime, absolute);
if (node.connman) { if (node.connman) {
node.connman->DisconnectNode(subNet); node.connman->DisconnectNode(subNet);
} }
} else { } else {
node.banman->Ban(netAddr, BanReasonManuallyAdded, banTime, absolute); node.banman->Ban(netAddr, banTime, absolute);
if (node.connman) { if (node.connman) {
node.connman->DisconnectNode(netAddr); node.connman->DisconnectNode(netAddr);
} }

View file

@ -238,8 +238,8 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
LOCK2(cs_main, dummyNode1.cs_sendProcessing); LOCK2(cs_main, dummyNode1.cs_sendProcessing);
BOOST_CHECK(peerLogic->SendMessages(&dummyNode1)); BOOST_CHECK(peerLogic->SendMessages(&dummyNode1));
} }
BOOST_CHECK(banman->IsBanned(addr1)); BOOST_CHECK(banman->IsDiscouraged(addr1));
BOOST_CHECK(!banman->IsBanned(ip(0xa0b0c001|0x0000ff00))); // Different IP, not banned BOOST_CHECK(!banman->IsDiscouraged(ip(0xa0b0c001|0x0000ff00))); // Different IP, not banned
CAddress addr2(ip(0xa0b0c002), NODE_NONE); CAddress addr2(ip(0xa0b0c002), NODE_NONE);
CNode dummyNode2(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr2, 1, 1, CAddress(), "", true); CNode dummyNode2(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr2, 1, 1, CAddress(), "", true);
@ -255,8 +255,8 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
LOCK2(cs_main, dummyNode2.cs_sendProcessing); LOCK2(cs_main, dummyNode2.cs_sendProcessing);
BOOST_CHECK(peerLogic->SendMessages(&dummyNode2)); BOOST_CHECK(peerLogic->SendMessages(&dummyNode2));
} }
BOOST_CHECK(!banman->IsBanned(addr2)); // 2 not banned yet... BOOST_CHECK(!banman->IsDiscouraged(addr2)); // 2 not banned yet...
BOOST_CHECK(banman->IsBanned(addr1)); // ... but 1 still should be BOOST_CHECK(banman->IsDiscouraged(addr1)); // ... but 1 still should be
{ {
LOCK(cs_main); LOCK(cs_main);
Misbehaving(dummyNode2.GetId(), 50); Misbehaving(dummyNode2.GetId(), 50);
@ -265,7 +265,7 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
LOCK2(cs_main, dummyNode2.cs_sendProcessing); LOCK2(cs_main, dummyNode2.cs_sendProcessing);
BOOST_CHECK(peerLogic->SendMessages(&dummyNode2)); BOOST_CHECK(peerLogic->SendMessages(&dummyNode2));
} }
BOOST_CHECK(banman->IsBanned(addr2)); BOOST_CHECK(banman->IsDiscouraged(addr2));
bool dummy; bool dummy;
peerLogic->FinalizeNode(dummyNode1.GetId(), dummy); peerLogic->FinalizeNode(dummyNode1.GetId(), dummy);
@ -294,7 +294,7 @@ BOOST_AUTO_TEST_CASE(DoS_banscore)
LOCK2(cs_main, dummyNode1.cs_sendProcessing); LOCK2(cs_main, dummyNode1.cs_sendProcessing);
BOOST_CHECK(peerLogic->SendMessages(&dummyNode1)); BOOST_CHECK(peerLogic->SendMessages(&dummyNode1));
} }
BOOST_CHECK(!banman->IsBanned(addr1)); BOOST_CHECK(!banman->IsDiscouraged(addr1));
{ {
LOCK(cs_main); LOCK(cs_main);
Misbehaving(dummyNode1.GetId(), 10); Misbehaving(dummyNode1.GetId(), 10);
@ -303,7 +303,7 @@ BOOST_AUTO_TEST_CASE(DoS_banscore)
LOCK2(cs_main, dummyNode1.cs_sendProcessing); LOCK2(cs_main, dummyNode1.cs_sendProcessing);
BOOST_CHECK(peerLogic->SendMessages(&dummyNode1)); BOOST_CHECK(peerLogic->SendMessages(&dummyNode1));
} }
BOOST_CHECK(!banman->IsBanned(addr1)); BOOST_CHECK(!banman->IsDiscouraged(addr1));
{ {
LOCK(cs_main); LOCK(cs_main);
Misbehaving(dummyNode1.GetId(), 1); Misbehaving(dummyNode1.GetId(), 1);
@ -312,7 +312,7 @@ BOOST_AUTO_TEST_CASE(DoS_banscore)
LOCK2(cs_main, dummyNode1.cs_sendProcessing); LOCK2(cs_main, dummyNode1.cs_sendProcessing);
BOOST_CHECK(peerLogic->SendMessages(&dummyNode1)); BOOST_CHECK(peerLogic->SendMessages(&dummyNode1));
} }
BOOST_CHECK(banman->IsBanned(addr1)); BOOST_CHECK(banman->IsDiscouraged(addr1));
gArgs.ForceSetArg("-banscore", ToString(DEFAULT_BANSCORE_THRESHOLD)); gArgs.ForceSetArg("-banscore", ToString(DEFAULT_BANSCORE_THRESHOLD));
bool dummy; bool dummy;
@ -344,7 +344,7 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
LOCK2(cs_main, dummyNode.cs_sendProcessing); LOCK2(cs_main, dummyNode.cs_sendProcessing);
BOOST_CHECK(peerLogic->SendMessages(&dummyNode)); BOOST_CHECK(peerLogic->SendMessages(&dummyNode));
} }
BOOST_CHECK(banman->IsBanned(addr)); BOOST_CHECK(banman->IsDiscouraged(addr));
bool dummy; bool dummy;
peerLogic->FinalizeNode(dummyNode.GetId(), dummy); peerLogic->FinalizeNode(dummyNode.GetId(), dummy);

View file

@ -18,18 +18,11 @@ void test_one_input(const std::vector<uint8_t>& buffer)
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
const CBanEntry ban_entry = [&] { const CBanEntry ban_entry = [&] {
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 3)) { switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 2)) {
case 0: case 0:
return CBanEntry{fuzzed_data_provider.ConsumeIntegral<int64_t>()}; return CBanEntry{fuzzed_data_provider.ConsumeIntegral<int64_t>()};
break; break;
case 1: case 1: {
return CBanEntry{fuzzed_data_provider.ConsumeIntegral<int64_t>(), fuzzed_data_provider.PickValueInArray<BanReason>({
BanReason::BanReasonUnknown,
BanReason::BanReasonNodeMisbehaving,
BanReason::BanReasonManuallyAdded,
})};
break;
case 2: {
const std::optional<CBanEntry> ban_entry = ConsumeDeserializable<CBanEntry>(fuzzed_data_provider); const std::optional<CBanEntry> ban_entry = ConsumeDeserializable<CBanEntry>(fuzzed_data_provider);
if (ban_entry) { if (ban_entry) {
return *ban_entry; return *ban_entry;
@ -39,5 +32,4 @@ void test_one_input(const std::vector<uint8_t>& buffer)
} }
return CBanEntry{}; return CBanEntry{};
}(); }();
assert(!ban_entry.banReasonToString().empty());
} }