From b1bee0967cd2ee98479e9ea65d54a1a1a469cb0d Mon Sep 17 00:00:00 2001 From: Sattera Date: Sat, 24 Jun 2023 13:09:17 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=99=BD=E5=90=8D=E5=8D=95(=E7=8E=A9=E5=AE=B6=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E6=B3=A8=E5=86=8C)=20=E7=8E=A9=E5=AE=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0authme.whitelist=E6=9D=83=E9=99=90=E6=9D=A5=E5=BF=BD?= =?UTF-8?q?=E7=95=A5=E7=99=BD=E5=90=8D=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../authme/command/CommandInitializer.java | 11 +++ .../executable/authme/WhitelistCommand.java | 40 +++++++++ .../xephi/authme/listener/OnJoinVerifier.java | 11 +++ .../xephi/authme/listener/PlayerListener.java | 1 + .../fr/xephi/authme/message/MessageKey.java | 3 + .../authme/permission/AdminPermission.java | 1 + .../permission/PlayerStatePermission.java | 1 + .../authme/service/WhiteListService.java | 82 +++++++++++++++++++ .../properties/ProtectionSettings.java | 4 +- src/main/resources/messages/messages_zhcn.yml | 7 +- 10 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 src/main/java/fr/xephi/authme/command/executable/authme/WhitelistCommand.java create mode 100644 src/main/java/fr/xephi/authme/service/WhiteListService.java diff --git a/src/main/java/fr/xephi/authme/command/CommandInitializer.java b/src/main/java/fr/xephi/authme/command/CommandInitializer.java index fcc3ce61..4632e065 100644 --- a/src/main/java/fr/xephi/authme/command/CommandInitializer.java +++ b/src/main/java/fr/xephi/authme/command/CommandInitializer.java @@ -29,6 +29,7 @@ import fr.xephi.authme.command.executable.authme.TotpViewStatusCommand; import fr.xephi.authme.command.executable.authme.UnregisterAdminCommand; import fr.xephi.authme.command.executable.authme.UpdateHelpMessagesCommand; import fr.xephi.authme.command.executable.authme.VersionCommand; +import fr.xephi.authme.command.executable.authme.WhitelistCommand; import fr.xephi.authme.command.executable.authme.debug.DebugCommand; import fr.xephi.authme.command.executable.captcha.CaptchaCommand; import fr.xephi.authme.command.executable.changepassword.ChangePasswordCommand; @@ -420,6 +421,16 @@ public class CommandInitializer { .executableCommand(SwitchAntiBotCommand.class) .register(); + CommandDescription.builder() + .parent(authmeBase) + .labels("whitelist") + .description("Switch whitelist mode") + .detailedDescription("Switch or toggle the whitelist mode to the specified state.") + .withArgument("mode", "ON / OFF", OPTIONAL) + .permission(AdminPermission.SWITCH_ANTIBOT) + .executableCommand(WhitelistCommand.class) + .register(); + // Register the reload command CommandDescription.builder() .parent(authmeBase) diff --git a/src/main/java/fr/xephi/authme/command/executable/authme/WhitelistCommand.java b/src/main/java/fr/xephi/authme/command/executable/authme/WhitelistCommand.java new file mode 100644 index 00000000..f6c436c9 --- /dev/null +++ b/src/main/java/fr/xephi/authme/command/executable/authme/WhitelistCommand.java @@ -0,0 +1,40 @@ +package fr.xephi.authme.command.executable.authme; + +import fr.xephi.authme.command.ExecutableCommand; +import fr.xephi.authme.service.WhiteListService; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import javax.inject.Inject; +import java.util.List; + +/** + * Display or change the status of the antibot mod. + */ +public class WhitelistCommand implements ExecutableCommand { + + @Inject + private WhiteListService whiteListService; + + + @Override + public void executeCommand(final CommandSender sender, List arguments) { + if (arguments.isEmpty()) { + sender.sendMessage("[AuthMe] WhiteList: " + whiteListService.getWhiteListStatus().name()); + return; + } + + String newState = arguments.get(0); + + // Enable or disable the mod + if ("ON".equalsIgnoreCase(newState)) { + whiteListService.overrideWhiteListStatus(true); + sender.sendMessage("[AuthMe] WhiteList enabled!"); + } else if ("OFF".equalsIgnoreCase(newState)) { + sender.sendMessage("[AuthMe] WhiteList disabled!"); + whiteListService.overrideWhiteListStatus(false); + } else { + sender.sendMessage(ChatColor.GOLD + "Detailed help: " + ChatColor.WHITE + "/authme help whitelist"); + } + } +} diff --git a/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java b/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java index 08224841..8e72de1c 100644 --- a/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java +++ b/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java @@ -12,6 +12,7 @@ import fr.xephi.authme.permission.PlayerStatePermission; import fr.xephi.authme.service.AntiBotService; import fr.xephi.authme.service.BukkitService; import fr.xephi.authme.service.ValidationService; +import fr.xephi.authme.service.WhiteListService; import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.properties.ProtectionSettings; import fr.xephi.authme.settings.properties.RegistrationSettings; @@ -46,6 +47,8 @@ public class OnJoinVerifier implements Reloadable { @Inject private AntiBotService antiBotService; @Inject + private WhiteListService whiteListService; + @Inject private ValidationService validationService; @Inject private BukkitService bukkitService; @@ -81,6 +84,14 @@ public class OnJoinVerifier implements Reloadable { throw new FailedVerificationException(MessageKey.KICK_ANTIBOT); } } + public void checkWhitelist(String name, boolean isAuthAvailable) throws FailedVerificationException { + if (isAuthAvailable || permissionsManager.hasPermissionOffline(name, PlayerStatePermission.WHITELIST)) { + return; + } + if (whiteListService.shouldKick()) { + throw new FailedVerificationException(MessageKey.KICK_WHITELIST); + } + } /** * Checks whether non-registered players should be kicked, and if so, whether the player should be kicked. diff --git a/src/main/java/fr/xephi/authme/listener/PlayerListener.java b/src/main/java/fr/xephi/authme/listener/PlayerListener.java index 95f0685c..e998a69f 100644 --- a/src/main/java/fr/xephi/authme/listener/PlayerListener.java +++ b/src/main/java/fr/xephi/authme/listener/PlayerListener.java @@ -148,6 +148,7 @@ public class PlayerListener implements Listener { final PlayerAuth auth = dataSource.getAuth(name); final boolean isAuthAvailable = auth != null; onJoinVerifier.checkKickNonRegistered(isAuthAvailable); + onJoinVerifier.checkWhitelist(name, isAuthAvailable); onJoinVerifier.checkAntibot(name, isAuthAvailable); onJoinVerifier.checkNameCasing(name, auth); final String ip = event.getAddress().getHostAddress(); diff --git a/src/main/java/fr/xephi/authme/message/MessageKey.java b/src/main/java/fr/xephi/authme/message/MessageKey.java index a9ee9b78..29e6c575 100644 --- a/src/main/java/fr/xephi/authme/message/MessageKey.java +++ b/src/main/java/fr/xephi/authme/message/MessageKey.java @@ -16,6 +16,9 @@ public enum MessageKey { /** AntiBot protection mode is enabled! You have to wait some minutes before joining the server. */ KICK_ANTIBOT("antibot.kick_antibot"), + KICK_WHITELIST("on_join_validation.kick_whitelist"), + WHITELIST_ENABLED_MESSAGE("misc.whitelist_enabled"), + WHITELIST_DISABLED_MESSAGE("misc.whitelist_disabled"), /** This user isn't registered! */ UNKNOWN_USER("error.unregistered_user"), diff --git a/src/main/java/fr/xephi/authme/permission/AdminPermission.java b/src/main/java/fr/xephi/authme/permission/AdminPermission.java index 20e27f2f..ce9ab1d2 100644 --- a/src/main/java/fr/xephi/authme/permission/AdminPermission.java +++ b/src/main/java/fr/xephi/authme/permission/AdminPermission.java @@ -124,6 +124,7 @@ public enum AdminPermission implements PermissionNode { * Permission to see Antibot messages. */ ANTIBOT_MESSAGES("authme.admin.antibotmessages"), + WHITELIST_MESSAGE("authme.admin.whitelistmessage"), /** * Permission to use the update messages command. diff --git a/src/main/java/fr/xephi/authme/permission/PlayerStatePermission.java b/src/main/java/fr/xephi/authme/permission/PlayerStatePermission.java index b9fe17e7..4e48cb79 100644 --- a/src/main/java/fr/xephi/authme/permission/PlayerStatePermission.java +++ b/src/main/java/fr/xephi/authme/permission/PlayerStatePermission.java @@ -10,6 +10,7 @@ public enum PlayerStatePermission implements PermissionNode { * Permission node to bypass AntiBot protection. */ BYPASS_ANTIBOT("authme.bypassantibot", DefaultPermission.OP_ONLY), + WHITELIST("authme.whitelist", DefaultPermission.OP_ONLY), /** * Permission node to bypass BungeeCord server teleportation. diff --git a/src/main/java/fr/xephi/authme/service/WhiteListService.java b/src/main/java/fr/xephi/authme/service/WhiteListService.java new file mode 100644 index 00000000..73728e80 --- /dev/null +++ b/src/main/java/fr/xephi/authme/service/WhiteListService.java @@ -0,0 +1,82 @@ +package fr.xephi.authme.service; + +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.message.MessageKey; +import fr.xephi.authme.message.Messages; +import fr.xephi.authme.permission.AdminPermission; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.ProtectionSettings; +import org.bukkit.scheduler.BukkitTask; + +import javax.inject.Inject; +import java.util.Locale; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * The AntiBot Service Management class. + */ +public class WhiteListService implements SettingsDependent { + + private final PermissionsManager permissionsManager; + private final Messages messages; + private final BukkitService bukkitService; + private WhiteListStatus whiteListStatus; + + @Inject + WhiteListService(Settings settings, Messages messages, PermissionsManager permissionsManager, + BukkitService bukkitService) { + // Instances + this.messages = messages; + this.permissionsManager = permissionsManager; + this.bukkitService = bukkitService; + // Initial status + whiteListStatus = WhiteListStatus.DISABLED; + // Load settings and start if required + reload(settings); + } + + @Override + public void reload(Settings settings) { + } + + private void startProtection() { + if (whiteListStatus == WhiteListStatus.ACTIVE) { + return; + } + whiteListStatus = WhiteListStatus.ACTIVE; + bukkitService.getOnlinePlayers().stream() + .filter(player -> permissionsManager.hasPermission(player, AdminPermission.WHITELIST_MESSAGE)) + .forEach(player -> messages.send(player, MessageKey.WHITELIST_ENABLED_MESSAGE)); + + } + + private void stopProtection() { + if (whiteListStatus == WhiteListStatus.DISABLED) { + return; + } + whiteListStatus = WhiteListStatus.DISABLED; + bukkitService.getOnlinePlayers().stream() + .filter(player -> permissionsManager.hasPermission(player, AdminPermission.WHITELIST_MESSAGE)) + .forEach(player -> messages.send(player, MessageKey.WHITELIST_DISABLED_MESSAGE)); + } + public WhiteListStatus getWhiteListStatus() { + return whiteListStatus; + } + + public void overrideWhiteListStatus(boolean started) { + if (started) { + startProtection(); + } else { + stopProtection(); + } + } + public boolean shouldKick() { + return whiteListStatus != WhiteListStatus.DISABLED; + } + + public enum WhiteListStatus { + DISABLED, + ACTIVE + } +} diff --git a/src/main/java/fr/xephi/authme/settings/properties/ProtectionSettings.java b/src/main/java/fr/xephi/authme/settings/properties/ProtectionSettings.java index 84c6fabf..f52f0bcf 100644 --- a/src/main/java/fr/xephi/authme/settings/properties/ProtectionSettings.java +++ b/src/main/java/fr/xephi/authme/settings/properties/ProtectionSettings.java @@ -19,7 +19,9 @@ public final class ProtectionSettings implements SettingsHolder { @Comment("Apply the protection also to registered usernames") public static final Property ENABLE_PROTECTION_REGISTERED = newProperty("Protection.enableProtectionRegistered", true); - + @Comment("Only allow registed usernames join server") + public static final Property ENABLE_WHITELIST = + newProperty("Protection.enableWhiteList", true); @Comment({ "Countries allowed to join the server and register. For country codes, see", "https://dev.maxmind.com/geoip/legacy/codes/iso3166/", diff --git a/src/main/resources/messages/messages_zhcn.yml b/src/main/resources/messages/messages_zhcn.yml index 710f9825..5894ba84 100644 --- a/src/main/resources/messages/messages_zhcn.yml +++ b/src/main/resources/messages/messages_zhcn.yml @@ -65,6 +65,8 @@ misc: usage_change_password: '&a正确用法:“/changepassword 旧密码 新密码”' accounts_owned_self: '您拥有 %count 个账户:' accounts_owned_other: '玩家 %name 拥有 %count 个账户:' + whitelist_enabled: '&c*** 服务器已暂停注册 ***' + whitelist_disabled: '&a*** 服务器已开放注册 ***' # Session messages session: @@ -87,7 +89,10 @@ on_join_validation: &c如果您并不知情,请更换您的用户名重新加入该服务器. invalid_name_case: '&c您应该使用 %valid 登录服务器,当前名字: %invalid .' quick_command: '&c您发送命令的速度太快了,请重新加入服务器等待一会后再使用命令' - + kick_whitelist: |- + &6[&b&lAccount Security System&6] + &c本服务器已经暂停注册,请用下面的联系方式了解详细情况. + &cQQ群聊号码: 550984860 &b| &c QQ: 2125368097 &b| &cTelegram: @Stabrinai # Email email: add_email_request: '' From 110fc7266db33f4dc2db0f3baa6f53f3d8dd1da6 Mon Sep 17 00:00:00 2001 From: Sattera Date: Sat, 24 Jun 2023 18:47:26 +0800 Subject: [PATCH 2/2] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20=E5=90=91=20authme.a?= =?UTF-8?q?dmin.whitelistmessage=20=E6=9D=83=E9=99=90=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B2=A1=E6=9C=89=E6=B3=A8=E5=86=8C=E8=B5=84?= =?UTF-8?q?=E6=A0=BC=E7=9A=84=E7=8E=A9=E5=AE=B6=E5=B0=9D=E8=AF=95=E5=85=A5?= =?UTF-8?q?=E6=9C=8D=E7=9A=84=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java | 5 +++++ src/main/java/fr/xephi/authme/message/MessageKey.java | 1 + src/main/resources/messages/messages_zhcn.yml | 1 + src/main/resources/plugin.yml | 3 +++ 4 files changed, 10 insertions(+) diff --git a/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java b/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java index 8e72de1c..6258f9c4 100644 --- a/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java +++ b/src/main/java/fr/xephi/authme/listener/OnJoinVerifier.java @@ -7,6 +7,7 @@ import fr.xephi.authme.initialization.Reloadable; import fr.xephi.authme.message.MessageKey; import fr.xephi.authme.message.Messages; import fr.xephi.authme.output.ConsoleLoggerFactory; +import fr.xephi.authme.permission.AdminPermission; import fr.xephi.authme.permission.PermissionsManager; import fr.xephi.authme.permission.PlayerStatePermission; import fr.xephi.authme.service.AntiBotService; @@ -87,6 +88,10 @@ public class OnJoinVerifier implements Reloadable { public void checkWhitelist(String name, boolean isAuthAvailable) throws FailedVerificationException { if (isAuthAvailable || permissionsManager.hasPermissionOffline(name, PlayerStatePermission.WHITELIST)) { return; + } else { + bukkitService.getOnlinePlayers().stream() + .filter(player -> permissionsManager.hasPermission(player, AdminPermission.WHITELIST_MESSAGE)) + .forEach(player -> messages.send(player, MessageKey.WHITELIST_KICK, name)); } if (whiteListService.shouldKick()) { throw new FailedVerificationException(MessageKey.KICK_WHITELIST); diff --git a/src/main/java/fr/xephi/authme/message/MessageKey.java b/src/main/java/fr/xephi/authme/message/MessageKey.java index 29e6c575..21344157 100644 --- a/src/main/java/fr/xephi/authme/message/MessageKey.java +++ b/src/main/java/fr/xephi/authme/message/MessageKey.java @@ -199,6 +199,7 @@ public enum MessageKey { /** [AntiBotService] AntiBot disabled after %m minutes! */ ANTIBOT_AUTO_DISABLED_MESSAGE("antibot.auto_disabled", "%m"), + WHITELIST_KICK("misc.whitelist_kick", "%p"), /** The email address is already being used */ EMAIL_ALREADY_USED_ERROR("email.already_used"), diff --git a/src/main/resources/messages/messages_zhcn.yml b/src/main/resources/messages/messages_zhcn.yml index 5894ba84..ee3bc03c 100644 --- a/src/main/resources/messages/messages_zhcn.yml +++ b/src/main/resources/messages/messages_zhcn.yml @@ -67,6 +67,7 @@ misc: accounts_owned_other: '玩家 %name 拥有 %count 个账户:' whitelist_enabled: '&c*** 服务器已暂停注册 ***' whitelist_disabled: '&a*** 服务器已开放注册 ***' + whitelist_kick: '&7玩家 &c%p &7请求加入服务器,但是被拒绝了.' # Session messages session: diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 1e7fdeed..55e8fa3e 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -184,6 +184,9 @@ permissions: authme.bypassantibot: description: Permission node to bypass AntiBot protection. default: op + authme.whitelist: + description: Permission node to whitelist. + default: op authme.bypasscountrycheck: description: Permission to bypass the GeoIp country code check. default: false