Newer
Older
KeeperJerry_Launcher / LaunchServer / source / auth / AuthLimiter.java
@KeeperJerry KeeperJerry on 25 Jun 2020 2 KB Лимит на авторизацию
package launchserver.auth;

import java.util.HashMap;

import launcher.LauncherAPI;
import launchserver.LaunchServer;

public class AuthLimiter
{
    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)
            {
                return true;
            }
            if (obj == null)
            {
                return false;
            }

            if (!(obj instanceof AuthEntry))
            {
                return false;
            }

            AuthEntry other = (AuthEntry) obj;
            if (ts != other.ts)
            {
                return false;
            }

            return value == other.value;
        }

        @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);
        }
    }

    @LauncherAPI
    public static final long TIMEOUT = 10 * 60 * 1000; //10 минут
    public final int rateLimit;
    public final int rateLimitMilis;

    private HashMap<String, AuthEntry> map;

    public AuthLimiter(LaunchServer srv)
    {
        map = new HashMap<>();
        rateLimit = srv.config.authRateLimit;
        rateLimitMilis = srv.config.authRateLimitMilis;
    }

    public boolean isLimit(String ip) {
        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;
        }
        map.put(ip, new AuthEntry(1, System.currentTimeMillis()));
        return false;
    }
}