Compare commits

..
8 Commits
44 changed files with 579 additions and 204 deletions

No files matched your search

+1 -1
View File
@@ -6,7 +6,7 @@
<groupId>de.rayzs.pat</groupId>
<artifactId>ProAntiTab</artifactId>
<version>2.4.2</version>
<version>2.4.3</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
@@ -22,7 +22,7 @@ public class PATEventHandler {
return event;
}
public static FilteredSuggestionEvent callFilteredSuggestionEvents(CommandSender player, List<String> suggestions) {
public static FilteredSuggestionEvent callFilteredSuggestionEvents(CommandSender player, HashSet<String> suggestions) {
FilteredSuggestionEvent event = EmptyEvent.createEmptyFilteredSuggestionEvent(player, suggestions);
for (PATEvent patEvent : EVENTS) {
@@ -70,7 +70,7 @@ public class PATEventHandler {
return event;
}
public static UpdatePlayerCommandsEvent callUpdatePlayerCommandsEvents(CommandSender player, List<String> commands, boolean serverBased) {
public static UpdatePlayerCommandsEvent callUpdatePlayerCommandsEvents(CommandSender player, HashSet<String> commands, boolean serverBased) {
UpdatePlayerCommandsEvent event = EmptyEvent.createEmptyUpdatePlayerCommandsEvent(player, commands, serverBased);
for (PATEvent patEvent : EVENTS) {
@@ -143,7 +143,7 @@ public class PATEventHandler {
};
}
public static UpdatePlayerCommandsEvent createEmptyUpdatePlayerCommandsEvent(CommandSender player, List<String> commands, boolean serverBased) {
public static UpdatePlayerCommandsEvent createEmptyUpdatePlayerCommandsEvent(CommandSender player, HashSet<String> commands, boolean serverBased) {
return new UpdatePlayerCommandsEvent(player, commands, serverBased) {
@Override
public void handle(UpdatePlayerCommandsEvent event) {
@@ -170,7 +170,7 @@ public class PATEventHandler {
};
}
public static FilteredSuggestionEvent createEmptyFilteredSuggestionEvent(CommandSender player, List<String> suggestions) {
public static FilteredSuggestionEvent createEmptyFilteredSuggestionEvent(CommandSender player, HashSet<String> suggestions) {
return new FilteredSuggestionEvent(player, suggestions) {
@Override
public void handle(FilteredSuggestionEvent event) {
@@ -7,24 +7,24 @@ import java.util.*;
public abstract class FilteredSuggestionEvent extends PATEvent<FilteredSuggestionEvent> {
private List<String> suggestions;
private HashSet<String> suggestions;
public FilteredSuggestionEvent() {
super(null);
this.suggestions = null;
}
public FilteredSuggestionEvent(CommandSender player, List<String> suggestions) {
public FilteredSuggestionEvent(CommandSender player, HashSet<String> suggestions) {
super(player);
this.suggestions = suggestions;
}
public List<String> getSuggestions() {
public HashSet<String> getSuggestions() {
return suggestions;
}
public void setSuggestions(List<String> suggestions) {
public void setSuggestions(HashSet<String> suggestions) {
this.suggestions = suggestions;
}
}
@@ -3,25 +3,25 @@ package de.rayzs.pat.api.event.events;
import de.rayzs.pat.api.event.PATEvent;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.List;
import java.util.HashSet;
public abstract class UpdatePlayerCommandsEvent extends PATEvent<UpdatePlayerCommandsEvent> {
private List<String> commands;
private HashSet<String> commands;
private boolean serverBased;
public UpdatePlayerCommandsEvent() {
super(null);;
}
public UpdatePlayerCommandsEvent(CommandSender player, List<String> commands, boolean serverBased) {
public UpdatePlayerCommandsEvent(CommandSender player, HashSet<String> commands, boolean serverBased) {
super(player);
this.commands = commands;
this.serverBased = serverBased;
}
public List<String> getCommands() {
public HashSet<String> getCommands() {
return commands;
}
@@ -213,13 +213,13 @@ public class Storage {
associatedServers.forEach(serverName -> {
final List<UUID> playerIds = Storage.getLoader().getPlayerIdsByServer(serverName);
final List<String> commands = Blacklist.Collector.collectAllServerCommands(serverName);
final HashSet<String> commands = Blacklist.Collector.collectAllServerCommands(serverName);
playerIds.forEach(playerId -> {
final CommandSender sender = CommandSender.from(playerId);
final List<String> playerCommands = new ArrayList<>(commands);
final List<String> groupCommands = Blacklist.Collector.collectAllPlayerGroupCommands(sender, serverName);
final HashSet<String> playerCommands = new HashSet<>(commands);
final HashSet<String> groupCommands = Blacklist.Collector.collectAllPlayerGroupCommands(sender, serverName);
playerCommands.addAll(groupCommands);
@@ -236,9 +236,9 @@ public class Storage {
playerIds.forEach(playerId -> {
final CommandSender sender = CommandSender.from(playerId);
final List<String> serverCommands = Blacklist.Collector.collectAllServerCommands(sender.getServerName());
final List<String> playerCommands = new ArrayList<>(serverCommands);
final List<String> groupCommands = Blacklist.Collector.collectAllPlayerGroupCommands(sender, sender.getServerName());
final HashSet<String> serverCommands = Blacklist.Collector.collectAllServerCommands(sender.getServerName());
final HashSet<String> playerCommands = new HashSet<>(serverCommands);
final HashSet<String> groupCommands = Blacklist.Collector.collectAllPlayerGroupCommands(sender, sender.getServerName());
playerCommands.addAll(groupCommands);
@@ -304,13 +304,12 @@ public class Storage {
return false;
}
public static boolean isServer(String originServer, String targetServer) {
originServer = originServer.toLowerCase();
targetServer = targetServer.toLowerCase();
public static boolean isServer(final String originServer, final String targetServer) {
if (originServer.endsWith("*")) {
originServer = originServer.substring(0, originServer.length() - 2);
return targetServer.startsWith(originServer);
return StringUtils.startsWithIgnoreCase(
originServer.substring(0, originServer.length() - 2),
targetServer
);
}
return originServer.equalsIgnoreCase(targetServer);
@@ -450,8 +449,8 @@ public class Storage {
* @param serverName Target server name.
* @return List of collected commands.
*/
public static List<String> collectAllServerCommands(String serverName) {
List<String> commands = new ArrayList<>(Blacklist.getBlacklist().getCommands());
public static HashSet<String> collectAllServerCommands(String serverName) {
HashSet<String> commands = new HashSet<>(Blacklist.getBlacklist().getCommands());
if (!Reflection.isProxyServer())
return commands;
@@ -473,9 +472,9 @@ public class Storage {
* @param serverName Target server name.
* @return List of collected commands.
*/
public static List<String> collectAllPlayerGroupCommands(CommandSender sender, String serverName) {
final List<String> commands = new ArrayList<>();
final List<Group> groups = GroupManager.getPlayerGroups(sender);
public static HashSet<String> collectAllPlayerGroupCommands(CommandSender sender, String serverName) {
final HashSet<String> commands = new HashSet<>();
final List<Group> groups = GroupManager.getPlayerGroups(sender, sender.isOperator());
if (serverName == null) {
groups.forEach(group -> commands.addAll(group.getCommands()));
@@ -608,28 +607,63 @@ public class Storage {
return IGNORED_SERVERS.isListed(server);
}
public static boolean canPlayerAccess(CommandSender sender, List<Group> groups, String command, BlockType type) {
return canPlayerAccess(sender, groups, command, type, null);
public static boolean canPlayerAccess(
final CommandSender sender,
final List<Group> groups,
final String command,
final BlockType type,
final boolean isOperator
) {
return canPlayerAccess(sender, groups, command, type, null, isOperator);
}
public static boolean canPlayerAccessChat(CommandSender sender, List<Group> groups, String command) {
return canPlayerAccess(sender, groups, command, BlockType.CHAT, null);
public static boolean canPlayerAccessChat(
final CommandSender sender,
final List<Group> groups,
final String command,
final boolean isOperator
) {
return canPlayerAccess(sender, groups, command, BlockType.CHAT, null, isOperator);
}
public static boolean canPlayerAccessChat(CommandSender sender, List<Group> groups, String command, String server) {
return canPlayerAccess(sender, groups, command, BlockType.CHAT, server);
public static boolean canPlayerAccessChat(
final CommandSender sender,
final List<Group> groups,
final String command,
final String server,
final boolean isOperator
) {
return canPlayerAccess(sender, groups, command, BlockType.CHAT, server, isOperator);
}
public static boolean canPlayerAccessTab(CommandSender sender, List<Group> groups, String command) {
return canPlayerAccess(sender, groups, command, BlockType.TAB, null);
public static boolean canPlayerAccessTab(
final CommandSender sender,
final List<Group> groups,
final String command,
final boolean isOperator
) {
return canPlayerAccess(sender, groups, command, BlockType.TAB, null, isOperator);
}
public static boolean canPlayerAccessTab(CommandSender sender, List<Group> groups, String command, String server) {
return canPlayerAccess(sender, groups, command, BlockType.TAB, server);
public static boolean canPlayerAccessTab(
final CommandSender sender,
final List<Group> groups,
final String command,
final String server,
final boolean isOperator
) {
return canPlayerAccess(sender, groups, command, BlockType.TAB, server, isOperator);
}
public static boolean canPlayerAccess(CommandSender sender, List<Group> groups, String command, BlockType type, String server) {
public static boolean canPlayerAccess(
final CommandSender sender,
final List<Group> groups,
final String command,
final BlockType type,
final String server,
final boolean isOperator
) {
final boolean allowGroupOverruling = ConfigSections.Settings.ALLOW_GROUP_OVERRULING.ENABLED;
final boolean blocked = isBlocked(command, type, server);
@@ -644,7 +678,7 @@ public class Storage {
}
if (Storage.getPermissionPlugin() != PermissionPlugin.NONE) {
if (PermissionUtil.hasBypassPermission(sender, command)) {
if (PermissionUtil.hasBypassPermission(sender, command, isOperator)) {
return true;
}
}
@@ -658,7 +692,7 @@ public class Storage {
}
if (Storage.getPermissionPlugin() != PermissionPlugin.NONE) {
if (PermissionUtil.hasBypassPermission(sender, command)) {
if (PermissionUtil.hasBypassPermission(sender, command, isOperator)) {
return true;
}
}
@@ -30,10 +30,10 @@ public class BlockNamespaceCommandsSection extends ConfigStorage {
return false;
}
return StringUtils.getFirstArg(command).contains(":");
return StringUtils.getFirstArg(command).indexOf(':') != -1;
}
public boolean doesBypass(CommandSender sender) {
return !ENABLED || PermissionUtil.hasPermission(sender, "namespace");
public boolean doesBypass(final CommandSender sender, final boolean isOperator) {
return !ENABLED || PermissionUtil.hasPermission(sender, "namespace", isOperator);
}
}
@@ -38,6 +38,7 @@ public class CustomPluginsSection extends ConfigStorage {
if (currentCommand.equalsIgnoreCase(command))
return true;
}
return false;
}
}
@@ -9,7 +9,7 @@ import java.util.*;
public class BlacklistStorage extends StorageTemplate implements Serializable {
private List<String> commands = new ArrayList<>();
private Set<String> hiddenCommands = new HashSet<>();
private HashSet<String> hiddenCommands = new HashSet<>();
public BlacklistStorage(String navigatePath) {
super(Storage.Files.STORAGE, navigatePath);
@@ -80,7 +80,7 @@ public class BlacklistStorage extends StorageTemplate implements Serializable {
commands = (ArrayList<String>) getConfig().getOrSet(getNavigatePath(), commands);
final List<String> tmpCommands = commands != null ? new ArrayList<>(commands) : new ArrayList<>();
final Set<String> pluginListCommands = new HashSet<>(), negatedPluginListCommands = new HashSet<>();
final HashSet<String> pluginListCommands = new HashSet<>(), negatedPluginListCommands = new HashSet<>();
final String pluginCommandPrefix = "plugin=";
final String negatedPluginCommandPrefix = Storage.Blacklist.BlockType.NEGATE + pluginCommandPrefix;
@@ -124,6 +124,8 @@ public class BukkitLoader extends JavaPlugin implements PluginLoader {
startUpdaterTask();
if (getServer().getPluginManager().getPlugin("LuckPerms") != null) {
manager.registerEvents(new BukkitLuckPermsWarning(), this);
LuckPermsHook.initialize();
Bukkit.getOnlinePlayers().forEach(player -> PermissionUtil.setPlayerPermissions(player.getUniqueId()));
} else {
@@ -85,8 +85,10 @@ public class BungeeLoader extends Plugin implements PluginLoader {
startUpdaterTask();
if (manager.getPlugin("LuckPerms") != null)
if (manager.getPlugin("LuckPerms") != null) {
manager.registerListener(this, new BungeeLuckPermsWarning());
LuckPermsHook.initialize();
}
if(manager.getPlugin("PAPIProxyBridge") != null) {
Storage.USE_PAPIPROXYBRIDGE = true;
@@ -42,7 +42,7 @@ import java.util.*;
@Plugin(name = "ProAntiTab",
id = "proantitab",
version = "2.4.2",
version = "2.4.3",
authors = "Rayzs_YT",
description = "Hides more than just your plugins.",
url = "https://www.rayzs.de/products/proantitab/page",
@@ -104,8 +104,10 @@ public class VelocityLoader implements PluginLoader {
startUpdaterTask();
if (server.getPluginManager().getPlugin("luckperms").isPresent())
if (server.getPluginManager().getPlugin("luckperms").isPresent()) {
server.getEventManager().register(this, new VelocityLuckPermsWarning(server));
LuckPermsHook.initialize();
}
if (server.getPluginManager().getPlugin("papiproxybridge").isPresent()) {
Storage.USE_PAPIPROXYBRIDGE = true;
@@ -66,9 +66,10 @@ public class CommandProcess {
}
public static void handleCommand(Object senderObj, String[] args, String label) {
CommandSender sender = CommandSender.from(senderObj);
final CommandSender sender = CommandSender.from(senderObj);
final boolean isOperator = sender.isOperator();
if (!PermissionUtil.hasPermissionWithResponse(sender, "use"))
if (!PermissionUtil.hasPermissionWithResponse(sender, "use", isOperator))
return;
if (args.length == 0) {
@@ -109,7 +110,7 @@ public class CommandProcess {
}
ProCommand command = optCommand.get();
if (!PermissionUtil.hasPermissionWithResponse(sender, command.getName()))
if (!PermissionUtil.hasPermissionWithResponse(sender, command.getName(), isOperator))
return;
if (!command.execute(sender, commandArgs)) {
@@ -137,7 +138,7 @@ public class CommandProcess {
}
ProCommand command = optCommand.get();
if (!PermissionUtil.hasPermissionWithResponse(sender, command.getName()))
if (!PermissionUtil.hasPermissionWithResponse(sender, command.getName(), isOperator))
return;
if (!command.execute(sender, commandArgs)) {
@@ -147,10 +148,11 @@ public class CommandProcess {
}
public static List<String> handleTabComplete(Object senderObj, String[] args) {
CommandSender sender = CommandSender.from(senderObj);
List<String> result = new ArrayList<>();
final CommandSender sender = CommandSender.from(senderObj);
final boolean isOperator = sender.isOperator();
final List<String> result = new ArrayList<>();
if (!PermissionUtil.hasPermission(sender, "use"))
if (!PermissionUtil.hasPermission(sender, "use", isOperator))
return result;
if (args.length <= 1) {
@@ -164,7 +166,7 @@ public class CommandProcess {
if (!Reflection.isProxyServer() && cmd.isProxyOnly())
return false;
return PermissionUtil.hasPermission(sender, cmd.getName());
return PermissionUtil.hasPermission(sender, cmd.getName(), isOperator);
})
.forEach(cmd -> {
result.add(cmd.getName());
@@ -185,7 +187,7 @@ public class CommandProcess {
.filter(cmd -> {
if (Reflection.isProxyServer() && cmd.isServerCommand())
return PermissionUtil.hasPermission(sender, cmd.getName());
return PermissionUtil.hasPermission(sender, cmd.getName(), isOperator);
return false;
})
@@ -206,7 +208,7 @@ public class CommandProcess {
optCommand = COMMANDS.stream().filter(cmd -> {
if (Reflection.isProxyServer() && cmd.isServerCommand()) {
return cmd.isCommand(servCommandName) && PermissionUtil.hasPermission(sender, cmd.getName());
return cmd.isCommand(servCommandName) && PermissionUtil.hasPermission(sender, cmd.getName(), isOperator);
}
return false;
@@ -231,7 +233,7 @@ public class CommandProcess {
if (optCommand.isPresent()) {
ProCommand command = optCommand.get();
if (PermissionUtil.hasPermission(sender, command.getName())) {
if (PermissionUtil.hasPermission(sender, command.getName(), isOperator)) {
List<String> cmdCompletions = command.tabComplete(sender, commandArgs);
result.addAll(cmdCompletions != null ? cmdCompletions : List.of());
}
@@ -27,6 +27,7 @@ public class BukkitAntiTabListener implements Listener {
final Player player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
final UUID uuid = player.getUniqueId();
final boolean isOperator = player.isOp();
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
@@ -50,12 +51,12 @@ public class BukkitAntiTabListener implements Listener {
: BukkitLoader.getAllCommands()
);
if (!player.isOp() && knownOperators.contains(uuid)) {
if (!isOperator && knownOperators.contains(uuid)) {
knownOperators.remove(uuid);
PermissionUtil.reloadPermissions(sender);
}
if (PermissionUtil.hasBypassPermission(sender)) {
if (PermissionUtil.hasBypassPermission(sender, isOperator)) {
return;
}
@@ -66,17 +67,16 @@ public class BukkitAntiTabListener implements Listener {
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<String> playerCommands = Storage.getLoader().getBukkitCommandsCacheMap().getPlayerCommands(new ArrayList<>(event.getCommands()), sender, groups);
final List<Group> groups = GroupManager.getPlayerGroups(sender, isOperator);
final HashSet<String> playerCommands = Storage.getLoader().getBukkitCommandsCacheMap().getPlayerCommands(new ArrayList<>(event.getCommands()), sender, groups, isOperator);
final FilteredSuggestionEvent filteredSuggestionEvent = PATEventHandler.callFilteredSuggestionEvents(sender, playerCommands);
event.getCommands().clear();
if (filteredSuggestionEvent.isCancelled()) {
event.getCommands().clear();
return;
}
event.getCommands().addAll(filteredSuggestionEvent.getSuggestions());
event.getCommands().removeIf(command -> !filteredSuggestionEvent.getSuggestions().contains(command));
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.ALWAYS_TAB_COMPLETABLE) {
event.getCommands().addAll(Storage.ConfigSections.Settings.CUSTOM_PLUGIN.COMMANDS.getLines());
@@ -30,13 +30,14 @@ public class BukkitBlockCommandListener implements Listener {
final Player player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
final World world = player.getWorld();
final boolean isOperator = player.isOp();
String rawCommand = StringUtils.getFirstArg(event.getMessage()),
command = rawCommand.substring(1);
if (!Storage.ConfigSections.Settings.CUSTOM_UNKNOWN_COMMAND.ENABLED || event.isCancelled()) return;
if (PermissionUtil.hasBypassPermission(sender))
if (PermissionUtil.hasBypassPermission(sender, isOperator))
return;
/* Removed since not necessary and only takes up unnecessary performance.
@@ -56,6 +57,7 @@ public class BukkitBlockCommandListener implements Listener {
public void onPlayerCommandProcess(PlayerCommandPreprocessEvent event) {
final Player player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
final boolean isOperator = player.isOp();
final String commandFirstArg = StringUtils.getFirstArg(event.getMessage());
@@ -88,7 +90,7 @@ public class BukkitBlockCommandListener implements Listener {
return;
}
if (PermissionUtil.hasBypassPermission(sender, command)) {
if (PermissionUtil.hasBypassPermission(sender, command, isOperator)) {
return;
}
@@ -145,12 +147,12 @@ public class BukkitBlockCommandListener implements Listener {
}
final boolean cancelBlockedCommand = Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED;
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, isOperator);
boolean allowed = Storage.Blacklist.canPlayerAccessChat(sender, groups, command);
boolean allowed = Storage.Blacklist.canPlayerAccessChat(sender, groups, command, isOperator);
boolean blockedNamespace = false;
if (!Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender)) {
if (!Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender, isOperator)) {
blockedNamespace = cancelBlockedCommand
? Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(command)
: Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesAlwaysBlock(command);
@@ -0,0 +1,51 @@
package de.rayzs.pat.plugin.listeners.bukkit;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.LuckPermsWarning;
import de.rayzs.pat.utils.scheduler.PATScheduler;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.server.ServerCommandEvent;
public class BukkitLuckPermsWarning implements Listener {
@EventHandler
public void onConsoleCommandExecution(final ServerCommandEvent event) {
if (LuckPermsWarning.alreadyAnnounced()) return;
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_WORLD.ENABLED || Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
return;
}
final CommandSender sender = CommandSender.from(event.getSender());
final String command = event.getCommand();
if (LuckPermsWarning.shouldSendLuckPermsWarning(sender, command)) {
PATScheduler.createScheduler(() -> {
LuckPermsWarning.sendAnnouncement(sender);
}, 20);
}
}
@EventHandler
public void onPlayerCommandExecution(final PlayerCommandPreprocessEvent event) {
if (LuckPermsWarning.alreadyAnnounced()) return;
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_WORLD.ENABLED || Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
return;
}
final CommandSender sender = CommandSender.from(event.getPlayer());
final String command = event.getMessage();
if (LuckPermsWarning.shouldSendLuckPermsWarning(sender, command.substring(1))) {
PATScheduler.createScheduler(() -> {
LuckPermsWarning.sendAnnouncement(sender);
}, 20);
}
}
}
@@ -25,6 +25,7 @@ public class BukkitPlayerListener implements Listener {
public void onPlayerJoin(PlayerJoinEvent event) {
final Player player = event.getPlayer();
final CommandSender sender = CommandSender.from(player);
final boolean isOperator = player.isOp();
PATEventHandler.callServerPlayersChangeEvents(sender, ServerPlayersChangeEvent.Type.JOINED);
SubArgument.get().updateCachedPlayerNames();
@@ -74,7 +75,7 @@ public class BukkitPlayerListener implements Listener {
}, 10);
}
if (Storage.OUTDATED && PermissionUtil.hasPermission(sender, "joinupdate")) {
if (Storage.OUTDATED && PermissionUtil.hasPermission(sender, "joinupdate", isOperator)) {
PATScheduler.createScheduler(() -> {
if (player.isOnline()) {
MessageTranslator.send(player, Storage.ConfigSections.Settings.UPDATE.OUTDATED.getLines());
@@ -50,13 +50,13 @@ public class BungeeAntiTabListener implements Listener {
if (Storage.Blacklist.isDisabledServer(serverName))
return;
if (PermissionUtil.hasBypassPermission(sender))
if (PermissionUtil.hasBypassPermission(sender, false))
return;
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final boolean doesBypassNamespace = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
final boolean doesBypassNamespace = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender, false);
final boolean spaces = cursor.contains(" ");
boolean cancelsBeforeHand = false;
@@ -66,7 +66,7 @@ public class BungeeAntiTabListener implements Listener {
}
if (!cancelsBeforeHand && !cursor.isEmpty()) {
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, StringUtils.getFirstArg(cursor), serverName);
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, StringUtils.getFirstArg(cursor), serverName, false);
}
if (!cancelsBeforeHand) {
@@ -100,7 +100,7 @@ public class BungeeAntiTabListener implements Listener {
return false;
}
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, cpy, serverName);
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, cpy, serverName, false);
});
}
@@ -36,7 +36,7 @@ public class BungeeBlockCommandListener implements Listener {
String command = event.getMessage();
if (PermissionUtil.hasBypassPermission(sender, command) || Storage.Blacklist.isDisabledServer(serverName))
if (PermissionUtil.hasBypassPermission(sender, command, false) || Storage.Blacklist.isDisabledServer(serverName))
return;
command = command.startsWith("/") ? command.substring(1) : command;
@@ -104,13 +104,13 @@ public class BungeeBlockCommandListener implements Listener {
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
final boolean cancelBlockedCommand = Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED;
boolean allowed = Storage.Blacklist.canPlayerAccessChat(sender, groups, command, serverName);
boolean allowed = Storage.Blacklist.canPlayerAccessChat(sender, groups, command, serverName, false);
boolean blockedNamespace = false;
if (!Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender)) {
if (!Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender, false)) {
blockedNamespace = cancelBlockedCommand
? Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(command)
: Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesAlwaysBlock(command);
@@ -0,0 +1,40 @@
package de.rayzs.pat.plugin.listeners.bungee;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.BukkitLoader;
import de.rayzs.pat.plugin.BungeeLoader;
import de.rayzs.pat.utils.LuckPermsWarning;
import de.rayzs.pat.utils.sender.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.ChatEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import java.util.concurrent.TimeUnit;
public class BungeeLuckPermsWarning implements Listener {
@EventHandler
public void onPlayerCommandExecution(final ChatEvent event) {
if (LuckPermsWarning.alreadyAnnounced()) return;
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_WORLD.ENABLED || Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
return;
}
if (! (event.getSender() instanceof ProxiedPlayer player)) return;
final CommandSender sender = CommandSender.from(player);
final String command = event.getMessage();
if (LuckPermsWarning.shouldSendLuckPermsWarning(sender, command.substring(1))) {
ProxyServer.getInstance().getScheduler().schedule(
BungeeLoader.getPlugin(),
() -> LuckPermsWarning.sendAnnouncement(sender),
1, TimeUnit.SECONDS
);
}
}
}
@@ -36,7 +36,7 @@ public class BungeePlayerConnectionListener implements Listener {
PermissionUtil.setPlayerPermissions(sender);
if (Storage.OUTDATED && PermissionUtil.hasPermission(sender, "joinupdate")) {
if (Storage.OUTDATED && PermissionUtil.hasPermission(sender, "joinupdate", false)) {
ProxyServer.getInstance().getScheduler().schedule(BungeeLoader.getPlugin(), () -> {
if (player.isConnected()) {
MessageTranslator.send(player, Storage.ConfigSections.Settings.UPDATE.OUTDATED, "%player%", player.getName());
@@ -1,9 +1,6 @@
package de.rayzs.pat.plugin.listeners.bungee;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.FilteredSuggestionEvent;
@@ -32,11 +29,11 @@ public class WaterfallAntiTabListener implements Listener {
final CommandSender sender = CommandSender.from(player);
final String serverName = player.getServer().getInfo().getName();
if (Storage.Blacklist.isDisabledServer(serverName) || PermissionUtil.hasBypassPermission(sender)) {
if (Storage.Blacklist.isDisabledServer(serverName) || PermissionUtil.hasBypassPermission(sender, false)) {
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
final Map<String, CommandsCache> cache = Storage.getLoader().getPerServerCommandsCacheMap();
if (!cache.containsKey(serverName)) {
@@ -50,7 +47,7 @@ public class WaterfallAntiTabListener implements Listener {
event.getCommands().forEach((key, value) -> commandsAsString.add(key));
commandsCache.handleCommands(commandsAsString, serverName);
List<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName);
HashSet<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName, false);
event.getCommands().entrySet().removeIf(command -> {
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(command.getKey()) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(command.getKey())) {
@@ -60,7 +57,7 @@ public class WaterfallAntiTabListener implements Listener {
return playerCommands.contains(command.getKey());
});
FilteredSuggestionEvent filteredSuggestionEvent = PATEventHandler.callFilteredSuggestionEvents(sender, new ArrayList<>(event.getCommands().keySet()));
FilteredSuggestionEvent filteredSuggestionEvent = PATEventHandler.callFilteredSuggestionEvents(sender, new HashSet<>(event.getCommands().keySet()));
if (filteredSuggestionEvent.isCancelled()) event.getCommands().clear();
for (String commandName : filteredSuggestionEvent.getSuggestions()) {
@@ -1,6 +1,7 @@
package de.rayzs.pat.plugin.listeners.velocity;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -23,10 +24,10 @@ import de.rayzs.pat.utils.sender.CommandSender;
public class VelocityAntiTabListener {
private static ProxyServer server;
private final ProxyServer server;
public VelocityAntiTabListener(ProxyServer server) {
VelocityAntiTabListener.server = server;
this.server = server;
}
@Subscribe (order = PostOrder.LAST)
@@ -45,21 +46,21 @@ public class VelocityAntiTabListener {
final CommandSender sender = CommandSender.from(player);
if (PermissionUtil.hasBypassPermission(sender) || event.getSuggestions().isEmpty() || player.getCurrentServer().isEmpty()) {
if (PermissionUtil.hasBypassPermission(sender, false) || event.getSuggestions().isEmpty() || player.getCurrentServer().isEmpty()) {
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
event.getSuggestions().removeIf(command -> {
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(command) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(command)) {
return false;
}
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, serverName);
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, serverName, false);
});
FilteredSuggestionEvent filteredSuggestionEvent = PATEventHandler.callFilteredSuggestionEvents(sender, event.getSuggestions());
FilteredSuggestionEvent filteredSuggestionEvent = PATEventHandler.callFilteredSuggestionEvents(sender, new HashSet<>(event.getSuggestions()));
if(filteredSuggestionEvent.isCancelled()) event.getSuggestions().clear();
}
@@ -74,7 +75,7 @@ public class VelocityAntiTabListener {
final CommandSender sender = CommandSender.from(player);
if (PermissionUtil.hasBypassPermission(sender)) {
if (PermissionUtil.hasBypassPermission(sender, false)) {
return;
}
@@ -91,7 +92,7 @@ public class VelocityAntiTabListener {
}
final CommandsCache commandsCache = cache.get(serverName);
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
final List<String> commandsAsString = new ArrayList<>();
event.getRootNode().getChildren().stream()
@@ -101,7 +102,7 @@ public class VelocityAntiTabListener {
commandsCache.handleCommands(commandsAsString, serverName);
final boolean newer = player.getProtocolVersion().getProtocol() > 340, argsChildrenExist = event.getRootNode().getChild("args") != null;
final List<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName);
final HashSet<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName, false);
if (event.getRootNode().getChildren().size() == 1
&& newer && argsChildrenExist
@@ -3,7 +3,6 @@ package de.rayzs.pat.plugin.listeners.velocity;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.command.CommandExecuteEvent;
import com.velocitypowered.api.command.CommandSource;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.plugin.system.communication.Communicator;
import de.rayzs.pat.api.event.events.ExecuteCommandEvent;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
@@ -57,7 +56,7 @@ public class VelocityBlockCommandListener {
final String command = tmpCommand;
if (PermissionUtil.hasBypassPermission(sender, command) || Storage.Blacklist.isDisabledServer(serverName))
if (PermissionUtil.hasBypassPermission(sender, command, false) || Storage.Blacklist.isDisabledServer(serverName))
return event;
final String displayCommand = StringUtils.replaceTriggers(command, "", "\\", "<", ">", "&");
@@ -119,13 +118,13 @@ public class VelocityBlockCommandListener {
}
final boolean cancelBlockedCommand = Storage.ConfigSections.Settings.CANCEL_COMMAND.ENABLED;
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
boolean allowed = Storage.Blacklist.canPlayerAccessChat(sender, groups, command, serverName);
boolean allowed = Storage.Blacklist.canPlayerAccessChat(sender, groups, command, serverName, false);
boolean blockedNamespace = false;
if (!Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender)) {
if (!Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender, false)) {
blockedNamespace = cancelBlockedCommand
? Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(command)
: Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesAlwaysBlock(command);
@@ -52,7 +52,7 @@ public class VelocityConnectionListener {
PermissionUtil.setPlayerPermissions(sender);
if (Storage.OUTDATED && PermissionUtil.hasPermission(sender, "joinupdate")) {
if (Storage.OUTDATED && PermissionUtil.hasPermission(sender, "joinupdate", false)) {
server.getScheduler().buildTask(loader, () -> {
if (player.isActive())
MessageTranslator.send(player, Storage.ConfigSections.Settings.UPDATE.OUTDATED, "%player%", player.getUsername());
@@ -0,0 +1,45 @@
package de.rayzs.pat.plugin.listeners.velocity;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.command.CommandExecuteEvent;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.VelocityLoader;
import de.rayzs.pat.utils.LuckPermsWarning;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.concurrent.TimeUnit;
public class VelocityLuckPermsWarning {
private final ProxyServer server;
public VelocityLuckPermsWarning(ProxyServer server) {
this.server = server;
}
@Subscribe
public void onCommandExecute(final CommandExecuteEvent event) {
if (LuckPermsWarning.alreadyAnnounced()) return;
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_WORLD.ENABLED || Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
return;
}
final CommandSource commandSource = event.getCommandSource();
if(! (commandSource instanceof Player player)) return;
final CommandSender sender = CommandSender.from(player);
final String command = event.getCommand();
if (LuckPermsWarning.shouldSendLuckPermsWarning(sender, command)) {
server.getScheduler().buildTask(
VelocityLoader.getInstance(),
() -> LuckPermsWarning.sendAnnouncement(sender)
).delay(1, TimeUnit.SECONDS).schedule();
}
}
}
@@ -13,11 +13,11 @@ import java.util.UUID;
public class VelocityPingListener {
private static ProxyServer server;
private static final UUID RANDOM_UUID = UUID.randomUUID();
private ProxyServer server;
public VelocityPingListener(ProxyServer server) {
VelocityPingListener.server = server;
this.server = server;
}
@Subscribe
@@ -138,9 +138,14 @@ public class BukkitPacketAnalyzer {
private final Player player;
private final CommandSender sender;
private long lastCheckedForOperatorPermission = System.currentTimeMillis();
private boolean operatorStatus;
private PacketDecoder(Player player) {
this.player = player;
this.sender = CommandSender.from(player);
this.operatorStatus = player.isOp();
}
@Override
@@ -158,15 +163,15 @@ public class BukkitPacketAnalyzer {
return;
}
if (!PermissionUtil.hasBypassPermission(sender)) {
if (!PACKET_HANDLER.handleIncomingPacket(player, sender, packetObj))
return;
if (!hasBypassPermission() && !PACKET_HANDLER.handleIncomingPacket(player, sender, packetObj, false)) {
return;
}
super.channelRead(channel, packetObj);
} catch (Throwable exception) { exception.printStackTrace(); }
} catch (Throwable exception) {
exception.printStackTrace();
}
}
@Override
@@ -182,20 +187,20 @@ public class BukkitPacketAnalyzer {
final boolean isCommandsPacket = packetName.equals("ClientboundCommandsPacket");
final boolean isTabCompletePacket = packetName.equals("PacketPlayOutTabComplete") || packetName.equals("ClientboundCommandSuggestionsPacket");
if (!isCommandsPacket && !isTabCompletePacket || PermissionUtil.hasBypassPermission(sender)) {
if (!isCommandsPacket && !isTabCompletePacket || hasBypassPermission()) {
super.write(channel, packetObj, promise);
return;
}
if (isCommandsPacket) {
COMMANDS_NODE_HANDLER.handleOutgoingPacket(player, sender, packetObj);
COMMANDS_NODE_HANDLER.handleOutgoingPacket(player, sender, packetObj, false);
super.write(channel, packetObj, promise);
return;
}
UUID uuid = player.getUniqueId();
Object sentPacketObj = SENT_PACKET.get(uuid);
final UUID uuid = sender.getUniqueId();
final Object sentPacketObj = SENT_PACKET.get(uuid);
if (sentPacketObj != null) {
if (sentPacketObj == packetObj) {
@@ -205,8 +210,9 @@ public class BukkitPacketAnalyzer {
}
}
if (!PACKET_HANDLER.handleOutgoingPacket(player, sender, packetObj))
if (!PACKET_HANDLER.handleOutgoingPacket(player, sender, packetObj, false)) {
return;
}
super.write(channel, packetObj, promise);
@@ -214,5 +220,19 @@ public class BukkitPacketAnalyzer {
exception.printStackTrace();
}
}
private boolean hasBypassPermission() {
if (PermissionUtil.hasBypassPermission(sender, false)) {
return true;
}
if (System.currentTimeMillis() - this.lastCheckedForOperatorPermission >= 2000) {
this.lastCheckedForOperatorPermission = System.currentTimeMillis();
this.operatorStatus = player.isOp();
return this.operatorStatus;
}
return this.operatorStatus;
}
}
}
@@ -4,6 +4,17 @@ import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.entity.Player;
public interface BukkitPacketHandler {
boolean handleIncomingPacket(Player player, CommandSender sender, Object packetObj) throws Exception;
boolean handleOutgoingPacket(Player player, CommandSender sender, Object packetObj) throws Exception;
boolean handleIncomingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception;
boolean handleOutgoingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception;
}
@@ -23,7 +23,12 @@ import de.rayzs.pat.utils.Reflection;
public class LegacyPacketHandler implements BukkitPacketHandler {
@Override
public boolean handleIncomingPacket(Player player, CommandSender sender, Object packetObj) throws Exception {
public boolean handleIncomingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception {
Field stringField = Reflection.getFirstFieldByType(packetObj.getClass(), "String", Reflection.SearchOption.ENDS);
if(stringField == null) {
Logger.warning("Failed PacketAnalyze process! (#1)");
@@ -36,14 +41,19 @@ public class LegacyPacketHandler implements BukkitPacketHandler {
}
@Override
public boolean handleOutgoingPacket(Player player, CommandSender sender, Object packetObj) throws Exception {
public boolean handleOutgoingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception {
final String rawInput = BukkitPacketAnalyzer.getPlayerInput(player);
if(rawInput == null) {
return false;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, isOperator);
String input = rawInput;
boolean cancelsBeforeHand = false;
@@ -54,7 +64,7 @@ public class LegacyPacketHandler implements BukkitPacketHandler {
input = input.substring(1);
final boolean doesBypassNamespace = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender);
final boolean doesBypassNamespace = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender, isOperator);
final boolean spaces = input.contains(" ");
if (Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(input) && !doesBypassNamespace) {
@@ -62,7 +72,7 @@ public class LegacyPacketHandler implements BukkitPacketHandler {
}
if (!cancelsBeforeHand && !input.isEmpty()) {
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, StringUtils.getFirstArg(input));
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, StringUtils.getFirstArg(input), isOperator);
}
if (!cancelsBeforeHand) {
@@ -117,7 +127,7 @@ public class LegacyPacketHandler implements BukkitPacketHandler {
return false;
}
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, cpy);
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, cpy, isOperator);
});
}
@@ -5,18 +5,33 @@ import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.node.BukkitCommandNodeHelper;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.entity.Player;
public class ModernCommandsNodeHandler implements BukkitPacketHandler {
public boolean handleIncomingPacket(Player player, CommandSender sender, Object packetObj) throws Exception {
public boolean handleIncomingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) {
// Ignored
return true;
}
@Override
public boolean handleOutgoingPacket(Player player, CommandSender sender, Object packetObj) throws Exception {
public boolean handleOutgoingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception {
final BukkitCommandNodeHelper helper = new BukkitCommandNodeHelper(packetObj);
SubArgument.get().getCommandNodeHandler().handleCommandNode(helper, SubArgument.get().getPlayerArgument(sender));
SubArgument.get().getCommandNodeHandler().handleCommandNode(
helper,
SubArgument.get().getPlayerArgument(sender)
);
return true;
}
}
@@ -31,10 +31,15 @@ public class ModernPacketHandler implements BukkitPacketHandler {
private static boolean modifiable = true;
@Override
public boolean handleIncomingPacket(Player player, CommandSender sender, Object packetObj) throws Exception {
public boolean handleIncomingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception {
Field stringField = Reflection.getFirstFieldByType(packetObj.getClass(), "String", Reflection.SearchOption.ENDS);
if(stringField == null) {
if (stringField == null) {
Logger.warning("Failed PacketAnalyze process! (#1)");
return false;
}
@@ -62,7 +67,12 @@ public class ModernPacketHandler implements BukkitPacketHandler {
}
@Override
public boolean handleOutgoingPacket(Player player, CommandSender sender, Object packetObj) throws Exception {
public boolean handleOutgoingPacket(
final Player player,
final CommandSender sender,
final Object packetObj,
final boolean isOperator
) throws Exception {
Object suggestionObj;
String rawInput = BukkitPacketAnalyzer.getPlayerInput(player), input = rawInput;
@@ -70,10 +80,10 @@ public class ModernPacketHandler implements BukkitPacketHandler {
return false;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final boolean is121Packet = packetObj.getClass().getSimpleName().equals("ClientboundCommandSuggestionsPacket");
final List<Group> groups = GroupManager.getPlayerGroups(sender, isOperator);
boolean is121Packet = packetObj.getClass().getSimpleName().equals("ClientboundCommandSuggestionsPacket"),
cancelsBeforeHand = false;
boolean cancelsBeforeHand = false;
int spaces = 0;
if(input.startsWith("/") || is121Packet) {
@@ -85,7 +95,7 @@ public class ModernPacketHandler implements BukkitPacketHandler {
if (spaces > 0) input = split[0];
}
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, input);
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, input, isOperator);
if (!cancelsBeforeHand)
cancelsBeforeHand = Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(input) || Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(input);
@@ -114,7 +124,7 @@ public class ModernPacketHandler implements BukkitPacketHandler {
if (spaces == 0) {
suggestions.removeIf(suggestion -> {
String command = getSuggestionFromEntry(suggestion);
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command);
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, isOperator);
});
return true;
@@ -190,7 +200,7 @@ public class ModernPacketHandler implements BukkitPacketHandler {
suggestions.getList().removeIf(suggestion -> {
String command = suggestion.getText();
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command);
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, isOperator);
});
return true;
@@ -144,17 +144,17 @@ public class BungeePacketAnalyzer {
private static void modifyCommands(ProxiedPlayer player, CommandSender sender, Commands commands) {
String serverName = sender.getServerName();
final boolean ignore = PermissionUtil.hasBypassPermission(sender) || Storage.Blacklist.isDisabledServer(serverName);
final boolean ignore = PermissionUtil.hasBypassPermission(sender, false) || Storage.Blacklist.isDisabledServer(serverName);
ProxyCommandNodeHelper helper = new ProxyCommandNodeHelper<CommandNode>(commands.getRoot());
List<String> commandsAsString = new ArrayList<>(PROXY_COMMANDS);
commandsAsString.addAll(helper.getChildrenNames());
List<String> playerCommands = new ArrayList<>();
HashSet<String> playerCommands = new HashSet<>();
if (!ignore) {
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
final Map<String, CommandsCache> cache = Storage.getLoader().getPerServerCommandsCacheMap();
if (!cache.containsKey(serverName)) {
@@ -164,7 +164,7 @@ public class BungeePacketAnalyzer {
final CommandsCache commandsCache = cache.get(serverName);
commandsCache.handleCommands(commandsAsString, serverName);
final List<String> tmpPlayerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName);
final HashSet<String> tmpPlayerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName, false);
if (commands.getRoot().getChildren().size() != 0) {
helper.removeIf(str -> !tmpPlayerCommands.contains(str));
@@ -177,7 +177,7 @@ public class VelocityPacketAnalyzer {
final String serverName = sender.getServerName();
final boolean ignore = PermissionUtil.hasBypassPermission(sender) || Storage.Blacklist.isDisabledServer(serverName);
final boolean ignore = PermissionUtil.hasBypassPermission(sender, false) || Storage.Blacklist.isDisabledServer(serverName);
final ProxyCommandNodeHelper<CommandSource> helper = new ProxyCommandNodeHelper<>(commands.getRootNode());
final List<String> commandsAsString = new ArrayList<>();
@@ -187,7 +187,7 @@ public class VelocityPacketAnalyzer {
return;
}
final List<Group> groups = GroupManager.getPlayerGroups(sender);
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
final Map<String, CommandsCache> cache = Storage.getLoader().getPerServerCommandsCacheMap();
if (!cache.containsKey(serverName)) {
@@ -197,7 +197,7 @@ public class VelocityPacketAnalyzer {
final CommandsCache commandsCache = cache.get(serverName);
commandsCache.handleCommands(commandsAsString, serverName);
final List<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName);
final HashSet<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, sender, groups, serverName, false);
helper.removeIf(str -> {
if (str.equals("args")) {
return false;
@@ -298,8 +298,8 @@ public class VelocityPacketAnalyzer {
return;
}
if (!PermissionUtil.hasBypassPermission(sender) && player.getCurrentServer().isPresent()) {
final List<Group> groups = GroupManager.getPlayerGroups(sender);
if (!PermissionUtil.hasBypassPermission(sender, false) && player.getCurrentServer().isPresent()) {
final List<Group> groups = GroupManager.getPlayerGroups(sender, false);
boolean cancelsBeforeHand = false;
String playerInput = getPlayerInput(player), rawPlayerInput = playerInput, server = player.getCurrentServer().get().getServerInfo().getName();
@@ -312,7 +312,7 @@ public class VelocityPacketAnalyzer {
}
if (!playerInput.equals("/")) {
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, StringUtils.replaceFirst(playerInput, "/", ""), server);
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(sender, groups, StringUtils.replaceFirst(playerInput, "/", ""), server, false);
if (!cancelsBeforeHand) {
cancelsBeforeHand = Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(StringUtils.replaceFirst(playerInput, "/", "")) || Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(StringUtils.replaceFirst(playerInput, "/", ""));
@@ -336,7 +336,7 @@ public class VelocityPacketAnalyzer {
return false;
}
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, player.getCurrentServer().get().getServerInfo().getName());
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, player.getCurrentServer().get().getServerInfo().getName(), false);
});
} else {
@@ -4,6 +4,7 @@ import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.system.subargument.handler.SubArgumentHandler;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.NumberUtils;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.plugin.system.subargument.argument.Arguments;
@@ -133,13 +134,18 @@ public class TabCompleteHandler extends SubArgumentHandler {
possibilities.removeIf(possibility -> getInstance().getCachedOnlinePlayerNames().contains(possibility));
possibilities.removeIf(s -> {
if (negated.contains(s)) {
return false;
}
if (!arguments.getResultTab(StringUtils.getFirstArg(cursor)).isEmpty() && result.isEmpty()) {
possibilities.clear();
possibilities.add("///////////");
} else {
possibilities.removeIf(s -> {
if (negated.contains(s)) {
return false;
}
return result.contains(s);
});
return result.contains(s);
});
}
}
if (turn && possibilities.isEmpty()) {
@@ -1,14 +1,13 @@
package de.rayzs.pat.plugin.system.subargument.handler.impl;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.plugin.system.subargument.handler.SubArgumentHandler;
import de.rayzs.pat.plugin.system.subargument.SubArgument;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.plugin.system.subargument.argument.Arguments;
import java.util.List;
import java.util.HashSet;
public class UpdateArgumentsHandler extends SubArgumentHandler {
@@ -16,7 +15,7 @@ public class UpdateArgumentsHandler extends SubArgumentHandler {
super(instance);
}
public void updatePlayerArguments(CommandSender sender, List<String> commands, List<String> serverCommands, List<String> groupCommands) {
public void updatePlayerArguments(CommandSender sender, HashSet<String> commands, HashSet<String> serverCommands, HashSet<String> groupCommands) {
final Arguments arguments = getInstance().getPlayerArgument(sender);
arguments.clearArguments();
@@ -83,14 +83,25 @@ public class CommandsCache {
filteredCommands = tmpFilteredCommands;
}
public List<String> getPlayerCommands(Collection<String> unfilteredCommands, CommandSender sender, List<Group> groups) {
return getPlayerCommands(unfilteredCommands, sender, groups, null);
public HashSet<String> getPlayerCommands(
final Collection<String> unfilteredCommands,
final CommandSender sender,
final List<Group> groups,
final boolean isOperator
) {
return getPlayerCommands(unfilteredCommands, sender, groups, null, isOperator);
}
public List<String> getPlayerCommands(Collection<String> unfilteredCommands, CommandSender sender, List<Group> groups, String serverName) {
List<String> playerCommands = new LinkedList<>(unfilteredCommands);
List<String> localFilteredCommands = filteredCommands == null ? null : Reflection.isProxyServer()
? new ArrayList<>() : new ArrayList<>(filteredCommands);
public HashSet<String> getPlayerCommands(
final Collection<String> unfilteredCommands,
final CommandSender sender,
final List<Group> groups,
final String serverName,
final boolean isOperator
) {
final HashSet<String> playerCommands = new HashSet<>(unfilteredCommands);
final HashSet<String> localFilteredCommands = filteredCommands == null ? null : Reflection.isProxyServer()
? new HashSet<>() : new HashSet<>(filteredCommands);
if (localFilteredCommands == null)
return playerCommands;
@@ -112,8 +123,8 @@ public class CommandsCache {
}
if (!PermissionUtil.hasBypassPermission(sender)) {
boolean hasNamespaceBypass = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender);
if (!PermissionUtil.hasBypassPermission(sender, isOperator)) {
boolean hasNamespaceBypass = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(sender, isOperator);
playerCommands.removeIf(command -> {
if (!hasNamespaceBypass && Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(command)) {
@@ -124,12 +135,12 @@ public class CommandsCache {
return false;
}
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, serverName);
return !Storage.Blacklist.canPlayerAccessTab(sender, groups, command, serverName, isOperator);
});
}
final List<String> serverCommands = Storage.Blacklist.Collector.collectAllServerCommands(serverName);
final HashSet<String> serverCommands = Storage.Blacklist.Collector.collectAllServerCommands(serverName);
SubArgument.get().getUpdateArgumentsHandler().updatePlayerArguments(
sender,
@@ -144,7 +155,7 @@ public class CommandsCache {
serverName != null
);
return playerCommands.stream().map(command -> {
return new HashSet<>(playerCommands.stream().map(command -> {
command = StringUtils.getFirstArg(command);
Storage.Blacklist.BlockType type = Storage.Blacklist.BlockTypeFetcher.getType(command);
@@ -152,7 +163,7 @@ public class CommandsCache {
return command;
return Storage.Blacklist.BlockTypeFetcher.modify(command, type);
}).toList();
}).toList());
}
@@ -0,0 +1,106 @@
package de.rayzs.pat.utils;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.permission.PermissionPlugin;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.Set;
public class LuckPermsWarning {
private static boolean ALREADY_ANNOUNCED = false;
private static final Set<String> LUCKPERMS_PREFIXES = Set.of(
"luckperms", "lp",
"luckpermsbungee", "lpb",
"luckpermsvelocity", "lpv"
);
private static final Set<String> LUCKPERMS_COMMANDS_SET = Set.of(
"set", "unset",
"settemp", "unsettemp"
);
private static final String LUCKPERMS_WARNING = "&6&l[ProAntiTab] " +
"&e&lHey! &eYou just set a ProAntiTab permission using a world/server as context. " +
"However, PAT won't be able to detect this as of now. To fix this, please go to your &6&oplugins/ProAntiTab/config.yml&e and set the option &6&o'%s'&e to &a&ltrue&e. " +
"Afterwards, just execute '&6/%s reload'&e to apply the changes.";
public static boolean shouldSendLuckPermsWarning(final CommandSender sender, final String command) {
if (ALREADY_ANNOUNCED) {
return false;
}
if (Storage.getPermissionPlugin() != PermissionPlugin.LUCKPERMS) {
return false;
}
if (!LUCKPERMS_PREFIXES.contains(StringUtils.getFirstArg(command))) {
return false;
}
if (!sender.isConsole() && !PermissionUtil.hasPermission(sender, "*", false) && !sender.isOperator()) {
return false;
}
final String[] commandArgs = command.split(" ");
final String fth = getStrAtIndex(commandArgs, 5);
if (!StringUtils.startsWithIgnoreCase("proantitab.", fth)) {
return false;
}
final String thd = getStrAtIndex(commandArgs, 3);
if (!thd.equalsIgnoreCase("permission")) {
return false;
}
final String fst = getStrAtIndex(commandArgs, 1);
if (!fst.equalsIgnoreCase("group") && !fst.equalsIgnoreCase("user")) {
return false;
}
if (!LUCKPERMS_COMMANDS_SET.contains(getStrAtIndex(commandArgs, 4))) {
return false;
}
for (int i = 6; i < commandArgs.length; i++) {
final String context = getStrAtIndex(commandArgs, i);
final boolean res = StringUtils.startsWithIgnoreCase("server=", context)
|| StringUtils.startsWithIgnoreCase("world=", context);
if (res) {
return true;
}
}
return false;
}
public static void sendAnnouncement(final CommandSender sender) {
if (ALREADY_ANNOUNCED) return;
ALREADY_ANNOUNCED = true;
final String message = LUCKPERMS_WARNING.formatted(
Reflection.isProxyServer() ? "update-groups-per-server" : "update-groups-per-world",
Reflection.isProxyServer() ? "bpat" : "pat"
);
if (!sender.isConsole()) Logger.info(message);
sender.sendMessage(message);
}
public static boolean alreadyAnnounced() {
return ALREADY_ANNOUNCED;
}
private static String getStrAtIndex(final String[] args, final int index) {
if (index < 0 || index >= args.length) return "";
return args[index];
}
}
@@ -14,8 +14,6 @@ public class StringUtils {
return false;
}
System.out.println("\"" + str.substring(0, strCutLength) + "\"startsWith(\"" + startingWithSource + "\")");
return startingWithSource.equalsIgnoreCase(str.substring(0, strCutLength));
}
@@ -156,12 +156,12 @@ public class Group implements Serializable {
this.priority = priority;
}
public boolean hasPermission(CommandSender sender) {
return PermissionUtil.hasPermission(sender, "group." + this.groupName);
public boolean hasPermission(final CommandSender sender, final boolean isOperator) {
return PermissionUtil.hasPermission(sender, "group." + this.groupName, isOperator);
}
public boolean hasPermission(UUID uuid) {
return PermissionUtil.hasPermission(uuid, "group." + this.groupName);
public boolean hasPermission(final UUID uuid, final boolean isOperator) {
return PermissionUtil.hasPermission(uuid, "group." + this.groupName, isOperator);
}
public boolean contains(String command) {
@@ -45,8 +45,8 @@ public class GroupManager {
});
}
public static List<Group> getPlayerGroups(UUID uuid) {
List<Group> playerGroups = new ArrayList<>(GroupManager.getGroups().stream().filter(group -> group.hasPermission(uuid)).toList());
public static List<Group> getPlayerGroups(final UUID uuid, final boolean isOperator) {
List<Group> playerGroups = new ArrayList<>(GroupManager.getGroups().stream().filter(group -> group.hasPermission(uuid, isOperator)).toList());
int priority = playerGroups.stream()
.mapToInt(Group::getPriority)
@@ -58,8 +58,8 @@ public class GroupManager {
return playerGroups;
}
public static List<Group> getPlayerGroups(CommandSender sender) {
List<Group> playerGroups = new ArrayList<>(GroupManager.getGroups().stream().filter(group -> group.hasPermission(sender)).toList());
public static List<Group> getPlayerGroups(final CommandSender sender, final boolean isOperator) {
List<Group> playerGroups = new ArrayList<>(GroupManager.getGroups().stream().filter(group -> group.hasPermission(sender, isOperator)).toList());
int priority = playerGroups.stream()
.mapToInt(Group::getPriority)
@@ -192,10 +192,10 @@ public class LuckPermsHook {
if (Reflection.isProxyServer()) {
final String serverName = sender.getServerName();
final List<String> serverCommands = Storage.Blacklist.Collector.collectAllServerCommands(serverName);
final List<String> groupCommands = Storage.Blacklist.Collector.collectAllPlayerGroupCommands(sender, serverName);
final HashSet<String> serverCommands = Storage.Blacklist.Collector.collectAllServerCommands(serverName);
final HashSet<String> groupCommands = Storage.Blacklist.Collector.collectAllPlayerGroupCommands(sender, serverName);
final List<String> playerCommands = new ArrayList<>(serverCommands);
final HashSet<String> playerCommands = new HashSet<>(serverCommands);
playerCommands.addAll(groupCommands);
SubArgument.get().getUpdateArgumentsHandler().updatePlayerArguments(sender, playerCommands, serverCommands, groupCommands);
@@ -65,7 +65,8 @@ public class PermissionUtil {
} else if (Storage.getPermissionPlugin() == PermissionPlugin.GROUPMANAGER) {
GroupManagerHook.setPermissions(sender.getUniqueId());
} else {
GroupManager.getGroups().forEach(group -> group.hasPermission(sender));
final boolean isOperator = sender.isOperator();
GroupManager.getGroups().forEach(group -> group.hasPermission(sender, isOperator));
}
}
@@ -75,7 +76,11 @@ public class PermissionUtil {
} else if (Storage.getPermissionPlugin() == PermissionPlugin.GROUPMANAGER) {
GroupManagerHook.setPermissions(uuid);
} else {
GroupManager.getGroups().forEach(group -> group.hasPermission(uuid));
final CommandSender sender = CommandSender.from(uuid);
if (sender == null) return;
final boolean isOperator = sender.isOperator();
GroupManager.getGroups().forEach(group -> group.hasPermission(uuid, isOperator));
}
}
@@ -97,9 +102,11 @@ public class PermissionUtil {
permissionMap.setState(permission, permitted);
}
public static boolean hasPermission(Object targetObj, String permission) {
PermissionMap permissionMap;
public static boolean hasPermission(final Object targetObj, final String permission, final boolean isOperator) {
if (isOperator) return true;
PermissionMap permissionMap;
CommandSender sender = null;
UUID uuid = null;
@@ -127,8 +134,7 @@ public class PermissionUtil {
return true;
}
return sender.isOperator()
|| sender.hasPermission("*")
return sender.hasPermission("*")
|| sender.hasPermission("proantitab.*")
|| sender.hasPermission("proantitab." + permission);
}
@@ -161,31 +167,31 @@ public class PermissionUtil {
permissionMap.setState("proantitab." + permission, sender.hasPermission("proantitab." + permission));
}
if (sender.isOperator()) {
return true;
}
}
return permissionMap.isPermitted("*") || permissionMap.isPermitted("proantitab.*") || permissionMap.isPermitted("proantitab." + permission);
}
public static boolean hasBypassPermission(Object targetObj) {
public static boolean hasBypassPermission(Object targetObj, final boolean isOperator) {
if (!Reflection.isProxyServer() && Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return false;
}
return hasPermission(targetObj, "bypass");
return hasPermission(targetObj, "bypass", isOperator);
}
public static boolean hasBypassPermission(Object targetObj, String command) {
public static boolean hasBypassPermission(
final Object targetObj,
final String command,
final boolean isOperator
) {
if (!Reflection.isProxyServer() && Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
return false;
}
if (hasBypassPermission(targetObj)) {
if (hasBypassPermission(targetObj, isOperator)) {
return true;
}
@@ -193,11 +199,15 @@ public class PermissionUtil {
return false;
}
return hasPermission(targetObj, "bypass." + command);
return hasPermission(targetObj, "bypass." + command, isOperator);
}
public static boolean hasPermissionWithResponse(Object targetObj, String command) {
boolean permitted = hasPermission(targetObj, command);
public static boolean hasPermissionWithResponse(
final Object targetObj,
final String command,
final boolean isOperator
) {
boolean permitted = hasPermission(targetObj, command, isOperator);
if (!permitted && targetObj instanceof CommandSender) {
String message = Storage.ConfigSections.Messages.NO_PERMISSION.MESSAGE;
+1 -1
View File
@@ -3,7 +3,7 @@ description: Hides more than just your plugins.
website: https://www.rayzs.de/products/proantitab/page
author: Rayzs_YT
version: 2.4.2
version: 2.4.3
main: de.rayzs.pat.plugin.BungeeLoader
softDepends: [LuckPerms, PAPIProxyBridge]
+1 -1
View File
@@ -3,7 +3,7 @@ description: Hides more than just your plugins.
website: https://www.rayzs.de/products/proantitab/page
author: Rayzs_YT
version: 2.4.2
version: 2.4.3
api-version: 1.13
folia-supported: true
main: de.rayzs.pat.plugin.BukkitLoader