3
0
Mirror von https://github.com/PaperMC/Velocity.git synchronisiert 2024-11-06 00:00:47 +01:00

Fix server-sent plugin message channels, fixing WDLCompanion and similar

Closes #203
Dieser Commit ist enthalten in:
Andrew Steinborn 2019-05-12 10:05:22 -04:00
Ursprung 5f0470fb0b
Commit adfb33ad21
6 geänderte Dateien mit 25 neuen und 13 gelöschten Zeilen

Datei anzeigen

@ -260,7 +260,7 @@ public class VelocityCommand implements Command {
@Override @Override
public boolean hasPermission(CommandSource source, String @NonNull [] args) { public boolean hasPermission(CommandSource source, String @NonNull [] args) {
return source.getPermissionValue("velocity.command.plugins") == Tristate.TRUE; return source.getPermissionValue("velocity.command.plugins").asBoolean();
} }
} }
} }

Datei anzeigen

@ -86,10 +86,19 @@ public class BackendPlaySessionHandler implements MinecraftSessionHandler {
@Override @Override
public boolean handle(PluginMessage packet) { public boolean handle(PluginMessage packet) {
if (!serverConn.getPlayer().canForwardPluginMessage(packet)) { if (!serverConn.getPlayer().canForwardPluginMessage(serverConn.ensureConnected()
.getProtocolVersion(), packet)) {
return true; return true;
} }
// We need to specially handle REGISTER and UNREGISTER packets. Later on, we'll write them to
// the client.
if (PluginMessageUtil.isRegister(packet)) {
serverConn.getPlayer().getKnownChannels().addAll(PluginMessageUtil.getChannels(packet));
} else if (PluginMessageUtil.isUnregister(packet)) {
serverConn.getPlayer().getKnownChannels().removeAll(PluginMessageUtil.getChannels(packet));
}
if (PluginMessageUtil.isMcBrand(packet)) { if (PluginMessageUtil.isMcBrand(packet)) {
PluginMessage rewritten = PluginMessageUtil.rewriteMinecraftBrand(packet, PluginMessage rewritten = PluginMessageUtil.rewriteMinecraftBrand(packet,
server.getVersion()); server.getVersion());

Datei anzeigen

@ -131,15 +131,16 @@ public class TransitionSessionHandler implements MinecraftSessionHandler {
@Override @Override
public boolean handle(PluginMessage packet) { public boolean handle(PluginMessage packet) {
if (!serverConn.getPlayer().canForwardPluginMessage(packet)) { if (!serverConn.getPlayer().canForwardPluginMessage(serverConn.ensureConnected()
.getProtocolVersion(), packet)) {
return true; return true;
} }
// We need to specially handle REGISTER and UNREGISTER packets. Later on, we'll write them to
// the client.
if (PluginMessageUtil.isRegister(packet)) { if (PluginMessageUtil.isRegister(packet)) {
System.out.println("[TSH] I CAN HAZ REGISTER: " + PluginMessageUtil.getChannels(packet));
serverConn.getPlayer().getKnownChannels().addAll(PluginMessageUtil.getChannels(packet)); serverConn.getPlayer().getKnownChannels().addAll(PluginMessageUtil.getChannels(packet));
} else if (PluginMessageUtil.isUnregister(packet)) { } else if (PluginMessageUtil.isUnregister(packet)) {
System.out.println("[TSH] I CAN HAZ UNREGISTER: " + PluginMessageUtil.getChannels(packet));
serverConn.getPlayer().getKnownChannels().removeAll(PluginMessageUtil.getChannels(packet)); serverConn.getPlayer().getKnownChannels().removeAll(PluginMessageUtil.getChannels(packet));
} }

Datei anzeigen

@ -43,6 +43,7 @@ import com.velocitypowered.proxy.protocol.packet.KeepAlive;
import com.velocitypowered.proxy.protocol.packet.PluginMessage; import com.velocitypowered.proxy.protocol.packet.PluginMessage;
import com.velocitypowered.proxy.protocol.packet.ResourcePackRequest; import com.velocitypowered.proxy.protocol.packet.ResourcePackRequest;
import com.velocitypowered.proxy.protocol.packet.TitlePacket; import com.velocitypowered.proxy.protocol.packet.TitlePacket;
import com.velocitypowered.proxy.protocol.util.PluginMessageUtil;
import com.velocitypowered.proxy.server.VelocityRegisteredServer; import com.velocitypowered.proxy.server.VelocityRegisteredServer;
import com.velocitypowered.proxy.tablist.VelocityTabList; import com.velocitypowered.proxy.tablist.VelocityTabList;
import com.velocitypowered.proxy.util.VelocityMessages; import com.velocitypowered.proxy.util.VelocityMessages;
@ -650,16 +651,18 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
/** /**
* Determines whether or not we can forward a plugin message onto the client. * Determines whether or not we can forward a plugin message onto the client.
* @param version the Minecraft protocol version
* @param message the plugin message to forward to the client * @param message the plugin message to forward to the client
* @return {@code true} if the message can be forwarded, {@code false} otherwise * @return {@code true} if the message can be forwarded, {@code false} otherwise
*/ */
public boolean canForwardPluginMessage(PluginMessage message) { public boolean canForwardPluginMessage(ProtocolVersion version, PluginMessage message) {
// If we're forwarding a plugin message onto the client, that implies that we have a backend
// connection already.
MinecraftConnection mc = ensureBackendConnection();
boolean minecraftOrFmlMessage; boolean minecraftOrFmlMessage;
if (mc.getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_12_2) <= 0) {
if (PluginMessageUtil.isRegister(message) || PluginMessageUtil.isUnregister(message)) {
return true;
}
if (version.compareTo(ProtocolVersion.MINECRAFT_1_12_2) <= 0) {
String channel = message.getChannel(); String channel = message.getChannel();
minecraftOrFmlMessage = channel.startsWith("MC|") || channel minecraftOrFmlMessage = channel.startsWith("MC|") || channel
.startsWith(LegacyForgeConstants.FORGE_LEGACY_HANDSHAKE_CHANNEL); .startsWith(LegacyForgeConstants.FORGE_LEGACY_HANDSHAKE_CHANNEL);

Datei anzeigen

@ -15,7 +15,6 @@ import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.SslHandler; import io.netty.handler.ssl.SslHandler;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.URL; import java.net.URL;
import java.util.Objects;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngine;