mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-09 10:43:19 -05:00
![Russell Yanofsky](/assets/img/avatar_default.png)
-BEGIN VERIFY SCRIPT- sed -i 's:#include <interfaces/chain.h>:#include <banman.h>\n#include <interfaces/chain.h>\n#include <net.h>\n#include <net_processing.h>:' src/node/context.cpp sed -i 's/namespace interfaces {/class BanMan;\nclass CConnman;\nclass PeerLogicValidation;\n&/' src/node/context.h sed -i 's/std::unique_ptr<interfaces::Chain> chain/std::unique_ptr<CConnman> connman;\n std::unique_ptr<PeerLogicValidation> peer_logic;\n std::unique_ptr<BanMan> banman;\n &/' src/node/context.h sed -i '/std::unique_ptr<[^>]\+> \(g_connman\|g_banman\|peerLogic\);/d' src/banman.h src/net.h src/init.cpp sed -i 's/g_connman/m_context.connman/g' src/interfaces/node.cpp sed -i 's/g_banman/m_context.banman/g' src/interfaces/node.cpp sed -i 's/g_connman/m_node.connman/g' src/interfaces/chain.cpp src/test/setup_common.cpp sed -i 's/g_banman/m_node.banman/g' src/test/setup_common.cpp sed -i 's/g_connman/node.connman/g' src/init.cpp src/node/transaction.cpp sed -i 's/g_banman/node.banman/g' src/init.cpp sed -i 's/peerLogic/node.peer_logic/g' src/init.cpp sed -i 's/g_connman/g_rpc_node->connman/g' src/rpc/mining.cpp src/rpc/net.cpp src/rpc/rawtransaction.cpp sed -i 's/g_banman/g_rpc_node->banman/g' src/rpc/net.cpp sed -i 's/std::shared_ptr<CWallet> wallet =/node.context()->connman = std::move(test.m_node.connman);\n &/' src/qt/test/wallettests.cpp -END VERIFY SCRIPT-
69 lines
2.4 KiB
C++
69 lines
2.4 KiB
C++
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
// Copyright (c) 2009-2017 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
#ifndef BITCOIN_BANMAN_H
|
|
#define BITCOIN_BANMAN_H
|
|
|
|
#include <cstdint>
|
|
#include <memory>
|
|
|
|
#include <addrdb.h>
|
|
#include <fs.h>
|
|
#include <sync.h>
|
|
|
|
// NOTE: When adjusting this, update rpcnet:setban's help ("24h")
|
|
static constexpr unsigned int DEFAULT_MISBEHAVING_BANTIME = 60 * 60 * 24; // Default 24-hour ban
|
|
|
|
class CClientUIInterface;
|
|
class CNetAddr;
|
|
class CSubNet;
|
|
|
|
// Denial-of-service detection/prevention
|
|
// The idea is to detect peers that are behaving
|
|
// badly and disconnect/ban them, but do it in a
|
|
// one-coding-mistake-won't-shatter-the-entire-network
|
|
// way.
|
|
// IMPORTANT: There should be nothing I can give a
|
|
// node that it will forward on that will make that
|
|
// node's peers drop it. If there is, an attacker
|
|
// can isolate a node and/or try to split the network.
|
|
// Dropping a node for sending stuff that is invalid
|
|
// now but might be valid in a later version is also
|
|
// dangerous, because it can cause a network split
|
|
// between nodes running old code and nodes running
|
|
// new code.
|
|
|
|
class BanMan
|
|
{
|
|
public:
|
|
~BanMan();
|
|
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 CSubNet& sub_net, const BanReason& ban_reason, int64_t ban_time_offset = 0, bool since_unix_epoch = false);
|
|
void ClearBanned();
|
|
int IsBannedLevel(CNetAddr net_addr);
|
|
bool IsBanned(CNetAddr net_addr);
|
|
bool IsBanned(CSubNet sub_net);
|
|
bool Unban(const CNetAddr& net_addr);
|
|
bool Unban(const CSubNet& sub_net);
|
|
void GetBanned(banmap_t& banmap);
|
|
void DumpBanlist();
|
|
|
|
private:
|
|
void SetBanned(const banmap_t& banmap);
|
|
bool BannedSetIsDirty();
|
|
//!set the "dirty" flag for the banlist
|
|
void SetBannedSetDirty(bool dirty = true);
|
|
//!clean unused entries (if bantime has expired)
|
|
void SweepBanned();
|
|
|
|
CCriticalSection m_cs_banned;
|
|
banmap_t m_banned GUARDED_BY(m_cs_banned);
|
|
bool m_is_dirty GUARDED_BY(m_cs_banned);
|
|
CClientUIInterface* m_client_interface = nullptr;
|
|
CBanDB m_ban_db;
|
|
const int64_t m_default_ban_time;
|
|
};
|
|
|
|
#endif
|