diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/CatScheduler.java b/src/main/java/cc/baka9/catseedlogin/bukkit/CatScheduler.java index 0fa9a1b..7634891 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/CatScheduler.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/CatScheduler.java @@ -24,6 +24,7 @@ private static Method initTeleportAsync() { } public static void teleport(Player player, Location location) { + if (location == null || location.getWorld() == null) return; if (!folia) { player.teleport(location); return; diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/CatSeedLogin.java b/src/main/java/cc/baka9/catseedlogin/bukkit/CatSeedLogin.java index e78a37d..d506811 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/CatSeedLogin.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/CatSeedLogin.java @@ -13,16 +13,8 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; -import cc.baka9.catseedlogin.bukkit.command.CommandBindEmail; -import cc.baka9.catseedlogin.bukkit.command.CommandCatSeedLogin; -import cc.baka9.catseedlogin.bukkit.command.CommandChangePassword; -import cc.baka9.catseedlogin.bukkit.command.CommandLogin; -import cc.baka9.catseedlogin.bukkit.command.CommandRegister; -import cc.baka9.catseedlogin.bukkit.command.CommandResetPassword; -import cc.baka9.catseedlogin.bukkit.database.Cache; -import cc.baka9.catseedlogin.bukkit.database.MySQL; -import cc.baka9.catseedlogin.bukkit.database.SQL; -import cc.baka9.catseedlogin.bukkit.database.SQLite; +import cc.baka9.catseedlogin.bukkit.command.*; +import cc.baka9.catseedlogin.bukkit.database.*; import cc.baka9.catseedlogin.bukkit.object.LoginPlayerHelper; import cc.baka9.catseedlogin.bukkit.task.Task; import cn.handyplus.lib.adapter.HandySchedulerUtil; @@ -140,8 +132,7 @@ private void registerCommands() { return Collections.emptyList(); }); - PluginCommand catseedlogin = getServer().getPluginCommand("catseedlogin"); - catseedlogin.setExecutor(new CommandCatSeedLogin()); + getServer().getPluginCommand("catseedlogin").setExecutor(new CommandCatSeedLogin()); } @EventHandler @@ -169,7 +160,7 @@ public void onDisable() { }); try { - if (sql.getConnection() != null) { // 检查连接不为null + if (sql.getConnection() != null) { sql.getConnection().close(); } } catch (Exception e) { @@ -181,7 +172,7 @@ public void onDisable() { } public void runTaskAsync(Runnable runnable) { - if (runnable != null) { // 添加空值检查 + if (runnable != null) { CatScheduler.runTaskAsync(runnable); } } diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/Communication.java b/src/main/java/cc/baka9/catseedlogin/bukkit/Communication.java index dc71cb5..59c031a 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/Communication.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/Communication.java @@ -1,5 +1,12 @@ package cc.baka9.catseedlogin.bukkit; +import cc.baka9.catseedlogin.bukkit.database.Cache; +import cc.baka9.catseedlogin.bukkit.object.LoginPlayer; +import cc.baka9.catseedlogin.bukkit.object.LoginPlayerHelper; +import cc.baka9.catseedlogin.util.CommunicationAuth; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -7,68 +14,70 @@ import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -import cc.baka9.catseedlogin.bukkit.database.Cache; -import cc.baka9.catseedlogin.bukkit.object.LoginPlayer; -import cc.baka9.catseedlogin.bukkit.object.LoginPlayerHelper; -import cc.baka9.catseedlogin.util.CommunicationAuth; +/** + * bukkit 与 bc 的通讯交流 + */ public class Communication { private static ServerSocket serverSocket; - private static final ExecutorService executorService = Executors.newCachedThreadPool(); + /** + * 异步关闭 socket server + */ public static void socketServerStopAsync() { CatSeedLogin.instance.runTaskAsync(Communication::socketServerStop); } - public static synchronized void socketServerStop() { - closeServerSocket(serverSocket); + public static void socketServerStop() { + + if (serverSocket != null && !serverSocket.isClosed()) { + try { + serverSocket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + /** + * 异步启动 socket server 监听bc端发来的请求 + */ public static void socketServerStartAsync() { CatSeedLogin.instance.runTaskAsync(Communication::socketServerStart); } -private static synchronized void socketServerStart() { - try { - InetAddress inetAddress = InetAddress.getByName(Config.BungeeCord.Host); - serverSocket = new ServerSocket(Integer.parseInt(Config.BungeeCord.Port), 50, inetAddress); - acceptConnections(serverSocket); - } catch (UnknownHostException e) { - CatSeedLogin.instance.getLogger().warning("无法解析域名或IP地址: " + e.getMessage()); - } catch (IOException e) { - CatSeedLogin.instance.getLogger().warning("启动Socket服务器时发生错误: " + e.getMessage()); - } -} - -private static void acceptConnections(ServerSocket serverSocket) { - while (!serverSocket.isClosed()) { + /** + * 启动 socket server 监听bc端发来的请求 + */ + private static void socketServerStart() { try { - Socket socket = serverSocket.accept(); - executorService.submit(() -> handleRequest(socket)); - } catch (IOException e) { - if (serverSocket.isClosed()) { - break; + InetAddress inetAddress = InetAddress.getByName(Config.BungeeCord.Host); + serverSocket = new ServerSocket(Integer.parseInt(Config.BungeeCord.Port), 50, inetAddress); + while (!serverSocket.isClosed()) { + Socket socket; + try { + socket = serverSocket.accept(); + handleRequest(socket); + } catch (IOException e) { + break; + } } - CatSeedLogin.instance.getLogger().warning("接受Socket连接时发生错误: " + e.getMessage()); + } catch (UnknownHostException e) { + CatSeedLogin.instance.getLogger().warning("无法解析域名或IP地址"); + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); } } -} -private static void handleRequest(Socket socket) { - BufferedReader bufferedReader = null; - try { - bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); + /** + * 处理请求 + */ + private static void handleRequest(Socket socket) throws IOException { + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String requestType = bufferedReader.readLine(); - if (requestType == null) { - return; - } String playerName = bufferedReader.readLine(); switch (requestType) { case "Connect": @@ -78,60 +87,50 @@ private static void handleRequest(Socket socket) { String time = bufferedReader.readLine(); String sign = bufferedReader.readLine(); handleKeepLoggedInRequest(playerName, time, sign); + socket.close(); break; default: - String sanitizedRequestType = requestType.replace("\n", "").replace("\r", ""); - CatSeedLogin.instance.getLogger().warning("未知请求类型: " + sanitizedRequestType); break; } - } catch (IOException e) { - CatSeedLogin.instance.getLogger().warning("处理请求时发生错误: " + e.getMessage()); } -} -private static void handleKeepLoggedInRequest(String playerName, String time, String sign) { - if (CommunicationAuth.encryption(playerName, time, Config.BungeeCord.AuthKey).equals(sign)) { - CatScheduler.runTask(() -> { - LoginPlayer lp = Cache.getIgnoreCase(playerName); - if (lp != null) { - LoginPlayerHelper.add(lp); - Player player = Bukkit.getPlayerExact(playerName); - if (player != null) { - player.updateInventory(); + private static void handleKeepLoggedInRequest(String playerName, String time, String sign) { + // 验证请求的合法性 + // 对比玩家名,时间戳,和authKey加密的结果(加密是因为如果登录服不在内网环境下,则可能会被人使用这个功能给发包来直接绕过登录) + if (CommunicationAuth.encryption(playerName, time, Config.BungeeCord.AuthKey).equals(sign)) { + // 切换主线程给予登录状态 + Bukkit.getScheduler().runTask(CatSeedLogin.instance, () -> { + LoginPlayer lp = Cache.getIgnoreCase(playerName); + if (lp != null) { + LoginPlayerHelper.add(lp); + Player player = Bukkit.getPlayerExact(playerName); + if (player != null) { + player.updateInventory(); + } } - } else { - String sanitizedPlayerName = playerName.replace("\n", "").replace("\r", ""); - CatSeedLogin.instance.getLogger().warning("玩家 " + sanitizedPlayerName + " 未找到在缓存中。"); - } - }); + + }); + } } -} private static void handleConnectRequest(Socket socket, String playerName) { - CatScheduler.runTask(() -> { + // 切换主线程获取是否已登录 + Bukkit.getScheduler().runTask(CatSeedLogin.instance, () -> { boolean result = LoginPlayerHelper.isLogin(playerName); - sendConnectResultAsync(socket, result); - }); - } - private static void sendConnectResultAsync(Socket socket, boolean result) { - executorService.submit(() -> { - try (Socket autoCloseSocket = socket) { - autoCloseSocket.getOutputStream().write(result ? 1 : 0); - autoCloseSocket.getOutputStream().flush(); - } catch (IOException e) { - CatSeedLogin.instance.getLogger().warning("发送连接结果时发生错误: " + e.getMessage()); - } + // 切换异步线程返回结果 + CatSeedLogin.instance.runTaskAsync(() -> { + try { + socket.getOutputStream().write(result ? 1 : 0); + socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + }); + }); } - private static void closeServerSocket(ServerSocket serverSocket) { - if (serverSocket != null && !serverSocket.isClosed()) { - try { - serverSocket.close(); - } catch (IOException e) { - CatSeedLogin.instance.getLogger().warning("关闭Socket服务器时发生错误: " + e.getMessage()); - } - } - } + } diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/ProtocolLibListeners.java b/src/main/java/cc/baka9/catseedlogin/bukkit/ProtocolLibListeners.java index f27629c..2c6eac8 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/ProtocolLibListeners.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/ProtocolLibListeners.java @@ -11,23 +11,19 @@ import org.bukkit.entity.Player; public class ProtocolLibListeners extends PacketAdapter { - - public static void enable(){ + public static void enable() { ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); protocolManager.addPacketListener(new ProtocolLibListeners()); } - - public ProtocolLibListeners(){ + public ProtocolLibListeners() { super(CatSeedLogin.instance, ListenerPriority.HIGHEST, PacketType.Play.Server.SET_SLOT, - PacketType.Play.Server.WINDOW_ITEMS - ); - + PacketType.Play.Server.WINDOW_ITEMS); } @Override - public void onPacketSending(PacketEvent event){ + public void onPacketSending(PacketEvent event) { PacketType packetType = event.getPacketType(); if (packetType == PacketType.Play.Server.SET_SLOT || packetType == PacketType.Play.Server.WINDOW_ITEMS) { Player player = event.getPlayer(); @@ -40,8 +36,6 @@ public void onPacketSending(PacketEvent event){ } @Override - public void onPacketReceiving(PacketEvent event){ + public void onPacketReceiving(PacketEvent event) { } - - } diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandBindEmail.java b/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandBindEmail.java index 0f256ae..032e072 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandBindEmail.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandBindEmail.java @@ -1,13 +1,11 @@ package cc.baka9.catseedlogin.bukkit.command; import java.util.Optional; - import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; - import cc.baka9.catseedlogin.bukkit.CatSeedLogin; import cc.baka9.catseedlogin.bukkit.Config; import cc.baka9.catseedlogin.bukkit.database.Cache; @@ -25,9 +23,7 @@ public boolean onCommand(CommandSender sender, Command command, String s, String Player player = (Player) sender; String name = player.getName(); - if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer(player)) { - return true; - } + if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer(player)) return true; LoginPlayer lp = Cache.getIgnoreCase(name); if (lp == null) { @@ -93,11 +89,10 @@ public boolean onCommand(CommandSender sender, Command command, String s, String private void sendEmailCode(CommandSender sender, String name, String mail, EmailCode bindEmail) { CatSeedLogin.instance.runTaskAsync(() -> { try { - Mail.sendMail(mail, "邮箱绑定", - "你的验证码是 " + bindEmail.getCode() + "" + - "
在服务器中使用帐号 " + name + " 输入指令/bindemail verify " + bindEmail.getCode() + " 来绑定邮箱" + - "
绑定邮箱之后可用于忘记密码时重置自己的密码" + - "
此验证码有效期为 " + (bindEmail.getDurability() / (1000 * 60)) + "分钟"); + Mail.sendMail(mail, "邮箱绑定", "你的验证码是 " + bindEmail.getCode() + "" + + "
在服务器中使用帐号 " + name + " 输入指令/bindemail verify " + bindEmail.getCode() + " 来绑定邮箱" + + "
绑定邮箱之后可用于忘记密码时重置自己的密码" + + "
此验证码有效期为 " + (bindEmail.getDurability() / (1000 * 60)) + "分钟"); Bukkit.getScheduler().runTask(CatSeedLogin.instance, () -> { sender.sendMessage("§6已经向邮箱 " + mail + " 发送了一串绑定验证码,请检查你的邮箱的收件箱"); sender.sendMessage("§c如果未收到,请检查邮箱的垃圾箱!"); diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandChangePassword.java b/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandChangePassword.java index 1c7d8c7..db97b77 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandChangePassword.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandChangePassword.java @@ -1,13 +1,11 @@ package cc.baka9.catseedlogin.bukkit.command; import java.util.Objects; - import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; - import cc.baka9.catseedlogin.bukkit.CatScheduler; import cc.baka9.catseedlogin.bukkit.CatSeedLogin; import cc.baka9.catseedlogin.bukkit.Config; @@ -19,14 +17,10 @@ public class CommandChangePassword implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String lable, String[] args){ - if (args.length != 3 || !(sender instanceof Player)) { - return false; - } + public boolean onCommand(CommandSender sender, Command command, String lable, String[] args) { + if (args.length != 3 || !(sender instanceof Player)) return false; String name = sender.getName(); - if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer((Player) sender)){ - return true; - } + if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer((Player) sender)) return true; LoginPlayer lp = Cache.getIgnoreCase(name); if (lp == null) { sender.sendMessage(Config.Language.CHANGEPASSWORD_NOREGISTER); @@ -39,7 +33,6 @@ public boolean onCommand(CommandSender sender, Command command, String lable, St if (!Objects.equals(Crypt.encrypt(name, args[0]), lp.getPassword().trim())) { sender.sendMessage(Config.Language.CHANGEPASSWORD_OLDPASSWORD_INCORRECT); return true; - } if (!args[1].equals(args[2])) { sender.sendMessage(Config.Language.CHANGEPASSWORD_PASSWORD_CONFIRM_FAIL); @@ -49,9 +42,7 @@ public boolean onCommand(CommandSender sender, Command command, String lable, St sender.sendMessage(Config.Language.COMMON_PASSWORD_SO_SIMPLE); return true; } - if (!Cache.isLoaded) { - return true; - } + if (!Cache.isLoaded) return true; sender.sendMessage("§e修改中.."); CatSeedLogin.instance.runTaskAsync(() -> { try { @@ -59,7 +50,6 @@ public boolean onCommand(CommandSender sender, Command command, String lable, St lp.crypt(); CatSeedLogin.sql.edit(lp); LoginPlayerHelper.remove(lp); - CatScheduler.runTask(() -> { Player player = Bukkit.getPlayer(((Player) sender).getUniqueId()); if (player != null && player.isOnline()) { @@ -71,11 +61,8 @@ public boolean onCommand(CommandSender sender, Command command, String lable, St LoginPlayerHelper.sendBlankInventoryPacket(player); } } - } }); - - } catch (Exception e) { e.printStackTrace(); sender.sendMessage("§c服务器内部错误!"); diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandLogin.java b/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandLogin.java index a5db830..3004576 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandLogin.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandLogin.java @@ -1,13 +1,11 @@ package cc.baka9.catseedlogin.bukkit.command; import java.util.Objects; - import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; - import cc.baka9.catseedlogin.bukkit.CatScheduler; import cc.baka9.catseedlogin.bukkit.Config; import cc.baka9.catseedlogin.bukkit.database.Cache; @@ -18,13 +16,11 @@ public class CommandLogin implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String lable, String[] args){ + public boolean onCommand(CommandSender sender, Command command, String lable, String[] args) { if (args.length == 0 || !(sender instanceof Player)) return false; Player player = (Player) sender; String name = player.getName(); - if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer(player)){ - return true; - } + if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer(player)) return true; if (LoginPlayerHelper.isLogin(name)) { sender.sendMessage(Config.Language.LOGIN_REPEAT); return true; @@ -42,7 +38,7 @@ public boolean onCommand(CommandSender sender, Command command, String lable, St CatScheduler.updateInventory(player); LoginPlayerHelper.recordCurrentIP(player, lp); if (Config.Settings.AfterLoginBack && Config.Settings.CanTpSpawnLocation) { - Config.getOfflineLocation(player).ifPresent(location -> CatScheduler.teleport(player,location)); + Config.getOfflineLocation(player).ifPresent(location -> CatScheduler.teleport(player, location)); } } else { sender.sendMessage(Config.Language.LOGIN_FAIL); diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandRegister.java b/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandRegister.java index 8084866..fc3136d 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandRegister.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandRegister.java @@ -1,13 +1,11 @@ package cc.baka9.catseedlogin.bukkit.command; import java.util.List; - import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; - import cc.baka9.catseedlogin.bukkit.CatScheduler; import cc.baka9.catseedlogin.bukkit.CatSeedLogin; import cc.baka9.catseedlogin.bukkit.Config; @@ -18,15 +16,12 @@ import cc.baka9.catseedlogin.util.Util; public class CommandRegister implements CommandExecutor { - @Override - public boolean onCommand(CommandSender sender, Command command, String lable, String[] args){ + public boolean onCommand(CommandSender sender, Command command, String lable, String[] args) { if (args.length != 2) return false; Player player = (Player) sender; String name = sender.getName(); - if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer(player)){ - return true; - } + if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer(player)) return true; if (LoginPlayerHelper.isLogin(name)) { sender.sendMessage(Config.Language.REGISTER_AFTER_LOGIN_ALREADY); return true; @@ -43,9 +38,7 @@ public boolean onCommand(CommandSender sender, Command command, String lable, St sender.sendMessage(Config.Language.COMMON_PASSWORD_SO_SIMPLE); return true; } - if (!Cache.isLoaded) { - return true; - } + if (!Cache.isLoaded) return true; sender.sendMessage("§e注册中.."); CatSeedLogin.instance.runTaskAsync(() -> { try { @@ -68,14 +61,11 @@ public boolean onCommand(CommandSender sender, Command command, String lable, St CatScheduler.updateInventory(player); LoginPlayerHelper.recordCurrentIP(player, lp); } - - } catch (Exception e) { e.printStackTrace(); sender.sendMessage("§c服务器内部错误!"); } }); return true; - } } diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandResetPassword.java b/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandResetPassword.java index d9697b2..acdfba8 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandResetPassword.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/command/CommandResetPassword.java @@ -1,13 +1,11 @@ package cc.baka9.catseedlogin.bukkit.command; import java.util.Optional; - import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; - import cc.baka9.catseedlogin.bukkit.CatScheduler; import cc.baka9.catseedlogin.bukkit.CatSeedLogin; import cc.baka9.catseedlogin.bukkit.Config; @@ -20,15 +18,12 @@ public class CommandResetPassword implements CommandExecutor { @Override - public boolean onCommand(CommandSender sender, Command command, String s, String[] args){ + public boolean onCommand(CommandSender sender, Command command, String s, String[] args) { if (args.length == 0 || !(sender instanceof Player)) return false; Player player = (Player) sender; String name = player.getName(); - if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer(player)){ - return true; - } + if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer(player)) return true; LoginPlayer lp = Cache.getIgnoreCase(name); - if (lp == null) { sender.sendMessage(Config.Language.RESETPASSWORD_NOREGISTER); return true; @@ -37,7 +32,6 @@ public boolean onCommand(CommandSender sender, Command command, String s, String sender.sendMessage(Config.Language.RESETPASSWORD_EMAIL_DISABLE); return true; } - //command forget if (args[0].equalsIgnoreCase("forget")) { if (lp.getEmail() == null) { sender.sendMessage(Config.Language.RESETPASSWORD_EMAIL_NO_SET); @@ -46,16 +40,14 @@ public boolean onCommand(CommandSender sender, Command command, String s, String if (optionalEmailCode.isPresent()) { sender.sendMessage(Config.Language.RESETPASSWORD_EMAIL_REPEAT_SEND_MESSAGE.replace("{email}", optionalEmailCode.get().getEmail())); } else { - //20分钟有效期的验证码 EmailCode emailCode = EmailCode.create(name, lp.getEmail(), 1000 * 60 * 5, EmailCode.Type.ResetPassword); sender.sendMessage(Config.Language.RESETPASSWORD_EMAIL_SENDING_MESSAGE.replace("{email}", lp.getEmail())); CatSeedLogin.instance.runTaskAsync(() -> { try { if (emailCode != null) { - Mail.sendMail(emailCode.getEmail(), "重置密码", - "你的验证码是 " + emailCode.getCode() + "" + - "
在服务器中使用帐号 " + name + " 输入指令/resetpassword re " + emailCode.getCode() + " 新密码 来重置新密码" + - "
此验证码有效期为 " + (emailCode.getDurability() / (1000 * 60)) + "分钟"); + Mail.sendMail(emailCode.getEmail(), "重置密码", "你的验证码是 " + emailCode.getCode() + "" + + "
在服务器中使用帐号 " + name + " 输入指令/resetpassword re " + emailCode.getCode() + " 新密码 来重置新密码" + + "
此验证码有效期为 " + (emailCode.getDurability() / (1000 * 60)) + "分钟"); } Bukkit.getScheduler().runTask(CatSeedLogin.instance, () -> { if (emailCode != null) { @@ -71,7 +63,6 @@ public boolean onCommand(CommandSender sender, Command command, String s, String } return true; } - //command re if (args[0].equalsIgnoreCase("re") && args.length > 2) { if (lp.getEmail() == null) { sender.sendMessage(Config.Language.RESETPASSWORD_EMAIL_NO_SET); @@ -80,7 +71,6 @@ public boolean onCommand(CommandSender sender, Command command, String s, String if (optionalEmailCode.isPresent()) { EmailCode emailCode = optionalEmailCode.get(); String code = args[1], pwd = args[2]; - if (emailCode.getCode().equals(code)) { if (Util.passwordIsDifficulty(pwd)) { sender.sendMessage(Config.Language.COMMON_PASSWORD_SO_SIMPLE); @@ -98,27 +88,22 @@ public boolean onCommand(CommandSender sender, Command command, String s, String Player p = Bukkit.getPlayer(lp.getName()); if (p != null && p.isOnline()) { if (Config.Settings.CanTpSpawnLocation) { - // PlayerTeleport.teleport(p, Config.Settings.SpawnLocation); - CatScheduler.teleport(p,Config.Settings.SpawnLocation); + CatScheduler.teleport(p, Config.Settings.SpawnLocation); } p.sendMessage(Config.Language.RESETPASSWORD_SUCCESS); if (CatSeedLogin.loadProtocolLib) { LoginPlayerHelper.sendBlankInventoryPacket(player); } } - }); } catch (Exception e) { - CatScheduler.runTask( () -> sender.sendMessage("§c数据库异常!")); + CatScheduler.runTask(() -> sender.sendMessage("§c数据库异常!")); e.printStackTrace(); } - - }); } else { sender.sendMessage(Config.Language.RESETPASSWORD_EMAILCODE_INCORRECT); } - } else { sender.sendMessage(Config.Language.RESETPASSWORD_FAIL); } diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/database/Cache.java b/src/main/java/cc/baka9/catseedlogin/bukkit/database/Cache.java index 6403c80..b25cb47 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/database/Cache.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/database/Cache.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; - import cc.baka9.catseedlogin.bukkit.CatSeedLogin; import cc.baka9.catseedlogin.bukkit.object.LoginPlayer; @@ -12,17 +11,17 @@ public class Cache { private static final Map PLAYER_HASHTABLE = new ConcurrentHashMap<>(); public static volatile boolean isLoaded = false; - public static List getAllLoginPlayer(){ + public static List getAllLoginPlayer() { synchronized (PLAYER_HASHTABLE) { return new ArrayList<>(PLAYER_HASHTABLE.values()); } } - public static LoginPlayer getIgnoreCase(String name){ + public static LoginPlayer getIgnoreCase(String name) { return PLAYER_HASHTABLE.get(name.toLowerCase()); } - public static void refreshAll(){ + public static void refreshAll() { isLoaded = false; CatSeedLogin.instance.runTaskAsync(() -> { try { @@ -40,7 +39,7 @@ public static void refreshAll(){ }); } - public static void refresh(String name){ + public static void refresh(String name) { CatSeedLogin.instance.runTaskAsync(() -> { try { LoginPlayer newLp = CatSeedLogin.sql.get(name); diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/database/MySQL.java b/src/main/java/cc/baka9/catseedlogin/bukkit/database/MySQL.java index 6140707..0e47968 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/database/MySQL.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/database/MySQL.java @@ -3,9 +3,7 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; - import org.bukkit.plugin.java.JavaPlugin; - import cc.baka9.catseedlogin.bukkit.Config; public class MySQL extends SQL { @@ -20,12 +18,11 @@ public synchronized Connection getConnection() throws SQLException { if (isConnectionValid()) { return this.connection; } - try { Class.forName("com.mysql.cj.jdbc.Driver"); this.connection = DriverManager.getConnection( - "jdbc:mysql://" + Config.MySQL.Host + ":" + Config.MySQL.Port + "/" + Config.MySQL.Database + "?characterEncoding=UTF-8", - Config.MySQL.User, Config.MySQL.Password + "jdbc:mysql://" + Config.MySQL.Host + ":" + Config.MySQL.Port + "/" + Config.MySQL.Database + "?characterEncoding=UTF-8", + Config.MySQL.User, Config.MySQL.Password ); return this.connection; } catch (ClassNotFoundException | SQLException e) { diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/database/SQL.java b/src/main/java/cc/baka9/catseedlogin/bukkit/database/SQL.java index b1a6a18..9b3a81f 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/database/SQL.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/database/SQL.java @@ -13,54 +13,45 @@ public abstract class SQL { protected JavaPlugin plugin; - public SQL(JavaPlugin plugin){ + public SQL(JavaPlugin plugin) { this.plugin = plugin; } - public void init() throws Exception{ - - flush(new BufferStatement("CREATE TABLE IF NOT EXISTS accounts (name CHAR(255),password CHAR(255),email CHAR(255),ips CHAR(255),lastAction TIMESTAMP)")); + public void init() throws Exception { + flush(new BufferStatement("CREATE TABLE IF NOT EXISTS accounts (name CHAR(255), password CHAR(255), email CHAR(255), ips CHAR(255), lastAction TIMESTAMP)")); try { flush(new BufferStatement("ALTER TABLE accounts ADD email CHAR(255)")); } catch (Exception e) { - if (!e.getMessage().toLowerCase().contains("duplicate column name")) { - throw e; - } + if (!e.getMessage().toLowerCase().contains("duplicate column name")) throw e; } try { flush(new BufferStatement("ALTER TABLE accounts ADD ips CHAR(255)")); } catch (Exception e) { - if (!e.getMessage().toLowerCase().contains("duplicate column name")) { - throw e; - } + if (!e.getMessage().toLowerCase().contains("duplicate column name")) throw e; } - } - - public void add(LoginPlayer lp) throws Exception{ - flush(new BufferStatement("INSERT INTO accounts (name,password,lastAction,email,ips) VALUES(?,?,?,?,?)", - lp.getName(), lp.getPassword(), new Date(), lp.getEmail(), lp.getIps())); + public void add(LoginPlayer lp) throws Exception { + flush(new BufferStatement("INSERT INTO accounts (name, password, lastAction, email, ips) VALUES (?, ?, ?, ?, ?)", + lp.getName(), lp.getPassword(), new Date(), lp.getEmail(), lp.getIps())); Cache.refresh(lp.getName()); } - public void del(String name) throws Exception{ + public void del(String name) throws Exception { flush(new BufferStatement("DELETE FROM accounts WHERE name = ?", name)); Cache.refresh(name); } - public void edit(LoginPlayer lp) throws Exception{ - flush(new BufferStatement("UPDATE accounts SET password = ?, lastAction = ?, email = ?, ips = ? WHERE name= ?" - , lp.getPassword(), new Date(), lp.getEmail(), lp.getIps(), lp.getName())); + public void edit(LoginPlayer lp) throws Exception { + flush(new BufferStatement("UPDATE accounts SET password = ?, lastAction = ?, email = ?, ips = ? WHERE name = ?", + lp.getPassword(), new Date(), lp.getEmail(), lp.getIps(), lp.getName())); Cache.refresh(lp.getName()); } - public LoginPlayer get(String name) throws Exception{ - PreparedStatement ps = new BufferStatement("SELECT * FROM accounts WHERE name = ?", - name).prepareStatement(getConnection()); - + public LoginPlayer get(String name) throws Exception { + PreparedStatement ps = new BufferStatement("SELECT * FROM accounts WHERE name = ?", name).prepareStatement(getConnection()); ResultSet resultSet = ps.executeQuery(); LoginPlayer lp = null; if (resultSet.next()) { @@ -74,29 +65,26 @@ public LoginPlayer get(String name) throws Exception{ return lp; } - public List getAll() throws Exception{ + public List getAll() throws Exception { PreparedStatement ps = new BufferStatement("SELECT * FROM accounts").prepareStatement(getConnection()); ResultSet resultSet = ps.executeQuery(); List lps = new ArrayList<>(); - LoginPlayer lp; while (resultSet.next()) { - lp = new LoginPlayer(resultSet.getString("name"), resultSet.getString("password")); + LoginPlayer lp = new LoginPlayer(resultSet.getString("name"), resultSet.getString("password")); lp.setLastAction(resultSet.getTimestamp("lastAction").getTime()); lp.setEmail(resultSet.getString("email")); lp.setIps(resultSet.getString("ips")); lps.add(lp); } return lps; - } - public List getLikeByIp(String ip) throws Exception{ - PreparedStatement ps = new BufferStatement("SELECT * FROM accounts WHERE ips like ?", "%" + ip + "%").prepareStatement(getConnection()); + public List getLikeByIp(String ip) throws Exception { + PreparedStatement ps = new BufferStatement("SELECT * FROM accounts WHERE ips LIKE ?", "%" + ip + "%").prepareStatement(getConnection()); ResultSet resultSet = ps.executeQuery(); List lps = new ArrayList<>(); - LoginPlayer lp; while (resultSet.next()) { - lp = new LoginPlayer(resultSet.getString("name"), resultSet.getString("password")); + LoginPlayer lp = new LoginPlayer(resultSet.getString("name"), resultSet.getString("password")); lp.setLastAction(resultSet.getTimestamp("lastAction").getTime()); lp.setEmail(resultSet.getString("email")); lp.setIps(resultSet.getString("ips")); @@ -107,8 +95,7 @@ public List getLikeByIp(String ip) throws Exception{ public abstract Connection getConnection() throws Exception; - - public void flush(BufferStatement bufferStatement) throws Exception{ + public void flush(BufferStatement bufferStatement) throws Exception { PreparedStatement ps = bufferStatement.prepareStatement(getConnection()); ps.executeUpdate(); ps.close(); diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/database/SQLite.java b/src/main/java/cc/baka9/catseedlogin/bukkit/database/SQLite.java index 9a61c3e..f82fb84 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/database/SQLite.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/database/SQLite.java @@ -3,7 +3,6 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; - import org.bukkit.plugin.java.JavaPlugin; public class SQLite extends SQL { diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/event/CatSeedPlayerLoginEvent.java b/src/main/java/cc/baka9/catseedlogin/bukkit/event/CatSeedPlayerLoginEvent.java index 96b101b..a23d043 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/event/CatSeedPlayerLoginEvent.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/event/CatSeedPlayerLoginEvent.java @@ -9,39 +9,30 @@ public class CatSeedPlayerLoginEvent extends Event { private static final HandlerList handlers = new HandlerList(); + @Getter private final Player player; + private final String email; + @Getter private final Result result; - public CatSeedPlayerLoginEvent(Player player, String email, Result result){ + public CatSeedPlayerLoginEvent(Player player, String email, Result result) { this.player = player; this.email = email; this.result = result; } - public HandlerList getHandlers(){ + public HandlerList getHandlers() { return handlers; } - public static HandlerList getHandlerList(){ + public static HandlerList getHandlerList() { return handlers; } - @Getter - private final Player player; - private final String email; - @Getter - private final Result result; - - - public Optional getEmail(){ + public Optional getEmail() { return Optional.ofNullable(email); } - public enum Result { - SUCCESS, - FAIL; - - Result(){ - } - + SUCCESS, FAIL; + Result() {} } } diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/event/CatSeedPlayerRegisterEvent.java b/src/main/java/cc/baka9/catseedlogin/bukkit/event/CatSeedPlayerRegisterEvent.java index 6d6a24f..8c3c1ac 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/event/CatSeedPlayerRegisterEvent.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/event/CatSeedPlayerRegisterEvent.java @@ -5,25 +5,20 @@ import org.bukkit.event.Event; import org.bukkit.event.HandlerList; - @Getter public class CatSeedPlayerRegisterEvent extends Event { private static final HandlerList handlers = new HandlerList(); + private final Player player; - public HandlerList getHandlers(){ - return handlers; + public CatSeedPlayerRegisterEvent(Player player) { + this.player = player; } - public static HandlerList getHandlerList(){ + public HandlerList getHandlers() { return handlers; } - public CatSeedPlayerRegisterEvent(Player player){ - this.player = player; + public static HandlerList getHandlerList() { + return handlers; } - - - private final Player player; - - } diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/object/EmailCode.java b/src/main/java/cc/baka9/catseedlogin/bukkit/object/EmailCode.java index a185c1d..2897b07 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/object/EmailCode.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/object/EmailCode.java @@ -3,7 +3,6 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; - import cc.baka9.catseedlogin.util.Util; import lombok.Getter; import lombok.Setter; @@ -11,70 +10,40 @@ @Getter @Setter public class EmailCode { - - public enum Type { - Bind, ResetPassword - } - + public enum Type { Bind, ResetPassword } private static Map bindMap = new ConcurrentHashMap<>(10); - private static Map resetPasswordMap = new ConcurrentHashMap<>(10); + private String name, email, code; + private long durability, createTime; - private String name; - private String email; - private String code; - private long durability; - private long createTime; - - private EmailCode(String name, String email, long durability){ - this.name = name; - this.email = email; - this.durability = durability; - this.createTime = System.currentTimeMillis(); - this.code = Util.randomStr(); + private EmailCode(String name, String email, long durability) { + this.name = name; this.email = email; this.durability = durability; + this.createTime = System.currentTimeMillis(); this.code = Util.randomStr(); } - public static EmailCode create(String name, String email, long durability, Type type){ - if (type == Type.Bind) { - bindMap.put(name, new EmailCode(name, email, durability)); - return bindMap.get(name); - } - if (type == Type.ResetPassword) { - - resetPasswordMap.put(name, new EmailCode(name, email, durability)); - return resetPasswordMap.get(name); - } - return null; + public static EmailCode create(String name, String email, long durability, Type type) { + EmailCode emailCode = new EmailCode(name, email, durability); + if (type == Type.Bind) bindMap.put(name, emailCode); + else if (type == Type.ResetPassword) resetPasswordMap.put(name, emailCode); + return emailCode; } - public static Optional getByName(String name, Type type){ + public static Optional getByName(String name, Type type) { clear(); - if (type == Type.Bind && bindMap.containsKey(name)) { - return Optional.of(bindMap.get(name)); - } - if (type == Type.ResetPassword && resetPasswordMap.containsKey(name)) { - return Optional.of(resetPasswordMap.get(name)); - } - return Optional.empty(); + return (type == Type.Bind && bindMap.containsKey(name)) ? Optional.of(bindMap.get(name)) : + (type == Type.ResetPassword && resetPasswordMap.containsKey(name)) ? Optional.of(resetPasswordMap.get(name)) : + Optional.empty(); } - - public static void removeByName(String name, Type type){ + public static void removeByName(String name, Type type) { clear(); - if (type == Type.Bind) { - - bindMap.remove(name); - } - if (type == Type.ResetPassword) { - resetPasswordMap.remove(name); - } - + if (type == Type.Bind) bindMap.remove(name); + else if (type == Type.ResetPassword) resetPasswordMap.remove(name); } - private static void clear(){ + private static void clear() { long now = System.currentTimeMillis(); bindMap.entrySet().removeIf(next -> now - next.getValue().getCreateTime() > next.getValue().getDurability()); resetPasswordMap.entrySet().removeIf(next -> now - next.getValue().getCreateTime() > next.getValue().getDurability()); } - } diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/object/LoginPlayer.java b/src/main/java/cc/baka9/catseedlogin/bukkit/object/LoginPlayer.java index 290988d..67f96c2 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/object/LoginPlayer.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/object/LoginPlayer.java @@ -14,41 +14,28 @@ @Getter @Setter public class LoginPlayer { - private String name; - private String password; - private String email; - private String ips; + private String name, password, email, ips; private long lastAction; - @Override - public boolean equals(Object o){ - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - LoginPlayer that = (LoginPlayer) o; - return Objects.equals(name, that.name); + public LoginPlayer(String name, String password) { + this.name = name; this.password = password; } - public List getIpsList(){ - List ipList = new ArrayList<>(); - if (this.ips != null) { - ipList.addAll(Arrays.asList(this.ips.split(";"))); - } - return ipList; + @Override + public boolean equals(Object o) { + return this == o || (o instanceof LoginPlayer && Objects.equals(name, ((LoginPlayer) o).name)); } @Override - public int hashCode(){ + public int hashCode() { return Objects.hash(name); } - public LoginPlayer(String name, String password){ - this.name = name; - this.password = password; + public List getIpsList() { + return (ips != null) ? new ArrayList<>(Arrays.asList(ips.split(";"))) : new ArrayList<>(); } - public void crypt(){ + public void crypt() { password = Crypt.encrypt(name, password); } - - } diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/object/LoginPlayerHelper.java b/src/main/java/cc/baka9/catseedlogin/bukkit/object/LoginPlayerHelper.java index deb769c..218d279 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/object/LoginPlayerHelper.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/object/LoginPlayerHelper.java @@ -2,12 +2,7 @@ import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -31,45 +26,21 @@ public class LoginPlayerHelper { private static final Set set = ConcurrentHashMap.newKeySet(); private static final Map playerExitTimes = new ConcurrentHashMap<>(); - public static List getList(){ - return new ArrayList<>(set); + public static List getList() { return new ArrayList<>(set); } + public static void add(LoginPlayer lp) { set.add(lp); } + public static void remove(LoginPlayer lp) { set.remove(lp); } + + public static void remove(String name) { + set.removeIf(lp -> lp.getName().equals(name)); } - public static void add(LoginPlayer lp){ - set.add(lp); + public static boolean isLogin(String name) { + return Config.Settings.BedrockLoginBypass && isFloodgatePlayer(name) || + Config.Settings.LoginwiththesameIP && recordCurrentIP(name) || + set.stream().anyMatch(lp -> lp.getName().equals(name)); } - public static void remove(LoginPlayer lp){ - set.remove(lp); - } - - public static void remove(String name){ - Iterator iterator = set.iterator(); - while (iterator.hasNext()) { - LoginPlayer lp = iterator.next(); - if (lp.getName().equals(name)) { - iterator.remove(); - break; - } - } - } - - public static boolean isLogin(String name){ - if (Config.Settings.BedrockLoginBypass && isFloodgatePlayer(name)){ - return true; - } - if (Config.Settings.LoginwiththesameIP && recordCurrentIP(name)){ - return true; - } - for (LoginPlayer lp : set) { - if (lp.getName().equals(name)) { - return true; - } - } - return false; - } - - public static boolean isRegister(String name){ + public static boolean isRegister(String name) { return Config.Settings.BedrockLoginBypass && isFloodgatePlayer(name) || Cache.getIgnoreCase(name) != null; } @@ -79,32 +50,17 @@ public static boolean recordCurrentIP(String name) { } public static boolean recordCurrentIP(Player player) { - String currentIP = (player.getAddress() != null) ? player.getAddress().getAddress().getHostAddress() : null; - - if (currentIP == null) { - return false; - } + String currentIP = Optional.ofNullable(player.getAddress()).map(addr -> addr.getAddress().getHostAddress()).orElse(null); + if (currentIP == null) return false; LoginPlayer storedPlayer = Cache.getIgnoreCase(player.getName()); - if (storedPlayer != null) { List storedIPs = getStoredIPs(storedPlayer); Long exitTime = playerExitTimes.get(player.getName()); - try { - if (InetAddress.getByName(currentIP).isLoopbackAddress()) { - return false; - } - } catch (UnknownHostException e) { - return false; - } - - if (Config.Settings.IPTimeout == 0) { - return storedIPs.contains(currentIP); - } else { - return exitTime != null && storedIPs.contains(currentIP) && - (System.currentTimeMillis() - exitTime) <= (long) Config.Settings.IPTimeout * 60 * 1000L; - } + if (isLoopbackAddress(currentIP)) return false; + return Config.Settings.IPTimeout == 0 ? storedIPs.contains(currentIP) : + exitTime != null && storedIPs.contains(currentIP) && (System.currentTimeMillis() - exitTime) <= (long) Config.Settings.IPTimeout * 60 * 1000L; } return false; @@ -121,13 +77,7 @@ public void onPlayerQuit(String playerName) { } public static List getStoredIPs(LoginPlayer lp) { - List storedIPs = new ArrayList<>(); - String ipsString = lp.getIps(); - if (ipsString != null) { - String[] ipsArray = ipsString.split(";"); - storedIPs.addAll(Arrays.asList(ipsArray)); - } - return storedIPs; + return (lp.getIps() != null) ? new ArrayList<>(Arrays.asList(lp.getIps().split(";"))) : new ArrayList<>(); } public static boolean isFloodgatePlayer(String name) { @@ -136,8 +86,7 @@ public static boolean isFloodgatePlayer(String name) { } public static boolean isFloodgatePlayer(Player player) { - return Bukkit.getPluginManager().getPlugin("floodgate") != null && - FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()); + return Bukkit.getPluginManager().getPlugin("floodgate") != null && FloodgateApi.getInstance().isFloodgatePlayer(player.getUniqueId()); } public static Long getLastLoginTime(String name) { @@ -145,15 +94,12 @@ public static Long getLastLoginTime(String name) { return (loginPlayer != null) ? loginPlayer.getLastAction() : null; } - // 记录登录IP - public static void recordCurrentIP(Player player, LoginPlayer lp){ + public static void recordCurrentIP(Player player, LoginPlayer lp) { String currentIp = player.getAddress().getAddress().getHostAddress(); List ipsList = lp.getIpsList(); - ipsList.add(currentIp); ipsList = ipsList.stream().distinct().collect(Collectors.toList()); - if (!ipsList.isEmpty()) { - ipsList.remove(0); - } + if (!ipsList.isEmpty()) ipsList.remove(0); + ipsList.add(currentIp); lp.setIps(String.join(";", ipsList)); CatSeedLogin.instance.runTaskAsync(() -> { try { @@ -164,18 +110,15 @@ public static void recordCurrentIP(Player player, LoginPlayer lp){ }); } - // ProtocolLib发包空背包 public static void sendBlankInventoryPacket(Player player) { if (!Config.Settings.Emptybackpack) return; ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); PacketContainer inventoryPacket = protocolManager.createPacket(PacketType.Play.Server.WINDOW_ITEMS); inventoryPacket.getIntegers().write(0, 0); - - int inventorySize = 45; - ItemStack[] blankInventory = new ItemStack[inventorySize]; + ItemStack[] blankInventory = new ItemStack[45]; Arrays.fill(blankInventory, new ItemStack(Material.AIR)); - + StructureModifier itemArrayModifier = inventoryPacket.getItemArrayModifier(); if (itemArrayModifier.size() > 0) { itemArrayModifier.write(0, blankInventory); @@ -186,4 +129,12 @@ public static void sendBlankInventoryPacket(Player player) { protocolManager.sendServerPacket(player, inventoryPacket, false); } + + private static boolean isLoopbackAddress(String currentIP) { + try { + return InetAddress.getByName(currentIP).isLoopbackAddress(); + } catch (UnknownHostException e) { + return false; + } + } } diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/task/Task.java b/src/main/java/cc/baka9/catseedlogin/bukkit/task/Task.java index 61a6ea8..47a0f72 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/task/Task.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/task/Task.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.List; - import cc.baka9.catseedlogin.bukkit.CatScheduler; import cc.baka9.catseedlogin.bukkit.CatSeedLogin; import space.arim.morepaperlib.scheduling.ScheduledTask; @@ -10,24 +9,17 @@ public abstract class Task implements Runnable { private static final List scheduledTasks = new ArrayList<>(); private static final CatSeedLogin plugin = CatSeedLogin.instance; - private static TaskAutoKick taskAutoKick; private static TaskSendLoginMessage taskSendLoginMessage; protected Task() {} public static TaskAutoKick getTaskAutoKick() { - if (taskAutoKick == null) { - taskAutoKick = new TaskAutoKick(); - } - return taskAutoKick; + return taskAutoKick == null ? (taskAutoKick = new TaskAutoKick()) : taskAutoKick; } public static TaskSendLoginMessage getTaskSendLoginMessage() { - if (taskSendLoginMessage == null) { - taskSendLoginMessage = new TaskSendLoginMessage(); - } - return taskSendLoginMessage; + return taskSendLoginMessage == null ? (taskSendLoginMessage = new TaskSendLoginMessage()) : taskSendLoginMessage; } public static void runAll() { diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/task/TaskAutoKick.java b/src/main/java/cc/baka9/catseedlogin/bukkit/task/TaskAutoKick.java index 5fd9dce..ffae09d 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/task/TaskAutoKick.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/task/TaskAutoKick.java @@ -2,10 +2,8 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; - import org.bukkit.Bukkit; import org.bukkit.entity.Player; - import cc.baka9.catseedlogin.bukkit.Config; import cc.baka9.catseedlogin.bukkit.database.Cache; import cc.baka9.catseedlogin.bukkit.object.LoginPlayerHelper; @@ -17,9 +15,7 @@ public class TaskAutoKick extends Task { public void run() { if (!Cache.isLoaded || Config.Settings.AutoKick < 1) return; - long autoKickMs = Config.Settings.AutoKick * 1000L; - long now = System.currentTimeMillis(); - + long autoKickMs = Config.Settings.AutoKick * 1000L, now = System.currentTimeMillis(); for (Player player : Bukkit.getOnlinePlayers()) { String playerName = player.getName(); try { @@ -32,7 +28,6 @@ public void run() { playerJoinTime.remove(playerName); } } catch (Exception e) { - // 记录错误日志 e.printStackTrace(); } } diff --git a/src/main/java/cc/baka9/catseedlogin/bukkit/task/TaskSendLoginMessage.java b/src/main/java/cc/baka9/catseedlogin/bukkit/task/TaskSendLoginMessage.java index 44d95e4..55e8154 100644 --- a/src/main/java/cc/baka9/catseedlogin/bukkit/task/TaskSendLoginMessage.java +++ b/src/main/java/cc/baka9/catseedlogin/bukkit/task/TaskSendLoginMessage.java @@ -2,13 +2,11 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; - import cc.baka9.catseedlogin.bukkit.Config; import cc.baka9.catseedlogin.bukkit.database.Cache; import cc.baka9.catseedlogin.bukkit.object.LoginPlayerHelper; public class TaskSendLoginMessage extends Task { - @Override public void run() { if (!Cache.isLoaded) return; @@ -17,14 +15,9 @@ public void run() { try { String playerName = player.getName(); if (!LoginPlayerHelper.isLogin(playerName)) { - if (!LoginPlayerHelper.isRegister(playerName)) { - player.sendMessage(Config.Language.REGISTER_REQUEST); - } else { - player.sendMessage(Config.Language.LOGIN_REQUEST); - } + player.sendMessage(LoginPlayerHelper.isRegister(playerName) ? Config.Language.LOGIN_REQUEST : Config.Language.REGISTER_REQUEST); } } catch (Exception e) { - // 记录错误日志 e.printStackTrace(); } } diff --git a/src/main/java/cc/baka9/catseedlogin/bungee/Communication.java b/src/main/java/cc/baka9/catseedlogin/bungee/Communication.java index e0818b6..05e7bbf 100644 --- a/src/main/java/cc/baka9/catseedlogin/bungee/Communication.java +++ b/src/main/java/cc/baka9/catseedlogin/bungee/Communication.java @@ -1,47 +1,70 @@ package cc.baka9.catseedlogin.bungee; -import java.net.Socket; -import java.io.IOException; +import cc.baka9.catseedlogin.util.CommunicationAuth; +import net.md_5.bungee.api.ProxyServer; + import java.io.BufferedWriter; +import java.io.IOException; import java.io.OutputStreamWriter; - -import cc.baka9.catseedlogin.util.CommunicationAuth; +import java.net.Socket; /** * bc 与 bukkit 的通讯交流 */ public class Communication { - private static final String HOST = Config.Host; - private static final int PORT = Config.Port; public static int sendConnectRequest(String playerName) { - return sendRequest("Connect", playerName); + try (Socket socket = getSocket(); BufferedWriter bufferedWriter = getSocketBufferedWriter(socket)) { + // 请求类型 + bufferedWriter.write("Connect"); + bufferedWriter.newLine(); + // 玩家名 + bufferedWriter.write(playerName); + bufferedWriter.newLine(); + + bufferedWriter.flush(); + return socket.getInputStream().read(); + } catch (IOException e) { + e.printStackTrace(); + } + return 0; } public static void sendKeepLoggedInRequest(String playerName) { - long currentTime = System.currentTimeMillis(); - String time = String.valueOf(currentTime); - String sign = CommunicationAuth.encryption(playerName, time, Config.AuthKey); - sendRequest("KeepLoggedIn", playerName, time, sign); - } + try (Socket socket = getSocket(); BufferedWriter bufferedWriter = getSocketBufferedWriter(socket)) { + // 请求类型 + bufferedWriter.write("KeepLoggedIn"); + bufferedWriter.newLine(); + // 玩家名 + bufferedWriter.write(playerName); + bufferedWriter.newLine(); + // 时间戳 + String time = String.valueOf(System.currentTimeMillis()); + bufferedWriter.write(time); + bufferedWriter.newLine(); + // 根据玩家名,时间戳,和authKey加密的结果(加密是因为如果登录服不在内网环境下,则可能会被人使用这个功能给发包来绕过登录) + String sign = CommunicationAuth.encryption(playerName, time, Config.AuthKey); + bufferedWriter.write(sign); + bufferedWriter.newLine(); - private static int sendRequest(String requestType, String... messages) { - try (Socket socket = new Socket(HOST, PORT); - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) { - writeMessage(writer, requestType, messages); - return socket.getInputStream().read(); + bufferedWriter.flush(); } catch (IOException e) { - return 0; + e.printStackTrace(); } } - private static void writeMessage(BufferedWriter writer, String requestType, String... messages) throws IOException { - writer.write(requestType); - writer.newLine(); - for (String message : messages) { - writer.write(message); - writer.newLine(); + private static Socket getSocket() throws IOException { + try { + return new Socket(Config.Host, Config.Port); + } catch (IOException e) { + ProxyServer.getInstance().getLogger().warning("§c请检查装载登录插件的子服是否在 bungeecord.yml 中开启了bungeecord功能,以及Host和Port是否与bc端的配置相同"); + throw new IOException(e); } - writer.flush(); } + + private static BufferedWriter getSocketBufferedWriter(Socket socket) throws IOException { + return new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); + } + + } diff --git a/src/main/java/cc/baka9/catseedlogin/util/CommunicationAuth.java b/src/main/java/cc/baka9/catseedlogin/util/CommunicationAuth.java index d27fcb9..5461ae0 100644 --- a/src/main/java/cc/baka9/catseedlogin/util/CommunicationAuth.java +++ b/src/main/java/cc/baka9/catseedlogin/util/CommunicationAuth.java @@ -4,7 +4,6 @@ import java.security.NoSuchAlgorithmException; public class CommunicationAuth { - private static final MessageDigest messageDigest; static { diff --git a/src/main/java/cc/baka9/catseedlogin/util/Crypt.java b/src/main/java/cc/baka9/catseedlogin/util/Crypt.java index f0a5c3d..ab5709b 100644 --- a/src/main/java/cc/baka9/catseedlogin/util/Crypt.java +++ b/src/main/java/cc/baka9/catseedlogin/util/Crypt.java @@ -5,10 +5,9 @@ import java.security.NoSuchAlgorithmException; public class Crypt { - private static final char[] CRYPTCHARS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; - public static String encrypt(final String name, final String password){ + public static String encrypt(final String name, final String password) { String text = "ÜÄaeut//&/=I " + password + "7421€547" + name + "__+IÄIH§%NK " + password; try { final MessageDigest md = MessageDigest.getInstance("SHA-512"); @@ -19,7 +18,7 @@ public static String encrypt(final String name, final String password){ } } - public static String byteArrayToHexString(byte[] args){ + public static String byteArrayToHexString(byte[] args) { char[] chars = new char[args.length * 2]; for (int i = 0; i < args.length; i++) { chars[(i * 2)] = CRYPTCHARS[(args[i] >> 4 & 0xF)]; @@ -28,12 +27,11 @@ public static String byteArrayToHexString(byte[] args){ return new String(chars); } - public boolean match(final String name, final String password, final String encrypted){ + public boolean match(final String name, final String password, final String encrypted) { try { return encrypted.equals(encrypt(name, password)); } catch (final Exception e) { return false; } } - } diff --git a/src/main/java/cc/baka9/catseedlogin/util/Mail.java b/src/main/java/cc/baka9/catseedlogin/util/Mail.java index d94a7a2..d509d78 100644 --- a/src/main/java/cc/baka9/catseedlogin/util/Mail.java +++ b/src/main/java/cc/baka9/catseedlogin/util/Mail.java @@ -3,16 +3,12 @@ import org.apache.commons.mail.DefaultAuthenticator; import org.apache.commons.mail.Email; import org.apache.commons.mail.HtmlEmail; - import cc.baka9.catseedlogin.bukkit.Config; public class Mail { - - private Mail() { - } + private Mail() {} public static void sendMail(String receiveMailAccount, String subject, String content) throws Exception { - Email email = new HtmlEmail(); email.setHostName(Config.EmailVerify.EmailSmtpHost); email.setSmtpPort(Integer.parseInt(Config.EmailVerify.EmailSmtpPort)); @@ -29,7 +25,5 @@ public static void sendMail(String receiveMailAccount, String subject, String co email.addTo(receiveMailAccount); email.setCharset("UTF-8"); email.send(); - } - } diff --git a/src/main/java/cc/baka9/catseedlogin/util/Util.java b/src/main/java/cc/baka9/catseedlogin/util/Util.java index f376092..c349dff 100644 --- a/src/main/java/cc/baka9/catseedlogin/util/Util.java +++ b/src/main/java/cc/baka9/catseedlogin/util/Util.java @@ -5,7 +5,6 @@ import java.util.Date; import java.util.Random; import java.util.regex.Pattern; - import org.apache.commons.lang3.RandomStringUtils; public class Util { @@ -32,7 +31,6 @@ public static String randomStr() { } public static boolean isOSLinux() { - String os = System.getProperty("os.name"); - return os != null && os.toLowerCase().contains("linux"); + return System.getProperty("os.name").toLowerCase().contains("linux"); } }