From 34f0dbf642b3282bb04bb55ee6feec0888a7ca24 Mon Sep 17 00:00:00 2001 From: _tomcraft <936063+tomcraft@users.noreply.github.com> Date: Tue, 28 Jun 2022 11:22:42 +0200 Subject: [PATCH] Safely handle bad configuration of 'block-protocols' and 'block-versions' (#2983) --- .../configuration/AbstractViaConfig.java | 7 ++++-- .../viaversion/viaversion/util/Config.java | 24 +++++++++++++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/com/viaversion/viaversion/configuration/AbstractViaConfig.java b/common/src/main/java/com/viaversion/viaversion/configuration/AbstractViaConfig.java index 2a26ebeca..5c45c5f86 100644 --- a/common/src/main/java/com/viaversion/viaversion/configuration/AbstractViaConfig.java +++ b/common/src/main/java/com/viaversion/viaversion/configuration/AbstractViaConfig.java @@ -31,6 +31,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import java.io.File; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.IntPredicate; @@ -160,10 +161,12 @@ public abstract class AbstractViaConfig extends Config implements ViaVersionConf } private BlockedProtocolVersions loadBlockedProtocolVersions() { - IntSet blockedProtocols = new IntOpenHashSet(getIntegerList("block-protocols")); + List blockProtocols = getListSafe("block-protocols", Integer.class, "Invalid blocked version protocol found in config: '%s'"); + List blockVersions = getListSafe("block-versions", String.class, "Invalid blocked version found in config: '%s'"); + IntSet blockedProtocols = new IntOpenHashSet(blockProtocols); int lowerBound = -1; int upperBound = -1; - for (String s : getStringList("block-versions")) { + for (String s : blockVersions) { if (s.isEmpty()) { continue; } diff --git a/common/src/main/java/com/viaversion/viaversion/util/Config.java b/common/src/main/java/com/viaversion/viaversion/util/Config.java index 37432644f..9838b29e7 100644 --- a/common/src/main/java/com/viaversion/viaversion/util/Config.java +++ b/common/src/main/java/com/viaversion/viaversion/util/Config.java @@ -18,6 +18,7 @@ package com.viaversion.viaversion.util; import com.google.gson.JsonElement; +import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.configuration.ConfigurationProvider; import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -26,11 +27,7 @@ import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.representer.Representer; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; @@ -214,6 +211,23 @@ public abstract class Config implements ConfigurationProvider { return o != null ? (List) o : new ArrayList<>(); } + public List getListSafe(String key, Class type, String invalidValueMessage) { + Object o = this.config.get(key); + if (o instanceof List) { + List list = (List) o; + List filteredValues = new ArrayList<>(); + for (Object o1 : list) { + if (type.isInstance(o1)) { + filteredValues.add(type.cast(o1)); + } else if (invalidValueMessage != null) { + Via.getPlatform().getLogger().warning(String.format(invalidValueMessage, o1)); + } + } + return filteredValues; + } + return new ArrayList<>(); + } + public @Nullable JsonElement getSerializedComponent(String key) { final Object o = this.config.get(key); if (o != null && !((String) o).isEmpty()) {