From 8d0dad9e471b6f885be43b8101e87b2ce9a34baf Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Fri, 4 Sep 2020 21:32:24 +0800 Subject: [PATCH] Handle permission checks from Forge. --- .../arclight/common/mod/ArclightMod.java | 3 + .../mod/server/ArclightPermissionHandler.java | 96 +++++++++++++++++++ .../common/mod/server/ArclightServer.java | 1 + 3 files changed, 100 insertions(+) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightPermissionHandler.java diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMod.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMod.java index 1d772133..f319d441 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMod.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMod.java @@ -1,11 +1,13 @@ package io.izzel.arclight.common.mod; +import io.izzel.arclight.common.mod.server.ArclightPermissionHandler; import io.izzel.arclight.common.mod.server.event.ArclightEventDispatcherRegistry; import io.izzel.arclight.common.mod.util.log.ArclightI18nLogger; import net.minecraftforge.fml.ExtensionPoint; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.network.FMLNetworkConstants; +import net.minecraftforge.server.permission.PermissionAPI; import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.Logger; @@ -18,5 +20,6 @@ public class ArclightMod { LOGGER.info("mod-load"); ArclightEventDispatcherRegistry.registerAllEventDispatchers(); ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.DISPLAYTEST, () -> Pair.of(() -> FMLNetworkConstants.IGNORESERVERONLY, (a, b) -> true)); + PermissionAPI.setPermissionHandler(ArclightPermissionHandler.INSTANCE); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightPermissionHandler.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightPermissionHandler.java new file mode 100644 index 00000000..7fac4699 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightPermissionHandler.java @@ -0,0 +1,96 @@ +package io.izzel.arclight.common.mod.server; + +import com.mojang.authlib.GameProfile; +import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraftforge.server.permission.DefaultPermissionLevel; +import net.minecraftforge.server.permission.IPermissionHandler; +import net.minecraftforge.server.permission.context.IContext; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionDefault; +import org.bukkit.util.permissions.DefaultPermissions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +public class ArclightPermissionHandler implements IPermissionHandler { + + public static final ArclightPermissionHandler INSTANCE = new ArclightPermissionHandler(); + + private final List list = new LinkedList<>(); + private final AtomicBoolean initialized = new AtomicBoolean(false); + + public void initialize() { + if (!initialized.getAndSet(true)) { + for (Permission permission : this.list) { + DefaultPermissions.registerPermission(permission); + } + this.list.clear(); + } + } + + @Override + public void registerNode(@NotNull String node, @NotNull DefaultPermissionLevel level, @NotNull String desc) { + PermissionDefault bukkit; + if (level == DefaultPermissionLevel.ALL) { + bukkit = PermissionDefault.TRUE; + } else if (level == DefaultPermissionLevel.OP) { + bukkit = PermissionDefault.OP; + } else { + bukkit = PermissionDefault.FALSE; + } + if (initialized.get()) { + DefaultPermissions.registerPermission(node, desc, bukkit); + } else { + this.list.add(new Permission(node, desc, bukkit)); + } + } + + @Override + public @NotNull Collection getRegisteredNodes() { + if (initialized.get()) { + return Bukkit.getPluginManager().getPermissions().stream().map(Permission::getName).collect(Collectors.toList()); + } else { + return this.list.stream().map(Permission::getName).collect(Collectors.toList()); + } + } + + @Override + public boolean hasPermission(@NotNull GameProfile profile, @NotNull String node, @Nullable IContext context) { + if (context != null) { + PlayerEntity player = context.getPlayer(); + if (player != null) { + return ((PlayerEntityBridge) player).bridge$getBukkitEntity().hasPermission(node); + } + } + Player player = Bukkit.getPlayer(profile.getId()); + if (player != null) { + return player.hasPermission(node); + } else { + Permission perm = Bukkit.getServer().getPluginManager().getPermission(node); + boolean isOp = ArclightServer.getMinecraftServer().getPlayerList().canSendCommands(profile); + if (perm != null) { + return perm.getDefault().getValue(isOp); + } else { + return Permission.DEFAULT_PERMISSION.getValue(isOp); + } + } + } + + @Override + public @NotNull String getNodeDescription(@NotNull String node) { + if (!initialized.get()) { + return ""; + } else { + Permission permission = Bukkit.getPluginManager().getPermission(node); + return permission == null ? "" : permission.getDescription(); + } + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightServer.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightServer.java index 236c38c1..726bf60e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightServer.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/ArclightServer.java @@ -27,6 +27,7 @@ public class ArclightServer { server = new CraftServer(console, playerList); ((MinecraftServerBridge) console).bridge$setServer(server); ((MinecraftServerBridge) console).bridge$setConsole(ColouredConsoleSender.getInstance()); + ArclightPermissionHandler.INSTANCE.initialize(); } catch (Throwable t) { t.printStackTrace(); }