From c0e1b8082f0c00257e60ff83708fc209e417b4b1 Mon Sep 17 00:00:00 2001 From: HexelDev Date: Sun, 4 Mar 2018 17:32:16 +0100 Subject: [PATCH] #642 - Quick Command Protection manager --- .../data/QuickCommandsProtectionManager.java | 51 +++++++++++++++++++ .../authme/permission/PlayerPermission.java | 7 ++- .../properties/ProtectionSettings.java | 4 ++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/main/java/fr/xephi/authme/data/QuickCommandsProtectionManager.java diff --git a/src/main/java/fr/xephi/authme/data/QuickCommandsProtectionManager.java b/src/main/java/fr/xephi/authme/data/QuickCommandsProtectionManager.java new file mode 100644 index 00000000..38a007f3 --- /dev/null +++ b/src/main/java/fr/xephi/authme/data/QuickCommandsProtectionManager.java @@ -0,0 +1,51 @@ +package fr.xephi.authme.data; + +import fr.xephi.authme.initialization.HasCleanup; +import fr.xephi.authme.initialization.SettingsDependent; +import fr.xephi.authme.permission.PermissionsManager; +import fr.xephi.authme.permission.PlayerPermission; +import fr.xephi.authme.settings.Settings; +import fr.xephi.authme.settings.properties.ProtectionSettings; +import fr.xephi.authme.util.expiring.ExpiringSet; +import org.bukkit.entity.Player; + +import javax.inject.Inject; +import java.util.concurrent.TimeUnit; + +public class QuickCommandsProtectionManager implements SettingsDependent, HasCleanup { + + private PermissionsManager permissionsManager; + + private final ExpiringSet latestLogin; + + @Inject + public QuickCommandsProtectionManager(Settings settings, PermissionsManager permissionsManager) { + this.permissionsManager = permissionsManager; + long countTimeout = settings.getProperty(ProtectionSettings.QUICK_COMMANDS_DENIED_BEFORE_MILLISECONDS); + latestLogin = new ExpiringSet<>(countTimeout, TimeUnit.MILLISECONDS); + reload(settings); + } + + public void setLogin(String name) { + latestLogin.add(name); + } + + public boolean shouldSaveLogin(Player player) { + return permissionsManager.hasPermission(player, PlayerPermission.QUICK_COMMANDS_PROTECTION); + } + + public boolean isAllowed(String name) { + return !latestLogin.contains(name); + } + + @Override + public void reload(Settings settings) { + long countTimeout = settings.getProperty(ProtectionSettings.QUICK_COMMANDS_DENIED_BEFORE_MILLISECONDS); + latestLogin.setExpiration(countTimeout, TimeUnit.MILLISECONDS); + } + + @Override + public void performCleanup() { + latestLogin.removeExpiredEntries(); + } +} diff --git a/src/main/java/fr/xephi/authme/permission/PlayerPermission.java b/src/main/java/fr/xephi/authme/permission/PlayerPermission.java index 1a89490f..71ee84b4 100644 --- a/src/main/java/fr/xephi/authme/permission/PlayerPermission.java +++ b/src/main/java/fr/xephi/authme/permission/PlayerPermission.java @@ -68,7 +68,12 @@ public enum PlayerPermission implements PermissionNode { /** * Permission to use the email verification codes feature. */ - VERIFICATION_CODE("authme.player.security.verificationcode"); + VERIFICATION_CODE("authme.player.security.verificationcode"), + + /** + * Permission to use the email verification codes feature. + */ + QUICK_COMMANDS_PROTECTION("authme.player.protection.quickcommandsprotection"); /** * The permission node. 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 f0a6c2f7..bb665c0f 100644 --- a/src/main/java/fr/xephi/authme/settings/properties/ProtectionSettings.java +++ b/src/main/java/fr/xephi/authme/settings/properties/ProtectionSettings.java @@ -55,6 +55,10 @@ public final class ProtectionSettings implements SettingsHolder { public static final Property ANTIBOT_DELAY = newProperty("Protection.antiBotDelay", 60); + @Comment("Kicks the player that issued a command before the defined time after the login process") + public static final Property QUICK_COMMANDS_DENIED_BEFORE_MILLISECONDS = + newProperty("Protection.quickCommands.denyCommandsBeforeSeconds", 1000); + private ProtectionSettings() { }