diff --git a/src/main/java/org/samo_lego/simpleauth/SimpleAuth.java b/src/main/java/org/samo_lego/simpleauth/SimpleAuth.java index 9a1a962..b8c3c9e 100644 --- a/src/main/java/org/samo_lego/simpleauth/SimpleAuth.java +++ b/src/main/java/org/samo_lego/simpleauth/SimpleAuth.java @@ -25,6 +25,8 @@ import java.util.HashMap; import java.util.Timer; import java.util.TimerTask; +import static org.samo_lego.simpleauth.utils.UuidConverter.convertUuid; + public class SimpleAuth implements DedicatedServerModInitializer { private static final Logger LOGGER = LogManager.getLogger(); @@ -36,8 +38,8 @@ public class SimpleAuth implements DedicatedServerModInitializer { public static HashMap deauthenticatedUsers = new HashMap<>(); // Boolean for easier checking if player is authenticated - public static boolean isAuthenticated(ServerPlayerEntity player) { - return !deauthenticatedUsers.containsKey(player.getUuidAsString()); + public static boolean isAuthenticated(PlayerEntity player) { + return !deauthenticatedUsers.containsKey(convertUuid(player)); } // Getting game directory @@ -105,7 +107,7 @@ public class SimpleAuth implements DedicatedServerModInitializer { // Authenticates player and sends the message public static void authenticatePlayer(ServerPlayerEntity player, Text msg) { - deauthenticatedUsers.remove(player.getUuidAsString()); + deauthenticatedUsers.remove(convertUuid(player)); // Player no longer needs to be invisible and invulnerable player.setInvulnerable(false); player.setInvisible(false); @@ -117,7 +119,7 @@ public class SimpleAuth implements DedicatedServerModInitializer { if(db.isClosed()) return; // Marking player as not authenticated, (re)setting login tries to zero - String uuid = player.getUuidAsString(); + String uuid = convertUuid(player); SimpleAuth.deauthenticatedUsers.put(uuid, new PlayerCache(uuid, player.getIp())); // Player is now not authenticated diff --git a/src/main/java/org/samo_lego/simpleauth/commands/ChangepwCommand.java b/src/main/java/org/samo_lego/simpleauth/commands/ChangepwCommand.java index 1e8db0f..4f4cc08 100644 --- a/src/main/java/org/samo_lego/simpleauth/commands/ChangepwCommand.java +++ b/src/main/java/org/samo_lego/simpleauth/commands/ChangepwCommand.java @@ -14,6 +14,7 @@ import static com.mojang.brigadier.arguments.StringArgumentType.getString; import static com.mojang.brigadier.arguments.StringArgumentType.word; import static net.minecraft.server.command.CommandManager.argument; import static net.minecraft.server.command.CommandManager.literal; +import static org.samo_lego.simpleauth.utils.UuidConverter.convertUuid; public class ChangepwCommand { private static Text enterNewPassword = new LiteralText(SimpleAuth.config.lang.enterNewPassword); @@ -55,7 +56,7 @@ public class ChangepwCommand { player.sendMessage(cannotChangePassword, false); return 0; } - else if (AuthHelper.checkPass(player.getUuidAsString(), oldPass.toCharArray()) == 1) { + else if (AuthHelper.checkPass(convertUuid(player), oldPass.toCharArray()) == 1) { if(newPass.length() < SimpleAuth.config.main.minPasswordChars) { player.sendMessage(new LiteralText( String.format(SimpleAuth.config.lang.minPasswordChars, SimpleAuth.config.main.minPasswordChars) @@ -73,7 +74,7 @@ public class ChangepwCommand { String hash = AuthHelper.hashPass(newPass.toCharArray()); playerdata.addProperty("password", hash); - SimpleAuth.db.updateUserData(player.getUuidAsString(), playerdata.toString()); + SimpleAuth.db.updateUserData(convertUuid(player), playerdata.toString()); player.sendMessage(passwordUpdated, false); return 1; } diff --git a/src/main/java/org/samo_lego/simpleauth/commands/LoginCommand.java b/src/main/java/org/samo_lego/simpleauth/commands/LoginCommand.java index 3828810..7f8b171 100644 --- a/src/main/java/org/samo_lego/simpleauth/commands/LoginCommand.java +++ b/src/main/java/org/samo_lego/simpleauth/commands/LoginCommand.java @@ -2,6 +2,7 @@ package org.samo_lego.simpleauth.commands; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.LiteralText; @@ -13,6 +14,7 @@ import static com.mojang.brigadier.arguments.StringArgumentType.getString; import static com.mojang.brigadier.arguments.StringArgumentType.word; import static net.minecraft.server.command.CommandManager.argument; import static net.minecraft.server.command.CommandManager.literal; +import static org.samo_lego.simpleauth.utils.UuidConverter.convertUuid; public class LoginCommand { private static Text enterPassword = new LiteralText(SimpleAuth.config.lang.enterPassword); @@ -39,7 +41,8 @@ public class LoginCommand { private static int login(ServerCommandSource source, String pass) throws CommandSyntaxException { // Getting the player who send the command ServerPlayerEntity player = source.getPlayer(); - String uuid = player.getUuidAsString(); + + String uuid = convertUuid(player); int passwordResult = AuthHelper.checkPass(uuid, pass.toCharArray()); if(SimpleAuth.isAuthenticated(player)) { diff --git a/src/main/java/org/samo_lego/simpleauth/commands/RegisterCommand.java b/src/main/java/org/samo_lego/simpleauth/commands/RegisterCommand.java index 058ec91..b0ae50e 100644 --- a/src/main/java/org/samo_lego/simpleauth/commands/RegisterCommand.java +++ b/src/main/java/org/samo_lego/simpleauth/commands/RegisterCommand.java @@ -14,6 +14,7 @@ import static com.mojang.brigadier.arguments.StringArgumentType.getString; import static com.mojang.brigadier.arguments.StringArgumentType.word; import static net.minecraft.server.command.CommandManager.argument; import static net.minecraft.server.command.CommandManager.literal; +import static org.samo_lego.simpleauth.utils.UuidConverter.convertUuid; public class RegisterCommand { @@ -67,7 +68,7 @@ public class RegisterCommand { JsonObject playerdata = new JsonObject(); playerdata.addProperty("password", hash); - if (SimpleAuth.db.registerUser(player.getUuidAsString(), playerdata.toString())) { + if (SimpleAuth.db.registerUser(convertUuid(player), playerdata.toString())) { SimpleAuth.authenticatePlayer(player, registerSuccess); return 1; } diff --git a/src/main/java/org/samo_lego/simpleauth/commands/UnregisterCommand.java b/src/main/java/org/samo_lego/simpleauth/commands/UnregisterCommand.java index b90ad5c..cd59a39 100644 --- a/src/main/java/org/samo_lego/simpleauth/commands/UnregisterCommand.java +++ b/src/main/java/org/samo_lego/simpleauth/commands/UnregisterCommand.java @@ -13,6 +13,7 @@ import static com.mojang.brigadier.arguments.StringArgumentType.getString; import static com.mojang.brigadier.arguments.StringArgumentType.word; import static net.minecraft.server.command.CommandManager.argument; import static net.minecraft.server.command.CommandManager.literal; +import static org.samo_lego.simpleauth.utils.UuidConverter.convertUuid; public class UnregisterCommand { private static Text enterPassword = new LiteralText(SimpleAuth.config.lang.enterPassword); @@ -45,9 +46,9 @@ public class UnregisterCommand { player.sendMessage(cannotUnregister, false); return 0; } - else if (AuthHelper.checkPass(player.getUuidAsString(), pass.toCharArray()) == 1) { + else if (AuthHelper.checkPass(convertUuid(player), pass.toCharArray()) == 1) { SimpleAuth.deauthenticatePlayer(player); - SimpleAuth.db.deleteUserData(player.getUuidAsString()); + SimpleAuth.db.deleteUserData(convertUuid(player)); player.sendMessage(accountDeleted, false); return 1; } diff --git a/src/main/java/org/samo_lego/simpleauth/event/AuthEventHandler.java b/src/main/java/org/samo_lego/simpleauth/event/AuthEventHandler.java index ef9ad9f..c29da30 100644 --- a/src/main/java/org/samo_lego/simpleauth/event/AuthEventHandler.java +++ b/src/main/java/org/samo_lego/simpleauth/event/AuthEventHandler.java @@ -23,6 +23,7 @@ import java.util.regex.Pattern; import static net.minecraft.block.NetherPortalBlock.AXIS; import static net.minecraft.util.math.Direction.Axis.Z; import static org.samo_lego.simpleauth.SimpleAuth.*; +import static org.samo_lego.simpleauth.utils.UuidConverter.convertUuid; /** * This class will take care of actions players try to do, @@ -73,7 +74,7 @@ public class AuthEventHandler { // Player joining the server public static void onPlayerJoin(ServerPlayerEntity player) { // Checking if session is still valid - String uuid = player.getUuidAsString(); + String uuid = convertUuid(player); PlayerCache playerCache = deauthenticatedUsers.getOrDefault(uuid, null); if( playerCache != null && @@ -166,7 +167,9 @@ public class AuthEventHandler { deauthenticatePlayer(player); // Setting that player was actually authenticated before leaving - PlayerCache playerCache = deauthenticatedUsers.get(player.getUuidAsString()); + PlayerCache playerCache = deauthenticatedUsers.get(convertUuid(player)); + if(playerCache == null) + return; playerCache.wasAuthenticated = true; // Setting the session expire time playerCache.validUntil = System.currentTimeMillis() + config.main.sessionTimeoutTime * 1000; @@ -177,7 +180,7 @@ public class AuthEventHandler { // Getting the message to then be able to check it String msg = chatMessageC2SPacket.getChatMessage(); if( - !isAuthenticated((ServerPlayerEntity) player) && + !isAuthenticated(player) && !msg.startsWith("/login") && !msg.startsWith("/register") && (!config.experimental.allowChat || msg.startsWith("/")) @@ -190,7 +193,7 @@ public class AuthEventHandler { // Player movement public static ActionResult onPlayerMove(PlayerEntity player) { - if(!isAuthenticated((ServerPlayerEntity) player) && !config.experimental.allowMovement) { + if(!isAuthenticated(player) && !config.experimental.allowMovement) { return ActionResult.FAIL; } return ActionResult.PASS; @@ -198,7 +201,7 @@ public class AuthEventHandler { // Using a block (right-click function) public static ActionResult onUseBlock(PlayerEntity player) { - if(!isAuthenticated((ServerPlayerEntity) player) && !config.experimental.allowBlockUse) { + if(!isAuthenticated(player) && !config.experimental.allowBlockUse) { player.sendMessage(notAuthenticated(), false); return ActionResult.FAIL; } @@ -207,7 +210,7 @@ public class AuthEventHandler { // Punching a block public static ActionResult onAttackBlock(PlayerEntity player) { - if(!isAuthenticated((ServerPlayerEntity) player) && !config.experimental.allowBlockPunch) { + if(!isAuthenticated(player) && !config.experimental.allowBlockPunch) { player.sendMessage(notAuthenticated(), false); return ActionResult.FAIL; } @@ -216,7 +219,7 @@ public class AuthEventHandler { // Using an item public static TypedActionResult onUseItem(PlayerEntity player) { - if(!isAuthenticated((ServerPlayerEntity) player) && !config.experimental.allowItemUse) { + if(!isAuthenticated(player) && !config.experimental.allowItemUse) { player.sendMessage(notAuthenticated(), false); return TypedActionResult.fail(ItemStack.EMPTY); } @@ -225,7 +228,7 @@ public class AuthEventHandler { } // Dropping an item public static ActionResult onDropItem(PlayerEntity player) { - if(!isAuthenticated((ServerPlayerEntity) player) && !config.experimental.allowItemDrop) { + if(!isAuthenticated(player) && !config.experimental.allowItemDrop) { player.sendMessage(notAuthenticated(), false); return ActionResult.FAIL; } @@ -233,7 +236,7 @@ public class AuthEventHandler { } // Changing inventory (item moving etc.) public static ActionResult onTakeItem(PlayerEntity player) { - if(!isAuthenticated((ServerPlayerEntity) player) && !config.experimental.allowItemMoving) { + if(!isAuthenticated(player) && !config.experimental.allowItemMoving) { player.sendMessage(notAuthenticated(), false); return ActionResult.FAIL; } @@ -242,7 +245,7 @@ public class AuthEventHandler { } // Attacking an entity public static ActionResult onAttackEntity(PlayerEntity player) { - if(!isAuthenticated((ServerPlayerEntity) player) && !config.experimental.allowEntityPunch) { + if(!isAuthenticated(player) && !config.experimental.allowEntityPunch) { player.sendMessage(notAuthenticated(), false); return ActionResult.FAIL; } @@ -251,7 +254,7 @@ public class AuthEventHandler { } // Interacting with entity public static ActionResult onUseEntity(PlayerEntity player) { - if(!isAuthenticated((ServerPlayerEntity) player) && !config.main.allowEntityInteract) { + if(!isAuthenticated(player) && !config.main.allowEntityInteract) { player.sendMessage(notAuthenticated(), false); return ActionResult.FAIL; } diff --git a/src/main/java/org/samo_lego/simpleauth/mixin/MixinPlayerManager.java b/src/main/java/org/samo_lego/simpleauth/mixin/MixinPlayerManager.java index ba9381f..8aca193 100644 --- a/src/main/java/org/samo_lego/simpleauth/mixin/MixinPlayerManager.java +++ b/src/main/java/org/samo_lego/simpleauth/mixin/MixinPlayerManager.java @@ -23,6 +23,9 @@ import java.net.SocketAddress; @Mixin(PlayerManager.class) public abstract class MixinPlayerManager { + @Final @Shadow + private MinecraftServer server; + @Inject(method = "onPlayerConnect(Lnet/minecraft/network/ClientConnection;Lnet/minecraft/server/network/ServerPlayerEntity;)V", at = @At("RETURN")) private void onPlayerConnect(ClientConnection clientConnection, ServerPlayerEntity serverPlayerEntity, CallbackInfo ci) { PlayerJoinServerCallback.EVENT.invoker().onPlayerJoin(serverPlayerEntity); diff --git a/src/main/java/org/samo_lego/simpleauth/utils/UuidConverter.java b/src/main/java/org/samo_lego/simpleauth/utils/UuidConverter.java new file mode 100644 index 0000000..e1d1368 --- /dev/null +++ b/src/main/java/org/samo_lego/simpleauth/utils/UuidConverter.java @@ -0,0 +1,32 @@ +package org.samo_lego.simpleauth.utils; + +import net.minecraft.entity.player.PlayerEntity; + +import java.util.UUID; + +/** + * Converts player uuid, to ensure player with "nAmE" and "NamE" get same uuid + * Both players are not allowed to play, since mod mimics Mojang behaviour + * of not allowing accounts with same names but different capitalization + */ +public class UuidConverter { + + /** Converts player UUID to offline mode style. + * + * @param playername name of the player to get UUID for + * @return converted UUID as string + */ + public static String convertUuid(String playername) { + return PlayerEntity.getOfflinePlayerUuid(playername).toString(); + } + + /** Converts player UUID to offline mode style. + * + * @param player player to get UUID for + * @return converted UUID as string + */ + public static String convertUuid(PlayerEntity player) { + System.out.println("Playeruuid: " + player.getUuidAsString() + " converted: " + PlayerEntity.getOfflinePlayerUuid(player.getName().asString().toLowerCase()).toString()); + return convertUuid(player.getName().asString().toLowerCase()); + } +}