mirror of
https://github.com/moparisthebest/MoparClassic
synced 2024-12-21 23:18:52 -05:00
Added Scala.
Moved ConnectionFilter. Removed OS specific code in GameEngine, and moved it into OSLevelBlocking.
This commit is contained in:
parent
3701ea7a2f
commit
9bf9a8cbc4
BIN
GameServer/lib/continuations.jar
Normal file
BIN
GameServer/lib/continuations.jar
Normal file
Binary file not shown.
BIN
GameServer/lib/scala-compiler.jar
Normal file
BIN
GameServer/lib/scala-compiler.jar
Normal file
Binary file not shown.
BIN
GameServer/lib/scala-library.jar
Normal file
BIN
GameServer/lib/scala-library.jar
Normal file
Binary file not shown.
@ -0,0 +1,43 @@
|
|||||||
|
package org.moparscape.msc.gs.connection.filter;
|
||||||
|
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.SocketAddress;
|
||||||
|
|
||||||
|
import org.apache.mina.common.IoFilter;
|
||||||
|
import org.apache.mina.common.IoSession;
|
||||||
|
import org.apache.mina.filter.BlacklistFilter;
|
||||||
|
import org.moparscape.msc.gs.util.Cache;
|
||||||
|
|
||||||
|
public class ConnectionFilter extends BlacklistFilter {
|
||||||
|
private Cache<InetSocketAddress, Integer> connections = new Cache<InetSocketAddress, Integer>();
|
||||||
|
private static final int BLOCK_THRESHOLD = 5;
|
||||||
|
|
||||||
|
public void sessionCreated(IoFilter.NextFilter nextFilter, IoSession session) {
|
||||||
|
final SocketAddress sa = session.getRemoteAddress();
|
||||||
|
if (sa != null && sa instanceof InetSocketAddress) {
|
||||||
|
final InetSocketAddress a = (InetSocketAddress) sa;
|
||||||
|
final Integer val = connections.get(a);
|
||||||
|
System.out.println(val);
|
||||||
|
final Integer retVal = connections.put(a, val == null ? 1 : val + 1);
|
||||||
|
if (retVal != null && retVal > BLOCK_THRESHOLD) {
|
||||||
|
block(a.getAddress());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.sessionCreated(nextFilter, session);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sessionClosed(IoFilter.NextFilter nextFilter, IoSession session)
|
||||||
|
throws Exception {
|
||||||
|
final SocketAddress sa = session.getRemoteAddress();
|
||||||
|
if (sa != null && sa instanceof InetSocketAddress) {
|
||||||
|
final InetSocketAddress a = (InetSocketAddress) sa;
|
||||||
|
final Integer val = connections.get(a);
|
||||||
|
System.out.println(val);
|
||||||
|
final Integer retVal = connections.put(a, val == null ? 1 : val + 1);
|
||||||
|
if (retVal != null && retVal - 1 <= BLOCK_THRESHOLD) {
|
||||||
|
unblock(a.getAddress());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.sessionClosed(nextFilter, session);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,74 @@
|
|||||||
|
package org.moparscape.msc.gs.connection.filter;
|
||||||
|
|
||||||
|
import java.util.List
|
||||||
|
import java.util.concurrent.CopyOnWriteArrayList
|
||||||
|
import org.moparscape.msc.gs.Server
|
||||||
|
import org.moparscape.msc.gs.core.DelayedEventHandler
|
||||||
|
import org.moparscape.msc.gs.event.DelayedEvent
|
||||||
|
import org.moparscape.msc.gs.util.Logger;
|
||||||
|
import org.moparscape.msc.config.Config
|
||||||
|
|
||||||
|
object OSLevelBlocking {
|
||||||
|
|
||||||
|
private val block_ = {
|
||||||
|
println(System.getProperty("os.name"))
|
||||||
|
if (System.getProperty("os.name") startsWith "(?i)linux") {
|
||||||
|
def b(ip: String) {
|
||||||
|
Runtime.getRuntime().exec("sudo route add -host " + ip + " reject")
|
||||||
|
}
|
||||||
|
b _
|
||||||
|
} else {
|
||||||
|
// Windows blocking - untested - won't work on Windows 7
|
||||||
|
def b(ip: String) {
|
||||||
|
Runtime.getRuntime().exec("route ADD " + ip + " MASK 255.255.255.255 " + Config.UNUSED_IP)
|
||||||
|
}
|
||||||
|
b _
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private val unblock_ = {
|
||||||
|
if (System.getProperty("os.name") startsWith "(?i)linux") {
|
||||||
|
def u(ip: String) {
|
||||||
|
Runtime.getRuntime().exec("sudo route del " + ip + " reject")
|
||||||
|
}
|
||||||
|
u _
|
||||||
|
} else {
|
||||||
|
// Windows blocking - untested - won't work on Windows 7
|
||||||
|
def b(ip: String) {
|
||||||
|
Runtime.getRuntime().exec("route DELETE " + ip)
|
||||||
|
}
|
||||||
|
b _
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val blocked = new CopyOnWriteArrayList[String];
|
||||||
|
|
||||||
|
private val events = Server.getServer().getEngine().getEventHandler()
|
||||||
|
|
||||||
|
def block(ip: String) {
|
||||||
|
if (!blocked.contains(ip)) {
|
||||||
|
events.add(new DelayedEvent(null, 1800000) {
|
||||||
|
|
||||||
|
def run() {
|
||||||
|
unblock(ip)
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
block_(ip)
|
||||||
|
blocked.add(ip)
|
||||||
|
Logger.println("Blocked " + ip)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def unblock(ip: String) {
|
||||||
|
try {
|
||||||
|
unblock_(ip)
|
||||||
|
blocked.remove(ip)
|
||||||
|
Logger.println("Unblocked " + ip)
|
||||||
|
} catch {
|
||||||
|
case e: Exception => {
|
||||||
|
Logger.error(e)
|
||||||
|
Logger.println("Failed to unblock " + ip)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
34
GameServer/src/org/moparscape/msc/gs/util/Cache.java
Normal file
34
GameServer/src/org/moparscape/msc/gs/util/Cache.java
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package org.moparscape.msc.gs.util;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.commons.collections.map.LRUMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A basic cache backed by a {@link LRUMap}.
|
||||||
|
*
|
||||||
|
* @author CodeForFame
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Cache<K, V> {
|
||||||
|
|
||||||
|
private final Map<K, V> cache;
|
||||||
|
|
||||||
|
public Cache() {
|
||||||
|
this(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") // Commons and their failure to support generics...
|
||||||
|
public Cache(int maxSize) {
|
||||||
|
cache = new LRUMap(maxSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public V get(K key) {
|
||||||
|
return cache.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public V put(K key, V value) {
|
||||||
|
return cache.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user