Handle permission checks from Forge.
This commit is contained in:
parent
4d26098fc9
commit
8d0dad9e47
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
((MinecraftServerBridge) console).bridge$setServer(server);
|
||||
((MinecraftServerBridge) console).bridge$setConsole(ColouredConsoleSender.getInstance());
|
||||
ArclightPermissionHandler.INSTANCE.initialize();
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user