Skip to content

Commit

Permalink
Merge branch 'v1.20.80' of https://github.com/WaterdogPE/WaterdogPE
Browse files Browse the repository at this point in the history
AkmalFairuz committed Apr 25, 2024
2 parents 9df83ef + 4de3596 commit d94345d
Showing 18 changed files with 62 additions and 53 deletions.
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -14,8 +14,8 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.release>17</maven.compiler.release>
<raklib.version>1.0.0.CR2-SNAPSHOT</raklib.version>
<protocol.version>3.0.0.Beta1-SNAPSHOT</protocol.version>
<raklib.version>1.0.0.CR3-SNAPSHOT</raklib.version>
<protocol.version>3.0.0.Beta2-SNAPSHOT</protocol.version>
<log4j2.version>2.17.1</log4j2.version>
<jline.version>3.23.0</jline.version>
<netty.version>4.1.89.Final</netty.version>
@@ -61,7 +61,7 @@
<dependency>
<groupId>net.cubespace</groupId>
<artifactId>Yamler-Core</artifactId>
<version>2.4.0-SNAPSHOT</version>
<version>2.4.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
2 changes: 2 additions & 0 deletions src/main/java/dev/waterdog/waterdogpe/ProxyServer.java
Original file line number Diff line number Diff line change
@@ -247,6 +247,7 @@ private void boot() {
this.logger.debug("Upstream <-> Proxy compression level " + this.getConfiguration().getUpstreamCompression());
this.logger.debug("Downstream <-> Proxy compression level " + this.getConfiguration().getDownstreamCompression());
this.logger.debug("MTU Settings: max_user=" + this.getNetworkSettings().getMaximumMtu() + " max_server=" + this.getNetworkSettings().getMaximumDownstreamMtu());
this.logger.debug("RakNet Cookies: enabled=" + this.getNetworkSettings().enableCookies());

ProxiedSessionInitializer.ZLIB_RAW_STRATEGY.getDefaultCompression().setLevel(this.getConfiguration().getUpstreamCompression());
ProxiedSessionInitializer.ZLIB_STRATEGY.getDefaultCompression().setLevel(this.getConfiguration().getUpstreamCompression());
@@ -269,6 +270,7 @@ private void bindChannels(InetSocketAddress address) {
.option(RakChannelOption.RAK_GUID, this.serverId)
.option(RakChannelOption.RAK_HANDLE_PING, true)
.option(RakChannelOption.RAK_MAX_MTU, this.getNetworkSettings().getMaximumMtu())
.option(RakChannelOption.RAK_SEND_COOKIE, this.getNetworkSettings().enableCookies())
.childOption(RakChannelOption.RAK_SESSION_TIMEOUT, 10000L)
.childOption(RakChannelOption.RAK_ORDERING_CHANNELS, 1)
.handler(new OfflineServerChannelInitializer(this))
Original file line number Diff line number Diff line change
@@ -16,6 +16,7 @@
package dev.waterdog.waterdogpe.network;

import io.netty.util.AttributeKey;
import org.cloudburstmc.protocol.bedrock.PacketDirection;

/**
* This interface can be used to record and display WaterdogPE-Internal metrics.
31 changes: 0 additions & 31 deletions src/main/java/dev/waterdog/waterdogpe/network/PacketDirection.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -15,6 +15,7 @@

package dev.waterdog.waterdogpe.network.connection;

import org.cloudburstmc.protocol.bedrock.PacketDirection;
import org.cloudburstmc.protocol.bedrock.netty.BedrockBatchWrapper;
import org.cloudburstmc.protocol.bedrock.packet.BedrockPacket;
import org.cloudburstmc.protocol.bedrock.packet.BedrockPacketHandler;
@@ -44,4 +45,6 @@ default int getSubClientId() {
}

long getPing();

PacketDirection getPacketDirection();
}
Original file line number Diff line number Diff line change
@@ -18,6 +18,7 @@
import dev.waterdog.waterdogpe.network.connection.ProxiedConnection;
import dev.waterdog.waterdogpe.network.serverinfo.ServerInfo;
import dev.waterdog.waterdogpe.player.ProxiedPlayer;
import org.cloudburstmc.protocol.bedrock.PacketDirection;
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper;
import org.cloudburstmc.protocol.bedrock.data.CompressionAlgorithm;
@@ -45,4 +46,9 @@ default void enableEncryption(SecretKey secretKey) {
void addDisconnectListener(Runnable listener);

void disconnect();

@Override
default PacketDirection getPacketDirection() {
return PacketDirection.SERVER_BOUND;
}
}
Original file line number Diff line number Diff line change
@@ -16,8 +16,8 @@
package dev.waterdog.waterdogpe.network.connection.codec.compression;

import dev.waterdog.waterdogpe.network.NetworkMetrics;
import dev.waterdog.waterdogpe.network.PacketDirection;
import io.netty.channel.ChannelHandlerContext;
import org.cloudburstmc.protocol.bedrock.PacketDirection;
import org.cloudburstmc.protocol.bedrock.data.CompressionAlgorithm;
import org.cloudburstmc.protocol.bedrock.netty.BedrockBatchWrapper;
import org.cloudburstmc.protocol.bedrock.netty.codec.compression.CompressionCodec;
Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@
package dev.waterdog.waterdogpe.network.connection.codec.initializer;

import dev.waterdog.waterdogpe.network.NetworkMetrics;
import dev.waterdog.waterdogpe.network.PacketDirection;
import dev.waterdog.waterdogpe.network.connection.client.BedrockClientConnection;
import dev.waterdog.waterdogpe.network.connection.client.ClientConnection;
import dev.waterdog.waterdogpe.network.connection.codec.batch.BedrockBatchDecoder;
@@ -35,6 +34,7 @@
import org.cloudburstmc.netty.channel.raknet.RakChannel;
import org.cloudburstmc.netty.channel.raknet.config.RakChannelMetrics;
import org.cloudburstmc.netty.channel.raknet.config.RakChannelOption;
import org.cloudburstmc.protocol.bedrock.PacketDirection;
import org.cloudburstmc.protocol.bedrock.netty.codec.compression.CompressionCodec;

import static dev.waterdog.waterdogpe.network.connection.codec.initializer.ProxiedSessionInitializer.*;
@@ -55,7 +55,7 @@ protected void initChannel(Channel channel) throws Exception {
int rakVersion = this.player.getProtocol().getRaknetVersion();
CompressionType compression = this.player.getProxy().getConfiguration().getCompression();

channel.attr(PacketDirection.ATTRIBUTE).set(PacketDirection.FROM_SERVER);
channel.attr(PacketDirection.ATTRIBUTE).set(PacketDirection.SERVER_BOUND);

NetworkMetrics metrics = this.player.getProxy().getNetworkMetrics();
if (metrics != null) {
@@ -79,6 +79,10 @@ protected void initChannel(Channel channel) throws Exception {
channel.pipeline().addLast(ClientConnection.NAME, handler);
}

if (connection.getPacketDirection() != PacketDirection.SERVER_BOUND) {
throw new IllegalStateException("Client connection must have a server-bound packet direction");
}

channel.pipeline()
.addLast(ClientEventHandler.NAME, new ClientEventHandler(this.player, connection))
.addLast(new ChannelActiveHandler(connection, this.promise)); // this should be the very last handler
Original file line number Diff line number Diff line change
@@ -17,7 +17,6 @@

import dev.waterdog.waterdogpe.ProxyServer;
import dev.waterdog.waterdogpe.network.NetworkMetrics;
import dev.waterdog.waterdogpe.network.PacketDirection;
import dev.waterdog.waterdogpe.network.connection.peer.BedrockServerSession;
import dev.waterdog.waterdogpe.network.connection.peer.ProxiedBedrockPeer;
import dev.waterdog.waterdogpe.network.protocol.handler.upstream.LoginUpstreamHandler;
@@ -28,6 +27,7 @@
import org.cloudburstmc.netty.channel.raknet.config.RakChannelOption;
import org.cloudburstmc.netty.handler.codec.raknet.common.RakSessionCodec;
import org.cloudburstmc.protocol.bedrock.BedrockPeer;
import org.cloudburstmc.protocol.bedrock.PacketDirection;

public class ProxiedServerSessionInitializer extends ProxiedSessionInitializer<BedrockServerSession> {

@@ -43,7 +43,7 @@ protected void initChannel(Channel channel) {
return;
}

channel.attr(PacketDirection.ATTRIBUTE).set(PacketDirection.FROM_USER);
channel.attr(PacketDirection.ATTRIBUTE).set(PacketDirection.CLIENT_BOUND);

NetworkMetrics metrics = this.proxy.getNetworkMetrics();
if (metrics != null) {
Original file line number Diff line number Diff line change
@@ -16,14 +16,16 @@
package dev.waterdog.waterdogpe.network.connection.codec.packet;

import dev.waterdog.waterdogpe.network.NetworkMetrics;
import dev.waterdog.waterdogpe.network.PacketDirection;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;
import lombok.extern.log4j.Log4j2;
import org.cloudburstmc.protocol.bedrock.PacketDirection;
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper;
import org.cloudburstmc.protocol.bedrock.codec.compat.BedrockCompat;
import org.cloudburstmc.protocol.bedrock.data.EncodingSettings;
import org.cloudburstmc.protocol.bedrock.data.PacketRecipient;
import org.cloudburstmc.protocol.bedrock.netty.BedrockBatchWrapper;
import org.cloudburstmc.protocol.bedrock.netty.BedrockPacketWrapper;
import org.cloudburstmc.protocol.bedrock.packet.BedrockPacket;
@@ -41,12 +43,15 @@ public abstract class BedrockPacketCodec extends MessageToMessageCodec<BedrockBa
private BedrockCodecHelper helper = codec.createHelper();

private boolean alwaysDecode;
private PacketRecipient inboundRecipient;

@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
if (ctx.channel().attr(PacketDirection.ATTRIBUTE).get() == PacketDirection.FROM_USER) {
this.alwaysDecode = true; // packets from user can be always decoded
PacketDirection direction = ctx.channel().attr(PacketDirection.ATTRIBUTE).get();
if (direction == PacketDirection.CLIENT_BOUND) {
this.alwaysDecode = true; // packets from client can be always decoded
}
this.inboundRecipient = direction.getInbound();
}

@Override
@@ -106,7 +111,7 @@ protected final void decode(ChannelHandlerContext ctx, BedrockPacketWrapper wrap
this.decodeHeader(msg, wrapper);
wrapper.setHeaderLength(msg.readerIndex() - index);
if (this.alwaysDecode) { // Otherwise, we are decoding at other place
wrapper.setPacket(this.codec.tryDecode(helper, msg, wrapper.getPacketId()));
wrapper.setPacket(this.codec.tryDecode(helper, msg, wrapper.getPacketId(), this.inboundRecipient));
}
} catch (Throwable t) {
log.error("Failed to decode packet", t);
@@ -146,6 +151,11 @@ public final int getPacketId(BedrockPacket packet) {
public final BedrockPacketCodec setCodecHelper(BedrockCodec codec, BedrockCodecHelper helper) {
this.codec = requireNonNull(codec, "Codec cannot be null");
this.helper = requireNonNull(helper, "Helper can not be null");

switch (this.inboundRecipient) {
case CLIENT -> this.helper.setEncodingSettings(EncodingSettings.CLIENT);
case SERVER -> this.helper.setEncodingSettings(EncodingSettings.SERVER);
}
return this;
}

Original file line number Diff line number Diff line change
@@ -26,6 +26,7 @@
import org.cloudburstmc.protocol.bedrock.BedrockDisconnectReasons;
import org.cloudburstmc.protocol.bedrock.BedrockPeer;
import org.cloudburstmc.protocol.bedrock.BedrockSession;
import org.cloudburstmc.protocol.bedrock.PacketDirection;
import org.cloudburstmc.protocol.bedrock.netty.BedrockBatchWrapper;
import org.cloudburstmc.protocol.bedrock.netty.BedrockPacketWrapper;
import org.cloudburstmc.protocol.bedrock.packet.BedrockPacket;
@@ -144,4 +145,9 @@ public ProxiedBedrockPeer getPeer() {
public long getPing() {
return this.getPeer().getPing();
}

@Override
public PacketDirection getPacketDirection() {
return PacketDirection.CLIENT_BOUND;
}
}
Original file line number Diff line number Diff line change
@@ -58,6 +58,7 @@
import org.cloudburstmc.protocol.bedrock.codec.v630.Bedrock_v630;
import org.cloudburstmc.protocol.bedrock.codec.v649.Bedrock_v649;
import org.cloudburstmc.protocol.bedrock.codec.v662.Bedrock_v662;
import org.cloudburstmc.protocol.bedrock.codec.v671.Bedrock_v671;

@ToString(exclude = {"defaultCodec", "bedrockCodec"})
public enum ProtocolVersion {
@@ -101,7 +102,8 @@ public enum ProtocolVersion {
MINECRAFT_PE_1_20_40(622, Bedrock_v622.CODEC),
MINECRAFT_PE_1_20_50(630, Bedrock_v630.CODEC),
MINECRAFT_PE_1_20_60(649, Bedrock_v649.CODEC),
MINECRAFT_PE_1_20_70(662, Bedrock_v662.CODEC);
MINECRAFT_PE_1_20_70(662, Bedrock_v662.CODEC),
MINECRAFT_PE_1_20_80(671, Bedrock_v671.CODEC);

private static final ProtocolVersion[] VALUES = values();
private static final Int2ObjectMap<ProtocolVersion> VERSIONS = new Int2ObjectOpenHashMap<>();
Original file line number Diff line number Diff line change
@@ -15,7 +15,7 @@

package dev.waterdog.waterdogpe.network.protocol.handler;

import dev.waterdog.waterdogpe.network.PacketDirection;
import org.cloudburstmc.protocol.bedrock.PacketDirection;
import org.cloudburstmc.protocol.bedrock.packet.BedrockPacket;
import org.cloudburstmc.protocol.bedrock.packet.BedrockPacketHandler;
import org.cloudburstmc.protocol.common.PacketSignal;
Original file line number Diff line number Diff line change
@@ -21,6 +21,7 @@
import io.netty.util.ReferenceCountUtil;
import lombok.Data;
import lombok.extern.log4j.Log4j2;
import org.cloudburstmc.protocol.bedrock.PacketDirection;
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodecHelper;
import org.cloudburstmc.protocol.bedrock.netty.BedrockBatchWrapper;
@@ -52,7 +53,7 @@ public void onBedrockBatch(ProxiedConnection source, BedrockBatchWrapper batch)
while (iterator.hasNext()) {
BedrockPacketWrapper wrapper = iterator.next();
if (wrapper.getPacket() == null) {
this.decodePacket(wrapper);
this.decodePacket(wrapper, source.getPacketDirection());
}

PacketSignal signal = this.handlePacket(wrapper.getPacket());
@@ -84,11 +85,11 @@ public PacketSignal handlePacket(BedrockPacket packet) {
}
}

private void decodePacket(BedrockPacketWrapper wrapper) {
private void decodePacket(BedrockPacketWrapper wrapper, PacketDirection direction) {
ByteBuf msg = wrapper.getPacketBuffer().retainedSlice();
try {
msg.skipBytes(wrapper.getHeaderLength()); // skip header
wrapper.setPacket(this.codec.tryDecode(helper, msg, wrapper.getPacketId()));
wrapper.setPacket(this.codec.tryDecode(helper, msg, wrapper.getPacketId(), direction.getInbound()));
} catch (Throwable t) {
log.warn("Failed to decode packet", t);
throw t;
Original file line number Diff line number Diff line change
@@ -15,10 +15,10 @@

package dev.waterdog.waterdogpe.network.protocol.handler.downstream;

import dev.waterdog.waterdogpe.network.PacketDirection;
import dev.waterdog.waterdogpe.network.connection.client.ClientConnection;
import dev.waterdog.waterdogpe.network.connection.handler.ReconnectReason;
import dev.waterdog.waterdogpe.network.protocol.handler.PluginPacketHandler;
import org.cloudburstmc.protocol.bedrock.PacketDirection;
import org.cloudburstmc.protocol.bedrock.packet.*;
import dev.waterdog.waterdogpe.event.defaults.FastTransferRequestEvent;
import dev.waterdog.waterdogpe.event.defaults.PostTransferCompleteEvent;
@@ -43,7 +43,7 @@ public PacketSignal handlePacket(BedrockPacket packet) {
PacketSignal signal = super.handlePacket(packet);
if (player.getPluginPacketHandlers().size() > 0) {
for (PluginPacketHandler handler : this.player.getPluginPacketHandlers()) {
signal = mergeSignals(signal, handler.handlePacket(packet, PacketDirection.FROM_SERVER));
signal = mergeSignals(signal, handler.handlePacket(packet, PacketDirection.CLIENT_BOUND));
}
}
return signal;
Original file line number Diff line number Diff line change
@@ -15,10 +15,10 @@

package dev.waterdog.waterdogpe.network.protocol.handler.upstream;

import dev.waterdog.waterdogpe.network.PacketDirection;
import dev.waterdog.waterdogpe.network.protocol.handler.PluginPacketHandler;
import dev.waterdog.waterdogpe.player.ProxiedPlayer;
import dev.waterdog.waterdogpe.network.protocol.Signals;
import org.cloudburstmc.protocol.bedrock.PacketDirection;
import org.cloudburstmc.protocol.bedrock.packet.BedrockPacketHandler;
import org.cloudburstmc.protocol.bedrock.packet.*;
import org.cloudburstmc.protocol.common.PacketSignal;
@@ -38,7 +38,7 @@ public PacketSignal handlePacket(BedrockPacket packet) {
PacketSignal signal = BedrockPacketHandler.super.handlePacket(packet);
if (player.getPluginPacketHandlers().size() > 0) {
for (PluginPacketHandler handler : this.player.getPluginPacketHandlers()) {
signal = mergeSignals(signal, handler.handlePacket(packet, PacketDirection.FROM_USER));
signal = mergeSignals(signal, handler.handlePacket(packet, PacketDirection.SERVER_BOUND));
}
}
return signal;
Original file line number Diff line number Diff line change
@@ -24,7 +24,7 @@ public class CodecUpdaterCommands implements ProtocolCodecUpdater {
@Override
public BedrockCodec.Builder updateCodec(BedrockCodec.Builder builder, BedrockCodec baseCodec) {
BedrockPacketDefinition<AvailableCommandsPacket> definition = baseCodec.getPacketDefinition(AvailableCommandsPacket.class);
builder.registerPacket(AvailableCommandsPacket::new, definition.getSerializer(), definition.getId());
builder.registerPacket(AvailableCommandsPacket::new, definition.getSerializer(), definition.getId(), definition.getRecipient());
return builder;
}

Original file line number Diff line number Diff line change
@@ -53,4 +53,9 @@ public class NetworkSettings extends YamlConfig {
@Comment("Number of login requests that can be made in \"connection_throttle_time\" interval. To disable set value to -1")
@Path("login_throttle")
private int loginThrottle = 2;

@Path("enable_cookies")
@Accessors(fluent = true)
@Comment("Enable RakNet cookies for additional security. Do NOT disable this unless you know what you are doing.")
private boolean enableCookies = true;
}

0 comments on commit d94345d

Please sign in to comment.