Skip to content

Commit 70ca0de

Browse files
committed
Update sponge for access check changes
1 parent dcbd129 commit 70ca0de

1 file changed

Lines changed: 21 additions & 16 deletions

File tree

cloud-sponge/src/main/java/org/incendo/cloud/sponge/CloudSpongeCommand.java

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@
2323
//
2424
package org.incendo.cloud.sponge;
2525

26+
import io.leangen.geantyref.GenericTypeReflector;
27+
import java.lang.reflect.Type;
2628
import java.util.ArrayDeque;
2729
import java.util.Collections;
2830
import java.util.List;
31+
import java.util.Map;
2932
import java.util.Optional;
30-
import java.util.Set;
3133
import java.util.stream.Collectors;
3234
import net.kyori.adventure.text.Component;
3335
import org.checkerframework.checker.nullness.qual.NonNull;
@@ -83,10 +85,11 @@ public List<CommandCompletion> complete(
8385

8486
@Override
8587
public boolean canExecute(final @NonNull CommandCause cause) {
86-
return this.commandManager.testPermission(
87-
this.commandManager.senderMapper().map(cause),
88-
(Permission) this.namedNode().nodeMeta().getOrDefault(CommandNode.META_KEY_PERMISSION, Permission.empty())
89-
).allowed();
88+
return this.checkAccess(
89+
cause,
90+
this.namedNode().nodeMeta()
91+
.getOrDefault(CommandNode.META_KEY_ACCESS, Collections.emptyMap())
92+
);
9093
}
9194

9295
@Override
@@ -188,23 +191,25 @@ private static <C> boolean canExecute(final @NonNull CommandNode<C> node) {
188191
|| node.children().stream().noneMatch(c -> c.component().required());
189192
}
190193

191-
@SuppressWarnings("unchecked")
192194
private void addRequirement(
193195
final @NonNull CommandNode<C> cloud,
194196
final @NonNull CommandTreeNode<? extends CommandTreeNode<?>> node
195197
) {
196-
final Permission permission = (Permission) cloud.nodeMeta()
197-
.getOrDefault(CommandNode.META_KEY_PERMISSION, Permission.empty());
198-
final Set<Class<?>> senderTypes = (Set<Class<?>>) cloud.nodeMeta().get(CommandNode.META_KEY_SENDER_TYPES);
199-
node.requires(cause -> {
200-
final C c = this.commandManager.senderMapper().map(cause);
201-
for (final Class<?> senderType : senderTypes) {
202-
if (senderType.isInstance(c)) {
203-
return this.commandManager.testPermission(c, permission).allowed();
198+
final Map<Type, Permission> accessMap =
199+
cloud.nodeMeta().getOrDefault(CommandNode.META_KEY_ACCESS, Collections.emptyMap());
200+
node.requires(cause -> this.checkAccess(cause, accessMap));
201+
}
202+
203+
private boolean checkAccess(final CommandCause cause, final Map<Type, Permission> accessMap) {
204+
final C cloudSender = this.commandManager.senderMapper().map(cause);
205+
for (final Map.Entry<Type, Permission> entry : accessMap.entrySet()) {
206+
if (GenericTypeReflector.isSuperType(entry.getKey(), cloudSender.getClass())) {
207+
if (this.commandManager.testPermission(cloudSender, entry.getValue()).allowed()) {
208+
return true;
204209
}
205210
}
206-
return false;
207-
});
211+
}
212+
return false;
208213
}
209214

210215
private String formatCommandForParsing(final @NonNull String arguments) {

0 commit comments

Comments
 (0)