From 5e51ac9f487913a0508788748b43fd66d27c6587 Mon Sep 17 00:00:00 2001 From: Redned Date: Wed, 2 Feb 2022 11:10:57 -0600 Subject: [PATCH 1/6] Quick fix for GameProfile's being empty --- .../platform/command/TranslatableMessage.java | 6 +-- .../player/UserAudienceArgument.java | 2 +- spigot/pom.xml | 8 ++- .../listener/PaperProfileListener.java | 54 +++++++++++++++++++ .../listener/SpigotListenerRegistration.java | 4 ++ .../module/SpigotListenerModule.java | 8 +++ .../geysermc/floodgate/util/PaperChecker.java | 44 +++++++++++++++ 7 files changed, 120 insertions(+), 6 deletions(-) create mode 100644 spigot/src/main/java/org/geysermc/floodgate/listener/PaperProfileListener.java create mode 100644 spigot/src/main/java/org/geysermc/floodgate/util/PaperChecker.java diff --git a/common/src/main/java/org/geysermc/floodgate/platform/command/TranslatableMessage.java b/common/src/main/java/org/geysermc/floodgate/platform/command/TranslatableMessage.java index 56ecc1a8..4a62b59a 100644 --- a/common/src/main/java/org/geysermc/floodgate/platform/command/TranslatableMessage.java +++ b/common/src/main/java/org/geysermc/floodgate/platform/command/TranslatableMessage.java @@ -28,8 +28,8 @@ package org.geysermc.floodgate.platform.command; import org.geysermc.floodgate.util.LanguageManager; /** - * TranslatableMessage is the interface for a message that can be translated. - * Messages are generally implemented using enums. + * TranslatableMessage is the interface for a message that can be translated. Messages are generally + * implemented using enums. */ public interface TranslatableMessage { /** @@ -52,7 +52,7 @@ public interface TranslatableMessage { for (int i = 0; i < translateParts.length; i++) { builder.append(manager.getString(translateParts[i], locale, args)); if (translateParts.length != i + 1) { - builder.append(" "); + builder.append(' '); } } return builder.toString(); diff --git a/common/src/main/java/org/geysermc/floodgate/player/UserAudienceArgument.java b/common/src/main/java/org/geysermc/floodgate/player/UserAudienceArgument.java index 184d1329..0deecef6 100644 --- a/common/src/main/java/org/geysermc/floodgate/player/UserAudienceArgument.java +++ b/common/src/main/java/org/geysermc/floodgate/player/UserAudienceArgument.java @@ -111,7 +111,7 @@ public final class UserAudienceArgument extends CommandArgument - org.spigotmc - spigot-api + com.destroystokyo.paper + paper-api ${spigot.version} provided @@ -92,6 +92,10 @@ spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + papermc-repo + https://papermc.io/repo/repository/maven-public/ + minecraft-libraries https://libraries.minecraft.net/ diff --git a/spigot/src/main/java/org/geysermc/floodgate/listener/PaperProfileListener.java b/spigot/src/main/java/org/geysermc/floodgate/listener/PaperProfileListener.java new file mode 100644 index 00000000..758289a4 --- /dev/null +++ b/spigot/src/main/java/org/geysermc/floodgate/listener/PaperProfileListener.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2019-2022 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/Floodgate + */ + +package org.geysermc.floodgate.listener; + +import com.destroystokyo.paper.event.profile.PreFillProfileEvent; +import com.destroystokyo.paper.profile.ProfileProperty; +import com.google.inject.Inject; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.geysermc.floodgate.api.SimpleFloodgateApi; + +public final class PaperProfileListener implements Listener { + @Inject private SimpleFloodgateApi api; + + @EventHandler + public void onFill(PreFillProfileEvent event) { + UUID id = event.getPlayerProfile().getId(); + if (!this.api.isFloodgatePlayer(id) || + event.getPlayerProfile().getProperties().stream().anyMatch( + prop -> "textures".equals(prop.getName()))) { + return; + } + + Set properties = new HashSet<>(event.getPlayerProfile().getProperties()); + properties.add(new ProfileProperty("textures", "", "")); + event.setProperties(properties); + } +} diff --git a/spigot/src/main/java/org/geysermc/floodgate/listener/SpigotListenerRegistration.java b/spigot/src/main/java/org/geysermc/floodgate/listener/SpigotListenerRegistration.java index 7e54d749..8660db8e 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/listener/SpigotListenerRegistration.java +++ b/spigot/src/main/java/org/geysermc/floodgate/listener/SpigotListenerRegistration.java @@ -38,6 +38,10 @@ public final class SpigotListenerRegistration implements ListenerRegistration
  • Date: Wed, 2 Feb 2022 12:48:41 -0500 Subject: [PATCH 2/6] Only initialize Paper listener with class existance --- .../org/geysermc/floodgate/SpigotPlugin.java | 10 ++++++- .../PaperListenerModule.java} | 28 ++++++++++--------- .../module/SpigotListenerModule.java | 10 +------ 3 files changed, 25 insertions(+), 23 deletions(-) rename spigot/src/main/java/org/geysermc/floodgate/{util/PaperChecker.java => module/PaperListenerModule.java} (65%) diff --git a/spigot/src/main/java/org/geysermc/floodgate/SpigotPlugin.java b/spigot/src/main/java/org/geysermc/floodgate/SpigotPlugin.java index 66bb38e7..8a23d8d7 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/SpigotPlugin.java +++ b/spigot/src/main/java/org/geysermc/floodgate/SpigotPlugin.java @@ -30,12 +30,14 @@ import com.google.inject.Injector; import org.bukkit.plugin.java.JavaPlugin; import org.geysermc.floodgate.api.handshake.HandshakeHandlers; import org.geysermc.floodgate.api.logger.FloodgateLogger; +import org.geysermc.floodgate.module.PaperListenerModule; import org.geysermc.floodgate.module.PluginMessageModule; import org.geysermc.floodgate.module.ServerCommonModule; import org.geysermc.floodgate.module.SpigotAddonModule; import org.geysermc.floodgate.module.SpigotCommandModule; import org.geysermc.floodgate.module.SpigotListenerModule; import org.geysermc.floodgate.module.SpigotPlatformModule; +import org.geysermc.floodgate.util.ReflectionUtils; import org.geysermc.floodgate.util.SpigotHandshakeHandler; import org.geysermc.floodgate.util.SpigotProtocolSupportHandler; import org.geysermc.floodgate.util.SpigotProtocolSupportListener; @@ -63,11 +65,17 @@ public final class SpigotPlugin extends JavaPlugin { public void onEnable() { platform.enable( new SpigotCommandModule(this), - new SpigotListenerModule(), new SpigotAddonModule(), new PluginMessageModule() ); + if (ReflectionUtils.getClassSilently( + "com.destroystokyo.paper.event.profile.PreFillProfileEvent") != null) { + platform.enable(new PaperListenerModule()); + } else { + platform.enable(new SpigotListenerModule()); + } + //todo add proper support for disabling things on shutdown and enabling this on enable injector.getInstance(HandshakeHandlers.class) .addHandshakeHandler(injector.getInstance(SpigotHandshakeHandler.class)); diff --git a/spigot/src/main/java/org/geysermc/floodgate/util/PaperChecker.java b/spigot/src/main/java/org/geysermc/floodgate/module/PaperListenerModule.java similarity index 65% rename from spigot/src/main/java/org/geysermc/floodgate/util/PaperChecker.java rename to spigot/src/main/java/org/geysermc/floodgate/module/PaperListenerModule.java index 33a91fdf..fb7249fb 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/util/PaperChecker.java +++ b/spigot/src/main/java/org/geysermc/floodgate/module/PaperListenerModule.java @@ -23,22 +23,24 @@ * @link https://github.com/GeyserMC/Floodgate */ -package org.geysermc.floodgate.util; +package org.geysermc.floodgate.module; -public class PaperChecker { +import com.google.inject.Singleton; +import com.google.inject.TypeLiteral; +import com.google.inject.multibindings.ProvidesIntoSet; +import org.bukkit.event.Listener; +import org.geysermc.floodgate.listener.PaperProfileListener; +import org.geysermc.floodgate.register.ListenerRegister; - private static boolean SUPPORTS_PAPER; - - static { - try { - Class.forName("com.destroystokyo.paper.PaperConfig"); - SUPPORTS_PAPER = true; - } catch (ClassNotFoundException e) { - SUPPORTS_PAPER = false; - } +public class PaperListenerModule extends SpigotListenerModule { + @Override + protected void configure() { + bind(new TypeLiteral>() {}).asEagerSingleton(); } - public static boolean supportsPaper() { - return SUPPORTS_PAPER; + @Singleton + @ProvidesIntoSet + public Listener paperProfileListener() { + return new PaperProfileListener(); } } diff --git a/spigot/src/main/java/org/geysermc/floodgate/module/SpigotListenerModule.java b/spigot/src/main/java/org/geysermc/floodgate/module/SpigotListenerModule.java index da0012a4..769d275b 100644 --- a/spigot/src/main/java/org/geysermc/floodgate/module/SpigotListenerModule.java +++ b/spigot/src/main/java/org/geysermc/floodgate/module/SpigotListenerModule.java @@ -30,12 +30,10 @@ import com.google.inject.Singleton; import com.google.inject.TypeLiteral; import com.google.inject.multibindings.ProvidesIntoSet; import org.bukkit.event.Listener; -import org.geysermc.floodgate.listener.PaperProfileListener; import org.geysermc.floodgate.listener.SpigotListener; import org.geysermc.floodgate.register.ListenerRegister; -import org.geysermc.floodgate.util.PaperChecker; -public final class SpigotListenerModule extends AbstractModule { +public class SpigotListenerModule extends AbstractModule { @Override protected void configure() { bind(new TypeLiteral>() {}).asEagerSingleton(); @@ -46,10 +44,4 @@ public final class SpigotListenerModule extends AbstractModule { public Listener spigotListener() { return new SpigotListener(); } - - @Singleton - @ProvidesIntoSet - public Listener paperProfileListener() { - return PaperChecker.supportsPaper() ? new PaperProfileListener() : null; - } } From aa0a8405c2dacf662edcd4dedbae1edab464aced Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Wed, 2 Feb 2022 13:10:47 -0500 Subject: [PATCH 3/6] Fix Velocity with Mojang authentication change --- .../org/geysermc/floodgate/listener/VelocityListener.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java b/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java index 0c314854..fde89954 100644 --- a/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java +++ b/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java @@ -44,6 +44,7 @@ import com.velocitypowered.api.event.connection.PreLoginEvent; import com.velocitypowered.api.event.player.GameProfileRequestEvent; import com.velocitypowered.api.proxy.InboundConnection; import com.velocitypowered.api.util.GameProfile; +import com.velocitypowered.api.util.GameProfile.Property; import io.netty.channel.Channel; import io.netty.util.AttributeKey; import java.lang.reflect.Field; @@ -141,8 +142,11 @@ public final class VelocityListener { FloodgatePlayer player = playerCache.getIfPresent(event.getConnection()); if (player != null) { playerCache.invalidate(event.getConnection()); - event.setGameProfile(new GameProfile( - player.getCorrectUniqueId(), player.getCorrectUsername(), new ArrayList<>())); + GameProfile profile = new GameProfile( + player.getCorrectUniqueId(), player.getCorrectUsername(), new ArrayList<>()); + // To fix the February 2 2022 Mojang authentication changes + profile.addProperty(new Property("textures", "", "")); + event.setGameProfile(profile); } } From 8beed574e53c1fcf687158567976813e8e4ba2c3 Mon Sep 17 00:00:00 2001 From: Tim203 Date: Wed, 2 Feb 2022 20:44:57 +0100 Subject: [PATCH 4/6] Fix BungeeCord with Mojang authentication change --- .../geysermc/floodgate/listener/BungeeListener.java | 13 +++++++++++++ .../floodgate/pluginmessage/BungeeSkinApplier.java | 11 +++++++++++ 2 files changed, 24 insertions(+) diff --git a/bungee/src/main/java/org/geysermc/floodgate/listener/BungeeListener.java b/bungee/src/main/java/org/geysermc/floodgate/listener/BungeeListener.java index 7786b91e..944ac63e 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/listener/BungeeListener.java +++ b/bungee/src/main/java/org/geysermc/floodgate/listener/BungeeListener.java @@ -36,6 +36,7 @@ import java.util.UUID; import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.event.LoginEvent; import net.md_5.bungee.api.event.PlayerDisconnectEvent; +import net.md_5.bungee.api.event.PostLoginEvent; import net.md_5.bungee.api.event.PreLoginEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.connection.InitialHandler; @@ -46,6 +47,8 @@ import org.geysermc.floodgate.api.ProxyFloodgateApi; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.api.player.FloodgatePlayer; import org.geysermc.floodgate.player.FloodgatePlayerImpl; +import org.geysermc.floodgate.skin.SkinApplier; +import org.geysermc.floodgate.skin.SkinData; import org.geysermc.floodgate.util.BungeeCommandUtil; import org.geysermc.floodgate.util.LanguageManager; import org.geysermc.floodgate.util.ReflectionUtils; @@ -67,6 +70,7 @@ public final class BungeeListener implements Listener { @Inject private ProxyFloodgateApi api; @Inject private LanguageManager languageManager; @Inject private FloodgateLogger logger; + @Inject private SkinApplier skinApplier; @Inject @Named("playerAttribute") @@ -120,6 +124,15 @@ public final class BungeeListener implements Listener { } } + @EventHandler(priority = EventPriority.LOWEST) + public void onPostLogin(PostLoginEvent event) { + // To fix the February 2 2022 Mojang authentication changes + FloodgatePlayer player = api.getPlayer(event.getPlayer().getUniqueId()); + if (player != null) { + skinApplier.applySkin(player, new SkinData("", "")); + } + } + @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerDisconnect(PlayerDisconnectEvent event) { BungeeCommandUtil.AUDIENCE_CACHE.remove(event.getPlayer().getUniqueId()); //todo diff --git a/bungee/src/main/java/org/geysermc/floodgate/pluginmessage/BungeeSkinApplier.java b/bungee/src/main/java/org/geysermc/floodgate/pluginmessage/BungeeSkinApplier.java index 8629cf22..08af7f44 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/pluginmessage/BungeeSkinApplier.java +++ b/bungee/src/main/java/org/geysermc/floodgate/pluginmessage/BungeeSkinApplier.java @@ -25,6 +25,10 @@ package org.geysermc.floodgate.pluginmessage; +import static org.geysermc.floodgate.util.ReflectionUtils.getFieldOfType; +import static org.geysermc.floodgate.util.ReflectionUtils.setValue; + +import java.lang.reflect.Field; import lombok.RequiredArgsConstructor; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -38,6 +42,12 @@ import org.geysermc.floodgate.skin.SkinData; @RequiredArgsConstructor public final class BungeeSkinApplier implements SkinApplier { + private static final Field LOGIN_RESULT; + + static { + LOGIN_RESULT = getFieldOfType(InitialHandler.class, LoginResult.class); + } + private final FloodgateLogger logger; @Override @@ -61,6 +71,7 @@ public final class BungeeSkinApplier implements SkinApplier { if (loginResult == null) { // id and name are unused and properties will be overridden loginResult = new LoginResult(null, null, null); + setValue(handler, LOGIN_RESULT, loginResult); } Property property = new Property("textures", skinData.getValue(), skinData.getSignature()); From c3ba9e6f730785614a63f680f6deccacc66a945f Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Wed, 2 Feb 2022 16:53:12 -0500 Subject: [PATCH 5/6] GameProfiles are immutable on Velocity --- .../geysermc/floodgate/listener/VelocityListener.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java b/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java index fde89954..e7857113 100644 --- a/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java +++ b/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java @@ -49,6 +49,7 @@ import io.netty.channel.Channel; import io.netty.util.AttributeKey; import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.Collections; import java.util.Objects; import java.util.concurrent.TimeUnit; import net.kyori.adventure.text.Component; @@ -142,11 +143,10 @@ public final class VelocityListener { FloodgatePlayer player = playerCache.getIfPresent(event.getConnection()); if (player != null) { playerCache.invalidate(event.getConnection()); - GameProfile profile = new GameProfile( - player.getCorrectUniqueId(), player.getCorrectUsername(), new ArrayList<>()); - // To fix the February 2 2022 Mojang authentication changes - profile.addProperty(new Property("textures", "", "")); - event.setGameProfile(profile); + // The texture properties addition is to fix the February 2 2022 Mojang authentication changes + event.setGameProfile(new GameProfile(player.getCorrectUniqueId(), + player.getCorrectUsername(), Collections.singletonList( + new Property("textures", "", "")))); } } From 38332db268707c640a3d5e66536110e610005e31 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Wed, 2 Feb 2022 16:56:10 -0500 Subject: [PATCH 6/6] PMD no --- .../java/org/geysermc/floodgate/listener/VelocityListener.java | 1 - 1 file changed, 1 deletion(-) diff --git a/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java b/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java index e7857113..1389dd99 100644 --- a/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java +++ b/velocity/src/main/java/org/geysermc/floodgate/listener/VelocityListener.java @@ -48,7 +48,6 @@ import com.velocitypowered.api.util.GameProfile.Property; import io.netty.channel.Channel; import io.netty.util.AttributeKey; import java.lang.reflect.Field; -import java.util.ArrayList; import java.util.Collections; import java.util.Objects; import java.util.concurrent.TimeUnit;