Handle permission checks from Forge.

This commit is contained in:
IzzelAliz 2020-09-04 21:32:24 +08:00
parent 4d26098fc9
commit 8d0dad9e47
3 changed files with 100 additions and 0 deletions

View File

@ -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);
}
}

View File

@ -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<Permission> 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<String> 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();
}
}
}

View File

@ -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();
}