Code: Select all
/* * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package nef.sf.l2j.util; import java.net.InetAddress;import java.nio.channels.SocketChannel;import java.util.ArrayList;import java.util.HashMap;import java.util.Map.Entry; import org.mmocore.network.IAcceptFilter; /** * Formatted Forsaiken's IPv4 filter [DrHouse] * * @author Forsaiken * */public class IPv4Filter implements IAcceptFilter, Runnable{ private HashMap<Integer, Flood> _ipFloodMap; private static final long SLEEP_TIME = 5000; public IPv4Filter() { _ipFloodMap = new HashMap<Integer, Flood>(); Thread t = new Thread(this); t.setDaemon(true); t.start(); } /** * * @param ip * @return */ private static final int hash(byte[] ip) { return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24 & 0xFF000000; } protected static final class Flood { long lastAccess; int trys; Flood() { lastAccess = System.currentTimeMillis(); trys = 0; } } @Override public boolean accept(SocketChannel sc) { InetAddress addr = sc.socket().getInetAddress(); int h = hash(addr.getAddress()); long current = System.currentTimeMillis(); Flood f; synchronized (_ipFloodMap) { f = _ipFloodMap.get(h); } if (f != null) { if (f.trys == -1) { f.lastAccess = current; return false; } if (f.lastAccess + 1000 > current) { f.lastAccess = current; if (f.trys >= 3) { f.trys = -1; return false; } f.trys++; } else { f.lastAccess = current; } } else { synchronized (_ipFloodMap) { _ipFloodMap.put(h, new Flood()); } } return true; } @Override public void run() { while (true) { long reference = System.currentTimeMillis() - (1000 * 300); ArrayList<Integer> toRemove = new ArrayList<Integer>(50); synchronized (_ipFloodMap) { for (Entry<Integer, Flood> e : _ipFloodMap.entrySet()) { Flood f = e.getValue(); if (f.lastAccess < reference) toRemove.add(e.getKey()); } } synchronized (_ipFloodMap) { for (Integer i : toRemove) { _ipFloodMap.remove(i); } } try { Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { } } } }
and i sed this patch.
Code: Select all
Index: java/net/sf/l2j/gameserver/GameServer.java===================================================================--- java/net/sf/l2j/gameserver/GameServer.java (revision 1475)+++ java/net/sf/l2j/gameserver/GameServer.java (working copy)@@ -121,6 +121,7 @@ import net.sf.l2j.gameserver.util.DynamicExtension; import net.sf.l2j.status.Status; import net.sf.l2j.util.DeadLockDetector;+import net.sf.l2j.util.IPv4Filter; import org.mmocore.network.SelectorConfig; import org.mmocore.network.SelectorThread;@@ -439,7 +440,7 @@ sc.SLEEP_TIME = Config.MMO_SELECTOR_SLEEP_TIME; sc.HELPER_BUFFER_COUNT = Config.MMO_HELPER_BUFFER_COUNT; final L2GamePacketHandler gph = new L2GamePacketHandler();- _selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, null);+ _selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, new IPv4Filter()); InetAddress bindAddress = null; if (!Config.GAMESERVER_HOSTNAME.equals("*"))Index: java/net/sf/l2j/util/IPv4Filter.java===================================================================--- java/net/sf/l2j/util/IPv4Filter.java (revision 0)+++ java/net/sf/l2j/util/IPv4Filter.java (revision 0)@@ -0,0 +1,151 @@+/*+ * This program is free software: you can redistribute it and/or modify it under+ * the terms of the GNU General Public License as published by the Free Software+ * Foundation, either version 3 of the License, or (at your option) any later+ * version.+ * + * This program is distributed in the hope that it will be useful, but WITHOUT+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more+ * details.+ * + * You should have received a copy of the GNU General Public License along with+ * this program. If not, see <http://www.gnu.org/licenses/>.+ */++package net.sf.l2j.util;++import java.net.InetAddress;+import java.nio.channels.SocketChannel;+import java.util.ArrayList;+import java.util.HashMap;+import java.util.Map.Entry;++import org.mmocore.network.IAcceptFilter;++/**+ * Formatted Forsaiken's IPv4 filter [DrHouse]+ * + * @author Forsaiken+ *+ */+public class IPv4Filter implements IAcceptFilter, Runnable+{+ private HashMap<Integer, Flood> _ipFloodMap;+ private static final long SLEEP_TIME = 5000;+ + public IPv4Filter()+ {+ _ipFloodMap = new HashMap<Integer, Flood>();+ Thread t = new Thread(this);+ t.setDaemon(true);+ t.start();+ }+ /**+ * + * @param ip+ * @return+ */+ private static final int hash(byte[] ip)+ {+ return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24 & 0xFF000000;+ }+ + protected static final class Flood+ {+ long lastAccess;+ int trys;+ + Flood()+ {+ lastAccess = System.currentTimeMillis();+ trys = 0;+ }+ }+ + @Override+ public boolean accept(SocketChannel sc)+ {+ InetAddress addr = sc.socket().getInetAddress();+ int h = hash(addr.getAddress());+ + long current = System.currentTimeMillis();+ Flood f;+ synchronized (_ipFloodMap)+ {+ f = _ipFloodMap.get(h);+ }+ if (f != null)+ {+ if (f.trys == -1)+ {+ f.lastAccess = current;+ return false;+ }+ + if (f.lastAccess + 1000 > current)+ {+ f.lastAccess = current;+ + if (f.trys >= 3)+ {+ f.trys = -1;+ return false;+ }+ + f.trys++;+ }+ else+ {+ f.lastAccess = current;+ }+ }+ else+ {+ synchronized (_ipFloodMap)+ {+ _ipFloodMap.put(h, new Flood());+ }+ }+ + return true;+ }++ @Override+ public void run()+ {+ while (true)+ {+ long reference = System.currentTimeMillis() - (1000 * 300);+ ArrayList<Integer> toRemove = new ArrayList<Integer>(50);+ + synchronized (_ipFloodMap)+ {+ for (Entry<Integer, Flood> e : _ipFloodMap.entrySet())+ {+ Flood f = e.getValue();+ if (f.lastAccess < reference)+ toRemove.add(e.getKey());+ }+ }+ + synchronized (_ipFloodMap)+ {+ for (Integer i : toRemove)+ {+ _ipFloodMap.remove(i);+ }+ }+ + try+ {+ Thread.sleep(SLEEP_TIME);+ }+ catch (InterruptedException e)+ {+ + }+ }+ }+ +}\ No newline at end of fileIndex: java/net/sf/l2j/loginserver/SelectorHelper.java===================================================================--- java/net/sf/l2j/loginserver/SelectorHelper.java (revision 1475)+++ java/net/sf/l2j/loginserver/SelectorHelper.java (working copy)@@ -12,16 +12,13 @@ */ package net.sf.l2j.loginserver; -import java.net.InetAddress; import java.nio.channels.SocketChannel;-import java.util.ArrayList;-import java.util.HashMap;-import java.util.Map.Entry; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import net.sf.l2j.loginserver.serverpackets.Init;+import net.sf.l2j.util.IPv4Filter; import org.mmocore.network.IAcceptFilter; import org.mmocore.network.IClientFactory;@@ -33,18 +30,15 @@ * * @author KenM */-public class SelectorHelper extends Thread implements IMMOExecutor<L2LoginClient>,+public class SelectorHelper implements IMMOExecutor<L2LoginClient>, IClientFactory<L2LoginClient>, IAcceptFilter {- private HashMap<Integer, Flood> _ipFloodMap; private ThreadPoolExecutor _generalPacketsThreadPool;+ private IPv4Filter _ipv4filter; public SelectorHelper() {- _generalPacketsThreadPool = new ThreadPoolExecutor(4, 6, 15L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());- _ipFloodMap = new HashMap<Integer, Flood>();- super.setDaemon(true);- super.start();+ _ipv4filter = new IPv4Filter(); } /**@@ -73,110 +67,6 @@ */ public boolean accept(SocketChannel sc) {- InetAddress addr = sc.socket().getInetAddress();- int h = hash(addr.getAddress());- - long current = System.currentTimeMillis();- Flood f;- synchronized (_ipFloodMap)- {- f = _ipFloodMap.get(h);- }- if (f != null)- {- if (f.trys == -1)- {- f.lastAccess = current;- return false;- }- - if (f.lastAccess + 1000 > current)- {- f.lastAccess = current;- - if (f.trys >= 3)- {- f.trys = -1;- return false;- }- - f.trys++;- }- else- {- f.lastAccess = current;- }- }- else- {- synchronized (_ipFloodMap)- {- _ipFloodMap.put(h, new Flood());- }- }- return !LoginController.getInstance().isBannedAddress(addr);+ return _ipv4filter.accept(sc) && !LoginController.getInstance().isBannedAddress(sc.socket().getInetAddress()); }- - /**- * - * @param ip- * @return- */- private int hash(byte[] ip)- {- return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24- & 0xFF000000;- }- - private class Flood- {- long lastAccess;- int trys;- - Flood()- {- lastAccess = System.currentTimeMillis();- trys = 0;- }- }- - /**- * - * @see java.lang.Thread#run()- */- @Override- public void run()- {- while (true)- {- long reference = System.currentTimeMillis() - (1000 * 300);- ArrayList<Integer> toRemove = new ArrayList<Integer>(50);- synchronized (_ipFloodMap)- {- for (Entry<Integer, Flood> e : _ipFloodMap.entrySet())- {- Flood f = e.getValue();- if (f.lastAccess < reference)- toRemove.add(e.getKey());- }- }- - synchronized (_ipFloodMap)- {- for (Integer i : toRemove)- {- _ipFloodMap.remove(i);- }- }- - try- {- Thread.sleep(5000);- }- catch (InterruptedException e)