9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-04 15:41:38 +00:00

feat(network): 添加严格校验用户申请资源包使用的UUID

This commit is contained in:
jhqwqmc
2025-09-14 00:48:22 +08:00
parent d0a91744ae
commit 08200e5f75
7 changed files with 72 additions and 14 deletions

View File

@@ -60,6 +60,7 @@ import net.momirealms.craftengine.core.plugin.context.NetworkTextReplaceContext;
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
import net.momirealms.craftengine.core.plugin.context.event.EventTrigger;
import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters;
import net.momirealms.craftengine.core.plugin.locale.TranslationManager;
import net.momirealms.craftengine.core.plugin.logger.Debugger;
import net.momirealms.craftengine.core.plugin.network.*;
import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider;
@@ -1239,17 +1240,17 @@ public class PacketConsumers {
try {
BukkitServerPlayer player = (BukkitServerPlayer) user;
String name = (String) NetworkReflections.methodHandle$ServerboundHelloPacket$nameGetter.invokeExact(packet);
player.setName(name);
player.setUnverifiedName(name);
if (VersionHelper.isOrAbove1_20_2()) {
UUID uuid = (UUID) NetworkReflections.methodHandle$ServerboundHelloPacket$uuidGetter.invokeExact(packet);
player.setUUID(uuid);
player.setUnverifiedUUID(uuid);
} else {
@SuppressWarnings("unchecked")
Optional<UUID> uuid = (Optional<UUID>) NetworkReflections.methodHandle$ServerboundHelloPacket$uuidGetter.invokeExact(packet);
if (uuid.isPresent()) {
player.setUUID(uuid.get());
player.setUnverifiedUUID(uuid.get());
} else {
player.setUUID(UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(StandardCharsets.UTF_8)));
player.setUnverifiedUUID(UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(StandardCharsets.UTF_8)));
}
}
} catch (Throwable e) {
@@ -2499,6 +2500,18 @@ public class PacketConsumers {
// 防止后续加入的JoinWorldTask再次处理
user.setShouldProcessFinishConfiguration(false);
// 检查用户UUID是否已经校验
if (!user.isVerifiedUUID()) {
if (Config.strictPlayerUuidValidation()) {
TranslationManager.instance().log("warning.network.resource_pack.unverified_uuid", user.name(), user.uuid().toString());
user.kick(Component.translatable("disconnect.loginFailed"));
return;
}
if (Config.debugResourcePack()) {
TranslationManager.instance().log("warning.network.resource_pack.unverified_uuid", user.name(), user.uuid().toString());
}
}
// 取消 ClientboundFinishConfigurationPacket让客户端发呆并结束掉当前的进入世界任务
event.setCancelled(true);
try {
@@ -2548,8 +2561,8 @@ public class PacketConsumers {
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> LOGIN_FINISHED = (user, event, packet) -> {
try {
GameProfile gameProfile = FastNMS.INSTANCE.field$ClientboundLoginFinishedPacket$gameProfile(packet);
user.setName(gameProfile.getName());
user.setUUID(gameProfile.getId());
user.setVerifiedName(gameProfile.getName());
user.setVerifiedUUID(gameProfile.getId());
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to handle ClientboundLoginFinishedPacket", e);
}

View File

@@ -72,6 +72,8 @@ public class BukkitServerPlayer extends Player {
private ChannelHandler connection;
private String name;
private UUID uuid;
private boolean isVerifiedName;
private boolean isVerifiedUUID;
private ConnectionState decoderState;
private ConnectionState encoderState;
private boolean shouldProcessFinishConfiguration = true;
@@ -140,7 +142,9 @@ public class BukkitServerPlayer extends Player {
this.playerRef = new WeakReference<>(player);
this.serverPlayerRef = new WeakReference<>(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player));
this.uuid = player.getUniqueId();
this.isVerifiedUUID = true;
this.name = player.getName();
this.isVerifiedName = true;
byte[] bytes = player.getPersistentDataContainer().get(KeyUtils.toNamespacedKey(CooldownData.COOLDOWN_KEY), PersistentDataType.BYTE_ARRAY);
this.trackedChunks = ConcurrentLong2ReferenceChainedHashTable.createWithCapacity(768, 0.5f);
this.entityTypeView = new ConcurrentHashMap<>(256);
@@ -321,22 +325,46 @@ public class BukkitServerPlayer extends Player {
}
@Override
public void setName(String name) {
if (this.name != null) return;
public boolean isVerifiedName() {
return this.isVerifiedName;
}
@Override
public void setUnverifiedName(String name) {
if (this.isVerifiedName) return;
this.name = name;
}
@Override
public void setVerifiedName(String name) {
if (this.isVerifiedName) return;
this.name = name;
this.isVerifiedName = true;
}
@Override
public UUID uuid() {
return this.uuid;
}
@Override
public void setUUID(UUID uuid) {
if (this.uuid != null) return;
public boolean isVerifiedUUID() {
return this.isVerifiedUUID;
}
@Override
public void setUnverifiedUUID(UUID uuid) {
if (this.isVerifiedUUID) return;
this.uuid = uuid;
}
@Override
public void setVerifiedUUID(UUID uuid) {
if (this.isVerifiedUUID) return;
this.uuid = uuid;
this.isVerifiedUUID = true;
}
@Override
public void playSound(Key sound, SoundSource source, float volume, float pitch) {
platformPlayer().playSound(platformPlayer(), sound.toString(), SoundUtils.toBukkit(source), volume, pitch);