From 7a5fb5f171255eb3ad915d4af07ba8647eb9f174 Mon Sep 17 00:00:00 2001 From: youpaishidifu <1@ypshidifu.cn> Date: Thu, 1 Oct 2026 18:04:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E9=80=80=E6=AD=A3=E7=89=88=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E8=90=BD=E5=BA=93=EF=BC=9A=E6=94=B9=E4=B8=BA=E4=BB=85?= =?UTF-8?q?=E6=9C=AC=E6=AC=A1=E8=BF=90=E8=A1=8C=E6=9C=9F=E5=86=85=E5=85=8D?= =?UTF-8?q?=E7=99=BB=E5=BD=95=EF=BC=8C=E5=86=99=E5=85=A5=E4=B8=8D=E7=9C=8B?= =?UTF-8?q?=E7=8E=A9=E5=AE=B6=E5=9C=A8=E7=BA=BF=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Sdf1_login/DatabaseManager.java | 8 --- src/main/java/Sdf1_login/Main.java | 70 +++---------------- 2 files changed, 9 insertions(+), 69 deletions(-) diff --git a/src/main/java/Sdf1_login/DatabaseManager.java b/src/main/java/Sdf1_login/DatabaseManager.java index 9992f3e..f473609 100644 --- a/src/main/java/Sdf1_login/DatabaseManager.java +++ b/src/main/java/Sdf1_login/DatabaseManager.java @@ -123,14 +123,6 @@ public class DatabaseManager { safeAdd(st, "twofa_recovery_codes", "TEXT DEFAULT ''"); - // ===== 正版OAuth验证永久标记(验证一次即永久,重启后仍自动放行)===== - safeAdd(st, "premium_verified_at", - "INTEGER DEFAULT 0"); - safeAdd(st, "premium_verified_uuid", - "TEXT DEFAULT ''"); - safeAdd(st, "premium_verified_name", - "TEXT DEFAULT ''"); - // ===== 背包备份表:安全迁移 ===== // 检查旧表是否存在(用 inventory_data 列判断) boolean hasOldTable = false; diff --git a/src/main/java/Sdf1_login/Main.java b/src/main/java/Sdf1_login/Main.java index 75a58a5..43a09d8 100644 --- a/src/main/java/Sdf1_login/Main.java +++ b/src/main/java/Sdf1_login/Main.java @@ -379,8 +379,6 @@ public class Main extends JavaPlugin db = new DatabaseManager(getDataFolder()); db.init(); menuIconMgr = new MenuIconManager(this); - // ★ 启动时恢复「已通过正版OAuth验证」的玩家(验证一次即永久,重启不清) - loadVerifiedPremiumPlayers(); // ===== 3. 菜单 ===== @@ -1916,62 +1914,17 @@ public class Main extends JavaPlugin /** * 记录玩家为已验证的正版玩家(PHP OAuth验证成功后调用) + * + *

语义:只在本次服务器运行期内赋予正版免登录权,重启即清空—— + * 这样即便有人侥幸拿到过一次验证窗口,重启后也必须重新走 OAuth, + * 只有账号真正的主人才能每次都通过。 + * + *

写入时不看玩家是否在线:网速慢、后端没及时对齐都可能错过窗口, + * 只要 PHP 判了 verified 就照写,人不在也照写。 */ public void addVerifiedPremiumPlayer(String playerName, String mcUuid, String mcUsername) { verifiedPremiumPlayers.put(playerName, new String[]{mcUuid, mcUsername, String.valueOf(System.currentTimeMillis())}); - // ★ 永久写入数据库:玩家当下去/已离线都不影响,下次上线直接登录 - persistVerifiedPremium(playerName); - getLogger().info("[正版验证] 玩家 " + playerName + " 已通过Microsoft OAuth验证 (UUID: " + mcUuid + ", MCName: " + mcUsername + ")"); - } - - /** - * 把「已通过正版OAuth验证」写进数据库:验证一次即永久,重启后仍自动放行。 - * 账号行还不存在时静默跳过(首次 autoLogin 创建账号后会补写)。 - */ - public void persistVerifiedPremium(String playerName) { - String[] data = verifiedPremiumPlayers.get(playerName); - if (data == null) return; - if (!db.userExists(playerName)) return; - try { - db.setField(playerName, "premium_verified_uuid", data[0] == null ? "" : data[0]); - db.setField(playerName, "premium_verified_name", data[1] == null ? "" : data[1]); - db.setField(playerName, "premium_verified_at", - Long.parseLong(data.length > 2 && data[2] != null ? data[2] : "0")); - } catch (Exception e) { - getLogger().warning("[正版验证] 持久化失败 " + playerName + ": " + e.getMessage()); - } - } - - /** - * 启动时从数据库恢复已验证的正版玩家(离线/重启都不丢,下次上线直接登录) - */ - private void loadVerifiedPremiumPlayers() { - java.sql.Connection conn = db.getConnection(); - if (conn == null) return; - int n = 0; - try (java.sql.Statement st = conn.createStatement(); - java.sql.ResultSet rs = st.executeQuery( - "SELECT player_name, premium_verified_uuid, premium_verified_name, premium_verified_at " - + "FROM users WHERE premium_verified_at > 0")) { - while (rs.next()) { - String pn = rs.getString("player_name"); - if (pn == null || pn.isEmpty()) continue; - String uuid = rs.getString("premium_verified_uuid"); - String uname = rs.getString("premium_verified_name"); - long at = rs.getLong("premium_verified_at"); - verifiedPremiumPlayers.put(pn, new String[]{ - uuid == null ? "" : uuid, - (uname == null || uname.isEmpty()) ? pn : uname, - String.valueOf(at)}); - n++; - } - } catch (Exception e) { - getLogger().warning("[正版验证] 启动恢复已验证玩家失败: " + e.getMessage()); - return; - } - if (n > 0) { - getLogger().info("[正版验证] 已从数据库恢复 " + n + " 个已验证正版账号(重启不清)"); - } + getLogger().info("[正版验证] 玩家 " + playerName + " 已通过Microsoft OAuth验证 (UUID: " + mcUuid + ", MCName: " + mcUsername + "),本次运行期内免登录"); } /** 2FA 管理器访问器:登录流程据此判断是否走「密码+2FA」顺序两关 */ @@ -1980,7 +1933,7 @@ public class Main extends JavaPlugin } /** - * 移除玩家的正版验证标记(下线时不清除;数据库标记为永久,重启后由启动加载恢复) + * 移除玩家的正版验证标记(下线时不清除,服务器重启时随内存一并清空) */ public void removeVerifiedPremiumPlayer(String playerName) { verifiedPremiumPlayers.remove(playerName); @@ -2047,11 +2000,6 @@ public class Main extends JavaPlugin db.recordIP(name, ip); } - // ★ 账号行刚创建/首次登录时补写正版验证标记,保证重启后仍自动放行 - if (isVerifiedPremiumPlayer(name)) { - persistVerifiedPremium(name); - } - loggedIn.add(name); // ★ 记录Java手动登录:5分钟内重连可直接放行(检查点1) if (webManager != null) {