From e3792124cfaa844fafb9b509e2e21ba001bb1807 Mon Sep 17 00:00:00 2001 From: Ryan Barlow <7389646+ryanbarlow97@users.noreply.github.com> Date: Thu, 15 Oct 2026 17:45:33 +0000 Subject: [PATCH] fix: respect permissions and sender type in completion --- .../woodworking/command/CommandManager.java | 4 +++- .../woodworking/LoadersCommandsTest.java | 13 ++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/tfminecraft/woodworking/command/CommandManager.java b/src/main/java/net/tfminecraft/woodworking/command/CommandManager.java index 4397952..1da888f 100644 --- a/src/main/java/net/tfminecraft/woodworking/command/CommandManager.java +++ b/src/main/java/net/tfminecraft/woodworking/command/CommandManager.java @@ -92,18 +92,20 @@ private void handleSelect(Player p, String projectId) { @Override public List onTabComplete(CommandSender sender, Command cmd, String label, String[] args) { if (!cmd.getName().equalsIgnoreCase(cmd1)) return null; + if (!Permissions.isAdmin(sender)) return List.of(); if (args.length == 1) { String prefix = args[0].toLowerCase(Locale.ROOT); List out = new ArrayList<>(); for (String s : SUB_COMMANDS) { + if (s.equals("select") && !(sender instanceof Player)) continue; if (s.startsWith(prefix)) out.add(s); } return out; } if (args.length == 2 && args[0].equalsIgnoreCase("select")) { - if (!Permissions.isAdmin(sender)) return new ArrayList<>(); + if (!(sender instanceof Player)) return List.of(); String prefix = args[1].toLowerCase(Locale.ROOT); List out = new ArrayList<>(); for (String id : ProjectLoader.get().keySet()) { diff --git a/src/test/java/net/tfminecraft/woodworking/LoadersCommandsTest.java b/src/test/java/net/tfminecraft/woodworking/LoadersCommandsTest.java index 83ef257..749a176 100644 --- a/src/test/java/net/tfminecraft/woodworking/LoadersCommandsTest.java +++ b/src/test/java/net/tfminecraft/woodworking/LoadersCommandsTest.java @@ -115,6 +115,7 @@ void commandsPermissionsSelectionAndCompletion() throws Exception { assertFalse(c.onCommand(sender, cmd, "w", new String[0])); assertNull(c.onTabComplete(sender, cmd, "w", new String[0])); when(cmd.getName()).thenReturn("woodworking"); + assertTrue(c.onTabComplete(sender, cmd, "w", new String[] {""}).isEmpty()); c.onCommand(sender, cmd, "w", new String[0]); c.onCommand(sender, cmd, "w", new String[] {"other"}); c.onCommand(sender, cmd, "w", new String[] {"reload"}); @@ -154,12 +155,18 @@ void commandsPermissionsSelectionAndCompletion() throws Exception { when(p.hasPermission(Cache.permission)).thenReturn(true); assertTrue(Permissions.requireUse(p)); assertEquals(List.of("reload"), c.onTabComplete(sender, cmd, "w", new String[] {"re"})); + assertEquals(List.of("reload"), c.onTabComplete(sender, cmd, "w", new String[] {""})); assertTrue(c.onTabComplete(p, cmd, "w", new String[] {"select", ""}).isEmpty()); + assertTrue(c.onTabComplete(p, cmd, "w", new String[] {"SE"}).isEmpty()); + assertTrue(c.onTabComplete(sender, cmd, "w", new String[] {"select", ""}).isEmpty()); + when(p.hasPermission(Permissions.ADMIN)).thenReturn(true); + assertEquals(List.of("reload", "select"), c.onTabComplete(p, cmd, "w", new String[] {""})); + assertEquals(List.of("select"), c.onTabComplete(p, cmd, "w", new String[] {"SE"})); assertEquals( - List.of("chair"), c.onTabComplete(sender, cmd, "w", new String[] {"select", "ch"})); + List.of("chair"), c.onTabComplete(p, cmd, "w", new String[] {"select", "ch"})); for (int i = 0; i < 50; i++) ProjectLoader.get().put("x" + i, project); - assertEquals(40, c.onTabComplete(sender, cmd, "w", new String[] {"select", ""}).size()); - assertTrue(c.onTabComplete(sender, cmd, "w", new String[] {"select", "nope"}).isEmpty()); + assertEquals(40, c.onTabComplete(p, cmd, "w", new String[] {"select", ""}).size()); + assertTrue(c.onTabComplete(p, cmd, "w", new String[] {"select", "nope"}).isEmpty()); assertTrue(c.onTabComplete(sender, cmd, "w", new String[] {"other", ""}).isEmpty()); assertTrue(c.onTabComplete(sender, cmd, "w", new String[0]).isEmpty()); }