|
@@ -30,6 +30,42 @@ class TCPListenHandler {
|
|
|
static SocketList sockets;
|
|
|
|
|
|
public:
|
|
|
static bool ValidateClient(SOCKET s, NetworkAddress &address)
|
|
|
{
|
|
|
/* Check if the client is banned. */
|
|
|
for (const auto &entry : _network_ban_list) {
|
|
|
if (address.IsInNetmask(entry)) {
|
|
|
Packet p(Tban_packet);
|
|
|
p.PrepareToSend();
|
|
|
|
|
|
Debug(net, 2, "[{}] Banned ip tried to join ({}), refused", Tsocket::GetName(), entry);
|
|
|
|
|
|
if (p.TransferOut<int>(send, s, 0) < 0) {
|
|
|
Debug(net, 0, "[{}] send failed: {}", Tsocket::GetName(), NetworkError::GetLast().AsString());
|
|
|
}
|
|
|
closesocket(s);
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* Can we handle a new client? */
|
|
|
if (!Tsocket::AllowConnection()) {
|
|
|
/* No more clients allowed?
|
|
|
* Send to the client that we are full! */
|
|
|
Packet p(Tfull_packet);
|
|
|
p.PrepareToSend();
|
|
|
|
|
|
if (p.TransferOut<int>(send, s, 0) < 0) {
|
|
|
Debug(net, 0, "[{}] send failed: {}", Tsocket::GetName(), NetworkError::GetLast().AsString());
|
|
|
}
|
|
|
closesocket(s);
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Accepts clients from the sockets.
|
|
|
* @param ls Socket to accept clients from.
|
|
@@ -53,41 +89,7 @@ public:
|
|
|
|
|
|
SetNoDelay(s); // XXX error handling?
|
|
|
|
|
|
/* Check if the client is banned */
|
|
|
bool banned = false;
|
|
|
for (const auto &entry : _network_ban_list) {
|
|
|
banned = address.IsInNetmask(entry);
|
|
|
if (banned) {
|
|
|
Packet p(Tban_packet);
|
|
|
p.PrepareToSend();
|
|
|
|
|
|
Debug(net, 2, "[{}] Banned ip tried to join ({}), refused", Tsocket::GetName(), entry);
|
|
|
|
|
|
if (p.TransferOut<int>(send, s, 0) < 0) {
|
|
|
Debug(net, 0, "[{}] send failed: {}", Tsocket::GetName(), NetworkError::GetLast().AsString());
|
|
|
}
|
|
|
closesocket(s);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
/* If this client is banned, continue with next client */
|
|
|
if (banned) continue;
|
|
|
|
|
|
/* Can we handle a new client? */
|
|
|
if (!Tsocket::AllowConnection()) {
|
|
|
/* no more clients allowed?
|
|
|
* Send to the client that we are full! */
|
|
|
Packet p(Tfull_packet);
|
|
|
p.PrepareToSend();
|
|
|
|
|
|
if (p.TransferOut<int>(send, s, 0) < 0) {
|
|
|
Debug(net, 0, "[{}] send failed: {}", Tsocket::GetName(), NetworkError::GetLast().AsString());
|
|
|
}
|
|
|
closesocket(s);
|
|
|
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
if (!Tsocket::ValidateClient(s, address)) continue;
|
|
|
Tsocket::AcceptConnection(s, address);
|
|
|
}
|
|
|
}
|