Skip to content

Commit 147564c

Browse files
authored
Merge pull request #3372 from Multiverse/fix/perm-register
Register permission with its wildcards explicitly
2 parents f7d8688 + 0e0e4e0 commit 147564c

File tree

2 files changed

+63
-15
lines changed

2 files changed

+63
-15
lines changed

src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissions.java

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.mvplugins.multiverse.core.world.MultiverseWorld;
1414

1515
import static org.mvplugins.multiverse.core.permissions.PermissionUtils.concatPermission;
16+
import static org.mvplugins.multiverse.core.permissions.PermissionUtils.registerPermissionWithWildcards;
1617

1718
@Service
1819
public final class CorePermissions {
@@ -60,28 +61,34 @@ public final class CorePermissions {
6061

6162
@PostConstruct
6263
void registerBasePermissions() {
63-
pluginManager.addPermission(new Permission(JOINLOCATION_BYPASS, PermissionDefault.FALSE));
64-
Logging.fine("Successfully registered base permissions");
64+
Try.run(() -> {
65+
registerPermissionWithWildcards(new Permission(JOINLOCATION_BYPASS, PermissionDefault.FALSE));
66+
}).onSuccess(ignore -> {
67+
Logging.fine("Successfully registered base permissions");
68+
}).onFailure(e -> {
69+
Logging.fine("Failed to register base permissions: %s", e.getMessage());
70+
});
6571
}
6672

6773
public Try<Void> addWorldPermissions(@NotNull MultiverseWorld world) {
6874
return Try.run(() -> {
69-
pluginManager.addPermission(new Permission(
75+
registerPermissionWithWildcards(new Permission(
7076
concatPermission(WORLD_ACCESS, world.getName()), PermissionDefault.OP));
71-
pluginManager.addPermission(new Permission(
77+
registerPermissionWithWildcards(new Permission(
7278
concatPermission(WORLD_EXEMPT, world.getName()), PermissionDefault.OP));
73-
pluginManager.addPermission(new Permission(
79+
registerPermissionWithWildcards(new Permission(
7480
concatPermission(GAMEMODE_BYPASS, world.getName()), PermissionDefault.FALSE));
75-
pluginManager.addPermission(new Permission(
81+
registerPermissionWithWildcards(new Permission(
7682
concatPermission(PLAYERLIMIT_BYPASS, world.getName()), PermissionDefault.FALSE));
77-
pluginManager.addPermission(new Permission(
83+
registerPermissionWithWildcards(new Permission(
7884
concatPermission(SPAWN, world.getName()), PermissionDefault.OP));
79-
pluginManager.addPermission(new Permission(
85+
registerPermissionWithWildcards(new Permission(
8086
concatPermission(SPAWN, "self", world.getName()), PermissionDefault.OP));
81-
pluginManager.addPermission(new Permission(
87+
registerPermissionWithWildcards(new Permission(
8288
concatPermission(SPAWN, "other", world.getName()), PermissionDefault.OP));
8389
Logging.fine("Successfully registered permissions for world %s", world.getName());
84-
});
90+
}).onFailure(e -> Logging.fine("Failed to register permissions for world %s: %s",
91+
world.getName(), e.getMessage()));
8592
}
8693

8794
public Try<Void> removeWorldPermissions(@NotNull MultiverseWorld world) {
@@ -90,27 +97,31 @@ public Try<Void> removeWorldPermissions(@NotNull MultiverseWorld world) {
9097
pluginManager.removePermission(concatPermission(WORLD_EXEMPT, world.getName()));
9198
pluginManager.removePermission(concatPermission(GAMEMODE_BYPASS, world.getName()));
9299
pluginManager.removePermission(concatPermission(PLAYERLIMIT_BYPASS, world.getName()));
100+
pluginManager.removePermission(concatPermission(SPAWN, world.getName()));
93101
pluginManager.removePermission(concatPermission(SPAWN, "self", world.getName()));
94102
pluginManager.removePermission(concatPermission(SPAWN, "other", world.getName()));
95103
Logging.fine("Successfully removed permissions for world %s", world.getName());
96-
});
104+
}).onFailure(e -> Logging.fine("Failed to remove permissions for world %s: %s",
105+
world.getName(), e.getMessage()));
97106
}
98107

99108
public Try<Void> addDestinationPermissions(@NotNull Destination destination) {
100109
return Try.run(() -> {
101-
pluginManager.addPermission(new Permission(
110+
registerPermissionWithWildcards(new Permission(
102111
concatPermission(TELEPORT, "self", destination.getIdentifier()), PermissionDefault.OP));
103-
pluginManager.addPermission(new Permission(
112+
registerPermissionWithWildcards(new Permission(
104113
concatPermission(TELEPORT, "other", destination.getIdentifier()), PermissionDefault.OP));
105114
Logging.fine("Successfully registered permissions for destination %s", destination.getIdentifier());
106-
});
115+
}).onFailure(e -> Logging.fine("Failed to register permissions for destination %s: %s",
116+
destination.getIdentifier(), e.getMessage()));
107117
}
108118

109119
public Try<Void> removeDestinationPermissions(@NotNull Destination destination) {
110120
return Try.run(() -> {
111121
pluginManager.removePermission(concatPermission(TELEPORT, "self", destination.getIdentifier()));
112122
pluginManager.removePermission(concatPermission(TELEPORT, "other", destination.getIdentifier()));
113123
Logging.fine("Successfully removed permissions for destination %s", destination.getIdentifier());
114-
});
124+
}).onFailure(e -> Logging.fine("Failed to remove permissions for destination %s: %s",
125+
destination.getIdentifier(), e.getMessage()));
115126
}
116127
}

src/main/java/org/mvplugins/multiverse/core/permissions/PermissionUtils.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package org.mvplugins.multiverse.core.permissions;
22

33
import com.dumptruckman.minecraft.util.Logging;
4+
import org.bukkit.Bukkit;
45
import org.bukkit.command.CommandSender;
56
import org.bukkit.command.ConsoleCommandSender;
7+
import org.bukkit.permissions.Permission;
8+
import org.bukkit.permissions.PermissionDefault;
9+
import org.jetbrains.annotations.ApiStatus;
10+
11+
import java.util.Arrays;
612

713
public final class PermissionUtils {
814

@@ -20,6 +26,37 @@ public static void setDebugPermissions(boolean debugPermissions) {
2026
PermissionUtils.debugPermissions = debugPermissions;
2127
}
2228

29+
/**
30+
* Registers a permission along with all its wildcard parents.
31+
* <br />
32+
* For example, registering "mv.bypass.joinlocation" will also register "mv.*" and "mv.bypass.*" as parents.
33+
*
34+
* @param permission The permission to register.
35+
*
36+
* @since 5.4
37+
*/
38+
@ApiStatus.AvailableSince("5.4")
39+
public static void registerPermissionWithWildcards(Permission permission) {
40+
Bukkit.getServer().getPluginManager().addPermission(permission);
41+
String[] split = permission.getName().split("\\.");
42+
StringBuilder prefix = new StringBuilder();
43+
// Skip the last element since it's the actual permission
44+
Arrays.stream(Arrays.copyOfRange(split, 0, split.length - 1)).forEach(s -> {
45+
prefix.append(s).append(".");
46+
Permission perm = getOrAddPermission(prefix + "*");
47+
permission.addParent(perm, true);
48+
});
49+
}
50+
51+
private static Permission getOrAddPermission(String permission) {
52+
Permission perm = Bukkit.getServer().getPluginManager().getPermission(permission);
53+
if (perm == null) {
54+
perm = new Permission(permission, PermissionDefault.FALSE);
55+
Bukkit.getServer().getPluginManager().addPermission(perm);
56+
}
57+
return perm;
58+
}
59+
2360
/**
2461
* Joins permissions with a dot.
2562
*

0 commit comments

Comments
 (0)