@Override public void run() { Socket connection = null; while (true) { try { connection = _serverSocket.accept(); if (Config.FLOOD_PROTECTION) { ForeignConnection fConnection = _floodProtection.get(connection.getInetAddress().getHostAddress()); if (fConnection != null) { fConnection.connectionNumber += 1; if ((fConnection.connectionNumber > Config.FAST_CONNECTION_LIMIT && (System.currentTimeMillis() - fConnection.lastConnection) < Config.NORMAL_CONNECTION_TIME) || (System.currentTimeMillis() - fConnection.lastConnection) < Config.FAST_CONNECTION_TIME || fConnection.connectionNumber > Config.MAX_CONNECTION_PER_IP) { fConnection.lastConnection = System.currentTimeMillis(); connection.close(); fConnection.connectionNumber -= 1; if (!fConnection.isFlooding) _log.warning( "Potential Flood from " + connection.getInetAddress().getHostAddress()); fConnection.isFlooding = true; continue; } if (fConnection .isFlooding) // if connection was flooding server but now passed the check { fConnection.isFlooding = false; _log.info( connection.getInetAddress().getHostAddress() + " is not considered as flooding anymore."); } fConnection.lastConnection = System.currentTimeMillis(); } else { fConnection = new ForeignConnection(System.currentTimeMillis()); _floodProtection.put(connection.getInetAddress().getHostAddress(), fConnection); } } addClient(connection); } catch (Exception e) { try { connection.close(); } catch (Exception e2) { } if (this.isInterrupted()) { // shutdown? try { _serverSocket.close(); } catch (IOException io) { _log.log(Level.INFO, "", io); } break; } } } }
public void removeFloodProtection(String ip) { if (!Config.FLOOD_PROTECTION) return; ForeignConnection fConnection = _floodProtection.get(ip); if (fConnection != null) { fConnection.connectionNumber -= 1; if (fConnection.connectionNumber == 0) { _floodProtection.remove(ip); } } else { _log.warning( "Removing a flood protection for a GameServer that was not in the connection map??? :" + ip); } }