From 89f3502b566d590b6e608bfce73657e984c15f12 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Wed, 24 Jan 2024 19:39:28 +0100 Subject: [PATCH] Move Server ban check to different point --- src/network/serverpackethandler.cpp | 3 ++ src/server.cpp | 46 +++++++++++++---------------- src/server.h | 1 + 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index 253dcdba8df6..3c6b635008f1 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -95,6 +95,9 @@ void Server::handleCommand_Init(NetworkPacket* pkt) return; } + if (denyIfBanned(peer_id)) + return; + // First byte after command is maximum supported // serialization version u8 client_max; diff --git a/src/server.cpp b/src/server.cpp index 177144c094cd..baacce3f6b38 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1160,31 +1160,6 @@ void Server::ProcessData(NetworkPacket *pkt) ScopeProfiler sp(g_profiler, "Server: Process network packet (sum)"); u32 peer_id = pkt->getPeerId(); - try { - Address address = getPeerAddress(peer_id); - std::string addr_s = address.serializeString(); - - // FIXME: Isn't it a bit excessive to check this for every packet? - if (m_banmanager->isIpBanned(addr_s)) { - std::string ban_name = m_banmanager->getBanName(addr_s); - infostream << "Server: A banned client tried to connect from " - << addr_s << "; banned name was " << ban_name << std::endl; - DenyAccess(peer_id, SERVER_ACCESSDENIED_CUSTOM_STRING, - "Your IP is banned. Banned name was " + ban_name); - return; - } - } catch (con::PeerNotFoundException &e) { - /* - * no peer for this packet found - * most common reason is peer timeout, e.g. peer didn't - * respond for some time, your server was overloaded or - * things like that. - */ - infostream << "Server::ProcessData(): Canceling: peer " - << peer_id << " not found" << std::endl; - return; - } - try { ToServerCommand command = (ToServerCommand) pkt->getCommand(); @@ -3287,6 +3262,11 @@ void Server::reportFormspecPrependModified(const std::string &name) void Server::setIpBanned(const std::string &ip, const std::string &name) { m_banmanager->add(ip, name); + + auto clients = m_clients.getClientIDs(CS_Created); + for (const auto peer_id : clients) { + denyIfBanned(peer_id); + } } void Server::unsetIpBanned(const std::string &ip_or_name) @@ -3299,6 +3279,22 @@ std::string Server::getBanDescription(const std::string &ip_or_name) return m_banmanager->getBanDescription(ip_or_name); } +bool Server::denyIfBanned(session_t peer_id) +{ + Address address = getPeerAddress(peer_id); + std::string addr_s = address.serializeString(); + + if (m_banmanager->isIpBanned(addr_s)) { + std::string ban_name = m_banmanager->getBanName(addr_s); + actionstream << "Server: A banned client tried to connect from " + << addr_s << "; banned name was " << ban_name << std::endl; + DenyAccess(peer_id, SERVER_ACCESSDENIED_CUSTOM_STRING, + "Your IP is banned. Banned name was " + ban_name); + return true; + } + return false; +} + void Server::notifyPlayer(const char *name, const std::wstring &msg) { // m_env will be NULL if the server is initializing diff --git a/src/server.h b/src/server.h index 1c2394fd3dd8..c57dde0d731e 100644 --- a/src/server.h +++ b/src/server.h @@ -245,6 +245,7 @@ class Server : public con::PeerHandler, public MapEventReceiver, void setIpBanned(const std::string &ip, const std::string &name); void unsetIpBanned(const std::string &ip_or_name); std::string getBanDescription(const std::string &ip_or_name); + bool denyIfBanned(session_t peer_id); void notifyPlayer(const char *name, const std::wstring &msg); void notifyPlayers(const std::wstring &msg);