From 34b367bfc378c8f2a73095cb535aabe7a96e2639 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+DoctorMacc@users.noreply.github.com> Date: Wed, 10 Jun 2020 18:58:29 -0400 Subject: [PATCH] Configuration updates (#653) * Configuration updates The main feature of this commit is switching Bukkit and BungeeCord to using Jackson configuration. This allows comments to load. Along with this, the Jackson configs have been consolidated into one abstract class, and a check is made to ensure auth-type cannot be set to Floodgate if Floodgate is not installed. * Add deleted file; remove imports * Re-add changing of Bukkit port * Alphabetize import * Alphabetize Bungee import * Updates * Swap values in GeyserJacksonConfiguration * Add a null check for GeyserConnector in Bukkit's onDisable --- .../bukkit/GeyserBukkitConfiguration.java | 199 +---------------- .../platform/bukkit/GeyserBukkitPlugin.java | 35 ++- .../bungeecord/GeyserBungeeConfiguration.java | 203 +----------------- .../bungeecord/GeyserBungeePlugin.java | 61 ++---- .../sponge/GeyserSpongeConfiguration.java | 2 +- .../platform/sponge/GeyserSpongePlugin.java | 2 +- .../standalone/GeyserStandaloneBootstrap.java | 6 +- .../GeyserStandaloneConfiguration.java | 95 +------- .../velocity/GeyserVelocityConfiguration.java | 104 +-------- .../velocity/GeyserVelocityPlugin.java | 7 +- .../connector/FloodgateKeyLoader.java | 2 + .../geysermc/connector/GeyserConnector.java | 1 + .../connector/bootstrap/GeyserBootstrap.java | 2 +- .../GeyserConfiguration.java | 4 +- .../GeyserJacksonConfiguration.java | 135 ++++++++++++ .../network/ConnectorServerEventHandler.java | 2 +- .../network/UpstreamPacketHandler.java | 2 +- .../ping/GeyserLegacyPingPassthrough.java | 2 - 18 files changed, 223 insertions(+), 641 deletions(-) rename connector/src/main/java/org/geysermc/connector/{ => configuration}/GeyserConfiguration.java (97%) create mode 100644 connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitConfiguration.java b/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitConfiguration.java index df98b408d..327c41dae 100644 --- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitConfiguration.java +++ b/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitConfiguration.java @@ -25,120 +25,29 @@ package org.geysermc.platform.bukkit; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; import org.bukkit.Bukkit; -import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.plugin.Plugin; import org.geysermc.connector.FloodgateKeyLoader; -import org.geysermc.connector.GeyserConfiguration; +import org.geysermc.connector.configuration.GeyserJacksonConfiguration; -import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; -public class GeyserBukkitConfiguration implements GeyserConfiguration { +@Getter +@JsonIgnoreProperties(ignoreUnknown = true) +public class GeyserBukkitConfiguration extends GeyserJacksonConfiguration { - private FileConfiguration config; - private File dataFolder; - - private BukkitBedrockConfiguration bedrockConfig; - private BukkitRemoteConfiguration remoteConfig; - private BukkitMetricsInfo metricsInfo; - - private Map userAuthInfo = new HashMap<>(); + @JsonProperty("floodgate-key-file") + private String floodgateKeyFile; private Path floodgateKey; - public GeyserBukkitConfiguration(File dataFolder, FileConfiguration config) { - this.dataFolder = dataFolder; - this.config = config; - - bedrockConfig = new BukkitBedrockConfiguration(); - remoteConfig = new BukkitRemoteConfiguration(); - metricsInfo = new BukkitMetricsInfo(); - - if (!config.contains("userAuths")) - return; - - for (String key : config.getConfigurationSection("userAuths").getKeys(false)) { - userAuthInfo.put(key, new BukkitUserAuthenticationInfo(key)); - } - } - public void loadFloodgate(GeyserBukkitPlugin plugin) { Plugin floodgate = Bukkit.getPluginManager().getPlugin("floodgate-bukkit"); - floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(dataFolder.toString(), config.getString("floodgate-key-file", "public-key.pem")), floodgate, floodgate != null ? floodgate.getDataFolder().toPath() : null); - } - - @Override - public IBedrockConfiguration getBedrock() { - return bedrockConfig; - } - - @Override - public IRemoteConfiguration getRemote() { - return remoteConfig; - } - - @Override - public Map getUserAuths() { - return userAuthInfo; - } - - @Override - public boolean isCommandSuggestions() { - return config.getBoolean("command-suggestions", true); - } - - @Override - public boolean isPassthroughMotd() { - return config.getBoolean("passthrough-motd", false); - } - - @Override - public boolean isPassthroughPlayerCounts() { - return config.getBoolean("passthrough-player-counts", false); - } - - @Override - public boolean isLegacyPingPassthrough() { - return config.getBoolean("legacy-ping-passthrough", false); - } - - @Override - public int getPingPassthroughInterval() { - return config.getInt("ping-passthrough-interval", 3); - } - - @Override - public int getMaxPlayers() { - return config.getInt("max-players", 10); - } - - @Override - public boolean isDebugMode() { - return config.getBoolean("debug-mode", false); - } - - @Override - public int getGeneralThreadPool() { - return config.getInt("general-thread-pool", 32); - } - - @Override - public boolean isAllowThirdPartyCapes() { - return config.getBoolean("allow-third-party-capes", true); - } - - @Override - public boolean isAllowThirdPartyEars() { - return config.getBoolean("allow-third-party-ears", false); - } - - @Override - public String getDefaultLocale() { - return config.getString("default-locale", "en_us"); + floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(plugin.getDataFolder().toString(), plugin.getConfig().getString("floodgate-key-file", "public-key.pem")), floodgate, floodgate != null ? floodgate.getDataFolder().toPath() : null); } @Override @@ -150,92 +59,4 @@ public class GeyserBukkitConfiguration implements GeyserConfiguration { public boolean isCacheChunks() { return true; // We override this as with Bukkit, we have direct access to the server implementation } - - @Override - public boolean isAboveBedrockNetherBuilding() { - return config.getBoolean("above-bedrock-nether-building", false); - } - - @Override - public IMetricsInfo getMetrics() { - return metricsInfo; - } - - public class BukkitBedrockConfiguration implements IBedrockConfiguration { - - @Override - public String getAddress() { - return config.getString("bedrock.address", "0.0.0.0"); - } - - @Override - public int getPort() { - return config.getInt("bedrock.port", 25565); - } - - @Override - public String getMotd1() { - return config.getString("bedrock.motd1", "GeyserMC"); - } - - @Override - public String getMotd2() { - return config.getString("bedrock.motd2", "GeyserMC"); - } - } - - public class BukkitRemoteConfiguration implements IRemoteConfiguration { - - @Override - public String getAddress() { - return config.getString("remote.address", "127.0.0.1"); - } - - @Override - public int getPort() { - return config.getInt("remote.port", 25565); - } - - @Override - public String getAuthType() { - return config.getString("remote.auth-type", "online"); - } - } - - public class BukkitUserAuthenticationInfo implements IUserAuthenticationInfo { - - private String key; - - public BukkitUserAuthenticationInfo(String key) { - this.key = key; - } - - @Override - public String getEmail() { - return config.getString("userAuths." + key + ".email"); - } - - @Override - public String getPassword() { - return config.getString("userAuths." + key + ".password"); - } - } - - public class BukkitMetricsInfo implements IMetricsInfo { - - @Override - public boolean isEnabled() { - return config.getBoolean("metrics.enabled", true); - } - - @Override - public String getUniqueId() { - return config.getString("metrics.uuid", "generateduuid"); - } - } - - @Override - public int getConfigVersion() { - return config.getInt("config-version", 0); - } } diff --git a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitPlugin.java b/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitPlugin.java index 5f0e967a2..52893fc89 100644 --- a/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitPlugin.java +++ b/bootstrap/bukkit/src/main/java/org/geysermc/platform/bukkit/GeyserBukkitPlugin.java @@ -28,20 +28,24 @@ package org.geysermc.platform.bukkit; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; import org.geysermc.common.PlatformType; -import org.geysermc.connector.GeyserConfiguration; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.bootstrap.GeyserBootstrap; import org.geysermc.connector.command.CommandManager; +import org.geysermc.connector.configuration.GeyserConfiguration; import org.geysermc.connector.network.translators.world.WorldManager; import org.geysermc.connector.ping.GeyserLegacyPingPassthrough; import org.geysermc.connector.ping.IGeyserPingPassthrough; +import org.geysermc.connector.utils.FileUtils; import org.geysermc.platform.bukkit.command.GeyserBukkitCommandExecutor; import org.geysermc.platform.bukkit.command.GeyserBukkitCommandManager; import org.geysermc.platform.bukkit.world.GeyserBukkitBlockPlaceListener; import org.geysermc.platform.bukkit.world.GeyserBukkitWorldManager; import us.myles.ViaVersion.api.Via; +import java.io.File; +import java.io.IOException; import java.util.UUID; +import java.util.logging.Level; public class GeyserBukkitPlugin extends JavaPlugin implements GeyserBootstrap { @@ -56,26 +60,34 @@ public class GeyserBukkitPlugin extends JavaPlugin implements GeyserBootstrap { @Override public void onEnable() { - saveDefaultConfig(); - - this.geyserConfig = new GeyserBukkitConfiguration(getDataFolder(), getConfig()); - if (geyserConfig.getMetrics().getUniqueId().equals("generateduuid")) { - getConfig().set("metrics.uuid", UUID.randomUUID().toString()); - saveConfig(); + // This is manually done instead of using Bukkit methods to save the config because otherwise comments get removed + try { + if (!getDataFolder().exists()) + getDataFolder().mkdir(); + File configFile = FileUtils.fileOrCopiedFromResource(new File(getDataFolder(), "config.yml"), "config.yml", (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString())); + this.geyserConfig = FileUtils.loadConfig(configFile, GeyserBukkitConfiguration.class); + } catch (IOException ex) { + getLogger().log(Level.WARNING, "Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex); + ex.printStackTrace(); } // Don't change the ip if its listening on all interfaces // By default this should be 127.0.0.1 but may need to be changed in some circumstances if (!Bukkit.getIp().equals("0.0.0.0") && !Bukkit.getIp().equals("")) { - getConfig().set("remote.address", Bukkit.getIp()); + geyserConfig.getRemote().setAddress(Bukkit.getIp()); } - getConfig().set("remote.port", Bukkit.getPort()); - saveConfig(); + geyserConfig.getRemote().setPort(Bukkit.getPort()); this.geyserLogger = new GeyserBukkitLogger(getLogger(), geyserConfig.isDebugMode()); GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); + if (geyserConfig.getRemote().getAuthType().equals("floodgate") && Bukkit.getPluginManager().getPlugin("floodgate-bukkit") == null) { + geyserLogger.severe("Auth type set to Floodgate but Floodgate not found! Disabling..."); + this.getPluginLoader().disablePlugin(this); + return; + } + geyserConfig.loadFloodgate(this); this.connector = GeyserConnector.start(PlatformType.BUKKIT, this); @@ -113,7 +125,8 @@ public class GeyserBukkitPlugin extends JavaPlugin implements GeyserBootstrap { @Override public void onDisable() { - connector.shutdown(); + if (connector != null) + connector.shutdown(); } @Override diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeConfiguration.java b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeConfiguration.java index d983aec1c..839fc185d 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeConfiguration.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeeConfiguration.java @@ -25,216 +25,29 @@ package org.geysermc.platform.bungeecord; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Getter; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.config.Configuration; import org.geysermc.connector.FloodgateKeyLoader; -import org.geysermc.connector.GeyserConfiguration; +import org.geysermc.connector.configuration.GeyserJacksonConfiguration; -import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; -public class GeyserBungeeConfiguration implements GeyserConfiguration { - - private File dataFolder; - private Configuration config; - - private BungeeBedrockConfiguration bedrockConfig; - private BungeeRemoteConfiguration remoteConfig; - private BungeeMetricsInfo metricsInfo; - - private Map userAuthInfo = new HashMap<>(); +@Getter +@JsonIgnoreProperties(ignoreUnknown = true) +public class GeyserBungeeConfiguration extends GeyserJacksonConfiguration { private Path floodgateKey; - public GeyserBungeeConfiguration(File dataFolder, Configuration config) { - this.dataFolder = dataFolder; - this.config = config; - - bedrockConfig = new BungeeBedrockConfiguration(); - remoteConfig = new BungeeRemoteConfiguration(); - metricsInfo = new BungeeMetricsInfo(); - - if (!config.contains("userAuths")) - return; - - for (String key : config.getSection("userAuths").getKeys()) { - userAuthInfo.put(key, new BungeeUserAuthenticationInfo(key)); - } - } - - public void loadFloodgate(GeyserBungeePlugin plugin) { + public void loadFloodgate(GeyserBungeePlugin plugin, Configuration configuration) { Plugin floodgate = plugin.getProxy().getPluginManager().getPlugin("floodgate-bungee"); - floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(dataFolder.toString(), config.getString("floodgate-key-file", "public-key.pem")), floodgate, floodgate != null ? floodgate.getDataFolder().toPath() : null); - } - - @Override - public BungeeBedrockConfiguration getBedrock() { - return bedrockConfig; - } - - @Override - public BungeeRemoteConfiguration getRemote() { - return remoteConfig; - } - - @Override - public Map getUserAuths() { - return userAuthInfo; - } - - @Override - public boolean isCommandSuggestions() { - return config.getBoolean("command-suggestions", true); - } - - @Override - public boolean isPassthroughMotd() { - return config.getBoolean("passthrough-motd", false); - } - - @Override - public boolean isPassthroughPlayerCounts() { - return config.getBoolean("passthrough-player-counts", false); - } - - @Override - public boolean isLegacyPingPassthrough() { - return config.getBoolean("legacy-ping-passthrough", false); - } - - @Override - public int getPingPassthroughInterval() { - return config.getInt("ping-passthrough-interval", 3); - } - - @Override - public int getMaxPlayers() { - return config.getInt("max-players", 10); - } - - @Override - public boolean isDebugMode() { - return config.getBoolean("debug-mode", false); - } - - @Override - public int getGeneralThreadPool() { - return config.getInt("general-thread-pool", 32); - } - - @Override - public boolean isAllowThirdPartyCapes() { - return config.getBoolean("allow-third-party-capes", true); - } - - @Override - public boolean isAllowThirdPartyEars() { - return config.getBoolean("allow-third-party-ears", false); - } - - @Override - public String getDefaultLocale() { - return config.getString("default-locale", "en_us"); + floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(plugin.getDataFolder().toString(), configuration.getString("floodgate-key-file"), "public-key.pem"), floodgate, floodgate != null ? floodgate.getDataFolder().toPath() : null); } @Override public Path getFloodgateKeyFile() { return floodgateKey; } - - @Override - public boolean isCacheChunks() { - return config.getBoolean("cache-chunks", false); - } - - @Override - public boolean isAboveBedrockNetherBuilding() { - return config.getBoolean("above-bedrock-nether-building", false); - } - - @Override - public BungeeMetricsInfo getMetrics() { - return metricsInfo; - } - - public class BungeeBedrockConfiguration implements IBedrockConfiguration { - - @Override - public String getAddress() { - return config.getString("bedrock.address", "0.0.0.0"); - } - - @Override - public int getPort() { - return config.getInt("bedrock.port", 25565); - } - - @Override - public String getMotd1() { - return config.getString("bedrock.motd1", "GeyserMC"); - } - - @Override - public String getMotd2() { - return config.getString("bedrock.motd2", "GeyserMC"); - } - } - - public class BungeeRemoteConfiguration implements IRemoteConfiguration { - - @Override - public String getAddress() { - return config.getString("remote.address", "127.0.0.1"); - } - - @Override - public int getPort() { - return config.getInt("remote.port", 25565); - } - - @Override - public String getAuthType() { - return config.getString("remote.auth-type", "online"); - } - } - - public class BungeeUserAuthenticationInfo implements IUserAuthenticationInfo { - - private String key; - - public BungeeUserAuthenticationInfo(String key) { - this.key = key; - } - - @Override - public String getEmail() { - return config.getString("userAuths." + key + ".email"); - } - - @Override - public String getPassword() { - return config.getString("userAuths." + key + ".password"); - } - } - - public class BungeeMetricsInfo implements IMetricsInfo { - - @Override - public boolean isEnabled() { - return config.getBoolean("metrics.enabled", true); - } - - @Override - public String getUniqueId() { - return config.getString("metrics.uuid", "generateduuid"); - } - } - - @Override - public int getConfigVersion() { - return config.getInt("config-version", 0); - } } diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeePlugin.java b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeePlugin.java index 525b9b6db..24793839d 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeePlugin.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/platform/bungeecord/GeyserBungeePlugin.java @@ -31,20 +31,19 @@ import net.md_5.bungee.config.Configuration; import net.md_5.bungee.config.ConfigurationProvider; import net.md_5.bungee.config.YamlConfiguration; import org.geysermc.common.PlatformType; -import org.geysermc.connector.GeyserConfiguration; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.bootstrap.GeyserBootstrap; import org.geysermc.connector.command.CommandManager; +import org.geysermc.connector.configuration.GeyserConfiguration; import org.geysermc.connector.ping.GeyserLegacyPingPassthrough; import org.geysermc.connector.ping.IGeyserPingPassthrough; +import org.geysermc.connector.utils.FileUtils; import org.geysermc.platform.bungeecord.command.GeyserBungeeCommandExecutor; import org.geysermc.platform.bungeecord.command.GeyserBungeeCommandManager; import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.net.InetSocketAddress; -import java.nio.file.Files; import java.util.UUID; import java.util.logging.Level; @@ -62,32 +61,18 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { if (!getDataFolder().exists()) getDataFolder().mkdir(); - File file = new File(getDataFolder(), "config.yml"); Configuration configuration = null; - - if (!file.exists()) { - try (InputStream in = getResourceAsStream("config.yml")) { - Files.copy(in, file.toPath()); - } catch (IOException ex) { - getLogger().log(Level.SEVERE, "Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex); - return; - } - } try { + if (!getDataFolder().exists()) + getDataFolder().mkdir(); + File configFile = FileUtils.fileOrCopiedFromResource(new File(getDataFolder(), "config.yml"), "config.yml", (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString())); + this.geyserConfig = FileUtils.loadConfig(configFile, GeyserBungeeConfiguration.class); configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(new File(getDataFolder(), "config.yml")); - } catch(IOException e) { - e.printStackTrace(); + } catch (IOException ex) { + getLogger().log(Level.WARNING, "Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex); + ex.printStackTrace(); } - if (configuration == null) { - getLogger().severe("Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!"); - return; - } - - this.geyserConfig = new GeyserBungeeConfiguration(getDataFolder(), configuration); - - boolean configHasChanged = false; - if (getProxy().getConfig().getListeners().size() == 1) { ListenerInfo listener = getProxy().getConfig().getListeners().toArray(new ListenerInfo[0])[0]; @@ -96,33 +81,21 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { // Don't change the ip if its listening on all interfaces // By default this should be 127.0.0.1 but may need to be changed in some circumstances if (!javaAddr.getHostString().equals("0.0.0.0") && !javaAddr.getHostString().equals("")) { - configuration.set("remote.address", javaAddr.getHostString()); + this.geyserConfig.getRemote().setAddress(javaAddr.getHostString()); } - configuration.set("remote.port", javaAddr.getPort()); - - configHasChanged = true; - } - - if (geyserConfig.getMetrics().getUniqueId().equals("generateduuid")) { - configuration.set("metrics.uuid", UUID.randomUUID().toString()); - - configHasChanged = true; - } - - if (configHasChanged) { - try { - ConfigurationProvider.getProvider(YamlConfiguration.class).save(configuration, new File(getDataFolder(), "config.yml")); - } catch (IOException ex) { - getLogger().log(Level.SEVERE, "Failed to read/create config.yml! Make sure it's up to date and/or readable+writable!", ex); - return; - } + this.geyserConfig.getRemote().setPort(javaAddr.getPort()); } this.geyserLogger = new GeyserBungeeLogger(getLogger(), geyserConfig.isDebugMode()); GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); - geyserConfig.loadFloodgate(this); + if (geyserConfig.getRemote().getAuthType().equals("floodgate") && getProxy().getPluginManager().getPlugin("floodgate-bungee") == null) { + geyserLogger.severe("Auth type set to Floodgate but Floodgate not found! Disabling..."); + return; + } + + geyserConfig.loadFloodgate(this, configuration); this.connector = GeyserConnector.start(PlatformType.BUNGEECORD, this); diff --git a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeConfiguration.java b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeConfiguration.java index fc1484708..2b02ec0d4 100644 --- a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeConfiguration.java +++ b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongeConfiguration.java @@ -29,7 +29,7 @@ import lombok.AllArgsConstructor; import ninja.leaping.configurate.ConfigurationNode; -import org.geysermc.connector.GeyserConfiguration; +import org.geysermc.connector.configuration.GeyserConfiguration; import java.io.File; import java.nio.file.Path; diff --git a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePlugin.java b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePlugin.java index d226add77..2288fc674 100644 --- a/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePlugin.java +++ b/bootstrap/sponge/src/main/java/org/geysermc/platform/sponge/GeyserSpongePlugin.java @@ -30,7 +30,7 @@ import ninja.leaping.configurate.ConfigurationNode; import ninja.leaping.configurate.loader.ConfigurationLoader; import ninja.leaping.configurate.yaml.YAMLConfigurationLoader; import org.geysermc.common.PlatformType; -import org.geysermc.connector.GeyserConfiguration; +import org.geysermc.connector.configuration.GeyserConfiguration; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.bootstrap.GeyserBootstrap; import org.geysermc.connector.command.CommandManager; diff --git a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneBootstrap.java b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneBootstrap.java index aa0d2392e..a1c472387 100644 --- a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneBootstrap.java +++ b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneBootstrap.java @@ -26,12 +26,12 @@ package org.geysermc.platform.standalone; import org.geysermc.common.PlatformType; -import org.geysermc.connector.ping.GeyserLegacyPingPassthrough; -import org.geysermc.connector.GeyserConfiguration; -import org.geysermc.connector.bootstrap.GeyserBootstrap; import org.geysermc.connector.GeyserConnector; +import org.geysermc.connector.bootstrap.GeyserBootstrap; +import org.geysermc.connector.configuration.GeyserConfiguration; import org.geysermc.connector.command.CommandManager; import org.geysermc.connector.ping.IGeyserPingPassthrough; +import org.geysermc.connector.ping.GeyserLegacyPingPassthrough; import org.geysermc.connector.utils.FileUtils; import org.geysermc.platform.standalone.command.GeyserCommandManager; diff --git a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneConfiguration.java b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneConfiguration.java index bd0292040..29e18d08f 100644 --- a/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneConfiguration.java +++ b/bootstrap/standalone/src/main/java/org/geysermc/platform/standalone/GeyserStandaloneConfiguration.java @@ -27,110 +27,21 @@ package org.geysermc.platform.standalone; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; - import lombok.Getter; -import org.geysermc.connector.GeyserConfiguration; +import org.geysermc.connector.configuration.GeyserJacksonConfiguration; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Map; -@JsonIgnoreProperties(ignoreUnknown = true) @Getter -public class GeyserStandaloneConfiguration implements GeyserConfiguration { - - private BedrockConfiguration bedrock; - private RemoteConfiguration remote; +@JsonIgnoreProperties(ignoreUnknown = true) +public class GeyserStandaloneConfiguration extends GeyserJacksonConfiguration { @JsonProperty("floodgate-key-file") private String floodgateKeyFile; - private Map userAuths; - - @JsonProperty("command-suggestions") - private boolean isCommandSuggestions; - - @JsonProperty("passthrough-motd") - private boolean isPassthroughMotd; - - @JsonProperty("passthrough-player-counts") - private boolean isPassthroughPlayerCounts; - - @JsonProperty("legacy-ping-passthrough") - private boolean isLegacyPingPassthrough; - - @JsonProperty("ping-passthrough-interval") - private int pingPassthroughInterval; - - @JsonProperty("max-players") - private int maxPlayers; - - @JsonProperty("debug-mode") - private boolean debugMode; - - @JsonProperty("general-thread-pool") - private int generalThreadPool; - - @JsonProperty("allow-third-party-capes") - private boolean allowThirdPartyCapes; - - @JsonProperty("allow-third-party-ears") - private boolean allowThirdPartyEars; - - @JsonProperty("default-locale") - private String defaultLocale; - - @JsonProperty("cache-chunks") - private boolean cacheChunks; - - @JsonProperty("above-bedrock-nether-building") - private boolean isAboveBedrockNetherBuilding; - - private MetricsInfo metrics; - @Override public Path getFloodgateKeyFile() { return Paths.get(floodgateKeyFile); } - - @Getter - public static class BedrockConfiguration implements IBedrockConfiguration { - - private String address; - private int port; - - private String motd1; - private String motd2; - } - - @Getter - public static class RemoteConfiguration implements IRemoteConfiguration { - - private String address; - private int port; - - private String motd1; - private String motd2; - - @JsonProperty("auth-type") - private String authType; - } - - @Getter - public static class UserAuthenticationInfo implements IUserAuthenticationInfo { - private String email; - private String password; - } - - @Getter - public static class MetricsInfo implements IMetricsInfo { - - private boolean enabled; - - @JsonProperty("uuid") - private String uniqueId; - } - - @JsonProperty("config-version") - private int configVersion; } diff --git a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityConfiguration.java b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityConfiguration.java index aef0edaa5..574941c48 100644 --- a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityConfiguration.java +++ b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityConfiguration.java @@ -30,122 +30,30 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.velocitypowered.api.plugin.PluginContainer; import com.velocitypowered.api.proxy.ProxyServer; import lombok.Getter; -import lombok.Setter; import org.geysermc.connector.FloodgateKeyLoader; -import org.geysermc.connector.GeyserConfiguration; +import org.geysermc.connector.configuration.GeyserJacksonConfiguration; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Map; import java.util.Optional; -@JsonIgnoreProperties(ignoreUnknown = true) @Getter -public class GeyserVelocityConfiguration implements GeyserConfiguration { - - private BedrockConfiguration bedrock; - private RemoteConfiguration remote; +@JsonIgnoreProperties(ignoreUnknown = true) +public class GeyserVelocityConfiguration extends GeyserJacksonConfiguration { @JsonProperty("floodgate-key-file") private String floodgateKeyFile; - private Map userAuths; - - @JsonProperty("command-suggestions") - private boolean commandSuggestions; - - @JsonProperty("passthrough-motd") - private boolean isPassthroughMotd; - - @JsonProperty("passthrough-player-counts") - private boolean isPassthroughPlayerCounts; - - @JsonProperty("legacy-ping-passthrough") - private boolean isLegacyPingPassthrough; - - @JsonProperty("ping-passthrough-interval") - private int pingPassthroughInterval; - - @JsonProperty("max-players") - private int maxPlayers; - - @JsonProperty("debug-mode") - private boolean debugMode; - - @JsonProperty("general-thread-pool") - private int generalThreadPool; - - @JsonProperty("allow-third-party-capes") - private boolean allowThirdPartyCapes; - - @JsonProperty("allow-third-party-ears") - private boolean allowThirdPartyEars; - - @JsonProperty("default-locale") - private String defaultLocale; - - @JsonProperty("cache-chunks") - private boolean cacheChunks; - - @JsonProperty("above-bedrock-nether-building") - private boolean aboveBedrockNetherBuilding; - - private MetricsInfo metrics; - private Path floodgateKey; - public void loadFloodgate(GeyserVelocityPlugin plugin, ProxyServer proxyServer, File dataFolder) { - Optional floodgate = proxyServer.getPluginManager().getPlugin("floodgate"); - floodgate.ifPresent(it -> floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(dataFolder.toString(), floodgateKeyFile.isEmpty() ? floodgateKeyFile : "public-key.pem"), it, Paths.get("plugins/floodgate/"))); - } - @Override public Path getFloodgateKeyFile() { return floodgateKey; } - @Getter - public static class BedrockConfiguration implements IBedrockConfiguration { - - private String address; - private int port; - - private String motd1; - private String motd2; + public void loadFloodgate(GeyserVelocityPlugin plugin, ProxyServer proxyServer, File dataFolder) { + Optional floodgate = proxyServer.getPluginManager().getPlugin("floodgate"); + floodgate.ifPresent(it -> floodgateKey = FloodgateKeyLoader.getKey(plugin.getGeyserLogger(), this, Paths.get(dataFolder.toString(), floodgateKeyFile.isEmpty() ? floodgateKeyFile : "public-key.pem"), it, Paths.get("plugins/floodgate/"))); } - - @Getter - public static class RemoteConfiguration implements IRemoteConfiguration { - - @Setter - private String address; - - @Setter - private int port; - - private String motd1; - private String motd2; - - @JsonProperty("auth-type") - private String authType; - } - - @Getter - public static class UserAuthenticationInfo implements IUserAuthenticationInfo { - private String email; - private String password; - } - - @Getter - public static class MetricsInfo implements IMetricsInfo { - - private boolean enabled; - - @JsonProperty("uuid") - private String uniqueId; - } - - @JsonProperty("config-version") - private int configVersion; } diff --git a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityPlugin.java b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityPlugin.java index e7b44da53..e2a4787b4 100644 --- a/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityPlugin.java +++ b/bootstrap/velocity/src/main/java/org/geysermc/platform/velocity/GeyserVelocityPlugin.java @@ -35,7 +35,7 @@ import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.proxy.ProxyServer; import org.geysermc.common.PlatformType; -import org.geysermc.connector.GeyserConfiguration; +import org.geysermc.connector.configuration.GeyserConfiguration; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.bootstrap.GeyserBootstrap; import org.geysermc.connector.ping.GeyserLegacyPingPassthrough; @@ -96,6 +96,11 @@ public class GeyserVelocityPlugin implements GeyserBootstrap { this.geyserLogger = new GeyserVelocityLogger(logger, geyserConfig.isDebugMode()); GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); + if (geyserConfig.getRemote().getAuthType().equals("floodgate") && !proxyServer.getPluginManager().getPlugin("floodgate").isPresent()) { + geyserLogger.severe("Auth type set to Floodgate but Floodgate not found! Disabling..."); + return; + } + geyserConfig.loadFloodgate(this, proxyServer, configDir); this.connector = GeyserConnector.start(PlatformType.VELOCITY, this); diff --git a/connector/src/main/java/org/geysermc/connector/FloodgateKeyLoader.java b/connector/src/main/java/org/geysermc/connector/FloodgateKeyLoader.java index 0b631b2d2..617ac83eb 100644 --- a/connector/src/main/java/org/geysermc/connector/FloodgateKeyLoader.java +++ b/connector/src/main/java/org/geysermc/connector/FloodgateKeyLoader.java @@ -26,6 +26,8 @@ package org.geysermc.connector; +import org.geysermc.connector.configuration.GeyserConfiguration; + import java.nio.file.Files; import java.nio.file.Path; diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 02e0c5003..abd48bc29 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -35,6 +35,7 @@ import org.geysermc.common.AuthType; import org.geysermc.common.PlatformType; import org.geysermc.connector.bootstrap.GeyserBootstrap; import org.geysermc.connector.command.CommandManager; +import org.geysermc.connector.configuration.GeyserConfiguration; import org.geysermc.connector.metrics.Metrics; import org.geysermc.connector.network.ConnectorServerEventHandler; import org.geysermc.connector.network.remote.RemoteServer; diff --git a/connector/src/main/java/org/geysermc/connector/bootstrap/GeyserBootstrap.java b/connector/src/main/java/org/geysermc/connector/bootstrap/GeyserBootstrap.java index 24ce81cfd..5cc6d06f3 100644 --- a/connector/src/main/java/org/geysermc/connector/bootstrap/GeyserBootstrap.java +++ b/connector/src/main/java/org/geysermc/connector/bootstrap/GeyserBootstrap.java @@ -27,7 +27,7 @@ package org.geysermc.connector.bootstrap; import org.geysermc.connector.ping.IGeyserPingPassthrough; -import org.geysermc.connector.GeyserConfiguration; +import org.geysermc.connector.configuration.GeyserConfiguration; import org.geysermc.connector.GeyserLogger; import org.geysermc.connector.command.CommandManager; import org.geysermc.connector.network.translators.world.CachedChunkManager; diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConfiguration.java b/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java similarity index 97% rename from connector/src/main/java/org/geysermc/connector/GeyserConfiguration.java rename to connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java index 8a39323b6..8e59644e9 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConfiguration.java +++ b/connector/src/main/java/org/geysermc/connector/configuration/GeyserConfiguration.java @@ -24,7 +24,9 @@ * */ -package org.geysermc.connector; +package org.geysermc.connector.configuration; + +import org.geysermc.connector.GeyserLogger; import java.nio.file.Path; import java.util.Map; diff --git a/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java b/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java new file mode 100644 index 000000000..a1d0db217 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/configuration/GeyserJacksonConfiguration.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org + * + * 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. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + * + */ + +package org.geysermc.connector.configuration; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; + +import java.nio.file.Path; +import java.util.Map; + +@Getter +@JsonIgnoreProperties(ignoreUnknown = true) +public abstract class GeyserJacksonConfiguration implements GeyserConfiguration { + + private BedrockConfiguration bedrock; + private RemoteConfiguration remote; + + @JsonProperty("floodgate-key-file") + private String floodgateKeyFile; + + public abstract Path getFloodgateKeyFile(); + + private Map userAuths; + + @JsonProperty("command-suggestions") + private boolean commandSuggestions; + + @JsonProperty("passthrough-motd") + private boolean isPassthroughMotd; + + @JsonProperty("passthrough-player-counts") + private boolean isPassthroughPlayerCounts; + + @JsonProperty("legacy-ping-passthrough") + private boolean isLegacyPingPassthrough; + + @JsonProperty("ping-passthrough-interval") + private int pingPassthroughInterval; + + @JsonProperty("max-players") + private int maxPlayers; + + @JsonProperty("debug-mode") + private boolean debugMode; + + @JsonProperty("general-thread-pool") + private int generalThreadPool; + + @JsonProperty("allow-third-party-capes") + private boolean allowThirdPartyCapes; + + @JsonProperty("allow-third-party-ears") + private boolean allowThirdPartyEars; + + @JsonProperty("default-locale") + private String defaultLocale; + + @JsonProperty("cache-chunks") + private boolean cacheChunks; + + @JsonProperty("above-bedrock-nether-building") + private boolean aboveBedrockNetherBuilding; + + private MetricsInfo metrics; + + @Getter + public static class BedrockConfiguration implements IBedrockConfiguration { + + private String address; + private int port; + + private String motd1; + private String motd2; + } + + @Getter + public static class RemoteConfiguration implements IRemoteConfiguration { + + @Setter + private String address; + + @Setter + private int port; + + private String motd1; + private String motd2; + + @JsonProperty("auth-type") + private String authType; + } + + @Getter + public static class UserAuthenticationInfo implements IUserAuthenticationInfo { + private String email; + private String password; + } + + @Getter + public static class MetricsInfo implements IMetricsInfo { + + private boolean enabled; + + @JsonProperty("uuid") + private String uniqueId; + } + + @JsonProperty("config-version") + private int configVersion; +} diff --git a/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java b/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java index 29ba15678..49f81e3f8 100644 --- a/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/ConnectorServerEventHandler.java @@ -31,7 +31,7 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.socket.DatagramPacket; import org.geysermc.common.ping.GeyserPingInfo; import org.geysermc.connector.ping.IGeyserPingPassthrough; -import org.geysermc.connector.GeyserConfiguration; +import org.geysermc.connector.configuration.GeyserConfiguration; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.utils.MessageUtils; diff --git a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java index 67862d0e7..5a40b2467 100644 --- a/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java +++ b/connector/src/main/java/org/geysermc/connector/network/UpstreamPacketHandler.java @@ -28,7 +28,7 @@ package org.geysermc.connector.network; import com.nukkitx.protocol.bedrock.BedrockPacket; import com.nukkitx.protocol.bedrock.packet.*; import org.geysermc.common.AuthType; -import org.geysermc.connector.GeyserConfiguration; +import org.geysermc.connector.configuration.GeyserConfiguration; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.PacketTranslatorRegistry; diff --git a/connector/src/main/java/org/geysermc/connector/ping/GeyserLegacyPingPassthrough.java b/connector/src/main/java/org/geysermc/connector/ping/GeyserLegacyPingPassthrough.java index ea0d67c21..6a323d549 100644 --- a/connector/src/main/java/org/geysermc/connector/ping/GeyserLegacyPingPassthrough.java +++ b/connector/src/main/java/org/geysermc/connector/ping/GeyserLegacyPingPassthrough.java @@ -33,9 +33,7 @@ import com.github.steveice10.mc.protocol.data.status.handler.ServerInfoHandler; import com.github.steveice10.packetlib.Client; import com.github.steveice10.packetlib.tcp.TcpSessionFactory; import org.geysermc.common.ping.GeyserPingInfo; -import org.geysermc.connector.GeyserConfiguration; import org.geysermc.connector.GeyserConnector; -import org.geysermc.connector.GeyserLogger; import java.util.concurrent.TimeUnit;