Handle permission checks from Forge.
This commit is contained in:
parent
4d26098fc9
commit
8d0dad9e47
@ -1,11 +1,13 @@
|
|||||||
package io.izzel.arclight.common.mod;
|
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.server.event.ArclightEventDispatcherRegistry;
|
||||||
import io.izzel.arclight.common.mod.util.log.ArclightI18nLogger;
|
import io.izzel.arclight.common.mod.util.log.ArclightI18nLogger;
|
||||||
import net.minecraftforge.fml.ExtensionPoint;
|
import net.minecraftforge.fml.ExtensionPoint;
|
||||||
import net.minecraftforge.fml.ModLoadingContext;
|
import net.minecraftforge.fml.ModLoadingContext;
|
||||||
import net.minecraftforge.fml.common.Mod;
|
import net.minecraftforge.fml.common.Mod;
|
||||||
import net.minecraftforge.fml.network.FMLNetworkConstants;
|
import net.minecraftforge.fml.network.FMLNetworkConstants;
|
||||||
|
import net.minecraftforge.server.permission.PermissionAPI;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
@ -18,5 +20,6 @@ public class ArclightMod {
|
|||||||
LOGGER.info("mod-load");
|
LOGGER.info("mod-load");
|
||||||
ArclightEventDispatcherRegistry.registerAllEventDispatchers();
|
ArclightEventDispatcherRegistry.registerAllEventDispatchers();
|
||||||
ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.DISPLAYTEST, () -> Pair.of(() -> FMLNetworkConstants.IGNORESERVERONLY, (a, b) -> true));
|
ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.DISPLAYTEST, () -> Pair.of(() -> FMLNetworkConstants.IGNORESERVERONLY, (a, b) -> true));
|
||||||
|
PermissionAPI.setPermissionHandler(ArclightPermissionHandler.INSTANCE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -27,6 +27,7 @@ public class ArclightServer {
|
|||||||
server = new CraftServer(console, playerList);
|
server = new CraftServer(console, playerList);
|
||||||
((MinecraftServerBridge) console).bridge$setServer(server);
|
((MinecraftServerBridge) console).bridge$setServer(server);
|
||||||
((MinecraftServerBridge) console).bridge$setConsole(ColouredConsoleSender.getInstance());
|
((MinecraftServerBridge) console).bridge$setConsole(ColouredConsoleSender.getInstance());
|
||||||
|
ArclightPermissionHandler.INSTANCE.initialize();
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
t.printStackTrace();
|
t.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user