Skip to content

Commit

Permalink
Move Server ban check to different point
Browse files Browse the repository at this point in the history
  • Loading branch information
sfan5 committed Jan 27, 2024
1 parent 5dbc1d4 commit 89f3502
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 25 deletions.
3 changes: 3 additions & 0 deletions src/network/serverpackethandler.cpp
Expand Up @@ -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;
Expand Down
46 changes: 21 additions & 25 deletions src/server.cpp
Expand Up @@ -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();

Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions src/server.h
Expand Up @@ -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);
Expand Down

0 comments on commit 89f3502

Please sign in to comment.