mirror of
https://github.com/webbukkit/dynmap.git
synced 2024-11-24 03:05:28 +01:00
Merge pull request #3782 from PssbleTrngle/v3.0
add support for fabric permissions & LuckPerms
This commit is contained in:
commit
fc678a056f
@ -18,6 +18,11 @@ configurations {
|
|||||||
implementation.extendsFrom(shadow)
|
implementation.extendsFrom(shadow)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
maven { url 'https://oss.sonatype.org/content/repositories/snapshots' }
|
||||||
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
minecraft "com.mojang:minecraft:${project.minecraft_version}"
|
minecraft "com.mojang:minecraft:${project.minecraft_version}"
|
||||||
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
|
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
|
||||||
@ -27,6 +32,9 @@ dependencies {
|
|||||||
compileOnly group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'
|
compileOnly group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'
|
||||||
|
|
||||||
shadow project(path: ':DynmapCore', configuration: 'shadow')
|
shadow project(path: ':DynmapCore', configuration: 'shadow')
|
||||||
|
|
||||||
|
modCompileOnly "me.lucko:fabric-permissions-api:0.1-SNAPSHOT"
|
||||||
|
compileOnly 'net.luckperms:api:5.4'
|
||||||
}
|
}
|
||||||
|
|
||||||
processResources {
|
processResources {
|
||||||
|
@ -3,10 +3,10 @@ package org.dynmap.fabric_1_19;
|
|||||||
import com.mojang.brigadier.CommandDispatcher;
|
import com.mojang.brigadier.CommandDispatcher;
|
||||||
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||||
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
|
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
|
||||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents;
|
|
||||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
||||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
|
||||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents;
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents;
|
||||||
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.FluidBlock;
|
import net.minecraft.block.FluidBlock;
|
||||||
@ -30,9 +30,6 @@ import net.minecraft.world.WorldAccess;
|
|||||||
import net.minecraft.world.biome.Biome;
|
import net.minecraft.world.biome.Biome;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
import net.minecraft.world.chunk.ChunkSection;
|
import net.minecraft.world.chunk.ChunkSection;
|
||||||
import net.minecraft.world.chunk.ChunkStatus;
|
|
||||||
import net.minecraft.world.chunk.WorldChunk;
|
|
||||||
|
|
||||||
import org.dynmap.*;
|
import org.dynmap.*;
|
||||||
import org.dynmap.common.BiomeMap;
|
import org.dynmap.common.BiomeMap;
|
||||||
import org.dynmap.common.DynmapCommandSender;
|
import org.dynmap.common.DynmapCommandSender;
|
||||||
@ -48,9 +45,7 @@ import org.dynmap.fabric_1_19.event.CustomServerChunkEvents;
|
|||||||
import org.dynmap.fabric_1_19.event.CustomServerLifecycleEvents;
|
import org.dynmap.fabric_1_19.event.CustomServerLifecycleEvents;
|
||||||
import org.dynmap.fabric_1_19.event.PlayerEvents;
|
import org.dynmap.fabric_1_19.event.PlayerEvents;
|
||||||
import org.dynmap.fabric_1_19.mixin.BiomeEffectsAccessor;
|
import org.dynmap.fabric_1_19.mixin.BiomeEffectsAccessor;
|
||||||
import org.dynmap.fabric_1_19.permissions.FilePermissions;
|
import org.dynmap.fabric_1_19.permissions.*;
|
||||||
import org.dynmap.fabric_1_19.permissions.OpPermissions;
|
|
||||||
import org.dynmap.fabric_1_19.permissions.PermissionProvider;
|
|
||||||
import org.dynmap.permissions.PermissionsHandler;
|
import org.dynmap.permissions.PermissionsHandler;
|
||||||
import org.dynmap.renderer.DynmapBlockState;
|
import org.dynmap.renderer.DynmapBlockState;
|
||||||
|
|
||||||
@ -396,9 +391,19 @@ public class DynmapPlugin {
|
|||||||
registerPlayerLoginListener();
|
registerPlayerLoginListener();
|
||||||
|
|
||||||
/* Initialize permissions handler */
|
/* Initialize permissions handler */
|
||||||
permissions = FilePermissions.create();
|
if (FabricLoader.getInstance().isModLoaded("luckperms")) {
|
||||||
if (permissions == null) {
|
Log.info("Using luckperms for access control");
|
||||||
permissions = new OpPermissions(new String[]{"webchat", "marker.icons", "marker.list", "webregister", "stats", "hide.self", "show.self"});
|
permissions = new LuckPermissions();
|
||||||
|
}
|
||||||
|
else if (FabricLoader.getInstance().isModLoaded("fabric-permissions-api-v0")) {
|
||||||
|
Log.info("Using fabric-permissions-api for access control");
|
||||||
|
permissions = new FabricPermissions();
|
||||||
|
} else {
|
||||||
|
/* Initialize permissions handler */
|
||||||
|
permissions = FilePermissions.create();
|
||||||
|
if (permissions == null) {
|
||||||
|
permissions = new OpPermissions(new String[]{"webchat", "marker.icons", "marker.list", "webregister", "stats", "hide.self", "show.self"});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* Get and initialize data folder */
|
/* Get and initialize data folder */
|
||||||
File dataDirectory = new File("dynmap");
|
File dataDirectory = new File("dynmap");
|
||||||
|
@ -0,0 +1,47 @@
|
|||||||
|
package org.dynmap.fabric_1_19.permissions;
|
||||||
|
|
||||||
|
import me.lucko.fabric.api.permissions.v0.Permissions;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import org.dynmap.Log;
|
||||||
|
import org.dynmap.fabric_1_19.DynmapPlugin;
|
||||||
|
import org.dynmap.json.simple.parser.JSONParser;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class FabricPermissions implements PermissionProvider {
|
||||||
|
|
||||||
|
private String permissionKey(String perm) {
|
||||||
|
return "dynmap." + perm;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> hasOfflinePermissions(String player, Set<String> perms) {
|
||||||
|
return perms.stream()
|
||||||
|
.filter(perm -> hasOfflinePermission(player, perm))
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasOfflinePermission(String player, String perm) {
|
||||||
|
return DynmapPlugin.plugin.isOp(player.toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean has(PlayerEntity player, String permission) {
|
||||||
|
if (player == null) return false;
|
||||||
|
String name = player.getName().getString().toLowerCase();
|
||||||
|
if (DynmapPlugin.plugin.isOp(name)) return true;
|
||||||
|
return Permissions.check(player, permissionKey(permission));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasPermissionNode(PlayerEntity player, String permission) {
|
||||||
|
if (player != null) {
|
||||||
|
String name = player.getName().getString().toLowerCase();
|
||||||
|
return DynmapPlugin.plugin.isOp(name);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,102 @@
|
|||||||
|
package org.dynmap.fabric_1_19.permissions;
|
||||||
|
|
||||||
|
import me.lucko.fabric.api.permissions.v0.Permissions;
|
||||||
|
import net.luckperms.api.LuckPerms;
|
||||||
|
import net.luckperms.api.LuckPermsProvider;
|
||||||
|
import net.luckperms.api.cacheddata.CachedPermissionData;
|
||||||
|
import net.luckperms.api.model.user.User;
|
||||||
|
import net.luckperms.api.util.Tristate;
|
||||||
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import org.dynmap.Log;
|
||||||
|
import org.dynmap.fabric_1_19.DynmapPlugin;
|
||||||
|
import org.dynmap.json.simple.JSONArray;
|
||||||
|
import org.dynmap.json.simple.JSONObject;
|
||||||
|
import org.dynmap.json.simple.parser.JSONParser;
|
||||||
|
import org.dynmap.json.simple.parser.ParseException;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class LuckPermissions implements PermissionProvider {
|
||||||
|
|
||||||
|
private final JSONParser parser = new JSONParser();
|
||||||
|
private LuckPerms api = null;
|
||||||
|
|
||||||
|
private Optional<LuckPerms> getApi() {
|
||||||
|
if (api != null) return Optional.of(api);
|
||||||
|
try {
|
||||||
|
api = LuckPermsProvider.get();
|
||||||
|
return Optional.of(api);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Log.warning("Trying to access LuckPerms before it has loaded");
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<UUID> cachedUUID(String username) {
|
||||||
|
try {
|
||||||
|
BufferedReader reader = new BufferedReader(new FileReader("usercache.json"));
|
||||||
|
JSONArray cache = (JSONArray) parser.parse(reader);
|
||||||
|
for (Object it : cache) {
|
||||||
|
JSONObject user = (JSONObject) it;
|
||||||
|
if (user.get("name").toString().equalsIgnoreCase(username)) {
|
||||||
|
String uuid = user.get("uuid").toString();
|
||||||
|
return Optional.of(UUID.fromString(uuid));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reader.close();
|
||||||
|
} catch (IOException | ParseException ex) {
|
||||||
|
Log.warning("Unable to read usercache.json");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String permissionKey(String perm) {
|
||||||
|
return "dynmap." + perm;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> hasOfflinePermissions(String player, Set<String> perms) {
|
||||||
|
return perms.stream()
|
||||||
|
.filter(perm -> hasOfflinePermission(player, perm))
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasOfflinePermission(String player, String perm) {
|
||||||
|
if (DynmapPlugin.plugin.isOp(player.toLowerCase())) return true;
|
||||||
|
Optional<LuckPerms> api = getApi();
|
||||||
|
Optional<UUID> uuid = cachedUUID(player);
|
||||||
|
if (!uuid.isPresent() || !api.isPresent()) return false;
|
||||||
|
User user = api.get().getUserManager().loadUser(uuid.get()).join();
|
||||||
|
CachedPermissionData permissions = user.getCachedData().getPermissionData();
|
||||||
|
Tristate state = permissions.checkPermission(permissionKey(perm));
|
||||||
|
return state.asBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean has(PlayerEntity player, String permission) {
|
||||||
|
if (player == null) return false;
|
||||||
|
String name = player.getName().getString().toLowerCase();
|
||||||
|
if (DynmapPlugin.plugin.isOp(name)) return true;
|
||||||
|
return Permissions.check(player, permissionKey(permission));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasPermissionNode(PlayerEntity player, String permission) {
|
||||||
|
if (player != null) {
|
||||||
|
String name = player.getName().getString().toLowerCase();
|
||||||
|
return DynmapPlugin.plugin.isOp(name);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user