Skip to content

Commit

Permalink
Properly register world and teleport permissions
Browse files Browse the repository at this point in the history
  • Loading branch information
benwoo1110 committed Jan 17, 2025
1 parent ed5a13b commit 9d54cc4
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.jetbrains.annotations.NotNull;
import org.jvnet.hk2.annotations.Service;
import org.mvplugins.multiverse.core.permissions.CorePermissionsChecker;
import org.mvplugins.multiverse.core.permissions.PermissionUtils;

import java.util.HashMap;
import java.util.Locale;
Expand Down Expand Up @@ -54,6 +55,6 @@ public void registerPermissionChecker(String id, Predicate<CommandIssuer> checke
boolean hasPermission(CommandIssuer issuer, String permission) {
return Option.of(permissionsCheckMap.get(permission))
.map(checker -> checker.test(issuer))
.getOrElse(() -> permissionsChecker.hasPermission(issuer.getIssuer(), permission));
.getOrElse(() -> PermissionUtils.hasPermission(issuer.getIssuer(), permission));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jvnet.hk2.annotations.Service;
import org.mvplugins.multiverse.core.permissions.CorePermissions;

/**
* Provides destinations for teleportation.
Expand All @@ -22,13 +23,13 @@ public class DestinationsProvider {
private static final String SEPARATOR = ":";
private static final String PERMISSION_PREFIX = "multiverse.teleport.";

private final PluginManager pluginManager;
private final Map<String, Destination<?, ?>> destinationMap;
private final CorePermissions corePermissions;

@Inject
DestinationsProvider(@NotNull PluginManager pluginManager) {
this.pluginManager = pluginManager;
DestinationsProvider(@NotNull CorePermissions corePermissions) {
this.destinationMap = new HashMap<>();
this.corePermissions = corePermissions;
}

/**
Expand All @@ -38,12 +39,7 @@ public class DestinationsProvider {
*/
public void registerDestination(@NotNull Destination<?, ?> destination) {
this.destinationMap.put(destination.getIdentifier(), destination);
this.registerDestinationPerms(destination);
}

private void registerDestinationPerms(@NotNull Destination<?, ?> destination) {
pluginManager.addPermission(new Permission(PERMISSION_PREFIX + "self." + destination.getIdentifier()));
pluginManager.addPermission(new Permission(PERMISSION_PREFIX + "other." + destination.getIdentifier()));
this.corePermissions.addDestinationPermissions(destination);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
package org.mvplugins.multiverse.core.permissions;

final class CorePermissions {
import com.dumptruckman.minecraft.util.Logging;
import io.vavr.control.Try;
import jakarta.inject.Inject;
import org.bukkit.permissions.Permission;
import org.bukkit.plugin.PluginManager;
import org.jetbrains.annotations.NotNull;
import org.jvnet.hk2.annotations.Service;
import org.mvplugins.multiverse.core.destination.Destination;
import org.mvplugins.multiverse.core.world.MultiverseWorld;

import static org.mvplugins.multiverse.core.permissions.PermissionUtils.concatPermission;

@Service
public final class CorePermissions {
/**
* Permission to access a world.
*/
Expand Down Expand Up @@ -31,7 +44,51 @@ final class CorePermissions {
*/
static final String SPAWN = "multiverse.core.spawn";

private CorePermissions() {
// Prevent instantiation as this is a static utility class
private final PluginManager pluginManager;

@Inject
CorePermissions(PluginManager pluginManager) {
this.pluginManager = pluginManager;
}

public Try<Void> addWorldPermissions(@NotNull MultiverseWorld world) {
return Try.run(() -> {
pluginManager.addPermission(new Permission(concatPermission(WORLD_ACCESS, world.getName())));
pluginManager.addPermission(new Permission(concatPermission(WORLD_EXEMPT, world.getName())));
pluginManager.addPermission(new Permission(concatPermission(GAMEMODE_BYPASS, world.getName())));
pluginManager.addPermission(new Permission(concatPermission(PLAYERLIMIT_BYPASS, world.getName())));
pluginManager.addPermission(new Permission(concatPermission(SPAWN, world.getName())));
pluginManager.addPermission(new Permission(concatPermission(SPAWN, "self", world.getName())));
pluginManager.addPermission(new Permission(concatPermission(SPAWN, "other", world.getName())));
Logging.fine("Successfully registered permissions for world %s", world.getName());
});
}

public Try<Void> removeWorldPermissions(@NotNull MultiverseWorld world) {
return Try.run(() -> {
pluginManager.removePermission(concatPermission(WORLD_ACCESS, world.getName()));
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, "self", world.getName()));
pluginManager.removePermission(concatPermission(SPAWN, "other", world.getName()));
Logging.fine("Successfully removed permissions for world %s", world.getName());
});
}

public Try<Void> addDestinationPermissions(@NotNull Destination<?, ?> destination) {
return Try.run(() -> {
pluginManager.addPermission(new Permission(concatPermission(TELEPORT, "self", destination.getIdentifier())));
pluginManager.addPermission(new Permission(concatPermission(TELEPORT, "other", destination.getIdentifier())));
Logging.fine("Successfully registered permissions for destination %s", destination.getIdentifier());
});
}

public Try<Void> removeDestinationPermissions(@NotNull Destination<?, ?> destination) {
return Try.run(() -> {
pluginManager.removePermission(concatPermission(TELEPORT, "self", destination.getIdentifier()));
pluginManager.removePermission(concatPermission(TELEPORT, "other", destination.getIdentifier()));
Logging.fine("Successfully removed permissions for destination %s", destination.getIdentifier());
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
import org.mvplugins.multiverse.core.world.LoadedMultiverseWorld;
import org.mvplugins.multiverse.core.world.MultiverseWorld;

import static org.mvplugins.multiverse.core.permissions.PermissionUtils.concatPermission;
import static org.mvplugins.multiverse.core.permissions.PermissionUtils.hasPermission;

@Service
public class CorePermissionsChecker {

Expand Down Expand Up @@ -126,35 +129,4 @@ public boolean hasAnyTeleportPermission(CommandSender sender) {
}
return false;
}

/**
* Joins permissions with a dot.
*
* @param permission The permission
* @param child The string(s) to join
* @return The newly joined permission node.
*/
public String concatPermission(String permission, String... child) {
return permission + "." + String.join(".", child);
}

/**
* Check and log if the sender has the permission.
*
* @param sender The sender
* @param permission The permission
* @return True if the sender has the permission, else false.
*/
public boolean hasPermission(CommandSender sender, String permission) {
if (sender.hasPermission(permission)) {
if (config.getDebugPermissions()) {
Logging.finer("Checking sender [%s] has permission [%s] : YES", sender.getName(), permission);
}
return true;
}
if (config.getDebugPermissions()) {
Logging.finer("Checking sender [%s] has permission [%s] : NO", sender.getName(), permission);
}
return false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package org.mvplugins.multiverse.core.permissions;

import com.dumptruckman.minecraft.util.Logging;
import org.bukkit.command.CommandSender;

public final class PermissionUtils {

private static boolean debugPermissions = false;

private PermissionUtils() {
// Prevent instantiation
}

public static boolean isDebugPermissions() {
return debugPermissions;
}

public static void setDebugPermissions(boolean debugPermissions) {
PermissionUtils.debugPermissions = debugPermissions;
}

/**
* Joins permissions with a dot.
*
* @param permission The permission
* @param child The string(s) to join
* @return The newly joined permission node.
*/
public static String concatPermission(String permission, String... child) {
return permission + "." + String.join(".", child);
}

/**
* Check and log if the sender has the permission.
*
* @param sender The sender
* @param permission The permission
* @return True if the sender has the permission, else false.
*/
public static boolean hasPermission(CommandSender sender, String permission) {
if (sender.hasPermission(permission)) {
if (debugPermissions) {
Logging.finer("Checking sender [%s] has permission [%s] : YES", sender.getName(), permission);
}
return true;
}
if (debugPermissions) {
Logging.finer("Checking sender [%s] has permission [%s] : NO", sender.getName(), permission);
}
return false;
}
}
29 changes: 16 additions & 13 deletions src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

import org.mvplugins.multiverse.core.api.LocationManipulation;
import org.mvplugins.multiverse.core.event.MVWorldDeleteEvent;
import org.mvplugins.multiverse.core.permissions.CorePermissions;
import org.mvplugins.multiverse.core.teleportation.AdvancedBlockSafety;
import org.mvplugins.multiverse.core.utils.message.MessageReplacement;
import org.mvplugins.multiverse.core.utils.result.Attempt;
Expand Down Expand Up @@ -74,23 +75,22 @@ public class WorldManager {
private final WorldsConfigManager worldsConfigManager;
private final WorldNameChecker worldNameChecker;
private final GeneratorProvider generatorProvider;
private final PlayerWorldTeleporter playerWorldActions;
private final FilesManipulator filesManipulator;
private final AdvancedBlockSafety blockSafety;
private final LocationManipulation locationManipulation;
private final PluginManager pluginManager;
private final CorePermissions corePermissions;

@Inject
WorldManager(
@NotNull WorldsConfigManager worldsConfigManager,
@NotNull WorldNameChecker worldNameChecker,
@NotNull GeneratorProvider generatorProvider,
@NotNull PlayerWorldTeleporter playerWorldActions,
@NotNull FilesManipulator filesManipulator,
@NotNull AdvancedBlockSafety blockSafety,
@NotNull LocationManipulation locationManipulation,
@NotNull PluginManager pluginManager) {
this.pluginManager = pluginManager;
@NotNull PluginManager pluginManager,
@NotNull CorePermissions corePermissions) {
this.worldsMap = new HashMap<>();
this.loadedWorldsMap = new HashMap<>();
this.unloadTracker = new ArrayList<>();
Expand All @@ -99,10 +99,11 @@ public class WorldManager {
this.worldsConfigManager = worldsConfigManager;
this.worldNameChecker = worldNameChecker;
this.generatorProvider = generatorProvider;
this.playerWorldActions = playerWorldActions;
this.filesManipulator = filesManipulator;
this.blockSafety = blockSafety;
this.locationManipulation = locationManipulation;
this.pluginManager = pluginManager;
this.corePermissions = corePermissions;
}

/**
Expand Down Expand Up @@ -134,10 +135,7 @@ private Try<Void> updateWorldsFromConfig() {
private void loadNewWorldConfigs(Collection<WorldConfig> newWorldConfigs) {
newWorldConfigs.forEach(worldConfig -> getWorld(worldConfig.getWorldName())
.peek(unloadedWorld -> unloadedWorld.setWorldConfig(worldConfig))
.onEmpty(() -> {
MultiverseWorld mvWorld = new MultiverseWorld(worldConfig.getWorldName(), worldConfig);
worldsMap.put(mvWorld.getName(), mvWorld);
}));
.onEmpty(() -> newMultiverseWorld(worldConfig.getWorldName(), worldConfig)));
}

private void removeWorldsNotInConfigs(Collection<String> removedWorlds) {
Expand Down Expand Up @@ -276,6 +274,13 @@ private Attempt<LoadedMultiverseWorld, ImportFailureReason> doImportWorld(
: generator;
}

private MultiverseWorld newMultiverseWorld(String worldName, WorldConfig worldConfig) {
MultiverseWorld mvWorld = new MultiverseWorld(worldName, worldConfig);
worldsMap.put(mvWorld.getName(), mvWorld);
corePermissions.addWorldPermissions(mvWorld);
return mvWorld;
}

/**
* Creates a new loaded multiverseWorld from a bukkit world.
*
Expand All @@ -289,9 +294,7 @@ private LoadedMultiverseWorld newLoadedMultiverseWorld(
worldConfig.setAdjustSpawn(adjustSpawn);
worldConfig.setGenerator(generator == null ? "" : generator);

MultiverseWorld mvWorld = new MultiverseWorld(world.getName(), worldConfig);
worldsMap.put(mvWorld.getName(), mvWorld);

MultiverseWorld mvWorld = newMultiverseWorld(world.getName(), worldConfig);
LoadedMultiverseWorld loadedWorld = new LoadedMultiverseWorld(
world,
worldConfig,
Expand Down Expand Up @@ -464,7 +467,7 @@ private Attempt<String, RemoveFailureReason> removeWorldFromConfig(@NotNull Mult
worldsMap.remove(world.getName());
worldsConfigManager.deleteWorldConfig(world.getName());
saveWorldsConfig();

corePermissions.removeWorldPermissions(world);
return worldActionResult(world.getName());
}

Expand Down

0 comments on commit 9d54cc4

Please sign in to comment.