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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user