Removal of IPv4Filter class.
This commit is contained in:
		@@ -1,149 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * This file is part of the L2J Mobius project.
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 org.l2jmobius.loginserver.network.util;
 | 
			
		||||
 | 
			
		||||
import java.net.Inet4Address;
 | 
			
		||||
import java.net.InetAddress;
 | 
			
		||||
import java.nio.channels.SocketChannel;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Iterator;
 | 
			
		||||
import java.util.Map.Entry;
 | 
			
		||||
import java.util.logging.Logger;
 | 
			
		||||
 | 
			
		||||
import org.l2jmobius.commons.util.Chronos;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * IPv4 filter.
 | 
			
		||||
 * @author Forsaiken
 | 
			
		||||
 */
 | 
			
		||||
public class IPv4Filter implements Runnable
 | 
			
		||||
{
 | 
			
		||||
	protected final Logger LOGGER = Logger.getLogger(getClass().getName());
 | 
			
		||||
	
 | 
			
		||||
	private final HashMap<Integer, Flood> _ipFloodMap;
 | 
			
		||||
	private static final long SLEEP_TIME = 5000;
 | 
			
		||||
	
 | 
			
		||||
	public IPv4Filter()
 | 
			
		||||
	{
 | 
			
		||||
		_ipFloodMap = new HashMap<>();
 | 
			
		||||
		final Thread t = new Thread(this, getClass().getSimpleName());
 | 
			
		||||
		t.setDaemon(true);
 | 
			
		||||
		t.start();
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param ip
 | 
			
		||||
	 * @return
 | 
			
		||||
	 */
 | 
			
		||||
	private static 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 = Chronos.currentTimeMillis();
 | 
			
		||||
			trys = 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public boolean accept(SocketChannel sc)
 | 
			
		||||
	{
 | 
			
		||||
		final InetAddress addr = sc.socket().getInetAddress();
 | 
			
		||||
		if (!(addr instanceof Inet4Address))
 | 
			
		||||
		{
 | 
			
		||||
			LOGGER.info("Someone tried to connect from something other than IPv4: " + addr.getHostAddress());
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		final int h = hash(addr.getAddress());
 | 
			
		||||
		final long current = Chronos.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)
 | 
			
		||||
		{
 | 
			
		||||
			final long reference = Chronos.currentTimeMillis() - (1000 * 300);
 | 
			
		||||
			synchronized (_ipFloodMap)
 | 
			
		||||
			{
 | 
			
		||||
				final Iterator<Entry<Integer, Flood>> it = _ipFloodMap.entrySet().iterator();
 | 
			
		||||
				while (it.hasNext())
 | 
			
		||||
				{
 | 
			
		||||
					final Flood f = it.next().getValue();
 | 
			
		||||
					if (f.lastAccess < reference)
 | 
			
		||||
					{
 | 
			
		||||
						it.remove();
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			try
 | 
			
		||||
			{
 | 
			
		||||
				Thread.sleep(SLEEP_TIME);
 | 
			
		||||
			}
 | 
			
		||||
			catch (InterruptedException e)
 | 
			
		||||
			{
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user