Launcher/LaunchServer/src/main/java/ru/gravit/launchserver/auth/AuthLimiter.java

94 lines
2.7 KiB
Java
Raw Normal View History

2018-09-17 10:07:32 +03:00
package ru.gravit.launchserver.auth;
import ru.gravit.launcher.NeedGarbageCollection;
import ru.gravit.launchserver.LaunchServer;
2018-12-20 18:45:01 +03:00
import java.util.ArrayList;
import java.util.Arrays;
2018-12-20 18:45:01 +03:00
import java.util.HashMap;
import java.util.List;
2018-09-17 10:07:32 +03:00
public class AuthLimiter implements NeedGarbageCollection {
static class AuthEntry {
public int value;
public long ts;
public AuthEntry(int i, long l) {
value = i;
ts = l;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
2018-09-22 17:33:00 +03:00
return true;
2018-09-17 10:07:32 +03:00
if (obj == null)
2018-09-22 17:33:00 +03:00
return false;
2018-09-17 10:07:32 +03:00
if (!(obj instanceof AuthEntry))
2018-09-22 17:33:00 +03:00
return false;
2018-09-17 10:07:32 +03:00
AuthEntry other = (AuthEntry) obj;
if (ts != other.ts)
2018-09-22 17:33:00 +03:00
return false;
2018-09-17 10:07:32 +03:00
return value == other.value;
}
2018-09-22 17:33:00 +03:00
2018-09-17 10:07:32 +03:00
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (ts ^ ts >>> 32);
result = prime * result + value;
return result;
}
@Override
public String toString() {
return String.format("AuthEntry {value=%s, ts=%s}", value, ts);
}
}
2018-09-22 17:33:00 +03:00
2018-10-13 11:01:10 +03:00
2018-09-17 10:07:32 +03:00
public static final long TIMEOUT = 10 * 60 * 1000; //10 минут
public final int rateLimit;
public final int rateLimitMilis;
private final HashMap<String, AuthEntry> map;
2018-12-20 18:45:01 +03:00
private final List<String> excludeIps;
2018-09-17 10:07:32 +03:00
public AuthLimiter(LaunchServer srv) {
map = new HashMap<>();
excludeIps = new ArrayList<>();
2018-12-20 18:45:01 +03:00
if (srv.config.authLimitExclusions != null)
excludeIps.addAll(Arrays.asList(srv.config.authLimitExclusions));
2018-09-17 10:07:32 +03:00
rateLimit = srv.config.authRateLimit;
rateLimitMilis = srv.config.authRateLimitMilis;
}
@Override
public void garbageCollection() {
long time = System.currentTimeMillis();
long max_timeout = Math.max(rateLimitMilis, TIMEOUT);
map.entrySet().removeIf(e -> e.getValue().ts + max_timeout < time);
}
public boolean isLimit(String ip) {
2018-12-20 18:45:01 +03:00
if (excludeIps.contains(ip)) return false;
2018-09-17 10:07:32 +03:00
if (map.containsKey(ip)) {
AuthEntry rate = map.get(ip);
long currenttime = System.currentTimeMillis();
if (rate.ts + rateLimitMilis < currenttime) rate.value = 0;
if (rate.value >= rateLimit && rateLimit > 0) {
rate.value++;
rate.ts = currenttime;
return true;
}
rate.value++;
rate.ts = currenttime;
return false;
}
2018-09-22 17:33:00 +03:00
map.put(ip, new AuthEntry(1, System.currentTimeMillis()));
return false;
2018-09-17 10:07:32 +03:00
}
}