18 : m_client_interface(client_interface), m_ban_db(
std::move(ban_file)), m_default_ban_time(default_ban_time)
35 const auto start{SteadyClock::now()};
39 LogDebug(
BCLog::NET,
"Loaded %d banned node addresses/subnets %dms\n", m_banned.size(),
40 Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
42 LogPrintf(
"Recreating the banlist database\n");
50 static Mutex dump_mutex;
57 if (!m_is_dirty)
return;
62 const auto start{SteadyClock::now()};
68 LogDebug(
BCLog::NET,
"Flushed %d banned node addresses/subnets to disk %dms\n", banmap.size(),
69 Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
93 for (
const auto& it : m_banned) {
97 if (current_time < ban_entry.
nBanUntil && sub_net.
Match(net_addr)) {
108 banmap_t::iterator i = m_banned.find(sub_net);
109 if (i != m_banned.end()) {
111 if (current_time < ban_entry.
nBanUntil) {
121 Ban(sub_net, ban_time_offset, since_unix_epoch);
134 int64_t normalized_ban_time_offset = ban_time_offset;
135 bool normalized_since_unix_epoch = since_unix_epoch;
136 if (ban_time_offset <= 0) {
138 normalized_since_unix_epoch =
false;
140 ban_entry.
nBanUntil = (normalized_since_unix_epoch ? 0 :
GetTime()) + normalized_ban_time_offset;
144 if (m_banned[sub_net].nBanUntil < ban_entry.
nBanUntil) {
145 m_banned[sub_net] = ban_entry;
159 return Unban(sub_net);
166 if (m_banned.erase(sub_net) == 0)
return false;
187 bool notify_ui =
false;
188 banmap_t::iterator it = m_banned.begin();
189 while (it != m_banned.end()) {
193 m_banned.erase(it++);
void DumpBanlist() EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
void Ban(const CNetAddr &net_addr, int64_t ban_time_offset=0, bool since_unix_epoch=false) EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
BanMan(fs::path ban_file, CClientUIInterface *client_interface, int64_t default_ban_time)
void SweepBanned() EXCLUSIVE_LOCKS_REQUIRED(m_banned_mutex)
clean unused entries (if bantime has expired)
const int64_t m_default_ban_time
bool IsBanned(const CNetAddr &net_addr) EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
Return whether net_addr is banned.
void GetBanned(banmap_t &banmap) EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
void ClearBanned() EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
void LoadBanlist() EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
CClientUIInterface * m_client_interface
bool Unban(const CNetAddr &net_addr) EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
bool IsDiscouraged(const CNetAddr &net_addr) EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
Return whether net_addr is discouraged.
void Discourage(const CNetAddr &net_addr) EXCLUSIVE_LOCKS_REQUIRED(!m_banned_mutex)
bool Write(const banmap_t &banSet)
bool Read(banmap_t &banSet)
Read the banlist from disk.
Signals for UI communication.
std::vector< unsigned char > GetAddrBytes() const
std::string ToString() const
bool Match(const CNetAddr &addr) const
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
#define LogDebug(category,...)
std::map< CSubNet, CBanEntry > banmap_t
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
bilingual_str _(ConstevalStringLiteral str)
Translation function.