mirror of
https://github.com/TheDeus-Group/TFM-4.3-Reloaded.git
synced 2024-12-23 03:24:58 +00:00
Handle player online check in AsyncPlayerPreLoginEvent
Apparently, online players with the same username are kicked before PlayerLoginEvent is called. This commit moves the online player check to AsyncPlayerPreloginEvent so the default behaviour can still be modified Fixes #642
This commit is contained in:
parent
a4d8f4646e
commit
c002fbc537
8 changed files with 133 additions and 188 deletions
|
@ -1,3 +1,3 @@
|
||||||
#Build Number for ANT. Do not edit!
|
#Build Number for ANT. Do not edit!
|
||||||
#Sat May 30 20:10:27 CEST 2015
|
#Sat May 30 20:46:17 CEST 2015
|
||||||
build.number=1043
|
build.number=1052
|
||||||
|
|
|
@ -57,7 +57,8 @@ public class Command_saconfig extends TFM_Command
|
||||||
{
|
{
|
||||||
final TFM_Admin admin = TFM_AdminList.getEntry(sender_p);
|
final TFM_Admin admin = TFM_AdminList.getEntry(sender_p);
|
||||||
|
|
||||||
if (admin == null) {
|
if (admin == null)
|
||||||
|
{
|
||||||
playerMsg("Could not find your admin entry! Please notify a developer.", ChatColor.RED);
|
playerMsg("Could not find your admin entry! Please notify a developer.", ChatColor.RED);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,7 @@ import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.block.Action;
|
import org.bukkit.event.block.Action;
|
||||||
import org.bukkit.event.block.LeavesDecayEvent;
|
import org.bukkit.event.block.LeavesDecayEvent;
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
|
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
import org.bukkit.event.player.PlayerDropItemEvent;
|
import org.bukkit.event.player.PlayerDropItemEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
@ -388,7 +389,7 @@ public class TFM_PlayerListener implements Listener
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
final TFM_PlayerData playerdata = TFM_PlayerData.getPlayerData(player);
|
final TFM_PlayerData playerdata = TFM_PlayerData.getPlayerData(player);
|
||||||
// Check absolute value to account for negatives
|
// Check absolute value to account for negatives
|
||||||
if(Math.abs(event.getTo().getX()) >= MAX_XY_COORD || Math.abs(event.getTo().getZ()) >= MAX_XY_COORD)
|
if (Math.abs(event.getTo().getX()) >= MAX_XY_COORD || Math.abs(event.getTo().getZ()) >= MAX_XY_COORD)
|
||||||
{
|
{
|
||||||
event.setCancelled(true); // illegal position, cancel it
|
event.setCancelled(true); // illegal position, cancel it
|
||||||
}
|
}
|
||||||
|
@ -791,7 +792,7 @@ public class TFM_PlayerListener implements Listener
|
||||||
final TFM_Player playerEntry;
|
final TFM_Player playerEntry;
|
||||||
TFM_Log.info("[JOIN] " + TFM_Util.formatPlayer(player) + " joined the game with IP address: " + ip, true);
|
TFM_Log.info("[JOIN] " + TFM_Util.formatPlayer(player) + " joined the game with IP address: " + ip, true);
|
||||||
// Check absolute value to account for negatives
|
// Check absolute value to account for negatives
|
||||||
if(Math.abs(player.getLocation().getX()) >= MAX_XY_COORD || Math.abs(player.getLocation().getZ()) >= MAX_XY_COORD)
|
if (Math.abs(player.getLocation().getX()) >= MAX_XY_COORD || Math.abs(player.getLocation().getZ()) >= MAX_XY_COORD)
|
||||||
{
|
{
|
||||||
player.teleport(player.getWorld().getSpawnLocation()); // Illegal position, teleport to spawn
|
player.teleport(player.getWorld().getSpawnLocation()); // Illegal position, teleport to spawn
|
||||||
}
|
}
|
||||||
|
@ -911,26 +912,15 @@ public class TFM_PlayerListener implements Listener
|
||||||
}.runTaskLater(TotalFreedomMod.plugin, 20L * 1L);
|
}.runTaskLater(TotalFreedomMod.plugin, 20L * 1L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
|
public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event)
|
||||||
|
{
|
||||||
|
TFM_ServerInterface.handlePlayerPreLogin(event);
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST)
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
public void onPlayerLogin(PlayerLoginEvent event)
|
public void onPlayerLogin(PlayerLoginEvent event)
|
||||||
{
|
{
|
||||||
if (TFM_ConfigEntry.FORCE_IP_ENABLED.getBoolean())
|
|
||||||
{
|
|
||||||
final String hostname = event.getHostname().replace("FML", ""); // Forge fix - https://github.com/TotalFreedom/TotalFreedomMod/issues/493
|
|
||||||
final String connectAddress = TFM_ConfigEntry.SERVER_ADDRESS.getString();
|
|
||||||
final int connectPort = TotalFreedomMod.server.getPort();
|
|
||||||
|
|
||||||
if (!hostname.equalsIgnoreCase(connectAddress + ":" + connectPort) && !hostname.equalsIgnoreCase(connectAddress + ".:" + connectPort))
|
|
||||||
{
|
|
||||||
final int forceIpPort = TFM_ConfigEntry.FORCE_IP_PORT.getInteger();
|
|
||||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER,
|
|
||||||
TFM_ConfigEntry.FORCE_IP_KICKMSG.getString()
|
|
||||||
.replace("%address%", TFM_ConfigEntry.SERVER_ADDRESS.getString() + (forceIpPort == DEFAULT_PORT ? "" : ":" + forceIpPort)));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
TFM_ServerInterface.handlePlayerLogin(event);
|
TFM_ServerInterface.handlePlayerLogin(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -406,7 +406,7 @@ public class TFM_AdminList
|
||||||
|
|
||||||
public static boolean isSuperAdminSafe(UUID uuid, String ip)
|
public static boolean isSuperAdminSafe(UUID uuid, String ip)
|
||||||
{
|
{
|
||||||
if (TotalFreedomMod.server.getOnlineMode())
|
if (TotalFreedomMod.server.getOnlineMode() && uuid != null)
|
||||||
{
|
{
|
||||||
return TFM_AdminList.getSuperUUIDs().contains(uuid);
|
return TFM_AdminList.getSuperUUIDs().contains(uuid);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import me.StevenLawson.TotalFreedomMod.Config.TFM_Config;
|
||||||
|
|
||||||
public class TFM_PermbanList
|
public class TFM_PermbanList
|
||||||
{
|
{
|
||||||
|
|
||||||
private static final List<String> PERMBANNED_PLAYERS;
|
private static final List<String> PERMBANNED_PLAYERS;
|
||||||
private static final List<String> PERMBANNED_IPS;
|
private static final List<String> PERMBANNED_IPS;
|
||||||
|
|
||||||
|
|
|
@ -11,65 +11,53 @@ import me.StevenLawson.TotalFreedomMod.Config.TFM_Config;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public class TFM_PlayerList
|
public class TFM_PlayerList {
|
||||||
{
|
|
||||||
private static final Map<UUID, TFM_Player> PLAYER_LIST = new HashMap<UUID, TFM_Player>();
|
private static final Map<UUID, TFM_Player> PLAYER_LIST = new HashMap<UUID, TFM_Player>();
|
||||||
|
|
||||||
private TFM_PlayerList()
|
private TFM_PlayerList() {
|
||||||
{
|
|
||||||
throw new AssertionError();
|
throw new AssertionError();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Set<TFM_Player> getAllPlayers()
|
public static Set<TFM_Player> getAllPlayers() {
|
||||||
{
|
|
||||||
return Collections.unmodifiableSet(Sets.newHashSet(PLAYER_LIST.values()));
|
return Collections.unmodifiableSet(Sets.newHashSet(PLAYER_LIST.values()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void load()
|
public static void load() {
|
||||||
{
|
|
||||||
PLAYER_LIST.clear();
|
PLAYER_LIST.clear();
|
||||||
|
|
||||||
// Load online players
|
// Load online players
|
||||||
for (Player player : Bukkit.getOnlinePlayers())
|
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||||
{
|
|
||||||
getEntry(player);
|
getEntry(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
TFM_Log.info("Loaded playerdata for " + PLAYER_LIST.size() + " players");
|
TFM_Log.info("Loaded playerdata for " + PLAYER_LIST.size() + " players");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void saveAll()
|
public static void saveAll() {
|
||||||
{
|
for (TFM_Player entry : PLAYER_LIST.values()) {
|
||||||
for (TFM_Player entry : PLAYER_LIST.values())
|
|
||||||
{
|
|
||||||
save(entry);
|
save(entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// May return null
|
// May return null
|
||||||
public static TFM_Player getEntry(UUID uuid)
|
public static TFM_Player getEntry(UUID uuid) {
|
||||||
{
|
if (PLAYER_LIST.containsKey(uuid)) {
|
||||||
if (PLAYER_LIST.containsKey(uuid))
|
|
||||||
{
|
|
||||||
return PLAYER_LIST.get(uuid);
|
return PLAYER_LIST.get(uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
final File configFile = getConfigFile(uuid);
|
final File configFile = getConfigFile(uuid);
|
||||||
|
|
||||||
if (!configFile.exists())
|
if (!configFile.exists()) {
|
||||||
{
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
final TFM_Player entry = new TFM_Player(uuid, getConfig(uuid));
|
final TFM_Player entry = new TFM_Player(uuid, getConfig(uuid));
|
||||||
|
|
||||||
if (entry.isComplete())
|
if (entry.isComplete()) {
|
||||||
{
|
|
||||||
PLAYER_LIST.put(uuid, entry);
|
PLAYER_LIST.put(uuid, entry);
|
||||||
return entry;
|
return entry;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
TFM_Log.warning("Could not load entry: Entry is not complete!");
|
TFM_Log.warning("Could not load entry: Entry is not complete!");
|
||||||
configFile.delete();
|
configFile.delete();
|
||||||
}
|
}
|
||||||
|
@ -77,13 +65,11 @@ public class TFM_PlayerList
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TFM_Player getEntry(Player player)
|
public static TFM_Player getEntry(Player player) {
|
||||||
{
|
|
||||||
final UUID uuid = TFM_UuidManager.getUniqueId(player);
|
final UUID uuid = TFM_UuidManager.getUniqueId(player);
|
||||||
TFM_Player entry = getEntry(uuid);
|
TFM_Player entry = getEntry(uuid);
|
||||||
|
|
||||||
if (entry != null)
|
if (entry != null) {
|
||||||
{
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,12 +87,10 @@ public class TFM_PlayerList
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void removeEntry(Player player)
|
public static void removeEntry(Player player) {
|
||||||
{
|
|
||||||
final UUID uuid = TFM_UuidManager.getUniqueId(player);
|
final UUID uuid = TFM_UuidManager.getUniqueId(player);
|
||||||
|
|
||||||
if (!PLAYER_LIST.containsKey(uuid))
|
if (!PLAYER_LIST.containsKey(uuid)) {
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,20 +99,16 @@ public class TFM_PlayerList
|
||||||
PLAYER_LIST.remove(uuid);
|
PLAYER_LIST.remove(uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean existsEntry(Player player)
|
public static boolean existsEntry(Player player) {
|
||||||
{
|
|
||||||
return existsEntry(TFM_UuidManager.getUniqueId(player));
|
return existsEntry(TFM_UuidManager.getUniqueId(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean existsEntry(UUID uuid)
|
public static boolean existsEntry(UUID uuid) {
|
||||||
{
|
|
||||||
return getConfigFile(uuid).exists();
|
return getConfigFile(uuid).exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setUniqueId(TFM_Player entry, UUID newUuid)
|
public static void setUniqueId(TFM_Player entry, UUID newUuid) {
|
||||||
{
|
if (entry.getUniqueId().equals(newUuid)) {
|
||||||
if (entry.getUniqueId().equals(newUuid))
|
|
||||||
{
|
|
||||||
TFM_Log.warning("Not setting new UUID: UUIDs match!");
|
TFM_Log.warning("Not setting new UUID: UUIDs match!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -147,16 +127,13 @@ public class TFM_PlayerList
|
||||||
// Remove old entry
|
// Remove old entry
|
||||||
PLAYER_LIST.remove(entry.getUniqueId());
|
PLAYER_LIST.remove(entry.getUniqueId());
|
||||||
final File oldFile = getConfigFile(entry.getUniqueId());
|
final File oldFile = getConfigFile(entry.getUniqueId());
|
||||||
if (oldFile.exists() && !oldFile.delete())
|
if (oldFile.exists() && !oldFile.delete()) {
|
||||||
{
|
|
||||||
TFM_Log.warning("Could not delete config: " + getConfigFile(entry.getUniqueId()).getName());
|
TFM_Log.warning("Could not delete config: " + getConfigFile(entry.getUniqueId()).getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void purgeAll()
|
public static void purgeAll() {
|
||||||
{
|
for (File file : getConfigFolder().listFiles()) {
|
||||||
for (File file : getConfigFolder().listFiles())
|
|
||||||
{
|
|
||||||
file.delete();
|
file.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,27 +141,22 @@ public class TFM_PlayerList
|
||||||
load();
|
load();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static File getConfigFolder()
|
public static File getConfigFolder() {
|
||||||
{
|
|
||||||
return new File(TotalFreedomMod.plugin.getDataFolder(), "players");
|
return new File(TotalFreedomMod.plugin.getDataFolder(), "players");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static File getConfigFile(UUID uuid)
|
public static File getConfigFile(UUID uuid) {
|
||||||
{
|
|
||||||
return new File(getConfigFolder(), uuid + ".yml");
|
return new File(getConfigFolder(), uuid + ".yml");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TFM_Config getConfig(UUID uuid)
|
public static TFM_Config getConfig(UUID uuid) {
|
||||||
{
|
|
||||||
final TFM_Config config = new TFM_Config(TotalFreedomMod.plugin, getConfigFile(uuid), false);
|
final TFM_Config config = new TFM_Config(TotalFreedomMod.plugin, getConfigFile(uuid), false);
|
||||||
config.load();
|
config.load();
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void save(TFM_Player entry)
|
public static void save(TFM_Player entry) {
|
||||||
{
|
if (!entry.isComplete()) {
|
||||||
if (!entry.isComplete())
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("Entry is not complete!");
|
throw new IllegalArgumentException("Entry is not complete!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,12 +5,14 @@ import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import me.StevenLawson.TotalFreedomMod.Config.TFM_ConfigEntry;
|
import me.StevenLawson.TotalFreedomMod.Config.TFM_ConfigEntry;
|
||||||
|
import static me.StevenLawson.TotalFreedomMod.Listener.TFM_PlayerListener.DEFAULT_PORT;
|
||||||
import net.minecraft.server.v1_8_R2.EntityPlayer;
|
import net.minecraft.server.v1_8_R2.EntityPlayer;
|
||||||
import net.minecraft.server.v1_8_R2.MinecraftServer;
|
import net.minecraft.server.v1_8_R2.MinecraftServer;
|
||||||
import net.minecraft.server.v1_8_R2.PropertyManager;
|
import net.minecraft.server.v1_8_R2.PropertyManager;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
|
||||||
import org.bukkit.event.player.PlayerLoginEvent;
|
import org.bukkit.event.player.PlayerLoginEvent;
|
||||||
import org.bukkit.event.player.PlayerLoginEvent.Result;
|
import org.bukkit.event.player.PlayerLoginEvent.Result;
|
||||||
|
|
||||||
|
@ -62,6 +64,29 @@ public class TFM_ServerInterface
|
||||||
return MinecraftServer.getServer().getVersion();
|
return MinecraftServer.getServer().getVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void handlePlayerPreLogin(AsyncPlayerPreLoginEvent event)
|
||||||
|
{
|
||||||
|
final String ip = event.getAddress().getHostAddress().trim();
|
||||||
|
final boolean isAdmin = TFM_AdminList.isSuperAdminSafe(null, ip);
|
||||||
|
|
||||||
|
// Check if the player is already online
|
||||||
|
for (Player onlinePlayer : TotalFreedomMod.server.getOnlinePlayers())
|
||||||
|
{
|
||||||
|
if (!onlinePlayer.getName().equalsIgnoreCase(event.getName()))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isAdmin) {
|
||||||
|
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, "Your username is already logged into this server.");
|
||||||
|
} else {
|
||||||
|
event.allow();
|
||||||
|
TFM_Sync.playerKick(onlinePlayer, "An admin just logged in with the username you are using.");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void handlePlayerLogin(PlayerLoginEvent event)
|
public static void handlePlayerLogin(PlayerLoginEvent event)
|
||||||
{
|
{
|
||||||
final Server server = TotalFreedomMod.server;
|
final Server server = TotalFreedomMod.server;
|
||||||
|
@ -70,19 +95,38 @@ public class TFM_ServerInterface
|
||||||
final String ip = event.getAddress().getHostAddress().trim();
|
final String ip = event.getAddress().getHostAddress().trim();
|
||||||
final UUID uuid = TFM_UuidManager.newPlayer(player, ip);
|
final UUID uuid = TFM_UuidManager.newPlayer(player, ip);
|
||||||
|
|
||||||
// Perform username checks
|
// Check username length
|
||||||
if (username.length() < 3 || username.length() > TotalFreedomMod.MAX_USERNAME_LENGTH)
|
if (username.length() < 3 || username.length() > TotalFreedomMod.MAX_USERNAME_LENGTH)
|
||||||
{
|
{
|
||||||
event.disallow(Result.KICK_OTHER, "Your username is an invalid length (must be between 3 and 20 characters long).");
|
event.disallow(Result.KICK_OTHER, "Your username is an invalid length (must be between 3 and 20 characters long).");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check username characters
|
||||||
if (!USERNAME_REGEX.matcher(username).find())
|
if (!USERNAME_REGEX.matcher(username).find())
|
||||||
{
|
{
|
||||||
event.disallow(Result.KICK_OTHER, "Your username contains invalid characters.");
|
event.disallow(Result.KICK_OTHER, "Your username contains invalid characters.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check force-IP match
|
||||||
|
if (TFM_ConfigEntry.FORCE_IP_ENABLED.getBoolean())
|
||||||
|
{
|
||||||
|
final String hostname = event.getHostname().replace("FML", ""); // Forge fix - https://github.com/TotalFreedom/TotalFreedomMod/issues/493
|
||||||
|
final String connectAddress = TFM_ConfigEntry.SERVER_ADDRESS.getString();
|
||||||
|
final int connectPort = TotalFreedomMod.server.getPort();
|
||||||
|
|
||||||
|
if (!hostname.equalsIgnoreCase(connectAddress + ":" + connectPort) && !hostname.equalsIgnoreCase(connectAddress + ".:" + connectPort))
|
||||||
|
{
|
||||||
|
final int forceIpPort = TFM_ConfigEntry.FORCE_IP_PORT.getInteger();
|
||||||
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER,
|
||||||
|
TFM_ConfigEntry.FORCE_IP_KICKMSG.getString()
|
||||||
|
.replace("%address%", TFM_ConfigEntry.SERVER_ADDRESS.getString() + (forceIpPort == DEFAULT_PORT ? "" : ":" + forceIpPort)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Check if player is admin
|
// Check if player is admin
|
||||||
// Not safe to use TFM_Util.isSuperAdmin(player) because player.getAddress() will return a null until after player login.
|
// Not safe to use TFM_Util.isSuperAdmin(player) because player.getAddress() will return a null until after player login.
|
||||||
final boolean isAdmin = TFM_AdminList.isSuperAdminSafe(uuid, ip);
|
final boolean isAdmin = TFM_AdminList.isSuperAdminSafe(uuid, ip);
|
||||||
|
@ -93,15 +137,6 @@ public class TFM_ServerInterface
|
||||||
// Force-allow log in
|
// Force-allow log in
|
||||||
event.allow();
|
event.allow();
|
||||||
|
|
||||||
// Kick players with the same name
|
|
||||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
|
||||||
{
|
|
||||||
if (onlinePlayer.getName().equalsIgnoreCase(username))
|
|
||||||
{
|
|
||||||
onlinePlayer.kickPlayer("An admin just logged in with the username you are using.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int count = server.getOnlinePlayers().size();
|
int count = server.getOnlinePlayers().size();
|
||||||
if (count >= server.getMaxPlayers())
|
if (count >= server.getMaxPlayers())
|
||||||
{
|
{
|
||||||
|
@ -151,16 +186,6 @@ public class TFM_ServerInterface
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Username already logged in
|
|
||||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
|
||||||
{
|
|
||||||
if (onlinePlayer.getName().equalsIgnoreCase(username))
|
|
||||||
{
|
|
||||||
event.disallow(Result.KICK_OTHER, "Your username is already logged into this server.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Whitelist
|
// Whitelist
|
||||||
if (isWhitelisted())
|
if (isWhitelisted())
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,20 +25,18 @@ import org.json.simple.JSONArray;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
import org.json.simple.parser.JSONParser;
|
import org.json.simple.parser.JSONParser;
|
||||||
|
|
||||||
public class TFM_UuidManager
|
public class TFM_UuidManager {
|
||||||
{
|
|
||||||
public static final String TABLE_NAME = "uuids";
|
public static final String TABLE_NAME = "uuids";
|
||||||
private static final TFM_SqliteDatabase SQL;
|
private static final TFM_SqliteDatabase SQL;
|
||||||
private static final Statement FIND;
|
private static final Statement FIND;
|
||||||
private static final Statement UPDATE;
|
private static final Statement UPDATE;
|
||||||
|
|
||||||
private TFM_UuidManager()
|
private TFM_UuidManager() {
|
||||||
{
|
|
||||||
throw new AssertionError();
|
throw new AssertionError();
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static {
|
||||||
{
|
|
||||||
SQL = new TFM_SqliteDatabase(
|
SQL = new TFM_SqliteDatabase(
|
||||||
"uuids.db",
|
"uuids.db",
|
||||||
TABLE_NAME,
|
TABLE_NAME,
|
||||||
|
@ -48,40 +46,34 @@ public class TFM_UuidManager
|
||||||
UPDATE = SQL.addPreparedStatement("REPLACE INTO " + TABLE_NAME + " (username, uuid) VALUES (?, ?);");
|
UPDATE = SQL.addPreparedStatement("REPLACE INTO " + TABLE_NAME + " (username, uuid) VALUES (?, ?);");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void load()
|
public static void load() {
|
||||||
{
|
|
||||||
// Init DB
|
// Init DB
|
||||||
SQL.connect();
|
SQL.connect();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void close()
|
public static void close() {
|
||||||
{
|
|
||||||
SQL.close();
|
SQL.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int purge()
|
public static int purge() {
|
||||||
{
|
|
||||||
return SQL.purge();
|
return SQL.purge();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UUID newPlayer(Player player, String ip)
|
public static UUID newPlayer(Player player, String ip) {
|
||||||
{
|
|
||||||
TFM_Log.info("Obtaining UUID for new player: " + player.getName());
|
TFM_Log.info("Obtaining UUID for new player: " + player.getName());
|
||||||
|
|
||||||
final String username = player.getName().toLowerCase();
|
final String username = player.getName().toLowerCase();
|
||||||
|
|
||||||
// Look in DB
|
// Look in DB
|
||||||
final UUID dbUuid = find(username);
|
final UUID dbUuid = find(username);
|
||||||
if (dbUuid != null)
|
if (dbUuid != null) {
|
||||||
{
|
|
||||||
return dbUuid;
|
return dbUuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find UUID and update in DB if not found
|
// Find UUID and update in DB if not found
|
||||||
// Try API
|
// Try API
|
||||||
UUID uuid = TFM_UuidResolver.getUUIDOf(username);
|
UUID uuid = TFM_UuidResolver.getUUIDOf(username);
|
||||||
if (uuid == null)
|
if (uuid == null) {
|
||||||
{
|
|
||||||
// Spoof
|
// Spoof
|
||||||
uuid = generateSpoofUuid(username);
|
uuid = generateSpoofUuid(username);
|
||||||
}
|
}
|
||||||
|
@ -90,11 +82,9 @@ public class TFM_UuidManager
|
||||||
return uuid;
|
return uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UUID getUniqueId(OfflinePlayer offlinePlayer)
|
public static UUID getUniqueId(OfflinePlayer offlinePlayer) {
|
||||||
{
|
|
||||||
// Online check first
|
// Online check first
|
||||||
if (offlinePlayer.isOnline() && TFM_PlayerData.hasPlayerData(offlinePlayer.getPlayer()))
|
if (offlinePlayer.isOnline() && TFM_PlayerData.hasPlayerData(offlinePlayer.getPlayer())) {
|
||||||
{
|
|
||||||
return TFM_PlayerData.getPlayerData(offlinePlayer.getPlayer()).getUniqueId();
|
return TFM_PlayerData.getPlayerData(offlinePlayer.getPlayer()).getUniqueId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,19 +92,16 @@ public class TFM_UuidManager
|
||||||
return getUniqueId(offlinePlayer.getName());
|
return getUniqueId(offlinePlayer.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UUID getUniqueId(String username)
|
public static UUID getUniqueId(String username) {
|
||||||
{
|
|
||||||
// Look in DB
|
// Look in DB
|
||||||
final UUID dbUuid = find(username);
|
final UUID dbUuid = find(username);
|
||||||
if (dbUuid != null)
|
if (dbUuid != null) {
|
||||||
{
|
|
||||||
return dbUuid;
|
return dbUuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try API
|
// Try API
|
||||||
final UUID apiUuid = TFM_UuidResolver.getUUIDOf(username);
|
final UUID apiUuid = TFM_UuidResolver.getUUIDOf(username);
|
||||||
if (apiUuid != null)
|
if (apiUuid != null) {
|
||||||
{
|
|
||||||
return apiUuid;
|
return apiUuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,10 +109,8 @@ public class TFM_UuidManager
|
||||||
return generateSpoofUuid(username);
|
return generateSpoofUuid(username);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void rawSetUUID(String name, UUID uuid)
|
public static void rawSetUUID(String name, UUID uuid) {
|
||||||
{
|
if (name == null || uuid == null || name.isEmpty()) {
|
||||||
if (name == null || uuid == null || name.isEmpty())
|
|
||||||
{
|
|
||||||
TFM_Log.warning("Not setting raw UUID: name and uuid may not be null!");
|
TFM_Log.warning("Not setting raw UUID: name and uuid may not be null!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -133,86 +118,67 @@ public class TFM_UuidManager
|
||||||
update(name.toLowerCase().trim(), uuid);
|
update(name.toLowerCase().trim(), uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static UUID find(String searchName)
|
private static UUID find(String searchName) {
|
||||||
{
|
if (!SQL.connect()) {
|
||||||
if (!SQL.connect())
|
|
||||||
{
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
final ResultSet result;
|
final ResultSet result;
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
final PreparedStatement statement = FIND.getStatement();
|
final PreparedStatement statement = FIND.getStatement();
|
||||||
statement.clearParameters();
|
statement.clearParameters();
|
||||||
statement.setString(1, searchName.toLowerCase());
|
statement.setString(1, searchName.toLowerCase());
|
||||||
result = statement.executeQuery();
|
result = statement.executeQuery();
|
||||||
}
|
} catch (Exception ex) {
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
TFM_Log.severe("Could not execute find statement!");
|
TFM_Log.severe("Could not execute find statement!");
|
||||||
TFM_Log.severe(ex);
|
TFM_Log.severe(ex);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TFM_SqlUtil.hasData(result))
|
if (!TFM_SqlUtil.hasData(result)) {
|
||||||
{
|
|
||||||
TFM_SqlUtil.close(result);
|
TFM_SqlUtil.close(result);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
final String uuidString = result.getString("uuid");
|
final String uuidString = result.getString("uuid");
|
||||||
return UUID.fromString(uuidString);
|
return UUID.fromString(uuidString);
|
||||||
}
|
} catch (Exception ex) {
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
TFM_Log.severe(ex);
|
TFM_Log.severe(ex);
|
||||||
return null;
|
return null;
|
||||||
}
|
} finally {
|
||||||
finally
|
|
||||||
{
|
|
||||||
TFM_SqlUtil.close(result);
|
TFM_SqlUtil.close(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean update(String username, UUID uuid)
|
private static boolean update(String username, UUID uuid) {
|
||||||
{
|
if (!SQL.connect()) {
|
||||||
if (!SQL.connect())
|
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
final PreparedStatement statement = UPDATE.getStatement();
|
final PreparedStatement statement = UPDATE.getStatement();
|
||||||
statement.clearParameters();
|
statement.clearParameters();
|
||||||
statement.setString(1, username.toLowerCase());
|
statement.setString(1, username.toLowerCase());
|
||||||
statement.setString(2, uuid.toString());
|
statement.setString(2, uuid.toString());
|
||||||
statement.executeUpdate();
|
statement.executeUpdate();
|
||||||
return true;
|
return true;
|
||||||
}
|
} catch (Exception ex) {
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
TFM_Log.severe("Could not execute update statement!");
|
TFM_Log.severe("Could not execute update statement!");
|
||||||
TFM_Log.severe(ex);
|
TFM_Log.severe(ex);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static UUID generateSpoofUuid(String name)
|
private static UUID generateSpoofUuid(String name) {
|
||||||
{
|
|
||||||
name = name.toLowerCase();
|
name = name.toLowerCase();
|
||||||
TFM_Log.info("Generating spoof UUID for " + name);
|
TFM_Log.info("Generating spoof UUID for " + name);
|
||||||
|
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
final MessageDigest digest = MessageDigest.getInstance("SHA1");
|
final MessageDigest digest = MessageDigest.getInstance("SHA1");
|
||||||
final byte[] result = digest.digest(name.getBytes());
|
final byte[] result = digest.digest(name.getBytes());
|
||||||
final StringBuilder builder = new StringBuilder();
|
final StringBuilder builder = new StringBuilder();
|
||||||
for (int i = 0; i < result.length; i++)
|
for (int i = 0; i < result.length; i++) {
|
||||||
{
|
|
||||||
builder.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
|
builder.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,36 +188,30 @@ public class TFM_UuidManager
|
||||||
+ "-" + builder.substring(12, 16)
|
+ "-" + builder.substring(12, 16)
|
||||||
+ "-" + builder.substring(16, 20)
|
+ "-" + builder.substring(16, 20)
|
||||||
+ "-" + builder.substring(20, 32));
|
+ "-" + builder.substring(20, 32));
|
||||||
}
|
} catch (NoSuchAlgorithmException ex) {
|
||||||
catch (NoSuchAlgorithmException ex)
|
|
||||||
{
|
|
||||||
TFM_Log.warning("Could not generate spoof UUID: SHA1 algorithm not found!");
|
TFM_Log.warning("Could not generate spoof UUID: SHA1 algorithm not found!");
|
||||||
}
|
}
|
||||||
|
|
||||||
return UUID.randomUUID();
|
return UUID.randomUUID();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TFM_UuidResolver implements Callable<Map<String, UUID>>
|
public static class TFM_UuidResolver implements Callable<Map<String, UUID>> {
|
||||||
{
|
|
||||||
private static final double PROFILES_PER_REQUEST = 100;
|
private static final double PROFILES_PER_REQUEST = 100;
|
||||||
private static final String PROFILE_URL = "https://api.mojang.com/profiles/minecraft";
|
private static final String PROFILE_URL = "https://api.mojang.com/profiles/minecraft";
|
||||||
private final JSONParser jsonParser = new JSONParser();
|
private final JSONParser jsonParser = new JSONParser();
|
||||||
private final List<String> names;
|
private final List<String> names;
|
||||||
|
|
||||||
public TFM_UuidResolver(List<String> names)
|
public TFM_UuidResolver(List<String> names) {
|
||||||
{
|
|
||||||
this.names = ImmutableList.copyOf(names);
|
this.names = ImmutableList.copyOf(names);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, UUID> call()
|
public Map<String, UUID> call() {
|
||||||
{
|
|
||||||
final Map<String, UUID> uuidMap = new HashMap<String, UUID>();
|
final Map<String, UUID> uuidMap = new HashMap<String, UUID>();
|
||||||
int requests = (int) Math.ceil(names.size() / PROFILES_PER_REQUEST);
|
int requests = (int) Math.ceil(names.size() / PROFILES_PER_REQUEST);
|
||||||
for (int i = 0; i < requests; i++)
|
for (int i = 0; i < requests; i++) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
final URL url = new URL(PROFILE_URL);
|
final URL url = new URL(PROFILE_URL);
|
||||||
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||||
|
|
||||||
|
@ -270,8 +230,7 @@ public class TFM_UuidManager
|
||||||
|
|
||||||
final JSONArray array = (JSONArray) jsonParser.parse(new InputStreamReader(connection.getInputStream()));
|
final JSONArray array = (JSONArray) jsonParser.parse(new InputStreamReader(connection.getInputStream()));
|
||||||
|
|
||||||
for (Object profile : array)
|
for (Object profile : array) {
|
||||||
{
|
|
||||||
final JSONObject jsonProfile = (JSONObject) profile;
|
final JSONObject jsonProfile = (JSONObject) profile;
|
||||||
final String id = (String) jsonProfile.get("id");
|
final String id = (String) jsonProfile.get("id");
|
||||||
final String name = (String) jsonProfile.get("name");
|
final String name = (String) jsonProfile.get("name");
|
||||||
|
@ -284,13 +243,10 @@ public class TFM_UuidManager
|
||||||
uuidMap.put(name, uuid);
|
uuidMap.put(name, uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i != requests - 1)
|
if (i != requests - 1) {
|
||||||
{
|
|
||||||
Thread.sleep(100L);
|
Thread.sleep(100L);
|
||||||
}
|
}
|
||||||
}
|
} catch (Exception ex) {
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
TFM_Log.severe("Could not resolve UUID(s) of "
|
TFM_Log.severe("Could not resolve UUID(s) of "
|
||||||
+ StringUtils.join(names.subList(i * 100, Math.min((i + 1) * 100, names.size())), ", "));
|
+ StringUtils.join(names.subList(i * 100, Math.min((i + 1) * 100, names.size())), ", "));
|
||||||
//TFM_Log.severe(ex);
|
//TFM_Log.severe(ex);
|
||||||
|
@ -299,9 +255,9 @@ public class TFM_UuidManager
|
||||||
return uuidMap;
|
return uuidMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UUID getUUIDOf(String name)
|
public static UUID getUUIDOf(String name) {
|
||||||
{
|
|
||||||
return new TFM_UuidResolver(Arrays.asList(name)).call().get(name);
|
return new TFM_UuidResolver(Arrays.asList(name)).call().get(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue