Skip to content

Commit d0e69d5

Browse files
authored
GH-390 Fix suggestions permission validation for children of command. (#391)
1 parent a9d7461 commit d0e69d5

File tree

3 files changed

+82
-2
lines changed

3 files changed

+82
-2
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package dev.rollczi.litecommands.annotations.permission;
2+
3+
import dev.rollczi.litecommands.annotations.LiteTestSpec;
4+
import dev.rollczi.litecommands.annotations.command.Command;
5+
import dev.rollczi.litecommands.annotations.execute.Execute;
6+
import static dev.rollczi.litecommands.unit.TestPlatformSender.*;
7+
import org.junit.jupiter.api.Test;
8+
9+
class PermissionAnnotationSuggestionTest extends LiteTestSpec {
10+
11+
@Command(name = "test")
12+
@Permission("test.permission")
13+
static class TestCommand {
14+
15+
@Execute(name = "sub")
16+
@Permission("test.permission.execute")
17+
void execute() {}
18+
19+
}
20+
21+
@Test
22+
void test() {
23+
platform.suggest("test")
24+
.assertSuggest();
25+
26+
platform.suggest(permitted("test.permission"), "test")
27+
.assertSuggest("test");
28+
}
29+
30+
31+
@Test
32+
void testSub() {
33+
platform.suggest(permitted("test.permission"), "test ")
34+
.assertSuggest();
35+
36+
platform.suggest(permitted("test.permission", "test.permission.execute"), "test ")
37+
.assertSuggest("sub");
38+
39+
platform.suggest(permitted("test.permission.execute"), "test ")
40+
.assertSuggest();
41+
}
42+
43+
}

litecommands-annotations/test/dev/rollczi/litecommands/annotations/permission/PermissionAnnotationTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.rollczi.litecommands.annotations.permission;
22

33
import dev.rollczi.litecommands.annotations.LiteTestSpec;
4+
import dev.rollczi.litecommands.annotations.command.Command;
45
import dev.rollczi.litecommands.annotations.execute.Execute;
56
import dev.rollczi.litecommands.permission.MissingPermissions;
67
import org.junit.jupiter.api.Test;
@@ -12,9 +13,9 @@
1213

1314
class PermissionAnnotationTest extends LiteTestSpec {
1415

15-
@dev.rollczi.litecommands.annotations.command.Command(name = "test")
16+
@Command(name = "test")
1617
@Permission("test.permission")
17-
static class Command {
18+
static class TestCommand {
1819

1920
@Execute
2021
@Permission("test.permission.execute")

litecommands-core/src/dev/rollczi/litecommands/suggestion/SuggestionService.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ private <MATCHER extends SuggestionInputMatcher<MATCHER>> SuggestionResult sugge
4040
CommandRoute<SENDER> commandRoute
4141
) {
4242
if (matcher.hasNoNextRouteAndArguments()) {
43+
Flow flow = this.validatorService.validate(invocation, commandRoute);
44+
45+
if (flow.isTerminate() || flow.isStopCurrent()) {
46+
return SuggestionResult.empty();
47+
}
48+
4349
return SuggestionResult.of(commandRoute.names());
4450
}
4551

@@ -64,6 +70,10 @@ private <MATCHER extends SuggestionInputMatcher<MATCHER>> SuggestionResult sugge
6470
String current = matcher.showNextRoute();
6571

6672
for (CommandRoute<SENDER> child : commandRoute.getChildren()) {
73+
if (!this.isAnyExecutorValid(invocation, child)) {
74+
continue;
75+
}
76+
6777
for (String name : child.names()) {
6878
if (!StringUtil.startsWithIgnoreCase(name, current)) {
6979
continue;
@@ -76,6 +86,32 @@ private <MATCHER extends SuggestionInputMatcher<MATCHER>> SuggestionResult sugge
7686
return all;
7787
}
7888

89+
private boolean isAnyExecutorValid(Invocation<SENDER> invocation, CommandRoute<SENDER> route) {
90+
Flow flow = this.validatorService.validate(invocation, route);
91+
92+
if (flow.isTerminate() || flow.isStopCurrent()) {
93+
return false;
94+
}
95+
96+
for (CommandExecutor<SENDER> executor : route.getExecutors()) {
97+
Flow flowExecutor = this.validatorService.validate(invocation, executor);
98+
99+
if (flowExecutor.isTerminate() || flowExecutor.isStopCurrent()) {
100+
continue;
101+
}
102+
103+
return true;
104+
}
105+
106+
for (CommandRoute<SENDER> child : route.getChildren()) {
107+
if (this.isAnyExecutorValid(invocation, child)) {
108+
return true;
109+
}
110+
}
111+
112+
return false;
113+
}
114+
79115
public <MATCHER extends SuggestionInputMatcher<MATCHER>> SuggestionResult suggestExecutor(
80116
Invocation<SENDER> invocation,
81117
MATCHER matcher,

0 commit comments

Comments
 (0)