From 126631fce8b60b5548ae5d932722e8bb667d28b1 Mon Sep 17 00:00:00 2001 From: Luck Date: Sun, 3 Apr 2022 15:21:18 +0100 Subject: [PATCH] Load configuration from env or system props (#3294) --- .../luckperms/bukkit/BukkitConfigAdapter.java | 13 -- .../vault/LuckPermsVaultPermission.java | 8 +- .../luckperms/bungee/BungeeConfigAdapter.java | 11 -- .../luckperms/common/config/ConfigKeys.java | 20 +-- .../adapter/ConfigurateConfigAdapter.java | 10 -- .../generic/adapter/ConfigurationAdapter.java | 2 - .../EnvironmentVariableConfigAdapter.java | 68 ++++++++++ .../adapter/MultiConfigurationAdapter.java | 117 ++++++++++++++++++ .../StringBasedConfigurationAdapter.java | 99 +++++++++++++++ .../adapter/SystemPropertyConfigAdapter.java | 64 ++++++++++ .../plugin/AbstractLuckPermsPlugin.java | 10 +- .../luckperms/nukkit/NukkitConfigAdapter.java | 13 -- 12 files changed, 366 insertions(+), 69 deletions(-) create mode 100644 common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/EnvironmentVariableConfigAdapter.java create mode 100644 common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/MultiConfigurationAdapter.java create mode 100644 common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/StringBasedConfigurationAdapter.java create mode 100644 common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/SystemPropertyConfigAdapter.java diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/BukkitConfigAdapter.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/BukkitConfigAdapter.java index 1f3107253..8538c6560 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/BukkitConfigAdapter.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/BukkitConfigAdapter.java @@ -32,11 +32,9 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; public class BukkitConfigAdapter implements ConfigurationAdapter { private final LuckPermsPlugin plugin; @@ -75,17 +73,6 @@ public class BukkitConfigAdapter implements ConfigurationAdapter { return this.configuration.isSet(path) ? list : def; } - @Override - public List getKeys(String path, List def) { - ConfigurationSection section = this.configuration.getConfigurationSection(path); - if (section == null) { - return def; - } - - Set keys = section.getKeys(false); - return keys == null ? def : new ArrayList<>(keys); - } - @Override public Map getStringMap(String path, Map def) { Map map = new HashMap<>(); diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/LuckPermsVaultPermission.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/LuckPermsVaultPermission.java index 5776a182a..dacc723b6 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/LuckPermsVaultPermission.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/LuckPermsVaultPermission.java @@ -34,6 +34,7 @@ import me.lucko.luckperms.common.cacheddata.type.MonitoredMetaCache; import me.lucko.luckperms.common.cacheddata.type.PermissionCache; import me.lucko.luckperms.common.calculator.processor.DirectProcessor; import me.lucko.luckperms.common.config.ConfigKeys; +import me.lucko.luckperms.common.config.LuckPermsConfiguration; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.HolderType; import me.lucko.luckperms.common.model.PermissionHolder; @@ -470,7 +471,12 @@ public class LuckPermsVaultPermission extends AbstractVaultPermission { } String getVaultServer() { - return this.plugin.getConfiguration().get(ConfigKeys.VAULT_SERVER); + LuckPermsConfiguration configuration = this.plugin.getConfiguration(); + if (configuration.get(ConfigKeys.USE_VAULT_SERVER)) { + return configuration.get(ConfigKeys.VAULT_SERVER); + } else { + return configuration.get(ConfigKeys.SERVER); + } } boolean isIncludeGlobal() { diff --git a/bungee/src/main/java/me/lucko/luckperms/bungee/BungeeConfigAdapter.java b/bungee/src/main/java/me/lucko/luckperms/bungee/BungeeConfigAdapter.java index edfae1728..c32261981 100644 --- a/bungee/src/main/java/me/lucko/luckperms/bungee/BungeeConfigAdapter.java +++ b/bungee/src/main/java/me/lucko/luckperms/bungee/BungeeConfigAdapter.java @@ -34,7 +34,6 @@ import net.md_5.bungee.config.YamlConfiguration; import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -80,16 +79,6 @@ public class BungeeConfigAdapter implements ConfigurationAdapter { return Optional.ofNullable(this.configuration.getStringList(path)).orElse(def); } - @Override - public List getKeys(String path, List def) { - Configuration section = this.configuration.getSection(path); - if (section == null) { - return def; - } - - return Optional.of((List) new ArrayList<>(section.getKeys())).orElse(def); - } - @Override public Map getStringMap(String path, Map def) { Map map = new HashMap<>(); diff --git a/common/src/main/java/me/lucko/luckperms/common/config/ConfigKeys.java b/common/src/main/java/me/lucko/luckperms/common/config/ConfigKeys.java index 03b0b837c..2c5ac5a31 100644 --- a/common/src/main/java/me/lucko/luckperms/common/config/ConfigKeys.java +++ b/common/src/main/java/me/lucko/luckperms/common/config/ConfigKeys.java @@ -88,16 +88,7 @@ public final class ConfigKeys { /** * The name of the server */ - public static final ConfigKey SERVER = key(c -> { - String server = c.getString("server", "global").toLowerCase(Locale.ROOT); - if (server.equals("load-from-system-property")) { - server = System.getProperty("luckperms.server", "global").toLowerCase(Locale.ROOT); - } - if (server.equals("load-from-environment-variable")) { - server = System.getenv().getOrDefault("LUCKPERMS_SERVER", "global").toLowerCase(Locale.ROOT); - } - return server; - }); + public static final ConfigKey SERVER = lowercaseStringKey("server", "global"); /** * How many minutes to wait between syncs. A value <= 0 will disable syncing. @@ -501,14 +492,7 @@ public final class ConfigKeys { /** * The name of the server to use for Vault. */ - public static final ConfigKey VAULT_SERVER = key(c -> { - // default to true for backwards compatibility - if (USE_VAULT_SERVER.get(c)) { - return c.getString("vault-server", "global").toLowerCase(Locale.ROOT); - } else { - return SERVER.get(c); - } - }); + public static final ConfigKey VAULT_SERVER = lowercaseStringKey("vault-server", "global"); /** * If Vault should apply global permissions diff --git a/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/ConfigurateConfigAdapter.java b/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/ConfigurateConfigAdapter.java index 3a02cfce3..4362f37f3 100644 --- a/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/ConfigurateConfigAdapter.java +++ b/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/ConfigurateConfigAdapter.java @@ -95,16 +95,6 @@ public abstract class ConfigurateConfigAdapter implements ConfigurationAdapter { return node.getList(Object::toString); } - @Override - public List getKeys(String path, List def) { - ConfigurationNode node = resolvePath(path); - if (node.isVirtual() || !node.isMap()) { - return def; - } - - return node.getChildrenMap().keySet().stream().map(Object::toString).collect(Collectors.toList()); - } - @SuppressWarnings("unchecked") @Override public Map getStringMap(String path, Map def) { diff --git a/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/ConfigurationAdapter.java b/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/ConfigurationAdapter.java index d91d67eab..e732845c7 100644 --- a/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/ConfigurationAdapter.java +++ b/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/ConfigurationAdapter.java @@ -44,8 +44,6 @@ public interface ConfigurationAdapter { List getStringList(String path, List def); - List getKeys(String path, List def); - Map getStringMap(String path, Map def); } diff --git a/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/EnvironmentVariableConfigAdapter.java b/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/EnvironmentVariableConfigAdapter.java new file mode 100644 index 000000000..abc11b437 --- /dev/null +++ b/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/EnvironmentVariableConfigAdapter.java @@ -0,0 +1,68 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.common.config.generic.adapter; + +import me.lucko.luckperms.common.plugin.LuckPermsPlugin; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.Locale; + +public class EnvironmentVariableConfigAdapter extends StringBasedConfigurationAdapter { + private static final String PREFIX = "LUCKPERMS_"; + + private final LuckPermsPlugin plugin; + + public EnvironmentVariableConfigAdapter(LuckPermsPlugin plugin) { + this.plugin = plugin; + } + + @Override + protected @Nullable String resolveValue(String path) { + // e.g. + // 'server' -> LUCKPERMS_SERVER + // 'data.table_prefix' -> LUCKPERMS_DATA_TABLE_PREFIX + String key = PREFIX + path.toUpperCase(Locale.ROOT) + .replace('-', '_') + .replace('.', '_'); + + String value = System.getenv(key); + if (value != null) { + this.plugin.getLogger().info("Resolved configuration value from environment variable: " + key + " = " + (path.contains("password") ? "*****" : value)); + } + return value; + } + + @Override + public LuckPermsPlugin getPlugin() { + return this.plugin; + } + + @Override + public void reload() { + // no-op + } +} diff --git a/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/MultiConfigurationAdapter.java b/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/MultiConfigurationAdapter.java new file mode 100644 index 000000000..fcdf1b876 --- /dev/null +++ b/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/MultiConfigurationAdapter.java @@ -0,0 +1,117 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.common.config.generic.adapter; + +import com.google.common.collect.ImmutableList; + +import me.lucko.luckperms.common.plugin.LuckPermsPlugin; + +import java.util.List; +import java.util.Map; + +/** + * A {@link ConfigurationAdapter} composed of one or more other ConfigurationAdapters. + */ +public class MultiConfigurationAdapter implements ConfigurationAdapter { + private final LuckPermsPlugin plugin; + private final List adapters; + + /** + * Creates a {@link MultiConfigurationAdapter}. + * + *

The first adapter in the list has priority (the final say) in deciding what the value is. + * All adapters are tried in reverse order, and the value returned from the previous adapter + * is passed into the next as the {@code def} value.

+ * + * @param plugin the plugin + * @param adapters a list of adapters + */ + public MultiConfigurationAdapter(LuckPermsPlugin plugin, List adapters) { + this.plugin = plugin; + this.adapters = ImmutableList.copyOf(adapters).reverse(); + } + + public MultiConfigurationAdapter(LuckPermsPlugin plugin, ConfigurationAdapter... adapters) { + this(plugin, ImmutableList.copyOf(adapters)); + } + + @Override + public LuckPermsPlugin getPlugin() { + return this.plugin; + } + + @Override + public void reload() { + for (ConfigurationAdapter adapter : this.adapters) { + adapter.reload(); + } + } + + @Override + public String getString(String path, String def) { + String result = def; + for (ConfigurationAdapter adapter : this.adapters) { + result = adapter.getString(path, result); + } + return result; + } + + @Override + public int getInteger(String path, int def) { + int result = def; + for (ConfigurationAdapter adapter : this.adapters) { + result = adapter.getInteger(path, result); + } + return result; + } + + @Override + public boolean getBoolean(String path, boolean def) { + boolean result = def; + for (ConfigurationAdapter adapter : this.adapters) { + result = adapter.getBoolean(path, result); + } + return result; + } + + @Override + public List getStringList(String path, List def) { + List result = def; + for (ConfigurationAdapter adapter : this.adapters) { + result = adapter.getStringList(path, result); + } + return result; + } + + @Override + public Map getStringMap(String path, Map def) { + Map result = def; + for (ConfigurationAdapter adapter : this.adapters) { + result = adapter.getStringMap(path, result); + } + return result; + } +} diff --git a/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/StringBasedConfigurationAdapter.java b/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/StringBasedConfigurationAdapter.java new file mode 100644 index 000000000..6b2f5fcf2 --- /dev/null +++ b/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/StringBasedConfigurationAdapter.java @@ -0,0 +1,99 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.common.config.generic.adapter; + +import com.google.common.base.Splitter; + +import org.checkerframework.checker.nullness.qual.Nullable; + +import java.util.List; +import java.util.Map; + +public abstract class StringBasedConfigurationAdapter implements ConfigurationAdapter { + + private static final Splitter LIST_SPLITTER = Splitter.on(','); + private static final Splitter.MapSplitter MAP_SPLITTER = Splitter.on(',').withKeyValueSeparator('='); + + protected abstract @Nullable String resolveValue(String path); + + @Override + public String getString(String path, String def) { + String value = resolveValue(path); + if (value == null) { + return def; + } + + return value; + } + + @Override + public int getInteger(String path, int def) { + String value = resolveValue(path); + if (value == null) { + return def; + } + + try { + return Integer.parseInt(value); + } catch (IllegalArgumentException e) { + return def; + } + } + + @Override + public boolean getBoolean(String path, boolean def) { + String value = resolveValue(path); + if (value == null) { + return def; + } + + try { + return Boolean.parseBoolean(value); + } catch (IllegalArgumentException e) { + return def; + } + } + + @Override + public List getStringList(String path, List def) { + String value = resolveValue(path); + if (value == null) { + return def; + } + + return LIST_SPLITTER.splitToList(value); + } + + @Override + public Map getStringMap(String path, Map def) { + String value = resolveValue(path); + if (value == null) { + return def; + } + + return MAP_SPLITTER.split(value); + } +} diff --git a/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/SystemPropertyConfigAdapter.java b/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/SystemPropertyConfigAdapter.java new file mode 100644 index 000000000..5b0bee744 --- /dev/null +++ b/common/src/main/java/me/lucko/luckperms/common/config/generic/adapter/SystemPropertyConfigAdapter.java @@ -0,0 +1,64 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.common.config.generic.adapter; + +import me.lucko.luckperms.common.plugin.LuckPermsPlugin; + +import org.checkerframework.checker.nullness.qual.Nullable; + +public class SystemPropertyConfigAdapter extends StringBasedConfigurationAdapter { + private static final String PREFIX = "luckperms."; + + private final LuckPermsPlugin plugin; + + public SystemPropertyConfigAdapter(LuckPermsPlugin plugin) { + this.plugin = plugin; + } + + @Override + protected @Nullable String resolveValue(String path) { + // e.g. + // 'server' -> luckperms.server + // 'data.table_prefix' -> luckperms.data.table-prefix + String key = PREFIX + path; + + String value = System.getProperty(key); + if (value != null) { + this.plugin.getLogger().info("Resolved configuration value from system property: " + key + " = " + (path.contains("password") ? "*****" : value)); + } + return value; + } + + @Override + public LuckPermsPlugin getPlugin() { + return this.plugin; + } + + @Override + public void reload() { + // no-op + } +} diff --git a/common/src/main/java/me/lucko/luckperms/common/plugin/AbstractLuckPermsPlugin.java b/common/src/main/java/me/lucko/luckperms/common/plugin/AbstractLuckPermsPlugin.java index e986a0dd5..24ed279c7 100644 --- a/common/src/main/java/me/lucko/luckperms/common/plugin/AbstractLuckPermsPlugin.java +++ b/common/src/main/java/me/lucko/luckperms/common/plugin/AbstractLuckPermsPlugin.java @@ -32,6 +32,9 @@ import me.lucko.luckperms.common.calculator.CalculatorFactory; import me.lucko.luckperms.common.config.ConfigKeys; import me.lucko.luckperms.common.config.LuckPermsConfiguration; import me.lucko.luckperms.common.config.generic.adapter.ConfigurationAdapter; +import me.lucko.luckperms.common.config.generic.adapter.EnvironmentVariableConfigAdapter; +import me.lucko.luckperms.common.config.generic.adapter.MultiConfigurationAdapter; +import me.lucko.luckperms.common.config.generic.adapter.SystemPropertyConfigAdapter; import me.lucko.luckperms.common.context.calculator.ConfigurationContextCalculator; import me.lucko.luckperms.common.dependencies.Dependency; import me.lucko.luckperms.common.dependencies.DependencyManager; @@ -132,7 +135,12 @@ public abstract class AbstractLuckPermsPlugin implements LuckPermsPlugin { // load configuration getLogger().info("Loading configuration..."); - this.configuration = new LuckPermsConfiguration(this, provideConfigurationAdapter()); + ConfigurationAdapter configFileAdapter = provideConfigurationAdapter(); + this.configuration = new LuckPermsConfiguration(this, new MultiConfigurationAdapter(this, + new SystemPropertyConfigAdapter(this), + new EnvironmentVariableConfigAdapter(this), + configFileAdapter + )); // setup a bytebin instance this.httpClient = new OkHttpClient.Builder() diff --git a/nukkit/src/main/java/me/lucko/luckperms/nukkit/NukkitConfigAdapter.java b/nukkit/src/main/java/me/lucko/luckperms/nukkit/NukkitConfigAdapter.java index e53937d4a..e53c0b08f 100644 --- a/nukkit/src/main/java/me/lucko/luckperms/nukkit/NukkitConfigAdapter.java +++ b/nukkit/src/main/java/me/lucko/luckperms/nukkit/NukkitConfigAdapter.java @@ -32,11 +32,9 @@ import cn.nukkit.utils.Config; import cn.nukkit.utils.ConfigSection; import java.io.File; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; public class NukkitConfigAdapter implements ConfigurationAdapter { private final LuckPermsPlugin plugin; @@ -75,17 +73,6 @@ public class NukkitConfigAdapter implements ConfigurationAdapter { return list == null ? def : list; } - @Override - public List getKeys(String path, List def) { - ConfigSection section = this.configuration.getSection(path); - if (section == null) { - return def; - } - - Set keys = section.getKeys(false); - return keys == null ? def : new ArrayList<>(keys); - } - @Override public Map getStringMap(String path, Map def) { Map map = new HashMap<>();