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 df98b408..327c41da 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 5f0e967a..52893fc8 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 d983aec1..839fc185 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 525b9b6d..24793839 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 fc148470..2b02ec0d 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 d226add7..2288fc67 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 aa0d2392..a1c47238 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 bd029204..29e18d08 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 aef0edaa..574941c4 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 e7b44da5..e2a4787b 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 0b631b2d..617ac83e 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 02e0c500..abd48bc2 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 24ce81cf..5cc6d06f 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 8a39323b..8e59644e 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 00000000..a1d0db21 --- /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 29ba1567..49f81e3f 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 67862d0e..5a40b246 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 ea0d67c2..6a323d54 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;