Skip to content

Commit 8631681

Browse files
authored
Port to 1.21.1 (#9)
* Port to 1.21.1 * Use Java 21 when building in CI * Drop Fabric API dependency
1 parent 610a753 commit 8631681

12 files changed

Lines changed: 84 additions & 83 deletions

File tree

.github/workflows/build.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ jobs:
99
uses: actions/checkout@v4
1010
- name: validate gradle wrapper
1111
uses: gradle/wrapper-validation-action@v2
12-
- name: setup jdk 17
12+
- name: setup jdk 21
1313
uses: actions/setup-java@v4
1414
with:
15-
java-version: 17
15+
java-version: 21
1616
distribution: 'microsoft'
1717
- name: make gradle wrapper executable
1818
run: chmod +x ./gradlew

build.gradle.kts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,25 @@ repositories {
1111
}
1212

1313
dependencies {
14-
minecraft("com.mojang:minecraft:1.20.1")
14+
minecraft("com.mojang:minecraft:1.21.1")
1515
mappings(loom.layered {
1616
officialMojangMappings()
17-
parchment("org.parchmentmc.data:parchment-1.20.1:2023.09.03@zip")
17+
parchment("org.parchmentmc.data:parchment-1.21.1:2024.11.17@zip")
1818
})
19-
modImplementation("net.fabricmc:fabric-loader:0.16.14")
20-
21-
setOf("fabric-api-base", "fabric-command-api-v2").forEach {
22-
modImplementation(fabricApi.module(it, "0.92.5+1.20.1"))
23-
}
2419

20+
modImplementation("net.fabricmc:fabric-loader:0.16.14")
2521
modImplementation("net.fabricmc:fabric-language-kotlin:1.13.2+kotlin.2.1.20")
2622
}
2723

2824
java {
2925
withSourcesJar()
3026

31-
sourceCompatibility = JavaVersion.VERSION_17
32-
targetCompatibility = JavaVersion.VERSION_17
27+
sourceCompatibility = JavaVersion.VERSION_21
28+
targetCompatibility = JavaVersion.VERSION_21
3329
}
3430

3531
kotlin {
36-
jvmToolchain(17)
32+
jvmToolchain(21)
3733
}
3834

3935
tasks {
@@ -42,7 +38,7 @@ tasks {
4238
}
4339

4440
withType<JavaCompile>().configureEach {
45-
options.release = 17
41+
options.release = 21
4642
options.encoding = "UTF-8"
4743
}
4844

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package dev.optimistic.serverauth.mixin;
2+
3+
import com.mojang.brigadier.CommandDispatcher;
4+
import dev.optimistic.serverauth.command.ServerAuthCommand;
5+
import net.minecraft.commands.CommandBuildContext;
6+
import net.minecraft.commands.CommandSourceStack;
7+
import net.minecraft.commands.Commands;
8+
import org.spongepowered.asm.mixin.Final;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.Shadow;
11+
import org.spongepowered.asm.mixin.injection.At;
12+
import org.spongepowered.asm.mixin.injection.Inject;
13+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
14+
15+
@Mixin(Commands.class)
16+
public abstract class CommandsMixin {
17+
@Shadow
18+
@Final
19+
private CommandDispatcher<CommandSourceStack> dispatcher;
20+
21+
@Inject(method = "<init>", at = @At(value = "INVOKE", target = "Lcom/mojang/brigadier/CommandDispatcher;setConsumer(Lcom/mojang/brigadier/ResultConsumer;)V", remap = false))
22+
private void init$setConsumer(Commands.CommandSelection selection, CommandBuildContext context, CallbackInfo ci) {
23+
ServerAuthCommand.INSTANCE.register(this.dispatcher);
24+
}
25+
}

src/main/java/dev/optimistic/serverauth/mixin/ConnectionMixin.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package dev.optimistic.serverauth.mixin;
22

33
import com.google.common.base.Objects;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
5+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
46
import dev.optimistic.serverauth.ClientConstants;
57
import dev.optimistic.serverauth.Constants;
68
import dev.optimistic.serverauth.ducks.TaintHolder;
79
import net.minecraft.network.Connection;
8-
import net.minecraft.network.ConnectionProtocol;
910
import net.minecraft.network.PacketSendListener;
1011
import net.minecraft.network.protocol.Packet;
12+
import net.minecraft.network.protocol.handshake.ClientIntent;
1113
import net.minecraft.network.protocol.handshake.ClientIntentionPacket;
12-
import org.jetbrains.annotations.Nullable;
1314
import org.spongepowered.asm.mixin.Mixin;
1415
import org.spongepowered.asm.mixin.Unique;
1516
import org.spongepowered.asm.mixin.injection.At;
@@ -30,7 +31,7 @@ public abstract class ConnectionMixin implements TaintHolder {
3031
}
3132

3233
@Inject(method = "doSendPacket", at = @At("HEAD"))
33-
private void doSendPacket(Packet<?> packet, @Nullable PacketSendListener sendListener, ConnectionProtocol newProtocol, ConnectionProtocol currentProtocol, CallbackInfo ci) {
34+
private void doSendPacket(Packet<?> packet, PacketSendListener sendListener, boolean flush, CallbackInfo ci) {
3435
if (!(packet instanceof ClientIntentionPacket intentionPacket)) return;
3536

3637
PrivateKey privateKey = ClientConstants.INSTANCE.getPrivateKey().read();
@@ -42,4 +43,16 @@ private void doSendPacket(Packet<?> packet, @Nullable PacketSendListener sendLis
4243

4344
tainted = true;
4445
}
46+
47+
// initiateServerboundConnection lambda
48+
@WrapOperation(method = "method_52900", at = @At(value = "NEW", target = "(ILjava/lang/String;ILnet/minecraft/network/protocol/handshake/ClientIntent;)Lnet/minecraft/network/protocol/handshake/ClientIntentionPacket;"))
49+
private ClientIntentionPacket run$newIntentionPacket(int protocolVersion, String hostName, int port, ClientIntent intention, Operation<ClientIntentionPacket> original) {
50+
ClientIntentionPacket orig = original.call(protocolVersion, hostName, port, intention);
51+
UUID id = ClientConstants.INSTANCE.getUuid();
52+
53+
if (id == null)
54+
return orig;
55+
56+
return ClientConstants.INSTANCE.modifyIntentionPacket(id, orig);
57+
}
4558
}
Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package dev.optimistic.serverauth.mixin.client;
22

3-
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
4-
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
5-
import com.mojang.authlib.GameProfile;
3+
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
64
import com.mojang.authlib.minecraft.MinecraftSessionService;
75
import dev.optimistic.serverauth.ducks.TaintHolder;
86
import net.minecraft.client.multiplayer.ClientHandshakePacketListenerImpl;
@@ -12,15 +10,16 @@
1210
import org.spongepowered.asm.mixin.Shadow;
1311
import org.spongepowered.asm.mixin.injection.At;
1412

13+
import java.util.UUID;
14+
1515
@Mixin(ClientHandshakePacketListenerImpl.class)
1616
public abstract class ClientHandshakePacketListenerImplMixin {
1717
@Shadow
1818
@Final
1919
private Connection connection;
2020

21-
@WrapOperation(method = "authenticateServer", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;joinServer(Lcom/mojang/authlib/GameProfile;Ljava/lang/String;Ljava/lang/String;)V", remap = false))
22-
private void joinServerSession(MinecraftSessionService instance, GameProfile gameProfile, String accessToken, String serverId, Operation<Void> original) {
23-
if (!((TaintHolder) connection).serverauth$isTainted())
24-
original.call(instance, gameProfile, accessToken, serverId);
21+
@WrapWithCondition(method = "authenticateServer", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;joinServer(Ljava/util/UUID;Ljava/lang/String;Ljava/lang/String;)V", remap = false))
22+
private boolean joinServerSession(MinecraftSessionService instance, UUID uuid, String accessToken, String serverHash) {
23+
return !((TaintHolder) connection).serverauth$isTainted();
2524
}
2625
}

src/main/java/dev/optimistic/serverauth/mixin/client/ConnectScreenThreadMixin.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/main/java/dev/optimistic/serverauth/mixin/server/ServerHandshakePacketListenerImplMixin.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ public abstract class ServerHandshakePacketListenerImplMixin {
2525
@Unique
2626
private static final IllegalStateException EXCEPTION = new IllegalStateException("Unregistered public key");
2727

28-
@WrapOperation(method = "handleIntention", at = @At(value = "NEW", target = "(Lnet/minecraft/server/MinecraftServer;Lnet/minecraft/network/Connection;)Lnet/minecraft/server/network/ServerLoginPacketListenerImpl;"))
29-
private ServerLoginPacketListenerImpl handleIntention$newServerLoginListener(MinecraftServer server, Connection connection,
28+
@WrapOperation(method = "beginLogin", at = @At(value = "NEW", target = "(Lnet/minecraft/server/MinecraftServer;Lnet/minecraft/network/Connection;Z)Lnet/minecraft/server/network/ServerLoginPacketListenerImpl;"))
29+
private ServerLoginPacketListenerImpl handleIntention$newServerLoginListener(MinecraftServer server, Connection connection, boolean transferred,
3030
Operation<ServerLoginPacketListenerImpl> original,
3131
@Local(argsOnly = true) ClientIntentionPacket packet) {
32-
ServerLoginPacketListenerImpl handler = original.call(server, connection);
32+
ServerLoginPacketListenerImpl handler = original.call(server, connection, transferred);
3333
UUID override = Constants.INSTANCE.deserializeServerAuthId(packet);
3434
if (override != null) {
3535
((IdOverrideHolder) handler).serverauth$setIdOverride(override);

src/main/java/dev/optimistic/serverauth/mixin/server/ServerLoginPacketListenerImplMixin.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
55
import com.mojang.authlib.GameProfile;
66
import com.mojang.authlib.minecraft.MinecraftSessionService;
7+
import com.mojang.authlib.yggdrasil.ProfileResult;
78
import dev.optimistic.serverauth.ducks.IdOverrideHolder;
89
import dev.optimistic.serverauth.keys.PublicKeyHolder;
910
import dev.optimistic.serverauth.mixin.accessor.ServerboundKeyPacketAccessor;
@@ -24,6 +25,7 @@
2425
import java.nio.ByteBuffer;
2526
import java.security.PrivateKey;
2627
import java.security.PublicKey;
28+
import java.util.Set;
2729
import java.util.UUID;
2830

2931
@Mixin(ServerLoginPacketListenerImpl.class)
@@ -78,11 +80,21 @@ public abstract static class AuthenticationThreadMixin {
7880
@Final
7981
ServerLoginPacketListenerImpl field_14176;
8082

81-
@WrapOperation(method = "run", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;hasJoinedServer(Lcom/mojang/authlib/GameProfile;Ljava/lang/String;Ljava/net/InetAddress;)Lcom/mojang/authlib/GameProfile;", remap = false))
82-
private GameProfile run$hasJoinedServer(MinecraftSessionService instance, GameProfile gameProfile, String data, InetAddress inetAddress, Operation<GameProfile> original) {
83+
@WrapOperation(method = "run", at = @At(value = "INVOKE", target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;hasJoinedServer(Ljava/lang/String;Ljava/lang/String;Ljava/net/InetAddress;)Lcom/mojang/authlib/yggdrasil/ProfileResult;", remap = false))
84+
private ProfileResult run$hasJoinedServer(MinecraftSessionService instance, String profileName, String serverId, InetAddress inetAddress, Operation<ProfileResult> original) {
8385
UUID id = ((IdOverrideHolder) field_14176).serverauth$getIdOverride();
84-
if (id == null) return original.call(instance, gameProfile, data, inetAddress);
85-
return new GameProfile(id, gameProfile.getName());
86+
if (id == null) return original.call(instance, profileName, serverId, inetAddress);
87+
88+
final GameProfile newProfile = new GameProfile(id, profileName);
89+
90+
// hasJoined request returns signed data, we should too
91+
final ProfileResult fetchedProfile = instance.fetchProfile(id, true);
92+
if (fetchedProfile != null) {
93+
// mojang after not exposing properties in constructor
94+
newProfile.getProperties().putAll(fetchedProfile.profile().getProperties());
95+
}
96+
97+
return new ProfileResult(newProfile, Set.of());
8698
}
8799
}
88100
}

src/main/kotlin/dev/optimistic/serverauth/ClientConstants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ object ClientConstants {
1616

1717
fun modifyIntentionPacket(serverAuthId: UUID, intentionPacket: ClientIntentionPacket): ClientIntentionPacket =
1818
ClientIntentionPacket(
19+
intentionPacket.protocolVersion,
1920
"\u0000server-auth\u0000${serverAuthId.toString().replace("-", "")}",
2021
intentionPacket.port,
2122
intentionPacket.intention

src/main/kotlin/dev/optimistic/serverauth/Initializer.kt renamed to src/main/kotlin/dev/optimistic/serverauth/command/ServerAuthCommand.kt

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,14 @@
1-
package dev.optimistic.serverauth
1+
package dev.optimistic.serverauth.command
22

33
import com.mojang.brigadier.Command
44
import com.mojang.brigadier.CommandDispatcher
55
import dev.optimistic.serverauth.keys.PublicKeyHolder
6-
import net.fabricmc.api.DedicatedServerModInitializer
7-
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback
8-
import net.minecraft.commands.CommandBuildContext
96
import net.minecraft.commands.CommandSourceStack
107
import net.minecraft.commands.Commands
118
import net.minecraft.network.chat.Component
129

13-
class Initializer : DedicatedServerModInitializer, CommandRegistrationCallback {
14-
override fun onInitializeServer() {
15-
CommandRegistrationCallback.EVENT.register(this)
16-
}
17-
18-
override fun register(
19-
dispatcher: CommandDispatcher<CommandSourceStack>,
20-
context: CommandBuildContext,
21-
selection: Commands.CommandSelection
22-
) {
10+
object ServerAuthCommand {
11+
fun register(dispatcher: CommandDispatcher<CommandSourceStack>) {
2312
dispatcher.register(
2413
Commands.literal("serverauth")
2514
.requires { it.hasPermission(4) }

0 commit comments

Comments
 (0)