Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add captcha whitelist made with redis #13

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ dependencies {

implementation("org.bstats:bstats-velocity:$bstatsVersion")
implementation("net.elytrium:pcap:$pcapVersion")
implementation("redis.clients:jedis:4.2.3")

compileOnly("com.github.spotbugs:spotbugs-annotations:$spotbugsVersion")
}
Expand Down
32 changes: 31 additions & 1 deletion src/main/java/net/elytrium/limbofilter/LimboFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,12 @@
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.elytrium.commons.kyori.serialization.Serializer;
import net.elytrium.commons.kyori.serialization.Serializers;
import net.elytrium.commons.utils.updates.UpdatesChecker;
import net.elytrium.limboapi.BuildConstants;
import net.elytrium.limboapi.api.Limbo;
import net.elytrium.limboapi.api.LimboFactory;
import net.elytrium.limboapi.api.chunk.VirtualWorld;
Expand Down Expand Up @@ -77,11 +80,13 @@
import org.bstats.velocity.Metrics;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.slf4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

@Plugin(
id = "limbofilter",
name = "LimboFilter",
version = BuildConstants.FILTER_VERSION,
version = BuildConstants.LIMBO_VERSION,
url = "https://elytrium.net/",
authors = {
"Elytrium (https://elytrium.net/)",
Expand Down Expand Up @@ -118,6 +123,9 @@ public class LimboFilter {
private boolean logsDisabled;
private TcpListener tcpListener;

private JedisPool jedisPool;
private final Matcher nicknameMatcher = Pattern.compile("[^a-zA-Z0-9_]+").matcher("");

@Inject
public LimboFilter(Logger logger, ProxyServer server, Metrics.Factory metricsFactory, @DataDirectory Path dataDirectory) {
setLogger(logger);
Expand Down Expand Up @@ -168,6 +176,16 @@ public void onProxyInitialization(ProxyInitializeEvent event) {
public void reload() {
Settings.IMP.reload(this.configFile, Settings.IMP.PREFIX);

if (Settings.IMP.MAIN.REDIS.ENABLE) {
this.jedisPool = new JedisPool(Settings.IMP.MAIN.REDIS.HOST, Settings.IMP.MAIN.REDIS.PORT);

try (Jedis jedis = this.jedisPool.getResource()) {
if (jedis.ping().equals("PONG")) {
LOGGER.info("Redis connected");
}
}
}

ComponentSerializer<Component, Component, String> serializer = Settings.IMP.SERIALIZER.getSerializer();
if (serializer == null) {
LOGGER.warn("The specified serializer could not be founded, using default. (LEGACY_AMPERSAND)");
Expand Down Expand Up @@ -383,6 +401,18 @@ public boolean shouldCheck(Player player) {
}

public boolean shouldCheck(String nickname, InetAddress ip) {
if (this.jedisPool != null && Settings.IMP.MAIN.CAPTCHA_WHITELIST.ENABLE) {
try (Jedis jedis = this.jedisPool.getResource()) {
String sanitizedNickname = this.nicknameMatcher.reset(nickname).replaceAll(""); // Probably no need, but I did it anyway
if (jedis.exists("captcha_whitelist_nickname:" + sanitizedNickname)
|| jedis.exists("captcha_whitelist_ip:" + ip.getHostAddress())) {
return false;
} else if (Settings.IMP.MAIN.CAPTCHA_WHITELIST.OVERRIDE_OTHER_CHECKS) {
return true;
}
}
}

if (this.cachedFilterChecks.containsKey(nickname)) {
return !ip.equals(this.cachedFilterChecks.get(nickname).getInetAddress());
} else {
Expand Down
25 changes: 24 additions & 1 deletion src/main/java/net/elytrium/limbofilter/Settings.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.Map;
import net.elytrium.commons.config.YamlConfig;
import net.elytrium.commons.kyori.serialization.Serializers;
import net.elytrium.limboapi.BuildConstants;
import net.elytrium.limboapi.api.chunk.Dimension;
import net.elytrium.limboapi.api.file.BuiltInWorldFileType;
import net.elytrium.limboapi.api.player.GameMode;
Expand All @@ -33,7 +34,7 @@ public class Settings extends YamlConfig {
public static final Settings IMP = new Settings();

@Final
public String VERSION = BuildConstants.FILTER_VERSION;
public String VERSION = BuildConstants.LIMBO_VERSION;

@Comment({
"Available serializers:",
Expand Down Expand Up @@ -445,5 +446,27 @@ public static class STRINGS {

public String CAPTCHA_NOT_READY_YET = "{PRFX} Captcha is not ready yet. Try again in a few seconds";
}

@Create
public REDIS REDIS;

@Comment("Redis connection settings")
public static class REDIS {

public boolean ENABLE = false;
public String HOST = "localhost";
public int PORT = 6379;
}


@Create
public CAPTCHA_WHITELIST CAPTCHA_WHITELIST;

@Comment("Whitelist usernames or IP addresses to not show captcha")
public static class CAPTCHA_WHITELIST {

public boolean ENABLE = false;
public boolean OVERRIDE_OTHER_CHECKS = false;
}
}
}