diff --git a/src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissions.java b/src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissions.java index 54060ced7..102fce8ac 100644 --- a/src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissions.java +++ b/src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissions.java @@ -13,6 +13,7 @@ import org.mvplugins.multiverse.core.world.MultiverseWorld; import static org.mvplugins.multiverse.core.permissions.PermissionUtils.concatPermission; +import static org.mvplugins.multiverse.core.permissions.PermissionUtils.registerPermissionWithWildcards; @Service public final class CorePermissions { @@ -60,28 +61,34 @@ public final class CorePermissions { @PostConstruct void registerBasePermissions() { - pluginManager.addPermission(new Permission(JOINLOCATION_BYPASS, PermissionDefault.FALSE)); - Logging.fine("Successfully registered base permissions"); + Try.run(() -> { + registerPermissionWithWildcards(new Permission(JOINLOCATION_BYPASS, PermissionDefault.FALSE)); + }).onSuccess(ignore -> { + Logging.fine("Successfully registered base permissions"); + }).onFailure(e -> { + Logging.fine("Failed to register base permissions: %s", e.getMessage()); + }); } public Try addWorldPermissions(@NotNull MultiverseWorld world) { return Try.run(() -> { - pluginManager.addPermission(new Permission( + registerPermissionWithWildcards(new Permission( concatPermission(WORLD_ACCESS, world.getName()), PermissionDefault.OP)); - pluginManager.addPermission(new Permission( + registerPermissionWithWildcards(new Permission( concatPermission(WORLD_EXEMPT, world.getName()), PermissionDefault.OP)); - pluginManager.addPermission(new Permission( + registerPermissionWithWildcards(new Permission( concatPermission(GAMEMODE_BYPASS, world.getName()), PermissionDefault.FALSE)); - pluginManager.addPermission(new Permission( + registerPermissionWithWildcards(new Permission( concatPermission(PLAYERLIMIT_BYPASS, world.getName()), PermissionDefault.FALSE)); - pluginManager.addPermission(new Permission( + registerPermissionWithWildcards(new Permission( concatPermission(SPAWN, world.getName()), PermissionDefault.OP)); - pluginManager.addPermission(new Permission( + registerPermissionWithWildcards(new Permission( concatPermission(SPAWN, "self", world.getName()), PermissionDefault.OP)); - pluginManager.addPermission(new Permission( + registerPermissionWithWildcards(new Permission( concatPermission(SPAWN, "other", world.getName()), PermissionDefault.OP)); Logging.fine("Successfully registered permissions for world %s", world.getName()); - }); + }).onFailure(e -> Logging.fine("Failed to register permissions for world %s: %s", + world.getName(), e.getMessage())); } public Try removeWorldPermissions(@NotNull MultiverseWorld world) { @@ -90,20 +97,23 @@ public Try removeWorldPermissions(@NotNull MultiverseWorld world) { pluginManager.removePermission(concatPermission(WORLD_EXEMPT, world.getName())); pluginManager.removePermission(concatPermission(GAMEMODE_BYPASS, world.getName())); pluginManager.removePermission(concatPermission(PLAYERLIMIT_BYPASS, world.getName())); + pluginManager.removePermission(concatPermission(SPAWN, world.getName())); pluginManager.removePermission(concatPermission(SPAWN, "self", world.getName())); pluginManager.removePermission(concatPermission(SPAWN, "other", world.getName())); Logging.fine("Successfully removed permissions for world %s", world.getName()); - }); + }).onFailure(e -> Logging.fine("Failed to remove permissions for world %s: %s", + world.getName(), e.getMessage())); } public Try addDestinationPermissions(@NotNull Destination destination) { return Try.run(() -> { - pluginManager.addPermission(new Permission( + registerPermissionWithWildcards(new Permission( concatPermission(TELEPORT, "self", destination.getIdentifier()), PermissionDefault.OP)); - pluginManager.addPermission(new Permission( + registerPermissionWithWildcards(new Permission( concatPermission(TELEPORT, "other", destination.getIdentifier()), PermissionDefault.OP)); Logging.fine("Successfully registered permissions for destination %s", destination.getIdentifier()); - }); + }).onFailure(e -> Logging.fine("Failed to register permissions for destination %s: %s", + destination.getIdentifier(), e.getMessage())); } public Try removeDestinationPermissions(@NotNull Destination destination) { @@ -111,6 +121,7 @@ public Try removeDestinationPermissions(@NotNull Destination destination) pluginManager.removePermission(concatPermission(TELEPORT, "self", destination.getIdentifier())); pluginManager.removePermission(concatPermission(TELEPORT, "other", destination.getIdentifier())); Logging.fine("Successfully removed permissions for destination %s", destination.getIdentifier()); - }); + }).onFailure(e -> Logging.fine("Failed to remove permissions for destination %s: %s", + destination.getIdentifier(), e.getMessage())); } } diff --git a/src/main/java/org/mvplugins/multiverse/core/permissions/PermissionUtils.java b/src/main/java/org/mvplugins/multiverse/core/permissions/PermissionUtils.java index 97a707cbb..55cd65a05 100644 --- a/src/main/java/org/mvplugins/multiverse/core/permissions/PermissionUtils.java +++ b/src/main/java/org/mvplugins/multiverse/core/permissions/PermissionUtils.java @@ -1,8 +1,14 @@ package org.mvplugins.multiverse.core.permissions; import com.dumptruckman.minecraft.util.Logging; +import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionDefault; +import org.jetbrains.annotations.ApiStatus; + +import java.util.Arrays; public final class PermissionUtils { @@ -20,6 +26,37 @@ public static void setDebugPermissions(boolean debugPermissions) { PermissionUtils.debugPermissions = debugPermissions; } + /** + * Registers a permission along with all its wildcard parents. + *
+ * For example, registering "mv.bypass.joinlocation" will also register "mv.*" and "mv.bypass.*" as parents. + * + * @param permission The permission to register. + * + * @since 5.4 + */ + @ApiStatus.AvailableSince("5.4") + public static void registerPermissionWithWildcards(Permission permission) { + Bukkit.getServer().getPluginManager().addPermission(permission); + String[] split = permission.getName().split("\\."); + StringBuilder prefix = new StringBuilder(); + // Skip the last element since it's the actual permission + Arrays.stream(Arrays.copyOfRange(split, 0, split.length - 1)).forEach(s -> { + prefix.append(s).append("."); + Permission perm = getOrAddPermission(prefix + "*"); + permission.addParent(perm, true); + }); + } + + private static Permission getOrAddPermission(String permission) { + Permission perm = Bukkit.getServer().getPluginManager().getPermission(permission); + if (perm == null) { + perm = new Permission(permission, PermissionDefault.FALSE); + Bukkit.getServer().getPluginManager().addPermission(perm); + } + return perm; + } + /** * Joins permissions with a dot. *